obsidian-integration-testing 12.2.0 → 12.3.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/README.md +1 -5
- package/dist/lib/cjs/appium-session-config.cjs +3 -5
- package/dist/lib/cjs/appium-session-config.d.cts +6 -9
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
- package/dist/lib/cjs/emulator-device-id.cjs +1 -1
- package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +4 -3
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
- package/dist/lib/cjs/soft-keyboard.cjs +7 -4
- package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
- package/dist/lib/cjs/transport-appium.cjs +5 -5
- package/dist/lib/cjs/transport-desktop-cdp.cjs +77 -13
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +11 -1
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/appium-session-config.d.mts +6 -9
- package/dist/lib/esm/appium-session-config.mjs +3 -4
- package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/emulator-device-id.d.mts +7 -6
- package/dist/lib/esm/emulator-device-id.mjs +1 -1
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +4 -3
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
- package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
- package/dist/lib/esm/soft-keyboard.d.mts +16 -2
- package/dist/lib/esm/soft-keyboard.mjs +7 -4
- package/dist/lib/esm/transport-appium.mjs +5 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +77 -13
- package/dist/lib/esm/transport-options.d.mts +11 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +17 -0
- package/dist/lib/esm/webview-cdp.mjs +45 -14
- package/package.json +1 -1
|
@@ -218,6 +218,10 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
218
218
|
* from Node. The knob exists so the cap is explicit and matches
|
|
219
219
|
* {@link ObsidianCdpTransportOptions.commandTimeoutInMilliseconds} on desktop.
|
|
220
220
|
*
|
|
221
|
+
* The default is `DEFAULT_EVAL_CAP_IN_MILLISECONDS`, exported from the package
|
|
222
|
+
* root — import it rather than restating the number, so a closure sized
|
|
223
|
+
* against the cap follows it if it ever moves.
|
|
224
|
+
*
|
|
221
225
|
* @default `30000`
|
|
222
226
|
*/
|
|
223
227
|
readonly scriptTimeoutInMilliseconds?: number;
|
|
@@ -344,7 +348,13 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
344
348
|
export interface ObsidianCdpTransportOptions {
|
|
345
349
|
/**
|
|
346
350
|
* Timeout in milliseconds for individual CDP commands.
|
|
347
|
-
*
|
|
351
|
+
*
|
|
352
|
+
* A test's closure travels as one `Runtime.evaluate` command, so this is also
|
|
353
|
+
* the desktop per-eval cap. The default is `DEFAULT_EVAL_CAP_IN_MILLISECONDS`,
|
|
354
|
+
* exported from the package root — import it rather than restating the number,
|
|
355
|
+
* so a closure sized against the cap follows it if it ever moves.
|
|
356
|
+
*
|
|
357
|
+
* @default `30000`
|
|
348
358
|
*/
|
|
349
359
|
readonly commandTimeoutInMilliseconds?: number;
|
|
350
360
|
/**
|
|
@@ -11,4 +11,4 @@ export {
|
|
|
11
11
|
checkIsMobileTransport,
|
|
12
12
|
resolveOwnedConfigDirectory
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBPYnNpZGlhbiBNb2JpbGUgdG8gZ2V0IGFzIGZhciBhcyBgZ2xvYmFsVGhpcy5hcHBgXG4gICAqIGV4aXN0aW5nIGFmdGVyIHRoZSB2YXVsdCBpcyAocmUpb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgZmlyc3Qgb2YgdGhlIHR3byBidWRnZXRzIHRoZSB0cmFuc3BvcnQgc3BlbmRzIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAuXG4gICAqIEl0IGNvdmVycyB0aGUgYXBwJ3Mgb3duIGNvbGQgc3RhcnQgXHUyMDE0IHRoZSBXZWJWaWV3IHJlbG9hZGluZyBhbmQgT2JzaWRpYW4nc1xuICAgKiBidW5kbGUgY29taW5nIHVwIFx1MjAxNCB3aGljaCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGd1ZXN0IGNhbiB0YWtlIG1pbnV0ZXMsIGFuZFxuICAgKiBpcyBub3Qgd29yayB7QGxpbmsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9IHNob3VsZCBiZSBzaXplZCBmb3IuXG4gICAqIE9ubHkgb25jZSBgZ2xvYmFsVGhpcy5hcHBgIGFwcGVhcnMgZG9lcyB0aGF0IGZhciB0aWdodGVyIGNsb2NrIHN0YXJ0LlxuICAgKlxuICAgKiBTcGxpdHRpbmcgdGhlIHR3byBpcyB3aGF0IHN0b3BzIGEgZmlyc3QgcnVuIGFmdGVyIGEgbWFjaGluZSByZXN0YXJ0IGZyb21cbiAgICogZmFpbGluZyBieSBkZXNpZ246IHRoZSBvbGQgc2luZ2xlIDkwcyB3YWxsIGNsb2NrIHN0YXJ0ZWQgYXQgdGhlIHJlbG9hZCwgc28gYVxuICAgKiBjb2xkIGFwcCBzdGFydCBzcGVudCBpdCBiZWZvcmUgT2JzaWRpYW4gaGFkIGJlZ3VuIGxheWluZyBhbnl0aGluZyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFuZHJvaWQgQVZEIChBbmRyb2lkIFZpcnR1YWwgRGV2aWNlKSBuYW1lLlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGZhY3RvcnkgbGF1bmNoZXMgYGVtdWxhdG9yIC1hdmQgPGF2ZE5hbWU+YCBhcyBhIGJhY2tncm91bmRcbiAgICogcHJvY2VzcyBhbmQgcG9sbHMgdW50aWwgdGhlIGRldmljZSBhcHBlYXJzLiBUaGUgZW11bGF0b3IgaXMga2lsbGVkXG4gICAqIG9uIHRyYW5zcG9ydCBkaXNwb3NhbC5cbiAgICpcbiAgICogUnVuIGBlbXVsYXRvciAtbGlzdC1hdmRzYCB0byBzZWUgYXZhaWxhYmxlIEFWRCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIHRvIHJldXNlIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gaXNcbiAgICogZXN0YWJsaXNoZWQuIFdoZW4gcHJlc2VudCBhbG9uZ3NpZGUge0BsaW5rIHNlc3Npb25JZH0sIHRoZSB0cmFuc3BvcnRcbiAgICogZmFjdG9yeSBza2lwcyBlbXVsYXRvciBzdGFydHVwIGFuZCBhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZywgYWZ0ZXIgYHN5cy5ib290X2NvbXBsZXRlZGAsIGZvciB0aGVcbiAgICogZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC5cbiAgICpcbiAgICogQXBwbGllcyB0byBhICoqcmV1c2VkKiogZGV2aWNlIGFzIHdlbGwgYXMgYSBoYXJuZXNzLXN0YXJ0ZWQgb25lLiBBIGRldmljZVxuICAgKiB0aGF0IGlzIG1lcmVseSBwcmVzZW50IGluIGBhZGIgZGV2aWNlc2AgY2FuIHN0aWxsIGJlIG1pZC1gZGV4Mm9hdGAsIGFuZFxuICAgKiBza2lwcGluZyB0aGUgZ2F0ZSB0aGVyZSBpcyB3aGF0IGxlZnQgYSBydW4gcG9sbGluZyBhIGNodXJuaW5nIGd1ZXN0IHVudGlsXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gcmFuIG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgYG5weCBhcHBpdW1gIHNlcnZlciBwcm9jZXNzIGlzIHNwYXduZWQgd2l0aFxuICAgKiBpdHMgY29uc29sZSB3aW5kb3cgaGlkZGVuIChgd2luZG93c0hpZGVgKSBhbmQgaXRzIG91dHB1dCBkaXNjYXJkZWQsIHNvIGl0XG4gICAqIG5laXRoZXIgc3RlYWxzIGZvY3VzIG5vciB3cml0ZXMgdG8gdGhlIGludm9raW5nIHRlcm1pbmFsLiBJZ25vcmVkIHdoZW5cbiAgICogYXR0YWNoaW5nIHRvIGFuIGFscmVhZHktcnVubmluZyBBcHBpdW0gc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfVxuICAgKiBgZmFsc2VgLCBvciB0aGUgc2VydmVyIGFscmVhZHkgcmVhY2hhYmxlKS4gU2V0IGB0cnVlYCB0byBzZWUgdGhlIHNlcnZlciBsb2cgd2luZG93XG4gICAqIGFuZCBpdHMgbGl2ZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQW5kcm9pZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aCBgLW5vLXdpbmRvd2BcbiAgICogKGhlYWRsZXNzKSwgc28gaXQgbmV2ZXIgc3RlYWxzIGZvY3VzLiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmdcbiAgICogZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkIHRvIGhpZGUpLiBTZXQgYHRydWVgIHRvIHdhdGNoIHRoZSBlbXVsYXRvciBVSS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90XG4gICAqIGZyb20gdGhlIHJlbG9hZC5cbiAgICpcbiAgICogVGhlIHNlY29uZCBvZiB0aGUgdHdvIGJ1ZGdldHMgdGhlIHRyYW5zcG9ydCBzcGVuZHMgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYC5cbiAgICogSXQgY292ZXJzIG9ubHkgT2JzaWRpYW4ncyBvd24gd29yayBcdTIwMTQgb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmcgZXZlcnlcbiAgICogcGx1Z2luIFx1MjAxNCBvbmNlIHRoZSBhcHAgaXRzZWxmIGlzIHVwLCB3aGljaCBpcyB3aHkgaXQgY2FuIHN0YXkgdGlnaHQ6IG1lYXN1cmVkXG4gICAqIGF0IH4xcywgYW5kIFx1MjI2NDguNHMgdW5kZXIgMTItY29yZSArIGRpc2sgKyBtZW1vcnkgc3RyZXNzLlxuICAgKlxuICAgKiBCbG93aW5nIGl0IHRoZXJlZm9yZSBtZWFucyBPYnNpZGlhbiBnZW51aW5lbHkgc3RhbGxlZCwgKipvcioqIHRoYXQgZWFjaCBwcm9iZVxuICAgKiByb3VuZC10cmlwIGlzIGJlaW5nIGluZmxhdGVkIGJ5IGEgYnVzeSBndWVzdC4gVGhlIHRpbWVvdXQgZXJyb3IgbmFtZXMgd2hpY2gsXG4gICAqIGJ5IHJlcG9ydGluZyB0aGUgcHJvYmUgY291bnQgYW5kIHNsb3dlc3Qgcm91bmQtdHJpcCBhbG9uZ3NpZGUgdGhlIGZ1cnRoZXN0XG4gICAqIHN0YXJ0dXAgbWlsZXN0b25lIHJlYWNoZWQ6IGEgaGFuZGZ1bCBvZiBwcm9iZXMgZWFjaCB0YWtpbmcgdGVucyBvZiBzZWNvbmRzIGlzXG4gICAqIGEgY29udGVuZGVkIGd1ZXN0LCBhbmQgdGhlIGtub2IgZm9yIHRoYXQgaXNcbiAgICoge0BsaW5rIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LCBub3QgdGhpcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgb2xkIGEgbGVmdG92ZXIgKipob3N0KiogZGlyZWN0b3J5IG11c3QgYmUgYmVmb3JlXG4gICAqIHtAbGluayBzaG91bGRTd2VlcExlZnRvdmVyc30gcmVtb3ZlcyBpdC5cbiAgICpcbiAgICogR292ZXJucyB0aGUgaG9zdC1zaWRlIHN3ZWVwIG9ubHkgKHRoZSBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzXG4gICAqIHRoaXMgcnVuJ3MgbWFjaGluZSBhY2N1bXVsYXRlcyBpbiBpdHMgdGVtcCBkaXIpLiBUaGUgKipkZXZpY2UqKiBzd2VlcCBpc1xuICAgKiB1bmNvbmRpdGlvbmFsOiBBbmRyb2lkIHJ1bnMgaG9sZCB0aGUgZXhjbHVzaXZlIGBhbmRyb2lkYCBzZXR1cCBsb2NrLCBzbyBub1xuICAgKiBjb25jdXJyZW50IHJ1biBjYW4gb3duIGEgZGV2aWNlIHZhdWx0LCBhbmQgYW4gYWdlIGdhdGUgdGhlcmUgd291bGQgbGV0IGFcbiAgICogdmF1bHQgbGVha2VkIG1pbnV0ZXMgYWdvIHN1cnZpdmUgaW50byB0aGUgbmV4dCBydW4gXHUyMDE0IHdoaWNoIGlzIHRoZSBmYWlsdXJlXG4gICAqIGxvb3AgdGhlIHN3ZWVwIGV4aXN0cyB0byBicmVhay4gU2V0IGAwYCB0byByZW1vdmUgZXZlcnkgaG9zdCBtYXRjaCB0b28uXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIHRoZSBkZXZpY2UtaWRsZSBnYXRlLCBmb3IgdGhlXG4gICAqIGVtdWxhdG9yIHRvIHJlcG9ydCBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZSB0aGUgQXBwaXVtIHNlc3Npb25cbiAgICogaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEEgZGV2aWNlIGNhbiBiZSBpZGxlLCBmdWxseSBwYWNrYWdlZCBhbmQgYW5zd2VyaW5nIGBhZGJgIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAgKiBubyByb3V0ZTogdGhlIHR3byB7QGxpbmsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gc2lnbmFscyBhcmVcbiAgICogc2F0aXNmaWVkIHdlbGwgYmVmb3JlIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkLCB3aGljaFxuICAgKiBsYW5kcyB+ODBzIGludG8gZ3Vlc3QgdXB0aW1lLiBUaGF0IGdhcCBpcyBkYW5nZXJvdXMgcmF0aGVyIHRoYW4gbWVyZWx5IHNsb3dcbiAgICogXHUyMDE0IGEgdGVzdCB0aGF0IHJlYWNoZXMgdGhlIG5ldHdvcmsgdGhlcmUgcnVucyB0byBjb21wbGV0aW9uIGFnYWluc3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5IHJlc3VsdCoqLCB3aGljaCBubyBhc3NlcnRpb24gaW5zaWRlIHRoZSBzdWl0ZSBjYW4gdGVsbFxuICAgKiBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgZmFjdG9yeSBwb2xscyBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHVudGlsIGFuIGFjdGl2ZSBkZWZhdWx0IG5ldHdvcmtcbiAgICogcmVwb3J0cyB2YWxpZGF0aW9uLCBwcm9jZWVkaW5nIGVhcmx5IG9uY2UgaXQgZG9lcyBvciBhZnRlciB0aGlzIGJ1ZGdldFxuICAgKiAoYmVzdC1lZmZvcnQgXHUyMDE0IGEgdGltZW91dCBsb2dzIGEgd2FybmluZyBuYW1pbmcgdGhlIG1pc3NpbmcgbmV0d29yayBhbmRcbiAgICogcHJvY2VlZHMpLiBTZXQgYDBgIHRvIHNraXAgdGhlIHdhaXQsIGUuZy4gZm9yIGEgZGVsaWJlcmF0ZWx5IG9mZmxpbmUgQVZEIG9yXG4gICAqIGEgc3VpdGUgdGhhdCBuZXZlciB0b3VjaGVzIHRoZSBuZXR3b3JrLlxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGEgKipyZXVzZWQqKiBkZXZpY2UgYXMgd2VsbCBhcyBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUsIGZvciB0aGVcbiAgICogc2FtZSByZWFzb24gdGhlIGlkbGUgZ2F0ZSBkb2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTIwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgYSBzaW5nbGUgc2NyaXB0IGV4ZWN1dGVkIGluc2lkZSBPYnNpZGlhbiBcdTIwMTQgdGhlXG4gICAqIHBlci1gZXZhbEluT2JzaWRpYW5gIGNhcCBvbiB0aGlzIHRyYW5zcG9ydC5cbiAgICpcbiAgICogSXQgaXMgZW5mb3JjZWQgYnkgdGhlIHRyYW5zcG9ydCBpdHNlbGYsIG9uIHRoZSBOb2RlIHNpZGUsIGFuZCBpcyBhbHNvIHNlbnQgYXNcbiAgICogdGhlIFczQyBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5IFx1MjAxNCBidXQgdGhlIGNhcGFiaWxpdHkgaXMgZGVjb3JhdGlvbi5cbiAgICogTWVhc3VyZWQgb24gYSBsaXZlIGVtdWxhdG9yOiBpdCBpcyBhY2NlcHRlZCBhbmQgcmVhZHMgYmFjayBhc1xuICAgKiBgMzAwMDBgIGluIHRoZSBXZWJWaWV3IGNvbnRleHQsIGFuZCBub3RoaW5nIGV2ZXIgYWN0cyBvbiBpdC4gT3Zlci1jYXBcbiAgICogY2xvc3VyZXMgcmFuIHBhc3QgYSA2MHMgY2VpbGluZyB3aXRob3V0IFdlYkRyaXZlciByYWlzaW5nIGBzY3JpcHQgdGltZW91dGBcbiAgICogb25jZSwgaW4gYm90aCB0aGUgc2xlZXBpbmcgYW5kIHRoZSBzcGlubmluZyBzaGFwZSwgd2l0aCBhbmQgd2l0aG91dCBhblxuICAgKiBleHBsaWNpdCBgc2V0VGltZW91dHNgLlxuICAgKlxuICAgKiBXaGF0IGhhcHBlbnMgcGFzdCByb3VnaGx5IGhhbGYgYSBtaW51dGUgaXMgd29yc2UgdGhhbiBhIGxhdGUgYW5zd2VyOiB0aGVcbiAgICogY2xvc3VyZSBjb21wbGV0ZXMgaW4gdGhlIGd1ZXN0IG9uIHNjaGVkdWxlIGFuZCBpdHMgRXhlY3V0ZSBTY3JpcHQgcmVzcG9uc2VcbiAgICogbmV2ZXIgcmVhY2hlcyB0aGUgY2xpZW50LCBzbyB0aGUgY2FsbCBzaW1wbHkgbmV2ZXIgcmV0dXJucy4gVGhpcyB0aW1lb3V0IGlzXG4gICAqIHdoYXQgdHVybnMgdGhhdCBzaWxlbmNlIGludG8gYW4ge0BsaW5rIEV2YWxDYXBFeGNlZWRlZEVycm9yfSBuYW1pbmcgdGhlXG4gICAqIGNsb3N1cmUgYXMgdGhlIGNhdXNlLlxuICAgKlxuICAgKiBSYWlzaW5nIGl0IGlzIGFsbW9zdCBuZXZlciB0aGUgcmlnaHQgYW5zd2VyLiBBIGNsb3N1cmUgdGhhdCBuZWVkcyB0byB3YWl0XG4gICAqIGxvbmdlciB0aGFuIHRoaXMgc2hvdWxkIG5vdCBiZSB3YWl0aW5nIGluc2lkZSBPYnNpZGlhbiBhdCBhbGwgXHUyMDE0IHVzZVxuICAgKiBgcG9sbEluT2JzaWRpYW5gLCB3aGljaCBrZWVwcyBlYWNoIGNsb3N1cmUgc2hvcnQgYW5kIGRvZXMgdGhlIHdhaXRpbmdcbiAgICogZnJvbSBOb2RlLiBUaGUga25vYiBleGlzdHMgc28gdGhlIGNhcCBpcyBleHBsaWNpdCBhbmQgbWF0Y2hlc1xuICAgKiB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IG9uIGRlc2t0b3AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGVzdGFibGlzaGluZyB0aGUgQXBwaXVtIHNlc3Npb24gKFdlYkRyaXZlcklPXG4gICAqIGByZW1vdGUoKWAgXHUyMDE0IFVpQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbCArIGFwcCBsYXVuY2gpLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBsYXJnZXN0IGFuZCBtb3N0IGxvYWQtc2Vuc2l0aXZlIHN0ZXAgb2YgdGhlIEFuZHJvaWQgc2V0dXA6XG4gICAqIG9uIGEgY29sZCBvciBjb250ZW5kZWQgZW11bGF0b3IgaXQgZG9taW5hdGVzIHN0YXJ0dXAgYW5kIGNhbiB0YWtlIGEgZmV3XG4gICAqIG1pbnV0ZXMuIFJhaXNlIGl0IGlmIHNlc3Npb24gZXN0YWJsaXNobWVudCB0aW1lcyBvdXQgdW5kZXIgbG9hZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDE4MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFuIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uIElEIHRvIHJlYXR0YWNoIHRvLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnNcbiAgICogdmlhIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS5cbiAgICogV2hlbiBwcmVzZW50LCB0aGUgdHJhbnNwb3J0IGZhY3RvcnkgdXNlcyBXZWJEcml2ZXJJTydzIGBhdHRhY2goKWAgaW5zdGVhZFxuICAgKiBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uLCBhdm9pZGluZyBkdXBsaWNhdGUgQXBwaXVtL0FEQiBjb25uZWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgbWlzc2luZyBBcHBpdW0gZGVwZW5kZW5jaWVzICh0aGVcbiAgICogYHVpYXV0b21hdG9yMmAgZHJpdmVyLCBhbmQgQXBwaXVtIGl0c2VsZikgYmVmb3JlIGF1dG8tc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBhbmQgdGhlIGhhcm5lc3MgaXMgYWJvdXQgdG8gYXV0by1zdGFydCB0aGUgQXBwaXVtXG4gICAqIHNlcnZlciAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pLCB0aGUgZmFjdG9yeSBmaXJzdCBlbnN1cmVzIEFwcGl1bSBpc1xuICAgKiBpbnN0YWxsZWQgKGdsb2JhbGx5LCB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWApIGFuZCB0aGF0IHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIgaXMgaW5zdGFsbGVkIChgYXBwaXVtIGRyaXZlciBpbnN0YWxsIHVpYXV0b21hdG9yMmApLFxuICAgKiBpbnN0YWxsaW5nIHdoaWNoZXZlciBpcyBtaXNzaW5nLiBJZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIgKG5vdGhpbmcgaXMgYXV0by1zdGFydGVkLCBzbyBub3RoaW5nIGlzIGluc3RhbGxlZCkgb3JcbiAgICogd2hlbiB7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSBpcyBgZmFsc2VgLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBtYW5hZ2VcbiAgICogdGhlIEFwcGl1bSB0b29sY2hhaW4geW91cnNlbGYgYW5kIHNraXAgdGhlIG1hY2hpbmUtbXV0YXRpbmcgZ2xvYmFsIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIEFwcGl1bSBzZXJ2ZXIgaWYgaXQgaXMgbm90IHJlYWNoYWJsZS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHNwYXducyBgbnB4IGFwcGl1bWBcbiAgICogYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgd2hlbiB0aGUgcHJlZmxpZ2h0IGNoZWNrIGZhaWxzLCBhbmQga2lsbHMgaXRcbiAgICogb24gdHJhbnNwb3J0IGRpc3Bvc2FsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBtYXkgcmVzdW1lIFx1MjAxNCBhbmQgcmVmcmVzaCBcdTIwMTQgdGhlIEFWRCdzXG4gICAqIHNhdmVkIGJvb3Qgc25hcHNob3QuXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBlbXVsYXRvciBpcyBzdGFydGVkIHdpdGhcbiAgICogYC1uby1zbmFwc2hvdC1sb2FkIC1uby1zbmFwc2hvdC1zYXZlYCwgc28gZXZlcnkgcnVuIGNvbGQtYm9vdHMgYSBndWVzdCB3aG9zZVxuICAgKiBzdGF0ZSBub3RoaW5nIGNhcnJpZWQgb3Zlci4gVGhhdCBpcyB0aGUgaGVybWV0aWMgZGVmYXVsdCBhIHRlc3QgaGFybmVzc1xuICAgKiBvd2VzIGl0cyBjYWxsZXJzLCBhbmQgaXQgaXMgYWxzbyB0aGUgc2FmZSBvbmU6IGEgc25hcHNob3QgdGhlIGhhcm5lc3MgbG9hZHNcbiAgICogYnV0IG5ldmVyIHdyaXRlcyByb3RzIHVubm90aWNlZCwgYW5kIHRoZSBmYWlsdXJlIGl0IGV2ZW50dWFsbHkgcHJvZHVjZXMgXHUyMDE0IGFcbiAgICogZGV2aWNlIHRoYXQgc2VydmVzIGFkYiwgYWNjZXB0cyBhIHNlc3Npb24sIHRoZW4gZHJvcHMgYG9mZmxpbmVgIGFib3V0IGhhbGYgYVxuICAgKiBtaW51dGUgbGF0ZXIgXHUyMDE0IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBjb2RlIHJlZ3Jlc3Npb24uIE1lYXN1cmVkIG9uIG9uZVxuICAgKiBBVkQgYmFjayB0byBiYWNrLCBhIHJlc3VtZWQgc25hcHNob3Qga2lsbGVkIHRoZSBndWVzdCB+OTBzIGluICpldmVyeSogdGltZSxcbiAgICogd2hpbGUgdGhlIHNhbWUgQVZEIGNvbGQtYm9vdGVkIGluIDUwcyBhbmQgc3RheWVkIHVwLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gYHRydWVgIG9uIGEgKipwZXJzaXN0ZW50IHJ1bm5lcioqIHdob3NlIEFWRCBpcyBub3Qgc2hhcmVkIHdpdGhcbiAgICogYW55dGhpbmcgZWxzZTogdGhlIGVtdWxhdG9yIHRoZW4gYm90aCBsb2FkcyBhbmQgc2F2ZXMgYGRlZmF1bHRfYm9vdGAsIHNvIHRoZVxuICAgKiBzbmFwc2hvdCBlYWNoIHJ1biByZXN1bWVzIGlzIG9uZSBhIHByZXZpb3VzIHJ1biB3cm90ZSwgYW5kIHRoZSB+MTEycyBjb2xkXG4gICAqIGJvb3QgaXMgbGFyZ2VseSBib3VnaHQgYmFjay4gVGhlIHRyYWRlIGlzIHRlc3QgaXNvbGF0aW9uIFx1MjAxNCBhIGd1ZXN0IHRoYXRcbiAgICogY2FycmllcyBzdGF0ZSBiZXR3ZWVuIHJ1bnMgXHUyMDE0IHNvIGl0IGlzIG9wdC1pbiBwZXIgcHJvamVjdCwgbmV2ZXIgYSBkZWZhdWx0LlxuICAgKiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmcgZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaGFybmVzcyByZW1vdmVzIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlYWtlZC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgZWFjaCBydW4gc3dlZXBzIGF0IHN0YXJ0ICoqYW5kKiogYXQgZW5kOiBvbiB0aGVcbiAgICogZGV2aWNlLCBldmVyeSBgdGVtcC12YXVsdC0qYCBkaXJlY3RvcnkgdW5kZXIge0BsaW5rIHZhdWx0QmFzZVBhdGh9IChwbHVzIHRoZVxuICAgKiBzdGFsZSB2YXVsdCByZWdpc3RyYXRpb25zIGluIE9ic2lkaWFuIE1vYmlsZSdzIGBsb2NhbFN0b3JhZ2VgKTsgb24gdGhlIGhvc3QsXG4gICAqIHRoZSBsZWZ0b3ZlciBgdGVtcC12YXVsdC0qYCBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGRpcmVjdG9yaWVzIG9sZGVyIHRoYW5cbiAgICoge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LlxuICAgKlxuICAgKiBBIHJ1biB0aGF0IGRpZXMgY2Fubm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiBcdTIwMTQgaXRzIHRlYXJkb3duIGdvZXMgdGhyb3VnaCB0aGVcbiAgICogV2ViVmlldywgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIHdoYXQgbW9zdCBBbmRyb2lkIGZhaWx1cmVzIGFyZSBcdTIwMTQgc28gdGhlXG4gICAqIHJlc2lkdWUgYWNjdW11bGF0ZXMgYW5kIHNsb3dzIHRoZSBuZXh0IHJ1bidzIHN0YXJ0dXAgZW51bWVyYXRpb24gdW50aWwgaXRcbiAgICogbWlzc2VzIHRoZSBXZWJWaWV3LXJlYWRpbmVzcyBidWRnZXQuIFRoZSBzdGFydCBzd2VlcCBpcyB0aGUgaGFsZiB0aGF0IGJyZWFrc1xuICAgKiB0aGF0IGxvb3AsIGJlY2F1c2UgaXQgcnVucyBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZGllLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogT24gc2xvdyBlbXVsYXRvcnMsIHRoZSBDaHJvbWVEcml2ZXIgcHJveHkgdGhhdCBoYW5kbGVzIFdlYlZpZXcgY29tbWFuZHNcbiAgICogbWF5IG5vdCBiZSByZWFkeSBpbW1lZGlhdGVseSBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gc3RhcnRzLiBUaGlzIHRpbWVvdXRcbiAgICogY29udHJvbHMgaG93IGxvbmcgdG8gcG9sbCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBkZXNrdG9wIHRlc3RpbmcgdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHRoZSBoYXJuZXNzICoqbGF1bmNoZXMgYW5kXG4gKiBvd25zIGFuIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlKiogaW4gYSB0ZW1wb3JhcnkgdXNlci1kYXRhIGRpciAobmV2ZXJcbiAqIHRvdWNoaW5nIHRoZSB1c2VyJ3MgT2JzaWRpYW4pLCBjb25uZWN0ZWQgb3ZlciBhIGZyZWUgQ0RQIHBvcnQuIFByb3ZpZGVcbiAqIHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH0gdG8gaW5zdGVhZCBhdHRhY2ggdG8gYW5cbiAqIGFscmVhZHktcnVubmluZyBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byAzMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0J3MgKipjb25maWcgZm9sZGVyKiogXHUyMDE0IE9ic2lkaWFuJ3MgcGVyLXZhdWx0ICpPdmVycmlkZSBjb25maWdcbiAgICogZm9sZGVyKiBzZXR0aW5nLCBlLmcuIGAnLm9ic2lkaWFuLWRlc2t0b3AnYC4gTXVzdCBzdGFydCB3aXRoIGEgZG90LCBtdXN0IG5vdFxuICAgKiBiZSB0aGUgYmFyZSBkb3QsIGFuZCBtdXN0IG5vdCBjb250YWluIGEgcGF0aCBzZXBhcmF0b3I7IGFueXRoaW5nIGVsc2UgdGhyb3dzXG4gICAqIGJlZm9yZSBPYnNpZGlhbiBpcyBsYXVuY2hlZCwgYmVjYXVzZSBPYnNpZGlhbiBpdHNlbGYgd291bGQgc2lsZW50bHlcbiAgICogc3Vic3RpdHV0ZSBgLm9ic2lkaWFuYC5cbiAgICpcbiAgICogTmVlZGVkIHRvIG9wZW4gYSB2YXVsdCB0aGF0IGtlZXBzIGl0cyBzZXR0aW5ncyBzb21ld2hlcmUgb3RoZXIgdGhhblxuICAgKiBgLm9ic2lkaWFuYCBcdTIwMTQgYSB2YXVsdCB3aXRoIGEgc3RhbGUgYC5vYnNpZGlhbmAgYmVzaWRlIHRoZSByZWFsIGZvbGRlciB3b3VsZFxuICAgKiBvdGhlcndpc2Ugb3BlbiBzdWNjZXNzZnVsbHkgYWdhaW5zdCB0aGUgd3Jvbmcgc2V0dGluZ3MgYW5kIHJlcG9ydCBzdWNjZXNzLlxuICAgKiBUaGUgb3ZlcnJpZGUgbGl2ZXMgaW4gYGxvY2FsU3RvcmFnZWAsIGtleWVkIGJ5IHZhdWx0IGlkLCBhbmQgc28gaXMgc2NvcGVkIHRvXG4gICAqIGEgdXNlci1kYXRhIGRpcmVjdG9yeTogYW4gb3duZWQgaW5zdGFuY2UgZ2V0cyBhIGZyZXNoIHRlbXAgb25lIGFuZCB0aGVyZWZvcmVcbiAgICogaW5oZXJpdHMgbm90aGluZyBmcm9tIHRoZSB1c2VyJ3MgT2JzaWRpYW4sIGhvd2V2ZXIgdGhhdCB2YXVsdCBpcyBjb25maWd1cmVkXG4gICAqIHRoZXJlLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGNvc3RzIG9uZSBleHRyYSBib290IHBoYXNlOiB0aGUgaW5zdGFuY2UgaXMgbGF1bmNoZWQgdG8gdGhlXG4gICAqIHN0YXJ0ZXIgc2NyZWVuLCB0aGUgb3ZlcnJpZGUgaXMgd3JpdHRlbiBpbiB0aGF0IHJlbmRlcmVyLCBhbmQgdGhlIHZhdWx0IGlzXG4gICAqIHRoZW4gb3BlbmVkIG92ZXIgSVBDLiBBZnRlciB0aGUgdmF1bHQgaXMgcmVhZHkgaXRzIGFjdHVhbFxuICAgKiBgYXBwLnZhdWx0LmNvbmZpZ0RpcmAgaXMgcmVhZCBiYWNrIGFuZCBhbnkgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIGBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yYCBcdTIwMTQgdGhlcmUgaXMgbm8ga25vYiB0byBkb3duZ3JhZGUgdGhhdCwgYmVjYXVzZSBhXG4gICAqIHZhdWx0IG9wZW5lZCBhZ2FpbnN0IHRoZSB3cm9uZyBjb25maWcgZm9sZGVyIGlzIHNpbGVudGx5IHRoZSB3cm9uZyB2YXVsdC5cbiAgICpcbiAgICogT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGU7ICoqaWdub3JlZCBpbiBhdHRhY2ggbW9kZSoqICh7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLnBvcnR9XG4gICAqIHNldCksIHdoZXJlIHRoZSB2YXVsdCBpcyBvcGVuZWQgYnkgdGhlIHVzZXIncyBvd24gT2JzaWRpYW4gdW5kZXIgaXRzIG93blxuICAgKiBjb25maWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgKipkZWFkIGJvb3QqKiBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBjYW5ub3QgcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbCAodGhlIGluc3RhbGxlclxuICAgKiB2ZXJzaW9uIGlzIHRvbyBvbGQgZm9yIHRoZSBhcHAgdmVyc2lvbiksIHRoZSByZW5kZXJlciBsb2FkcyBidXQgbmV2ZXJcbiAgICogYm9vdHN0cmFwczogYGRvY3VtZW50LmJvZHlgIHN0YXlzIGVtcHR5IGFuZCBgd2luZG93LmFwcGAgcmVtYWluc1xuICAgKiBgdW5kZWZpbmVkYCBcdTIwMTQgYSBibGFjayBzY3JlZW4uIFJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzc1xuICAgKiB0aW1lb3V0LCB0aGUgb3duZWQtdmF1bHQgcmVhZGluZXNzIHBvbGwgY29uY2x1ZGVzIHRoZSBib290IGlzIGRlYWQgb25jZSB0aGVcbiAgICogcmVuZGVyZXIgaGFzIGJlZW4gYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCBmb3IgdGhpcyBsb25nIHdpdGggbm9cbiAgICogYHdpbmRvdy5hcHBgIGFuZCBhbiBlbXB0eSBgPGJvZHk+YCwgYW5kIHRocm93cyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS4gU2V0IGAwYCB0byBkaXNhYmxlIGZhc3QtZmFpbCBhbmRcbiAgICogcmVzdG9yZSB0aGUgcGxhaW4gd2FpdC1vdXQtdGhlLXJlYWRpbmVzcy10aW1lb3V0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB7QGxpbmsgcG9ydH0gYXMgdGhlIENEUCBwb3J0IG9mIGEgKipoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZSoqXG4gICAqIHRoYXQgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGFuZCBwcmVwYXJlZCAodmF1bHQgcmVnaXN0ZXJlZCxcbiAgICogcGx1Z2luIGVuYWJsZWQpLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgdmlhXG4gICAqIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS4gV2hlbiBzZXQsXG4gICAqIHRoZSB3b3JrZXIgKiphdHRhY2hlcyoqIHRvIHRoZSBvd25lZCBpbnN0YW5jZSBvbiB7QGxpbmsgcG9ydH0gaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgaXRzIG93biwgYW5kIHNraXBzIHRoZSB1c2VyLXNjb3BlIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQgXHUyMDE0XG4gICAqIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcsIG5vdCB0aGVcbiAgICogdXNlci1zY29wZSByZWdpc3RyeS4gRG8gbm90IHNldCB0aGlzIG1hbnVhbGx5OyBmb3IgcGxhaW4gYXR0YWNoIG1vZGUgdXNlXG4gICAqIHtAbGluayBwb3J0fSBhbG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZCBkZXNrdG9wIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCwgdGhlIGhhcm5lc3MgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIHdpdGhcbiAgICoga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyBhbmQgbW92ZXMgaXRzIHdpbmRvdyAqKm9mZi1zY3JlZW4qKiBvbmNlIEVsZWN0cm9uJ3NcbiAgICogcmVtb3RlIGJyaWRnZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBydW4gbmV2ZXIgc3RlYWxzIGZvY3VzIG9yIHBvcHMgYSB3aW5kb3cgaW5cbiAgICogZnJvbnQgb2YgeW91LiBPZmYtc2NyZWVuIChub3QgbWluaW1pemVkKSBrZWVwcyB0aGUgcmVuZGVyZXIgbGl2ZSwgc29cbiAgICogYHNldFRpbWVvdXRgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGJlaGF2ZVxuICAgKiBpZGVudGljYWxseSB0byBhIHZpc2libGUgd2luZG93LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGludGVncmF0aW9uIHNldHVwXG4gICAqIGV4cGxpY2l0bHkgcGFzc2VzIGBmYWxzZWAgdG8gYXZvaWQgc3RlYWxpbmcgZm9jdXMuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGVcbiAgICogKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiBtb3ZlcyB0aGUgdXNlcidzIG93biBydW5uaW5nIHdpbmRvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmUge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBUaGUgZ2F0ZSBtYXR0ZXJzIG1vc3Qgb24gZGVza3RvcDogcnVucyBhcmUgZGVsaWJlcmF0ZWx5ICoqbm90Kiogc2VyaWFsaXplZFxuICAgKiAoZWFjaCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSwgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzXG4gICAqIG9uZSB0ZW1wIGRpcmVjdG9yeSwgc28gYSB5b3VuZyBgdGVtcC12YXVsdC0qYCAvIGB1c2VyZGF0YS0qYCBkaXJlY3RvcnkgbWF5XG4gICAqIHdlbGwgYmVsb25nIHRvIGEgcnVuIHRoYXQgaXMgc3RpbGwgaW4gZmxpZ2h0LiBSYWlzZSBpdCBpZiBhIHJ1biBvZiB5b3VycyBjYW5cbiAgICogb3V0bGl2ZSB0aGUgZGVmYXVsdDsgc2V0IGAwYCB0byByZW1vdmUgZXZlcnkgbWF0Y2ggcmVnYXJkbGVzcyBvZiBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipFbGVjdHJvbiBzaGVsbCoqIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFRoZSBtYXRjaGluZyBHaXRIdWIgcmVsZWFzZSBpbnN0YWxsZXIgaXMgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIHRvIGFcbiAgICogcG9ydGFibGUgc2hlbGwgKGNhY2hlZCBmb3IgcmV1c2UpLiBQdWJsaWMgcmVsZWFzZXMgb25seSBcdTIwMTQgY2F0YWx5c3QgYnVpbGRzXG4gICAqIGhhdmUgbm8gcHVibGljIGluc3RhbGxlci4gSWdub3JlZCB3aGVuIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipPYnNpZGlhbiBhcHAgdmVyc2lvbioqIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy5cbiAgICpcbiAgICogQWNjZXB0cyBhbiBleHBsaWNpdCBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLlxuICAgKiBWZXJzaW9ucyBhdCBvciBhYm92ZSB0aGUgc2hlbGwgdmVyc2lvbiBhcmUgYXBwbGllZCBhcyBhIGNoZWFwIGFzYXIgc3dhcDtcbiAgICogb2xkZXIgdmVyc2lvbnMgdHJhbnNwYXJlbnRseSB1c2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgdXNlcidzIGN1cnJlbnRseS1pbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9XG4gICAqIChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0byAodGhlXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgaXQgd2FzIGxhdW5jaGVkIHdpdGgpLiBXaGVuIHNldCwgdGhlIGhhcm5lc3NcbiAgICogYXR0YWNoZXMgaW5zdGVhZCBvZiBvd25pbmcgYW4gaW5zdGFuY2UsIGFuZCB0aGUgdmVyc2lvbiBrbm9icyBhcmUgaWdub3JlZC5cbiAgICogV2hlbiBvbWl0dGVkLCBhbiBvd25lZCBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5XG4gICAqIGNob3NlbiBmcmVlIHBvcnQgKG5vIHBvcnQgaXMgaGFyZGNvZGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGF1bmNoIHRoZSBvd25lZCBpbnN0YW5jZSB3aXRoIENocm9taXVtJ3Mgc2FuZGJveCBkaXNhYmxlZFxuICAgKiAoYC0tbm8tc2FuZGJveGApLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gYm9vdCBhbiBvd25lZCBpbnN0YW5jZSBvbiBMaW51eCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciBcdTIwMTQgZS5nLiBhIHBvcnRhYmxlIHNoZWxsXG4gICAqIGV4dHJhY3RlZCBmcm9tIGFuIGluc3RhbGxlciwgb3IgYSBDSSBydW5uZXIgbGF1bmNoaW5nIGFzIGEgbm9uLXJvb3QgdXNlciwgaW5cbiAgICogd2hpY2ggY2FzZSB0aGUgcmVuZGVyZXIgb3RoZXJ3aXNlIHJlZnVzZXMgdG8gc3RhcnQuIEhhcm1sZXNzIG9uXG4gICAqIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSB1c2VyJ3MgcnVubmluZyBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgYW5kIGF0IGVuZCBmb3JcbiAgICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZyBkaXJlY3RvcmllcyBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGluc3RhbmNlIHByb2ZpbGVzXG4gICAqIG9sZGVyIHRoYW4ge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LiBBIHJ1biBraWxsZWQgbWlkLWZsaWdodFxuICAgKiBuZXZlciByZWFjaGVzIGl0cyBvd24gY2xlYW51cCwgc28gd2l0aG91dCB0aGlzIHRoZSB0ZW1wIGRpcmVjdG9yeSBncm93c1xuICAgKiB3aXRob3V0IGJvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhbiAqKnVucnVubmFibGUqKiBpbnN0YWxsZXJcdTIxOTRhcHAgdmVyc2lvbiBwYWlyIGZhaWxzIGZhc3QgYmVmb3JlIGxhdW5jaC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgYW4gaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IgKHRoZVxuICAgKiBvbGRlc3QgaW5zdGFsbGVyIHRoZSBhcHAncyBhc2FyIGNhbiBib290IG9uKSB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24sIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLiBTZXQgYGZhbHNlYCB0byBsZXQgdGhlIHBpbiBwcm9jZWVkIHRvIGxhdW5jaFxuICAgKiBpbnN0ZWFkIFx1MjAxNCB3aGVyZSB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbFxuICAgKiAoYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLCBzZWUge0BsaW5rIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kc30pXG4gICAqIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXNcbiAgICogc3VyZmFjZWQgYXMgZGF0YSByYXRoZXIgdGhhbiB0aHJvd24uIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZCBpbnN0YW5jZVxuICAgKiAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdCBhZnRlciBib290LlxuICAgKlxuICAgKiBXaGVuIGFuIGFzYXIgaXMgc3dhcHBlZCBvbnRvIGFuIGluc3RhbGxlciBzaGVsbCB0b28gb2xkIGZvciBpdCwgdGhlIGluc3RhbmNlXG4gICAqIG1heSBub3QgZGVhZC1ib290IFx1MjAxNCBpdCBjYW4gc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZFxuICAgKiBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmcgKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWBcbiAgICogKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBhZ2FpbnN0IHRoZSBwaW5cbiAgICogcG9zdC1ib290IGFuZCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBvbiBhIG1pc21hdGNoLiBTZXQgYGZhbHNlYCB0b1xuICAgKiBsZXQgdGhlIGJvb3QgcHJvY2VlZCBcdTIwMTQgdGhlIG1pc21hdGNoIGlzIHRoZW4gc3VyZmFjZWQgYXMgZGF0YSAodGhlIGZhbGxiYWNrXG4gICAqIHZlcmRpY3QpIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlIHJ1bm5pbmcgYVxuICAgKiBzd2FwcGVkLWluIGFzYXIgKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQsIGFuZCB3aGVuIG5vIGFzYXIgaXNcbiAgICogc3dhcHBlZCBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyAqKmJvdGgqKiBjb21wYXRpYmlsaXR5IG5hZ3M6IHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIChhXG4gICAqIHJ1bm5hYmxlIGluc3RhbGxlciBiZWxvdyB0aGUgcmVjb21tZW5kZWQgZmxvb3IpIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZyAoYSBsaXZlIEVsZWN0cm9uIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZFxuICAgKiBtaW5pbXVtKS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzcyBsb2c7IHNldFxuICAgKiBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBjb21wdXRlZCBhbmQgc3VyZmFjZWQgYXNcbiAgICogZGF0YSAoYGNvbXBhdGliaWxpdHlgIC8gYGVsZWN0cm9uQ29tcGF0aWJpbGl0eWApLCBvbmx5IHRoZSBsb2cgaXMgc3VwcHJlc3NlZC5cbiAgICogRG9lcyBub3QgYWZmZWN0IHRoZSBgJ3VucnVubmFibGUnYCB0aHJvdyAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSkuIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZFxuICAgKiBpbnN0YW5jZSAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWNkcCc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBhbGwgc3VwcG9ydGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGluIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCB0byBzZWxlY3QgYW5kXG4gKiBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyA9XG4gIHwgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICB8IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucztcblxuLyoqXG4gKiBXaGV0aGVyIHRoZXNlIG9wdGlvbnMgZGVzY3JpYmUgYSBtb2JpbGUgdHJhbnNwb3J0LlxuICpcbiAqIFRoZSBzYW1lIGZhY3QgYXMge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmlzTW9iaWxlfSwgYnV0IGtub3dhYmxlIGZyb20gdGhlIG9wdGlvbnMgYWxvbmUgXHUyMDE0IHNvIGEgY2FsbGVyXG4gKiBjYW4gYWN0IG9uIGl0IGJlZm9yZSBwYXlpbmcgZm9yIGEgZGV2aWNlLiBSZWFkaW5nIGl0IG9mZiBhIGxpdmUgdHJhbnNwb3J0IG1lYW5zIGJvb3RpbmcgdGhlIGVtdWxhdG9yXG4gKiBhbmQgdGhlIEFwcGl1bSBzZXNzaW9uIGZpcnN0LCB3aGljaCBpcyB+NzAgcyB0byBsZWFybiBzb21ldGhpbmcgdGhlIGRpc2NyaW1pbmFudCBhbHJlYWR5IHNheXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgbW9iaWxlIHRyYW5zcG9ydCwgYGZhbHNlYCBmb3IgZGVza3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG59XG5cbi8qKlxuICogVGhlIGNvbmZpZyBmb2xkZXIgYSB2YXVsdCB0aGUgaGFybmVzcyAqKm93bnMqKiB3aWxsIGFjdHVhbGx5IHJlYWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAqIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQuXG4gKlxuICoge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucy5jb25maWdEaXJlY3Rvcnl9IGlzIHRoZSBvbmx5IGtub2IgdGhhdCBtb3ZlcyBpdCwgYW5kIGl0IGlzXG4gKiBtZWFuaW5nZnVsIG9ubHkgaW4gb3duZWQgbW9kZTogaW4gYXR0YWNoIG1vZGUgdGhlIHZhdWx0IGlzIG9wZW5lZCBieSB0aGUgdXNlcidzIG93biBPYnNpZGlhbiB1bmRlclxuICogaXRzIG93biBjb25maWcsIGFuZCBvbiBBbmRyb2lkIHRoZXJlIGlzIG5vIG92ZXJyaWRlIGF0IGFsbC4gQW55dGhpbmcgdGhlIGhhcm5lc3Mgd3JpdGVzIGludG8gYSB2YXVsdFxuICogYmVmb3JlIGl0IGlzIG9wZW5lZCBoYXMgdG8gZ28gd2hlcmUgdGhhdCB2YXVsdCB3aWxsIGxvb2ssIHNvIHRoaXMgaXMgdGhlIGFuc3dlciBldmVyeSBzdWNoIHdyaXRlclxuICogbmVlZHMgXHUyMDE0IHNlZSBgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZ2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgb3ZlcnJpZGRlbiBjb25maWcgZm9sZGVyIG5hbWUsIG9yIGB1bmRlZmluZWRgIGZvciBPYnNpZGlhbidzIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3duZWRDb25maWdEaXJlY3Rvcnkob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ29ic2lkaWFuLWNkcCcgfHwgb3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuY29uZmlnRGlyZWN0b3J5O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBMm1CTyxTQUFTLHVCQUF1QixTQUE0QztBQUNqRixTQUFPLFFBQVEsU0FBUztBQUMxQjtBQWVPLFNBQVMsNEJBQTRCLFNBQXVEO0FBQ2pHLE1BQUksUUFBUSxTQUFTLGtCQUFrQixRQUFRLFNBQVMsUUFBVztBQUNqRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sUUFBUTtBQUNqQjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBPYnNpZGlhbiBNb2JpbGUgdG8gZ2V0IGFzIGZhciBhcyBgZ2xvYmFsVGhpcy5hcHBgXG4gICAqIGV4aXN0aW5nIGFmdGVyIHRoZSB2YXVsdCBpcyAocmUpb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgZmlyc3Qgb2YgdGhlIHR3byBidWRnZXRzIHRoZSB0cmFuc3BvcnQgc3BlbmRzIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAuXG4gICAqIEl0IGNvdmVycyB0aGUgYXBwJ3Mgb3duIGNvbGQgc3RhcnQgXHUyMDE0IHRoZSBXZWJWaWV3IHJlbG9hZGluZyBhbmQgT2JzaWRpYW4nc1xuICAgKiBidW5kbGUgY29taW5nIHVwIFx1MjAxNCB3aGljaCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGd1ZXN0IGNhbiB0YWtlIG1pbnV0ZXMsIGFuZFxuICAgKiBpcyBub3Qgd29yayB7QGxpbmsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9IHNob3VsZCBiZSBzaXplZCBmb3IuXG4gICAqIE9ubHkgb25jZSBgZ2xvYmFsVGhpcy5hcHBgIGFwcGVhcnMgZG9lcyB0aGF0IGZhciB0aWdodGVyIGNsb2NrIHN0YXJ0LlxuICAgKlxuICAgKiBTcGxpdHRpbmcgdGhlIHR3byBpcyB3aGF0IHN0b3BzIGEgZmlyc3QgcnVuIGFmdGVyIGEgbWFjaGluZSByZXN0YXJ0IGZyb21cbiAgICogZmFpbGluZyBieSBkZXNpZ246IHRoZSBvbGQgc2luZ2xlIDkwcyB3YWxsIGNsb2NrIHN0YXJ0ZWQgYXQgdGhlIHJlbG9hZCwgc28gYVxuICAgKiBjb2xkIGFwcCBzdGFydCBzcGVudCBpdCBiZWZvcmUgT2JzaWRpYW4gaGFkIGJlZ3VuIGxheWluZyBhbnl0aGluZyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFuZHJvaWQgQVZEIChBbmRyb2lkIFZpcnR1YWwgRGV2aWNlKSBuYW1lLlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGZhY3RvcnkgbGF1bmNoZXMgYGVtdWxhdG9yIC1hdmQgPGF2ZE5hbWU+YCBhcyBhIGJhY2tncm91bmRcbiAgICogcHJvY2VzcyBhbmQgcG9sbHMgdW50aWwgdGhlIGRldmljZSBhcHBlYXJzLiBUaGUgZW11bGF0b3IgaXMga2lsbGVkXG4gICAqIG9uIHRyYW5zcG9ydCBkaXNwb3NhbC5cbiAgICpcbiAgICogUnVuIGBlbXVsYXRvciAtbGlzdC1hdmRzYCB0byBzZWUgYXZhaWxhYmxlIEFWRCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIHRvIHJldXNlIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gaXNcbiAgICogZXN0YWJsaXNoZWQuIFdoZW4gcHJlc2VudCBhbG9uZ3NpZGUge0BsaW5rIHNlc3Npb25JZH0sIHRoZSB0cmFuc3BvcnRcbiAgICogZmFjdG9yeSBza2lwcyBlbXVsYXRvciBzdGFydHVwIGFuZCBhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZywgYWZ0ZXIgYHN5cy5ib290X2NvbXBsZXRlZGAsIGZvciB0aGVcbiAgICogZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC5cbiAgICpcbiAgICogQXBwbGllcyB0byBhICoqcmV1c2VkKiogZGV2aWNlIGFzIHdlbGwgYXMgYSBoYXJuZXNzLXN0YXJ0ZWQgb25lLiBBIGRldmljZVxuICAgKiB0aGF0IGlzIG1lcmVseSBwcmVzZW50IGluIGBhZGIgZGV2aWNlc2AgY2FuIHN0aWxsIGJlIG1pZC1gZGV4Mm9hdGAsIGFuZFxuICAgKiBza2lwcGluZyB0aGUgZ2F0ZSB0aGVyZSBpcyB3aGF0IGxlZnQgYSBydW4gcG9sbGluZyBhIGNodXJuaW5nIGd1ZXN0IHVudGlsXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gcmFuIG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgYG5weCBhcHBpdW1gIHNlcnZlciBwcm9jZXNzIGlzIHNwYXduZWQgd2l0aFxuICAgKiBpdHMgY29uc29sZSB3aW5kb3cgaGlkZGVuIChgd2luZG93c0hpZGVgKSBhbmQgaXRzIG91dHB1dCBkaXNjYXJkZWQsIHNvIGl0XG4gICAqIG5laXRoZXIgc3RlYWxzIGZvY3VzIG5vciB3cml0ZXMgdG8gdGhlIGludm9raW5nIHRlcm1pbmFsLiBJZ25vcmVkIHdoZW5cbiAgICogYXR0YWNoaW5nIHRvIGFuIGFscmVhZHktcnVubmluZyBBcHBpdW0gc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfVxuICAgKiBgZmFsc2VgLCBvciB0aGUgc2VydmVyIGFscmVhZHkgcmVhY2hhYmxlKS4gU2V0IGB0cnVlYCB0byBzZWUgdGhlIHNlcnZlciBsb2cgd2luZG93XG4gICAqIGFuZCBpdHMgbGl2ZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQW5kcm9pZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aCBgLW5vLXdpbmRvd2BcbiAgICogKGhlYWRsZXNzKSwgc28gaXQgbmV2ZXIgc3RlYWxzIGZvY3VzLiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmdcbiAgICogZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkIHRvIGhpZGUpLiBTZXQgYHRydWVgIHRvIHdhdGNoIHRoZSBlbXVsYXRvciBVSS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90XG4gICAqIGZyb20gdGhlIHJlbG9hZC5cbiAgICpcbiAgICogVGhlIHNlY29uZCBvZiB0aGUgdHdvIGJ1ZGdldHMgdGhlIHRyYW5zcG9ydCBzcGVuZHMgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYC5cbiAgICogSXQgY292ZXJzIG9ubHkgT2JzaWRpYW4ncyBvd24gd29yayBcdTIwMTQgb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmcgZXZlcnlcbiAgICogcGx1Z2luIFx1MjAxNCBvbmNlIHRoZSBhcHAgaXRzZWxmIGlzIHVwLCB3aGljaCBpcyB3aHkgaXQgY2FuIHN0YXkgdGlnaHQ6IG1lYXN1cmVkXG4gICAqIGF0IH4xcywgYW5kIFx1MjI2NDguNHMgdW5kZXIgMTItY29yZSArIGRpc2sgKyBtZW1vcnkgc3RyZXNzLlxuICAgKlxuICAgKiBCbG93aW5nIGl0IHRoZXJlZm9yZSBtZWFucyBPYnNpZGlhbiBnZW51aW5lbHkgc3RhbGxlZCwgKipvcioqIHRoYXQgZWFjaCBwcm9iZVxuICAgKiByb3VuZC10cmlwIGlzIGJlaW5nIGluZmxhdGVkIGJ5IGEgYnVzeSBndWVzdC4gVGhlIHRpbWVvdXQgZXJyb3IgbmFtZXMgd2hpY2gsXG4gICAqIGJ5IHJlcG9ydGluZyB0aGUgcHJvYmUgY291bnQgYW5kIHNsb3dlc3Qgcm91bmQtdHJpcCBhbG9uZ3NpZGUgdGhlIGZ1cnRoZXN0XG4gICAqIHN0YXJ0dXAgbWlsZXN0b25lIHJlYWNoZWQ6IGEgaGFuZGZ1bCBvZiBwcm9iZXMgZWFjaCB0YWtpbmcgdGVucyBvZiBzZWNvbmRzIGlzXG4gICAqIGEgY29udGVuZGVkIGd1ZXN0LCBhbmQgdGhlIGtub2IgZm9yIHRoYXQgaXNcbiAgICoge0BsaW5rIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LCBub3QgdGhpcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgb2xkIGEgbGVmdG92ZXIgKipob3N0KiogZGlyZWN0b3J5IG11c3QgYmUgYmVmb3JlXG4gICAqIHtAbGluayBzaG91bGRTd2VlcExlZnRvdmVyc30gcmVtb3ZlcyBpdC5cbiAgICpcbiAgICogR292ZXJucyB0aGUgaG9zdC1zaWRlIHN3ZWVwIG9ubHkgKHRoZSBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzXG4gICAqIHRoaXMgcnVuJ3MgbWFjaGluZSBhY2N1bXVsYXRlcyBpbiBpdHMgdGVtcCBkaXIpLiBUaGUgKipkZXZpY2UqKiBzd2VlcCBpc1xuICAgKiB1bmNvbmRpdGlvbmFsOiBBbmRyb2lkIHJ1bnMgaG9sZCB0aGUgZXhjbHVzaXZlIGBhbmRyb2lkYCBzZXR1cCBsb2NrLCBzbyBub1xuICAgKiBjb25jdXJyZW50IHJ1biBjYW4gb3duIGEgZGV2aWNlIHZhdWx0LCBhbmQgYW4gYWdlIGdhdGUgdGhlcmUgd291bGQgbGV0IGFcbiAgICogdmF1bHQgbGVha2VkIG1pbnV0ZXMgYWdvIHN1cnZpdmUgaW50byB0aGUgbmV4dCBydW4gXHUyMDE0IHdoaWNoIGlzIHRoZSBmYWlsdXJlXG4gICAqIGxvb3AgdGhlIHN3ZWVwIGV4aXN0cyB0byBicmVhay4gU2V0IGAwYCB0byByZW1vdmUgZXZlcnkgaG9zdCBtYXRjaCB0b28uXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIHRoZSBkZXZpY2UtaWRsZSBnYXRlLCBmb3IgdGhlXG4gICAqIGVtdWxhdG9yIHRvIHJlcG9ydCBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZSB0aGUgQXBwaXVtIHNlc3Npb25cbiAgICogaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEEgZGV2aWNlIGNhbiBiZSBpZGxlLCBmdWxseSBwYWNrYWdlZCBhbmQgYW5zd2VyaW5nIGBhZGJgIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAgKiBubyByb3V0ZTogdGhlIHR3byB7QGxpbmsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gc2lnbmFscyBhcmVcbiAgICogc2F0aXNmaWVkIHdlbGwgYmVmb3JlIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkLCB3aGljaFxuICAgKiBsYW5kcyB+ODBzIGludG8gZ3Vlc3QgdXB0aW1lLiBUaGF0IGdhcCBpcyBkYW5nZXJvdXMgcmF0aGVyIHRoYW4gbWVyZWx5IHNsb3dcbiAgICogXHUyMDE0IGEgdGVzdCB0aGF0IHJlYWNoZXMgdGhlIG5ldHdvcmsgdGhlcmUgcnVucyB0byBjb21wbGV0aW9uIGFnYWluc3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5IHJlc3VsdCoqLCB3aGljaCBubyBhc3NlcnRpb24gaW5zaWRlIHRoZSBzdWl0ZSBjYW4gdGVsbFxuICAgKiBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgZmFjdG9yeSBwb2xscyBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHVudGlsIGFuIGFjdGl2ZSBkZWZhdWx0IG5ldHdvcmtcbiAgICogcmVwb3J0cyB2YWxpZGF0aW9uLCBwcm9jZWVkaW5nIGVhcmx5IG9uY2UgaXQgZG9lcyBvciBhZnRlciB0aGlzIGJ1ZGdldFxuICAgKiAoYmVzdC1lZmZvcnQgXHUyMDE0IGEgdGltZW91dCBsb2dzIGEgd2FybmluZyBuYW1pbmcgdGhlIG1pc3NpbmcgbmV0d29yayBhbmRcbiAgICogcHJvY2VlZHMpLiBTZXQgYDBgIHRvIHNraXAgdGhlIHdhaXQsIGUuZy4gZm9yIGEgZGVsaWJlcmF0ZWx5IG9mZmxpbmUgQVZEIG9yXG4gICAqIGEgc3VpdGUgdGhhdCBuZXZlciB0b3VjaGVzIHRoZSBuZXR3b3JrLlxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGEgKipyZXVzZWQqKiBkZXZpY2UgYXMgd2VsbCBhcyBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUsIGZvciB0aGVcbiAgICogc2FtZSByZWFzb24gdGhlIGlkbGUgZ2F0ZSBkb2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTIwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgYSBzaW5nbGUgc2NyaXB0IGV4ZWN1dGVkIGluc2lkZSBPYnNpZGlhbiBcdTIwMTQgdGhlXG4gICAqIHBlci1gZXZhbEluT2JzaWRpYW5gIGNhcCBvbiB0aGlzIHRyYW5zcG9ydC5cbiAgICpcbiAgICogSXQgaXMgZW5mb3JjZWQgYnkgdGhlIHRyYW5zcG9ydCBpdHNlbGYsIG9uIHRoZSBOb2RlIHNpZGUsIGFuZCBpcyBhbHNvIHNlbnQgYXNcbiAgICogdGhlIFczQyBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5IFx1MjAxNCBidXQgdGhlIGNhcGFiaWxpdHkgaXMgZGVjb3JhdGlvbi5cbiAgICogTWVhc3VyZWQgb24gYSBsaXZlIGVtdWxhdG9yOiBpdCBpcyBhY2NlcHRlZCBhbmQgcmVhZHMgYmFjayBhc1xuICAgKiBgMzAwMDBgIGluIHRoZSBXZWJWaWV3IGNvbnRleHQsIGFuZCBub3RoaW5nIGV2ZXIgYWN0cyBvbiBpdC4gT3Zlci1jYXBcbiAgICogY2xvc3VyZXMgcmFuIHBhc3QgYSA2MHMgY2VpbGluZyB3aXRob3V0IFdlYkRyaXZlciByYWlzaW5nIGBzY3JpcHQgdGltZW91dGBcbiAgICogb25jZSwgaW4gYm90aCB0aGUgc2xlZXBpbmcgYW5kIHRoZSBzcGlubmluZyBzaGFwZSwgd2l0aCBhbmQgd2l0aG91dCBhblxuICAgKiBleHBsaWNpdCBgc2V0VGltZW91dHNgLlxuICAgKlxuICAgKiBXaGF0IGhhcHBlbnMgcGFzdCByb3VnaGx5IGhhbGYgYSBtaW51dGUgaXMgd29yc2UgdGhhbiBhIGxhdGUgYW5zd2VyOiB0aGVcbiAgICogY2xvc3VyZSBjb21wbGV0ZXMgaW4gdGhlIGd1ZXN0IG9uIHNjaGVkdWxlIGFuZCBpdHMgRXhlY3V0ZSBTY3JpcHQgcmVzcG9uc2VcbiAgICogbmV2ZXIgcmVhY2hlcyB0aGUgY2xpZW50LCBzbyB0aGUgY2FsbCBzaW1wbHkgbmV2ZXIgcmV0dXJucy4gVGhpcyB0aW1lb3V0IGlzXG4gICAqIHdoYXQgdHVybnMgdGhhdCBzaWxlbmNlIGludG8gYW4ge0BsaW5rIEV2YWxDYXBFeGNlZWRlZEVycm9yfSBuYW1pbmcgdGhlXG4gICAqIGNsb3N1cmUgYXMgdGhlIGNhdXNlLlxuICAgKlxuICAgKiBSYWlzaW5nIGl0IGlzIGFsbW9zdCBuZXZlciB0aGUgcmlnaHQgYW5zd2VyLiBBIGNsb3N1cmUgdGhhdCBuZWVkcyB0byB3YWl0XG4gICAqIGxvbmdlciB0aGFuIHRoaXMgc2hvdWxkIG5vdCBiZSB3YWl0aW5nIGluc2lkZSBPYnNpZGlhbiBhdCBhbGwgXHUyMDE0IHVzZVxuICAgKiBgcG9sbEluT2JzaWRpYW5gLCB3aGljaCBrZWVwcyBlYWNoIGNsb3N1cmUgc2hvcnQgYW5kIGRvZXMgdGhlIHdhaXRpbmdcbiAgICogZnJvbSBOb2RlLiBUaGUga25vYiBleGlzdHMgc28gdGhlIGNhcCBpcyBleHBsaWNpdCBhbmQgbWF0Y2hlc1xuICAgKiB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IG9uIGRlc2t0b3AuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGlzIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2AsIGV4cG9ydGVkIGZyb20gdGhlIHBhY2thZ2VcbiAgICogcm9vdCBcdTIwMTQgaW1wb3J0IGl0IHJhdGhlciB0aGFuIHJlc3RhdGluZyB0aGUgbnVtYmVyLCBzbyBhIGNsb3N1cmUgc2l6ZWRcbiAgICogYWdhaW5zdCB0aGUgY2FwIGZvbGxvd3MgaXQgaWYgaXQgZXZlciBtb3Zlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIG1heSByZXN1bWUgXHUyMDE0IGFuZCByZWZyZXNoIFx1MjAxNCB0aGUgQVZEJ3NcbiAgICogc2F2ZWQgYm9vdCBzbmFwc2hvdC5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aFxuICAgKiBgLW5vLXNuYXBzaG90LWxvYWQgLW5vLXNuYXBzaG90LXNhdmVgLCBzbyBldmVyeSBydW4gY29sZC1ib290cyBhIGd1ZXN0IHdob3NlXG4gICAqIHN0YXRlIG5vdGhpbmcgY2FycmllZCBvdmVyLiBUaGF0IGlzIHRoZSBoZXJtZXRpYyBkZWZhdWx0IGEgdGVzdCBoYXJuZXNzXG4gICAqIG93ZXMgaXRzIGNhbGxlcnMsIGFuZCBpdCBpcyBhbHNvIHRoZSBzYWZlIG9uZTogYSBzbmFwc2hvdCB0aGUgaGFybmVzcyBsb2Fkc1xuICAgKiBidXQgbmV2ZXIgd3JpdGVzIHJvdHMgdW5ub3RpY2VkLCBhbmQgdGhlIGZhaWx1cmUgaXQgZXZlbnR1YWxseSBwcm9kdWNlcyBcdTIwMTQgYVxuICAgKiBkZXZpY2UgdGhhdCBzZXJ2ZXMgYWRiLCBhY2NlcHRzIGEgc2Vzc2lvbiwgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhXG4gICAqIG1pbnV0ZSBsYXRlciBcdTIwMTQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGNvZGUgcmVncmVzc2lvbi4gTWVhc3VyZWQgb24gb25lXG4gICAqIEFWRCBiYWNrIHRvIGJhY2ssIGEgcmVzdW1lZCBzbmFwc2hvdCBraWxsZWQgdGhlIGd1ZXN0IH45MHMgaW4gKmV2ZXJ5KiB0aW1lLFxuICAgKiB3aGlsZSB0aGUgc2FtZSBBVkQgY29sZC1ib290ZWQgaW4gNTBzIGFuZCBzdGF5ZWQgdXAuXG4gICAqXG4gICAqIFNldCBpdCB0byBgdHJ1ZWAgb24gYSAqKnBlcnNpc3RlbnQgcnVubmVyKiogd2hvc2UgQVZEIGlzIG5vdCBzaGFyZWQgd2l0aFxuICAgKiBhbnl0aGluZyBlbHNlOiB0aGUgZW11bGF0b3IgdGhlbiBib3RoIGxvYWRzIGFuZCBzYXZlcyBgZGVmYXVsdF9ib290YCwgc28gdGhlXG4gICAqIHNuYXBzaG90IGVhY2ggcnVuIHJlc3VtZXMgaXMgb25lIGEgcHJldmlvdXMgcnVuIHdyb3RlLCBhbmQgdGhlIH4xMTJzIGNvbGRcbiAgICogYm9vdCBpcyBsYXJnZWx5IGJvdWdodCBiYWNrLiBUaGUgdHJhZGUgaXMgdGVzdCBpc29sYXRpb24gXHUyMDE0IGEgZ3Vlc3QgdGhhdFxuICAgKiBjYXJyaWVzIHN0YXRlIGJldHdlZW4gcnVucyBcdTIwMTQgc28gaXQgaXMgb3B0LWluIHBlciBwcm9qZWN0LCBuZXZlciBhIGRlZmF1bHQuXG4gICAqIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZyBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUVtdWxhdG9yU25hcHNob3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgKiphbmQqKiBhdCBlbmQ6IG9uIHRoZVxuICAgKiBkZXZpY2UsIGV2ZXJ5IGB0ZW1wLXZhdWx0LSpgIGRpcmVjdG9yeSB1bmRlciB7QGxpbmsgdmF1bHRCYXNlUGF0aH0gKHBsdXMgdGhlXG4gICAqIHN0YWxlIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gT2JzaWRpYW4gTW9iaWxlJ3MgYGxvY2FsU3RvcmFnZWApOyBvbiB0aGUgaG9zdCxcbiAgICogdGhlIGxlZnRvdmVyIGB0ZW1wLXZhdWx0LSpgIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgZGlyZWN0b3JpZXMgb2xkZXIgdGhhblxuICAgKiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uXG4gICAqXG4gICAqIEEgcnVuIHRoYXQgZGllcyBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIFx1MjAxNCBpdHMgdGVhcmRvd24gZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBXZWJWaWV3LCBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlIFx1MjAxNCBzbyB0aGVcbiAgICogcmVzaWR1ZSBhY2N1bXVsYXRlcyBhbmQgc2xvd3MgdGhlIG5leHQgcnVuJ3Mgc3RhcnR1cCBlbnVtZXJhdGlvbiB1bnRpbCBpdFxuICAgKiBtaXNzZXMgdGhlIFdlYlZpZXctcmVhZGluZXNzIGJ1ZGdldC4gVGhlIHN0YXJ0IHN3ZWVwIGlzIHRoZSBoYWxmIHRoYXQgYnJlYWtzXG4gICAqIHRoYXQgbG9vcCwgYmVjYXVzZSBpdCBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQgZm9yIHRoZSB0cmFuc3BvcnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBPbiBzbG93IGVtdWxhdG9ycywgdGhlIENocm9tZURyaXZlciBwcm94eSB0aGF0IGhhbmRsZXMgV2ViVmlldyBjb21tYW5kc1xuICAgKiBtYXkgbm90IGJlIHJlYWR5IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBBcHBpdW0gc2Vzc2lvbiBzdGFydHMuIFRoaXMgdGltZW91dFxuICAgKiBjb250cm9scyBob3cgbG9uZyB0byBwb2xsIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IG9wdGlvbnMgZm9yIGRlc2t0b3AgdGVzdGluZyB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZGVza3RvcCB0cmFuc3BvcnQuIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgKipsYXVuY2hlcyBhbmRcbiAqIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UqKiBpbiBhIHRlbXBvcmFyeSB1c2VyLWRhdGEgZGlyIChuZXZlclxuICogdG91Y2hpbmcgdGhlIHVzZXIncyBPYnNpZGlhbiksIGNvbm5lY3RlZCBvdmVyIGEgZnJlZSBDRFAgcG9ydC4gUHJvdmlkZVxuICoge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucy5wb3J0fSB0byBpbnN0ZWFkIGF0dGFjaCB0byBhblxuICogYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqXG4gICAqIEEgdGVzdCdzIGNsb3N1cmUgdHJhdmVscyBhcyBvbmUgYFJ1bnRpbWUuZXZhbHVhdGVgIGNvbW1hbmQsIHNvIHRoaXMgaXMgYWxzb1xuICAgKiB0aGUgZGVza3RvcCBwZXItZXZhbCBjYXAuIFRoZSBkZWZhdWx0IGlzIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2AsXG4gICAqIGV4cG9ydGVkIGZyb20gdGhlIHBhY2thZ2Ugcm9vdCBcdTIwMTQgaW1wb3J0IGl0IHJhdGhlciB0aGFuIHJlc3RhdGluZyB0aGUgbnVtYmVyLFxuICAgKiBzbyBhIGNsb3N1cmUgc2l6ZWQgYWdhaW5zdCB0aGUgY2FwIGZvbGxvd3MgaXQgaWYgaXQgZXZlciBtb3Zlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0J3MgKipjb25maWcgZm9sZGVyKiogXHUyMDE0IE9ic2lkaWFuJ3MgcGVyLXZhdWx0ICpPdmVycmlkZSBjb25maWdcbiAgICogZm9sZGVyKiBzZXR0aW5nLCBlLmcuIGAnLm9ic2lkaWFuLWRlc2t0b3AnYC4gTXVzdCBzdGFydCB3aXRoIGEgZG90LCBtdXN0IG5vdFxuICAgKiBiZSB0aGUgYmFyZSBkb3QsIGFuZCBtdXN0IG5vdCBjb250YWluIGEgcGF0aCBzZXBhcmF0b3I7IGFueXRoaW5nIGVsc2UgdGhyb3dzXG4gICAqIGJlZm9yZSBPYnNpZGlhbiBpcyBsYXVuY2hlZCwgYmVjYXVzZSBPYnNpZGlhbiBpdHNlbGYgd291bGQgc2lsZW50bHlcbiAgICogc3Vic3RpdHV0ZSBgLm9ic2lkaWFuYC5cbiAgICpcbiAgICogTmVlZGVkIHRvIG9wZW4gYSB2YXVsdCB0aGF0IGtlZXBzIGl0cyBzZXR0aW5ncyBzb21ld2hlcmUgb3RoZXIgdGhhblxuICAgKiBgLm9ic2lkaWFuYCBcdTIwMTQgYSB2YXVsdCB3aXRoIGEgc3RhbGUgYC5vYnNpZGlhbmAgYmVzaWRlIHRoZSByZWFsIGZvbGRlciB3b3VsZFxuICAgKiBvdGhlcndpc2Ugb3BlbiBzdWNjZXNzZnVsbHkgYWdhaW5zdCB0aGUgd3Jvbmcgc2V0dGluZ3MgYW5kIHJlcG9ydCBzdWNjZXNzLlxuICAgKiBUaGUgb3ZlcnJpZGUgbGl2ZXMgaW4gYGxvY2FsU3RvcmFnZWAsIGtleWVkIGJ5IHZhdWx0IGlkLCBhbmQgc28gaXMgc2NvcGVkIHRvXG4gICAqIGEgdXNlci1kYXRhIGRpcmVjdG9yeTogYW4gb3duZWQgaW5zdGFuY2UgZ2V0cyBhIGZyZXNoIHRlbXAgb25lIGFuZCB0aGVyZWZvcmVcbiAgICogaW5oZXJpdHMgbm90aGluZyBmcm9tIHRoZSB1c2VyJ3MgT2JzaWRpYW4sIGhvd2V2ZXIgdGhhdCB2YXVsdCBpcyBjb25maWd1cmVkXG4gICAqIHRoZXJlLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGNvc3RzIG9uZSBleHRyYSBib290IHBoYXNlOiB0aGUgaW5zdGFuY2UgaXMgbGF1bmNoZWQgdG8gdGhlXG4gICAqIHN0YXJ0ZXIgc2NyZWVuLCB0aGUgb3ZlcnJpZGUgaXMgd3JpdHRlbiBpbiB0aGF0IHJlbmRlcmVyLCBhbmQgdGhlIHZhdWx0IGlzXG4gICAqIHRoZW4gb3BlbmVkIG92ZXIgSVBDLiBBZnRlciB0aGUgdmF1bHQgaXMgcmVhZHkgaXRzIGFjdHVhbFxuICAgKiBgYXBwLnZhdWx0LmNvbmZpZ0RpcmAgaXMgcmVhZCBiYWNrIGFuZCBhbnkgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIGBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yYCBcdTIwMTQgdGhlcmUgaXMgbm8ga25vYiB0byBkb3duZ3JhZGUgdGhhdCwgYmVjYXVzZSBhXG4gICAqIHZhdWx0IG9wZW5lZCBhZ2FpbnN0IHRoZSB3cm9uZyBjb25maWcgZm9sZGVyIGlzIHNpbGVudGx5IHRoZSB3cm9uZyB2YXVsdC5cbiAgICpcbiAgICogT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGU7ICoqaWdub3JlZCBpbiBhdHRhY2ggbW9kZSoqICh7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLnBvcnR9XG4gICAqIHNldCksIHdoZXJlIHRoZSB2YXVsdCBpcyBvcGVuZWQgYnkgdGhlIHVzZXIncyBvd24gT2JzaWRpYW4gdW5kZXIgaXRzIG93blxuICAgKiBjb25maWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgKipkZWFkIGJvb3QqKiBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBjYW5ub3QgcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbCAodGhlIGluc3RhbGxlclxuICAgKiB2ZXJzaW9uIGlzIHRvbyBvbGQgZm9yIHRoZSBhcHAgdmVyc2lvbiksIHRoZSByZW5kZXJlciBsb2FkcyBidXQgbmV2ZXJcbiAgICogYm9vdHN0cmFwczogYGRvY3VtZW50LmJvZHlgIHN0YXlzIGVtcHR5IGFuZCBgd2luZG93LmFwcGAgcmVtYWluc1xuICAgKiBgdW5kZWZpbmVkYCBcdTIwMTQgYSBibGFjayBzY3JlZW4uIFJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzc1xuICAgKiB0aW1lb3V0LCB0aGUgb3duZWQtdmF1bHQgcmVhZGluZXNzIHBvbGwgY29uY2x1ZGVzIHRoZSBib290IGlzIGRlYWQgb25jZSB0aGVcbiAgICogcmVuZGVyZXIgaGFzIGJlZW4gYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCBmb3IgdGhpcyBsb25nIHdpdGggbm9cbiAgICogYHdpbmRvdy5hcHBgIGFuZCBhbiBlbXB0eSBgPGJvZHk+YCwgYW5kIHRocm93cyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS4gU2V0IGAwYCB0byBkaXNhYmxlIGZhc3QtZmFpbCBhbmRcbiAgICogcmVzdG9yZSB0aGUgcGxhaW4gd2FpdC1vdXQtdGhlLXJlYWRpbmVzcy10aW1lb3V0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB7QGxpbmsgcG9ydH0gYXMgdGhlIENEUCBwb3J0IG9mIGEgKipoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZSoqXG4gICAqIHRoYXQgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGFuZCBwcmVwYXJlZCAodmF1bHQgcmVnaXN0ZXJlZCxcbiAgICogcGx1Z2luIGVuYWJsZWQpLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgdmlhXG4gICAqIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS4gV2hlbiBzZXQsXG4gICAqIHRoZSB3b3JrZXIgKiphdHRhY2hlcyoqIHRvIHRoZSBvd25lZCBpbnN0YW5jZSBvbiB7QGxpbmsgcG9ydH0gaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgaXRzIG93biwgYW5kIHNraXBzIHRoZSB1c2VyLXNjb3BlIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQgXHUyMDE0XG4gICAqIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcsIG5vdCB0aGVcbiAgICogdXNlci1zY29wZSByZWdpc3RyeS4gRG8gbm90IHNldCB0aGlzIG1hbnVhbGx5OyBmb3IgcGxhaW4gYXR0YWNoIG1vZGUgdXNlXG4gICAqIHtAbGluayBwb3J0fSBhbG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZCBkZXNrdG9wIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCwgdGhlIGhhcm5lc3MgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIHdpdGhcbiAgICoga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyBhbmQgbW92ZXMgaXRzIHdpbmRvdyAqKm9mZi1zY3JlZW4qKiBvbmNlIEVsZWN0cm9uJ3NcbiAgICogcmVtb3RlIGJyaWRnZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBydW4gbmV2ZXIgc3RlYWxzIGZvY3VzIG9yIHBvcHMgYSB3aW5kb3cgaW5cbiAgICogZnJvbnQgb2YgeW91LiBPZmYtc2NyZWVuIChub3QgbWluaW1pemVkKSBrZWVwcyB0aGUgcmVuZGVyZXIgbGl2ZSwgc29cbiAgICogYHNldFRpbWVvdXRgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGJlaGF2ZVxuICAgKiBpZGVudGljYWxseSB0byBhIHZpc2libGUgd2luZG93LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGludGVncmF0aW9uIHNldHVwXG4gICAqIGV4cGxpY2l0bHkgcGFzc2VzIGBmYWxzZWAgdG8gYXZvaWQgc3RlYWxpbmcgZm9jdXMuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGVcbiAgICogKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiBtb3ZlcyB0aGUgdXNlcidzIG93biBydW5uaW5nIHdpbmRvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmUge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBUaGUgZ2F0ZSBtYXR0ZXJzIG1vc3Qgb24gZGVza3RvcDogcnVucyBhcmUgZGVsaWJlcmF0ZWx5ICoqbm90Kiogc2VyaWFsaXplZFxuICAgKiAoZWFjaCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSwgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzXG4gICAqIG9uZSB0ZW1wIGRpcmVjdG9yeSwgc28gYSB5b3VuZyBgdGVtcC12YXVsdC0qYCAvIGB1c2VyZGF0YS0qYCBkaXJlY3RvcnkgbWF5XG4gICAqIHdlbGwgYmVsb25nIHRvIGEgcnVuIHRoYXQgaXMgc3RpbGwgaW4gZmxpZ2h0LiBSYWlzZSBpdCBpZiBhIHJ1biBvZiB5b3VycyBjYW5cbiAgICogb3V0bGl2ZSB0aGUgZGVmYXVsdDsgc2V0IGAwYCB0byByZW1vdmUgZXZlcnkgbWF0Y2ggcmVnYXJkbGVzcyBvZiBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipFbGVjdHJvbiBzaGVsbCoqIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFRoZSBtYXRjaGluZyBHaXRIdWIgcmVsZWFzZSBpbnN0YWxsZXIgaXMgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIHRvIGFcbiAgICogcG9ydGFibGUgc2hlbGwgKGNhY2hlZCBmb3IgcmV1c2UpLiBQdWJsaWMgcmVsZWFzZXMgb25seSBcdTIwMTQgY2F0YWx5c3QgYnVpbGRzXG4gICAqIGhhdmUgbm8gcHVibGljIGluc3RhbGxlci4gSWdub3JlZCB3aGVuIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipPYnNpZGlhbiBhcHAgdmVyc2lvbioqIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy5cbiAgICpcbiAgICogQWNjZXB0cyBhbiBleHBsaWNpdCBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLlxuICAgKiBWZXJzaW9ucyBhdCBvciBhYm92ZSB0aGUgc2hlbGwgdmVyc2lvbiBhcmUgYXBwbGllZCBhcyBhIGNoZWFwIGFzYXIgc3dhcDtcbiAgICogb2xkZXIgdmVyc2lvbnMgdHJhbnNwYXJlbnRseSB1c2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgdXNlcidzIGN1cnJlbnRseS1pbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9XG4gICAqIChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0byAodGhlXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgaXQgd2FzIGxhdW5jaGVkIHdpdGgpLiBXaGVuIHNldCwgdGhlIGhhcm5lc3NcbiAgICogYXR0YWNoZXMgaW5zdGVhZCBvZiBvd25pbmcgYW4gaW5zdGFuY2UsIGFuZCB0aGUgdmVyc2lvbiBrbm9icyBhcmUgaWdub3JlZC5cbiAgICogV2hlbiBvbWl0dGVkLCBhbiBvd25lZCBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5XG4gICAqIGNob3NlbiBmcmVlIHBvcnQgKG5vIHBvcnQgaXMgaGFyZGNvZGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGF1bmNoIHRoZSBvd25lZCBpbnN0YW5jZSB3aXRoIENocm9taXVtJ3Mgc2FuZGJveCBkaXNhYmxlZFxuICAgKiAoYC0tbm8tc2FuZGJveGApLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gYm9vdCBhbiBvd25lZCBpbnN0YW5jZSBvbiBMaW51eCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciBcdTIwMTQgZS5nLiBhIHBvcnRhYmxlIHNoZWxsXG4gICAqIGV4dHJhY3RlZCBmcm9tIGFuIGluc3RhbGxlciwgb3IgYSBDSSBydW5uZXIgbGF1bmNoaW5nIGFzIGEgbm9uLXJvb3QgdXNlciwgaW5cbiAgICogd2hpY2ggY2FzZSB0aGUgcmVuZGVyZXIgb3RoZXJ3aXNlIHJlZnVzZXMgdG8gc3RhcnQuIEhhcm1sZXNzIG9uXG4gICAqIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSB1c2VyJ3MgcnVubmluZyBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgYW5kIGF0IGVuZCBmb3JcbiAgICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZyBkaXJlY3RvcmllcyBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGluc3RhbmNlIHByb2ZpbGVzXG4gICAqIG9sZGVyIHRoYW4ge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LiBBIHJ1biBraWxsZWQgbWlkLWZsaWdodFxuICAgKiBuZXZlciByZWFjaGVzIGl0cyBvd24gY2xlYW51cCwgc28gd2l0aG91dCB0aGlzIHRoZSB0ZW1wIGRpcmVjdG9yeSBncm93c1xuICAgKiB3aXRob3V0IGJvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhbiAqKnVucnVubmFibGUqKiBpbnN0YWxsZXJcdTIxOTRhcHAgdmVyc2lvbiBwYWlyIGZhaWxzIGZhc3QgYmVmb3JlIGxhdW5jaC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgYW4gaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IgKHRoZVxuICAgKiBvbGRlc3QgaW5zdGFsbGVyIHRoZSBhcHAncyBhc2FyIGNhbiBib290IG9uKSB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24sIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLiBTZXQgYGZhbHNlYCB0byBsZXQgdGhlIHBpbiBwcm9jZWVkIHRvIGxhdW5jaFxuICAgKiBpbnN0ZWFkIFx1MjAxNCB3aGVyZSB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbFxuICAgKiAoYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLCBzZWUge0BsaW5rIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kc30pXG4gICAqIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXNcbiAgICogc3VyZmFjZWQgYXMgZGF0YSByYXRoZXIgdGhhbiB0aHJvd24uIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZCBpbnN0YW5jZVxuICAgKiAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdCBhZnRlciBib290LlxuICAgKlxuICAgKiBXaGVuIGFuIGFzYXIgaXMgc3dhcHBlZCBvbnRvIGFuIGluc3RhbGxlciBzaGVsbCB0b28gb2xkIGZvciBpdCwgdGhlIGluc3RhbmNlXG4gICAqIG1heSBub3QgZGVhZC1ib290IFx1MjAxNCBpdCBjYW4gc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZFxuICAgKiBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmcgKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWBcbiAgICogKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBhZ2FpbnN0IHRoZSBwaW5cbiAgICogcG9zdC1ib290IGFuZCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBvbiBhIG1pc21hdGNoLiBTZXQgYGZhbHNlYCB0b1xuICAgKiBsZXQgdGhlIGJvb3QgcHJvY2VlZCBcdTIwMTQgdGhlIG1pc21hdGNoIGlzIHRoZW4gc3VyZmFjZWQgYXMgZGF0YSAodGhlIGZhbGxiYWNrXG4gICAqIHZlcmRpY3QpIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlIHJ1bm5pbmcgYVxuICAgKiBzd2FwcGVkLWluIGFzYXIgKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQsIGFuZCB3aGVuIG5vIGFzYXIgaXNcbiAgICogc3dhcHBlZCBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyAqKmJvdGgqKiBjb21wYXRpYmlsaXR5IG5hZ3M6IHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIChhXG4gICAqIHJ1bm5hYmxlIGluc3RhbGxlciBiZWxvdyB0aGUgcmVjb21tZW5kZWQgZmxvb3IpIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZyAoYSBsaXZlIEVsZWN0cm9uIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZFxuICAgKiBtaW5pbXVtKS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzcyBsb2c7IHNldFxuICAgKiBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBjb21wdXRlZCBhbmQgc3VyZmFjZWQgYXNcbiAgICogZGF0YSAoYGNvbXBhdGliaWxpdHlgIC8gYGVsZWN0cm9uQ29tcGF0aWJpbGl0eWApLCBvbmx5IHRoZSBsb2cgaXMgc3VwcHJlc3NlZC5cbiAgICogRG9lcyBub3QgYWZmZWN0IHRoZSBgJ3VucnVubmFibGUnYCB0aHJvdyAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSkuIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZFxuICAgKiBpbnN0YW5jZSAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWNkcCc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBhbGwgc3VwcG9ydGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGluIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCB0byBzZWxlY3QgYW5kXG4gKiBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyA9XG4gIHwgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICB8IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucztcblxuLyoqXG4gKiBXaGV0aGVyIHRoZXNlIG9wdGlvbnMgZGVzY3JpYmUgYSBtb2JpbGUgdHJhbnNwb3J0LlxuICpcbiAqIFRoZSBzYW1lIGZhY3QgYXMge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmlzTW9iaWxlfSwgYnV0IGtub3dhYmxlIGZyb20gdGhlIG9wdGlvbnMgYWxvbmUgXHUyMDE0IHNvIGEgY2FsbGVyXG4gKiBjYW4gYWN0IG9uIGl0IGJlZm9yZSBwYXlpbmcgZm9yIGEgZGV2aWNlLiBSZWFkaW5nIGl0IG9mZiBhIGxpdmUgdHJhbnNwb3J0IG1lYW5zIGJvb3RpbmcgdGhlIGVtdWxhdG9yXG4gKiBhbmQgdGhlIEFwcGl1bSBzZXNzaW9uIGZpcnN0LCB3aGljaCBpcyB+NzAgcyB0byBsZWFybiBzb21ldGhpbmcgdGhlIGRpc2NyaW1pbmFudCBhbHJlYWR5IHNheXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgbW9iaWxlIHRyYW5zcG9ydCwgYGZhbHNlYCBmb3IgZGVza3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG59XG5cbi8qKlxuICogVGhlIGNvbmZpZyBmb2xkZXIgYSB2YXVsdCB0aGUgaGFybmVzcyAqKm93bnMqKiB3aWxsIGFjdHVhbGx5IHJlYWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAqIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQuXG4gKlxuICoge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucy5jb25maWdEaXJlY3Rvcnl9IGlzIHRoZSBvbmx5IGtub2IgdGhhdCBtb3ZlcyBpdCwgYW5kIGl0IGlzXG4gKiBtZWFuaW5nZnVsIG9ubHkgaW4gb3duZWQgbW9kZTogaW4gYXR0YWNoIG1vZGUgdGhlIHZhdWx0IGlzIG9wZW5lZCBieSB0aGUgdXNlcidzIG93biBPYnNpZGlhbiB1bmRlclxuICogaXRzIG93biBjb25maWcsIGFuZCBvbiBBbmRyb2lkIHRoZXJlIGlzIG5vIG92ZXJyaWRlIGF0IGFsbC4gQW55dGhpbmcgdGhlIGhhcm5lc3Mgd3JpdGVzIGludG8gYSB2YXVsdFxuICogYmVmb3JlIGl0IGlzIG9wZW5lZCBoYXMgdG8gZ28gd2hlcmUgdGhhdCB2YXVsdCB3aWxsIGxvb2ssIHNvIHRoaXMgaXMgdGhlIGFuc3dlciBldmVyeSBzdWNoIHdyaXRlclxuICogbmVlZHMgXHUyMDE0IHNlZSBgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZ2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgb3ZlcnJpZGRlbiBjb25maWcgZm9sZGVyIG5hbWUsIG9yIGB1bmRlZmluZWRgIGZvciBPYnNpZGlhbidzIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3duZWRDb25maWdEaXJlY3Rvcnkob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbnMudHlwZSAhPT0gJ29ic2lkaWFuLWNkcCcgfHwgb3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuY29uZmlnRGlyZWN0b3J5O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBcW5CTyxTQUFTLHVCQUF1QixTQUE0QztBQUNqRixTQUFPLFFBQVEsU0FBUztBQUMxQjtBQWVPLFNBQVMsNEJBQTRCLFNBQXVEO0FBQ2pHLE1BQUksUUFBUSxTQUFTLGtCQUFrQixRQUFRLFNBQVMsUUFBVztBQUNqRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sUUFBUTtBQUNqQjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -63,9 +63,26 @@ export declare class WebViewCdpConnection {
|
|
|
63
63
|
get isOpen(): boolean;
|
|
64
64
|
private readonly eventHandlers;
|
|
65
65
|
private messageId;
|
|
66
|
+
/**
|
|
67
|
+
* The commands still waiting for a reply, keyed by the CDP message id each was
|
|
68
|
+
* sent with. Emptied by whichever of the reply and the timeout comes first.
|
|
69
|
+
*/
|
|
70
|
+
private readonly pendingCommands;
|
|
66
71
|
/**
|
|
67
72
|
* Wraps an already-open debugger socket, plus what is needed to tear its port forward down.
|
|
68
73
|
*
|
|
74
|
+
* ONE `message` listener for the socket's whole life, routing both halves of what
|
|
75
|
+
* arrives — CDP events to their subscribed handler, command replies to the
|
|
76
|
+
* {@link send} call waiting on the id. A listener per in-flight command instead
|
|
77
|
+
* would make the count scale with concurrency, so eleven commands in flight at
|
|
78
|
+
* once would cross Node's default `maxListeners` of 10 and report a memory leak
|
|
79
|
+
* that is not one (see the desktop transport's `getPendingCommands`, where the
|
|
80
|
+
* same shape was measured).
|
|
81
|
+
*
|
|
82
|
+
* The parse is guarded because a frame this connection cannot read belongs to
|
|
83
|
+
* nothing it sent: throwing here would throw out of the event dispatch, where
|
|
84
|
+
* nothing can catch it.
|
|
85
|
+
*
|
|
69
86
|
* @param webSocket - The open debugger socket.
|
|
70
87
|
* @param deviceId - The adb device id, needed to drop the port forward on dispose.
|
|
71
88
|
* @param port - The forwarded local port.
|
|
@@ -11,6 +11,18 @@ class WebViewCdpConnection {
|
|
|
11
11
|
/**
|
|
12
12
|
* Wraps an already-open debugger socket, plus what is needed to tear its port forward down.
|
|
13
13
|
*
|
|
14
|
+
* ONE `message` listener for the socket's whole life, routing both halves of what
|
|
15
|
+
* arrives — CDP events to their subscribed handler, command replies to the
|
|
16
|
+
* {@link send} call waiting on the id. A listener per in-flight command instead
|
|
17
|
+
* would make the count scale with concurrency, so eleven commands in flight at
|
|
18
|
+
* once would cross Node's default `maxListeners` of 10 and report a memory leak
|
|
19
|
+
* that is not one (see the desktop transport's `getPendingCommands`, where the
|
|
20
|
+
* same shape was measured).
|
|
21
|
+
*
|
|
22
|
+
* The parse is guarded because a frame this connection cannot read belongs to
|
|
23
|
+
* nothing it sent: throwing here would throw out of the event dispatch, where
|
|
24
|
+
* nothing can catch it.
|
|
25
|
+
*
|
|
14
26
|
* @param webSocket - The open debugger socket.
|
|
15
27
|
* @param deviceId - The adb device id, needed to drop the port forward on dispose.
|
|
16
28
|
* @param port - The forwarded local port.
|
|
@@ -20,11 +32,25 @@ class WebViewCdpConnection {
|
|
|
20
32
|
this.deviceId = deviceId;
|
|
21
33
|
this.port = port;
|
|
22
34
|
this.webSocket.addEventListener("message", (event) => {
|
|
23
|
-
|
|
24
|
-
|
|
35
|
+
let message;
|
|
36
|
+
try {
|
|
37
|
+
message = JSON.parse(String(event.data));
|
|
38
|
+
} catch {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (message.method !== void 0) {
|
|
42
|
+
this.eventHandlers.get(message.method)?.(message.params ?? {});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (message.id === void 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const pendingCommand = this.pendingCommands.get(message.id);
|
|
49
|
+
if (!pendingCommand) {
|
|
25
50
|
return;
|
|
26
51
|
}
|
|
27
|
-
this.
|
|
52
|
+
this.pendingCommands.delete(message.id);
|
|
53
|
+
pendingCommand(message);
|
|
28
54
|
});
|
|
29
55
|
}
|
|
30
56
|
webSocket;
|
|
@@ -43,6 +69,11 @@ class WebViewCdpConnection {
|
|
|
43
69
|
}
|
|
44
70
|
eventHandlers = /* @__PURE__ */ new Map();
|
|
45
71
|
messageId = 0;
|
|
72
|
+
/**
|
|
73
|
+
* The commands still waiting for a reply, keyed by the CDP message id each was
|
|
74
|
+
* sent with. Emptied by whichever of the reply and the timeout comes first.
|
|
75
|
+
*/
|
|
76
|
+
pendingCommands = /* @__PURE__ */ new Map();
|
|
46
77
|
/**
|
|
47
78
|
* Closes the socket and drops the adb port forward.
|
|
48
79
|
*/
|
|
@@ -86,24 +117,24 @@ class WebViewCdpConnection {
|
|
|
86
117
|
const id = ++this.messageId;
|
|
87
118
|
return new Promise((resolve, reject) => {
|
|
88
119
|
const timeout = setTimeout(() => {
|
|
89
|
-
this.
|
|
120
|
+
this.pendingCommands.delete(id);
|
|
90
121
|
reject(new Error(`WebView CDP command timed out after ${String(CDP_COMMAND_TIMEOUT_IN_MILLISECONDS)}ms: ${method}`));
|
|
91
122
|
}, CDP_COMMAND_TIMEOUT_IN_MILLISECONDS);
|
|
92
|
-
|
|
93
|
-
const message = JSON.parse(String(event.data));
|
|
94
|
-
if (message.id !== id) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
123
|
+
this.pendingCommands.set(id, (message) => {
|
|
97
124
|
clearTimeout(timeout);
|
|
98
|
-
this.webSocket.removeEventListener("message", handler);
|
|
99
125
|
if (message.error) {
|
|
100
126
|
reject(new Error(`WebView CDP command ${method} failed: ${message.error.message ?? "unknown error"}`));
|
|
101
127
|
return;
|
|
102
128
|
}
|
|
103
129
|
resolve(message.result ?? {});
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
|
|
130
|
+
});
|
|
131
|
+
try {
|
|
132
|
+
this.webSocket.send(JSON.stringify({ id, method, params }));
|
|
133
|
+
} catch (error) {
|
|
134
|
+
clearTimeout(timeout);
|
|
135
|
+
this.pendingCommands.delete(id);
|
|
136
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
137
|
+
}
|
|
107
138
|
});
|
|
108
139
|
}
|
|
109
140
|
/**
|
|
@@ -232,4 +263,4 @@ export {
|
|
|
232
263
|
parseWebViewDevtoolsSocketName,
|
|
233
264
|
selectWebViewPageTarget
|
|
234
265
|
};
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3dlYnZpZXctY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSBzZWNvbmQsIGluZGVwZW5kZW50IENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb25uZWN0aW9uIHRvIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcsIHVzZWQgdG8gaW5qZWN0XG4gKiAqKnRydXN0ZWQqKiBpbnB1dCBvbiBBbmRyb2lkIChzZWUgKipMMzkqKikuXG4gKlxuICogSXQgaXMgZGVsaWJlcmF0ZWx5IHNlcGFyYXRlIGZyb20gdGhlIEFwcGl1bSBzZXNzaW9uIHJhdGhlciB0aGFuIGxheWVyZWQgb24gaXQuIGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgXG4gKiBydW5zIHRoZSB3aG9sZSBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmUgaW5zaWRlIG9uZSBXM0MgKkV4ZWN1dGUgU2NyaXB0Kiwgd2hpY2ggYXdhaXRzIHRoZSByZXR1cm5lZFxuICogcHJvbWlzZSBcdTIwMTQgc28gd2hpbGUgYSBjbG9zdXJlIHNpdHMgd2FpdGluZyBvbiBgbGliLmNsaWNrRWxlbWVudCguLi4pYCwgdGhlIFdlYkRyaXZlciBzZXNzaW9uIGlzIGJ1c3kgYW5kXG4gKiBjYW5ub3QgYmUgYXNrZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4gQ0RQIGlzIGlkLW11bHRpcGxleGVkIGFuZCBDaHJvbWl1bSBhY2NlcHRzIG11bHRpcGxlIGRlYnVnZ2VyXG4gKiBjbGllbnRzLCBzbyB0aGlzIHNvY2tldCBzdGF5cyBmcmVlIGV4YWN0bHkgd2hlbiB0aGUgQXBwaXVtIG9uZSBkb2VzIG5vdC4gVGhhdCBpcyB3aGF0IGxldHMgdGhlIHJlbmRlcmVyXG4gKiBjYWxsIGJhY2sgb3V0IHRvIHRoZSBob3N0IG1pZC1jbG9zdXJlLlxuICpcbiAqIFJlYWNoaW5nIHRoZSBXZWJWaWV3J3MgZGVidWdnZXIgaXMgYSB0d28tc3RlcDogdGhlIGFwcCBwdWJsaXNoZXMgYW4gYWJzdHJhY3QgdW5peCBzb2NrZXQgbmFtZWRcbiAqIGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV88cGlkPmAsIGBhZGIgZm9yd2FyZGAgbWFwcyBpdCB0byBhIGxvY2FsIFRDUCBwb3J0LCBhbmQgdGhlIHVzdWFsIGAvanNvbmBcbiAqIGVuZHBvaW50IHRoZW4gbGlzdHMgdGhlIHBhZ2UgdGFyZ2V0cy5cbiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENkcElucHV0Q29tbWFuZCB9IGZyb20gJy4vbW9iaWxlLWlucHV0Lm1qcyc7XG5cbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBwaWNrRnJlZVBvcnQgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5cbmNvbnN0IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE1XzAwMDtcbi8vIGBhZGIgZm9yd2FyZCAtLWxpc3RgIHByaW50cyB0aHJlZSBjb2x1bW5zOiBgPGRldmljZUlkPiB0Y3A6PHBvcnQ+IGxvY2FsYWJzdHJhY3Q6PHNvY2tldE5hbWU+YC5cbmNvbnN0IEZPUldBUkRfTElTVF9DT0xVTU5fQ09VTlQgPSAzO1xuY29uc3QgREVDSU1BTF9SQURJWCA9IDEwO1xuY29uc3QgQ0RQX0NPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBDRFBfSE9TVCA9ICcxMjcuMC4wLjEnO1xuXG4vKipcbiAqIE9uZSBlbnRyeSBvZiB0aGUgZGVidWdnZXIncyBgL2pzb25gIHRhcmdldCBsaXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSB1cmw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdlYlNvY2tldERlYnVnZ2VyVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb25uZWN0VG9XZWJWaWV3Q2RwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0VG9XZWJWaWV3Q2RwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkIHdob3NlIFdlYlZpZXcgdG8gYXR0YWNoIHRvLCBlLmcuIGBtZC5vYnNpZGlhbmAuXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWRiIGRldmljZSBpZCAoYGVtdWxhdG9yLTU1NTRgLCBhIHNlcmlhbCkgdG8gcnVuIGFkYiBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXJyb3IgaGFsZiBvZiBhIGZhaWxlZCBDRFAgY29tbWFuZCByZXNwb25zZS5cbiAqL1xuaW50ZXJmYWNlIENkcEVycm9yIHtcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgQ0RQIGV2ZW50LlxuICovXG50eXBlIENkcEV2ZW50SGFuZGxlciA9IChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgQ0RQIG1lc3NhZ2U6IGVpdGhlciBhIHJlc3BvbnNlIHRvIGEgY29tbWFuZCAoYGlkYCkgb3IgYW4gZXZlbnQgKGBtZXRob2RgKS5cbiAqL1xuaW50ZXJmYWNlIENkcE1lc3NhZ2Uge1xuICByZWFkb25seSBlcnJvcj86IENkcEVycm9yO1xuICByZWFkb25seSBpZD86IG51bWJlcjtcbiAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgcmVzdWx0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKGEgbGl2ZSBXZWJTb2NrZXQgdG8gYSBXZWJWaWV3LCBhZGIgcG9ydCBmb3J3YXJkaW5nKS4gQ292ZXJlZCBieSB0aGUgQW5kcm9pZCBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHVuaXQgdGVzdHMuIEl0IGVuZHMgYmVmb3JlIGBwYXJzZUZvcndhcmRlZFBvcnRgOiBgcGVyZmVjdGlvbmlzdC9zb3J0LW1vZHVsZXNgIHBsYWNlcyB0aGUgcHVyZSwgdW5pdC10ZXN0ZWQgaGVscGVycyBBRlRFUiB0aGlzIGNsYXNzIGFuZCBgY29ubmVjdFRvV2ViVmlld0NkcGAsIHNvIHRoZXkgbXVzdCBzdGF5IG1lYXN1cmVkLiAqL1xuXG4vKipcbiAqIEFuIG9wZW4gQ0RQIGNvbm5lY3Rpb24gdG8gYSBXZWJWaWV3LlxuICpcbiAqIENvbW1hbmRzIGFyZSBpZC1tdWx0aXBsZXhlZCwgc28gYSBjb21tYW5kIGlzc3VlZCBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyIGNvbXBsZXRlcyB3aGlsZSBhbiBlYXJsaWVyXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAgaXMgc3RpbGwgYXdhaXRpbmcgaXRzIHByb21pc2UgXHUyMDE0IHdoaWNoIGlzIHRoZSB3aG9sZSByZWFzb24gdGhpcyBjbGFzcyBleGlzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJWaWV3Q2RwQ29ubmVjdGlvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgc3RpbGwgdXNhYmxlLlxuICAgKlxuICAgKiBSZXN0YXJ0aW5nIHRoZSBhcHAgdGVhcnMgaXRzIFdlYlZpZXcgZG93biBhbmQgdGFrZXMgdGhlIGRlYnVnZ2VyIHRhcmdldCB3aXRoIGl0LCBzbyBhIGNhY2hlZFxuICAgKiBjb25uZWN0aW9uIGhhcyB0byBiZSByZS1jaGVja2VkIHJhdGhlciB0aGFuIGFzc3VtZWQgbGl2ZS5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIHdoaWxlIHRoZSBzb2NrZXQgaXMgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBDZHBFdmVudEhhbmRsZXI+KCk7XG5cbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuXG4gIC8qKlxuICAgKiBXcmFwcyBhbiBhbHJlYWR5LW9wZW4gZGVidWdnZXIgc29ja2V0LCBwbHVzIHdoYXQgaXMgbmVlZGVkIHRvIHRlYXIgaXRzIHBvcnQgZm9yd2FyZCBkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViU29ja2V0IC0gVGhlIG9wZW4gZGVidWdnZXIgc29ja2V0LlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZCwgbmVlZGVkIHRvIGRyb3AgdGhlIHBvcnQgZm9yd2FyZCBvbiBkaXNwb3NlLlxuICAgKiBAcGFyYW0gcG9ydCAtIFRoZSBmb3J3YXJkZWQgbG9jYWwgcG9ydC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHdlYlNvY2tldDogV2ViU29ja2V0LCBwcml2YXRlIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcG9ydDogbnVtYmVyKSB7XG4gICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcE1lc3NhZ2U7XG4gICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXZlbnRIYW5kbGVycy5nZXQobWVzc2FnZS5tZXRob2QpPy4obWVzc2FnZS5wYXJhbXMgPz8ge30pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgc29ja2V0IGFuZCBkcm9wcyB0aGUgYWRiIHBvcnQgZm9yd2FyZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xvc2VTb2NrZXQoKTtcbiAgICBhd2FpdCByZW1vdmVGb3J3YXJkKHRoaXMuZGV2aWNlSWQsIHRoaXMucG9ydCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgZGlzcG9zYWwsIGZvciBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVycyB3aGVyZSBhc3luYyB3b3JrIGNhbm5vdCBydW4uXG4gICAqXG4gICAqIFdpdGhvdXQgdGhpcyBhbiBhYnJ1cHQgd29ya2VyIGV4aXQgbGVhdmVzIHRoZSBwb3J0IGZvcndhcmQgYmVoaW5kIFx1MjAxNCB0aGUgYXN5bmMge0BsaW5rIGRpc3Bvc2V9IGFib3ZlXG4gICAqIG5ldmVyIGdldHMgYSB0dXJuLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VTb2NrZXQoKTtcbiAgICB0cnkge1xuICAgICAgZXhlY0ZpbGVTeW5jKCdhZGInLCBbJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2ZvcndhcmQnLCAnLS1yZW1vdmUnLCBgdGNwOiR7U3RyaW5nKHRoaXMucG9ydCl9YF0sIHtcbiAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgICB0aW1lb3V0OiBBREJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQmVzdCBlZmZvcnQ6IGFkYiBkcm9wcyBldmVyeSBmb3J3YXJkIHdoZW4gdGhlIGRldmljZSBkaXNjb25uZWN0cyBhbnl3YXkuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gYSBDRFAgZXZlbnQuIE9uZSBoYW5kbGVyIHBlciBtZXRob2Q7IHN1YnNjcmliaW5nIGFnYWluIHJlcGxhY2VzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBldmVudCBuYW1lLCBlLmcuIGBSdW50aW1lLmJpbmRpbmdDYWxsZWRgLlxuICAgKiBAcGFyYW0gaGFuZGxlciAtIENhbGxlZCB3aXRoIHRoZSBldmVudCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIG9uKG1ldGhvZDogc3RyaW5nLCBoYW5kbGVyOiBDZHBFdmVudEhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuc2V0KG1ldGhvZCwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBDRFAgY29tbWFuZCBhbmQgd2FpdHMgZm9yIGl0cyByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBDRFAgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgc2VuZChtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLm1lc3NhZ2VJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLndlYlNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYlZpZXcgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKENEUF9DT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tczogJHttZXRob2R9YCkpO1xuICAgICAgfSwgQ0RQX0NPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoU3RyaW5nKGV2ZW50LmRhdGEpKSBhcyBDZHBNZXNzYWdlO1xuICAgICAgICBpZiAobWVzc2FnZS5pZCAhPT0gaWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHRoaXMud2ViU29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBXZWJWaWV3IENEUCBjb21tYW5kICR7bWV0aG9kfSBmYWlsZWQ6ICR7bWVzc2FnZS5lcnJvci5tZXNzYWdlID8/ICd1bmtub3duIGVycm9yJ31gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlLnJlc3VsdCA/PyB7fSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLndlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICB0aGlzLndlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhbiBvcmRlcmVkIGNvbW1hbmQgc2VxdWVuY2UsIG9uZSBjb21tYW5kIGF0IGEgdGltZS5cbiAgICpcbiAgICogRWFjaCBjb21tYW5kIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZSBuZXh0IGlzIHNlbnQsIHdoaWNoIGlzIHRoZSBvbmx5IG9yZGVyaW5nIGd1YXJhbnRlZSBhbiBpbnB1dFxuICAgKiBzZXF1ZW5jZSBuZWVkcyBcdTIwMTQgYSBsb25nLXByZXNzIGhvbGRzIGl0c2VsZiBmb3IgaXRzIG93biBgZHVyYXRpb25gIHJhdGhlciB0aGFuIGFza2luZyB0aGUgaG9zdCB0b1xuICAgKiBzbGVlcCBiZXR3ZWVuIHR3byB0b3VjaGVzLCBzbyB0aGVyZSBpcyBubyBpbnRlci1jb21tYW5kIGRlbGF5IHRvIGhvbm9yLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZEFsbChjb21tYW5kczogcmVhZG9ubHkgQ2RwSW5wdXRDb21tYW5kW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChjb21tYW5kLm1ldGhvZCwgY29tbWFuZC5wYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRlYnVnZ2VyIHNvY2tldCBhbmQgc3RvcHMgcm91dGluZyBpdHMgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjbG9zZVNvY2tldCgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy53ZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3BlbnMgYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgYXBwJ3MgV2ViVmlldy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggYXBwIG9uIHdoaWNoIGRldmljZS5cbiAqIEByZXR1cm5zIFRoZSBvcGVuIGNvbm5lY3Rpb24uIERpc3Bvc2UgaXQgdG8gY2xvc2UgdGhlIHNvY2tldCBhbmQgZHJvcCB0aGUgYWRiIHBvcnQgZm9yd2FyZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb1dlYlZpZXdDZHAocGFyYW1zOiBDb25uZWN0VG9XZWJWaWV3Q2RwUGFyYW1zKTogUHJvbWlzZTxXZWJWaWV3Q2RwQ29ubmVjdGlvbj4ge1xuICBjb25zdCB7IGFwcElkLCBkZXZpY2VJZCB9ID0gcGFyYW1zO1xuXG4gIC8vIGBwaWRvZmAgbGlzdHMgZXZlcnkgbWF0Y2hpbmcgcHJvY2VzczsgdGhlIGFwcCdzIG1haW4gb25lIGlzIGZpcnN0LlxuICBjb25zdCBwaWRvZk91dHB1dCA9IGF3YWl0IGFkYihkZXZpY2VJZCwgWydzaGVsbCcsICdwaWRvZicsIGFwcElkXSk7XG4gIGNvbnN0IHBpZCA9IHBpZG9mT3V0cHV0LnNwbGl0KC9cXHMrLywgMSlbMF0gPz8gJyc7XG4gIGlmICghcGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FwcElkfSBpcyBub3QgcnVubmluZyBvbiAke2RldmljZUlkfSwgc28gaXRzIFdlYlZpZXcgaGFzIG5vIGRlYnVnZ2VyIHRvIGF0dGFjaCB0by5gKTtcbiAgfVxuXG4gIGNvbnN0IHByb2NOZXRVbml4ID0gYXdhaXQgYWRiKGRldmljZUlkLCBbJ3NoZWxsJywgJ2NhdCcsICcvcHJvYy9uZXQvdW5peCddKTtcbiAgY29uc3Qgc29ja2V0TmFtZSA9IHBhcnNlV2ViVmlld0RldnRvb2xzU29ja2V0TmFtZShwcm9jTmV0VW5peCwgcGlkKTtcblxuICBjb25zdCBmb3J3YXJkTGlzdCA9IGF3YWl0IGFkYihkZXZpY2VJZCwgWydmb3J3YXJkJywgJy0tbGlzdCddKTtcbiAgY29uc3QgZXhpc3RpbmdQb3J0ID0gcGFyc2VGb3J3YXJkZWRQb3J0KGZvcndhcmRMaXN0LCBkZXZpY2VJZCwgc29ja2V0TmFtZSk7XG4gIGNvbnN0IHBvcnQgPSBleGlzdGluZ1BvcnQgPz8gYXdhaXQgcGlja0ZyZWVQb3J0KCk7XG4gIGlmIChleGlzdGluZ1BvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGF3YWl0IGFkYihkZXZpY2VJZCwgWydmb3J3YXJkJywgYHRjcDoke1N0cmluZyhwb3J0KX1gLCBgbG9jYWxhYnN0cmFjdDoke3NvY2tldE5hbWV9YF0pO1xuICAgIGxvZyhgW3dlYnZpZXctY2RwXSBGb3J3YXJkZWQgdGNwOiR7U3RyaW5nKHBvcnQpfSAtPiBsb2NhbGFic3RyYWN0OiR7c29ja2V0TmFtZX0gKCR7YXBwSWR9IHBpZCAke3BpZH0pYCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nKGBbd2Vidmlldy1jZHBdIFJldXNpbmcgZm9yd2FyZCB0Y3A6JHtTdHJpbmcocG9ydCl9IC0+IGxvY2FsYWJzdHJhY3Q6JHtzb2NrZXROYW1lfSAoJHthcHBJZH0gcGlkICR7cGlkfSlgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovLyR7Q0RQX0hPU1R9OiR7U3RyaW5nKHBvcnQpfS9qc29uYCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0V2ViVmlld1BhZ2VUYXJnZXQoYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdKTtcbiAgICBjb25zdCB3ZWJTb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCA/PyAnJyk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIHdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ291bGQgbm90IG9wZW4gdGhlIFdlYlZpZXcgQ0RQIHNvY2tldCBhdCAke3RhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCA/PyAnJ30uYCkpO1xuICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIGxvZyhgW3dlYnZpZXctY2RwXSBBdHRhY2hlZCB0byBXZWJWaWV3IHRhcmdldCBcIiR7dGFyZ2V0LnRpdGxlID8/ICcnfVwiYCk7XG5cbiAgICByZXR1cm4gbmV3IFdlYlZpZXdDZHBDb25uZWN0aW9uKHdlYlNvY2tldCwgZGV2aWNlSWQsIHBvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGF3YWl0IHJlbW92ZUZvcndhcmQoZGV2aWNlSWQsIHBvcnQpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogRmluZHMgYSBwb3J0IGFscmVhZHkgZm9yd2FyZGVkIHRvIHRoaXMgZGV2aWNlIHNvY2tldCwgc28gcmVwZWF0ZWQgcnVucyByZXVzZSBvbmUgZm9yd2FyZC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgZXZlcnkgcnVuIGFsbG9jYXRlcyBhIGZyZXNoIHBvcnQsIGFuZCBhbnkgcnVuIHRoYXQgZXhpdHMgd2l0aG91dCB0aGUgYXN5bmNcbiAqIHtAbGluayBXZWJWaWV3Q2RwQ29ubmVjdGlvbi5kaXNwb3NlfSBcdTIwMTQgYW4gYWJydXB0IHdvcmtlciBleGl0LCB3aGVyZSBvbmx5IHRoZSBzeW5jaHJvbm91cyB0ZWFyZG93blxuICogcGF0aCBydW5zIFx1MjAxNCBsZWF2ZXMgaXRzIGZvcndhcmQgYmVoaW5kIGZvcmV2ZXIuIFJldXNlIGJvdW5kcyB0aGF0IHRvIGEgc2luZ2xlIGZvcndhcmQgcGVyIHNvY2tldFxuICogcmF0aGVyIHRoYW4gb25lIHBlciBydW4uXG4gKlxuICogQHBhcmFtIGZvcndhcmRMaXN0IC0gVGhlIG91dHB1dCBvZiBgYWRiIGZvcndhcmQgLS1saXN0YC5cbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBhZGIgZGV2aWNlIGlkIHRvIG1hdGNoLlxuICogQHBhcmFtIHNvY2tldE5hbWUgLSBUaGUgYWJzdHJhY3Qgc29ja2V0IG5hbWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgYWxyZWFkeS1mb3J3YXJkZWQgbG9jYWwgcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGb3J3YXJkZWRQb3J0KGZvcndhcmRMaXN0OiBzdHJpbmcsIGRldmljZUlkOiBzdHJpbmcsIHNvY2tldE5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmb3J3YXJkTGlzdC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBgYWRiIGZvcndhcmQgLS1saXN0YCBwcmludHMgYDxkZXZpY2VJZD4gdGNwOjxwb3J0PiBsb2NhbGFic3RyYWN0Ojxzb2NrZXROYW1lPmAuXG4gICAgY29uc3QgW2xpbmVEZXZpY2VJZCwgbG9jYWwsIHJlbW90ZV0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8sIEZPUldBUkRfTElTVF9DT0xVTU5fQ09VTlQpO1xuICAgIGlmIChsaW5lRGV2aWNlSWQgIT09IGRldmljZUlkIHx8IHJlbW90ZSAhPT0gYGxvY2FsYWJzdHJhY3Q6JHtzb2NrZXROYW1lfWAgfHwgIWxvY2FsPy5zdGFydHNXaXRoKCd0Y3A6JykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIucGFyc2VJbnQobG9jYWwuc2xpY2UoJ3RjcDonLmxlbmd0aCksIERFQ0lNQUxfUkFESVgpO1xuICAgIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihwb3J0KSkge1xuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgV2ViVmlldydzIGRldnRvb2xzIHNvY2tldCBuYW1lIG91dCBvZiBgL3Byb2MvbmV0L3VuaXhgLlxuICpcbiAqIEEgZGV2aWNlIGNhbiBob3N0IHNldmVyYWwgZGVidWdnYWJsZSBXZWJWaWV3cyAob3RoZXIgYXBwcywgYSBsZWZ0b3ZlciBwcm9jZXNzKSwgc28gdGhlIGFwcCdzIG93biBwaWQgaXNcbiAqIHdoYXQgZGlzYW1iaWd1YXRlcyB0aGVtLiBXaGVuIG5vIHNvY2tldCBtYXRjaGVzIHRoYXQgcGlkIHRoZSBzb2xlIHJlbWFpbmluZyBjYW5kaWRhdGUgaXMgdXNlZCBcdTIwMTQgYVxuICogV2ViVmlldyB3aG9zZSBzb2NrZXQgaXMgbmFtZWQgYWZ0ZXIgYSBjaGlsZCBwcm9jZXNzIHJhdGhlciB0aGFuIHRoZSBvbmUgYHBpZG9mYCByZXBvcnRlZCBzdGlsbCBoYXMgdG8gYmVcbiAqIHJlYWNoYWJsZSBcdTIwMTQgYnV0IHR3byB1bmF0dHJpYnV0YWJsZSBjYW5kaWRhdGVzIGlzIGFtYmlndW91cyBlbm91Z2ggdG8gcmVmdXNlLlxuICpcbiAqIEBwYXJhbSBwcm9jTmV0VW5peCAtIFRoZSBjb250ZW50cyBvZiBgL3Byb2MvbmV0L3VuaXhgLlxuICogQHBhcmFtIHBpZCAtIFRoZSBhcHBsaWNhdGlvbidzIHByb2Nlc3MgaWQuXG4gKiBAcmV0dXJucyBUaGUgc29ja2V0IG5hbWUsIGUuZy4gYHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXzE4MDU2YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2ViVmlld0RldnRvb2xzU29ja2V0TmFtZShwcm9jTmV0VW5peDogc3RyaW5nLCBwaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSB3aG9sZSBtYXRjaCBtaW51cyBpdHMgbGVhZGluZyBgQGAsIHJhdGhlciB0aGFuIGEgbmFtZWQgY2FwdHVyZSBncm91cDogYSBtYW5kYXRvcnkgZ3JvdXAgaXMgYWx3YXlzXG4gIC8vIFByZXNlbnQgb25jZSB0aGUgcGF0dGVybiBoYXMgbWF0Y2hlZCwgc28gYG1hdGNoLmdyb3Vwcz8uWyduYW1lJ10gPz8gJydgIHdvdWxkIGxlYXZlIGJlaGluZCB0d28gYnJhbmNoZXNcbiAgLy8gTm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGFuZCB0aGlzIGZpbGUgaXMgbWVhc3VyZWQgYWdhaW5zdCBhIDEwMCUgYnJhbmNoIGdhdGUuXG4gIGNvbnN0IG5hbWVzID0gW1xuICAgIC4uLm5ldyBTZXQoWy4uLnByb2NOZXRVbml4Lm1hdGNoQWxsKC9Ad2Vidmlld19kZXZ0b29sc19yZW1vdGVfXFx3Ky9nKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFswXS5zbGljZSgnQCcubGVuZ3RoKSkpXG4gIF07XG5cbiAgLy8gRGVzdHJ1Y3R1cmVkIHJhdGhlciB0aGFuIGluZGV4ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYHNvbGVOYW1lYCBjYXJyaWVzIHRoZSBcInRoZXJlIGlzIGF0IGxlYXN0IG9uZVwiXG4gIC8vIEZhY3QgaW4gdGhlIHR5cGUsIHNvIG5laXRoZXIgdGhlIGVtcHR5IGNoZWNrIGJlbG93IG5vciB0aGUgc2luZ2xlLWNhbmRpZGF0ZSBvbmUgbGVhdmVzIGEgZGVhZCBicmFuY2guXG4gIGNvbnN0IFtzb2xlTmFtZSwgLi4ub3RoZXJOYW1lc10gPSBuYW1lcztcblxuICBpZiAoc29sZU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdObyBgd2Vidmlld19kZXZ0b29sc19yZW1vdGVfKmAgc29ja2V0IG9uIHRoZSBkZXZpY2UuIE9ic2lkaWFuIE1vYmlsZSBpcyBub3QgcnVubmluZywgb3IgaXRzIFdlYlZpZXcgJ1xuICAgICAgICArICdkZWJ1Z2dlciBpcyBkaXNhYmxlZC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0TmFtZSA9IGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV8ke3BpZH1gO1xuICBpZiAobmFtZXMuaW5jbHVkZXMoZXhhY3ROYW1lKSkge1xuICAgIHJldHVybiBleGFjdE5hbWU7XG4gIH1cblxuICBpZiAob3RoZXJOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc29sZU5hbWU7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYE5vIFxcYCR7ZXhhY3ROYW1lfVxcYCBzb2NrZXQsIGFuZCAke1N0cmluZyhuYW1lcy5sZW5ndGgpfSBvdGhlciBkZWJ1Z2dhYmxlIFdlYlZpZXdzIGFyZSBwcmVzZW50IGBcbiAgICAgICsgYCgke25hbWVzLmpvaW4oJywgJyl9KSwgc28gdGhlIHJpZ2h0IG9uZSBjYW5ub3QgYmUgY2hvc2VuLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgT2JzaWRpYW4gcGFnZSB0YXJnZXQgb3V0IG9mIHRoZSBkZWJ1Z2dlcidzIGAvanNvbmAgbGlzdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0cyAtIFRoZSBgL2pzb25gIHJlc3BvbnNlLlxuICogQHJldHVybnMgVGhlIHBhZ2UgdGFyZ2V0IHRvIGF0dGFjaCB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdlYlZpZXdQYWdlVGFyZ2V0KHRhcmdldHM6IHJlYWRvbmx5IENkcFRhcmdldFtdKTogQ2RwVGFyZ2V0IHtcbiAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0cy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50eXBlID09PSAncGFnZScgJiYgQm9vbGVhbihjYW5kaWRhdGUud2ViU29ja2V0RGVidWdnZXJVcmwpKVxuICAgID8/IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBCb29sZWFuKGNhbmRpZGF0ZS53ZWJTb2NrZXREZWJ1Z2dlclVybCkpO1xuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgV2ViVmlldyBkZWJ1Z2dlciBsaXN0ZWQgbm8gdGFyZ2V0IHdpdGggYSBXZWJTb2NrZXQgZW5kcG9pbnQuJyk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChhZGIgc2hlbGwtb3V0cykuIENvdmVyZWQgYnkgdGhlIEFuZHJvaWQgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCBieSB1bml0IHRlc3RzLiAqL1xuXG4vKipcbiAqIFJ1bnMgYW4gYWRiIGNvbW1hbmQgYWdhaW5zdCBvbmUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBhZGIgZGV2aWNlIGlkLlxuICogQHBhcmFtIGNvbW1hbmRBcmd1bWVudHMgLSBUaGUgYWRiIGFyZ3VtZW50cyBhZnRlciBgLXMgPGRldmljZUlkPmAuXG4gKiBAcmV0dXJucyBUcmltbWVkIHN0ZG91dC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRiKGRldmljZUlkOiBzdHJpbmcsIGNvbW1hbmRBcmd1bWVudHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIGRldmljZUlkLCAuLi5jb21tYW5kQXJndW1lbnRzXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfSk7XG5cbiAgcmV0dXJuIHN0ZG91dC50cmltKCk7XG59XG5cbi8qKlxuICogRHJvcHMgYW4gYWRiIHBvcnQgZm9yd2FyZCwgaWdub3JpbmcgdGhlIFwibm90IGZvdW5kXCIgY2FzZS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZC5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIGZvcndhcmRlZCBsb2NhbCBwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVGb3J3YXJkKGRldmljZUlkOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgJ2ZvcndhcmQnLCAnLS1yZW1vdmUnLCBgdGNwOiR7U3RyaW5nKHBvcnQpfWBdLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0IGVmZm9ydDogdGhlIGZvcndhcmQgaXMgcGVyLXJ1biBhbmQgYWRiIGRyb3BzIGl0IHdoZW4gdGhlIGRldmljZSBkaXNjb25uZWN0cyBhbnl3YXkuXG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWtCQSxTQUFTLG9CQUFvQjtBQUk3QixTQUFTLFlBQVk7QUFDckIsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsb0JBQW9CO0FBRTdCLE1BQU0sOEJBQThCO0FBRXBDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0sV0FBVztBQTBEVixNQUFNLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF3QnpCLFlBQTZCLFdBQXVDLFVBQW1DLE1BQWM7QUFBeEY7QUFBdUM7QUFBbUM7QUFDNUcsU0FBSyxVQUFVLGlCQUFpQixXQUFXLENBQUMsVUFBd0I7QUFDbEUsWUFBTSxVQUFVLEtBQUssTUFBTSxPQUFPLE1BQU0sSUFBSSxDQUFDO0FBQzdDLFVBQUksUUFBUSxXQUFXLFFBQVc7QUFDaEM7QUFBQSxNQUNGO0FBRUEsV0FBSyxjQUFjLElBQUksUUFBUSxNQUFNLElBQUksUUFBUSxVQUFVLENBQUMsQ0FBQztBQUFBLElBQy9ELENBQUM7QUFBQSxFQUNIO0FBQUEsRUFUb0M7QUFBQSxFQUF1QztBQUFBLEVBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZjlHLElBQVcsU0FBa0I7QUFDM0IsV0FBTyxLQUFLLFVBQVUsZUFBZSxVQUFVO0FBQUEsRUFDakQ7QUFBQSxFQUVpQixnQkFBZ0Isb0JBQUksSUFBNkI7QUFBQSxFQUUxRCxZQUFZO0FBQUE7QUFBQTtBQUFB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
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3dlYnZpZXctY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSBzZWNvbmQsIGluZGVwZW5kZW50IENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb25uZWN0aW9uIHRvIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcsIHVzZWQgdG8gaW5qZWN0XG4gKiAqKnRydXN0ZWQqKiBpbnB1dCBvbiBBbmRyb2lkIChzZWUgKipMMzkqKikuXG4gKlxuICogSXQgaXMgZGVsaWJlcmF0ZWx5IHNlcGFyYXRlIGZyb20gdGhlIEFwcGl1bSBzZXNzaW9uIHJhdGhlciB0aGFuIGxheWVyZWQgb24gaXQuIGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgXG4gKiBydW5zIHRoZSB3aG9sZSBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmUgaW5zaWRlIG9uZSBXM0MgKkV4ZWN1dGUgU2NyaXB0Kiwgd2hpY2ggYXdhaXRzIHRoZSByZXR1cm5lZFxuICogcHJvbWlzZSBcdTIwMTQgc28gd2hpbGUgYSBjbG9zdXJlIHNpdHMgd2FpdGluZyBvbiBgbGliLmNsaWNrRWxlbWVudCguLi4pYCwgdGhlIFdlYkRyaXZlciBzZXNzaW9uIGlzIGJ1c3kgYW5kXG4gKiBjYW5ub3QgYmUgYXNrZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4gQ0RQIGlzIGlkLW11bHRpcGxleGVkIGFuZCBDaHJvbWl1bSBhY2NlcHRzIG11bHRpcGxlIGRlYnVnZ2VyXG4gKiBjbGllbnRzLCBzbyB0aGlzIHNvY2tldCBzdGF5cyBmcmVlIGV4YWN0bHkgd2hlbiB0aGUgQXBwaXVtIG9uZSBkb2VzIG5vdC4gVGhhdCBpcyB3aGF0IGxldHMgdGhlIHJlbmRlcmVyXG4gKiBjYWxsIGJhY2sgb3V0IHRvIHRoZSBob3N0IG1pZC1jbG9zdXJlLlxuICpcbiAqIFJlYWNoaW5nIHRoZSBXZWJWaWV3J3MgZGVidWdnZXIgaXMgYSB0d28tc3RlcDogdGhlIGFwcCBwdWJsaXNoZXMgYW4gYWJzdHJhY3QgdW5peCBzb2NrZXQgbmFtZWRcbiAqIGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV88cGlkPmAsIGBhZGIgZm9yd2FyZGAgbWFwcyBpdCB0byBhIGxvY2FsIFRDUCBwb3J0LCBhbmQgdGhlIHVzdWFsIGAvanNvbmBcbiAqIGVuZHBvaW50IHRoZW4gbGlzdHMgdGhlIHBhZ2UgdGFyZ2V0cy5cbiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENkcElucHV0Q29tbWFuZCB9IGZyb20gJy4vbW9iaWxlLWlucHV0Lm1qcyc7XG5cbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBwaWNrRnJlZVBvcnQgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5cbmNvbnN0IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE1XzAwMDtcbi8vIGBhZGIgZm9yd2FyZCAtLWxpc3RgIHByaW50cyB0aHJlZSBjb2x1bW5zOiBgPGRldmljZUlkPiB0Y3A6PHBvcnQ+IGxvY2FsYWJzdHJhY3Q6PHNvY2tldE5hbWU+YC5cbmNvbnN0IEZPUldBUkRfTElTVF9DT0xVTU5fQ09VTlQgPSAzO1xuY29uc3QgREVDSU1BTF9SQURJWCA9IDEwO1xuLypcbiAqIEJvdW5kcyBvbmUgY29tbWFuZCBvbiBUSElTIHNpZGUgY2hhbm5lbCBcdTIwMTQgYW4gYElucHV0LmRpc3BhdGNoTW91c2VFdmVudGAsIGEgdGFyZ2V0IGxpc3QuIEl0IGlzIG5vdCB0aGVcbiAqIHBlci1ldmFsIGNhcCBhbmQgbXVzdCBub3QgYmUgZGVyaXZlZCBmcm9tIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2A6IG5vIHRlc3QgY2xvc3VyZSB0cmF2ZWxzXG4gKiB0aGlzIHNvY2tldCwgYW5kIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc2Vjb25kIGNvbm5lY3Rpb24gaXMgdGhhdCBpdCBzdGF5cyBmcmVlIHdoaWxlIHRoZSBBcHBpdW0gc2Vzc2lvblxuICogaXMgYnVzeSBydW5uaW5nIG9uZS4gVGhlIHNoYXJlZCB2YWx1ZSBpcyBhIGNvaW5jaWRlbmNlLlxuICovXG5jb25zdCBDRFBfQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IENEUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5cbi8qKlxuICogT25lIGVudHJ5IG9mIHRoZSBkZWJ1Z2dlcidzIGAvanNvbmAgdGFyZ2V0IGxpc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgd2ViU29ja2V0RGVidWdnZXJVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbm5lY3RUb1dlYlZpZXdDZHB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RUb1dlYlZpZXdDZHBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEFuZHJvaWQgYXBwbGljYXRpb24gaWQgd2hvc2UgV2ViVmlldyB0byBhdHRhY2ggdG8sIGUuZy4gYG1kLm9ic2lkaWFuYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhZGIgZGV2aWNlIGlkIChgZW11bGF0b3ItNTU1NGAsIGEgc2VyaWFsKSB0byBydW4gYWRiIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBlcnJvciBoYWxmIG9mIGEgZmFpbGVkIENEUCBjb21tYW5kIHJlc3BvbnNlLlxuICovXG5pbnRlcmZhY2UgQ2RwRXJyb3Ige1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBDRFAgZXZlbnQuXG4gKi9cbnR5cGUgQ2RwRXZlbnRIYW5kbGVyID0gKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbi8qKlxuICogQSBDRFAgbWVzc2FnZTogZWl0aGVyIGEgcmVzcG9uc2UgdG8gYSBjb21tYW5kIChgaWRgKSBvciBhbiBldmVudCAoYG1ldGhvZGApLlxuICovXG5pbnRlcmZhY2UgQ2RwTWVzc2FnZSB7XG4gIHJlYWRvbmx5IGVycm9yPzogQ2RwRXJyb3I7XG4gIHJlYWRvbmx5IGlkPzogbnVtYmVyO1xuICByZWFkb25seSBtZXRob2Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSByZXN1bHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBBIGNvbW1hbmQgd2FpdGluZyBmb3IgaXRzIHJlcGx5OiBzZXR0bGVzIHRoZSB7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb24uc2VuZH1cbiAqIGNhbGwncyBwcm9taXNlIGFuZCBjYW5jZWxzIHRoZSB0aW1lb3V0IHRoYXQgd291bGQgb3RoZXJ3aXNlIGZhaWwgaXQuXG4gKi9cbnR5cGUgUGVuZGluZ0NvbW1hbmQgPSAobWVzc2FnZTogQ2RwTWVzc2FnZSkgPT4gdm9pZDtcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoYSBsaXZlIFdlYlNvY2tldCB0byBhIFdlYlZpZXcsIGFkYiBwb3J0IGZvcndhcmRpbmcpLiBDb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdW5pdCB0ZXN0cy4gSXQgZW5kcyBiZWZvcmUgYHBhcnNlRm9yd2FyZGVkUG9ydGA6IGBwZXJmZWN0aW9uaXN0L3NvcnQtbW9kdWxlc2AgcGxhY2VzIHRoZSBwdXJlLCB1bml0LXRlc3RlZCBoZWxwZXJzIEFGVEVSIHRoaXMgY2xhc3MgYW5kIGBjb25uZWN0VG9XZWJWaWV3Q2RwYCwgc28gdGhleSBtdXN0IHN0YXkgbWVhc3VyZWQuICovXG5cbi8qKlxuICogQW4gb3BlbiBDRFAgY29ubmVjdGlvbiB0byBhIFdlYlZpZXcuXG4gKlxuICogQ29tbWFuZHMgYXJlIGlkLW11bHRpcGxleGVkLCBzbyBhIGNvbW1hbmQgaXNzdWVkIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXIgY29tcGxldGVzIHdoaWxlIGFuIGVhcmxpZXJcbiAqIGBSdW50aW1lLmV2YWx1YXRlYCBpcyBzdGlsbCBhd2FpdGluZyBpdHMgcHJvbWlzZSBcdTIwMTQgd2hpY2ggaXMgdGhlIHdob2xlIHJlYXNvbiB0aGlzIGNsYXNzIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlZpZXdDZHBDb25uZWN0aW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBzdGlsbCB1c2FibGUuXG4gICAqXG4gICAqIFJlc3RhcnRpbmcgdGhlIGFwcCB0ZWFycyBpdHMgV2ViVmlldyBkb3duIGFuZCB0YWtlcyB0aGUgZGVidWdnZXIgdGFyZ2V0IHdpdGggaXQsIHNvIGEgY2FjaGVkXG4gICAqIGNvbm5lY3Rpb24gaGFzIHRvIGJlIHJlLWNoZWNrZWQgcmF0aGVyIHRoYW4gYXNzdW1lZCBsaXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hpbGUgdGhlIHNvY2tldCBpcyBvcGVuLlxuICAgKi9cbiAgcHVibGljIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIENkcEV2ZW50SGFuZGxlcj4oKTtcblxuICBwcml2YXRlIG1lc3NhZ2VJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kcyBzdGlsbCB3YWl0aW5nIGZvciBhIHJlcGx5LCBrZXllZCBieSB0aGUgQ0RQIG1lc3NhZ2UgaWQgZWFjaCB3YXNcbiAgICogc2VudCB3aXRoLiBFbXB0aWVkIGJ5IHdoaWNoZXZlciBvZiB0aGUgcmVwbHkgYW5kIHRoZSB0aW1lb3V0IGNvbWVzIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nQ29tbWFuZHMgPSBuZXcgTWFwPG51bWJlciwgUGVuZGluZ0NvbW1hbmQ+KCk7XG5cbiAgLyoqXG4gICAqIFdyYXBzIGFuIGFscmVhZHktb3BlbiBkZWJ1Z2dlciBzb2NrZXQsIHBsdXMgd2hhdCBpcyBuZWVkZWQgdG8gdGVhciBpdHMgcG9ydCBmb3J3YXJkIGRvd24uXG4gICAqXG4gICAqIE9ORSBgbWVzc2FnZWAgbGlzdGVuZXIgZm9yIHRoZSBzb2NrZXQncyB3aG9sZSBsaWZlLCByb3V0aW5nIGJvdGggaGFsdmVzIG9mIHdoYXRcbiAgICogYXJyaXZlcyBcdTIwMTQgQ0RQIGV2ZW50cyB0byB0aGVpciBzdWJzY3JpYmVkIGhhbmRsZXIsIGNvbW1hbmQgcmVwbGllcyB0byB0aGVcbiAgICoge0BsaW5rIHNlbmR9IGNhbGwgd2FpdGluZyBvbiB0aGUgaWQuIEEgbGlzdGVuZXIgcGVyIGluLWZsaWdodCBjb21tYW5kIGluc3RlYWRcbiAgICogd291bGQgbWFrZSB0aGUgY291bnQgc2NhbGUgd2l0aCBjb25jdXJyZW5jeSwgc28gZWxldmVuIGNvbW1hbmRzIGluIGZsaWdodCBhdFxuICAgKiBvbmNlIHdvdWxkIGNyb3NzIE5vZGUncyBkZWZhdWx0IGBtYXhMaXN0ZW5lcnNgIG9mIDEwIGFuZCByZXBvcnQgYSBtZW1vcnkgbGVha1xuICAgKiB0aGF0IGlzIG5vdCBvbmUgKHNlZSB0aGUgZGVza3RvcCB0cmFuc3BvcnQncyBgZ2V0UGVuZGluZ0NvbW1hbmRzYCwgd2hlcmUgdGhlXG4gICAqIHNhbWUgc2hhcGUgd2FzIG1lYXN1cmVkKS5cbiAgICpcbiAgICogVGhlIHBhcnNlIGlzIGd1YXJkZWQgYmVjYXVzZSBhIGZyYW1lIHRoaXMgY29ubmVjdGlvbiBjYW5ub3QgcmVhZCBiZWxvbmdzIHRvXG4gICAqIG5vdGhpbmcgaXQgc2VudDogdGhyb3dpbmcgaGVyZSB3b3VsZCB0aHJvdyBvdXQgb2YgdGhlIGV2ZW50IGRpc3BhdGNoLCB3aGVyZVxuICAgKiBub3RoaW5nIGNhbiBjYXRjaCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHdlYlNvY2tldCAtIFRoZSBvcGVuIGRlYnVnZ2VyIHNvY2tldC5cbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGFkYiBkZXZpY2UgaWQsIG5lZWRlZCB0byBkcm9wIHRoZSBwb3J0IGZvcndhcmQgb24gZGlzcG9zZS5cbiAgICogQHBhcmFtIHBvcnQgLSBUaGUgZm9yd2FyZGVkIGxvY2FsIHBvcnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3ZWJTb2NrZXQ6IFdlYlNvY2tldCwgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IG51bWJlcikge1xuICAgIHRoaXMud2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2U6IENkcE1lc3NhZ2U7XG4gICAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcE1lc3NhZ2U7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKT8uKG1lc3NhZ2UucGFyYW1zID8/IHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGVuZGluZ0NvbW1hbmQgPSB0aGlzLnBlbmRpbmdDb21tYW5kcy5nZXQobWVzc2FnZS5pZCk7XG4gICAgICBpZiAoIXBlbmRpbmdDb21tYW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZW5kaW5nQ29tbWFuZHMuZGVsZXRlKG1lc3NhZ2UuaWQpO1xuICAgICAgcGVuZGluZ0NvbW1hbmQobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBzb2NrZXQgYW5kIGRyb3BzIHRoZSBhZGIgcG9ydCBmb3J3YXJkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZVNvY2tldCgpO1xuICAgIGF3YWl0IHJlbW92ZUZvcndhcmQodGhpcy5kZXZpY2VJZCwgdGhpcy5wb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBkaXNwb3NhbCwgZm9yIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXJzIHdoZXJlIGFzeW5jIHdvcmsgY2Fubm90IHJ1bi5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGFuIGFicnVwdCB3b3JrZXIgZXhpdCBsZWF2ZXMgdGhlIHBvcnQgZm9yd2FyZCBiZWhpbmQgXHUyMDE0IHRoZSBhc3luYyB7QGxpbmsgZGlzcG9zZX0gYWJvdmVcbiAgICogbmV2ZXIgZ2V0cyBhIHR1cm4uXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVNvY2tldCgpO1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ2FkYicsIFsnLXMnLCB0aGlzLmRldmljZUlkLCAnZm9yd2FyZCcsICctLXJlbW92ZScsIGB0Y3A6JHtTdHJpbmcodGhpcy5wb3J0KX1gXSwge1xuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICAgIHRpbWVvdXQ6IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0IGVmZm9ydDogYWRiIGRyb3BzIGV2ZXJ5IGZvcndhcmQgd2hlbiB0aGUgZGV2aWNlIGRpc2Nvbm5lY3RzIGFueXdheS5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIENEUCBldmVudC4gT25lIGhhbmRsZXIgcGVyIG1ldGhvZDsgc3Vic2NyaWJpbmcgYWdhaW4gcmVwbGFjZXMgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgQ0RQIGV2ZW50IG5hbWUsIGUuZy4gYFJ1bnRpbWUuYmluZGluZ0NhbGxlZGAuXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gQ2FsbGVkIHdpdGggdGhlIGV2ZW50IHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgb24obWV0aG9kOiBzdHJpbmcsIGhhbmRsZXI6IENkcEV2ZW50SGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5zZXQobWV0aG9kLCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIENEUCBjb21tYW5kIGFuZCB3YWl0cyBmb3IgaXRzIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBzZW5kKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgaWQgPSArK3RoaXMubWVzc2FnZUlkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0NvbW1hbmRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYlZpZXcgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKENEUF9DT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tczogJHttZXRob2R9YCkpO1xuICAgICAgfSwgQ0RQX0NPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLnBlbmRpbmdDb21tYW5kcy5zZXQoaWQsIChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBXZWJWaWV3IENEUCBjb21tYW5kICR7bWV0aG9kfSBmYWlsZWQ6ICR7bWVzc2FnZS5lcnJvci5tZXNzYWdlID8/ICd1bmtub3duIGVycm9yJ31gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlLnJlc3VsdCA/PyB7fSk7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy53ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBOb3RoaW5nIHdpbGwgYW5zd2VyIGEgc2VuZCB0aGF0IHRocmV3LCBzbyBob2xkaW5nIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bGwgdGltZW91dCB3b3VsZCBvbmx5IGRlbGF5IHRoZSBmYWlsdXJlIGFuZCB0aGVuIG1pc25hbWUgaXQuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ29tbWFuZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYW4gb3JkZXJlZCBjb21tYW5kIHNlcXVlbmNlLCBvbmUgY29tbWFuZCBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEVhY2ggY29tbWFuZCBpcyBhd2FpdGVkIGJlZm9yZSB0aGUgbmV4dCBpcyBzZW50LCB3aGljaCBpcyB0aGUgb25seSBvcmRlcmluZyBndWFyYW50ZWUgYW4gaW5wdXRcbiAgICogc2VxdWVuY2UgbmVlZHMgXHUyMDE0IGEgbG9uZy1wcmVzcyBob2xkcyBpdHNlbGYgZm9yIGl0cyBvd24gYGR1cmF0aW9uYCByYXRoZXIgdGhhbiBhc2tpbmcgdGhlIGhvc3QgdG9cbiAgICogc2xlZXAgYmV0d2VlbiB0d28gdG91Y2hlcywgc28gdGhlcmUgaXMgbm8gaW50ZXItY29tbWFuZCBkZWxheSB0byBob25vci5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRzIC0gVGhlIGNvbW1hbmRzIHRvIHNlbmQsIGluIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRBbGwoY29tbWFuZHM6IHJlYWRvbmx5IENkcElucHV0Q29tbWFuZFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmQoY29tbWFuZC5tZXRob2QsIGNvbW1hbmQucGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBkZWJ1Z2dlciBzb2NrZXQgYW5kIHN0b3BzIHJvdXRpbmcgaXRzIGV2ZW50cy5cbiAgICovXG4gIHByaXZhdGUgY2xvc2VTb2NrZXQoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMud2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndlYlNvY2tldC5jbG9zZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wZW5zIGEgQ0RQIGNvbm5lY3Rpb24gdG8gdGhlIGFwcCdzIFdlYlZpZXcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFdoaWNoIGFwcCBvbiB3aGljaCBkZXZpY2UuXG4gKiBAcmV0dXJucyBUaGUgb3BlbiBjb25uZWN0aW9uLiBEaXNwb3NlIGl0IHRvIGNsb3NlIHRoZSBzb2NrZXQgYW5kIGRyb3AgdGhlIGFkYiBwb3J0IGZvcndhcmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9XZWJWaWV3Q2RwKHBhcmFtczogQ29ubmVjdFRvV2ViVmlld0NkcFBhcmFtcyk6IFByb21pc2U8V2ViVmlld0NkcENvbm5lY3Rpb24+IHtcbiAgY29uc3QgeyBhcHBJZCwgZGV2aWNlSWQgfSA9IHBhcmFtcztcblxuICAvLyBgcGlkb2ZgIGxpc3RzIGV2ZXJ5IG1hdGNoaW5nIHByb2Nlc3M7IHRoZSBhcHAncyBtYWluIG9uZSBpcyBmaXJzdC5cbiAgY29uc3QgcGlkb2ZPdXRwdXQgPSBhd2FpdCBhZGIoZGV2aWNlSWQsIFsnc2hlbGwnLCAncGlkb2YnLCBhcHBJZF0pO1xuICBjb25zdCBwaWQgPSBwaWRvZk91dHB1dC5zcGxpdCgvXFxzKy8sIDEpWzBdID8/ICcnO1xuICBpZiAoIXBpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHthcHBJZH0gaXMgbm90IHJ1bm5pbmcgb24gJHtkZXZpY2VJZH0sIHNvIGl0cyBXZWJWaWV3IGhhcyBubyBkZWJ1Z2dlciB0byBhdHRhY2ggdG8uYCk7XG4gIH1cblxuICBjb25zdCBwcm9jTmV0VW5peCA9IGF3YWl0IGFkYihkZXZpY2VJZCwgWydzaGVsbCcsICdjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IHNvY2tldE5hbWUgPSBwYXJzZVdlYlZpZXdEZXZ0b29sc1NvY2tldE5hbWUocHJvY05ldFVuaXgsIHBpZCk7XG5cbiAgY29uc3QgZm9yd2FyZExpc3QgPSBhd2FpdCBhZGIoZGV2aWNlSWQsIFsnZm9yd2FyZCcsICctLWxpc3QnXSk7XG4gIGNvbnN0IGV4aXN0aW5nUG9ydCA9IHBhcnNlRm9yd2FyZGVkUG9ydChmb3J3YXJkTGlzdCwgZGV2aWNlSWQsIHNvY2tldE5hbWUpO1xuICBjb25zdCBwb3J0ID0gZXhpc3RpbmdQb3J0ID8/IGF3YWl0IHBpY2tGcmVlUG9ydCgpO1xuICBpZiAoZXhpc3RpbmdQb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICBhd2FpdCBhZGIoZGV2aWNlSWQsIFsnZm9yd2FyZCcsIGB0Y3A6JHtTdHJpbmcocG9ydCl9YCwgYGxvY2FsYWJzdHJhY3Q6JHtzb2NrZXROYW1lfWBdKTtcbiAgICBsb2coYFt3ZWJ2aWV3LWNkcF0gRm9yd2FyZGVkIHRjcDoke1N0cmluZyhwb3J0KX0gLT4gbG9jYWxhYnN0cmFjdDoke3NvY2tldE5hbWV9ICgke2FwcElkfSBwaWQgJHtwaWR9KWApO1xuICB9IGVsc2Uge1xuICAgIGxvZyhgW3dlYnZpZXctY2RwXSBSZXVzaW5nIGZvcndhcmQgdGNwOiR7U3RyaW5nKHBvcnQpfSAtPiBsb2NhbGFic3RyYWN0OiR7c29ja2V0TmFtZX0gKCR7YXBwSWR9IHBpZCAke3BpZH0pYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8ke0NEUF9IT1NUfToke1N0cmluZyhwb3J0KX0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdFdlYlZpZXdQYWdlVGFyZ2V0KGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXSk7XG4gICAgY29uc3Qgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwgPz8gJycpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBvcGVuIHRoZSBXZWJWaWV3IENEUCBzb2NrZXQgYXQgJHt0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwgPz8gJyd9LmApKTtcbiAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBsb2coYFt3ZWJ2aWV3LWNkcF0gQXR0YWNoZWQgdG8gV2ViVmlldyB0YXJnZXQgXCIke3RhcmdldC50aXRsZSA/PyAnJ31cImApO1xuXG4gICAgcmV0dXJuIG5ldyBXZWJWaWV3Q2RwQ29ubmVjdGlvbih3ZWJTb2NrZXQsIGRldmljZUlkLCBwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBhd2FpdCByZW1vdmVGb3J3YXJkKGRldmljZUlkLCBwb3J0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIEZpbmRzIGEgcG9ydCBhbHJlYWR5IGZvcndhcmRlZCB0byB0aGlzIGRldmljZSBzb2NrZXQsIHNvIHJlcGVhdGVkIHJ1bnMgcmV1c2Ugb25lIGZvcndhcmQuXG4gKlxuICogV2l0aG91dCB0aGlzIGV2ZXJ5IHJ1biBhbGxvY2F0ZXMgYSBmcmVzaCBwb3J0LCBhbmQgYW55IHJ1biB0aGF0IGV4aXRzIHdpdGhvdXQgdGhlIGFzeW5jXG4gKiB7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb24uZGlzcG9zZX0gXHUyMDE0IGFuIGFicnVwdCB3b3JrZXIgZXhpdCwgd2hlcmUgb25seSB0aGUgc3luY2hyb25vdXMgdGVhcmRvd25cbiAqIHBhdGggcnVucyBcdTIwMTQgbGVhdmVzIGl0cyBmb3J3YXJkIGJlaGluZCBmb3JldmVyLiBSZXVzZSBib3VuZHMgdGhhdCB0byBhIHNpbmdsZSBmb3J3YXJkIHBlciBzb2NrZXRcbiAqIHJhdGhlciB0aGFuIG9uZSBwZXIgcnVuLlxuICpcbiAqIEBwYXJhbSBmb3J3YXJkTGlzdCAtIFRoZSBvdXRwdXQgb2YgYGFkYiBmb3J3YXJkIC0tbGlzdGAuXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZCB0byBtYXRjaC5cbiAqIEBwYXJhbSBzb2NrZXROYW1lIC0gVGhlIGFic3RyYWN0IHNvY2tldCBuYW1lIHRvIG1hdGNoLlxuICogQHJldHVybnMgVGhlIGFscmVhZHktZm9yd2FyZGVkIGxvY2FsIHBvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRm9yd2FyZGVkUG9ydChmb3J3YXJkTGlzdDogc3RyaW5nLCBkZXZpY2VJZDogc3RyaW5nLCBzb2NrZXROYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZm9yd2FyZExpc3Quc3BsaXQoJ1xcbicpKSB7XG4gICAgLy8gYGFkYiBmb3J3YXJkIC0tbGlzdGAgcHJpbnRzIGA8ZGV2aWNlSWQ+IHRjcDo8cG9ydD4gbG9jYWxhYnN0cmFjdDo8c29ja2V0TmFtZT5gLlxuICAgIGNvbnN0IFtsaW5lRGV2aWNlSWQsIGxvY2FsLCByZW1vdGVdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvLCBGT1JXQVJEX0xJU1RfQ09MVU1OX0NPVU5UKTtcbiAgICBpZiAobGluZURldmljZUlkICE9PSBkZXZpY2VJZCB8fCByZW1vdGUgIT09IGBsb2NhbGFic3RyYWN0OiR7c29ja2V0TmFtZX1gIHx8ICFsb2NhbD8uc3RhcnRzV2l0aCgndGNwOicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyLnBhcnNlSW50KGxvY2FsLnNsaWNlKCd0Y3A6Jy5sZW5ndGgpLCBERUNJTUFMX1JBRElYKTtcbiAgICBpZiAoTnVtYmVyLmlzU2FmZUludGVnZXIocG9ydCkpIHtcbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIFdlYlZpZXcncyBkZXZ0b29scyBzb2NrZXQgbmFtZSBvdXQgb2YgYC9wcm9jL25ldC91bml4YC5cbiAqXG4gKiBBIGRldmljZSBjYW4gaG9zdCBzZXZlcmFsIGRlYnVnZ2FibGUgV2ViVmlld3MgKG90aGVyIGFwcHMsIGEgbGVmdG92ZXIgcHJvY2VzcyksIHNvIHRoZSBhcHAncyBvd24gcGlkIGlzXG4gKiB3aGF0IGRpc2FtYmlndWF0ZXMgdGhlbS4gV2hlbiBubyBzb2NrZXQgbWF0Y2hlcyB0aGF0IHBpZCB0aGUgc29sZSByZW1haW5pbmcgY2FuZGlkYXRlIGlzIHVzZWQgXHUyMDE0IGFcbiAqIFdlYlZpZXcgd2hvc2Ugc29ja2V0IGlzIG5hbWVkIGFmdGVyIGEgY2hpbGQgcHJvY2VzcyByYXRoZXIgdGhhbiB0aGUgb25lIGBwaWRvZmAgcmVwb3J0ZWQgc3RpbGwgaGFzIHRvIGJlXG4gKiByZWFjaGFibGUgXHUyMDE0IGJ1dCB0d28gdW5hdHRyaWJ1dGFibGUgY2FuZGlkYXRlcyBpcyBhbWJpZ3VvdXMgZW5vdWdoIHRvIHJlZnVzZS5cbiAqXG4gKiBAcGFyYW0gcHJvY05ldFVuaXggLSBUaGUgY29udGVudHMgb2YgYC9wcm9jL25ldC91bml4YC5cbiAqIEBwYXJhbSBwaWQgLSBUaGUgYXBwbGljYXRpb24ncyBwcm9jZXNzIGlkLlxuICogQHJldHVybnMgVGhlIHNvY2tldCBuYW1lLCBlLmcuIGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV8xODA1NmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdlYlZpZXdEZXZ0b29sc1NvY2tldE5hbWUocHJvY05ldFVuaXg6IHN0cmluZywgcGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBUaGUgd2hvbGUgbWF0Y2ggbWludXMgaXRzIGxlYWRpbmcgYEBgLCByYXRoZXIgdGhhbiBhIG5hbWVkIGNhcHR1cmUgZ3JvdXA6IGEgbWFuZGF0b3J5IGdyb3VwIGlzIGFsd2F5c1xuICAvLyBQcmVzZW50IG9uY2UgdGhlIHBhdHRlcm4gaGFzIG1hdGNoZWQsIHNvIGBtYXRjaC5ncm91cHM/LlsnbmFtZSddID8/ICcnYCB3b3VsZCBsZWF2ZSBiZWhpbmQgdHdvIGJyYW5jaGVzXG4gIC8vIE5vIGlucHV0IGNhbiBldmVyIHJlYWNoIFx1MjAxNCBhbmQgdGhpcyBmaWxlIGlzIG1lYXN1cmVkIGFnYWluc3QgYSAxMDAlIGJyYW5jaCBnYXRlLlxuICBjb25zdCBuYW1lcyA9IFtcbiAgICAuLi5uZXcgU2V0KFsuLi5wcm9jTmV0VW5peC5tYXRjaEFsbCgvQHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlX1xcdysvZyldXG4gICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMF0uc2xpY2UoJ0AnLmxlbmd0aCkpKVxuICBdO1xuXG4gIC8vIERlc3RydWN0dXJlZCByYXRoZXIgdGhhbiBpbmRleGVkIGZvciB0aGUgc2FtZSByZWFzb246IGBzb2xlTmFtZWAgY2FycmllcyB0aGUgXCJ0aGVyZSBpcyBhdCBsZWFzdCBvbmVcIlxuICAvLyBGYWN0IGluIHRoZSB0eXBlLCBzbyBuZWl0aGVyIHRoZSBlbXB0eSBjaGVjayBiZWxvdyBub3IgdGhlIHNpbmdsZS1jYW5kaWRhdGUgb25lIGxlYXZlcyBhIGRlYWQgYnJhbmNoLlxuICBjb25zdCBbc29sZU5hbWUsIC4uLm90aGVyTmFtZXNdID0gbmFtZXM7XG5cbiAgaWYgKHNvbGVOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnTm8gYHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXypgIHNvY2tldCBvbiB0aGUgZGV2aWNlLiBPYnNpZGlhbiBNb2JpbGUgaXMgbm90IHJ1bm5pbmcsIG9yIGl0cyBXZWJWaWV3ICdcbiAgICAgICAgKyAnZGVidWdnZXIgaXMgZGlzYWJsZWQuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBleGFjdE5hbWUgPSBgd2Vidmlld19kZXZ0b29sc19yZW1vdGVfJHtwaWR9YDtcbiAgaWYgKG5hbWVzLmluY2x1ZGVzKGV4YWN0TmFtZSkpIHtcbiAgICByZXR1cm4gZXhhY3ROYW1lO1xuICB9XG5cbiAgaWYgKG90aGVyTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHNvbGVOYW1lO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBObyBcXGAke2V4YWN0TmFtZX1cXGAgc29ja2V0LCBhbmQgJHtTdHJpbmcobmFtZXMubGVuZ3RoKX0gb3RoZXIgZGVidWdnYWJsZSBXZWJWaWV3cyBhcmUgcHJlc2VudCBgXG4gICAgICArIGAoJHtuYW1lcy5qb2luKCcsICcpfSksIHNvIHRoZSByaWdodCBvbmUgY2Fubm90IGJlIGNob3Nlbi5gXG4gICk7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIE9ic2lkaWFuIHBhZ2UgdGFyZ2V0IG91dCBvZiB0aGUgZGVidWdnZXIncyBgL2pzb25gIGxpc3QuXG4gKlxuICogQHBhcmFtIHRhcmdldHMgLSBUaGUgYC9qc29uYCByZXNwb25zZS5cbiAqIEByZXR1cm5zIFRoZSBwYWdlIHRhcmdldCB0byBhdHRhY2ggdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXZWJWaWV3UGFnZVRhcmdldCh0YXJnZXRzOiByZWFkb25seSBDZHBUYXJnZXRbXSk6IENkcFRhcmdldCB7XG4gIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudHlwZSA9PT0gJ3BhZ2UnICYmIEJvb2xlYW4oY2FuZGlkYXRlLndlYlNvY2tldERlYnVnZ2VyVXJsKSlcbiAgICA/PyB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gQm9vbGVhbihjYW5kaWRhdGUud2ViU29ja2V0RGVidWdnZXJVcmwpKTtcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIFdlYlZpZXcgZGVidWdnZXIgbGlzdGVkIG5vIHRhcmdldCB3aXRoIGEgV2ViU29ja2V0IGVuZHBvaW50LicpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoYWRiIHNoZWxsLW91dHMpLiBDb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdW5pdCB0ZXN0cy4gKi9cblxuLyoqXG4gKiBSdW5zIGFuIGFkYiBjb21tYW5kIGFnYWluc3Qgb25lIGRldmljZS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZC5cbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFkYiBhcmd1bWVudHMgYWZ0ZXIgYC1zIDxkZXZpY2VJZD5gLlxuICogQHJldHVybnMgVHJpbW1lZCBzdGRvdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkYihkZXZpY2VJZDogc3RyaW5nLCBjb21tYW5kQXJndW1lbnRzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgLi4uY29tbWFuZEFyZ3VtZW50c10sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH0pO1xuXG4gIHJldHVybiBzdGRvdXQudHJpbSgpO1xufVxuXG4vKipcbiAqIERyb3BzIGFuIGFkYiBwb3J0IGZvcndhcmQsIGlnbm9yaW5nIHRoZSBcIm5vdCBmb3VuZFwiIGNhc2UuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGFkYiBkZXZpY2UgaWQuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBmb3J3YXJkZWQgbG9jYWwgcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRm9yd2FyZChkZXZpY2VJZDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgZGV2aWNlSWQsICdmb3J3YXJkJywgJy0tcmVtb3ZlJywgYHRjcDoke1N0cmluZyhwb3J0KX1gXSwge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdCBlZmZvcnQ6IHRoZSBmb3J3YXJkIGlzIHBlci1ydW4gYW5kIGFkYiBkcm9wcyBpdCB3aGVuIHRoZSBkZXZpY2UgZGlzY29ubmVjdHMgYW55d2F5LlxuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFrQkEsU0FBUyxvQkFBb0I7QUFJN0IsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsV0FBVztBQUNwQixTQUFTLG9CQUFvQjtBQUU3QixNQUFNLDhCQUE4QjtBQUVwQyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLGdCQUFnQjtBQU90QixNQUFNLHNDQUFzQztBQUM1QyxNQUFNLFdBQVc7QUFnRVYsTUFBTSxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBMEN6QixZQUE2QixXQUF1QyxVQUFtQyxNQUFjO0FBQXhGO0FBQXVDO0FBQW1DO0FBQzVHLFNBQUssVUFBVSxpQkFBaUIsV0FBVyxDQUFDLFVBQXdCO0FBQ2xFLFVBQUk7QUFDSixVQUFJO0FBQ0Ysa0JBQVUsS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUFJLENBQUM7QUFBQSxNQUN6QyxRQUFRO0FBQ047QUFBQSxNQUNGO0FBRUEsVUFBSSxRQUFRLFdBQVcsUUFBVztBQUNoQyxhQUFLLGNBQWMsSUFBSSxRQUFRLE1BQU0sSUFBSSxRQUFRLFVBQVUsQ0FBQyxDQUFDO0FBQzdEO0FBQUEsTUFDRjtBQUVBLFVBQUksUUFBUSxPQUFPLFFBQVc7QUFDNUI7QUFBQSxNQUNGO0FBRUEsWUFBTSxpQkFBaUIsS0FBSyxnQkFBZ0IsSUFBSSxRQUFRLEVBQUU7QUFDMUQsVUFBSSxDQUFDLGdCQUFnQjtBQUNuQjtBQUFBLE1BQ0Y7QUFFQSxXQUFLLGdCQUFnQixPQUFPLFFBQVEsRUFBRTtBQUN0QyxxQkFBZSxPQUFPO0FBQUEsSUFDeEIsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQTFCb0M7QUFBQSxFQUF1QztBQUFBLEVBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBakM5RyxJQUFXLFNBQWtCO0FBQzNCLFdBQU8sS0FBSyxVQUFVLGVBQWUsVUFBVTtBQUFBLEVBQ2pEO0FBQUEsRUFFaUIsZ0JBQWdCLG9CQUFJLElBQTZCO0FBQUEsRUFFMUQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNSCxrQkFBa0Isb0JBQUksSUFBNEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW9EbkUsTUFBYSxVQUF5QjtBQUNwQyxTQUFLLFlBQVk7QUFDakIsVUFBTSxjQUFjLEtBQUssVUFBVSxLQUFLLElBQUk7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sY0FBb0I7QUFDekIsU0FBSyxZQUFZO0FBQ2pCLFFBQUk7QUFDRixtQkFBYSxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsV0FBVyxZQUFZLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUc7QUFBQSxRQUM1RixPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDSCxRQUFRO0FBQUEsSUFFUjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLEdBQUcsUUFBZ0IsU0FBZ0M7QUFDeEQsU0FBSyxjQUFjLElBQUksUUFBUSxPQUFPO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU08sS0FBSyxRQUFnQixTQUFrQyxDQUFDLEdBQXFDO0FBQ2xHLFVBQU0sS0FBSyxFQUFFLEtBQUs7QUFFbEIsV0FBTyxJQUFJLFFBQWlDLENBQUMsU0FBUyxXQUFXO0FBQy9ELFlBQU0sVUFBVSxXQUFXLE1BQU07QUFDL0IsYUFBSyxnQkFBZ0IsT0FBTyxFQUFFO0FBQzlCLGVBQU8sSUFBSSxNQUFNLHVDQUF1QyxPQUFPLG1DQUFtQyxDQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7QUFBQSxNQUNySCxHQUFHLG1DQUFtQztBQUV0QyxXQUFLLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZO0FBQ3hDLHFCQUFhLE9BQU87QUFDcEIsWUFBSSxRQUFRLE9BQU87QUFDakIsaUJBQU8sSUFBSSxNQUFNLHVCQUF1QixNQUFNLFlBQVksUUFBUSxNQUFNLFdBQVcsZUFBZSxFQUFFLENBQUM7QUFDckc7QUFBQSxRQUNGO0FBRUEsZ0JBQVEsUUFBUSxVQUFVLENBQUMsQ0FBQztBQUFBLE1BQzlCLENBQUM7QUFFRCxVQUFJO0FBQ0YsYUFBSyxVQUFVLEtBQUssS0FBSyxVQUFVLEVBQUUsSUFBSSxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQUEsTUFDNUQsU0FBUyxPQUFnQjtBQUV2QixxQkFBYSxPQUFPO0FBQ3BCLGFBQUssZ0JBQWdCLE9BQU8sRUFBRTtBQUM5QixlQUFPLGlCQUFpQixRQUFRLFFBQVEsSUFBSSxNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFBQSxNQUNsRTtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLE1BQWEsUUFBUSxVQUFxRDtBQUN4RSxlQUFXLFdBQVcsVUFBVTtBQUM5QixZQUFNLEtBQUssS0FBSyxRQUFRLFFBQVEsUUFBUSxNQUFNO0FBQUEsSUFDaEQ7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSxjQUFvQjtBQUMxQixTQUFLLGNBQWMsTUFBTTtBQUN6QixRQUFJLEtBQUssVUFBVSxlQUFlLFVBQVUsTUFBTTtBQUNoRCxXQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUNGO0FBUUEsZUFBc0Isb0JBQW9CLFFBQWtFO0FBQzFHLFFBQU0sRUFBRSxPQUFPLFNBQVMsSUFBSTtBQUc1QixRQUFNLGNBQWMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxTQUFTLFNBQVMsS0FBSyxDQUFDO0FBQ2pFLFFBQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLO0FBQzlDLE1BQUksQ0FBQyxLQUFLO0FBQ1IsVUFBTSxJQUFJLE1BQU0sR0FBRyxLQUFLLHNCQUFzQixRQUFRLGdEQUFnRDtBQUFBLEVBQ3hHO0FBRUEsUUFBTSxjQUFjLE1BQU0sSUFBSSxVQUFVLENBQUMsU0FBUyxPQUFPLGdCQUFnQixDQUFDO0FBQzFFLFFBQU0sYUFBYSwrQkFBK0IsYUFBYSxHQUFHO0FBRWxFLFFBQU0sY0FBYyxNQUFNLElBQUksVUFBVSxDQUFDLFdBQVcsUUFBUSxDQUFDO0FBQzdELFFBQU0sZUFBZSxtQkFBbUIsYUFBYSxVQUFVLFVBQVU7QUFDekUsUUFBTSxPQUFPLGdCQUFnQixNQUFNLGFBQWE7QUFDaEQsTUFBSSxpQkFBaUIsUUFBVztBQUM5QixVQUFNLElBQUksVUFBVSxDQUFDLFdBQVcsT0FBTyxPQUFPLElBQUksQ0FBQyxJQUFJLGlCQUFpQixVQUFVLEVBQUUsQ0FBQztBQUNyRixRQUFJLCtCQUErQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsVUFBVSxLQUFLLEtBQUssUUFBUSxHQUFHLEdBQUc7QUFBQSxFQUN4RyxPQUFPO0FBQ0wsUUFBSSxxQ0FBcUMsT0FBTyxJQUFJLENBQUMscUJBQXFCLFVBQVUsS0FBSyxLQUFLLFFBQVEsR0FBRyxHQUFHO0FBQUEsRUFDOUc7QUFFQSxNQUFJO0FBQ0YsVUFBTSxXQUFXLE1BQU0sTUFBTSxVQUFVLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPO0FBQ3RFLFVBQU0sU0FBUyx3QkFBd0IsTUFBTSxTQUFTLEtBQUssQ0FBZ0I7QUFDM0UsVUFBTSxZQUFZLElBQUksVUFBVSxPQUFPLHdCQUF3QixFQUFFO0FBQ2pFLFVBQU0sSUFBSSxRQUFjLENBQUMsU0FBUyxXQUFXO0FBQzNDLGdCQUFVLGlCQUFpQixRQUFRLE1BQU07QUFDdkMsZ0JBQVE7QUFBQSxNQUNWLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNqQixnQkFBVSxpQkFBaUIsU0FBUyxNQUFNO0FBQ3hDLGVBQU8sSUFBSSxNQUFNLDRDQUE0QyxPQUFPLHdCQUF3QixFQUFFLEdBQUcsQ0FBQztBQUFBLE1BQ3BHLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUFBLElBQ25CLENBQUM7QUFDRCxRQUFJLDZDQUE2QyxPQUFPLFNBQVMsRUFBRSxHQUFHO0FBRXRFLFdBQU8sSUFBSSxxQkFBcUIsV0FBVyxVQUFVLElBQUk7QUFBQSxFQUMzRCxTQUFTLE9BQWdCO0FBQ3ZCLFVBQU0sY0FBYyxVQUFVLElBQUk7QUFDbEMsVUFBTTtBQUFBLEVBQ1I7QUFDRjtBQWlCTyxTQUFTLG1CQUFtQixhQUFxQixVQUFrQixZQUF3QztBQUNoSCxhQUFXLFFBQVEsWUFBWSxNQUFNLElBQUksR0FBRztBQUUxQyxVQUFNLENBQUMsY0FBYyxPQUFPLE1BQU0sSUFBSSxLQUFLLEtBQUssRUFBRSxNQUFNLE9BQU8seUJBQXlCO0FBQ3hGLFFBQUksaUJBQWlCLFlBQVksV0FBVyxpQkFBaUIsVUFBVSxNQUFNLENBQUMsT0FBTyxXQUFXLE1BQU0sR0FBRztBQUN2RztBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sT0FBTyxTQUFTLE1BQU0sTUFBTSxPQUFPLE1BQU0sR0FBRyxhQUFhO0FBQ3RFLFFBQUksT0FBTyxjQUFjLElBQUksR0FBRztBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFjTyxTQUFTLCtCQUErQixhQUFxQixLQUFxQjtBQUl2RixRQUFNLFFBQVE7QUFBQSxJQUNaLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxZQUFZLFNBQVMsK0JBQStCLENBQUMsRUFDakUsSUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDL0M7QUFJQSxRQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSTtBQUVsQyxNQUFJLGFBQWEsUUFBVztBQUMxQixVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUEsSUFFRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFlBQVksMkJBQTJCLEdBQUc7QUFDaEQsTUFBSSxNQUFNLFNBQVMsU0FBUyxHQUFHO0FBQzdCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sSUFBSTtBQUFBLElBQ1IsUUFBUSxTQUFTLGtCQUFrQixPQUFPLE1BQU0sTUFBTSxDQUFDLDJDQUMvQyxNQUFNLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDMUI7QUFDRjtBQVFPLFNBQVMsd0JBQXdCLFNBQTBDO0FBQ2hGLFFBQU0sU0FBUyxRQUFRLEtBQUssQ0FBQyxjQUFjLFVBQVUsU0FBUyxVQUFVLFFBQVEsVUFBVSxvQkFBb0IsQ0FBQyxLQUMxRyxRQUFRLEtBQUssQ0FBQyxjQUFjLFFBQVEsVUFBVSxvQkFBb0IsQ0FBQztBQUV4RSxNQUFJLENBQUMsUUFBUTtBQUNYLFVBQU0sSUFBSSxNQUFNLGtFQUFrRTtBQUFBLEVBQ3BGO0FBRUEsU0FBTztBQUNUO0FBV0EsZUFBZSxJQUFJLFVBQWtCLGtCQUE2QztBQUNoRixRQUFNLFNBQVMsTUFBTSxLQUFLLENBQUMsT0FBTyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRztBQUFBLElBQ3RFLFNBQVM7QUFBQSxJQUNULHVCQUF1QjtBQUFBLEVBQ3pCLENBQUM7QUFFRCxTQUFPLE9BQU8sS0FBSztBQUNyQjtBQVFBLGVBQWUsY0FBYyxVQUFrQixNQUE2QjtBQUMxRSxNQUFJO0FBQ0YsVUFBTSxLQUFLLENBQUMsT0FBTyxNQUFNLFVBQVUsV0FBVyxZQUFZLE9BQU8sT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHO0FBQUEsTUFDaEYsU0FBUztBQUFBLE1BQ1Qsc0JBQXNCO0FBQUEsTUFDdEIsdUJBQXVCO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0gsUUFBUTtBQUFBLEVBRVI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|