@dbx-tools/appkit 0.9.119 → 0.9.120

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.
@@ -36,7 +36,7 @@
36
36
  */
37
37
  import { ConfigurationError, ExecutionError, getUsernameWithApiLookup, getWorkspaceClient, ValidationError, } from "@databricks/appkit";
38
38
  import { configUtils, projectUtils } from "@dbx-tools/core";
39
- import { asyncUtils, log, object, options as sharedOptions, stringUtils, } from "@dbx-tools/shared-core";
39
+ import { asyncUtils, errorUtils, log, object, options as sharedOptions, stringUtils, } from "@dbx-tools/shared-core";
40
40
  import { z } from "zod";
41
41
  import { toContext } from "./databricks.js";
42
42
  import { parseAddress, parseResourcePath, parseSslMode as parseNativeSslMode, SSL_MODES, } from "./pgaddress.js";
@@ -64,6 +64,22 @@ const CONNECTABLE_ENDPOINT_STATES = new Set(["READY", "IDLE"]);
64
64
  const INITIALIZING_ENDPOINT_STATE = "INITIALIZING";
65
65
  /** Lakebase's own default Postgres database name. */
66
66
  const DEFAULT_DATABASE = "databricks_postgres";
67
+ /**
68
+ * Capture AppKit's existing service-principal Lakebase pool.
69
+ *
70
+ * Call this during `setup:complete`, outside any `asUser()` scope. AppKit's
71
+ * exported pool routes dynamically by request context, but its runtime
72
+ * `activePool()` method returns the already-created underlying pool selected in
73
+ * the current context. Capturing it once at startup pins application-owned
74
+ * storage to the service principal without creating another pool or connection.
75
+ *
76
+ * A future AppKit version may export a fixed pool directly; in that case the
77
+ * pool has no `activePool()` method and is returned unchanged.
78
+ */
79
+ export function captureServicePrincipalPool(pool) {
80
+ const routingPool = pool;
81
+ return routingPool.activePool?.call(pool) ?? pool;
82
+ }
67
83
  /**
68
84
  * Every field of the Lakebase REST payloads is modelled as optional and
69
85
  * validated at the boundary rather than asserted with a cast: the pickers below
@@ -578,7 +594,10 @@ function isAlreadyExistsError(error) {
578
594
  * echo request context, so it goes to the log instead.
579
595
  */
580
596
  function operationFailed(opName, opError) {
581
- logger.error("autopg: operation failed", { operation: opName, error: opError });
597
+ logger.error("autopg: operation failed", {
598
+ operation: opName,
599
+ error: errorUtils.toError(opError),
600
+ });
582
601
  const code = object.isRecord(opError) ? (opError.code ?? opError.reason) : undefined;
583
602
  return new ExecutionError(`Lakebase operation failed: ${opName}`, {
584
603
  context: {
@@ -727,4 +746,4 @@ async function pickDatabase(ws, project, branch, signal) {
727
746
  logger.debug("autopg: resolved database", { database: choice });
728
747
  return choice;
729
748
  }
730
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEdBQUcsRUFDSCxNQUFNLEVBQ04sT0FBTyxJQUFJLGFBQWEsRUFDeEIsV0FBVyxHQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsWUFBWSxJQUFJLGtCQUFrQixFQUNsQyxTQUFTLEdBR1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDL0MsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzFCLE1BQU0sZ0JBQWdCLEdBQVksU0FBUyxDQUFDO0FBQzVDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLDhEQUE4RDtBQUM5RCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDaEMs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b25uZWN0aW9uIHJlc29sdmVyLlxuICpcbiAqIFJlYWRzIHRoZSBzYW1lIGVudiB2YXJzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBjb25zdW1lcyAoYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsIGBQR1BPUlRgLCBgUEdTU0xNT0RFYCwgYExBS0VCQVNFX0VORFBPSU5UYCkgYW5kIGZpbGxzIGluXG4gKiB3aGljaGV2ZXIgcGllY2VzIGFyZSBtaXNzaW5nIHVzaW5nIHRoZSBMYWtlYmFzZSBBdXRvc2NhbGluZyBSRVNUIEFQSVxuICogdW5kZXIgYC9hcGkvMi4wL3Bvc3RncmVzL2AgdmlhIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuXG4gKlxuICogYExBS0VCQVNFX0VORFBPSU5UYCAoYW5kIGBjb25maWcuZW5kcG9pbnRgKSBhY2NlcHQgYW55dGhpbmdcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzIC0gY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuIFRoZSByZXNvbHZlciBsYXllcnNcbiAqIHdoYXRldmVyIHBpZWNlcyBmYWxsIG91dCBvZiBwYXJzaW5nIHVuZGVyIGV4cGxpY2l0IGNvbmZpZyAvIGVudlxuICogdmFsdWVzLCB0aGVuIGZpbGxzIHRoZSByZW1haW5pbmcgZ2FwcyB2aWEgdGhlIEFQSTpcbiAqXG4gKiAgIDEuIFJldmVyc2UtbG9va3VwOiB3aGVuIGEgaG9zdCBpcyBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aCBpcyxcbiAqICAgICAgc2NhbiBwcm9qZWN0cyAtPiBicmFuY2hlcyAtPiBlbmRwb2ludHMgZm9yIGEgbWF0Y2hpbmdcbiAqICAgICAgYHN0YXR1cy5ob3N0cy5ob3N0YCBhbmQgcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL2VuZHBvaW50LlxuICogICAyLiBQaWNrOiB3aGVuIGEgcHJvamVjdCBpcyBrbm93biBidXQgY2hpbGQgcmVzb3VyY2VzIGFyZW4ndCwgcHJlZmVyXG4gKiAgICAgIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IChgc3RhdHVzLmRlZmF1bHRgLCBgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFYCxcbiAqICAgICAgYGRhdGFicmlja3NfcG9zdGdyZXNgKSBhbmQgZmFsbCBiYWNrIHRvIFwidGhlIG9ubHkgb25lXCIgd2hlbiBhXG4gKiAgICAgIGxpc3RpbmcgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQuXG4gKiAgIDMuIEF1dG8tY3JlYXRlOiB3aGVuIG5vIHByb2plY3RzIGV4aXN0IGF0IGFsbCwgY3JlYXRlIG9uZSB3aG9zZVxuICogICAgICBpZCBkZWZhdWx0cyB0byBgcHJvamVjdC5uYW1lKClgIHNsdWdpZmllZCAob3ZlcnJpZGVcbiAqICAgICAgd2l0aCBgY29uZmlnLmF1dG9DcmVhdGU6IFwibXktaWRcImAgb3IgZGlzYWJsZSB3aXRoXG4gKiAgICAgIGBjb25maWcuYXV0b0NyZWF0ZTogZmFsc2VgKS4gVGhlIGNyZWF0ZSBjYWxsIGlzIGlkZW1wb3RlbnQgLSBhblxuICogICAgICBgQUxSRUFEWV9FWElTVFNgIHJlc3BvbnNlIGZyb20gYSBjb25jdXJyZW50IGJvb3QgaXMgdHJlYXRlZCBhc1xuICogICAgICBzdWNjZXNzLiBUaGVuIHBvbGwgdGhlIGRlZmF1bHQgZW5kcG9pbnQgdW50aWwgaXQgcmVwb3J0c1xuICogICAgICBgY3VycmVudF9zdGF0ZWAgYFJFQURZYCBvciBgSURMRWAuXG4gKlxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VUb0Vudn0gd3JpdGVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0b1xuICogYHByb2Nlc3MuZW52YCBzbyB0aGUgZG93bnN0cmVhbSBgbGFrZWJhc2VgIHBsdWdpbiBwaWNrcyB0aGVtIHVwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2FwaS93b3Jrc3BhY2UvcG9zdGdyZXNcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwLFxuICBnZXRXb3Jrc3BhY2VDbGllbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMsIHByb2plY3RVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBvcHRpb25zIGFzIHNoYXJlZE9wdGlvbnMsXG4gIHN0cmluZ1V0aWxzLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdG9Db250ZXh0IH0gZnJvbSBcIi4vZGF0YWJyaWNrcy50c1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VBZGRyZXNzLFxuICBwYXJzZVJlc291cmNlUGF0aCxcbiAgcGFyc2VTc2xNb2RlIGFzIHBhcnNlTmF0aXZlU3NsTW9kZSxcbiAgU1NMX01PREVTLFxuICB0eXBlIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyxcbiAgdHlwZSBTc2xNb2RlLFxufSBmcm9tIFwiLi9wZ2FkZHJlc3MudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImxha2ViYXNlLXJlc29sdmVyXCIpO1xuY29uc3QgQVBJX0JBU0UgPSBcIi9hcGkvMi4wL3Bvc3RncmVzXCI7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA1NDMyO1xuY29uc3QgREVGQVVMVF9TU0xfTU9ERTogU3NsTW9kZSA9IFwicmVxdWlyZVwiO1xuY29uc3QgREVGQVVMVF9QR19WRVJTSU9OID0gMTc7XG4vKiogTGFrZWJhc2UgcHJvamVjdCBpZHM6IGBeW2Etel1bYS16MC05LV17MCw2MX1bYS16MC05XSRgLiAqL1xuY29uc3QgUFJPSkVDVF9JRF9NQVhfTEVOID0gNjM7XG5jb25zdCBPUEVSQVRJT05fVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5jb25zdCBPUEVSQVRJT05fUE9MTF9NUyA9IDJfMDAwO1xuY29uc3QgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9QT0xMX01TID0gMl8wMDA7XG4vKiogQ2VpbGluZyBvbiBhIHNpbmdsZSBiYWNrb2ZmIHN0ZXAsIHNvIGEgbG9uZyB3YWl0IHN0aWxsIHBvbGxzIHJlZ3VsYXJseS4gKi9cbmNvbnN0IFBPTExfTUFYX0RFTEFZX01TID0gMTVfMDAwO1xuY29uc3QgUE9MTF9CQUNLT0ZGX0ZBQ1RPUiA9IDEuNTtcbi8qKiBGcmFjdGlvbiBvZiBlYWNoIGRlbGF5IGFwcGxpZWQgYXMgKy8tIGppdHRlciwgc28gY29uY3VycmVudCBib290cyBkZXN5bmNocm9uaXplLiAqL1xuY29uc3QgUE9MTF9KSVRURVJfUkFUSU8gPSAwLjI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5lbmRwb2ludF90eXBlYCBmb3IgdGhlIHdyaXRhYmxlIHByaW1hcnkuICovXG5jb25zdCBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUgPSBcIkVORFBPSU5UX1RZUEVfUkVBRF9XUklURVwiO1xuLyoqIEVuZHBvaW50IGBzdGF0dXMuY3VycmVudF9zdGF0ZWAgdmFsdWVzIHRoYXQgd2lsbCBhY2NlcHQgYSBjb25uZWN0aW9uLiAqL1xuY29uc3QgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTID0gbmV3IFNldChbXCJSRUFEWVwiLCBcIklETEVcIl0pO1xuLyoqIEVuZHBvaW50IGBzdGF0dXMuY3VycmVudF9zdGF0ZWAgYmVmb3JlIGEgaG9zdG5hbWUgaXMgbWVhbmluZ2Z1bC4gKi9cbmNvbnN0IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSA9IFwiSU5JVElBTElaSU5HXCI7XG4vKiogTGFrZWJhc2UncyBvd24gZGVmYXVsdCBQb3N0Z3JlcyBkYXRhYmFzZSBuYW1lLiAqL1xuY29uc3QgREVGQVVMVF9EQVRBQkFTRSA9IFwiZGF0YWJyaWNrc19wb3N0Z3Jlc1wiO1xuXG4vKipcbiAqIFVzZXItc3VwcGxpZWQgTGFrZWJhc2UgaW5wdXRzIChjb25maWcgb3IgZW52KSBiZWZvcmUgYW55IEFQSSByZXNvbHV0aW9uLlxuICogRXh0ZW5kcyB7QGxpbmsgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzfSB3aXRoIHJlc29sdmVyLW9ubHkgb3B0aW9ucy5cbiAqIHtAbGluayByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9ufSBmaWxscyBnYXBzIGZyb20gdGhlIExha2ViYXNlIEFQSSB3aGVuXG4gKiBpdCBoYXMgZW5vdWdoIGNvbnRleHQgKHR5cGljYWxseSBhIGBwcm9qZWN0YCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VSZXNvbHZlcklucHV0cyBleHRlbmRzIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB7XG4gIC8qKiBBdXRoLXJlc29sdmVkIHByb2ZpbGUgdXNlZCBvbmx5IGZvciBEYXRhYnJpY2tzIGJ1bmRsZSB2YWxpZGF0aW9uLiAqL1xuICBidW5kbGVQcm9maWxlPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hhdCB0byBkbyB3aGVuIG5vIHByb2plY3QgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UgYXQgYWxsLlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZGVyaXZlIGEgcHJvamVjdCBpZCBmcm9tXG4gICAqICAge0BsaW5rIHByb2plY3QubmFtZX0gKHRoZSBob3N0IHJlcG8ncyBgcGFja2FnZS5qc29uYFxuICAgKiAgIG5hbWUpIHNsdWdpZmllZCB0byBMYWtlYmFzZSBpZCBjb25zdHJhaW50cywgdGhlbiBjcmVhdGUgaXQuXG4gICAqIC0gYHN0cmluZ2A6IGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggdGhpcyBleGFjdCBpZC5cbiAgICogLSBgZmFsc2VgOiBza2lwIGNyZWF0aW9uIGFuZCB0aHJvdyB3aXRoIGEgY2xlYXIgZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIGF1dG9DcmVhdGU/OiBzdHJpbmcgfCBmYWxzZTtcbn1cblxuLyoqIEZ1bGx5LXJlc29sdmVkIExha2ViYXNlIFBvc3RncmVzIGNvbm5lY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQ29ubmVjdGlvbiBleHRlbmRzIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgc3NsTW9kZTogU3NsTW9kZTtcbn1cblxuLyoqXG4gKiBFdmVyeSBmaWVsZCBvZiB0aGUgTGFrZWJhc2UgUkVTVCBwYXlsb2FkcyBpcyBtb2RlbGxlZCBhcyBvcHRpb25hbCBhbmRcbiAqIHZhbGlkYXRlZCBhdCB0aGUgYm91bmRhcnkgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgd2l0aCBhIGNhc3Q6IHRoZSBwaWNrZXJzIGJlbG93XG4gKiBicmFuY2ggb24gYHN0YXR1cy4qYCwgYW5kIGEgc2hhcGUgY2hhbmdlIHVwc3RyZWFtIHNob3VsZCBzdXJmYWNlIGFzIG9uZSBsb3VkXG4gKiBlcnJvciBoZXJlIGluc3RlYWQgb2YgYW4gYHVuZGVmaW5lZGAgdGhyZWUgZnJhbWVzIGF3YXkuIEVudW0tc2hhcGVkIGZpZWxkc1xuICogc3RheSBgc3RyaW5nYCBzbyBhIG5ld2x5IGFkZGVkIHN0YXRlIGRvZXMgbm90IGZhaWwgdGhlIHdob2xlIHJlc3BvbnNlLlxuICovXG5jb25zdCBwcm9qZWN0U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS5cIiksXG59KTtcbnR5cGUgUHJvamVjdCA9IHouaW5mZXI8dHlwZW9mIHByb2plY3RTY2hlbWE+O1xuXG5jb25zdCBlbmRwb2ludFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9L2VuZHBvaW50cy97ZX0uXCIpLFxuICB1aWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlN0YWJsZSBlbmRwb2ludCB1aWQgYXNzaWduZWQgYnkgTGFrZWJhc2UuXCIpLFxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGVuZHBvaW50X3R5cGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIkVuZHBvaW50IHJvbGUsIHN1Y2ggYXMgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFLlwiKSxcbiAgICAgIGhvc3RzOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIldyaXRhYmxlIHByaW1hcnkgaG9zdG5hbWUuXCIpLFxuICAgICAgICAgIHJlYWRfb25seV9ob3N0OiB6XG4gICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAuZGVzY3JpYmUoXCJSZWFkLW9ubHkgcmVwbGljYSBob3N0bmFtZSB3aGVuIHByZXNlbnQuXCIpLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJSZXNvbHZlZCBob3N0bmFtZXMuIGhvc3RzLmhvc3QgaXMgdGhlIHdyaXRhYmxlIHByaW1hcnkuXCIpLFxuICAgICAgY3VycmVudF9zdGF0ZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQ29tcHV0ZSBzdGF0ZTogSU5JVElBTElaSU5HLCBTVEFSVElORywgUkVBRFksIElETEUsIGFuZCBsYXRlciB2YWx1ZXMuXCIpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJTZXJ2ZXItc2lkZSBzdGF0ZS4gUnVudGltZSBob3N0bmFtZXMgbGl2ZSBoZXJlLCBub3QgaW4gdGhlIHNwZWMgYmxvY2suXCIpLFxufSk7XG50eXBlIEVuZHBvaW50ID0gei5pbmZlcjx0eXBlb2YgZW5kcG9pbnRTY2hlbWE+O1xuXG5jb25zdCBicmFuY2hTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkZ1bGwgcmVzb3VyY2UgcGF0aDogcHJvamVjdHMve3B9L2JyYW5jaGVzL3tifS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZGVmYXVsdDogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlRydWUgZm9yIHRoZSBwcm9qZWN0J3MgZGVmYXVsdCBicmFuY2gsIHN1Y2ggYXMgcHJvZHVjdGlvbi5cIiksXG4gICAgICBjdXJyZW50X3N0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJCcmFuY2ggY29tcHV0ZSBzdGF0ZSByZXBvcnRlZCBieSBMYWtlYmFzZS5cIiksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBCcmFuY2ggPSB6LmluZmVyPHR5cGVvZiBicmFuY2hTY2hlbWE+O1xuXG5jb25zdCBkYXRhYmFzZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9L2RhdGFiYXNlcy97ZH0uXCIpLFxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHBvc3RncmVzX2RhdGFiYXNlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJBY3R1YWwgUG9zdGdyZXMgZGF0YWJhc2UgbmFtZSB1c2VkIGFzIFBHREFUQUJBU0UuIE1heSBkaWZmZXIgZnJvbSB0aGUgcmVzb3VyY2UgaWQuXCIsXG4gICAgICAgICksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBEYXRhYmFzZSA9IHouaW5mZXI8dHlwZW9mIGRhdGFiYXNlU2NoZW1hPjtcblxuLyoqXG4gKiBMYWtlYmFzZSBSRVNUIGxpc3QgcmVzcG9uc2VzIGZvbGxvdyB0aGUgR29vZ2xlIEFJUCBjb252ZW50aW9uOlxuICogYHsgPHBsdXJhbC1yZXNvdXJjZT46IFRbXSwgbmV4dF9wYWdlX3Rva2VuPzogc3RyaW5nIH1gLiBXZSBvbmx5IHJlYWRcbiAqIHRoZSBmaXJzdCBwYWdlOyBmb3IgYXV0by1jb25maWcncyBcInBpY2sgc29tZXRoaW5nIHNlbnNpYmxlXCIgc2VtYW50aWNzIHRoZVxuICogY2FwIGlzIGZpbmUuXG4gKi9cbmNvbnN0IGxpc3RSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmV4dF9wYWdlX3Rva2VuOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJBSVAgcGFnZSB0b2tlbi4gT25seSB0aGUgZmlyc3QgcGFnZSBpcyBjb25zdW1lZC5cIiksXG4gIHByb2plY3RzOiB6LmFycmF5KHByb2plY3RTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGJyYW5jaGVzOiB6LmFycmF5KGJyYW5jaFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgZW5kcG9pbnRzOiB6LmFycmF5KGVuZHBvaW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICBkYXRhYmFzZXM6IHouYXJyYXkoZGF0YWJhc2VTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBMb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGVudmVsb3BlIHJldHVybmVkIGJ5IG11dGF0aW5nIFJFU1QgY2FsbHMuXG4gKiBgZG9uZTogdHJ1ZWAgbWVhbnMgdGVybWluYWw7IGNoZWNrIGBlcnJvcmAgYmVmb3JlIHJlYWRpbmcgYHJlc3BvbnNlYC5cbiAqL1xuY29uc3Qgb3BlcmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJPcGVyYXRpb24gcmVzb3VyY2UgbmFtZS5cIiksXG4gIGRvbmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyB0ZXJtaW5hbC5cIiksXG4gIGVycm9yOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgcGF5bG9hZCBwcmVzZW50IHdoZW4gdGhlIG9wZXJhdGlvbiBmYWlsZWQuXCIpLFxuICByZXNwb25zZTogei51bmtub3duKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlJlc3VsdCBwYXlsb2FkIHByZXNlbnQgd2hlbiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC5cIiksXG59KTtcbnR5cGUgT3BlcmF0aW9uID0gei5pbmZlcjx0eXBlb2Ygb3BlcmF0aW9uU2NoZW1hPjtcblxuLyoqIGBQR1BPUlRgIG11c3QgbGFuZCBpbnNpZGUgdGhlIFRDUCBwb3J0IHJhbmdlLiAqL1xuY29uc3QgcG9ydFNjaGVtYSA9IHNoYXJlZE9wdGlvbnMudGNwUG9ydFNjaGVtYTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGBQR1BPUlRgLXNoYXBlZCB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LCBhbmQgdGhyb3dzXG4gKiBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG5hbWluZyBgUEdQT1JUYCBmb3IgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBUQ1BcbiAqIHBvcnQsIHNvIGEgdHlwbyBjYW5ub3QgcmVhY2ggdGhlIGNvbm5lY3Rpb24gcmVjb3JkIGFzIGBOYU5gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3J0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcG9ydFNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFwiUEdQT1JUXCIsXG4gICAgICB2YWx1ZSxcbiAgICAgIGBhIFRDUCBwb3J0IGJldHdlZW4gMSBhbmQgJHtjb25maWdVdGlscy5NQVhfVENQX1BPUlR9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGBQR1NTTE1PREVgLXNoYXBlZCB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LCBhbmRcbiAqIHRocm93cyBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG5hbWluZyBgUEdTU0xNT0RFYCBmb3IgYW4gdW5zdXBwb3J0ZWQgbW9kZVxuICogcmF0aGVyIHRoYW4gaGFuZGluZyBgcGdgIGEgdmFsdWUgaXQgd2lsbCByZWplY3QgYXQgY29ubmVjdCB0aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTc2xNb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBTc2xNb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTmF0aXZlU3NsTW9kZSh2YWx1ZSk7XG4gIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXCJQR1NTTE1PREVcIiwgdmFsdWUsIFNTTF9NT0RFUy5qb2luKFwiLCBcIikpO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogRGVsYXkgYmVmb3JlIHRoZSBuZXh0IHBvbGwgYXR0ZW1wdDogZXhwb25lbnRpYWwgYmFja29mZiBjYXBwZWQgYXRcbiAqIHtAbGluayBQT0xMX01BWF9ERUxBWV9NU30sIHBsdXMgaml0dGVyIHNvIHNldmVyYWwgYXBwcyBib290aW5nIGFnYWluc3QgdGhlXG4gKiBzYW1lIHdvcmtzcGFjZSBkbyBub3QgcmV0cnkgaW4gbG9ja3N0ZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0UG9sbERlbGF5KGF0dGVtcHQ6IG51bWJlciwgYmFzZU1zOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gTWF0aC5taW4oYmFzZU1zICogUE9MTF9CQUNLT0ZGX0ZBQ1RPUiAqKiBhdHRlbXB0LCBQT0xMX01BWF9ERUxBWV9NUyk7XG4gIGNvbnN0IGppdHRlciA9IGJhY2tvZmYgKiBQT0xMX0pJVFRFUl9SQVRJTyAqIChNYXRoLnJhbmRvbSgpICogMiAtIDEpO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChiYWNrb2ZmICsgaml0dGVyKSk7XG59XG5cbi8qKlxuICogV2FpdCBvdXQge0BsaW5rIG5leHRQb2xsRGVsYXl9IGJlZm9yZSB0aGUgbmV4dCBhdHRlbXB0LiBSZWplY3RzIHdpdGggdGhlXG4gKiBzaWduYWwncyByZWFzb24gd2hlbiB0aGUgY2FsbGVyIGNhbmNlbHMgbWlkLXdhaXQsIHNvIGEgcG9sbCBsb29wIHVud2luZHNcbiAqIGluc3RlYWQgb2YgZmluaXNoaW5nIGl0cyBiYWNrb2ZmIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbERlbGF5KGF0dGVtcHQ6IG51bWJlciwgYmFzZU1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luY1V0aWxzLnNsZWVwKG5leHRQb2xsRGVsYXkoYXR0ZW1wdCwgYmFzZU1zKSwgc2lnbmFsKTtcbn1cblxuLyoqXG4gKiBQdWxsIHJlc29sdmVyIGlucHV0cyBmcm9tIGBwcm9jZXNzLmVudmAsIHBhcnNlIHRoZSBhZGRyZXNzIGJsb2IsIGFuZFxuICogbGF5ZXIgZXhwbGljaXQgY29uZmlnIG9uIHRvcCB3aXRoIHRoaXMgcHJlY2VkZW5jZTpcbiAqXG4gKiAgIGBjb25maWcuPGZpZWxkPmAgPiBgY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlYCAoc2hhcmVkIGNvbmZpZyBzb3VyY2VzKSA+XG4gKiAgIHdoYXRldmVyIHtAbGluayBwYXJzZUFkZHJlc3N9IHJlY292ZXJlZCBmcm9tIHRoZVxuICogICBgZW5kcG9pbnRgIC8gYExBS0VCQVNFX0VORFBPSU5UYCBibG9iLlxuICpcbiAqIFNldCBgY29uZmlnLmVuZHBvaW50YCAob3IgYExBS0VCQVNFX0VORFBPSU5UYCkgdG8gYW55IGlucHV0XG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kczogY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTGFrZWJhc2VJbnB1dHMoXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4pOiBQcm9taXNlPExha2ViYXNlUmVzb2x2ZXJJbnB1dHM+IHtcbiAgY29uc3QgY29uZmlnT3B0aW9ucyA9IHsgYnVuZGxlUHJvZmlsZTogY29uZmlnPy5idW5kbGVQcm9maWxlIH07XG4gIGNvbnN0IHJhd0FkZHJlc3MgPVxuICAgIGNvbmZpZz8uZW5kcG9pbnQgPz9cbiAgICBjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXG4gICAgICBzaGFyZWRPcHRpb25zLmRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsXG4gICAgICBjb25maWdPcHRpb25zLFxuICAgICk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQWRkcmVzcyhyYXdBZGRyZXNzKTtcbiAgY29uc3QgcG9ydEVudiA9IHBhcnNlUG9ydChjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR1BPUlRcIiwgY29uZmlnT3B0aW9ucykpO1xuICBjb25zdCBzc2xNb2RlRW52ID0gcGFyc2VTc2xNb2RlKGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHU1NMTU9ERVwiLCBjb25maWdPcHRpb25zKSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRTc2xNb2RlID0gcGFyc2VTc2xNb2RlKGNvbmZpZz8uc3NsTW9kZSk7XG4gIGNvbnN0IHBhcnNlZFNzbE1vZGUgPSBwYXJzZVNzbE1vZGUocGFyc2VkLnNzbE1vZGUpO1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IGNvbmZpZz8ucHJvamVjdCA/PyBwYXJzZWQucHJvamVjdCxcbiAgICBicmFuY2g6IGNvbmZpZz8uYnJhbmNoID8/IHBhcnNlZC5icmFuY2gsXG4gICAgLy8gT25seSBjYW5vbmljYWwgZW5kcG9pbnQgcmVzb3VyY2UgcGF0aHMgc3Vydml2ZSBoZXJlOyBVUklzIGFuZFxuICAgIC8vIGJhcmUgaG9zdG5hbWVzIHNldCBgaG9zdGAgaW5zdGVhZCBhbmQgbGVhdmUgYGVuZHBvaW50YCB1bmRlZmluZWRcbiAgICAvLyB1bnRpbCB0aGUgUkVTVCByZXNvbHZlciBmaWxscyBpdCBpbi5cbiAgICBlbmRwb2ludDogcGFyc2VkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOlxuICAgICAgY29uZmlnPy5kYXRhYmFzZSA/PyBjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR0RBVEFCQVNFXCIsIGNvbmZpZ09wdGlvbnMpID8/IHBhcnNlZC5kYXRhYmFzZSxcbiAgICBob3N0OiBjb25maWc/Lmhvc3QgPz8gY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlKFwiUEdIT1NUXCIsIGNvbmZpZ09wdGlvbnMpID8/IHBhcnNlZC5ob3N0LFxuICAgIHBvcnQ6IGNvbmZpZz8ucG9ydCA/PyBwb3J0RW52ID8/IHBhcnNlZC5wb3J0LFxuICAgIHNzbE1vZGU6IGNvbmZpZ3VyZWRTc2xNb2RlID8/IHNzbE1vZGVFbnYgPz8gcGFyc2VkU3NsTW9kZSxcbiAgICBhdXRvQ3JlYXRlOiBjb25maWc/LmF1dG9DcmVhdGUsXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGZ1bGx5LXBvcHVsYXRlZCBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlY29yZCBmcm9tIGNvbmZpZyArIGVudi5cbiAqXG4gKiBSZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQgbmV0d29yayB0cmFmZmljIHdoZW4gZW52IGFscmVhZHkgc3VwcGxpZXNcbiAqIGBlbmRwb2ludGAsIGBob3N0YCwgYW5kIGBkYXRhYmFzZWAuIE90aGVyd2lzZSBpc3N1ZXMgUkVTVCBjYWxscyBhbmRcbiAqIG1heSBhdXRvLWNyZWF0ZSBhIHByb2plY3QgKHNlZSBtb2R1bGUgZG9jc3RyaW5nKS5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIGV2ZXJ5IFJFU1QgY2FsbCBhbmQgaW50ZXItcG9sbCBzbGVlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5yZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKFxuICogICB7IGF1dG9DcmVhdGU6IGZhbHNlIH0sXG4gKiAgIEFib3J0U2lnbmFsLnRpbWVvdXQoNjBfMDAwKSxcbiAqICk7XG4gKiBsYWtlYmFzZVJlc29sdmVyLmFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGNvbnN0IGlucHV0cyA9IGF3YWl0IHJlYWRMYWtlYmFzZUlucHV0cyhjb25maWcpO1xuICBsZXQgeyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCB9ID0gaW5wdXRzO1xuICBjb25zdCBwb3J0ID0gaW5wdXRzLnBvcnQgPz8gREVGQVVMVF9QT1JUO1xuICBjb25zdCBzc2xNb2RlID0gcGFyc2VTc2xNb2RlKGlucHV0cy5zc2xNb2RlKSA/PyBERUZBVUxUX1NTTF9NT0RFO1xuXG4gIC8vIFJlc291cmNlIHBhdGhzIG1heSBjYXJyeSByZWR1bmRhbnQgaW5mbzsgaGFydmVzdCBwcm9qZWN0L2JyYW5jaFxuICAvLyBmcm9tIGFueSBjYW5vbmljYWwgcGF0aCB0aGF0IHNudWNrIGluIHZpYSBQR0RBVEFCQVNFIG9yIHNpbWlsYXIuXG4gIGlmIChlbmRwb2ludCAmJiAoIXByb2plY3QgfHwgIWJyYW5jaCkpIHtcbiAgICBjb25zdCBwYXJzZWRFbmRwb2ludCA9IHBhcnNlQWRkcmVzcyhlbmRwb2ludCk7XG4gICAgcHJvamVjdCA/Pz0gcGFyc2VkRW5kcG9pbnQucHJvamVjdDtcbiAgICBicmFuY2ggPz89IHBhcnNlZEVuZHBvaW50LmJyYW5jaDtcbiAgfVxuICBpZiAoZGF0YWJhc2UgJiYgKCFwcm9qZWN0IHx8ICFicmFuY2gpKSB7XG4gICAgY29uc3QgcGFyc2VkRGF0YWJhc2UgPSBwYXJzZUFkZHJlc3MoZGF0YWJhc2UpO1xuICAgIHByb2plY3QgPz89IHBhcnNlZERhdGFiYXNlLnByb2plY3Q7XG4gICAgYnJhbmNoID8/PSBwYXJzZWREYXRhYmFzZS5icmFuY2g7XG4gICAgaWYgKHBhcnNlZERhdGFiYXNlLmRhdGFiYXNlUmVzb3VyY2VJZCkge1xuICAgICAgZGF0YWJhc2UgPSBwYXJzZWREYXRhYmFzZS5kYXRhYmFzZVJlc291cmNlSWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQWxyZWFkeSBjb21wbGV0ZTogc2tpcCBldmVyeSBSRVNUIGNhbGwuXG4gIGlmIChlbmRwb2ludCAmJiBob3N0ICYmIGRhdGFiYXNlKSB7XG4gICAgcmV0dXJuIHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QsIHBvcnQsIHNzbE1vZGUgfTtcbiAgfVxuXG4gIGNvbnN0IHdzID0gZ2V0V29ya3NwYWNlQ2xpZW50KHt9KTtcblxuICAvLyBIb3N0IGtub3duIGJ1dCBubyByZXNvdXJjZSBwYXRoOiBzY2FuIHRoZSB3b3Jrc3BhY2UgdG8gZmluZCB3aGljaFxuICAvLyBlbmRwb2ludCBvd25zIHRoaXMgaG9zdCBzbyB3ZSBjYW4gcG9wdWxhdGUgTEFLRUJBU0VfRU5EUE9JTlQuXG4gIGlmICghcHJvamVjdCAmJiBob3N0KSB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kRW5kcG9pbnRCeUhvc3Qod3MsIGhvc3QsIHNpZ25hbCk7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBwcm9qZWN0ID0gZm91bmQucHJvamVjdDtcbiAgICAgIGJyYW5jaCA9IGZvdW5kLmJyYW5jaDtcbiAgICAgIGVuZHBvaW50ID8/PSBmb3VuZC5lbmRwb2ludDtcbiAgICB9XG4gIH1cblxuICAvLyBObyBwcm9qZWN0IGFueXdoZXJlIGluIGNvbmZpZy9lbnYvYWRkcmVzczogbGlzdCwgcGljaywgb3IgY3JlYXRlLlxuICBpZiAoIXByb2plY3QpIHtcbiAgICBwcm9qZWN0ID0gYXdhaXQgcGlja09yQ3JlYXRlUHJvamVjdCh3cywgY29uZmlnPy5hdXRvQ3JlYXRlLCBzaWduYWwpO1xuICB9XG5cbiAgaWYgKCFicmFuY2gpIHtcbiAgICBicmFuY2ggPSBhd2FpdCBwaWNrQnJhbmNoKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICB9XG5cbiAgaWYgKCFlbmRwb2ludCkge1xuICAgIGNvbnN0IGVwID0gYXdhaXQgcGlja0VuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gICAgZW5kcG9pbnQgPSBlcC5uYW1lO1xuICAgIGhvc3QgPz89IGVwLmhvc3Q7XG4gIH1cblxuICBpZiAoIWhvc3QgJiYgZW5kcG9pbnQpIHtcbiAgICBjb25zdCBwYXJzZWRFbmRwb2ludCA9IHBhcnNlQWRkcmVzcyhlbmRwb2ludCk7XG4gICAgaWYgKHBhcnNlZEVuZHBvaW50LnByb2plY3QgJiYgcGFyc2VkRW5kcG9pbnQuYnJhbmNoICYmIHBhcnNlZEVuZHBvaW50LmVuZHBvaW50SWQpIHtcbiAgICAgIGNvbnN0IGVwID0gYXdhaXQgd2FpdEVuZHBvaW50UmVhZHkoXG4gICAgICAgIHdzLFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5wcm9qZWN0LFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5icmFuY2gsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LmVuZHBvaW50SWQsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgICBob3N0ID0gZXAuc3RhdHVzPy5ob3N0cz8uaG9zdDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgaG9zdCBmcm9tIGVuZHBvaW50XCIsIHsgaG9zdCB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWRhdGFiYXNlKSB7XG4gICAgZGF0YWJhc2UgPSBhd2FpdCBwaWNrRGF0YWJhc2Uod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgfVxuXG4gIHJldHVybiB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0LCBwb3J0LCBzc2xNb2RlIH07XG59XG5cbi8qKlxuICogV3JpdGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG8gYHByb2Nlc3MuZW52YCBzbyB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqICh3aGljaCByZWFkcyBlbnYgZGlyZWN0bHkpIHBpY2tzIHRoZW0gdXAgZHVyaW5nIGl0cyBvd24gYHNldHVwKClgLlxuICogRXhpc3RpbmcgZW52IHZhbHVlcyBhcmUgcHJlc2VydmVkOyBvbmx5IG1pc3Npbmcga2V5cyBhcmUgZmlsbGVkIGluLFxuICogd2hpY2gga2VlcHMgZXhwbGljaXQgb3ZlcnJpZGVzIGF1dGhvcml0YXRpdmUuXG4gKlxuICogVGhpcyBkb2VzIE5PVCBzZXQgYFBHVVNFUmAsIHdoaWNoIG5lZWRzIGFuIGF3YWl0IC0gc2VlXG4gKiB7QGxpbmsgYXBwbHlMYWtlYmFzZUVudn0gZm9yIHRoZSBjb21wbGV0ZSBzZXQgYSBQb3N0Z3JlcyBwb29sIHJlcXVpcmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkOiBMYWtlYmFzZUNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgaWYgKHJlc29sdmVkLmVuZHBvaW50KSB7XG4gICAgcHJvY2Vzcy5lbnZbc2hhcmVkT3B0aW9ucy5kYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50XSA/Pz0gcmVzb2x2ZWQuZW5kcG9pbnQ7XG4gIH1cbiAgaWYgKHJlc29sdmVkLmhvc3QpIHByb2Nlc3MuZW52LlBHSE9TVCA/Pz0gcmVzb2x2ZWQuaG9zdDtcbiAgaWYgKHJlc29sdmVkLmRhdGFiYXNlKSBwcm9jZXNzLmVudi5QR0RBVEFCQVNFID8/PSByZXNvbHZlZC5kYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUEdQT1JUID8/PSBTdHJpbmcocmVzb2x2ZWQucG9ydCk7XG4gIHByb2Nlc3MuZW52LlBHU1NMTU9ERSA/Pz0gcmVzb2x2ZWQuc3NsTW9kZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjb25uZWN0aW9uIEFORCBhcHBseSBldmVyeSBQb3N0Z3JlcyBlbnYgdmFyIGEgTGFrZWJhc2UgcG9vbCBuZWVkcyxcbiAqIHJldHVybmluZyB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiBwbHVzIHRoZSB1c2VybmFtZSB0aGF0IHdhcyBhcHBsaWVkLlxuICpcbiAqIFRoaXMgaXMgdGhlIHdob2xlIHNldCwgd2hpY2ggaXMgdGhlIHBvaW50IG9mIGhhdmluZyBvbmUgZnVuY3Rpb24gZm9yIGl0OlxuICogYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCB0aHJvd3MgdW5sZXNzIGBMQUtFQkFTRV9FTkRQT0lOVGAsIGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCAqKmFuZCoqIGEgdXNlcm5hbWUgKGBQR1VTRVJgLCBvciBgREFUQUJSSUNLU19DTElFTlRfSURgIGZvciBhXG4gKiBzZXJ2aWNlIHByaW5jaXBhbCkgYXJlIGFsbCBwcmVzZW50LCBhbmQgYSBEYXRhYnJpY2tzIEFwcCBgcG9zdGdyZXNgIHJlc291cmNlXG4gKiBiaW5kaW5nIHN1cHBsaWVzIG9ubHkgdGhlIGZpcnN0LiBBbnl0aGluZyB0aGF0IHdhbnRzIGEgd29ya2luZyBwb29sIC0gdGhlXG4gKiBgbGFrZWJhc2VgIHBsdWdpbiwgb3IgQXBwS2l0J3MgUEVSU0lTVEVOVCBjYWNoZSwgd2hpY2ggcXVpZXRseSBkZWdyYWRlcyB0b1xuICogaW4tbWVtb3J5IHdoZW4gdGhlIHBvb2wgY2Fubm90IGJlIGJ1aWx0IC0gbmVlZHMgYWxsIGZvdXIsIHNvIGNhbGxlcnMgc2hvdWxkIG5vdFxuICogcGFpciB7QGxpbmsgYXBwbHlMYWtlYmFzZVRvRW52fSB3aXRoIHRoZWlyIG93biB1c2VybmFtZSBsb29rdXAuXG4gKlxuICogYFBHVVNFUmAgaXMgYXBwbGllZCB3aXRoIGA/Pz1gIGxpa2UgdGhlIHJlc3QsIHNvIGFuIGV4cGxpY2l0bHkgY29uZmlndXJlZCB2YWx1ZVxuICogc3RheXMgYXV0aG9yaXRhdGl2ZS4gVGhlIGxvb2t1cCByZXR1cm5zIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHRocm93aW5nIHdoZW4gaXRcbiAqIGNhbm5vdCBkZXRlcm1pbmUgYSB1c2VyLCBsZWF2aW5nIHRoZSBwb29sIHRvIHJlc29sdmUgaXRzIG93bi5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIC8vIEVub3VnaCBmb3IgYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCB0byBidWlsZCBhIHBvb2wuXG4gKiBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZUVudih7IGF1dG9DcmVhdGU6IGZhbHNlIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlMYWtlYmFzZUVudihcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbjsgdXNlcj86IHN0cmluZyB9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbihjb25maWcsIHNpZ25hbCk7XG4gIGFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAoe30pO1xuICBpZiAodXNlcikgcHJvY2Vzcy5lbnYuUEdVU0VSID8/PSB1c2VyO1xuICByZXR1cm4geyByZXNvbHZlZCwgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSB9O1xufVxuXG50eXBlIFdvcmtzcGFjZUNsaWVudCA9IFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmtzcGFjZUNsaWVudD47XG5cbi8qKiBUaGUgU0RLIGBDb250ZXh0YCBhY2NlcHRlZCBieSB0aGUgd29ya3NwYWNlIGNsaWVudCdzIG93biBjb3B5IG9mIHRoZSBTREsuICovXG50eXBlIEFwaVJlcXVlc3RDb250ZXh0ID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxXb3Jrc3BhY2VDbGllbnRbXCJhcGlDbGllbnRcIl1bXCJyZXF1ZXN0XCJdPlsxXT47XG5cbi8qKlxuICogQWRhcHQgYW4ge0BsaW5rIEFib3J0U2lnbmFsfSBpbnRvIHRoZSBhcGkgY2xpZW50J3MgY2FuY2VsbGF0aW9uIGNvbnRleHQuXG4gKiBBcHBLaXQgcmVzb2x2ZXMgYSBkaWZmZXJlbnQgY29weSBvZiBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGAgdGhhbiB0aGlzXG4gKiBwYWNrYWdlIGRvZXMsIGFuZCBgQ29udGV4dGAgY2FycmllcyBhIHByaXZhdGUgZmllbGQsIHNvIHRoZSB0d28gZGVjbGFyYXRpb25zXG4gKiBhcmUgbm9taW5hbGx5IGluY29tcGF0aWJsZSBldmVuIHRob3VnaCB0aGUgYXBpIGNsaWVudCBvbmx5IHJlYWRzXG4gKiBgY2FuY2VsbGF0aW9uVG9rZW5gIGFuZCBgbG9nZ2VyYCBvZmYgdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdENvbnRleHQoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IEFwaVJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNpZ25hbCA/ICh0b0NvbnRleHQoc2lnbmFsKSBhcyB1bmtub3duIGFzIEFwaVJlcXVlc3RDb250ZXh0KSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIExha2ViYXNlIFJFU1QgYm9keS4gVGhlIGZ1bGwgcGF5bG9hZCBpcyBsb2dnZWQgcmF0aGVyIHRoYW4gdGhyb3duXG4gKiBzbyBhIGNsaWVudCBuZXZlciByZWNlaXZlcyB1cHN0cmVhbSBkZXRhaWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUmVzcG9uc2U8VD4oc2NoZW1hOiB6LlpvZFR5cGU8VD4sIHBhdGg6IHN0cmluZywgYm9keTogdW5rbm93bik6IFQge1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKGJvZHkpO1xuICBpZiAocGFyc2VkLnN1Y2Nlc3MpIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgbG9nZ2VyLmVycm9yKFwiYXV0b3BnOiB1bmV4cGVjdGVkIExha2ViYXNlIEFQSSByZXNwb25zZVwiLCB7XG4gICAgcGF0aCxcbiAgICBpc3N1ZXM6IHBhcnNlZC5lcnJvci5pc3N1ZXMsXG4gIH0pO1xuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJMYWtlYmFzZSBBUEkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCByZXNwb25zZVwiLCB7IGNvbnRleHQ6IHsgcGF0aCB9IH0pO1xufVxuXG4vKiogR0VUIGhlbHBlciB0aGF0IHZhbGlkYXRlcyB0aGUgSlNPTiBib2R5IGFuZCBmb3J3YXJkcyBjYW5jZWxsYXRpb24uICovXG5hc3luYyBmdW5jdGlvbiBnZXRKc29uPFQ+KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoeyBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICB9LFxuICAgIHJlcXVlc3RDb250ZXh0KHNpZ25hbCksXG4gICk7XG4gIHJldHVybiBwYXJzZVJlc3BvbnNlKHNjaGVtYSwgcGF0aCwgcmVzKTtcbn1cblxuLyoqIFBPU1QgaGVscGVyIGZvciBjcmVhdGUgLyBtdXRhdGUgY2FsbHM7IHZhbGlkYXRlcyB0aGUgSlNPTiBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIGJvZHk6IHVua25vd24sXG4gIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgd3MuYXBpQ2xpZW50LnJlcXVlc3QoXG4gICAge1xuICAgICAgcGF0aCxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBxdWVyeSxcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9KSxcbiAgICAgIHJhdzogZmFsc2UsXG4gICAgICBwYXlsb2FkOiBib2R5LFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0UHJvamVjdHMod3M6IFdvcmtzcGFjZUNsaWVudCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKHdzLCBgJHtBUElfQkFTRX0vcHJvamVjdHNgLCBsaXN0UmVzcG9uc2VTY2hlbWEsIHNpZ25hbCk7XG4gIHJldHVybiByZXMucHJvamVjdHMgPz8gW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RCcmFuY2hlcyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8QnJhbmNoW10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlc2AsXG4gICAgbGlzdFJlc3BvbnNlU2NoZW1hLFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgcmV0dXJuIHJlcy5icmFuY2hlcyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEVuZHBvaW50cyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50W10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZW5kcG9pbnRzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmVuZHBvaW50cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERhdGFiYXNlcyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPERhdGFiYXNlW10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZGF0YWJhc2VzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmRhdGFiYXNlcyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RW5kcG9pbnQoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIGVuZHBvaW50SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gIHJldHVybiBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHMvJHtlbmRwb2ludElkfWAsXG4gICAgZW5kcG9pbnRTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xufVxuXG4vKipcbiAqIFNjYW4gdGhlIHdvcmtzcGFjZSBmb3IgYW4gZW5kcG9pbnQgd2hvc2UgYHN0YXR1cy5ob3N0cy5ob3N0YCBtYXRjaGVzXG4gKiB0aGUgcHJvdmlkZWQgaG9zdG5hbWUuIFVzZWQgdG8gcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL1xuICogZW5kcG9pbnQgcmVzb3VyY2UgcGF0aCB3aGVuIHRoZSBjYWxsZXIgb25seSBzdXBwbGllZCBhIFBvc3RncmVzIFVSSS5cbiAqXG4gKiBPKHByb2plY3RzICogYnJhbmNoZXMgKiBlbmRwb2ludHMpIC0gZmluZSBmb3IgdHlwaWNhbCB3b3Jrc3BhY2VzXG4gKiAoc2luZ2xlIGRpZ2l0cyBwZXIgdGllcik7IHBhZ2luYXRpb24gaXMgaW50ZW50aW9uYWxseSBub3QgZm9sbG93ZWRcbiAqIHNpbmNlIHRoaXMgaXMgYSBiZXN0LWVmZm9ydCBmYWxsYmFjay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEVuZHBvaW50QnlIb3N0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBob3N0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx7IHByb2plY3Q6IHN0cmluZzsgYnJhbmNoOiBzdHJpbmc7IGVuZHBvaW50OiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGZvciAoY29uc3QgcCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnN0IHByb2plY3RJZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdDtcbiAgICBpZiAoIXByb2plY3RJZCkgY29udGludWU7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBhd2FpdCBsaXN0QnJhbmNoZXMod3MsIHByb2plY3RJZCwgc2lnbmFsKTtcbiAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaElkID0gcGFyc2VSZXNvdXJjZVBhdGgoYi5uYW1lKS5icmFuY2g7XG4gICAgICBpZiAoIWJyYW5jaElkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RFbmRwb2ludHMod3MsIHByb2plY3RJZCwgYnJhbmNoSWQsIHNpZ25hbCk7XG4gICAgICBjb25zdCBtYXRjaCA9IGVuZHBvaW50cy5maW5kKChlKSA9PiBlLnN0YXR1cz8uaG9zdHM/Lmhvc3QgPT09IGhvc3QpO1xuICAgICAgaWYgKG1hdGNoPy5uYW1lKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogbWF0Y2hlZCBlbmRwb2ludCBieSBob3N0XCIsIHtcbiAgICAgICAgICBob3N0LFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm9qZWN0OiBwcm9qZWN0SWQsXG4gICAgICAgICAgYnJhbmNoOiBicmFuY2hJZCxcbiAgICAgICAgICBlbmRwb2ludDogbWF0Y2gubmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBubyBlbmRwb2ludCBtYXRjaGVkIGhvc3RcIiwgeyBob3N0IH0pO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcm9qZWN0IHRvIHVzZSwgb3IgY3JlYXRlIG9uZSB3aGVuIHRoZSB3b3Jrc3BhY2UgaXMgZW1wdHkuXG4gKlxuICogU2VsZWN0aW9uIG9yZGVyOlxuICogMS4gRXhhY3RseSBvbmUgcHJvamVjdCBsaXN0ZWQgLT4gdXNlIGl0LlxuICogMi4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgIT09IGZhbHNlYCAtPiBlbnN1cmUgYSBwcm9qZWN0IHdpdGhcbiAqICAgIHRoZSByZXNvbHZlZCBpZCBleGlzdHMsIHRoZW4gcmV0dXJuIGl0cyBpZC5cbiAqIDMuIFplcm8gcHJvamVjdHMgQU5EIGBhdXRvQ3JlYXRlID09PSBmYWxzZWAgLT4gdGhyb3cuXG4gKiA0LiBNdWx0aXBsZSBwcm9qZWN0cyAtPiB0aHJvdyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdCAoc2V0XG4gKiAgICBgY29uZmlnLnByb2plY3RgIG9yIHBpbiBhIHByb2plY3QgaWQgaW4gYExBS0VCQVNFX0VORFBPSU5UYCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tPckNyZWF0ZVByb2plY3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGF1dG9DcmVhdGU6IHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgbGlzdFByb2plY3RzKHdzLCBzaWduYWwpO1xuICBpZiAocHJvamVjdHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgaWQgPSBwYXJzZVJlc291cmNlUGF0aChwcm9qZWN0c1swXSEubmFtZSkucHJvamVjdDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogdXNpbmcgb25seSBwcm9qZWN0XCIsIHsgcHJvamVjdDogaWQgfSk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoYXV0b0NyZWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkxha2ViYXNlIHByb2plY3RcIixcbiAgICAgICAgXCJhdXRvQ3JlYXRlIGlzIGZhbHNlOyBjcmVhdGUgYSBwcm9qZWN0IG9yIHNldCBjb25maWcucHJvamVjdCAvIExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBhdXRvQ3JlYXRlID8/IChhd2FpdCBkZWZhdWx0UHJvamVjdElkKCkpO1xuICAgIHJldHVybiBlbnN1cmVQcm9qZWN0KHdzLCBpZCwgc2lnbmFsKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGVzID0gcHJvamVjdHNcbiAgICAubWFwKChwKSA9PiBwYXJzZVJlc291cmNlUGF0aChwLm5hbWUpLnByb2plY3QpXG4gICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gQm9vbGVhbihpZCkpXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgIFwiTGFrZWJhc2VcIixcbiAgICBgTXVsdGlwbGUgcHJvamVjdHMgZm91bmQ7IHNldCBjb25maWcucHJvamVjdCBvciBwaW4gYSBwcm9qZWN0IGlkIGluIExBS0VCQVNFX0VORFBPSU5ULiBDYW5kaWRhdGVzOiAke2NhbmRpZGF0ZXN9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYSBMYWtlYmFzZSBwcm9qZWN0IGlkIGZyb20gdGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gKiBuYW1lICh2aWEge0BsaW5rIHByb2plY3QubmFtZX0pIHNsdWdpZmllZCB0byBzYXRpc2Z5IHRoZVxuICogTGFrZWJhc2UgaWQgY29uc3RyYWludCAoYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGApLlxuICpcbiAqIFRocm93cyB3aGVuIHRoZSBzbHVnIGVuZHMgdXAgZW1wdHkgb3Igc3RhcnRzIHdpdGggYSBkaWdpdCwgc2luY2UgdGhlXG4gKiBzZXJ2ZXIgd291bGQgcmVqZWN0IGl0IGFueXdheSAtIGNhbGxlcnMgc2hvdWxkIHBhc3MgYW4gZXhwbGljaXRcbiAqIGBhdXRvQ3JlYXRlYCBpZCBpbiB0aGF0IGNhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRQcm9qZWN0SWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZSA9IHByb2plY3RVdGlscy5uYW1lKCk7XG4gIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogUFJPSkVDVF9JRF9NQVhfTEVOIH0sIG5hbWUpO1xuICBpZiAoIXNsdWcgfHwgIS9eW2Etel0vLnRlc3Qoc2x1ZykpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogcHJvamVjdCBuYW1lIGRvZXMgbm90IHNsdWdpZnkgdG8gYSBMYWtlYmFzZSBwcm9qZWN0IGlkXCIsIHsgbmFtZSB9KTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBcIkNvdWxkIG5vdCBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb20gdGhlIHBhY2thZ2UgbmFtZTsgcGFzcyBhdXRvQ3JlYXRlIGV4cGxpY2l0bHkuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc2x1Zztcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBMYWtlYmFzZSBwcm9qZWN0IHdpdGggYHByb2plY3RJZGAgZXhpc3RzLiBDcmVhdGVzIGl0IGFuZFxuICogd2FpdHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiBBbiBgQUxSRUFEWV9FWElTVFNgXG4gKiByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHN1Y2Nlc3MgLSBzb21lb25lIGVsc2UgKGEgY29uY3VycmVudCBib290LFxuICogYSBzaWJsaW5nIHByb2Nlc3MpIHdvbiB0aGUgcmFjZSBhbmQgdGhlIHByb2plY3Qgd2Ugd2FudGVkIGlzIG5vd1xuICogc2l0dGluZyB0aGVyZSByZWFkeSBmb3IgZG93bnN0cmVhbSBwaWNrZXJzLlxuICpcbiAqIFByb2plY3QgY3JlYXRpb24gdHlwaWNhbGx5IHByb3Zpc2lvbnMgYSBkZWZhdWx0IGBwcm9kdWN0aW9uYCBicmFuY2hcbiAqIGFsb25nc2lkZTsgZG93bnN0cmVhbSBwaWNrZXJzIGhhbmRsZSB0aGUgcmVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IG5vIHByb2plY3RzIGZvdW5kOyBjcmVhdGluZ1wiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcCA9IGF3YWl0IHBvc3RKc29uKFxuICAgICAgd3MsXG4gICAgICBgJHtBUElfQkFTRX0vcHJvamVjdHNgLFxuICAgICAgb3BlcmF0aW9uU2NoZW1hLFxuICAgICAgeyBzcGVjOiB7IHBnX3ZlcnNpb246IERFRkFVTFRfUEdfVkVSU0lPTiB9IH0sXG4gICAgICB7IHByb2plY3RfaWQ6IHByb2plY3RJZCB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgYXdhaXQgd2FpdEZvck9wZXJhdGlvbih3cywgb3AsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IGNyZWF0ZWQgcHJvamVjdFwiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFpc0FscmVhZHlFeGlzdHNFcnJvcihlcnIpKSB0aHJvdyBlcnI7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IHByb2plY3QgYWxyZWFkeSBleGlzdHMgKHJhY2UpOyBwcm9jZWVkaW5nXCIsIHtcbiAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvamVjdElkO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZSB0aGUgRGF0YWJyaWNrcyBTREsncyBgQUxSRUFEWV9FWElTVFNgIGZhaWx1cmUgbW9kZXMgc28gYVxuICogbG9zdCByYWNlIGR1cmluZyBgZW5zdXJlUHJvamVjdGAgYmVjb21lcyBhIG5vLW9wIGluc3RlYWQgb2YgYW4gZXJyb3IuXG4gKlxuICogVGhlIFNESyB0aHJvd3MgYEFwaUVycm9yIHsgZXJyb3JDb2RlLCBzdGF0dXNDb2RlIH1gIGZvciBzdHJ1Y3R1cmVkXG4gKiBzZXJ2ZXIgZXJyb3JzIGFuZCBgSHR0cEVycm9yIHsgY29kZSB9YCBmb3IgdHJhbnNwb3J0LWxheWVyIDR4eC81eHguXG4gKiBCb3RoIHN1cmZhY2UgYSBodW1hbiBtZXNzYWdlIHRoYXQgb2Z0ZW4gY2FycmllcyBcImFscmVhZHkgZXhpc3RzXCIgc29cbiAqIHdlIHVzZSB0aGF0IGFzIGEgZmluYWwgZmFsbGJhY2sgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gaXNBbHJlYWR5RXhpc3RzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZSA9IGVycm9yIGFzIHtcbiAgICBzdGF0dXNDb2RlPzogbnVtYmVyO1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG4gIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwOSB8fCBlLmNvZGUgPT09IDQwOSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLmVycm9yQ29kZSAmJiAvYWxyZWFkeS4/ZXhpc3RzL2kudGVzdChlLmVycm9yQ29kZSkpIHJldHVybiB0cnVlO1xuICBpZiAoZS5tZXNzYWdlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUubWVzc2FnZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVkdWNlIGEgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWx1cmUgdG8gYW4gZXJyb3Igc2FmZSB0byBwcm9wYWdhdGU6IHRoZVxuICogb3BlcmF0aW9uIG5hbWUgcGx1cyB3aGF0ZXZlciBjb2RlIHRoZSBwYXlsb2FkIGNhcnJpZXMuIFRoZSBwYXlsb2FkIGl0c2VsZiBjYW5cbiAqIGVjaG8gcmVxdWVzdCBjb250ZXh0LCBzbyBpdCBnb2VzIHRvIHRoZSBsb2cgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gb3BlcmF0aW9uRmFpbGVkKG9wTmFtZTogc3RyaW5nLCBvcEVycm9yOiB1bmtub3duKTogRXhlY3V0aW9uRXJyb3Ige1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IG9wZXJhdGlvbiBmYWlsZWRcIiwgeyBvcGVyYXRpb246IG9wTmFtZSwgZXJyb3I6IG9wRXJyb3IgfSk7XG4gIGNvbnN0IGNvZGUgPSBvYmplY3QuaXNSZWNvcmQob3BFcnJvcikgPyAob3BFcnJvci5jb2RlID8/IG9wRXJyb3IucmVhc29uKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWxlZDogJHtvcE5hbWV9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgZXJyb3JDb2RlOiB0eXBlb2YgY29kZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IFN0cmluZyhjb2RlKSA6IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYSBMYWtlYmFzZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIHVudGlsIGBkb25lOiB0cnVlYC4gUmV0dXJuc1xuICogdGhlIGZpbmFsIG9wZXJhdGlvbiBlbnZlbG9wZSAod2hpY2ggbWF5IGNhcnJ5IGByZXNwb25zZWAgb3IgYGVycm9yYCkuXG4gKlxuICogVGhyb3dzIHdoZW46XG4gKiAgIC0gdGhlIHJlc3BvbnNlIGNhcnJpZXMgYW4gYGVycm9yYCBmaWVsZDtcbiAqICAgLSBgb3AubmFtZWAgaXMgbWlzc2luZyAobm90aGluZyB0byBwb2xsKTtcbiAqICAgLSB0aGUgdGltZW91dCBlbGFwc2VzIGJlZm9yZSBgZG9uZTogdHJ1ZWA7XG4gKiAgIC0gYHNpZ25hbGAgYWJvcnRzIG1pZC13YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yT3BlcmF0aW9uKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBvcDogT3BlcmF0aW9uLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8T3BlcmF0aW9uPiB7XG4gIGlmIChvcC5kb25lKSB7XG4gICAgaWYgKG9wLmVycm9yKSB7XG4gICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3AubmFtZSA/PyBcInVua25vd25cIiwgb3AuZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gb3A7XG4gIH1cbiAgY29uc3Qgb3BOYW1lID0gb3AubmFtZTtcbiAgaWYgKCFvcE5hbWUpIHtcbiAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIm9wZXJhdGlvbiBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IE9QRVJBVElPTl9USU1FT1VUX01TOyBhdHRlbXB0KyspIHtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgT1BFUkFUSU9OX1BPTExfTVMsIHNpZ25hbCk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS8ke29wTmFtZX1gLCBvcGVyYXRpb25TY2hlbWEsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBvcGVyYXRpb24gc3RhdHVzXCIsIHsgb3A6IG9wTmFtZSwgZG9uZTogY3VycmVudC5kb25lIH0pO1xuICAgIGlmIChjdXJyZW50LmRvbmUpIHtcbiAgICAgIGlmIChjdXJyZW50LmVycm9yKSB7XG4gICAgICAgIHRocm93IG9wZXJhdGlvbkZhaWxlZChvcE5hbWUsIGN1cnJlbnQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogb3BOYW1lLCB0aW1lb3V0TXM6IE9QRVJBVElPTl9USU1FT1VUX01TIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYGdldEVuZHBvaW50YCB1bnRpbCB0aGUgY29tcHV0ZSByZXBvcnRzIGEgdXNhYmxlXG4gKiBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgLiBgUkVBRFlgIGFuZCBgSURMRWAgYXJlIGJvdGggYWNjZXB0YWJsZSAtXG4gKiBgSURMRWAganVzdCBtZWFucyB0aGUgY29tcHV0ZSBoYXMgc2NhbGVkIHRvIHplcm8gYnV0IGEgY29ubmVjdGlvblxuICogd2lsbCB3YWtlIGl0LiBSZXR1cm5zIHRoZSBmaW5hbCBlbmRwb2ludCBwYXlsb2FkICh3aXRoIGBob3N0cy5ob3N0YCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRFbmRwb2ludFJlYWR5KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBlbmRwb2ludElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCBsYXN0OiBFbmRwb2ludCB8IG51bGwgPSBudWxsO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgbGFzdCA9IGF3YWl0IGdldEVuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50SWQsIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdGUgPSBsYXN0LnN0YXR1cz8uY3VycmVudF9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgJiYgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTLmhhcyhzdGF0ZSkpIHJldHVybiBsYXN0O1xuICAgIGlmIChsYXN0LnN0YXR1cz8uaG9zdHM/Lmhvc3QgJiYgc3RhdGUgIT09IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSkge1xuICAgICAgLy8gQ29tcHV0ZSBpcyBpbiBzb21lIG90aGVyIHN0YXRlIChTVEFSVElORywgZXRjLikgYnV0IGhvc3RuYW1lIGlzXG4gICAgICAvLyBhbHJlYWR5IHB1Ymxpc2hlZCAtIGdvb2QgZW5vdWdoIHRvIGNvbm5lY3Q7IGxha2ViYXNlJ3MgT0F1dGhcbiAgICAgIC8vIHRva2VuIHJlcXVlc3Qgd2lsbCB3YWtlIGl0LlxuICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogd2FpdGluZyBmb3IgZW5kcG9pbnRcIiwgeyBlbmRwb2ludElkLCBzdGF0ZSB9KTtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUywgc2lnbmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIGVuZHBvaW50IGRpZCBub3QgYmVjb21lIHJlYWR5OiAke2VuZHBvaW50SWR9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHByb2plY3QsXG4gICAgICBicmFuY2gsXG4gICAgICBlbmRwb2ludElkLFxuICAgICAgdGltZW91dE1zOiBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TLFxuICAgICAgbGFzdFN0YXRlOiBsYXN0Py5zdGF0dXM/LmN1cnJlbnRfc3RhdGUgPz8gXCJ1bmtub3duXCIsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBicmFuY2ggZm9yIGEgcHJvamVjdC4gUHJlZmVycyB0aGUgYnJhbmNoIGZsYWdnZWRcbiAqIGBzdGF0dXMuZGVmYXVsdDogdHJ1ZWAgKHNlcnZlci1zaWRlIGRlZmF1bHQsIHR5cGljYWxseSBgcHJvZHVjdGlvbmBcbiAqIHVubGVzcyB0aGUgcHJvamVjdCBvd25lciBjaGFuZ2VkIGl0KS4gRmFsbHMgYmFjayB0byB0aGUgb25seSBicmFuY2hcbiAqIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gT3RoZXJ3aXNlIHRocm93cyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0JyYW5jaChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgbGlzdEJyYW5jaGVzKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICBpZiAoYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgYnJhbmNoIGluIHByb2plY3QgJyR7cHJvamVjdH0nYCxcbiAgICAgIFwiVGhlIHByb2plY3QgaGFzIG5vIGJyYW5jaGVzOyBjcmVhdGUgb25lIG9yIHNldCBjb25maWcuYnJhbmNoLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZmxhZ2dlZCA9IGJyYW5jaGVzLmZpbmQoKGIpID0+IGIuc3RhdHVzPy5kZWZhdWx0ID09PSB0cnVlKTtcbiAgY29uc3QgY2hvaWNlID1cbiAgICBwYXJzZVJlc291cmNlUGF0aChmbGFnZ2VkPy5uYW1lKS5icmFuY2ggPz9cbiAgICAoYnJhbmNoZXMubGVuZ3RoID09PSAxID8gcGFyc2VSZXNvdXJjZVBhdGgoYnJhbmNoZXNbMF0hLm5hbWUpLmJyYW5jaCA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGJyYW5jaGVzXG4gICAgICAubWFwKChiKSA9PiBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWQpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgUHJvamVjdCAnJHtwcm9qZWN0fScgaGFzIG11bHRpcGxlIGJyYW5jaGVzIGFuZCBub25lIG1hcmtlZCBkZWZhdWx0OyBzZXQgY29uZmlnLmJyYW5jaCBvciBpbmNsdWRlIHRoZSBicmFuY2ggaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICAgICk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBicmFuY2hcIiwgeyBwcm9qZWN0LCBicmFuY2g6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcmltYXJ5IGVuZHBvaW50IGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBQcmVmZXJzXG4gKiBgc3RhdHVzLmVuZHBvaW50X3R5cGUgPT09IEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWA7IGZhbGxzIGJhY2sgdG9cbiAqIHRoZSBvbmx5IGVuZHBvaW50IHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gUmV0dXJucyBgeyBuYW1lLCBob3N0IH1gXG4gKiBzbyB0aGUgY2FsbGVyIGNhbiBwb3B1bGF0ZSBib3RoIGBMQUtFQkFTRV9FTkRQT0lOVGAgYW5kIGBQR0hPU1RgXG4gKiBmcm9tIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBob3N0Pzogc3RyaW5nIH0+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZW5kcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGVuZHBvaW50IGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBlbmRwb2ludHM7IGNyZWF0ZSBvbmUgb3Igc2V0IExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpbWFyeSA9XG4gICAgZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5lbmRwb2ludF90eXBlID09PSBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUpID8/XG4gICAgKGVuZHBvaW50cy5sZW5ndGggPT09IDEgPyBlbmRwb2ludHNbMF0gOiB1bmRlZmluZWQpO1xuICBpZiAoIXByaW1hcnk/Lm5hbWUpIHtcbiAgICBjb25zdCBuYW1lcyA9IGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBCcmFuY2ggaGFzIG5vIHByaW1hcnkgcmVhZC13cml0ZSBlbmRwb2ludDsgc2V0IExBS0VCQVNFX0VORFBPSU5UIG9yIGNvbmZpZy5lbmRwb2ludC4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSBwcmltYXJ5LnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZW5kcG9pbnRcIiwgeyBlbmRwb2ludDogcHJpbWFyeS5uYW1lLCBob3N0IH0pO1xuICByZXR1cm4geyBuYW1lOiBwcmltYXJ5Lm5hbWUsIGhvc3QgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBkZWZhdWx0IHBvc3RncmVzIGRhdGFiYXNlIGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBUaGVcbiAqIFBvc3RncmVzIGRhdGFiYXNlIE5BTUUgKGBzdGF0dXMucG9zdGdyZXNfZGF0YWJhc2VgKSBpcyB3aGF0XG4gKiBgUEdEQVRBQkFTRWAgbmVlZHMgLSB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgcmVzb3VyY2UgaWQsIHdoaWNoIGNhblxuICogdXNlIGEgZGlmZmVyZW50IHNlcGFyYXRvciAoZS5nLiByZXNvdXJjZSBgZGF0YWJyaWNrcy1wb3N0Z3Jlc2BcbiAqIHN1cmZhY2VzIGFzIGRhdGFiYXNlIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkuIFByZWZlcnNcbiAqIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCAodGhlIExha2ViYXNlIGRlZmF1bHQpLCBvdGhlcndpc2UgdGhlIG9ubHlcbiAqIGRhdGFiYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRGF0YWJhc2UoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGF0YWJhc2VzID0gYXdhaXQgbGlzdERhdGFiYXNlcyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZGF0YWJhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGRhdGFiYXNlIGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBkYXRhYmFzZXM7IGNyZWF0ZSBvbmUgb3Igc2V0IFBHREFUQUJBU0UuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IGRhdGFiYXNlc1xuICAgIC5tYXAoKGQpID0+IGQuc3RhdHVzPy5wb3N0Z3Jlc19kYXRhYmFzZSlcbiAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgbmFtZXMuZmluZCgobikgPT4gbiA9PT0gREVGQVVMVF9EQVRBQkFTRSkgPz8gKG5hbWVzLmxlbmd0aCA9PT0gMSA/IG5hbWVzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFjaG9pY2UpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgTXVsdGlwbGUgZGF0YWJhc2VzIGFuZCBubyAnJHtERUZBVUxUX0RBVEFCQVNFfSc7IHNldCBQR0RBVEFCQVNFIG9yIGNvbmZpZy5kYXRhYmFzZS4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogY2hvaWNlIH0pO1xuICByZXR1cm4gY2hvaWNlO1xufVxuIl19
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUVsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLFdBQVcsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFlBQVksSUFBSSxrQkFBa0IsRUFDbEMsU0FBUyxHQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFZLFNBQVMsQ0FBQztBQUM1QyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5Qiw4REFBOEQ7QUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxD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QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEgsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiByZXNvbHZlci5cbiAqXG4gKiBSZWFkcyB0aGUgc2FtZSBlbnYgdmFycyB0aGUgYGxha2ViYXNlYCBwbHVnaW4gY29uc3VtZXMgKGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCBgUEdQT1JUYCwgYFBHU1NMTU9ERWAsIGBMQUtFQkFTRV9FTkRQT0lOVGApIGFuZCBmaWxscyBpblxuICogd2hpY2hldmVyIHBpZWNlcyBhcmUgbWlzc2luZyB1c2luZyB0aGUgTGFrZWJhc2UgQXV0b3NjYWxpbmcgUkVTVCBBUElcbiAqIHVuZGVyIGAvYXBpLzIuMC9wb3N0Z3Jlcy9gIHZpYSB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LlxuICpcbiAqIGBMQUtFQkFTRV9FTkRQT0lOVGAgKGFuZCBgY29uZmlnLmVuZHBvaW50YCkgYWNjZXB0IGFueXRoaW5nXG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kcyAtIGNhbm9uaWNhbCByZXNvdXJjZSBwYXRocywgUG9zdGdyZXNcbiAqIFVSSXMsIGJhcmUgaG9zdG5hbWVzLCBvciBiYXJlIHByb2plY3QgaWRzLiBUaGUgcmVzb2x2ZXIgbGF5ZXJzXG4gKiB3aGF0ZXZlciBwaWVjZXMgZmFsbCBvdXQgb2YgcGFyc2luZyB1bmRlciBleHBsaWNpdCBjb25maWcgLyBlbnZcbiAqIHZhbHVlcywgdGhlbiBmaWxscyB0aGUgcmVtYWluaW5nIGdhcHMgdmlhIHRoZSBBUEk6XG4gKlxuICogICAxLiBSZXZlcnNlLWxvb2t1cDogd2hlbiBhIGhvc3QgaXMga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGggaXMsXG4gKiAgICAgIHNjYW4gcHJvamVjdHMgLT4gYnJhbmNoZXMgLT4gZW5kcG9pbnRzIGZvciBhIG1hdGNoaW5nXG4gKiAgICAgIGBzdGF0dXMuaG9zdHMuaG9zdGAgYW5kIHJlY292ZXIgdGhlIG93bmluZyBwcm9qZWN0L2JyYW5jaC9lbmRwb2ludC5cbiAqICAgMi4gUGljazogd2hlbiBhIHByb2plY3QgaXMga25vd24gYnV0IGNoaWxkIHJlc291cmNlcyBhcmVuJ3QsIHByZWZlclxuICogICAgICB0aGUgc2VydmVyLXNpZGUgZGVmYXVsdCAoYHN0YXR1cy5kZWZhdWx0YCwgYEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWAsXG4gKiAgICAgIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkgYW5kIGZhbGwgYmFjayB0byBcInRoZSBvbmx5IG9uZVwiIHdoZW4gYVxuICogICAgICBsaXN0aW5nIHJldHVybnMgYSBzaW5nbGUgcmVzdWx0LlxuICogICAzLiBBdXRvLWNyZWF0ZTogd2hlbiBubyBwcm9qZWN0cyBleGlzdCBhdCBhbGwsIGNyZWF0ZSBvbmUgd2hvc2VcbiAqICAgICAgaWQgZGVmYXVsdHMgdG8gYHByb2plY3QubmFtZSgpYCBzbHVnaWZpZWQgKG92ZXJyaWRlXG4gKiAgICAgIHdpdGggYGNvbmZpZy5hdXRvQ3JlYXRlOiBcIm15LWlkXCJgIG9yIGRpc2FibGUgd2l0aFxuICogICAgICBgY29uZmlnLmF1dG9DcmVhdGU6IGZhbHNlYCkuIFRoZSBjcmVhdGUgY2FsbCBpcyBpZGVtcG90ZW50IC0gYW5cbiAqICAgICAgYEFMUkVBRFlfRVhJU1RTYCByZXNwb25zZSBmcm9tIGEgY29uY3VycmVudCBib290IGlzIHRyZWF0ZWQgYXNcbiAqICAgICAgc3VjY2Vzcy4gVGhlbiBwb2xsIHRoZSBkZWZhdWx0IGVuZHBvaW50IHVudGlsIGl0IHJlcG9ydHNcbiAqICAgICAgYGN1cnJlbnRfc3RhdGVgIGBSRUFEWWAgb3IgYElETEVgLlxuICpcbiAqIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdyaXRlcyB0aGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG9cbiAqIGBwcm9jZXNzLmVudmAgc28gdGhlIGRvd25zdHJlYW0gYGxha2ViYXNlYCBwbHVnaW4gcGlja3MgdGhlbSB1cC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hcGkvd29ya3NwYWNlL3Bvc3RncmVzXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCxcbiAgZ2V0V29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIExha2ViYXNlUG9vbCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjb25maWdVdGlscywgcHJvamVjdFV0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgYXN5bmNVdGlscyxcbiAgZXJyb3JVdGlscyxcbiAgbG9nLFxuICBvYmplY3QsXG4gIG9wdGlvbnMgYXMgc2hhcmVkT3B0aW9ucyxcbiAgc3RyaW5nVXRpbHMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0b0NvbnRleHQgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLnRzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFkZHJlc3MsXG4gIHBhcnNlUmVzb3VyY2VQYXRoLFxuICBwYXJzZVNzbE1vZGUgYXMgcGFyc2VOYXRpdmVTc2xNb2RlLFxuICBTU0xfTU9ERVMsXG4gIHR5cGUgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzLFxuICB0eXBlIFNzbE1vZGUsXG59IGZyb20gXCIuL3BnYWRkcmVzcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJhc2UtcmVzb2x2ZXJcIik7XG5jb25zdCBBUElfQkFTRSA9IFwiL2FwaS8yLjAvcG9zdGdyZXNcIjtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDU0MzI7XG5jb25zdCBERUZBVUxUX1NTTF9NT0RFOiBTc2xNb2RlID0gXCJyZXF1aXJlXCI7XG5jb25zdCBERUZBVUxUX1BHX1ZFUlNJT04gPSAxNztcbi8qKiBMYWtlYmFzZSBwcm9qZWN0IGlkczogYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGAuICovXG5jb25zdCBQUk9KRUNUX0lEX01BWF9MRU4gPSA2MztcbmNvbnN0IE9QRVJBVElPTl9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IE9QRVJBVElPTl9QT0xMX01TID0gMl8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1BPTExfTVMgPSAyXzAwMDtcbi8qKiBDZWlsaW5nIG9uIGEgc2luZ2xlIGJhY2tvZmYgc3RlcCwgc28gYSBsb25nIHdhaXQgc3RpbGwgcG9sbHMgcmVndWxhcmx5LiAqL1xuY29uc3QgUE9MTF9NQVhfREVMQVlfTVMgPSAxNV8wMDA7XG5jb25zdCBQT0xMX0JBQ0tPRkZfRkFDVE9SID0gMS41O1xuLyoqIEZyYWN0aW9uIG9mIGVhY2ggZGVsYXkgYXBwbGllZCBhcyArLy0gaml0dGVyLCBzbyBjb25jdXJyZW50IGJvb3RzIGRlc3luY2hyb25pemUuICovXG5jb25zdCBQT0xMX0pJVFRFUl9SQVRJTyA9IDAuMjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmVuZHBvaW50X3R5cGVgIGZvciB0aGUgd3JpdGFibGUgcHJpbWFyeS4gKi9cbmNvbnN0IFJFQURfV1JJVEVfRU5EUE9JTlRfVFlQRSA9IFwiRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFXCI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCB2YWx1ZXMgdGhhdCB3aWxsIGFjY2VwdCBhIGNvbm5lY3Rpb24uICovXG5jb25zdCBDT05ORUNUQUJMRV9FTkRQT0lOVF9TVEFURVMgPSBuZXcgU2V0KFtcIlJFQURZXCIsIFwiSURMRVwiXSk7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCBiZWZvcmUgYSBob3N0bmFtZSBpcyBtZWFuaW5nZnVsLiAqL1xuY29uc3QgSU5JVElBTElaSU5HX0VORFBPSU5UX1NUQVRFID0gXCJJTklUSUFMSVpJTkdcIjtcbi8qKiBMYWtlYmFzZSdzIG93biBkZWZhdWx0IFBvc3RncmVzIGRhdGFiYXNlIG5hbWUuICovXG5jb25zdCBERUZBVUxUX0RBVEFCQVNFID0gXCJkYXRhYnJpY2tzX3Bvc3RncmVzXCI7XG5cbi8qKlxuICogVXNlci1zdXBwbGllZCBMYWtlYmFzZSBpbnB1dHMgKGNvbmZpZyBvciBlbnYpIGJlZm9yZSBhbnkgQVBJIHJlc29sdXRpb24uXG4gKiBFeHRlbmRzIHtAbGluayBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHN9IHdpdGggcmVzb2x2ZXItb25seSBvcHRpb25zLlxuICoge0BsaW5rIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb259IGZpbGxzIGdhcHMgZnJvbSB0aGUgTGFrZWJhc2UgQVBJIHdoZW5cbiAqIGl0IGhhcyBlbm91Z2ggY29udGV4dCAodHlwaWNhbGx5IGEgYHByb2plY3RgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVJlc29sdmVySW5wdXRzIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgLyoqIEF1dGgtcmVzb2x2ZWQgcHJvZmlsZSB1c2VkIG9ubHkgZm9yIERhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRpb24uICovXG4gIGJ1bmRsZVByb2ZpbGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGF0IHRvIGRvIHdoZW4gbm8gcHJvamVjdCBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZSBhdCBhbGwuXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb21cbiAgICogICB7QGxpbmsgcHJvamVjdC5uYW1lfSAodGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gICAqICAgbmFtZSkgc2x1Z2lmaWVkIHRvIExha2ViYXNlIGlkIGNvbnN0cmFpbnRzLCB0aGVuIGNyZWF0ZSBpdC5cbiAgICogLSBgc3RyaW5nYDogY3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCB0aGlzIGV4YWN0IGlkLlxuICAgKiAtIGBmYWxzZWA6IHNraXAgY3JlYXRpb24gYW5kIHRocm93IHdpdGggYSBjbGVhciBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgYXV0b0NyZWF0ZT86IHN0cmluZyB8IGZhbHNlO1xufVxuXG4vKiogRnVsbHktcmVzb2x2ZWQgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VDb25uZWN0aW9uIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgcG9ydDogbnVtYmVyO1xuICBzc2xNb2RlOiBTc2xNb2RlO1xufVxuXG4vKipcbiAqIENhcHR1cmUgQXBwS2l0J3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbC5cbiAqXG4gKiBDYWxsIHRoaXMgZHVyaW5nIGBzZXR1cDpjb21wbGV0ZWAsIG91dHNpZGUgYW55IGBhc1VzZXIoKWAgc2NvcGUuIEFwcEtpdCdzXG4gKiBleHBvcnRlZCBwb29sIHJvdXRlcyBkeW5hbWljYWxseSBieSByZXF1ZXN0IGNvbnRleHQsIGJ1dCBpdHMgcnVudGltZVxuICogYGFjdGl2ZVBvb2woKWAgbWV0aG9kIHJldHVybnMgdGhlIGFscmVhZHktY3JlYXRlZCB1bmRlcmx5aW5nIHBvb2wgc2VsZWN0ZWQgaW5cbiAqIHRoZSBjdXJyZW50IGNvbnRleHQuIENhcHR1cmluZyBpdCBvbmNlIGF0IHN0YXJ0dXAgcGlucyBhcHBsaWNhdGlvbi1vd25lZFxuICogc3RvcmFnZSB0byB0aGUgc2VydmljZSBwcmluY2lwYWwgd2l0aG91dCBjcmVhdGluZyBhbm90aGVyIHBvb2wgb3IgY29ubmVjdGlvbi5cbiAqXG4gKiBBIGZ1dHVyZSBBcHBLaXQgdmVyc2lvbiBtYXkgZXhwb3J0IGEgZml4ZWQgcG9vbCBkaXJlY3RseTsgaW4gdGhhdCBjYXNlIHRoZVxuICogcG9vbCBoYXMgbm8gYGFjdGl2ZVBvb2woKWAgbWV0aG9kIGFuZCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlU2VydmljZVByaW5jaXBhbFBvb2wocG9vbDogTGFrZWJhc2VQb29sKTogTGFrZWJhc2VQb29sIHtcbiAgY29uc3Qgcm91dGluZ1Bvb2wgPSBwb29sIGFzIExha2ViYXNlUG9vbCAmIHsgYWN0aXZlUG9vbD86ICgpID0+IExha2ViYXNlUG9vbCB9O1xuICByZXR1cm4gcm91dGluZ1Bvb2wuYWN0aXZlUG9vbD8uY2FsbChwb29sKSA/PyBwb29sO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGZpZWxkIG9mIHRoZSBMYWtlYmFzZSBSRVNUIHBheWxvYWRzIGlzIG1vZGVsbGVkIGFzIG9wdGlvbmFsIGFuZFxuICogdmFsaWRhdGVkIGF0IHRoZSBib3VuZGFyeSByYXRoZXIgdGhhbiBhc3NlcnRlZCB3aXRoIGEgY2FzdDogdGhlIHBpY2tlcnMgYmVsb3dcbiAqIGJyYW5jaCBvbiBgc3RhdHVzLipgLCBhbmQgYSBzaGFwZSBjaGFuZ2UgdXBzdHJlYW0gc2hvdWxkIHN1cmZhY2UgYXMgb25lIGxvdWRcbiAqIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBhbiBgdW5kZWZpbmVkYCB0aHJlZSBmcmFtZXMgYXdheS4gRW51bS1zaGFwZWQgZmllbGRzXG4gKiBzdGF5IGBzdHJpbmdgIHNvIGEgbmV3bHkgYWRkZWQgc3RhdGUgZG9lcyBub3QgZmFpbCB0aGUgd2hvbGUgcmVzcG9uc2UuXG4gKi9cbmNvbnN0IHByb2plY3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkZ1bGwgcmVzb3VyY2UgcGF0aDogcHJvamVjdHMve3B9LlwiKSxcbn0pO1xudHlwZSBQcm9qZWN0ID0gei5pbmZlcjx0eXBlb2YgcHJvamVjdFNjaGVtYT47XG5cbmNvbnN0IGVuZHBvaW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZW5kcG9pbnRzL3tlfS5cIiksXG4gIHVpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU3RhYmxlIGVuZHBvaW50IHVpZCBhc3NpZ25lZCBieSBMYWtlYmFzZS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZW5kcG9pbnRfdHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRW5kcG9pbnQgcm9sZSwgc3VjaCBhcyBFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEUuXCIpLFxuICAgICAgaG9zdHM6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgaG9zdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV3JpdGFibGUgcHJpbWFyeSBob3N0bmFtZS5cIiksXG4gICAgICAgICAgcmVhZF9vbmx5X2hvc3Q6IHpcbiAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgIC5kZXNjcmliZShcIlJlYWQtb25seSByZXBsaWNhIGhvc3RuYW1lIHdoZW4gcHJlc2VudC5cIiksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlJlc29sdmVkIGhvc3RuYW1lcy4gaG9zdHMuaG9zdCBpcyB0aGUgd3JpdGFibGUgcHJpbWFyeS5cIiksXG4gICAgICBjdXJyZW50X3N0YXRlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21wdXRlIHN0YXRlOiBJTklUSUFMSVpJTkcsIFNUQVJUSU5HLCBSRUFEWSwgSURMRSwgYW5kIGxhdGVyIHZhbHVlcy5cIiksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIlNlcnZlci1zaWRlIHN0YXRlLiBSdW50aW1lIGhvc3RuYW1lcyBsaXZlIGhlcmUsIG5vdCBpbiB0aGUgc3BlYyBibG9jay5cIiksXG59KTtcbnR5cGUgRW5kcG9pbnQgPSB6LmluZmVyPHR5cGVvZiBlbmRwb2ludFNjaGVtYT47XG5cbmNvbnN0IGJyYW5jaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9LlwiKSxcbiAgc3RhdHVzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBkZWZhdWx0OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiVHJ1ZSBmb3IgdGhlIHByb2plY3QncyBkZWZhdWx0IGJyYW5jaCwgc3VjaCBhcyBwcm9kdWN0aW9uLlwiKSxcbiAgICAgIGN1cnJlbnRfc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkJyYW5jaCBjb21wdXRlIHN0YXRlIHJlcG9ydGVkIGJ5IExha2ViYXNlLlwiKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIEJyYW5jaCA9IHouaW5mZXI8dHlwZW9mIGJyYW5jaFNjaGVtYT47XG5cbmNvbnN0IGRhdGFiYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZGF0YWJhc2VzL3tkfS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgcG9zdGdyZXNfZGF0YWJhc2U6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkFjdHVhbCBQb3N0Z3JlcyBkYXRhYmFzZSBuYW1lIHVzZWQgYXMgUEdEQVRBQkFTRS4gTWF5IGRpZmZlciBmcm9tIHRoZSByZXNvdXJjZSBpZC5cIixcbiAgICAgICAgKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIERhdGFiYXNlID0gei5pbmZlcjx0eXBlb2YgZGF0YWJhc2VTY2hlbWE+O1xuXG4vKipcbiAqIExha2ViYXNlIFJFU1QgbGlzdCByZXNwb25zZXMgZm9sbG93IHRoZSBHb29nbGUgQUlQIGNvbnZlbnRpb246XG4gKiBgeyA8cGx1cmFsLXJlc291cmNlPjogVFtdLCBuZXh0X3BhZ2VfdG9rZW4/OiBzdHJpbmcgfWAuIFdlIG9ubHkgcmVhZFxuICogdGhlIGZpcnN0IHBhZ2U7IGZvciBhdXRvLWNvbmZpZydzIFwicGljayBzb21ldGhpbmcgc2Vuc2libGVcIiBzZW1hbnRpY3MgdGhlXG4gKiBjYXAgaXMgZmluZS5cbiAqL1xuY29uc3QgbGlzdFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuZXh0X3BhZ2VfdG9rZW46IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIkFJUCBwYWdlIHRva2VuLiBPbmx5IHRoZSBmaXJzdCBwYWdlIGlzIGNvbnN1bWVkLlwiKSxcbiAgcHJvamVjdHM6IHouYXJyYXkocHJvamVjdFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgYnJhbmNoZXM6IHouYXJyYXkoYnJhbmNoU2NoZW1hKS5vcHRpb25hbCgpLFxuICBlbmRwb2ludHM6IHouYXJyYXkoZW5kcG9pbnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGRhdGFiYXNlczogei5hcnJheShkYXRhYmFzZVNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIExvbmctcnVubmluZyBvcGVyYXRpb24gZW52ZWxvcGUgcmV0dXJuZWQgYnkgbXV0YXRpbmcgUkVTVCBjYWxscy5cbiAqIGBkb25lOiB0cnVlYCBtZWFucyB0ZXJtaW5hbDsgY2hlY2sgYGVycm9yYCBiZWZvcmUgcmVhZGluZyBgcmVzcG9uc2VgLlxuICovXG5jb25zdCBvcGVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk9wZXJhdGlvbiByZXNvdXJjZSBuYW1lLlwiKSxcbiAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHRlcm1pbmFsLlwiKSxcbiAgZXJyb3I6IHoudW5rbm93bigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBwYXlsb2FkIHByZXNlbnQgd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cIiksXG4gIHJlc3BvbnNlOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVzdWx0IHBheWxvYWQgcHJlc2VudCB3aGVuIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLlwiKSxcbn0pO1xudHlwZSBPcGVyYXRpb24gPSB6LmluZmVyPHR5cGVvZiBvcGVyYXRpb25TY2hlbWE+O1xuXG4vKiogYFBHUE9SVGAgbXVzdCBsYW5kIGluc2lkZSB0aGUgVENQIHBvcnQgcmFuZ2UuICovXG5jb25zdCBwb3J0U2NoZW1hID0gc2hhcmVkT3B0aW9ucy50Y3BQb3J0U2NoZW1hO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgYFBHUE9SVGAtc2hhcGVkIHZhbHVlLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQsIGFuZCB0aHJvd3NcbiAqIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gbmFtaW5nIGBQR1BPUlRgIGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIFRDUFxuICogcG9ydCwgc28gYSB0eXBvIGNhbm5vdCByZWFjaCB0aGUgY29ubmVjdGlvbiByZWNvcmQgYXMgYE5hTmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBvcnQodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBwb3J0U2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJQR1BPUlRcIixcbiAgICAgIHZhbHVlLFxuICAgICAgYGEgVENQIHBvcnQgYmV0d2VlbiAxIGFuZCAke2NvbmZpZ1V0aWxzLk1BWF9UQ1BfUE9SVH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZC5kYXRhO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgYFBHU1NMTU9ERWAtc2hhcGVkIHZhbHVlLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQsIGFuZFxuICogdGhyb3dzIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gbmFtaW5nIGBQR1NTTE1PREVgIGZvciBhbiB1bnN1cHBvcnRlZCBtb2RlXG4gKiByYXRoZXIgdGhhbiBoYW5kaW5nIGBwZ2AgYSB2YWx1ZSBpdCB3aWxsIHJlamVjdCBhdCBjb25uZWN0IHRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNzbE1vZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFNzbE1vZGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VOYXRpdmVTc2xNb2RlKHZhbHVlKTtcbiAgaWYgKHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcIlBHU1NMTU9ERVwiLCB2YWx1ZSwgU1NMX01PREVTLmpvaW4oXCIsIFwiKSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBEZWxheSBiZWZvcmUgdGhlIG5leHQgcG9sbCBhdHRlbXB0OiBleHBvbmVudGlhbCBiYWNrb2ZmIGNhcHBlZCBhdFxuICoge0BsaW5rIFBPTExfTUFYX0RFTEFZX01TfSwgcGx1cyBqaXR0ZXIgc28gc2V2ZXJhbCBhcHBzIGJvb3RpbmcgYWdhaW5zdCB0aGVcbiAqIHNhbWUgd29ya3NwYWNlIGRvIG5vdCByZXRyeSBpbiBsb2Nrc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRQb2xsRGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBiYXNlTXM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBNYXRoLm1pbihiYXNlTXMgKiBQT0xMX0JBQ0tPRkZfRkFDVE9SICoqIGF0dGVtcHQsIFBPTExfTUFYX0RFTEFZX01TKTtcbiAgY29uc3Qgaml0dGVyID0gYmFja29mZiAqIFBPTExfSklUVEVSX1JBVElPICogKE1hdGgucmFuZG9tKCkgKiAyIC0gMSk7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGJhY2tvZmYgKyBqaXR0ZXIpKTtcbn1cblxuLyoqXG4gKiBXYWl0IG91dCB7QGxpbmsgbmV4dFBvbGxEZWxheX0gYmVmb3JlIHRoZSBuZXh0IGF0dGVtcHQuIFJlamVjdHMgd2l0aCB0aGVcbiAqIHNpZ25hbCdzIHJlYXNvbiB3aGVuIHRoZSBjYWxsZXIgY2FuY2VscyBtaWQtd2FpdCwgc28gYSBwb2xsIGxvb3AgdW53aW5kc1xuICogaW5zdGVhZCBvZiBmaW5pc2hpbmcgaXRzIGJhY2tvZmYgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsRGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBiYXNlTXM6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGFzeW5jVXRpbHMuc2xlZXAobmV4dFBvbGxEZWxheShhdHRlbXB0LCBiYXNlTXMpLCBzaWduYWwpO1xufVxuXG4vKipcbiAqIFB1bGwgcmVzb2x2ZXIgaW5wdXRzIGZyb20gYHByb2Nlc3MuZW52YCwgcGFyc2UgdGhlIGFkZHJlc3MgYmxvYiwgYW5kXG4gKiBsYXllciBleHBsaWNpdCBjb25maWcgb24gdG9wIHdpdGggdGhpcyBwcmVjZWRlbmNlOlxuICpcbiAqICAgYGNvbmZpZy48ZmllbGQ+YCA+IGBjb25maWdVdGlscy5yZXNvbHZlVmFsdWVgIChzaGFyZWQgY29uZmlnIHNvdXJjZXMpID5cbiAqICAgd2hhdGV2ZXIge0BsaW5rIHBhcnNlQWRkcmVzc30gcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiAgIGBlbmRwb2ludGAgLyBgTEFLRUJBU0VfRU5EUE9JTlRgIGJsb2IuXG4gKlxuICogU2V0IGBjb25maWcuZW5kcG9pbnRgIChvciBgTEFLRUJBU0VfRU5EUE9JTlRgKSB0byBhbnkgaW5wdXRcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzOiBjYW5vbmljYWwgcmVzb3VyY2UgcGF0aHMsIFBvc3RncmVzXG4gKiBVUklzLCBiYXJlIGhvc3RuYW1lcywgb3IgYmFyZSBwcm9qZWN0IGlkcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMYWtlYmFzZUlucHV0cyhcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbik6IFByb21pc2U8TGFrZWJhc2VSZXNvbHZlcklucHV0cz4ge1xuICBjb25zdCBjb25maWdPcHRpb25zID0geyBidW5kbGVQcm9maWxlOiBjb25maWc/LmJ1bmRsZVByb2ZpbGUgfTtcbiAgY29uc3QgcmF3QWRkcmVzcyA9XG4gICAgY29uZmlnPy5lbmRwb2ludCA/P1xuICAgIGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcbiAgICAgIHNoYXJlZE9wdGlvbnMuZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMubGFrZWJhc2VFbmRwb2ludCxcbiAgICAgIGNvbmZpZ09wdGlvbnMsXG4gICAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VBZGRyZXNzKHJhd0FkZHJlc3MpO1xuICBjb25zdCBwb3J0RW52ID0gcGFyc2VQb3J0KGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHUE9SVFwiLCBjb25maWdPcHRpb25zKSk7XG4gIGNvbnN0IHNzbE1vZGVFbnYgPSBwYXJzZVNzbE1vZGUoY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlKFwiUEdTU0xNT0RFXCIsIGNvbmZpZ09wdGlvbnMpKTtcbiAgY29uc3QgY29uZmlndXJlZFNzbE1vZGUgPSBwYXJzZVNzbE1vZGUoY29uZmlnPy5zc2xNb2RlKTtcbiAgY29uc3QgcGFyc2VkU3NsTW9kZSA9IHBhcnNlU3NsTW9kZShwYXJzZWQuc3NsTW9kZSk7XG4gIHJldHVybiB7XG4gICAgcHJvamVjdDogY29uZmlnPy5wcm9qZWN0ID8/IHBhcnNlZC5wcm9qZWN0LFxuICAgIGJyYW5jaDogY29uZmlnPy5icmFuY2ggPz8gcGFyc2VkLmJyYW5jaCxcbiAgICAvLyBPbmx5IGNhbm9uaWNhbCBlbmRwb2ludCByZXNvdXJjZSBwYXRocyBzdXJ2aXZlIGhlcmU7IFVSSXMgYW5kXG4gICAgLy8gYmFyZSBob3N0bmFtZXMgc2V0IGBob3N0YCBpbnN0ZWFkIGFuZCBsZWF2ZSBgZW5kcG9pbnRgIHVuZGVmaW5lZFxuICAgIC8vIHVudGlsIHRoZSBSRVNUIHJlc29sdmVyIGZpbGxzIGl0IGluLlxuICAgIGVuZHBvaW50OiBwYXJzZWQuZW5kcG9pbnQsXG4gICAgZGF0YWJhc2U6XG4gICAgICBjb25maWc/LmRhdGFiYXNlID8/IGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHREFUQUJBU0VcIiwgY29uZmlnT3B0aW9ucykgPz8gcGFyc2VkLmRhdGFiYXNlLFxuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR0hPU1RcIiwgY29uZmlnT3B0aW9ucykgPz8gcGFyc2VkLmhvc3QsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBvcnRFbnYgPz8gcGFyc2VkLnBvcnQsXG4gICAgc3NsTW9kZTogY29uZmlndXJlZFNzbE1vZGUgPz8gc3NsTW9kZUVudiA/PyBwYXJzZWRTc2xNb2RlLFxuICAgIGF1dG9DcmVhdGU6IGNvbmZpZz8uYXV0b0NyZWF0ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZnVsbHktcG9wdWxhdGVkIFBvc3RncmVzIGNvbm5lY3Rpb24gcmVjb3JkIGZyb20gY29uZmlnICsgZW52LlxuICpcbiAqIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBuZXR3b3JrIHRyYWZmaWMgd2hlbiBlbnYgYWxyZWFkeSBzdXBwbGllc1xuICogYGVuZHBvaW50YCwgYGhvc3RgLCBhbmQgYGRhdGFiYXNlYC4gT3RoZXJ3aXNlIGlzc3VlcyBSRVNUIGNhbGxzIGFuZFxuICogbWF5IGF1dG8tY3JlYXRlIGEgcHJvamVjdCAoc2VlIG1vZHVsZSBkb2NzdHJpbmcpLlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgZXZlcnkgUkVTVCBjYWxsIGFuZCBpbnRlci1wb2xsIHNsZWVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBsYWtlYmFzZVJlc29sdmVyLnJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gKiAgIHsgYXV0b0NyZWF0ZTogZmFsc2UgfSxcbiAqICAgQWJvcnRTaWduYWwudGltZW91dCg2MF8wMDApLFxuICogKTtcbiAqIGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24+IHtcbiAgY29uc3QgaW5wdXRzID0gYXdhaXQgcmVhZExha2ViYXNlSW5wdXRzKGNvbmZpZyk7XG4gIGxldCB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0IH0gPSBpbnB1dHM7XG4gIGNvbnN0IHBvcnQgPSBpbnB1dHMucG9ydCA/PyBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHNzbE1vZGUgPSBwYXJzZVNzbE1vZGUoaW5wdXRzLnNzbE1vZGUpID8/IERFRkFVTFRfU1NMX01PREU7XG5cbiAgLy8gUmVzb3VyY2UgcGF0aHMgbWF5IGNhcnJ5IHJlZHVuZGFudCBpbmZvOyBoYXJ2ZXN0IHByb2plY3QvYnJhbmNoXG4gIC8vIGZyb20gYW55IGNhbm9uaWNhbCBwYXRoIHRoYXQgc251Y2sgaW4gdmlhIFBHREFUQUJBU0Ugb3Igc2ltaWxhci5cbiAgaWYgKGVuZHBvaW50ICYmICghcHJvamVjdCB8fCAhYnJhbmNoKSkge1xuICAgIGNvbnN0IHBhcnNlZEVuZHBvaW50ID0gcGFyc2VBZGRyZXNzKGVuZHBvaW50KTtcbiAgICBwcm9qZWN0ID8/PSBwYXJzZWRFbmRwb2ludC5wcm9qZWN0O1xuICAgIGJyYW5jaCA/Pz0gcGFyc2VkRW5kcG9pbnQuYnJhbmNoO1xuICB9XG4gIGlmIChkYXRhYmFzZSAmJiAoIXByb2plY3QgfHwgIWJyYW5jaCkpIHtcbiAgICBjb25zdCBwYXJzZWREYXRhYmFzZSA9IHBhcnNlQWRkcmVzcyhkYXRhYmFzZSk7XG4gICAgcHJvamVjdCA/Pz0gcGFyc2VkRGF0YWJhc2UucHJvamVjdDtcbiAgICBicmFuY2ggPz89IHBhcnNlZERhdGFiYXNlLmJyYW5jaDtcbiAgICBpZiAocGFyc2VkRGF0YWJhc2UuZGF0YWJhc2VSZXNvdXJjZUlkKSB7XG4gICAgICBkYXRhYmFzZSA9IHBhcnNlZERhdGFiYXNlLmRhdGFiYXNlUmVzb3VyY2VJZDtcbiAgICB9XG4gIH1cblxuICAvLyBBbHJlYWR5IGNvbXBsZXRlOiBza2lwIGV2ZXJ5IFJFU1QgY2FsbC5cbiAgaWYgKGVuZHBvaW50ICYmIGhvc3QgJiYgZGF0YWJhc2UpIHtcbiAgICByZXR1cm4geyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCwgcG9ydCwgc3NsTW9kZSB9O1xuICB9XG5cbiAgY29uc3Qgd3MgPSBnZXRXb3Jrc3BhY2VDbGllbnQoe30pO1xuXG4gIC8vIEhvc3Qga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGg6IHNjYW4gdGhlIHdvcmtzcGFjZSB0byBmaW5kIHdoaWNoXG4gIC8vIGVuZHBvaW50IG93bnMgdGhpcyBob3N0IHNvIHdlIGNhbiBwb3B1bGF0ZSBMQUtFQkFTRV9FTkRQT0lOVC5cbiAgaWYgKCFwcm9qZWN0ICYmIGhvc3QpIHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IGZpbmRFbmRwb2ludEJ5SG9zdCh3cywgaG9zdCwgc2lnbmFsKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHByb2plY3QgPSBmb3VuZC5wcm9qZWN0O1xuICAgICAgYnJhbmNoID0gZm91bmQuYnJhbmNoO1xuICAgICAgZW5kcG9pbnQgPz89IGZvdW5kLmVuZHBvaW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vIHByb2plY3QgYW55d2hlcmUgaW4gY29uZmlnL2Vudi9hZGRyZXNzOiBsaXN0LCBwaWNrLCBvciBjcmVhdGUuXG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBhd2FpdCBwaWNrT3JDcmVhdGVQcm9qZWN0KHdzLCBjb25maWc/LmF1dG9DcmVhdGUsIHNpZ25hbCk7XG4gIH1cblxuICBpZiAoIWJyYW5jaCkge1xuICAgIGJyYW5jaCA9IGF3YWl0IHBpY2tCcmFuY2god3MsIHByb2plY3QsIHNpZ25hbCk7XG4gIH1cblxuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgY29uc3QgZXAgPSBhd2FpdCBwaWNrRW5kcG9pbnQod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgICBlbmRwb2ludCA9IGVwLm5hbWU7XG4gICAgaG9zdCA/Pz0gZXAuaG9zdDtcbiAgfVxuXG4gIGlmICghaG9zdCAmJiBlbmRwb2ludCkge1xuICAgIGNvbnN0IHBhcnNlZEVuZHBvaW50ID0gcGFyc2VBZGRyZXNzKGVuZHBvaW50KTtcbiAgICBpZiAocGFyc2VkRW5kcG9pbnQucHJvamVjdCAmJiBwYXJzZWRFbmRwb2ludC5icmFuY2ggJiYgcGFyc2VkRW5kcG9pbnQuZW5kcG9pbnRJZCkge1xuICAgICAgY29uc3QgZXAgPSBhd2FpdCB3YWl0RW5kcG9pbnRSZWFkeShcbiAgICAgICAgd3MsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LnByb2plY3QsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LmJyYW5jaCxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQuZW5kcG9pbnRJZCxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIGhvc3QgPSBlcC5zdGF0dXM/Lmhvc3RzPy5ob3N0O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBob3N0IGZyb20gZW5kcG9pbnRcIiwgeyBob3N0IH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGF0YWJhc2UpIHtcbiAgICBkYXRhYmFzZSA9IGF3YWl0IHBpY2tEYXRhYmFzZSh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QsIHBvcnQsIHNzbE1vZGUgfTtcbn1cblxuLyoqXG4gKiBXcml0ZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0byBgcHJvY2Vzcy5lbnZgIHNvIHRoZSBgbGFrZWJhc2VgIHBsdWdpblxuICogKHdoaWNoIHJlYWRzIGVudiBkaXJlY3RseSkgcGlja3MgdGhlbSB1cCBkdXJpbmcgaXRzIG93biBgc2V0dXAoKWAuXG4gKiBFeGlzdGluZyBlbnYgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQ7IG9ubHkgbWlzc2luZyBrZXlzIGFyZSBmaWxsZWQgaW4sXG4gKiB3aGljaCBrZWVwcyBleHBsaWNpdCBvdmVycmlkZXMgYXV0aG9yaXRhdGl2ZS5cbiAqXG4gKiBUaGlzIGRvZXMgTk9UIHNldCBgUEdVU0VSYCwgd2hpY2ggbmVlZHMgYW4gYXdhaXQgLSBzZWVcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBmb3IgdGhlIGNvbXBsZXRlIHNldCBhIFBvc3RncmVzIHBvb2wgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUxha2ViYXNlVG9FbnYocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IHZvaWQge1xuICBpZiAocmVzb2x2ZWQuZW5kcG9pbnQpIHtcbiAgICBwcm9jZXNzLmVudltzaGFyZWRPcHRpb25zLmRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnRdID8/PSByZXNvbHZlZC5lbmRwb2ludDtcbiAgfVxuICBpZiAocmVzb2x2ZWQuaG9zdCkgcHJvY2Vzcy5lbnYuUEdIT1NUID8/PSByZXNvbHZlZC5ob3N0O1xuICBpZiAocmVzb2x2ZWQuZGF0YWJhc2UpIHByb2Nlc3MuZW52LlBHREFUQUJBU0UgPz89IHJlc29sdmVkLmRhdGFiYXNlO1xuICBwcm9jZXNzLmVudi5QR1BPUlQgPz89IFN0cmluZyhyZXNvbHZlZC5wb3J0KTtcbiAgcHJvY2Vzcy5lbnYuUEdTU0xNT0RFID8/PSByZXNvbHZlZC5zc2xNb2RlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbm5lY3Rpb24gQU5EIGFwcGx5IGV2ZXJ5IFBvc3RncmVzIGVudiB2YXIgYSBMYWtlYmFzZSBwb29sIG5lZWRzLFxuICogcmV0dXJuaW5nIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uIHBsdXMgdGhlIHVzZXJuYW1lIHRoYXQgd2FzIGFwcGxpZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgd2hvbGUgc2V0LCB3aGljaCBpcyB0aGUgcG9pbnQgb2YgaGF2aW5nIG9uZSBmdW5jdGlvbiBmb3IgaXQ6XG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRocm93cyB1bmxlc3MgYExBS0VCQVNFX0VORFBPSU5UYCwgYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsICoqYW5kKiogYSB1c2VybmFtZSAoYFBHVVNFUmAsIG9yIGBEQVRBQlJJQ0tTX0NMSUVOVF9JRGAgZm9yIGFcbiAqIHNlcnZpY2UgcHJpbmNpcGFsKSBhcmUgYWxsIHByZXNlbnQsIGFuZCBhIERhdGFicmlja3MgQXBwIGBwb3N0Z3Jlc2AgcmVzb3VyY2VcbiAqIGJpbmRpbmcgc3VwcGxpZXMgb25seSB0aGUgZmlyc3QuIEFueXRoaW5nIHRoYXQgd2FudHMgYSB3b3JraW5nIHBvb2wgLSB0aGVcbiAqIGBsYWtlYmFzZWAgcGx1Z2luLCBvciBBcHBLaXQncyBQRVJTSVNURU5UIGNhY2hlLCB3aGljaCBxdWlldGx5IGRlZ3JhZGVzIHRvXG4gKiBpbi1tZW1vcnkgd2hlbiB0aGUgcG9vbCBjYW5ub3QgYmUgYnVpbHQgLSBuZWVkcyBhbGwgZm91ciwgc28gY2FsbGVycyBzaG91bGQgbm90XG4gKiBwYWlyIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdpdGggdGhlaXIgb3duIHVzZXJuYW1lIGxvb2t1cC5cbiAqXG4gKiBgUEdVU0VSYCBpcyBhcHBsaWVkIHdpdGggYD8/PWAgbGlrZSB0aGUgcmVzdCwgc28gYW4gZXhwbGljaXRseSBjb25maWd1cmVkIHZhbHVlXG4gKiBzdGF5cyBhdXRob3JpdGF0aXZlLiBUaGUgbG9va3VwIHJldHVybnMgYHVuZGVmaW5lZGAgcmF0aGVyIHRoYW4gdGhyb3dpbmcgd2hlbiBpdFxuICogY2Fubm90IGRldGVybWluZSBhIHVzZXIsIGxlYXZpbmcgdGhlIHBvb2wgdG8gcmVzb2x2ZSBpdHMgb3duLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gRW5vdWdoIGZvciBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRvIGJ1aWxkIGEgcG9vbC5cbiAqIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5hcHBseUxha2ViYXNlRW52KHsgYXV0b0NyZWF0ZTogZmFsc2UgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUxha2ViYXNlRW52KFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8eyByZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uOyB1c2VyPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKGNvbmZpZywgc2lnbmFsKTtcbiAgYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCh7fSk7XG4gIGlmICh1c2VyKSBwcm9jZXNzLmVudi5QR1VTRVIgPz89IHVzZXI7XG4gIHJldHVybiB7IHJlc29sdmVkLCAuLi4odXNlciA/IHsgdXNlciB9IDoge30pIH07XG59XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ya3NwYWNlQ2xpZW50PjtcblxuLyoqIFRoZSBTREsgYENvbnRleHRgIGFjY2VwdGVkIGJ5IHRoZSB3b3Jrc3BhY2UgY2xpZW50J3Mgb3duIGNvcHkgb2YgdGhlIFNESy4gKi9cbnR5cGUgQXBpUmVxdWVzdENvbnRleHQgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPFdvcmtzcGFjZUNsaWVudFtcImFwaUNsaWVudFwiXVtcInJlcXVlc3RcIl0+WzFdPjtcblxuLyoqXG4gKiBBZGFwdCBhbiB7QGxpbmsgQWJvcnRTaWduYWx9IGludG8gdGhlIGFwaSBjbGllbnQncyBjYW5jZWxsYXRpb24gY29udGV4dC5cbiAqIEFwcEtpdCByZXNvbHZlcyBhIGRpZmZlcmVudCBjb3B5IG9mIGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYCB0aGFuIHRoaXNcbiAqIHBhY2thZ2UgZG9lcywgYW5kIGBDb250ZXh0YCBjYXJyaWVzIGEgcHJpdmF0ZSBmaWVsZCwgc28gdGhlIHR3byBkZWNsYXJhdGlvbnNcbiAqIGFyZSBub21pbmFsbHkgaW5jb21wYXRpYmxlIGV2ZW4gdGhvdWdoIHRoZSBhcGkgY2xpZW50IG9ubHkgcmVhZHNcbiAqIGBjYW5jZWxsYXRpb25Ub2tlbmAgYW5kIGBsb2dnZXJgIG9mZiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXF1ZXN0Q29udGV4dChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogQXBpUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2lnbmFsID8gKHRvQ29udGV4dChzaWduYWwpIGFzIHVua25vd24gYXMgQXBpUmVxdWVzdENvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgTGFrZWJhc2UgUkVTVCBib2R5LiBUaGUgZnVsbCBwYXlsb2FkIGlzIGxvZ2dlZCByYXRoZXIgdGhhbiB0aHJvd25cbiAqIHNvIGEgY2xpZW50IG5ldmVyIHJlY2VpdmVzIHVwc3RyZWFtIGRldGFpbC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VSZXNwb25zZTxUPihzY2hlbWE6IHouWm9kVHlwZTxUPiwgcGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duKTogVCB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoYm9keSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IHVuZXhwZWN0ZWQgTGFrZWJhc2UgQVBJIHJlc3BvbnNlXCIsIHtcbiAgICBwYXRoLFxuICAgIGlzc3VlczogcGFyc2VkLmVycm9yLmlzc3VlcyxcbiAgfSk7XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkxha2ViYXNlIEFQSSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlXCIsIHsgY29udGV4dDogeyBwYXRoIH0gfSk7XG59XG5cbi8qKiBHRVQgaGVscGVyIHRoYXQgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkgYW5kIGZvcndhcmRzIGNhbmNlbGxhdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IHdzLmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICByYXc6IGZhbHNlLFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG4vKiogUE9TVCBoZWxwZXIgZm9yIGNyZWF0ZSAvIG11dGF0ZSBjYWxsczsgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0SnNvbjxUPihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGF0aDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgYm9keTogdW5rbm93bixcbiAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHF1ZXJ5LFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICAgIHBheWxvYWQ6IGJvZHksXG4gICAgfSxcbiAgICByZXF1ZXN0Q29udGV4dChzaWduYWwpLFxuICApO1xuICByZXR1cm4gcGFyc2VSZXNwb25zZShzY2hlbWEsIHBhdGgsIHJlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9qZWN0cyh3czogV29ya3NwYWNlQ2xpZW50LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsIGxpc3RSZXNwb25zZVNjaGVtYSwgc2lnbmFsKTtcbiAgcmV0dXJuIHJlcy5wcm9qZWN0cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEJyYW5jaGVzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxCcmFuY2hbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmJyYW5jaGVzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RW5kcG9pbnRzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnRbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZW5kcG9pbnRzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RGF0YWJhc2VzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RGF0YWJhc2VbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9kYXRhYmFzZXNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZGF0YWJhc2VzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnQ+IHtcbiAgcmV0dXJuIGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9YCxcbiAgICBlbmRwb2ludFNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG59XG5cbi8qKlxuICogU2NhbiB0aGUgd29ya3NwYWNlIGZvciBhbiBlbmRwb2ludCB3aG9zZSBgc3RhdHVzLmhvc3RzLmhvc3RgIG1hdGNoZXNcbiAqIHRoZSBwcm92aWRlZCBob3N0bmFtZS4gVXNlZCB0byByZWNvdmVyIHRoZSBvd25pbmcgcHJvamVjdC9icmFuY2gvXG4gKiBlbmRwb2ludCByZXNvdXJjZSBwYXRoIHdoZW4gdGhlIGNhbGxlciBvbmx5IHN1cHBsaWVkIGEgUG9zdGdyZXMgVVJJLlxuICpcbiAqIE8ocHJvamVjdHMgKiBicmFuY2hlcyAqIGVuZHBvaW50cykgLSBmaW5lIGZvciB0eXBpY2FsIHdvcmtzcGFjZXNcbiAqIChzaW5nbGUgZGlnaXRzIHBlciB0aWVyKTsgcGFnaW5hdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5vdCBmb2xsb3dlZFxuICogc2luY2UgdGhpcyBpcyBhIGJlc3QtZWZmb3J0IGZhbGxiYWNrLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRW5kcG9pbnRCeUhvc3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGhvc3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcHJvamVjdDogc3RyaW5nOyBicmFuY2g6IHN0cmluZzsgZW5kcG9pbnQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGxpc3RQcm9qZWN0cyh3cywgc2lnbmFsKTtcbiAgZm9yIChjb25zdCBwIG9mIHByb2plY3RzKSB7XG4gICAgY29uc3QgcHJvamVjdElkID0gcGFyc2VSZXNvdXJjZVBhdGgocC5uYW1lKS5wcm9qZWN0O1xuICAgIGlmICghcHJvamVjdElkKSBjb250aW51ZTtcbiAgICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGxpc3RCcmFuY2hlcyh3cywgcHJvamVjdElkLCBzaWduYWwpO1xuICAgIGZvciAoY29uc3QgYiBvZiBicmFuY2hlcykge1xuICAgICAgY29uc3QgYnJhbmNoSWQgPSBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaDtcbiAgICAgIGlmICghYnJhbmNoSWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdElkLCBicmFuY2hJZCwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5ob3N0cz8uaG9zdCA9PT0gaG9zdCk7XG4gICAgICBpZiAobWF0Y2g/Lm5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBtYXRjaGVkIGVuZHBvaW50IGJ5IGhvc3RcIiwge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgZW5kcG9pbnQ6IG1hdGNoLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICAgICAgICBicmFuY2g6IGJyYW5jaElkLFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IG5vIGVuZHBvaW50IG1hdGNoZWQgaG9zdFwiLCB7IGhvc3QgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHByb2plY3QgdG8gdXNlLCBvciBjcmVhdGUgb25lIHdoZW4gdGhlIHdvcmtzcGFjZSBpcyBlbXB0eS5cbiAqXG4gKiBTZWxlY3Rpb24gb3JkZXI6XG4gKiAxLiBFeGFjdGx5IG9uZSBwcm9qZWN0IGxpc3RlZCAtPiB1c2UgaXQuXG4gKiAyLiBaZXJvIHByb2plY3RzIEFORCBgYXV0b0NyZWF0ZSAhPT0gZmFsc2VgIC0+IGVuc3VyZSBhIHByb2plY3Qgd2l0aFxuICogICAgdGhlIHJlc29sdmVkIGlkIGV4aXN0cywgdGhlbiByZXR1cm4gaXRzIGlkLlxuICogMy4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgPT09IGZhbHNlYCAtPiB0aHJvdy5cbiAqIDQuIE11bHRpcGxlIHByb2plY3RzIC0+IHRocm93IHdpdGggdGhlIGNhbmRpZGF0ZSBsaXN0IChzZXRcbiAqICAgIGBjb25maWcucHJvamVjdGAgb3IgcGluIGEgcHJvamVjdCBpZCBpbiBgTEFLRUJBU0VfRU5EUE9JTlRgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja09yQ3JlYXRlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgYXV0b0NyZWF0ZTogc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBpZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHByb2plY3RzWzBdIS5uYW1lKS5wcm9qZWN0O1xuICAgIGlmIChpZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiB1c2luZyBvbmx5IHByb2plY3RcIiwgeyBwcm9qZWN0OiBpZCB9KTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChhdXRvQ3JlYXRlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiTGFrZWJhc2UgcHJvamVjdFwiLFxuICAgICAgICBcImF1dG9DcmVhdGUgaXMgZmFsc2U7IGNyZWF0ZSBhIHByb2plY3Qgb3Igc2V0IGNvbmZpZy5wcm9qZWN0IC8gTEFLRUJBU0VfRU5EUE9JTlQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGF1dG9DcmVhdGUgPz8gKGF3YWl0IGRlZmF1bHRQcm9qZWN0SWQoKSk7XG4gICAgcmV0dXJuIGVuc3VyZVByb2plY3Qod3MsIGlkLCBzaWduYWwpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBwcm9qZWN0c1xuICAgIC5tYXAoKHApID0+IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdClcbiAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiBCb29sZWFuKGlkKSlcbiAgICAuam9pbihcIiwgXCIpO1xuICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgXCJMYWtlYmFzZVwiLFxuICAgIGBNdWx0aXBsZSBwcm9qZWN0cyBmb3VuZDsgc2V0IGNvbmZpZy5wcm9qZWN0IG9yIHBpbiBhIHByb2plY3QgaWQgaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICApO1xufVxuXG4vKipcbiAqIERlcml2ZSBhIExha2ViYXNlIHByb2plY3QgaWQgZnJvbSB0aGUgaG9zdCByZXBvJ3MgYHBhY2thZ2UuanNvbmBcbiAqIG5hbWUgKHZpYSB7QGxpbmsgcHJvamVjdC5uYW1lfSkgc2x1Z2lmaWVkIHRvIHNhdGlzZnkgdGhlXG4gKiBMYWtlYmFzZSBpZCBjb25zdHJhaW50IChgXlthLXpdW2EtejAtOS1dezAsNjF9W2EtejAtOV0kYCkuXG4gKlxuICogVGhyb3dzIHdoZW4gdGhlIHNsdWcgZW5kcyB1cCBlbXB0eSBvciBzdGFydHMgd2l0aCBhIGRpZ2l0LCBzaW5jZSB0aGVcbiAqIHNlcnZlciB3b3VsZCByZWplY3QgaXQgYW55d2F5IC0gY2FsbGVycyBzaG91bGQgcGFzcyBhbiBleHBsaWNpdFxuICogYGF1dG9DcmVhdGVgIGlkIGluIHRoYXQgY2FzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFByb2plY3RJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBuYW1lID0gcHJvamVjdFV0aWxzLm5hbWUoKTtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvU2x1Z1dpdGhPcHRpb25zKHsgbWF4TGVuZ3RoOiBQUk9KRUNUX0lEX01BWF9MRU4gfSwgbmFtZSk7XG4gIGlmICghc2x1ZyB8fCAhL15bYS16XS8udGVzdChzbHVnKSkge1xuICAgIGxvZ2dlci53YXJuKFwiYXV0b3BnOiBwcm9qZWN0IG5hbWUgZG9lcyBub3Qgc2x1Z2lmeSB0byBhIExha2ViYXNlIHByb2plY3QgaWRcIiwgeyBuYW1lIH0pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIFwiQ291bGQgbm90IGRlcml2ZSBhIHByb2plY3QgaWQgZnJvbSB0aGUgcGFja2FnZSBuYW1lOyBwYXNzIGF1dG9DcmVhdGUgZXhwbGljaXRseS5cIixcbiAgICApO1xuICB9XG4gIHJldHVybiBzbHVnO1xufVxuXG4vKipcbiAqIEVuc3VyZSBhIExha2ViYXNlIHByb2plY3Qgd2l0aCBgcHJvamVjdElkYCBleGlzdHMuIENyZWF0ZXMgaXQgYW5kXG4gKiB3YWl0cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb24gdG8gY29tcGxldGUuIEFuIGBBTFJFQURZX0VYSVNUU2BcbiAqIHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgc3VjY2VzcyAtIHNvbWVvbmUgZWxzZSAoYSBjb25jdXJyZW50IGJvb3QsXG4gKiBhIHNpYmxpbmcgcHJvY2Vzcykgd29uIHRoZSByYWNlIGFuZCB0aGUgcHJvamVjdCB3ZSB3YW50ZWQgaXMgbm93XG4gKiBzaXR0aW5nIHRoZXJlIHJlYWR5IGZvciBkb3duc3RyZWFtIHBpY2tlcnMuXG4gKlxuICogUHJvamVjdCBjcmVhdGlvbiB0eXBpY2FsbHkgcHJvdmlzaW9ucyBhIGRlZmF1bHQgYHByb2R1Y3Rpb25gIGJyYW5jaFxuICogYWxvbmdzaWRlOyBkb3duc3RyZWFtIHBpY2tlcnMgaGFuZGxlIHRoZSByZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVQcm9qZWN0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsb2dnZXIud2FybihcImF1dG9wZzogbm8gcHJvamVjdHMgZm91bmQ7IGNyZWF0aW5nXCIsIHsgcHJvamVjdDogcHJvamVjdElkIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IG9wID0gYXdhaXQgcG9zdEpzb24oXG4gICAgICB3cyxcbiAgICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsXG4gICAgICBvcGVyYXRpb25TY2hlbWEsXG4gICAgICB7IHNwZWM6IHsgcGdfdmVyc2lvbjogREVGQVVMVF9QR19WRVJTSU9OIH0gfSxcbiAgICAgIHsgcHJvamVjdF9pZDogcHJvamVjdElkIH0sXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICBhd2FpdCB3YWl0Rm9yT3BlcmF0aW9uKHdzLCBvcCwgc2lnbmFsKTtcbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogY3JlYXRlZCBwcm9qZWN0XCIsIHsgcHJvamVjdDogcHJvamVjdElkIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIWlzQWxyZWFkeUV4aXN0c0Vycm9yKGVycikpIHRocm93IGVycjtcbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogcHJvamVjdCBhbHJlYWR5IGV4aXN0cyAocmFjZSk7IHByb2NlZWRpbmdcIiwge1xuICAgICAgcHJvamVjdDogcHJvamVjdElkLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwcm9qZWN0SWQ7XG59XG5cbi8qKlxuICogUmVjb2duaXplIHRoZSBEYXRhYnJpY2tzIFNESydzIGBBTFJFQURZX0VYSVNUU2AgZmFpbHVyZSBtb2RlcyBzbyBhXG4gKiBsb3N0IHJhY2UgZHVyaW5nIGBlbnN1cmVQcm9qZWN0YCBiZWNvbWVzIGEgbm8tb3AgaW5zdGVhZCBvZiBhbiBlcnJvci5cbiAqXG4gKiBUaGUgU0RLIHRocm93cyBgQXBpRXJyb3IgeyBlcnJvckNvZGUsIHN0YXR1c0NvZGUgfWAgZm9yIHN0cnVjdHVyZWRcbiAqIHNlcnZlciBlcnJvcnMgYW5kIGBIdHRwRXJyb3IgeyBjb2RlIH1gIGZvciB0cmFuc3BvcnQtbGF5ZXIgNHh4LzV4eC5cbiAqIEJvdGggc3VyZmFjZSBhIGh1bWFuIG1lc3NhZ2UgdGhhdCBvZnRlbiBjYXJyaWVzIFwiYWxyZWFkeSBleGlzdHNcIiBzb1xuICogd2UgdXNlIHRoYXQgYXMgYSBmaW5hbCBmYWxsYmFjayBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5mdW5jdGlvbiBpc0FscmVhZHlFeGlzdHNFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlID0gZXJyb3IgYXMge1xuICAgIHN0YXR1c0NvZGU/OiBudW1iZXI7XG4gICAgY29kZT86IG51bWJlcjtcbiAgICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgfTtcbiAgaWYgKGUuc3RhdHVzQ29kZSA9PT0gNDA5IHx8IGUuY29kZSA9PT0gNDA5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGUuZXJyb3JDb2RlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUuZXJyb3JDb2RlKSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLm1lc3NhZ2UgJiYgL2FscmVhZHkuP2V4aXN0cy9pLnRlc3QoZS5tZXNzYWdlKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZWR1Y2UgYSBMYWtlYmFzZSBvcGVyYXRpb24gZmFpbHVyZSB0byBhbiBlcnJvciBzYWZlIHRvIHByb3BhZ2F0ZTogdGhlXG4gKiBvcGVyYXRpb24gbmFtZSBwbHVzIHdoYXRldmVyIGNvZGUgdGhlIHBheWxvYWQgY2Fycmllcy4gVGhlIHBheWxvYWQgaXRzZWxmIGNhblxuICogZWNobyByZXF1ZXN0IGNvbnRleHQsIHNvIGl0IGdvZXMgdG8gdGhlIGxvZyBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBvcGVyYXRpb25GYWlsZWQob3BOYW1lOiBzdHJpbmcsIG9wRXJyb3I6IHVua25vd24pOiBFeGVjdXRpb25FcnJvciB7XG4gIGxvZ2dlci5lcnJvcihcImF1dG9wZzogb3BlcmF0aW9uIGZhaWxlZFwiLCB7XG4gICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihvcEVycm9yKSxcbiAgfSk7XG4gIGNvbnN0IGNvZGUgPSBvYmplY3QuaXNSZWNvcmQob3BFcnJvcikgPyAob3BFcnJvci5jb2RlID8/IG9wRXJyb3IucmVhc29uKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWxlZDogJHtvcE5hbWV9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgZXJyb3JDb2RlOiB0eXBlb2YgY29kZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IFN0cmluZyhjb2RlKSA6IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYSBMYWtlYmFzZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIHVudGlsIGBkb25lOiB0cnVlYC4gUmV0dXJuc1xuICogdGhlIGZpbmFsIG9wZXJhdGlvbiBlbnZlbG9wZSAod2hpY2ggbWF5IGNhcnJ5IGByZXNwb25zZWAgb3IgYGVycm9yYCkuXG4gKlxuICogVGhyb3dzIHdoZW46XG4gKiAgIC0gdGhlIHJlc3BvbnNlIGNhcnJpZXMgYW4gYGVycm9yYCBmaWVsZDtcbiAqICAgLSBgb3AubmFtZWAgaXMgbWlzc2luZyAobm90aGluZyB0byBwb2xsKTtcbiAqICAgLSB0aGUgdGltZW91dCBlbGFwc2VzIGJlZm9yZSBgZG9uZTogdHJ1ZWA7XG4gKiAgIC0gYHNpZ25hbGAgYWJvcnRzIG1pZC13YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yT3BlcmF0aW9uKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBvcDogT3BlcmF0aW9uLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8T3BlcmF0aW9uPiB7XG4gIGlmIChvcC5kb25lKSB7XG4gICAgaWYgKG9wLmVycm9yKSB7XG4gICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3AubmFtZSA/PyBcInVua25vd25cIiwgb3AuZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gb3A7XG4gIH1cbiAgY29uc3Qgb3BOYW1lID0gb3AubmFtZTtcbiAgaWYgKCFvcE5hbWUpIHtcbiAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIm9wZXJhdGlvbiBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IE9QRVJBVElPTl9USU1FT1VUX01TOyBhdHRlbXB0KyspIHtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgT1BFUkFUSU9OX1BPTExfTVMsIHNpZ25hbCk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS8ke29wTmFtZX1gLCBvcGVyYXRpb25TY2hlbWEsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBvcGVyYXRpb24gc3RhdHVzXCIsIHsgb3A6IG9wTmFtZSwgZG9uZTogY3VycmVudC5kb25lIH0pO1xuICAgIGlmIChjdXJyZW50LmRvbmUpIHtcbiAgICAgIGlmIChjdXJyZW50LmVycm9yKSB7XG4gICAgICAgIHRocm93IG9wZXJhdGlvbkZhaWxlZChvcE5hbWUsIGN1cnJlbnQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogb3BOYW1lLCB0aW1lb3V0TXM6IE9QRVJBVElPTl9USU1FT1VUX01TIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYGdldEVuZHBvaW50YCB1bnRpbCB0aGUgY29tcHV0ZSByZXBvcnRzIGEgdXNhYmxlXG4gKiBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgLiBgUkVBRFlgIGFuZCBgSURMRWAgYXJlIGJvdGggYWNjZXB0YWJsZSAtXG4gKiBgSURMRWAganVzdCBtZWFucyB0aGUgY29tcHV0ZSBoYXMgc2NhbGVkIHRvIHplcm8gYnV0IGEgY29ubmVjdGlvblxuICogd2lsbCB3YWtlIGl0LiBSZXR1cm5zIHRoZSBmaW5hbCBlbmRwb2ludCBwYXlsb2FkICh3aXRoIGBob3N0cy5ob3N0YCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRFbmRwb2ludFJlYWR5KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBlbmRwb2ludElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCBsYXN0OiBFbmRwb2ludCB8IG51bGwgPSBudWxsO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgbGFzdCA9IGF3YWl0IGdldEVuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50SWQsIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdGUgPSBsYXN0LnN0YXR1cz8uY3VycmVudF9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgJiYgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTLmhhcyhzdGF0ZSkpIHJldHVybiBsYXN0O1xuICAgIGlmIChsYXN0LnN0YXR1cz8uaG9zdHM/Lmhvc3QgJiYgc3RhdGUgIT09IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSkge1xuICAgICAgLy8gQ29tcHV0ZSBpcyBpbiBzb21lIG90aGVyIHN0YXRlIChTVEFSVElORywgZXRjLikgYnV0IGhvc3RuYW1lIGlzXG4gICAgICAvLyBhbHJlYWR5IHB1Ymxpc2hlZCAtIGdvb2QgZW5vdWdoIHRvIGNvbm5lY3Q7IGxha2ViYXNlJ3MgT0F1dGhcbiAgICAgIC8vIHRva2VuIHJlcXVlc3Qgd2lsbCB3YWtlIGl0LlxuICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogd2FpdGluZyBmb3IgZW5kcG9pbnRcIiwgeyBlbmRwb2ludElkLCBzdGF0ZSB9KTtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUywgc2lnbmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIGVuZHBvaW50IGRpZCBub3QgYmVjb21lIHJlYWR5OiAke2VuZHBvaW50SWR9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHByb2plY3QsXG4gICAgICBicmFuY2gsXG4gICAgICBlbmRwb2ludElkLFxuICAgICAgdGltZW91dE1zOiBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TLFxuICAgICAgbGFzdFN0YXRlOiBsYXN0Py5zdGF0dXM/LmN1cnJlbnRfc3RhdGUgPz8gXCJ1bmtub3duXCIsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBicmFuY2ggZm9yIGEgcHJvamVjdC4gUHJlZmVycyB0aGUgYnJhbmNoIGZsYWdnZWRcbiAqIGBzdGF0dXMuZGVmYXVsdDogdHJ1ZWAgKHNlcnZlci1zaWRlIGRlZmF1bHQsIHR5cGljYWxseSBgcHJvZHVjdGlvbmBcbiAqIHVubGVzcyB0aGUgcHJvamVjdCBvd25lciBjaGFuZ2VkIGl0KS4gRmFsbHMgYmFjayB0byB0aGUgb25seSBicmFuY2hcbiAqIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gT3RoZXJ3aXNlIHRocm93cyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0JyYW5jaChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgbGlzdEJyYW5jaGVzKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICBpZiAoYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgYnJhbmNoIGluIHByb2plY3QgJyR7cHJvamVjdH0nYCxcbiAgICAgIFwiVGhlIHByb2plY3QgaGFzIG5vIGJyYW5jaGVzOyBjcmVhdGUgb25lIG9yIHNldCBjb25maWcuYnJhbmNoLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZmxhZ2dlZCA9IGJyYW5jaGVzLmZpbmQoKGIpID0+IGIuc3RhdHVzPy5kZWZhdWx0ID09PSB0cnVlKTtcbiAgY29uc3QgY2hvaWNlID1cbiAgICBwYXJzZVJlc291cmNlUGF0aChmbGFnZ2VkPy5uYW1lKS5icmFuY2ggPz9cbiAgICAoYnJhbmNoZXMubGVuZ3RoID09PSAxID8gcGFyc2VSZXNvdXJjZVBhdGgoYnJhbmNoZXNbMF0hLm5hbWUpLmJyYW5jaCA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGJyYW5jaGVzXG4gICAgICAubWFwKChiKSA9PiBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWQpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgUHJvamVjdCAnJHtwcm9qZWN0fScgaGFzIG11bHRpcGxlIGJyYW5jaGVzIGFuZCBub25lIG1hcmtlZCBkZWZhdWx0OyBzZXQgY29uZmlnLmJyYW5jaCBvciBpbmNsdWRlIHRoZSBicmFuY2ggaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICAgICk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBicmFuY2hcIiwgeyBwcm9qZWN0LCBicmFuY2g6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcmltYXJ5IGVuZHBvaW50IGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBQcmVmZXJzXG4gKiBgc3RhdHVzLmVuZHBvaW50X3R5cGUgPT09IEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWA7IGZhbGxzIGJhY2sgdG9cbiAqIHRoZSBvbmx5IGVuZHBvaW50IHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gUmV0dXJucyBgeyBuYW1lLCBob3N0IH1gXG4gKiBzbyB0aGUgY2FsbGVyIGNhbiBwb3B1bGF0ZSBib3RoIGBMQUtFQkFTRV9FTkRQT0lOVGAgYW5kIGBQR0hPU1RgXG4gKiBmcm9tIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBob3N0Pzogc3RyaW5nIH0+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZW5kcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGVuZHBvaW50IGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBlbmRwb2ludHM7IGNyZWF0ZSBvbmUgb3Igc2V0IExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpbWFyeSA9XG4gICAgZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5lbmRwb2ludF90eXBlID09PSBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUpID8/XG4gICAgKGVuZHBvaW50cy5sZW5ndGggPT09IDEgPyBlbmRwb2ludHNbMF0gOiB1bmRlZmluZWQpO1xuICBpZiAoIXByaW1hcnk/Lm5hbWUpIHtcbiAgICBjb25zdCBuYW1lcyA9IGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBCcmFuY2ggaGFzIG5vIHByaW1hcnkgcmVhZC13cml0ZSBlbmRwb2ludDsgc2V0IExBS0VCQVNFX0VORFBPSU5UIG9yIGNvbmZpZy5lbmRwb2ludC4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSBwcmltYXJ5LnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZW5kcG9pbnRcIiwgeyBlbmRwb2ludDogcHJpbWFyeS5uYW1lLCBob3N0IH0pO1xuICByZXR1cm4geyBuYW1lOiBwcmltYXJ5Lm5hbWUsIGhvc3QgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBkZWZhdWx0IHBvc3RncmVzIGRhdGFiYXNlIGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBUaGVcbiAqIFBvc3RncmVzIGRhdGFiYXNlIE5BTUUgKGBzdGF0dXMucG9zdGdyZXNfZGF0YWJhc2VgKSBpcyB3aGF0XG4gKiBgUEdEQVRBQkFTRWAgbmVlZHMgLSB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgcmVzb3VyY2UgaWQsIHdoaWNoIGNhblxuICogdXNlIGEgZGlmZmVyZW50IHNlcGFyYXRvciAoZS5nLiByZXNvdXJjZSBgZGF0YWJyaWNrcy1wb3N0Z3Jlc2BcbiAqIHN1cmZhY2VzIGFzIGRhdGFiYXNlIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkuIFByZWZlcnNcbiAqIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCAodGhlIExha2ViYXNlIGRlZmF1bHQpLCBvdGhlcndpc2UgdGhlIG9ubHlcbiAqIGRhdGFiYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRGF0YWJhc2UoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGF0YWJhc2VzID0gYXdhaXQgbGlzdERhdGFiYXNlcyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZGF0YWJhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGRhdGFiYXNlIGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBkYXRhYmFzZXM7IGNyZWF0ZSBvbmUgb3Igc2V0IFBHREFUQUJBU0UuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IGRhdGFiYXNlc1xuICAgIC5tYXAoKGQpID0+IGQuc3RhdHVzPy5wb3N0Z3Jlc19kYXRhYmFzZSlcbiAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgbmFtZXMuZmluZCgobikgPT4gbiA9PT0gREVGQVVMVF9EQVRBQkFTRSkgPz8gKG5hbWVzLmxlbmd0aCA9PT0gMSA/IG5hbWVzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFjaG9pY2UpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgTXVsdGlwbGUgZGF0YWJhc2VzIGFuZCBubyAnJHtERUZBVUxUX0RBVEFCQVNFfSc7IHNldCBQR0RBVEFCQVNFIG9yIGNvbmZpZy5kYXRhYmFzZS4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogY2hvaWNlIH0pO1xuICByZXR1cm4gY2hvaWNlO1xufVxuIl19
@@ -17,12 +17,11 @@ export function handleOwnershipMigrationError(cause, options) {
17
17
  if (loggedOwnershipErrors.has(key))
18
18
  return true;
19
19
  loggedOwnershipErrors.add(key);
20
- if (log.isLevelEnabled("debug")) {
21
- options.logger.error(options.event, cause);
22
- }
23
- else {
24
- options.logger.warn(options.event, { error: message, ...options.context });
25
- }
20
+ const error = errorUtils.toError(cause);
21
+ if (log.isLevelEnabled("debug"))
22
+ options.logger.error(options.event, { error });
23
+ else
24
+ options.logger.warn(options.event, { error, ...options.context });
26
25
  return true;
27
26
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2RUFBNkU7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQWUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFXaEQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxLQUFjO0lBQ3RELE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsS0FBYyxFQUNkLE9BQXVDO0lBRXZDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTaGFyZWQgY2xhc3NpZmljYXRpb24gYW5kIGxvZ2dpbmcgcG9saWN5IGZvciBzb2Z0IGRhdGFiYXNlIG1pZ3JhdGlvbnMuICovXG5cbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgdHlwZSBMb2dnZXIgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZWRPd25lcnNoaXBFcnJvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIElucHV0cyBmb3Igb25lIG93bmVyc2hpcC1vbmx5IG1pZ3JhdGlvbiBmYWlsdXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lcnNoaXBNaWdyYXRpb25FcnJvck9wdGlvbnMge1xuICAvKiogU3RhYmxlIHN1YnN5c3RlbSBrZXkgdXNlZCB0byBkZWR1cGxpY2F0ZSBlcXVpdmFsZW50IHdhcm5pbmdzLiAqL1xuICByZWFkb25seSBzY29wZTogc3RyaW5nO1xuICByZWFkb25seSBsb2dnZXI6IFBpY2s8TG9nZ2VyLCBcImVycm9yXCIgfCBcIndhcm5cIj47XG4gIHJlYWRvbmx5IGV2ZW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbi8qKiBXaGV0aGVyIGEgbWlncmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBjdXJyZW50IHJvbGUgZG9lcyBub3Qgb3duIGFuIG9iamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGNhdXNlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvclV0aWxzLmVycm9yQ29udGV4dChjYXVzZSkuaGFzTWVzc2FnZShcIm11c3QgYmUgb3duZXJcIik7XG59XG5cbi8qKlxuICogQ2xhc3NpZnkgYW5kIGxvZyBhbiBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZSBvbmNlIHBlciBzdWJzeXN0ZW0uXG4gKiBSZXR1cm5zIGBmYWxzZWAgZm9yIGV2ZXJ5IG90aGVyIGZhaWx1cmUgc28gY2FsbGVycyBjYW4gcmV0aHJvdyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZU93bmVyc2hpcE1pZ3JhdGlvbkVycm9yKFxuICBjYXVzZTogdW5rbm93bixcbiAgb3B0aW9uczogT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmICghaXNPd25lcnNoaXBNaWdyYXRpb25FcnJvcihjYXVzZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgY29uc3Qga2V5ID0gYCR7b3B0aW9ucy5zY29wZX1cXDAke21lc3NhZ2V9YDtcbiAgaWYgKGxvZ2dlZE93bmVyc2hpcEVycm9ycy5oYXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gIGxvZ2dlZE93bmVyc2hpcEVycm9ycy5hZGQoa2V5KTtcbiAgaWYgKGxvZy5pc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSB7XG4gICAgb3B0aW9ucy5sb2dnZXIuZXJyb3Iob3B0aW9ucy5ldmVudCwgY2F1c2UpO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMubG9nZ2VyLndhcm4ob3B0aW9ucy5ldmVudCwgeyBlcnJvcjogbWVzc2FnZSwgLi4ub3B0aW9ucy5jb250ZXh0IH0pO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2RUFBNkU7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQWUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFXaEQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxLQUFjO0lBQ3RELE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsS0FBYyxFQUNkLE9BQXVDO0lBRXZDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7O1FBQzNFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2hhcmVkIGNsYXNzaWZpY2F0aW9uIGFuZCBsb2dnaW5nIHBvbGljeSBmb3Igc29mdCBkYXRhYmFzZSBtaWdyYXRpb25zLiAqL1xuXG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHR5cGUgTG9nZ2VyIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgbG9nZ2VkT3duZXJzaGlwRXJyb3JzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKiBJbnB1dHMgZm9yIG9uZSBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIHtcbiAgLyoqIFN0YWJsZSBzdWJzeXN0ZW0ga2V5IHVzZWQgdG8gZGVkdXBsaWNhdGUgZXF1aXZhbGVudCB3YXJuaW5ncy4gKi9cbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nZ2VyOiBQaWNrPExvZ2dlciwgXCJlcnJvclwiIHwgXCJ3YXJuXCI+O1xuICByZWFkb25seSBldmVudDogc3RyaW5nO1xuICByZWFkb25seSBjb250ZXh0PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogV2hldGhlciBhIG1pZ3JhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgY3VycmVudCByb2xlIGRvZXMgbm90IG93biBhbiBvYmplY3QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPd25lcnNoaXBNaWdyYXRpb25FcnJvcihjYXVzZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3JVdGlscy5lcnJvckNvbnRleHQoY2F1c2UpLmhhc01lc3NhZ2UoXCJtdXN0IGJlIG93bmVyXCIpO1xufVxuXG4vKipcbiAqIENsYXNzaWZ5IGFuZCBsb2cgYW4gb3duZXJzaGlwLW9ubHkgbWlncmF0aW9uIGZhaWx1cmUgb25jZSBwZXIgc3Vic3lzdGVtLlxuICogUmV0dXJucyBgZmFsc2VgIGZvciBldmVyeSBvdGhlciBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIHJldGhyb3cgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVPd25lcnNoaXBNaWdyYXRpb25FcnJvcihcbiAgY2F1c2U6IHVua25vd24sXG4gIG9wdGlvbnM6IE93bmVyc2hpcE1pZ3JhdGlvbkVycm9yT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoY2F1c2UpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSk7XG4gIGNvbnN0IGtleSA9IGAke29wdGlvbnMuc2NvcGV9XFwwJHttZXNzYWdlfWA7XG4gIGlmIChsb2dnZWRPd25lcnNoaXBFcnJvcnMuaGFzKGtleSkpIHJldHVybiB0cnVlO1xuICBsb2dnZWRPd25lcnNoaXBFcnJvcnMuYWRkKGtleSk7XG4gIGNvbnN0IGVycm9yID0gZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKTtcbiAgaWYgKGxvZy5pc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSBvcHRpb25zLmxvZ2dlci5lcnJvcihvcHRpb25zLmV2ZW50LCB7IGVycm9yIH0pO1xuICBlbHNlIG9wdGlvbnMubG9nZ2VyLndhcm4ob3B0aW9ucy5ldmVudCwgeyBlcnJvciwgLi4ub3B0aW9ucy5jb250ZXh0IH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  /** AppKit-specific adapters over the shared intercepted-execution contract. */
2
2
  import { ExecutionError } from "@databricks/appkit";
3
- import { execution } from "@dbx-tools/shared-core";
3
+ import { errorUtils, execution } from "@dbx-tools/shared-core";
4
4
  /**
5
5
  * Run and unwrap one AppKit plugin operation with the shared stable failure
6
6
  * message, structured warning, status context, and cancellation behavior.
@@ -17,7 +17,7 @@ export function runPluginExecution(options) {
17
17
  options.logger.warn("execution-failed", {
18
18
  operation: failure.operation,
19
19
  status: failure.status,
20
- error: failure.message,
20
+ error: errorUtils.toError(failure.message),
21
21
  });
22
22
  return new ExecutionError(`${options.plugin}: ${failure.operation} failed`, {
23
23
  context: { operation: failure.operation, status: failure.status },
@@ -25,4 +25,4 @@ export function runPluginExecution(options) {
25
25
  },
26
26
  });
27
27
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWV4ZWN1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRTtBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBZSxNQUFNLHdCQUF3QixDQUFDO0FBYWhFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsT0FBK0M7SUFFL0MsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ25CLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztRQUM1QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUNkLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7UUFDakMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3RDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU87YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLGNBQWMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLFNBQVMsU0FBUyxFQUFFO2dCQUMxRSxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRTthQUNsRSxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBBcHBLaXQtc3BlY2lmaWMgYWRhcHRlcnMgb3ZlciB0aGUgc2hhcmVkIGludGVyY2VwdGVkLWV4ZWN1dGlvbiBjb250cmFjdC4gKi9cblxuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBleGVjdXRpb24sIHR5cGUgTG9nZ2VyIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqIElucHV0cyBmb3Igb25lIHBsdWdpbiBvcGVyYXRpb24gcm91dGVkIHRocm91Z2ggQXBwS2l0IGludGVyY2VwdG9ycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUGx1Z2luRXhlY3V0aW9uT3B0aW9uczxULCBTZXR0aW5ncz4ge1xuICByZWFkb25seSBwbHVnaW46IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nZ2VyOiBQaWNrPExvZ2dlciwgXCJ3YXJuXCI+O1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFNldHRpbmdzO1xuICByZWFkb25seSBleGVjdXRlOiBleGVjdXRpb24uRXhlY3V0b3I8U2V0dGluZ3M+O1xuICByZWFkb25seSBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+O1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBSdW4gYW5kIHVud3JhcCBvbmUgQXBwS2l0IHBsdWdpbiBvcGVyYXRpb24gd2l0aCB0aGUgc2hhcmVkIHN0YWJsZSBmYWlsdXJlXG4gKiBtZXNzYWdlLCBzdHJ1Y3R1cmVkIHdhcm5pbmcsIHN0YXR1cyBjb250ZXh0LCBhbmQgY2FuY2VsbGF0aW9uIGJlaGF2aW9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUGx1Z2luRXhlY3V0aW9uPFQsIFNldHRpbmdzPihcbiAgb3B0aW9uczogUnVuUGx1Z2luRXhlY3V0aW9uT3B0aW9uczxULCBTZXR0aW5ncz4sXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIGV4ZWN1dGlvbi5ydW4oe1xuICAgIG9wZXJhdGlvbjogb3B0aW9ucy5vcGVyYXRpb24sXG4gICAgc2V0dGluZ3M6IG9wdGlvbnMuc2V0dGluZ3MsXG4gICAgZXhlY3V0ZTogb3B0aW9ucy5leGVjdXRlLFxuICAgIGZuOiBvcHRpb25zLmZuLFxuICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWwsXG4gICAgY2FuY2VsZWQ6IEV4ZWN1dGlvbkVycm9yLmNhbmNlbGVkLFxuICAgIGZhaWxlZDogKGZhaWx1cmUpID0+IHtcbiAgICAgIG9wdGlvbnMubG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBmYWlsdXJlLm9wZXJhdGlvbixcbiAgICAgICAgc3RhdHVzOiBmYWlsdXJlLnN0YXR1cyxcbiAgICAgICAgZXJyb3I6IGZhaWx1cmUubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgJHtvcHRpb25zLnBsdWdpbn06ICR7ZmFpbHVyZS5vcGVyYXRpb259IGZhaWxlZGAsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLCBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWV4ZWN1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW4tZXhlY3V0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRTtBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQWUsTUFBTSx3QkFBd0IsQ0FBQztBQWE1RTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQStDO0lBRS9DLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUNuQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDZCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO1FBQ2pDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUMzQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7Z0JBQzFFLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO2FBQ2xFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEFwcEtpdC1zcGVjaWZpYyBhZGFwdGVycyBvdmVyIHRoZSBzaGFyZWQgaW50ZXJjZXB0ZWQtZXhlY3V0aW9uIGNvbnRyYWN0LiAqL1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGV4ZWN1dGlvbiwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogSW5wdXRzIGZvciBvbmUgcGx1Z2luIG9wZXJhdGlvbiByb3V0ZWQgdGhyb3VnaCBBcHBLaXQgaW50ZXJjZXB0b3JzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5QbHVnaW5FeGVjdXRpb25PcHRpb25zPFQsIFNldHRpbmdzPiB7XG4gIHJlYWRvbmx5IHBsdWdpbjogc3RyaW5nO1xuICByZWFkb25seSBsb2dnZXI6IFBpY2s8TG9nZ2VyLCBcIndhcm5cIj47XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHJlYWRvbmx5IGV4ZWN1dGU6IGV4ZWN1dGlvbi5FeGVjdXRvcjxTZXR0aW5ncz47XG4gIHJlYWRvbmx5IGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD47XG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIFJ1biBhbmQgdW53cmFwIG9uZSBBcHBLaXQgcGx1Z2luIG9wZXJhdGlvbiB3aXRoIHRoZSBzaGFyZWQgc3RhYmxlIGZhaWx1cmVcbiAqIG1lc3NhZ2UsIHN0cnVjdHVyZWQgd2FybmluZywgc3RhdHVzIGNvbnRleHQsIGFuZCBjYW5jZWxsYXRpb24gYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5QbHVnaW5FeGVjdXRpb248VCwgU2V0dGluZ3M+KFxuICBvcHRpb25zOiBSdW5QbHVnaW5FeGVjdXRpb25PcHRpb25zPFQsIFNldHRpbmdzPixcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gZXhlY3V0aW9uLnJ1bih7XG4gICAgb3BlcmF0aW9uOiBvcHRpb25zLm9wZXJhdGlvbixcbiAgICBzZXR0aW5nczogb3B0aW9ucy5zZXR0aW5ncyxcbiAgICBleGVjdXRlOiBvcHRpb25zLmV4ZWN1dGUsXG4gICAgZm46IG9wdGlvbnMuZm4sXG4gICAgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCxcbiAgICBjYW5jZWxlZDogRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQsXG4gICAgZmFpbGVkOiAoZmFpbHVyZSkgPT4ge1xuICAgICAgb3B0aW9ucy5sb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwge1xuICAgICAgICBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLFxuICAgICAgICBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGZhaWx1cmUubWVzc2FnZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgRXhlY3V0aW9uRXJyb3IoYCR7b3B0aW9ucy5wbHVnaW59OiAke2ZhaWx1cmUub3BlcmF0aW9ufSBmYWlsZWRgLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBmYWlsdXJlLm9wZXJhdGlvbiwgc3RhdHVzOiBmYWlsdXJlLnN0YXR1cyB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
@@ -114,11 +114,11 @@ export async function provisionCacheSchema(role, logger = defaultLogger) {
114
114
  catch (err) {
115
115
  logger.warn("autopg: cache provisioning failed (continuing)", {
116
116
  schema: CACHE_SCHEMA,
117
- error: errorUtils.errorMessage(err),
117
+ error: errorUtils.toError(err),
118
118
  });
119
119
  }
120
120
  finally {
121
121
  await pool.end().catch(() => { });
122
122
  }
123
123
  }
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFOUMseUVBQXlFO0FBQ3pFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsT0FBTztRQUNMLGlDQUFpQyxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3RELGdEQUFnRCxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3JFLG1EQUFtRCxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3hFLHNDQUFzQyxNQUFNLDJCQUEyQixNQUFNLEVBQUU7UUFDL0Usc0NBQXNDLE1BQU0sOEJBQThCLE1BQU0sRUFBRTtLQUNuRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLElBQXdCLEVBQ3hCLFNBQXFCLGFBQWE7SUFFbEMsSUFBSSxXQUFXLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMxRSxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUNuRixPQUFPO0lBQ1QsQ0FBQztJQUNELGdFQUFnRTtJQUNoRSwyRUFBMkU7SUFDM0UsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsaUZBQWlGO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUM3Qix5QkFBeUIsQ0FBQztRQUN4QixJQUFJLEVBQUUsSUFBSTtRQUNWLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDdkMsdUJBQXVCLEVBQUUsa0JBQWtCO1FBQzNDLGlCQUFpQixFQUFFLG9CQUFvQjtLQUN4QyxDQUFDLENBQ0gsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDNUIsa0VBQWtFLEVBQ2xFLENBQUMsWUFBWSxDQUFDLENBQ2YsQ0FBQztRQUNGLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDMUYsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsRUFBRTtZQUM1RCxNQUFNLEVBQUUsWUFBWTtZQUNwQixLQUFLLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExha2ViYXNlIGNhY2hlLXNjaGVtYSBncmFudCBmaXgtdXAuXG4gKlxuICogQXBwS2l0J3MgcGVyc2lzdGVudCBjYWNoZSAoYENhY2hlTWFuYWdlcmAgLT4gYFBlcnNpc3RlbnRTdG9yYWdlYCkgdXNlcyBhXG4gKiBzY2hlbWEgYGFwcGtpdGAgYW5kIGEgdGFibGUgYGFwcGtpdC5hcHBraXRfY2FjaGVfZW50cmllc2AuIFdoZW4gdGhlIGNvbm5lY3RpbmdcbiAqIERhdGFicmlja3MgaWRlbnRpdHkgbGFja3MgcHJpdmlsZWdlcyBvbiB0aGF0IHNjaGVtYSwgdGhlIGNhY2hlIG1pZ3JhdGlvblxuICogdGhyb3dzLCBhbmQgYmVjYXVzZSBBcHBLaXQgaXMgdHlwaWNhbGx5IHJ1biB3aXRoIGBjYWNoZS5zdHJpY3RQZXJzaXN0ZW5jZTpcbiAqIHRydWVgLCB0aGUgY2FjaGUgaXMgc2lsZW50bHkgc3dpdGNoZWQgdG8gYSBkaXNhYmxlZCBpbi1tZW1vcnkgc3R1YiAtIHNvIGV2ZXJ5XG4gKiBwZXJzaXN0ZW50IHJlYWQgKGNoYXJ0IGxvbmctcG9sbCwgaGlzdG9yeSwgZXRjLikgbWlzc2VzIGFuZCA0MDRzLlxuICpcbiAqIFRoaXMgZ3JhbnRzIHRoZSBjb25uZWN0aW5nIHJvbGUgZnVsbCByaWdodHMgb24gdGhlIGNhY2hlIHNjaGVtYSwgYnV0IG9ubHkgd2hlblxuICogdGhlIHNjaGVtYSBBTFJFQURZIEVYSVNUUyAtIGl0IG5ldmVyIGNyZWF0ZXMgdGhlIHNjaGVtYSBpdHNlbGYuIFJ1biBmcm9tIGFcbiAqIExPQ0FMIGlkZW50aXR5IHRoYXQgb3ducyB0aGUgc2NoZW1hIChvciBob2xkcyBncmFudCBvcHRpb24gb24gaXQpOyBpdCBpc1xuICogc2tpcHBlZCBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCwgd2hlcmUgdGhlIGFwcCBTUCBjYW5ub3QgZ3JhbnQgYW5kIGl0c1xuICogUG9zdGdyZXMgcm9sZSBkb2VzIG5vdCBleGlzdCB1bnRpbCBpdHMgZmlyc3QgY29ubmVjdGlvbi5cbiAqXG4gKiBNdXN0IHJ1biBBRlRFUiB7QGxpbmsgYXBwbHlMYWtlYmFzZVRvRW52fSBoYXMgd3JpdHRlbiB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvblxuICogdG8gYHByb2Nlc3MuZW52YCAoc28gYGNyZWF0ZUxha2ViYXNlUG9vbGAgcGlja3MgdXAgaG9zdCAvIGRhdGFiYXNlIC8gZW5kcG9pbnQpXG4gKiBhbmQgQkVGT1JFIGBjcmVhdGVBcHBgIGluaXRpYWxpemVzIHRoZSBjYWNoZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGFrZWJhc2VQb29sLCBnZXRXb3Jrc3BhY2VDbGllbnQsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNvbmZpZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgcG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucywgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiQGRieC10b29scy9wb3N0Z3Jlc1wiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgZGVmYXVsdExvZ2dlciA9IGxvZy5sb2dnZXIoXCJwcm92aXNpb25cIik7XG5cbi8qKiBBcHBLaXQgcGVyc2lzdGVudC1jYWNoZSBzY2hlbWEgKHNlZSBBcHBLaXQncyBgUGVyc2lzdGVudFN0b3JhZ2VgKS4gKi9cbmNvbnN0IENBQ0hFX1NDSEVNQSA9IFwiYXBwa2l0XCI7XG5cbi8qKlxuICogQ2hhcmFjdGVycyBhIExha2ViYXNlIFBvc3RncmVzIHJvbGUgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluOiB3b3Jrc3BhY2VcbiAqIGlkZW50aXRpZXMgYXJlIGVtYWlscywgc2VydmljZSBwcmluY2lwYWxzIGFyZSBVVUlEcy5cbiAqL1xuY29uc3QgUk9MRV9QQVRURVJOID0gL15bQS1aYS16MC05Ll9AKy1dezEsMjU1fSQvO1xuXG4vKipcbiAqIFByb3Zpc2lvbmluZyBydW5zIGF0IGJvb3QgYXMgdGhlIGxvY2FsIGRldmVsb3BlciBpZGVudGl0eSwgYmVmb3JlIGFueSBwbHVnaW5cbiAqIGV4aXN0cywgc28gaXQgaXMgb3V0c2lkZSBBcHBLaXQncyBpbnRlcmNlcHRvciBjaGFpbiBhbmQgaW5oZXJpdHMgbm8gdGltZW91dFxuICogZnJvbSBpdC4gQm90aCBib3VuZHMgYXJlIGV4cGxpY2l0IGZvciB0aGF0IHJlYXNvbi5cbiAqL1xuY29uc3QgQ09OTkVDVF9USU1FT1VUX01TID0gMTBfMDAwO1xuY29uc3QgU1RBVEVNRU5UX1RJTUVPVVRfTVMgPSAxNV8wMDA7XG5cbi8qKlxuICogSWRlbXBvdGVudCBncmFudHMgdGhhdCBtYWtlIHRoZSAoYWxyZWFkeS1leGlzdGluZykgQXBwS2l0IGNhY2hlIHNjaGVtYSBmdWxseVxuICogdXNhYmxlIGJ5IGByb2xlYC4gVGhlIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVNgIGxpbmVzIGNvdmVyIHRoZSBjYWNoZSB0YWJsZVxuICogd2hlbmV2ZXIgdGhlIHNjaGVtYSBvd25lciBjcmVhdGVzIGl0IGxhdGVyLlxuICpcbiAqIFRocm93cyBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IHdoZW4gYHJvbGVgIGlzIG5vdCBhIHBsYXVzaWJsZSBQb3N0Z3JlcyByb2xlXG4gKiBuYW1lLCBzaW5jZSB0aGUgdmFsdWUgbGFuZHMgaW4gYW4gaWRlbnRpZmllciBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKCFST0xFX1BBVFRFUk4udGVzdChyb2xlKSkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXCJyb2xlXCIsIHJvbGUsIFwiYSBQb3N0Z3JlcyByb2xlIG5hbWVcIik7XG4gIH1cbiAgY29uc3Qgc2NoZW1hID0gcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoQ0FDSEVfU0NIRU1BKTtcbiAgY29uc3QgdGFyZ2V0ID0gcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocm9sZSk7XG4gIHJldHVybiBbXG4gICAgYEdSQU5UIFVTQUdFLCBDUkVBVEUgT04gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IEdSQU5UIEFMTCBPTiBUQUJMRVMgVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFNFUVVFTkNFUyBUTyAke3RhcmdldH1gLFxuICBdO1xufVxuXG4vKipcbiAqIEdyYW50IGByb2xlYCByaWdodHMgb24gdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEsIGJ1dCBvbmx5IHdoZW4gdGhhdCBzY2hlbWFcbiAqIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIE5vLW9wcyBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBlbnYsIHdoZW4gYHJvbGVgIGlzIHVuZGVmaW5lZCwgb3Igd2hlbiB0aGVcbiAqIHNjaGVtYSBpcyBhYnNlbnQuIEJlc3QtZWZmb3J0IG90aGVyd2lzZTogYW55IGZhaWx1cmUgKGUuZy4gdGhlIGxvY2FsIGlkZW50aXR5XG4gKiBkb2Vzbid0IG93biB0aGUgc2NoZW1hKSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZCBzbyBpdCBuZXZlciBibG9ja3Mgc3RhcnR1cCAtXG4gKiBhIGRpc2FibGVkIGNhY2hlIGlzIGRlZ3JhZGVkLCBub3QgZmF0YWwuXG4gKlxuICogQHBhcmFtIHJvbGUgLSBQb3N0Z3JlcyByb2xlIHRvIGdyYW50IHRvIGFuZCBjb25uZWN0IGFzICh0aGUgcmVzb2x2ZWRcbiAqICAgd29ya3NwYWNlLWNsaWVudCBpZGVudGl0eSk7IHNraXBzIHdoZW4gdW5kZWZpbmVkLlxuICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB0byByZXBvcnQgcHJvZ3Jlc3Mgb24uIERlZmF1bHRzIHRvIHRoaXMgbW9kdWxlJ3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IHByb3Zpc2lvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IHByb3Zpc2lvbi5wcm92aXNpb25DYWNoZVNjaGVtYShcImFwcC1zZXJ2aWNlLXByaW5jaXBhbEBkYXRhYnJpY2tzLmNvbVwiKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbkNhY2hlU2NoZW1hKFxuICByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGxvZ2dlcjogbG9nLkxvZ2dlciA9IGRlZmF1bHRMb2dnZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbmZpZ1V0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHApXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXJvbGUpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKGNvdWxkIG5vdCByZXNvbHZlIGNvbm5lY3Rpbmcgcm9sZSlcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFBhc3MgYHVzZXJgIGV4cGxpY2l0bHk6IGF1dG9wZyByZXNvbHZlcyB0aGUgY29ubmVjdGlvbiB0YXJnZXRcbiAgLy8gKGhvc3QvZGF0YWJhc2UvZW5kcG9pbnQpIGJ1dCBub3QgdGhlIGlkZW50aXR5LCBzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCdzXG4gIC8vIHN5bmNocm9ub3VzIHVzZXJuYW1lIGxvb2t1cCB3b3VsZCBvdGhlcndpc2UgdGhyb3cuIGBnZXRXb3Jrc3BhY2VDbGllbnQoe30pYFxuICAvLyByZXR1cm5zIGEgZnJlc2ggZGVmYXVsdC1hdXRoIGNsaWVudCAtIGxpdGVyYWxseSBgbmV3IFdvcmtzcGFjZUNsaWVudCh7fSlgLFxuICAvLyBidXQgYnVpbHQgYWdhaW5zdCB0aGUgU0RLIHZlcnNpb24gQXBwS2l0J3MgYGNyZWF0ZUxha2ViYXNlUG9vbGAgZXhwZWN0c1xuICAvLyAoaW1wb3J0aW5nIHRoZSBTREsgY2xhc3MgZGlyZWN0bHkgaGVyZSBwdWxscyBhIG5ld2VyLCB0eXBlLWluY29tcGF0aWJsZSBjb3B5KS5cbiAgY29uc3QgcG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbChcbiAgICBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zKHtcbiAgICAgIHVzZXI6IHJvbGUsXG4gICAgICB3b3Jrc3BhY2VDbGllbnQ6IGdldFdvcmtzcGFjZUNsaWVudCh7fSksXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogQ09OTkVDVF9USU1FT1VUX01TLFxuICAgICAgc3RhdGVtZW50X3RpbWVvdXQ6IFNUQVRFTUVOVF9USU1FT1VUX01TLFxuICAgIH0pLFxuICApO1xuICB0cnkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgcG9vbC5xdWVyeShcbiAgICAgIFwiU0VMRUNUIDEgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEgV0hFUkUgc2NoZW1hX25hbWUgPSAkMVwiLFxuICAgICAgW0NBQ0hFX1NDSEVNQV0sXG4gICAgKTtcbiAgICBpZiAoZm91bmQucm93Q291bnQgPT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKHNjaGVtYSBhYnNlbnQpXCIsIHsgc2NoZW1hOiBDQUNIRV9TQ0hFTUEgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGUpKSB7XG4gICAgICBhd2FpdCBwb29sLnF1ZXJ5KHNxbCk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBncmFudGVkIGNhY2hlIHNjaGVtYVwiLCB7IHNjaGVtYTogQ0FDSEVfU0NIRU1BLCByb2xlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogY2FjaGUgcHJvdmlzaW9uaW5nIGZhaWxlZCAoY29udGludWluZylcIiwge1xuICAgICAgc2NoZW1hOiBDQUNIRV9TQ0hFTUEsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwb29sLmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxufVxuIl19
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFOUMseUVBQXlFO0FBQ3pFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsT0FBTztRQUNMLGlDQUFpQyxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3RELGdEQUFnRCxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3JFLG1EQUFtRCxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3hFLHNDQUFzQyxNQUFNLDJCQUEyQixNQUFNLEVBQUU7UUFDL0Usc0NBQXNDLE1BQU0sOEJBQThCLE1BQU0sRUFBRTtLQUNuRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLElBQXdCLEVBQ3hCLFNBQXFCLGFBQWE7SUFFbEMsSUFBSSxXQUFXLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMxRSxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUNuRixPQUFPO0lBQ1QsQ0FBQztJQUNELGdFQUFnRTtJQUNoRSwyRUFBMkU7SUFDM0UsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsaUZBQWlGO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUM3Qix5QkFBeUIsQ0FBQztRQUN4QixJQUFJLEVBQUUsSUFBSTtRQUNWLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDdkMsdUJBQXVCLEVBQUUsa0JBQWtCO1FBQzNDLGlCQUFpQixFQUFFLG9CQUFvQjtLQUN4QyxDQUFDLENBQ0gsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDNUIsa0VBQWtFLEVBQ2xFLENBQUMsWUFBWSxDQUFDLENBQ2YsQ0FBQztRQUNGLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDMUYsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsRUFBRTtZQUM1RCxNQUFNLEVBQUUsWUFBWTtZQUNwQixLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExha2ViYXNlIGNhY2hlLXNjaGVtYSBncmFudCBmaXgtdXAuXG4gKlxuICogQXBwS2l0J3MgcGVyc2lzdGVudCBjYWNoZSAoYENhY2hlTWFuYWdlcmAgLT4gYFBlcnNpc3RlbnRTdG9yYWdlYCkgdXNlcyBhXG4gKiBzY2hlbWEgYGFwcGtpdGAgYW5kIGEgdGFibGUgYGFwcGtpdC5hcHBraXRfY2FjaGVfZW50cmllc2AuIFdoZW4gdGhlIGNvbm5lY3RpbmdcbiAqIERhdGFicmlja3MgaWRlbnRpdHkgbGFja3MgcHJpdmlsZWdlcyBvbiB0aGF0IHNjaGVtYSwgdGhlIGNhY2hlIG1pZ3JhdGlvblxuICogdGhyb3dzLCBhbmQgYmVjYXVzZSBBcHBLaXQgaXMgdHlwaWNhbGx5IHJ1biB3aXRoIGBjYWNoZS5zdHJpY3RQZXJzaXN0ZW5jZTpcbiAqIHRydWVgLCB0aGUgY2FjaGUgaXMgc2lsZW50bHkgc3dpdGNoZWQgdG8gYSBkaXNhYmxlZCBpbi1tZW1vcnkgc3R1YiAtIHNvIGV2ZXJ5XG4gKiBwZXJzaXN0ZW50IHJlYWQgKGNoYXJ0IGxvbmctcG9sbCwgaGlzdG9yeSwgZXRjLikgbWlzc2VzIGFuZCA0MDRzLlxuICpcbiAqIFRoaXMgZ3JhbnRzIHRoZSBjb25uZWN0aW5nIHJvbGUgZnVsbCByaWdodHMgb24gdGhlIGNhY2hlIHNjaGVtYSwgYnV0IG9ubHkgd2hlblxuICogdGhlIHNjaGVtYSBBTFJFQURZIEVYSVNUUyAtIGl0IG5ldmVyIGNyZWF0ZXMgdGhlIHNjaGVtYSBpdHNlbGYuIFJ1biBmcm9tIGFcbiAqIExPQ0FMIGlkZW50aXR5IHRoYXQgb3ducyB0aGUgc2NoZW1hIChvciBob2xkcyBncmFudCBvcHRpb24gb24gaXQpOyBpdCBpc1xuICogc2tpcHBlZCBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCwgd2hlcmUgdGhlIGFwcCBTUCBjYW5ub3QgZ3JhbnQgYW5kIGl0c1xuICogUG9zdGdyZXMgcm9sZSBkb2VzIG5vdCBleGlzdCB1bnRpbCBpdHMgZmlyc3QgY29ubmVjdGlvbi5cbiAqXG4gKiBNdXN0IHJ1biBBRlRFUiB7QGxpbmsgYXBwbHlMYWtlYmFzZVRvRW52fSBoYXMgd3JpdHRlbiB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvblxuICogdG8gYHByb2Nlc3MuZW52YCAoc28gYGNyZWF0ZUxha2ViYXNlUG9vbGAgcGlja3MgdXAgaG9zdCAvIGRhdGFiYXNlIC8gZW5kcG9pbnQpXG4gKiBhbmQgQkVGT1JFIGBjcmVhdGVBcHBgIGluaXRpYWxpemVzIHRoZSBjYWNoZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGFrZWJhc2VQb29sLCBnZXRXb3Jrc3BhY2VDbGllbnQsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNvbmZpZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgcG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucywgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiQGRieC10b29scy9wb3N0Z3Jlc1wiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgZGVmYXVsdExvZ2dlciA9IGxvZy5sb2dnZXIoXCJwcm92aXNpb25cIik7XG5cbi8qKiBBcHBLaXQgcGVyc2lzdGVudC1jYWNoZSBzY2hlbWEgKHNlZSBBcHBLaXQncyBgUGVyc2lzdGVudFN0b3JhZ2VgKS4gKi9cbmNvbnN0IENBQ0hFX1NDSEVNQSA9IFwiYXBwa2l0XCI7XG5cbi8qKlxuICogQ2hhcmFjdGVycyBhIExha2ViYXNlIFBvc3RncmVzIHJvbGUgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluOiB3b3Jrc3BhY2VcbiAqIGlkZW50aXRpZXMgYXJlIGVtYWlscywgc2VydmljZSBwcmluY2lwYWxzIGFyZSBVVUlEcy5cbiAqL1xuY29uc3QgUk9MRV9QQVRURVJOID0gL15bQS1aYS16MC05Ll9AKy1dezEsMjU1fSQvO1xuXG4vKipcbiAqIFByb3Zpc2lvbmluZyBydW5zIGF0IGJvb3QgYXMgdGhlIGxvY2FsIGRldmVsb3BlciBpZGVudGl0eSwgYmVmb3JlIGFueSBwbHVnaW5cbiAqIGV4aXN0cywgc28gaXQgaXMgb3V0c2lkZSBBcHBLaXQncyBpbnRlcmNlcHRvciBjaGFpbiBhbmQgaW5oZXJpdHMgbm8gdGltZW91dFxuICogZnJvbSBpdC4gQm90aCBib3VuZHMgYXJlIGV4cGxpY2l0IGZvciB0aGF0IHJlYXNvbi5cbiAqL1xuY29uc3QgQ09OTkVDVF9USU1FT1VUX01TID0gMTBfMDAwO1xuY29uc3QgU1RBVEVNRU5UX1RJTUVPVVRfTVMgPSAxNV8wMDA7XG5cbi8qKlxuICogSWRlbXBvdGVudCBncmFudHMgdGhhdCBtYWtlIHRoZSAoYWxyZWFkeS1leGlzdGluZykgQXBwS2l0IGNhY2hlIHNjaGVtYSBmdWxseVxuICogdXNhYmxlIGJ5IGByb2xlYC4gVGhlIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVNgIGxpbmVzIGNvdmVyIHRoZSBjYWNoZSB0YWJsZVxuICogd2hlbmV2ZXIgdGhlIHNjaGVtYSBvd25lciBjcmVhdGVzIGl0IGxhdGVyLlxuICpcbiAqIFRocm93cyBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IHdoZW4gYHJvbGVgIGlzIG5vdCBhIHBsYXVzaWJsZSBQb3N0Z3JlcyByb2xlXG4gKiBuYW1lLCBzaW5jZSB0aGUgdmFsdWUgbGFuZHMgaW4gYW4gaWRlbnRpZmllciBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKCFST0xFX1BBVFRFUk4udGVzdChyb2xlKSkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXCJyb2xlXCIsIHJvbGUsIFwiYSBQb3N0Z3JlcyByb2xlIG5hbWVcIik7XG4gIH1cbiAgY29uc3Qgc2NoZW1hID0gcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoQ0FDSEVfU0NIRU1BKTtcbiAgY29uc3QgdGFyZ2V0ID0gcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocm9sZSk7XG4gIHJldHVybiBbXG4gICAgYEdSQU5UIFVTQUdFLCBDUkVBVEUgT04gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IEdSQU5UIEFMTCBPTiBUQUJMRVMgVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFNFUVVFTkNFUyBUTyAke3RhcmdldH1gLFxuICBdO1xufVxuXG4vKipcbiAqIEdyYW50IGByb2xlYCByaWdodHMgb24gdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEsIGJ1dCBvbmx5IHdoZW4gdGhhdCBzY2hlbWFcbiAqIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIE5vLW9wcyBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBlbnYsIHdoZW4gYHJvbGVgIGlzIHVuZGVmaW5lZCwgb3Igd2hlbiB0aGVcbiAqIHNjaGVtYSBpcyBhYnNlbnQuIEJlc3QtZWZmb3J0IG90aGVyd2lzZTogYW55IGZhaWx1cmUgKGUuZy4gdGhlIGxvY2FsIGlkZW50aXR5XG4gKiBkb2Vzbid0IG93biB0aGUgc2NoZW1hKSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZCBzbyBpdCBuZXZlciBibG9ja3Mgc3RhcnR1cCAtXG4gKiBhIGRpc2FibGVkIGNhY2hlIGlzIGRlZ3JhZGVkLCBub3QgZmF0YWwuXG4gKlxuICogQHBhcmFtIHJvbGUgLSBQb3N0Z3JlcyByb2xlIHRvIGdyYW50IHRvIGFuZCBjb25uZWN0IGFzICh0aGUgcmVzb2x2ZWRcbiAqICAgd29ya3NwYWNlLWNsaWVudCBpZGVudGl0eSk7IHNraXBzIHdoZW4gdW5kZWZpbmVkLlxuICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB0byByZXBvcnQgcHJvZ3Jlc3Mgb24uIERlZmF1bHRzIHRvIHRoaXMgbW9kdWxlJ3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IHByb3Zpc2lvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IHByb3Zpc2lvbi5wcm92aXNpb25DYWNoZVNjaGVtYShcImFwcC1zZXJ2aWNlLXByaW5jaXBhbEBkYXRhYnJpY2tzLmNvbVwiKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbkNhY2hlU2NoZW1hKFxuICByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGxvZ2dlcjogbG9nLkxvZ2dlciA9IGRlZmF1bHRMb2dnZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbmZpZ1V0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHApXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXJvbGUpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKGNvdWxkIG5vdCByZXNvbHZlIGNvbm5lY3Rpbmcgcm9sZSlcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFBhc3MgYHVzZXJgIGV4cGxpY2l0bHk6IGF1dG9wZyByZXNvbHZlcyB0aGUgY29ubmVjdGlvbiB0YXJnZXRcbiAgLy8gKGhvc3QvZGF0YWJhc2UvZW5kcG9pbnQpIGJ1dCBub3QgdGhlIGlkZW50aXR5LCBzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCdzXG4gIC8vIHN5bmNocm9ub3VzIHVzZXJuYW1lIGxvb2t1cCB3b3VsZCBvdGhlcndpc2UgdGhyb3cuIGBnZXRXb3Jrc3BhY2VDbGllbnQoe30pYFxuICAvLyByZXR1cm5zIGEgZnJlc2ggZGVmYXVsdC1hdXRoIGNsaWVudCAtIGxpdGVyYWxseSBgbmV3IFdvcmtzcGFjZUNsaWVudCh7fSlgLFxuICAvLyBidXQgYnVpbHQgYWdhaW5zdCB0aGUgU0RLIHZlcnNpb24gQXBwS2l0J3MgYGNyZWF0ZUxha2ViYXNlUG9vbGAgZXhwZWN0c1xuICAvLyAoaW1wb3J0aW5nIHRoZSBTREsgY2xhc3MgZGlyZWN0bHkgaGVyZSBwdWxscyBhIG5ld2VyLCB0eXBlLWluY29tcGF0aWJsZSBjb3B5KS5cbiAgY29uc3QgcG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbChcbiAgICBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zKHtcbiAgICAgIHVzZXI6IHJvbGUsXG4gICAgICB3b3Jrc3BhY2VDbGllbnQ6IGdldFdvcmtzcGFjZUNsaWVudCh7fSksXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogQ09OTkVDVF9USU1FT1VUX01TLFxuICAgICAgc3RhdGVtZW50X3RpbWVvdXQ6IFNUQVRFTUVOVF9USU1FT1VUX01TLFxuICAgIH0pLFxuICApO1xuICB0cnkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgcG9vbC5xdWVyeShcbiAgICAgIFwiU0VMRUNUIDEgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEgV0hFUkUgc2NoZW1hX25hbWUgPSAkMVwiLFxuICAgICAgW0NBQ0hFX1NDSEVNQV0sXG4gICAgKTtcbiAgICBpZiAoZm91bmQucm93Q291bnQgPT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKHNjaGVtYSBhYnNlbnQpXCIsIHsgc2NoZW1hOiBDQUNIRV9TQ0hFTUEgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGUpKSB7XG4gICAgICBhd2FpdCBwb29sLnF1ZXJ5KHNxbCk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBncmFudGVkIGNhY2hlIHNjaGVtYVwiLCB7IHNjaGVtYTogQ0FDSEVfU0NIRU1BLCByb2xlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogY2FjaGUgcHJvdmlzaW9uaW5nIGZhaWxlZCAoY29udGludWluZylcIiwge1xuICAgICAgc2NoZW1hOiBDQUNIRV9TQ0hFTUEsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcG9vbC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ /** Zod-owned operation contracts converted into native AppKit agent tools. */
2
+ import { type ToolRegistry } from "@databricks/appkit/beta";
3
+ import { z } from "zod";
4
+ /** Metadata stored under `appkitTool` by a Zod schema's `.meta()` value. */
5
+ export interface AppKitToolMeta {
6
+ /** Opt in to exposing this operation as an agent tool. */
7
+ readonly agentTool?: boolean;
8
+ /** Tool side-effect classification. Defaults to `write`. */
9
+ readonly effect?: "read" | "write" | "destructive";
10
+ /** Require human approval before execution. */
11
+ readonly approval?: boolean;
12
+ /** Whether execution requires an authenticated user context. */
13
+ readonly requiresUserContext?: boolean;
14
+ /** Whether repeated calls with the same input are safe. */
15
+ readonly idempotent?: boolean;
16
+ /** Whether AppKit may inherit the tool automatically. */
17
+ readonly autoInheritable?: boolean;
18
+ }
19
+ /** Shape placed in a Zod schema's `.meta()` value. */
20
+ export interface AppKitOperationSchemaMeta {
21
+ readonly appkitTool?: AppKitToolMeta;
22
+ }
23
+ /** One typed operation backed by a single Zod input contract. */
24
+ export interface AppKitOperation<TSchema extends z.ZodType = z.ZodType, TResult = unknown> {
25
+ readonly schema: TSchema;
26
+ readonly execute: (input: z.output<TSchema>, signal?: AbortSignal) => TResult | Promise<TResult>;
27
+ }
28
+ /** Preserve operation inference while declaring an exported operation map. */
29
+ export declare function defineOperations<const TSchemas extends Readonly<Record<string, z.ZodType>>>(operations: {
30
+ readonly [TName in keyof TSchemas]: AppKitOperation<TSchemas[TName], unknown>;
31
+ }): typeof operations;
32
+ /** Convert exported Zod operation contracts into a native AppKit tool registry. */
33
+ export declare function toolRegistryFromOperations(operations: Readonly<Record<string, AppKitOperation<z.ZodType, unknown>>>): ToolRegistry;