@dbx-tools/appkit-web-search 0.6.46 → 0.6.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/config.js CHANGED
@@ -45,7 +45,7 @@
45
45
  */
46
46
  import { ConfigurationError } from "@databricks/appkit";
47
47
  import { serving } from "@dbx-tools/model";
48
- import { json, object, string } from "@dbx-tools/shared-core";
48
+ import { env, json, object, string } from "@dbx-tools/shared-core";
49
49
  import { parseAllowedUrls, toUrlAllowList } from "./allowlist.js";
50
50
  /** Dedicated override for the web-search endpoint id. */
51
51
  export const MODEL_ENV = "WEB_SEARCH_MODEL";
@@ -139,20 +139,13 @@ export const WEB_SEARCH_CONFIG_SCHEMA = {
139
139
  },
140
140
  },
141
141
  };
142
- /** Parse a positive integer env/config value, else the fallback. */
143
- function resolvePositiveInt(value, envKey, fallback) {
144
- if (typeof value === "number" && Number.isFinite(value) && value > 0)
145
- return Math.floor(value);
146
- const env = Number(process.env[envKey]);
147
- return Number.isFinite(env) && env > 0 ? Math.floor(env) : fallback;
148
- }
149
142
  /**
150
143
  * Parse the `WEB_SEARCH_TOOLS` env var (JSON object), else `{}`. A value that
151
144
  * is set but not a JSON object is a deployment mistake that would otherwise
152
145
  * silently leave the built-in tool specs in place, so it throws.
153
146
  */
154
147
  function parseToolsEnv() {
155
- const raw = string.trimToNull(process.env.WEB_SEARCH_TOOLS);
148
+ const raw = env.text("WEB_SEARCH_TOOLS");
156
149
  if (raw === null)
157
150
  return {};
158
151
  const parsed = json.parseRecord(raw);
@@ -166,10 +159,10 @@ function resolveModelPin(config) {
166
159
  const fromConfig = string.trimToNull(config.model);
167
160
  if (fromConfig !== null)
168
161
  return { model: fromConfig, source: "config" };
169
- const fromModelEnv = string.trimToNull(process.env[MODEL_ENV]);
162
+ const fromModelEnv = env.text(MODEL_ENV);
170
163
  if (fromModelEnv !== null)
171
164
  return { model: fromModelEnv, source: MODEL_ENV };
172
- const fromResourceEnv = string.trimToNull(process.env[SERVING_ENDPOINT_ENV]);
165
+ const fromResourceEnv = env.text(SERVING_ENDPOINT_ENV);
173
166
  if (fromResourceEnv !== null)
174
167
  return { model: fromResourceEnv, source: SERVING_ENDPOINT_ENV };
175
168
  return { source: "none" };
@@ -179,7 +172,7 @@ function resolveModelPin(config) {
179
172
  * contradicts the allow-list entries it was given.
180
173
  */
181
174
  function resolveUrlPolicy(configured, patterns) {
182
- const raw = configured ?? string.trimToNull(process.env.WEB_SEARCH_URL_POLICY) ?? undefined;
175
+ const raw = configured ?? env.text("WEB_SEARCH_URL_POLICY") ?? undefined;
183
176
  if (raw === undefined)
184
177
  return patterns.length > 0 ? "allowlist" : "unrestricted";
185
178
  if (raw !== "allowlist" && raw !== "unrestricted") {
@@ -227,24 +220,21 @@ export function toApprovalPolicy(gate) {
227
220
  * {@link ConfigurationError} naming the field and the environment variable.
228
221
  */
229
222
  export function resolveWebSearchConfig(config = {}) {
230
- const patterns = parseAllowedUrls(config.allowedUrls ?? process.env.WEB_SEARCH_ALLOWED_URLS);
223
+ const patterns = parseAllowedUrls(config.allowedUrls ?? env.text("WEB_SEARCH_ALLOWED_URLS") ?? undefined);
231
224
  const urlPolicy = resolveUrlPolicy(config.urlPolicy, patterns);
232
225
  const { model, source } = resolveModelPin(config);
233
- const fallbacks = string.parseList(config.modelFallbacks ?? process.env.WEB_SEARCH_MODEL_FALLBACKS);
234
- const fuzzyThresholdRaw = config.modelFuzzyThreshold ?? Number(process.env.WEB_SEARCH_FUZZY_THRESHOLD);
226
+ const fallbacks = env.list(config.modelFallbacks, "WEB_SEARCH_MODEL_FALLBACKS");
235
227
  return {
236
228
  ...(model ? { model } : {}),
237
229
  modelSource: source,
238
230
  modelFallbacks: fallbacks.length > 0 ? fallbacks : DEFAULT_MODEL_FALLBACKS,
239
231
  webSearchTools: { ...parseToolsEnv(), ...(config.webSearchTools ?? {}) },
240
- fuzzy: config.modelFuzzyMatch ?? object.toBoolean(process.env.WEB_SEARCH_FUZZY) ?? true,
241
- fuzzyThreshold: Number.isFinite(fuzzyThresholdRaw) && fuzzyThresholdRaw
242
- ? Number(fuzzyThresholdRaw)
243
- : serving.DEFAULT_FUZZY_THRESHOLD,
244
- maxCitations: resolvePositiveInt(config.maxCitations, "WEB_SEARCH_MAX_CITATIONS", DEFAULT_MAX_CITATIONS),
245
- fetchMaxLength: resolvePositiveInt(config.fetchMaxLength, "WEB_SEARCH_FETCH_MAX_LENGTH", DEFAULT_FETCH_MAX_LENGTH),
246
- timeoutMs: resolvePositiveInt(config.timeoutMs, "WEB_SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
247
- scrapeFallback: config.scrapeFallback ?? object.toBoolean(process.env.WEB_SEARCH_SCRAPE_FALLBACK) ?? true,
232
+ fuzzy: env.boolean(config.modelFuzzyMatch, "WEB_SEARCH_FUZZY") ?? true,
233
+ fuzzyThreshold: env.positiveNumber(config.modelFuzzyThreshold, "WEB_SEARCH_FUZZY_THRESHOLD", serving.DEFAULT_FUZZY_THRESHOLD),
234
+ maxCitations: env.positiveInt(config.maxCitations, "WEB_SEARCH_MAX_CITATIONS", DEFAULT_MAX_CITATIONS),
235
+ fetchMaxLength: env.positiveInt(config.fetchMaxLength, "WEB_SEARCH_FETCH_MAX_LENGTH", DEFAULT_FETCH_MAX_LENGTH),
236
+ timeoutMs: env.positiveInt(config.timeoutMs, "WEB_SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
237
+ scrapeFallback: env.boolean(config.scrapeFallback, "WEB_SEARCH_SCRAPE_FALLBACK") ?? true,
248
238
  urlPolicy,
249
239
  allowList: toUrlAllowList(urlPolicy === "allowlist" ? patterns : []),
250
240
  approval: toApprovalPolicy(config.approval),
@@ -266,4 +256,4 @@ export function approvalMatches(gate, urls) {
266
256
  const list = toUrlAllowList(policy.patterns);
267
257
  return urls.some((url) => list.allows(url));
268
258
  }
269
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFrQixNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFxQixNQUFNLGdCQUFnQixDQUFDO0FBNkJyRix5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDO0FBRTVDLCtFQUErRTtBQUMvRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxrQ0FBa0MsQ0FBQztBQUt2RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBc0I7SUFDeEQseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQixrQkFBa0I7SUFDbEIsdUJBQXVCO0NBQ3hCLENBQUM7QUFFRiw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBRXhDLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFL0MsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQWtIekMsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFnQjtJQUNuRCxJQUFJLEVBQUUsUUFBUTtJQUNkLFVBQVUsRUFBRTtRQUNWLEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULDhJQUE4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QyxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHdlYi1zZWFyY2ggcGx1Z2luOiB0aGUgdHlwZWRcbiAqIHtAbGluayBXZWJTZWFyY2hQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0IGNvbmZpZyksIHRoZVxuICogSlNPTiBTY2hlbWEgdGhlIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3IgaXQsIGFuZCB7QGxpbmsgcmVzb2x2ZVdlYlNlYXJjaENvbmZpZ31cbiAqIHdoaWNoIGxheWVycyB0aGF0IGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWd9IHRoZSBydW50aW1lICsgdG9vbHMgcmVhZC5cbiAqXG4gKiBgd2ViX3NlYXJjaGAgcnVucyBvbiB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2xcbiAqIChzZWUgYHByb3ZpZGVyLnRzYCAvIGBzZWFyY2gudHNgKSwgc28gdGhlIGtleSBrbm9iIGlzIHdoaWNoIHdlYi1zZWFyY2gtXG4gKiBjYXBhYmxlIG1vZGVsIHRvIHVzZS4gSXQgcmVzb2x2ZXMgaW5kZXBlbmRlbnRseSBvZiB0aGUgY2FsbGluZyBhZ2VudCdzIGNoYXRcbiAqIG1vZGVsOiBgbW9kZWxgIChhIG5hbWUsIGxvb3NlIG5hbWUsIG9yIGNhcGFiaWxpdHkgY2xhc3MpIGlzIGZ1enp5LW1hdGNoZWRcbiAqIGFnYWluc3QgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUsIGFuZCB3aGVuIG5vdGhpbmcgaXMgcGlubmVkIHRoZVxuICoge0BsaW5rIFdlYlNlYXJjaFBsdWdpbkNvbmZpZy5tb2RlbEZhbGxiYWNrc30gb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQsIHRoZW4gYVxuICogcmVwbyBmbG9vcikgcGlja3MgdGhlIGZpcnN0IHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludCB0aGF0IGV4aXN0cy5cbiAqXG4gKiBXaGljaCBlbmRwb2ludCBpZCBpcyB1c2VkIGZvbGxvd3MgdGhlIHN0YW5kYXJkIHByZWNlZGVuY2UgLSBleHBsaWNpdCBwbHVnaW5cbiAqIGNvbmZpZywgdGhlbiBlbnZpcm9ubWVudCwgdGhlbiBhIGRlZmF1bHQgLSB3aXRoIHR3byBlbnZpcm9ubWVudCBzb3VyY2VzOlxuICpcbiAqICAgMS4gYG1vZGVsYCBpbiBwbHVnaW4gY29uZmlnO1xuICogICAyLiBgV0VCX1NFQVJDSF9NT0RFTGAsIHRoZSBkZWRpY2F0ZWQgb3ZlcnJpZGUsIHNvIGEgZGVwbG95bWVudCBjYW4gcG9pbnRcbiAqICAgICAgd2ViIHNlYXJjaCBhdCBhIGRpZmZlcmVudCBlbmRwb2ludCB0aGFuIHRoZSBhZ2VudCdzIGNoYXQgbW9kZWw7XG4gKiAgIDMuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAsIEFwcEtpdCdzIHN0YW5kYXJkIG5hbWUgZm9yIGFcbiAqICAgICAgTW9kZWwgU2VydmluZyBiaW5kaW5nLCBob25vcmVkIHNvIHRoZSByZXNvdXJjZSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3RcbiAqICAgICAgd2lyZXMgdGhpcyBwbHVnaW4gdXAgbGlrZSBhbnkgb3RoZXIuIEJlY2F1c2UgdGhhdCBiaW5kaW5nIGlzIHNoYXJlZFxuICogICAgICB3aXRoIHdoYXRldmVyIGVsc2UgdGhlIGFwcCBzZXJ2ZXMsIGl0IGlzIHRyZWF0ZWQgYXMgYSBwcmVmZXJlbmNlOiBhblxuICogICAgICBlbmRwb2ludCB0aGF0IGNhbm5vdCBydW4gdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgaXMgc2tpcHBlZCBpblxuICogICAgICBmYXZvciBvZiB7QGxpbmsgV2ViU2VhcmNoUGx1Z2luQ29uZmlnLm1vZGVsRmFsbGJhY2tzfSByYXRoZXIgdGhhblxuICogICAgICBmYWlsaW5nIHRoZSBjYWxsLiBBIHBpbiBmcm9tICgxKSBvciAoMikgaXMgZXhwbGljaXQgYW5kIERPRVMgZmFpbDtcbiAqICAgNC4gb3RoZXJ3aXNlIHRoZSBmYWxsYmFjayBvcmRlciwgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUuXG4gKlxuICogV2hpY2ggbW9kZWwgd2lucyBpcyBkZWNpZGVkIGxhemlseSwgYXQgY2FsbCB0aW1lLCBhZ2FpbnN0IHRoZSBsaXZlXG4gKiBjYXRhbG9ndWUuIFJlc29sdXRpb24gaGVyZSBpcyBlYWdlciBhYm91dCBldmVyeXRoaW5nIGVsc2UgYW5kIGZhaWxzIGxvdWRseVxuICogb24gYSBjb250cmFkaWN0aW9uOiBhbiB1bnBhcnNlYWJsZSBgV0VCX1NFQVJDSF9UT09MU2AsIGFuIHVua25vd25cbiAqIHtAbGluayBVcmxQb2xpY3lNb2RlfSwgb3IgYSBVUkwgcG9saWN5IHRoYXQgZGlzYWdyZWVzIHdpdGggdGhlIGFsbG93LWxpc3QgaXRcbiAqIHdhcyBnaXZlbi5cbiAqXG4gKiBFbnYgZmFsbGJhY2tzOiBgV0VCX1NFQVJDSF9NT0RFTGAsIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAsXG4gKiBgV0VCX1NFQVJDSF9NT0RFTF9GQUxMQkFDS1NgLCBgV0VCX1NFQVJDSF9UT09MU2AgKEpTT04pLFxuICogYFdFQl9TRUFSQ0hfVVJMX1BPTElDWWAsIGBXRUJfU0VBUkNIX0FMTE9XRURfVVJMU2AsXG4gKiBgV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TYCwgYFdFQl9TRUFSQ0hfRkVUQ0hfTUFYX0xFTkdUSGAsXG4gKiBgV0VCX1NFQVJDSF9USU1FT1VUX01TYCwgYFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLYCwgYFdFQl9TRUFSQ0hfRlVaWllgLFxuICogYFdFQl9TRUFSQ0hfRlVaWllfVEhSRVNIT0xEYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCB0eXBlIEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBzZXJ2aW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGpzb24sIG9iamVjdCwgdHlwZSBPbmVPck1hbnksIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBwYXJzZUFsbG93ZWRVcmxzLCB0b1VybEFsbG93TGlzdCwgdHlwZSBVcmxBbGxvd0xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcblxuLyoqXG4gKiBBIFVSTC1wYXR0ZXJuIGdhdGUgZm9yIHBlci10b29sIGFwcHJvdmFsLiBgdHJ1ZWAgZ2F0ZXMgZXZlcnkgY2FsbDsgYVxuICogcGF0dGVybiAob3IgbGlzdCBvZiBwYXR0ZXJucywgaW4gdGhlIHtAbGluayBPbmVPck1hbnl9IHNoYXBlIHVzZWQgYWNyb3NzXG4gKiB0aGUgcmVwbykgZ2F0ZXMgb25seSBjYWxscyB3aG9zZSBVUkwgbWF0Y2hlcy4gUGF0dGVybnMgdXNlIHRoZSBzYW1lIGdsb2JcbiAqIHN5bnRheCBhcyB0aGUgYWxsb3ctbGlzdCAoc2VlIGBhbGxvd2xpc3QudHNgKS4gT21pdCAvIGBmYWxzZWAgZm9yIG5vXG4gKiBhcHByb3ZhbC4gTm9ybWFsaXplZCB0byBhbiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9IGJlZm9yZSB1c2UuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcHJvdmFsR2F0ZSA9IGJvb2xlYW4gfCBPbmVPck1hbnk8c3RyaW5nPiB8IHN0cmluZztcblxuLyoqXG4gKiBUaGUgbm9ybWFsaXplZCBmb3JtIG9mIGFuIHtAbGluayBBcHByb3ZhbEdhdGV9OiB3aGljaCBjYWxscyBwYXVzZSBmb3IgYVxuICogaHVtYW4uIGBcIm5vbmVcImAgcnVucyBldmVyeSBjYWxsIHN0cmFpZ2h0IHRocm91Z2gsIGBcImFsd2F5c1wiYCBnYXRlcyBhbGwgb2ZcbiAqIHRoZW0sIGFuZCBgXCJ1cmxzXCJgIGdhdGVzIG9ubHkgY2FsbHMgd2hvc2UgVVJMIG1hdGNoZXMgb25lIG9mIGBwYXR0ZXJuc2AuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcHJvdmFsUG9saWN5ID1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwibm9uZVwiIH1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwiYWx3YXlzXCIgfVxuICB8IHsgcmVhZG9ubHkgbW9kZTogXCJ1cmxzXCI7IHJlYWRvbmx5IHBhdHRlcm5zOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG4vKipcbiAqIFdoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaC4gYFwiYWxsb3dsaXN0XCJgIHBlcm1pdHMgb25seSB0aGUgY29uZmlndXJlZFxuICogZW50cmllczsgYFwidW5yZXN0cmljdGVkXCJgIG5hbWVzIHRoZSBwZXJtaXNzaXZlIG1vZGUgZXhwbGljaXRseSwgc28gYW5cbiAqIHVucmVzdHJpY3RlZCBkZXBsb3ltZW50IGlzIGEgc3RhdGVkIGNob2ljZSB2aXNpYmxlIGluIHRoZSBib290IGxvZyByYXRoZXJcbiAqIHRoYW4gYW4gZW1wdHkgbGlzdCBub2JvZHkgbm90aWNlZC5cbiAqL1xuZXhwb3J0IHR5cGUgVXJsUG9saWN5TW9kZSA9IFwidW5yZXN0cmljdGVkXCIgfCBcImFsbG93bGlzdFwiO1xuXG4vKiogRGVkaWNhdGVkIG92ZXJyaWRlIGZvciB0aGUgd2ViLXNlYXJjaCBlbmRwb2ludCBpZC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9FTlYgPSBcIldFQl9TRUFSQ0hfTU9ERUxcIjtcblxuLyoqIEFwcEtpdCdzIHN0YW5kYXJkIGVudmlyb25tZW50IG5hbWUgZm9yIGEgTW9kZWwgU2VydmluZyBlbmRwb2ludCBiaW5kaW5nLiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZJTkdfRU5EUE9JTlRfRU5WID0gXCJEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRVwiO1xuXG4vKiogV2hlcmUgdGhlIHBpbm5lZCB3ZWItc2VhcmNoIGVuZHBvaW50IGlkIGNhbWUgZnJvbSwgb3IgYFwibm9uZVwiYCB3aGVuIHVucGlubmVkLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxTb3VyY2UgPSBcImNvbmZpZ1wiIHwgdHlwZW9mIE1PREVMX0VOViB8IHR5cGVvZiBTRVJWSU5HX0VORFBPSU5UX0VOViB8IFwibm9uZVwiO1xuXG4vKipcbiAqIERlZmF1bHQgd2ViLXNlYXJjaCBtb2RlbCBwcmVmZXJlbmNlLCB0cmllZCBpbiBvcmRlciB3aGVuIG5vIG1vZGVsIGlzXG4gKiBwaW5uZWQuIEdlbWluaSBmaXJzdCwgdGhlbiBHUFQgLSBib3RoIHN1cHBvcnQgdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2w7XG4gKiBhIHdvcmtzcGFjZSB0eXBpY2FsbHkgaGFzIGF0IGxlYXN0IG9uZS4gRWFjaCBpcyBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlXG4gKiBsaXZlIGNhdGFsb2d1ZSwgc28gYSBjbG9zZSB2YXJpYW50IChlLmcuIGBkYXRhYnJpY2tzLWdlbWluaS0zLTEtcHJvYCkgaXNcbiAqIHBpY2tlZCB3aGVuIHRoZSBleGFjdCBpZCBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBcImRhdGFicmlja3MtZ2VtaW5pLTMtcHJvXCIsXG4gIFwiZGF0YWJyaWNrcy1nZW1pbmktMi01LXByb1wiLFxuICBcImRhdGFicmlja3MtZ3B0LTVcIixcbiAgXCJkYXRhYnJpY2tzLWdwdC01LW1pbmlcIixcbl07XG5cbi8qKiBEZWZhdWx0IGNhcCBvbiB0aGUgbnVtYmVyIG9mIGNpdGF0aW9ucyByZXR1cm5lZCBmcm9tIGEgc2luZ2xlIHNlYXJjaC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9DSVRBVElPTlMgPSAxMDtcblxuLyoqIERlZmF1bHQgY2FwIG9uIGNoYXJhY3RlcnMgcmV0dXJuZWQgZnJvbSBhIHNpbmdsZSBgd2ViX2ZldGNoYC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZFVENIX01BWF9MRU5HVEggPSA1MF8wMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1yZXF1ZXN0IG5ldHdvcmsgdGltZW91dCAobXMpIGZvciBzZWFyY2ggKyBmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKiBBcHBLaXQgY29uZmlnIGFjY2VwdGVkIGJ5IHRoZSB3ZWItc2VhcmNoIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VhcmNoUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgd2ViLXNlYXJjaCBtb2RlbCB0byB1c2UgYnkgZGVmYXVsdDogYSBEYXRhYnJpY2tzIHNlcnZpbmcgZW5kcG9pbnRcbiAgICogbmFtZSAoYFwiZGF0YWJyaWNrcy1nZW1pbmktMy1wcm9cImApLCBhIGxvb3NlIG5hbWUgKGBcImdlbWluaVwiYCwgYFwiZ3B0XCJgKSxcbiAgICogb3IgYSBjYXBhYmlsaXR5IGNsYXNzLiBGdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlLiBGYWxsc1xuICAgKiBiYWNrIHRvIGBXRUJfU0VBUkNIX01PREVMYCwgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLCB0aGVuXG4gICAqIHRoZSB7QGxpbmsgbW9kZWxGYWxsYmFja3N9IG9yZGVyLiBDaG9zZW4gaW5kZXBlbmRlbnRseSBvZiB0aGUgY2FsbGluZ1xuICAgKiBhZ2VudCdzIGNoYXQgbW9kZWwuXG4gICAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFByaW9yaXR5LW9yZGVyZWQgd2ViLXNlYXJjaCBtb2RlbCBjYW5kaWRhdGVzIHRyaWVkIHdoZW4ge0BsaW5rIG1vZGVsfSBpc1xuICAgKiB1bnNldCwgZWFjaCBmdXp6eS1tYXRjaGVkIGFuZCBjaGVja2VkIGZvciB3ZWItc2VhcmNoIHN1cHBvcnQuIEZhbGxzIGJhY2tcbiAgICogdG8gYFdFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTYCAoY29tbWEvc3BhY2Utc2VwYXJhdGVkKSwgdGhlblxuICAgKiB7QGxpbmsgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1N9IChHZW1pbmksIHRoZW4gR1BUKS5cbiAgICovXG4gIG1vZGVsRmFsbGJhY2tzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBQcm92aWRlciAtPiB0b29sLXNwZWMgb3ZlcnJpZGUgbWFwLCBtZXJnZWQgb3ZlciB0aGUgYnVpbHQtaW5cbiAgICoge0BsaW5rIFdFQl9TRUFSQ0hfUFJPVklERVJTfSBkZWZhdWx0cy4gS2V5ZWQgYnkgcHJvdmlkZXIgZmFtaWx5XG4gICAqIChgXCJvcGVuYWlcImAsIGBcImdlbWluaVwiYCk7IGVhY2ggdmFsdWUgbWF5IG92ZXJyaWRlIHRoZSBgdG9vbGAgZW50cnlcbiAgICogYW5kL29yIHRoZSBgYXBpYCBzdXJmYWNlLiBVc2UgdG8gY2hhbmdlIHRoZSB0b29sIHNoYXBlIGFzIHRoZSBwbGF0Zm9ybVxuICAgKiBldm9sdmVzIHdpdGhvdXQgYSBjb2RlIGNoYW5nZS4gRmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9UT09MU2AgcGFyc2VkIGFzXG4gICAqIEpTT04uIFRoaXMgaXMgdGhlIGBXRUJfU0VBUkNIX1RPT0xTYCBzZXR0aW5nLlxuICAgKi9cbiAgd2ViU2VhcmNoVG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIEVuYWJsZSBmdXp6eSBtYXRjaGluZyBvZiBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSBjYXRhbG9ndWUuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYDsgZmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9GVVpaWWAuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyBmdXp6eSB0aHJlc2hvbGQuIEZhbGxzIGJhY2sgdG8gYFdFQl9TRUFSQ0hfRlVaWllfVEhSRVNIT0xEYCwgdGhlbiB0aGUgc2hhcmVkIGRlZmF1bHQuICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIYXJkIGNhcCBvbiB0aGUgbnVtYmVyIG9mIGNpdGF0aW9ucyBhIHNpbmdsZSBzZWFyY2ggcmV0dXJucy4gRmFsbHMgYmFja1xuICAgKiB0byBgV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9NQVhfQ0lUQVRJT05TfS5cbiAgICovXG4gIG1heENpdGF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhhcmQgY2FwIG9uIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGEgc2luZ2xlIGB3ZWJfZmV0Y2hgIHJlc3VsdC4gRmFsbHNcbiAgICogYmFjayB0byBgV0VCX1NFQVJDSF9GRVRDSF9NQVhfTEVOR1RIYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9GRVRDSF9NQVhfTEVOR1RIfS5cbiAgICovXG4gIGZldGNoTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IGluIG1zIGZvciBzZWFyY2ggKyBmZXRjaC4gRmFsbHMgYmFjayB0b1xuICAgKiBgV0VCX1NFQVJDSF9USU1FT1VUX01TYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9USU1FT1VUX01TfS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZhbGwgYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgTk8gZGVwbG95ZWRcbiAgICogd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIChubyBHUFQgLyBHZW1pbmkgc2VydmluZyBlbmRwb2ludCkuIFRoZSBuYXRpdmVcbiAgICogRGF0YWJyaWNrcyB0b29sIGlzIGFsd2F5cyBwcmVmZXJyZWQ7IHRoaXMgb25seSBraWNrcyBpbiB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIG5hdGl2ZSBvcHRpb24sIHNvIHRoZSB0b29sIHN0aWxsIHJldHVybnMgcmVzdWx0cyBpbnN0ZWFkIG9mIGVycm9yaW5nLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldCBgZmFsc2VgIChvciBgV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0s9MGApIHRvXG4gICAqIHJlcXVpcmUgYSBuYXRpdmUgbW9kZWwgYW5kIGVycm9yIG90aGVyd2lzZS5cbiAgICovXG4gIHNjcmFwZUZhbGxiYWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaCAoe0BsaW5rIFVybFBvbGljeU1vZGV9KS4gRmFsbHMgYmFjayB0b1xuICAgKiBgV0VCX1NFQVJDSF9VUkxfUE9MSUNZYCwgdGhlbiB0byBgXCJhbGxvd2xpc3RcImAgd2hlbiB7QGxpbmsgYWxsb3dlZFVybHN9XG4gICAqIGhhcyBlbnRyaWVzIGFuZCBgXCJ1bnJlc3RyaWN0ZWRcImAgd2hlbiBpdCBkb2VzIG5vdC4gTmFtaW5nIHRoZSBtb2RlXG4gICAqIGV4cGxpY2l0bHkgaXMgdGhlIHdheSB0byBzdGF0ZSB0aGF0IGFuIG9wZW4gZGVwbG95bWVudCBpcyBpbnRlbmRlZDtcbiAgICogYFwiYWxsb3dsaXN0XCJgIHdpdGggbm8gZW50cmllcywgb3IgYFwidW5yZXN0cmljdGVkXCJgIGFsb25nc2lkZSBlbnRyaWVzLCBpc1xuICAgKiBhIGNvbnRyYWRpY3Rpb24gYW5kIGZhaWxzIGF0IHJlc29sdXRpb24uXG4gICAqL1xuICB1cmxQb2xpY3k/OiBVcmxQb2xpY3lNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgVVJMIGFsbG93LWxpc3QuIEVhY2ggZW50cnkgaXMgYSBnbG9iIChvciBiYXJlIGhvc3QpIHRlc3RlZFxuICAgKiBhZ2FpbnN0IGEgVVJMJ3MgZnVsbCBgaHJlZmAuIFdoZW4gc2V0LCBgd2ViX3NlYXJjaGAgc2lsZW50bHkgZmlsdGVyc1xuICAgKiBjaXRhdGlvbnMgdG8gdGhlIHBlcm1pdHRlZCBzZXQgYW5kIGB3ZWJfZmV0Y2hgIHJlZnVzZXMgYSBkaXNhbGxvd2VkIFVSTC5cbiAgICogQWNjZXB0cyBhIGBzdHJpbmdbXWAgb3IgYSBjb21tYS0vd2hpdGVzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nOyBmYWxscyBiYWNrXG4gICAqIHRvIGBXRUJfU0VBUkNIX0FMTE9XRURfVVJMU2AuIE9taXQgKG9yIGxlYXZlIGVtcHR5KSBmb3Igbm8gcmVzdHJpY3Rpb24uXG4gICAqIFNlZSBgYWxsb3dsaXN0LnRzYC5cbiAgICovXG4gIGFsbG93ZWRVcmxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBBcHByb3ZhbCBnYXRlIGFwcGxpZWQgdG8gQk9USCB0b29scyAocGVyLXRvb2wgb3ZlcnJpZGVzIHZpYVxuICAgKiB7QGxpbmsgV2ViU2VhcmNoVG9vbE9wdGlvbnMuYXBwcm92YWx9IHdpbikuIGB0cnVlYCBnYXRlcyBldmVyeSBjYWxsO1xuICAgKiBhIFVSTC1wYXR0ZXJuIChvciBsaXN0KSBnYXRlcyBvbmx5IG1hdGNoaW5nIGNhbGxzOyBhblxuICAgKiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9IHN0YXRlcyB0aGUgbW9kZSBkaXJlY3RseS4gT21pdCBmb3Igbm8gYXBwcm92YWwuXG4gICAqL1xuICBhcHByb3ZhbD86IEFwcHJvdmFsR2F0ZSB8IEFwcHJvdmFsUG9saWN5O1xufVxuXG4vKiogQ29uY3JldGUsIHZhbGlkYXRlZCBjb25maWcgdGhlIHJ1bnRpbWUgKyB0b29scyByZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyB7XG4gIC8qKiBQaW5uZWQgd2ViLXNlYXJjaCBtb2RlbCwgd2hlbiBjb25maWd1cmVkIChlbHNlIHVuZGVmaW5lZCAtIHVzZSBmYWxsYmFja3MpLiAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqIFdoZXJlIHtAbGluayBtb2RlbH0gY2FtZSBmcm9tLCB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW4gdW5zdXBwb3J0ZWQgcGluIGlzIGZhdGFsLiAqL1xuICBtb2RlbFNvdXJjZTogTW9kZWxTb3VyY2U7XG4gIC8qKiBPcmRlcmVkIGZhbGxiYWNrIG1vZGVsIGNhbmRpZGF0ZXMgKEdlbWluaSwgdGhlbiBHUFQsIHRoZW4gYSBmbG9vcikuICovXG4gIG1vZGVsRmFsbGJhY2tzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFByb3ZpZGVyIC0+IHRvb2wtc3BlYyBvdmVycmlkZSBtYXAsIG1lcmdlZCBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cy4gKi9cbiAgd2ViU2VhcmNoVG9vbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogV2hldGhlciB0byBmdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcy4gKi9cbiAgZnV6enk6IGJvb2xlYW47XG4gIC8qKiBGdXNlLmpzIGZ1enp5IHRocmVzaG9sZC4gKi9cbiAgZnV6enlUaHJlc2hvbGQ6IG51bWJlcjtcbiAgbWF4Q2l0YXRpb25zOiBudW1iZXI7XG4gIGZldGNoTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBzY3JhcGUtZmFsbGJhY2sgd2hlbiBubyBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBpcyBkZXBsb3llZC4gKi9cbiAgc2NyYXBlRmFsbGJhY2s6IGJvb2xlYW47XG4gIC8qKiBUaGUgbmFtZWQgVVJMIHBvbGljeSBpbiBmb3JjZS4gKi9cbiAgdXJsUG9saWN5OiBVcmxQb2xpY3lNb2RlO1xuICAvKiogQ29tcGlsZWQgYWxsb3ctbGlzdCAocGVybWl0LWFsbCB1bmRlciB0aGUgYHVucmVzdHJpY3RlZGAgcG9saWN5KS4gKi9cbiAgYWxsb3dMaXN0OiBVcmxBbGxvd0xpc3Q7XG4gIC8qKiBEZWZhdWx0IHBlci10b29sIGFwcHJvdmFsIHBvbGljeS4gKi9cbiAgYXBwcm92YWw6IEFwcHJvdmFsUG9saWN5O1xufVxuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYC4gKi9cbmV4cG9ydCBjb25zdCBXRUJfU0VBUkNIX0NPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgbW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEZWZhdWx0IHdlYi1zZWFyY2ggbW9kZWwgKGVuZHBvaW50IG5hbWUsIGxvb3NlIG5hbWUsIG9yIGNsYXNzKS4gRnV6enktbWF0Y2hlZC4gRW52OiBXRUJfU0VBUkNIX01PREVMLCB0aGVuIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk9yZGVyZWQgd2ViLXNlYXJjaCBtb2RlbCBjYW5kaWRhdGVzIHdoZW4gYG1vZGVsYCBpcyB1bnNldCAoR2VtaW5pLCB0aGVuIEdQVCkuIEVudjogV0VCX1NFQVJDSF9NT0RFTF9GQUxMQkFDS1MuXCIsXG4gICAgfSxcbiAgICB3ZWJTZWFyY2hUb29sczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnUHJvdmlkZXIgLT4gdG9vbC1zcGVjIG92ZXJyaWRlIG1hcCBtZXJnZWQgb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMgKG9wZW5haSAtPiB7XCJ0eXBlXCI6XCJ3ZWJfc2VhcmNoXCJ9LCBnZW1pbmkgLT4ge1wiZ29vZ2xlX3NlYXJjaFwiOnt9fSkuIEVudjogV0VCX1NFQVJDSF9UT09MUyAoSlNPTikuJyxcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZS4gRGVmYXVsdCB0cnVlIChlbnY6IFdFQl9TRUFSQ0hfRlVaWlkpLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGJlbG93IHdoaWNoIGEgZnV6enkgbW9kZWwgbWF0Y2ggaXMgYWNjZXB0ZWQgKGVudjogV0VCX1NFQVJDSF9GVVpaWV9USFJFU0hPTEQpLlwiLFxuICAgIH0sXG4gICAgbWF4Q2l0YXRpb25zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSGFyZCBjYXAgb24gY2l0YXRpb25zIHJldHVybmVkIChlbnY6IFdFQl9TRUFSQ0hfTUFYX0NJVEFUSU9OUykuXCIsXG4gICAgfSxcbiAgICBmZXRjaE1heExlbmd0aDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkhhcmQgY2FwIG9uIHdlYl9mZXRjaCBjb250ZW50IGxlbmd0aCAoZW52OiBXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEgpLlwiLFxuICAgIH0sXG4gICAgdGltZW91dE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IGluIG1zIChlbnY6IFdFQl9TRUFSQ0hfVElNRU9VVF9NUykuXCIsXG4gICAgfSxcbiAgICBzY3JhcGVGYWxsYmFjazoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGYWxsIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSB3aGVuIG5vIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBpcyBkZXBsb3llZC4gRGVmYXVsdCB0cnVlIChlbnY6IFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLKS5cIixcbiAgICB9LFxuICAgIHVybFBvbGljeToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcInVucmVzdHJpY3RlZFwiLCBcImFsbG93bGlzdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIldoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaC4gRGVmYXVsdHMgdG8gYWxsb3dsaXN0IHdoZW4gYWxsb3dlZFVybHMgaGFzIGVudHJpZXMsIGVsc2UgdW5yZXN0cmljdGVkIChlbnY6IFdFQl9TRUFSQ0hfVVJMX1BPTElDWSkuXCIsXG4gICAgfSxcbiAgICBhbGxvd2VkVXJsczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdVUkwgYWxsb3ctbGlzdCBvZiBnbG9icyAvIGJhcmUgaG9zdHMgKGUuZy4gXCIqLmRhdGFicmlja3MuY29tXCIsIFwiZG9jcy5leGFtcGxlLmNvbVwiKS4gQWxzbyBhY2NlcHRzIGEgY29tbWEvc3BhY2Utc2VwYXJhdGVkIHN0cmluZy4gRmFsbHMgYmFjayB0byBXRUJfU0VBUkNIX0FMTE9XRURfVVJMUy4gRW1wdHkgPSB1bnJlc3RyaWN0ZWQuJyxcbiAgICB9LFxuICAgIGFwcHJvdmFsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0FwcHJvdmFsIGdhdGUgZm9yIGJvdGggdG9vbHM6IHRydWUgZ2F0ZXMgZXZlcnkgY2FsbCwgYSBnbG9iIChvciBsaXN0IG9mIGdsb2JzKSBnYXRlcyBvbmx5IG1hdGNoaW5nIFVSTHMsIG9yIHN0YXRlIHRoZSBtb2RlIGRpcmVjdGx5IGFzIHtcIm1vZGVcIjpcIm5vbmVcInxcImFsd2F5c1wifFwidXJsc1wifS4gRGVmYXVsdCBub25lLicsXG4gICAgICBvbmVPZjogW1xuICAgICAgICB7IHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gICAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1vZGU6IHsgdHlwZTogXCJzdHJpbmdcIiwgZW51bTogW1wibm9uZVwiLCBcImFsd2F5c1wiLCBcInVybHNcIl0gfSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wibW9kZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKiBQYXJzZSBhIHBvc2l0aXZlIGludGVnZXIgZW52L2NvbmZpZyB2YWx1ZSwgZWxzZSB0aGUgZmFsbGJhY2suICovXG5mdW5jdGlvbiByZXNvbHZlUG9zaXRpdmVJbnQodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZW52S2V5OiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwKSByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSk7XG4gIGNvbnN0IGVudiA9IE51bWJlcihwcm9jZXNzLmVudltlbnZLZXldKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShlbnYpICYmIGVudiA+IDAgPyBNYXRoLmZsb29yKGVudikgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgYFdFQl9TRUFSQ0hfVE9PTFNgIGVudiB2YXIgKEpTT04gb2JqZWN0KSwgZWxzZSBge31gLiBBIHZhbHVlIHRoYXRcbiAqIGlzIHNldCBidXQgbm90IGEgSlNPTiBvYmplY3QgaXMgYSBkZXBsb3ltZW50IG1pc3Rha2UgdGhhdCB3b3VsZCBvdGhlcndpc2VcbiAqIHNpbGVudGx5IGxlYXZlIHRoZSBidWlsdC1pbiB0b29sIHNwZWNzIGluIHBsYWNlLCBzbyBpdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVG9vbHNFbnYoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCByYXcgPSBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudi5XRUJfU0VBUkNIX1RPT0xTKTtcbiAgaWYgKHJhdyA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKHJhdyk7XG4gIGlmICghcGFyc2VkKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgIFwiV0VCX1NFQVJDSF9UT09MUyBtdXN0IGJlIGEgSlNPTiBvYmplY3QgbWFwcGluZyBhIHByb3ZpZGVyIGZhbWlseSB0byBpdHMgdG9vbCBzcGVjXCIsXG4gICAgICB7IGNvbnRleHQ6IHsgZW52VmFyOiBcIldFQl9TRUFSQ0hfVE9PTFNcIiB9IH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKiogUmVhZCB0aGUgcGlubmVkIGVuZHBvaW50IGlkIGFuZCByZWNvcmQgd2hpY2ggc291cmNlIHN1cHBsaWVkIGl0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsUGluKGNvbmZpZzogV2ViU2VhcmNoUGx1Z2luQ29uZmlnKTogeyBtb2RlbD86IHN0cmluZzsgc291cmNlOiBNb2RlbFNvdXJjZSB9IHtcbiAgY29uc3QgZnJvbUNvbmZpZyA9IHN0cmluZy50cmltVG9OdWxsKGNvbmZpZy5tb2RlbCk7XG4gIGlmIChmcm9tQ29uZmlnICE9PSBudWxsKSByZXR1cm4geyBtb2RlbDogZnJvbUNvbmZpZywgc291cmNlOiBcImNvbmZpZ1wiIH07XG4gIGNvbnN0IGZyb21Nb2RlbEVudiA9IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52W01PREVMX0VOVl0pO1xuICBpZiAoZnJvbU1vZGVsRW52ICE9PSBudWxsKSByZXR1cm4geyBtb2RlbDogZnJvbU1vZGVsRW52LCBzb3VyY2U6IE1PREVMX0VOViB9O1xuICBjb25zdCBmcm9tUmVzb3VyY2VFbnYgPSBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltTRVJWSU5HX0VORFBPSU5UX0VOVl0pO1xuICBpZiAoZnJvbVJlc291cmNlRW52ICE9PSBudWxsKSByZXR1cm4geyBtb2RlbDogZnJvbVJlc291cmNlRW52LCBzb3VyY2U6IFNFUlZJTkdfRU5EUE9JTlRfRU5WIH07XG4gIHJldHVybiB7IHNvdXJjZTogXCJub25lXCIgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBuYW1lZCB7QGxpbmsgVXJsUG9saWN5TW9kZX0sIGZhaWxpbmcgb24gYSBzdGF0ZWQgbW9kZSB0aGF0XG4gKiBjb250cmFkaWN0cyB0aGUgYWxsb3ctbGlzdCBlbnRyaWVzIGl0IHdhcyBnaXZlbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVybFBvbGljeShcbiAgY29uZmlndXJlZDogVXJsUG9saWN5TW9kZSB8IHVuZGVmaW5lZCxcbiAgcGF0dGVybnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogVXJsUG9saWN5TW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ3VyZWQgPz8gc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuV0VCX1NFQVJDSF9VUkxfUE9MSUNZKSA/PyB1bmRlZmluZWQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHBhdHRlcm5zLmxlbmd0aCA+IDAgPyBcImFsbG93bGlzdFwiIDogXCJ1bnJlc3RyaWN0ZWRcIjtcbiAgaWYgKHJhdyAhPT0gXCJhbGxvd2xpc3RcIiAmJiByYXcgIT09IFwidW5yZXN0cmljdGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgJ3VybFBvbGljeSBtdXN0IGJlIFwiYWxsb3dsaXN0XCIgb3IgXCJ1bnJlc3RyaWN0ZWRcIiAoZW52OiBXRUJfU0VBUkNIX1VSTF9QT0xJQ1kpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJ1cmxQb2xpY3lcIiwgZW52VmFyOiBcIldFQl9TRUFSQ0hfVVJMX1BPTElDWVwiIH0gfSxcbiAgICApO1xuICB9XG4gIGlmIChyYXcgPT09IFwiYWxsb3dsaXN0XCIgJiYgcGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICd1cmxQb2xpY3kgXCJhbGxvd2xpc3RcIiBuZWVkcyBhdCBsZWFzdCBvbmUgZW50cnkgaW4gYWxsb3dlZFVybHMgKGVudjogV0VCX1NFQVJDSF9BTExPV0VEX1VSTFMpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJhbGxvd2VkVXJsc1wiLCBlbnZWYXI6IFwiV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNcIiB9IH0sXG4gICAgKTtcbiAgfVxuICBpZiAocmF3ID09PSBcInVucmVzdHJpY3RlZFwiICYmIHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgJ3VybFBvbGljeSBcInVucmVzdHJpY3RlZFwiIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFsbG93ZWRVcmxzIGVudHJpZXM7IGRyb3AgdGhlIGVudHJpZXMgb3Igc2V0IHVybFBvbGljeSB0byBcImFsbG93bGlzdFwiJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJhbGxvd2VkVXJsc1wiLCBlbnZWYXI6IFwiV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNcIiB9IH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbnkgYWNjZXB0ZWQgYXBwcm92YWwgc3BlbGxpbmcgaW50byBhbiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9LlxuICogQSBwYXR0ZXJuIGdhdGUgd2l0aCBubyB1c2FibGUgcGF0dGVybnMgY29sbGFwc2VzIHRvIGBcIm5vbmVcImAgcmF0aGVyIHRoYW5cbiAqIGdhdGluZyBldmVyeXRoaW5nLCBzbyBhIGJsYW5rIGVudiB2YXIgY2FuIG5ldmVyIHdlZGdlIHRoZSB0b29scyBiZWhpbmQgYW5cbiAqIGFwcHJvdmFsIG5vYm9keSBjb25maWd1cmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcHByb3ZhbFBvbGljeShnYXRlOiBBcHByb3ZhbEdhdGUgfCBBcHByb3ZhbFBvbGljeSB8IHVuZGVmaW5lZCk6IEFwcHJvdmFsUG9saWN5IHtcbiAgaWYgKGdhdGUgPT09IHVuZGVmaW5lZCB8fCBnYXRlID09PSBmYWxzZSkgcmV0dXJuIHsgbW9kZTogXCJub25lXCIgfTtcbiAgaWYgKGdhdGUgPT09IHRydWUpIHJldHVybiB7IG1vZGU6IFwiYWx3YXlzXCIgfTtcbiAgaWYgKG9iamVjdC5pc1JlY29yZChnYXRlKSAmJiBcIm1vZGVcIiBpbiBnYXRlKSB7XG4gICAgaWYgKGdhdGUubW9kZSA9PT0gXCJ1cmxzXCIpIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gcGFyc2VBbGxvd2VkVXJscyhbLi4uZ2F0ZS5wYXR0ZXJuc10pO1xuICAgICAgcmV0dXJuIHBhdHRlcm5zLmxlbmd0aCA+IDAgPyB7IG1vZGU6IFwidXJsc1wiLCBwYXR0ZXJucyB9IDogeyBtb2RlOiBcIm5vbmVcIiB9O1xuICAgIH1cbiAgICBpZiAoZ2F0ZS5tb2RlID09PSBcImFsd2F5c1wiIHx8IGdhdGUubW9kZSA9PT0gXCJub25lXCIpIHJldHVybiB7IG1vZGU6IGdhdGUubW9kZSB9O1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ2FwcHJvdmFsIG1vZGUgbXVzdCBiZSBcIm5vbmVcIiwgXCJhbHdheXNcIiBvciBcInVybHNcIicsIHtcbiAgICAgIGNvbnRleHQ6IHsgZmllbGQ6IFwiYXBwcm92YWxcIiB9LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBhdHRlcm5zID0gcGFyc2VBbGxvd2VkVXJscyh0eXBlb2YgZ2F0ZSA9PT0gXCJzdHJpbmdcIiA/IGdhdGUgOiBbLi4uZ2F0ZV0pO1xuICByZXR1cm4gcGF0dGVybnMubGVuZ3RoID4gMCA/IHsgbW9kZTogXCJ1cmxzXCIsIHBhdHRlcm5zIH0gOiB7IG1vZGU6IFwibm9uZVwiIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZ30uIFdoaWNoIG1vZGVsIGlzIHVzZWQgc3RheXMgbGF6eSAtIGl0IGlzXG4gKiBwaWNrZWQgYXQgY2FsbCB0aW1lIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlIC0gYnV0IGV2ZXJ5dGhpbmcgZWxzZSBpc1xuICogc2V0dGxlZCBoZXJlLCBhbmQgYSBjb250cmFkaWN0aW9uICh1bnBhcnNlYWJsZSBgV0VCX1NFQVJDSF9UT09MU2AsIGFuXG4gKiB1bmtub3duIFVSTCBwb2xpY3ksIGEgcG9saWN5IHRoYXQgZGlzYWdyZWVzIHdpdGggaXRzIGFsbG93LWxpc3QpIHRocm93cyBhXG4gKiB7QGxpbmsgQ29uZmlndXJhdGlvbkVycm9yfSBuYW1pbmcgdGhlIGZpZWxkIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29uZmlnKFxuICBjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyA9IHt9LFxuKTogUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcge1xuICBjb25zdCBwYXR0ZXJucyA9IHBhcnNlQWxsb3dlZFVybHMoY29uZmlnLmFsbG93ZWRVcmxzID8/IHByb2Nlc3MuZW52LldFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTKTtcbiAgY29uc3QgdXJsUG9saWN5ID0gcmVzb2x2ZVVybFBvbGljeShjb25maWcudXJsUG9saWN5LCBwYXR0ZXJucyk7XG4gIGNvbnN0IHsgbW9kZWwsIHNvdXJjZSB9ID0gcmVzb2x2ZU1vZGVsUGluKGNvbmZpZyk7XG4gIGNvbnN0IGZhbGxiYWNrcyA9IHN0cmluZy5wYXJzZUxpc3QoXG4gICAgY29uZmlnLm1vZGVsRmFsbGJhY2tzID8/IHByb2Nlc3MuZW52LldFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTLFxuICApO1xuICBjb25zdCBmdXp6eVRocmVzaG9sZFJhdyA9XG4gICAgY29uZmlnLm1vZGVsRnV6enlUaHJlc2hvbGQgPz8gTnVtYmVyKHByb2Nlc3MuZW52LldFQl9TRUFSQ0hfRlVaWllfVEhSRVNIT0xEKTtcbiAgcmV0dXJuIHtcbiAgICAuLi4obW9kZWwgPyB7IG1vZGVsIH0gOiB7fSksXG4gICAgbW9kZWxTb3VyY2U6IHNvdXJjZSxcbiAgICBtb2RlbEZhbGxiYWNrczogZmFsbGJhY2tzLmxlbmd0aCA+IDAgPyBmYWxsYmFja3MgOiBERUZBVUxUX01PREVMX0ZBTExCQUNLUyxcbiAgICB3ZWJTZWFyY2hUb29sczogeyAuLi5wYXJzZVRvb2xzRW52KCksIC4uLihjb25maWcud2ViU2VhcmNoVG9vbHMgPz8ge30pIH0sXG4gICAgZnV6enk6IGNvbmZpZy5tb2RlbEZ1enp5TWF0Y2ggPz8gb2JqZWN0LnRvQm9vbGVhbihwcm9jZXNzLmVudi5XRUJfU0VBUkNIX0ZVWlpZKSA/PyB0cnVlLFxuICAgIGZ1enp5VGhyZXNob2xkOlxuICAgICAgTnVtYmVyLmlzRmluaXRlKGZ1enp5VGhyZXNob2xkUmF3KSAmJiBmdXp6eVRocmVzaG9sZFJhd1xuICAgICAgICA/IE51bWJlcihmdXp6eVRocmVzaG9sZFJhdylcbiAgICAgICAgOiBzZXJ2aW5nLkRFRkFVTFRfRlVaWllfVEhSRVNIT0xELFxuICAgIG1heENpdGF0aW9uczogcmVzb2x2ZVBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLm1heENpdGF0aW9ucyxcbiAgICAgIFwiV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TXCIsXG4gICAgICBERUZBVUxUX01BWF9DSVRBVElPTlMsXG4gICAgKSxcbiAgICBmZXRjaE1heExlbmd0aDogcmVzb2x2ZVBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLmZldGNoTWF4TGVuZ3RoLFxuICAgICAgXCJXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEhcIixcbiAgICAgIERFRkFVTFRfRkVUQ0hfTUFYX0xFTkdUSCxcbiAgICApLFxuICAgIHRpbWVvdXRNczogcmVzb2x2ZVBvc2l0aXZlSW50KGNvbmZpZy50aW1lb3V0TXMsIFwiV0VCX1NFQVJDSF9USU1FT1VUX01TXCIsIERFRkFVTFRfVElNRU9VVF9NUyksXG4gICAgc2NyYXBlRmFsbGJhY2s6XG4gICAgICBjb25maWcuc2NyYXBlRmFsbGJhY2sgPz8gb2JqZWN0LnRvQm9vbGVhbihwcm9jZXNzLmVudi5XRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDSykgPz8gdHJ1ZSxcbiAgICB1cmxQb2xpY3ksXG4gICAgYWxsb3dMaXN0OiB0b1VybEFsbG93TGlzdCh1cmxQb2xpY3kgPT09IFwiYWxsb3dsaXN0XCIgPyBwYXR0ZXJucyA6IFtdKSxcbiAgICBhcHByb3ZhbDogdG9BcHByb3ZhbFBvbGljeShjb25maWcuYXBwcm92YWwpLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYXBwcm92YWwgZ2F0ZSBhZ2FpbnN0IGEgc2V0IG9mIGNhbmRpZGF0ZSBVUkxzIGludG8gYSBjb25jcmV0ZVxuICogYm9vbGVhbjogYFwibm9uZVwiYCAvIGBcImFsd2F5c1wiYCBwYXNzIHN0cmFpZ2h0IHRocm91Z2g7IGEgYFwidXJsc1wiYCBwb2xpY3lcbiAqIGdhdGVzIHdoZW4gQU5ZIGNhbmRpZGF0ZSBtYXRjaGVzLiBFbXB0eSBjYW5kaWRhdGVzIHdpdGggYSBwYXR0ZXJuIGdhdGVcbiAqIG5ldmVyIG1hdGNoIChub3RoaW5nIHRvIGFwcHJvdmUpLiBSZXVzZXMgdGhlIGFsbG93LWxpc3QgbWF0Y2hlciBzbyBhcHByb3ZhbFxuICogZ2xvYnMgcmVhZCBleGFjdGx5IGxpa2UgYWxsb3ctbGlzdCBnbG9icy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsTWF0Y2hlcyhcbiAgZ2F0ZTogQXBwcm92YWxHYXRlIHwgQXBwcm92YWxQb2xpY3ksXG4gIHVybHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvbGljeSA9IHRvQXBwcm92YWxQb2xpY3koZ2F0ZSk7XG4gIGlmIChwb2xpY3kubW9kZSA9PT0gXCJub25lXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5tb2RlID09PSBcImFsd2F5c1wiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbGlzdCA9IHRvVXJsQWxsb3dMaXN0KHBvbGljeS5wYXR0ZXJucyk7XG4gIHJldHVybiB1cmxzLnNvbWUoKHVybCkgPT4gbGlzdC5hbGxvd3ModXJsKSk7XG59XG4iXX0=
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBa0IsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQTZCckYseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztBQUU1QywrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0NBQWtDLENBQUM7QUFLdkU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXNCO0lBQ3hELHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0Isa0JBQWtCO0lBQ2xCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUYsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUV4QyxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDO0FBRS9DLG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFrSHpDLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBZ0I7SUFDbkQsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDVixLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcs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SSxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzFDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHdlYi1zZWFyY2ggcGx1Z2luOiB0aGUgdHlwZWRcbiAqIHtAbGluayBXZWJTZWFyY2hQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0IGNvbmZpZyksIHRoZVxuICogSlNPTiBTY2hlbWEgdGhlIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3IgaXQsIGFuZCB7QGxpbmsgcmVzb2x2ZVdlYlNlYXJjaENvbmZpZ31cbiAqIHdoaWNoIGxheWVycyB0aGF0IGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWd9IHRoZSBydW50aW1lICsgdG9vbHMgcmVhZC5cbiAqXG4gKiBgd2ViX3NlYXJjaGAgcnVucyBvbiB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2xcbiAqIChzZWUgYHByb3ZpZGVyLnRzYCAvIGBzZWFyY2gudHNgKSwgc28gdGhlIGtleSBrbm9iIGlzIHdoaWNoIHdlYi1zZWFyY2gtXG4gKiBjYXBhYmxlIG1vZGVsIHRvIHVzZS4gSXQgcmVzb2x2ZXMgaW5kZXBlbmRlbnRseSBvZiB0aGUgY2FsbGluZyBhZ2VudCdzIGNoYXRcbiAqIG1vZGVsOiBgbW9kZWxgIChhIG5hbWUsIGxvb3NlIG5hbWUsIG9yIGNhcGFiaWxpdHkgY2xhc3MpIGlzIGZ1enp5LW1hdGNoZWRcbiAqIGFnYWluc3QgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUsIGFuZCB3aGVuIG5vdGhpbmcgaXMgcGlubmVkIHRoZVxuICoge0BsaW5rIFdlYlNlYXJjaFBsdWdpbkNvbmZpZy5tb2RlbEZhbGxiYWNrc30gb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQsIHRoZW4gYVxuICogcmVwbyBmbG9vcikgcGlja3MgdGhlIGZpcnN0IHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludCB0aGF0IGV4aXN0cy5cbiAqXG4gKiBXaGljaCBlbmRwb2ludCBpZCBpcyB1c2VkIGZvbGxvd3MgdGhlIHN0YW5kYXJkIHByZWNlZGVuY2UgLSBleHBsaWNpdCBwbHVnaW5cbiAqIGNvbmZpZywgdGhlbiBlbnZpcm9ubWVudCwgdGhlbiBhIGRlZmF1bHQgLSB3aXRoIHR3byBlbnZpcm9ubWVudCBzb3VyY2VzOlxuICpcbiAqICAgMS4gYG1vZGVsYCBpbiBwbHVnaW4gY29uZmlnO1xuICogICAyLiBgV0VCX1NFQVJDSF9NT0RFTGAsIHRoZSBkZWRpY2F0ZWQgb3ZlcnJpZGUsIHNvIGEgZGVwbG95bWVudCBjYW4gcG9pbnRcbiAqICAgICAgd2ViIHNlYXJjaCBhdCBhIGRpZmZlcmVudCBlbmRwb2ludCB0aGFuIHRoZSBhZ2VudCdzIGNoYXQgbW9kZWw7XG4gKiAgIDMuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAsIEFwcEtpdCdzIHN0YW5kYXJkIG5hbWUgZm9yIGFcbiAqICAgICAgTW9kZWwgU2VydmluZyBiaW5kaW5nLCBob25vcmVkIHNvIHRoZSByZXNvdXJjZSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3RcbiAqICAgICAgd2lyZXMgdGhpcyBwbHVnaW4gdXAgbGlrZSBhbnkgb3RoZXIuIEJlY2F1c2UgdGhhdCBiaW5kaW5nIGlzIHNoYXJlZFxuICogICAgICB3aXRoIHdoYXRldmVyIGVsc2UgdGhlIGFwcCBzZXJ2ZXMsIGl0IGlzIHRyZWF0ZWQgYXMgYSBwcmVmZXJlbmNlOiBhblxuICogICAgICBlbmRwb2ludCB0aGF0IGNhbm5vdCBydW4gdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgaXMgc2tpcHBlZCBpblxuICogICAgICBmYXZvciBvZiB7QGxpbmsgV2ViU2VhcmNoUGx1Z2luQ29uZmlnLm1vZGVsRmFsbGJhY2tzfSByYXRoZXIgdGhhblxuICogICAgICBmYWlsaW5nIHRoZSBjYWxsLiBBIHBpbiBmcm9tICgxKSBvciAoMikgaXMgZXhwbGljaXQgYW5kIERPRVMgZmFpbDtcbiAqICAgNC4gb3RoZXJ3aXNlIHRoZSBmYWxsYmFjayBvcmRlciwgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUuXG4gKlxuICogV2hpY2ggbW9kZWwgd2lucyBpcyBkZWNpZGVkIGxhemlseSwgYXQgY2FsbCB0aW1lLCBhZ2FpbnN0IHRoZSBsaXZlXG4gKiBjYXRhbG9ndWUuIFJlc29sdXRpb24gaGVyZSBpcyBlYWdlciBhYm91dCBldmVyeXRoaW5nIGVsc2UgYW5kIGZhaWxzIGxvdWRseVxuICogb24gYSBjb250cmFkaWN0aW9uOiBhbiB1bnBhcnNlYWJsZSBgV0VCX1NFQVJDSF9UT09MU2AsIGFuIHVua25vd25cbiAqIHtAbGluayBVcmxQb2xpY3lNb2RlfSwgb3IgYSBVUkwgcG9saWN5IHRoYXQgZGlzYWdyZWVzIHdpdGggdGhlIGFsbG93LWxpc3QgaXRcbiAqIHdhcyBnaXZlbi5cbiAqXG4gKiBFbnYgZmFsbGJhY2tzOiBgV0VCX1NFQVJDSF9NT0RFTGAsIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAsXG4gKiBgV0VCX1NFQVJDSF9NT0RFTF9GQUxMQkFDS1NgLCBgV0VCX1NFQVJDSF9UT09MU2AgKEpTT04pLFxuICogYFdFQl9TRUFSQ0hfVVJMX1BPTElDWWAsIGBXRUJfU0VBUkNIX0FMTE9XRURfVVJMU2AsXG4gKiBgV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TYCwgYFdFQl9TRUFSQ0hfRkVUQ0hfTUFYX0xFTkdUSGAsXG4gKiBgV0VCX1NFQVJDSF9USU1FT1VUX01TYCwgYFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLYCwgYFdFQl9TRUFSQ0hfRlVaWllgLFxuICogYFdFQl9TRUFSQ0hfRlVaWllfVEhSRVNIT0xEYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCB0eXBlIEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBzZXJ2aW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGVudiwganNvbiwgb2JqZWN0LCB0eXBlIE9uZU9yTWFueSwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcbmltcG9ydCB7IHBhcnNlQWxsb3dlZFVybHMsIHRvVXJsQWxsb3dMaXN0LCB0eXBlIFVybEFsbG93TGlzdCB9IGZyb20gXCIuL2FsbG93bGlzdC50c1wiO1xuXG4vKipcbiAqIEEgVVJMLXBhdHRlcm4gZ2F0ZSBmb3IgcGVyLXRvb2wgYXBwcm92YWwuIGB0cnVlYCBnYXRlcyBldmVyeSBjYWxsOyBhXG4gKiBwYXR0ZXJuIChvciBsaXN0IG9mIHBhdHRlcm5zLCBpbiB0aGUge0BsaW5rIE9uZU9yTWFueX0gc2hhcGUgdXNlZCBhY3Jvc3NcbiAqIHRoZSByZXBvKSBnYXRlcyBvbmx5IGNhbGxzIHdob3NlIFVSTCBtYXRjaGVzLiBQYXR0ZXJucyB1c2UgdGhlIHNhbWUgZ2xvYlxuICogc3ludGF4IGFzIHRoZSBhbGxvdy1saXN0IChzZWUgYGFsbG93bGlzdC50c2ApLiBPbWl0IC8gYGZhbHNlYCBmb3Igbm9cbiAqIGFwcHJvdmFsLiBOb3JtYWxpemVkIHRvIGFuIHtAbGluayBBcHByb3ZhbFBvbGljeX0gYmVmb3JlIHVzZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBwcm92YWxHYXRlID0gYm9vbGVhbiB8IE9uZU9yTWFueTxzdHJpbmc+IHwgc3RyaW5nO1xuXG4vKipcbiAqIFRoZSBub3JtYWxpemVkIGZvcm0gb2YgYW4ge0BsaW5rIEFwcHJvdmFsR2F0ZX06IHdoaWNoIGNhbGxzIHBhdXNlIGZvciBhXG4gKiBodW1hbi4gYFwibm9uZVwiYCBydW5zIGV2ZXJ5IGNhbGwgc3RyYWlnaHQgdGhyb3VnaCwgYFwiYWx3YXlzXCJgIGdhdGVzIGFsbCBvZlxuICogdGhlbSwgYW5kIGBcInVybHNcImAgZ2F0ZXMgb25seSBjYWxscyB3aG9zZSBVUkwgbWF0Y2hlcyBvbmUgb2YgYHBhdHRlcm5zYC5cbiAqL1xuZXhwb3J0IHR5cGUgQXBwcm92YWxQb2xpY3kgPVxuICB8IHsgcmVhZG9ubHkgbW9kZTogXCJub25lXCIgfVxuICB8IHsgcmVhZG9ubHkgbW9kZTogXCJhbHdheXNcIiB9XG4gIHwgeyByZWFkb25seSBtb2RlOiBcInVybHNcIjsgcmVhZG9ubHkgcGF0dGVybnM6IHJlYWRvbmx5IHN0cmluZ1tdIH07XG5cbi8qKlxuICogV2hpY2ggVVJMcyB0aGUgdG9vbHMgbWF5IHJlYWNoLiBgXCJhbGxvd2xpc3RcImAgcGVybWl0cyBvbmx5IHRoZSBjb25maWd1cmVkXG4gKiBlbnRyaWVzOyBgXCJ1bnJlc3RyaWN0ZWRcImAgbmFtZXMgdGhlIHBlcm1pc3NpdmUgbW9kZSBleHBsaWNpdGx5LCBzbyBhblxuICogdW5yZXN0cmljdGVkIGRlcGxveW1lbnQgaXMgYSBzdGF0ZWQgY2hvaWNlIHZpc2libGUgaW4gdGhlIGJvb3QgbG9nIHJhdGhlclxuICogdGhhbiBhbiBlbXB0eSBsaXN0IG5vYm9keSBub3RpY2VkLlxuICovXG5leHBvcnQgdHlwZSBVcmxQb2xpY3lNb2RlID0gXCJ1bnJlc3RyaWN0ZWRcIiB8IFwiYWxsb3dsaXN0XCI7XG5cbi8qKiBEZWRpY2F0ZWQgb3ZlcnJpZGUgZm9yIHRoZSB3ZWItc2VhcmNoIGVuZHBvaW50IGlkLiAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX0VOViA9IFwiV0VCX1NFQVJDSF9NT0RFTFwiO1xuXG4vKiogQXBwS2l0J3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQgbmFtZSBmb3IgYSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IGJpbmRpbmcuICovXG5leHBvcnQgY29uc3QgU0VSVklOR19FTkRQT0lOVF9FTlYgPSBcIkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FXCI7XG5cbi8qKiBXaGVyZSB0aGUgcGlubmVkIHdlYi1zZWFyY2ggZW5kcG9pbnQgaWQgY2FtZSBmcm9tLCBvciBgXCJub25lXCJgIHdoZW4gdW5waW5uZWQuICovXG5leHBvcnQgdHlwZSBNb2RlbFNvdXJjZSA9IFwiY29uZmlnXCIgfCB0eXBlb2YgTU9ERUxfRU5WIHwgdHlwZW9mIFNFUlZJTkdfRU5EUE9JTlRfRU5WIHwgXCJub25lXCI7XG5cbi8qKlxuICogRGVmYXVsdCB3ZWItc2VhcmNoIG1vZGVsIHByZWZlcmVuY2UsIHRyaWVkIGluIG9yZGVyIHdoZW4gbm8gbW9kZWwgaXNcbiAqIHBpbm5lZC4gR2VtaW5pIGZpcnN0LCB0aGVuIEdQVCAtIGJvdGggc3VwcG9ydCB0aGUgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbDtcbiAqIGEgd29ya3NwYWNlIHR5cGljYWxseSBoYXMgYXQgbGVhc3Qgb25lLiBFYWNoIGlzIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGVcbiAqIGxpdmUgY2F0YWxvZ3VlLCBzbyBhIGNsb3NlIHZhcmlhbnQgKGUuZy4gYGRhdGFicmlja3MtZ2VtaW5pLTMtMS1wcm9gKSBpc1xuICogcGlja2VkIHdoZW4gdGhlIGV4YWN0IGlkIGlzbid0IHByZXNlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0ZBTExCQUNLUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiZGF0YWJyaWNrcy1nZW1pbmktMy1wcm9cIixcbiAgXCJkYXRhYnJpY2tzLWdlbWluaS0yLTUtcHJvXCIsXG4gIFwiZGF0YWJyaWNrcy1ncHQtNVwiLFxuICBcImRhdGFicmlja3MtZ3B0LTUtbWluaVwiLFxuXTtcblxuLyoqIERlZmF1bHQgY2FwIG9uIHRoZSBudW1iZXIgb2YgY2l0YXRpb25zIHJldHVybmVkIGZyb20gYSBzaW5nbGUgc2VhcmNoLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0NJVEFUSU9OUyA9IDEwO1xuXG4vKiogRGVmYXVsdCBjYXAgb24gY2hhcmFjdGVycyByZXR1cm5lZCBmcm9tIGEgc2luZ2xlIGB3ZWJfZmV0Y2hgLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRkVUQ0hfTUFYX0xFTkdUSCA9IDUwXzAwMDtcblxuLyoqIERlZmF1bHQgcGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IChtcykgZm9yIHNlYXJjaCArIGZldGNoLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqIEFwcEtpdCBjb25maWcgYWNjZXB0ZWQgYnkgdGhlIHdlYi1zZWFyY2ggcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSB3ZWItc2VhcmNoIG1vZGVsIHRvIHVzZSBieSBkZWZhdWx0OiBhIERhdGFicmlja3Mgc2VydmluZyBlbmRwb2ludFxuICAgKiBuYW1lIChgXCJkYXRhYnJpY2tzLWdlbWluaS0zLXByb1wiYCksIGEgbG9vc2UgbmFtZSAoYFwiZ2VtaW5pXCJgLCBgXCJncHRcImApLFxuICAgKiBvciBhIGNhcGFiaWxpdHkgY2xhc3MuIEZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUuIEZhbGxzXG4gICAqIGJhY2sgdG8gYFdFQl9TRUFSQ0hfTU9ERUxgLCB0aGVuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAsIHRoZW5cbiAgICogdGhlIHtAbGluayBtb2RlbEZhbGxiYWNrc30gb3JkZXIuIENob3NlbiBpbmRlcGVuZGVudGx5IG9mIHRoZSBjYWxsaW5nXG4gICAqIGFnZW50J3MgY2hhdCBtb2RlbC5cbiAgICovXG4gIG1vZGVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUHJpb3JpdHktb3JkZXJlZCB3ZWItc2VhcmNoIG1vZGVsIGNhbmRpZGF0ZXMgdHJpZWQgd2hlbiB7QGxpbmsgbW9kZWx9IGlzXG4gICAqIHVuc2V0LCBlYWNoIGZ1enp5LW1hdGNoZWQgYW5kIGNoZWNrZWQgZm9yIHdlYi1zZWFyY2ggc3VwcG9ydC4gRmFsbHMgYmFja1xuICAgKiB0byBgV0VCX1NFQVJDSF9NT0RFTF9GQUxMQkFDS1NgIChjb21tYS9zcGFjZS1zZXBhcmF0ZWQpLCB0aGVuXG4gICAqIHtAbGluayBERUZBVUxUX01PREVMX0ZBTExCQUNLU30gKEdlbWluaSwgdGhlbiBHUFQpLlxuICAgKi9cbiAgbW9kZWxGYWxsYmFja3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFByb3ZpZGVyIC0+IHRvb2wtc3BlYyBvdmVycmlkZSBtYXAsIG1lcmdlZCBvdmVyIHRoZSBidWlsdC1pblxuICAgKiB7QGxpbmsgV0VCX1NFQVJDSF9QUk9WSURFUlN9IGRlZmF1bHRzLiBLZXllZCBieSBwcm92aWRlciBmYW1pbHlcbiAgICogKGBcIm9wZW5haVwiYCwgYFwiZ2VtaW5pXCJgKTsgZWFjaCB2YWx1ZSBtYXkgb3ZlcnJpZGUgdGhlIGB0b29sYCBlbnRyeVxuICAgKiBhbmQvb3IgdGhlIGBhcGlgIHN1cmZhY2UuIFVzZSB0byBjaGFuZ2UgdGhlIHRvb2wgc2hhcGUgYXMgdGhlIHBsYXRmb3JtXG4gICAqIGV2b2x2ZXMgd2l0aG91dCBhIGNvZGUgY2hhbmdlLiBGYWxscyBiYWNrIHRvIGBXRUJfU0VBUkNIX1RPT0xTYCBwYXJzZWQgYXNcbiAgICogSlNPTi4gVGhpcyBpcyB0aGUgYFdFQl9TRUFSQ0hfVE9PTFNgIHNldHRpbmcuXG4gICAqL1xuICB3ZWJTZWFyY2hUb29scz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogRW5hYmxlIGZ1enp5IG1hdGNoaW5nIG9mIGxvb3NlIG1vZGVsIG5hbWVzIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgOyBmYWxscyBiYWNrIHRvIGBXRUJfU0VBUkNIX0ZVWlpZYC5cbiAgICovXG4gIG1vZGVsRnV6enlNYXRjaD86IGJvb2xlYW47XG4gIC8qKiBGdXNlLmpzIGZ1enp5IHRocmVzaG9sZC4gRmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9GVVpaWV9USFJFU0hPTERgLCB0aGVuIHRoZSBzaGFyZWQgZGVmYXVsdC4gKi9cbiAgbW9kZWxGdXp6eVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhhcmQgY2FwIG9uIHRoZSBudW1iZXIgb2YgY2l0YXRpb25zIGEgc2luZ2xlIHNlYXJjaCByZXR1cm5zLiBGYWxscyBiYWNrXG4gICAqIHRvIGBXRUJfU0VBUkNIX01BWF9DSVRBVElPTlNgLCB0aGVuIHtAbGluayBERUZBVUxUX01BWF9DSVRBVElPTlN9LlxuICAgKi9cbiAgbWF4Q2l0YXRpb25zPzogbnVtYmVyO1xuICAvKipcbiAgICogSGFyZCBjYXAgb24gdGhlIGNoYXJhY3RlciBsZW5ndGggb2YgYSBzaW5nbGUgYHdlYl9mZXRjaGAgcmVzdWx0LiBGYWxsc1xuICAgKiBiYWNrIHRvIGBXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEhgLCB0aGVuIHtAbGluayBERUZBVUxUX0ZFVENIX01BWF9MRU5HVEh9LlxuICAgKi9cbiAgZmV0Y2hNYXhMZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQZXItcmVxdWVzdCBuZXR3b3JrIHRpbWVvdXQgaW4gbXMgZm9yIHNlYXJjaCArIGZldGNoLiBGYWxscyBiYWNrIHRvXG4gICAqIGBXRUJfU0VBUkNIX1RJTUVPVVRfTVNgLCB0aGVuIHtAbGluayBERUZBVUxUX1RJTUVPVVRfTVN9LlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogRmFsbCBiYWNrIHRvIGEgRHVja0R1Y2tHbyBzY3JhcGUgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBOTyBkZXBsb3llZFxuICAgKiB3ZWItc2VhcmNoLWNhcGFibGUgbW9kZWwgKG5vIEdQVCAvIEdlbWluaSBzZXJ2aW5nIGVuZHBvaW50KS4gVGhlIG5hdGl2ZVxuICAgKiBEYXRhYnJpY2tzIHRvb2wgaXMgYWx3YXlzIHByZWZlcnJlZDsgdGhpcyBvbmx5IGtpY2tzIGluIHdoZW4gdGhlcmUgaXMgbm9cbiAgICogbmF0aXZlIG9wdGlvbiwgc28gdGhlIHRvb2wgc3RpbGwgcmV0dXJucyByZXN1bHRzIGluc3RlYWQgb2YgZXJyb3JpbmcuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYDsgc2V0IGBmYWxzZWAgKG9yIGBXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDSz0wYCkgdG9cbiAgICogcmVxdWlyZSBhIG5hdGl2ZSBtb2RlbCBhbmQgZXJyb3Igb3RoZXJ3aXNlLlxuICAgKi9cbiAgc2NyYXBlRmFsbGJhY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hpY2ggVVJMcyB0aGUgdG9vbHMgbWF5IHJlYWNoICh7QGxpbmsgVXJsUG9saWN5TW9kZX0pLiBGYWxscyBiYWNrIHRvXG4gICAqIGBXRUJfU0VBUkNIX1VSTF9QT0xJQ1lgLCB0aGVuIHRvIGBcImFsbG93bGlzdFwiYCB3aGVuIHtAbGluayBhbGxvd2VkVXJsc31cbiAgICogaGFzIGVudHJpZXMgYW5kIGBcInVucmVzdHJpY3RlZFwiYCB3aGVuIGl0IGRvZXMgbm90LiBOYW1pbmcgdGhlIG1vZGVcbiAgICogZXhwbGljaXRseSBpcyB0aGUgd2F5IHRvIHN0YXRlIHRoYXQgYW4gb3BlbiBkZXBsb3ltZW50IGlzIGludGVuZGVkO1xuICAgKiBgXCJhbGxvd2xpc3RcImAgd2l0aCBubyBlbnRyaWVzLCBvciBgXCJ1bnJlc3RyaWN0ZWRcImAgYWxvbmdzaWRlIGVudHJpZXMsIGlzXG4gICAqIGEgY29udHJhZGljdGlvbiBhbmQgZmFpbHMgYXQgcmVzb2x1dGlvbi5cbiAgICovXG4gIHVybFBvbGljeT86IFVybFBvbGljeU1vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBVUkwgYWxsb3ctbGlzdC4gRWFjaCBlbnRyeSBpcyBhIGdsb2IgKG9yIGJhcmUgaG9zdCkgdGVzdGVkXG4gICAqIGFnYWluc3QgYSBVUkwncyBmdWxsIGBocmVmYC4gV2hlbiBzZXQsIGB3ZWJfc2VhcmNoYCBzaWxlbnRseSBmaWx0ZXJzXG4gICAqIGNpdGF0aW9ucyB0byB0aGUgcGVybWl0dGVkIHNldCBhbmQgYHdlYl9mZXRjaGAgcmVmdXNlcyBhIGRpc2FsbG93ZWQgVVJMLlxuICAgKiBBY2NlcHRzIGEgYHN0cmluZ1tdYCBvciBhIGNvbW1hLS93aGl0ZXNwYWNlLXNlcGFyYXRlZCBzdHJpbmc7IGZhbGxzIGJhY2tcbiAgICogdG8gYFdFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTYC4gT21pdCAob3IgbGVhdmUgZW1wdHkpIGZvciBubyByZXN0cmljdGlvbi5cbiAgICogU2VlIGBhbGxvd2xpc3QudHNgLlxuICAgKi9cbiAgYWxsb3dlZFVybHM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEFwcHJvdmFsIGdhdGUgYXBwbGllZCB0byBCT1RIIHRvb2xzIChwZXItdG9vbCBvdmVycmlkZXMgdmlhXG4gICAqIHtAbGluayBXZWJTZWFyY2hUb29sT3B0aW9ucy5hcHByb3ZhbH0gd2luKS4gYHRydWVgIGdhdGVzIGV2ZXJ5IGNhbGw7XG4gICAqIGEgVVJMLXBhdHRlcm4gKG9yIGxpc3QpIGdhdGVzIG9ubHkgbWF0Y2hpbmcgY2FsbHM7IGFuXG4gICAqIHtAbGluayBBcHByb3ZhbFBvbGljeX0gc3RhdGVzIHRoZSBtb2RlIGRpcmVjdGx5LiBPbWl0IGZvciBubyBhcHByb3ZhbC5cbiAgICovXG4gIGFwcHJvdmFsPzogQXBwcm92YWxHYXRlIHwgQXBwcm92YWxQb2xpY3k7XG59XG5cbi8qKiBDb25jcmV0ZSwgdmFsaWRhdGVkIGNvbmZpZyB0aGUgcnVudGltZSArIHRvb2xzIHJlYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIHtcbiAgLyoqIFBpbm5lZCB3ZWItc2VhcmNoIG1vZGVsLCB3aGVuIGNvbmZpZ3VyZWQgKGVsc2UgdW5kZWZpbmVkIC0gdXNlIGZhbGxiYWNrcykuICovXG4gIG1vZGVsPzogc3RyaW5nO1xuICAvKiogV2hlcmUge0BsaW5rIG1vZGVsfSBjYW1lIGZyb20sIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbiB1bnN1cHBvcnRlZCBwaW4gaXMgZmF0YWwuICovXG4gIG1vZGVsU291cmNlOiBNb2RlbFNvdXJjZTtcbiAgLyoqIE9yZGVyZWQgZmFsbGJhY2sgbW9kZWwgY2FuZGlkYXRlcyAoR2VtaW5pLCB0aGVuIEdQVCwgdGhlbiBhIGZsb29yKS4gKi9cbiAgbW9kZWxGYWxsYmFja3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogUHJvdmlkZXIgLT4gdG9vbC1zcGVjIG92ZXJyaWRlIG1hcCwgbWVyZ2VkIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLiAqL1xuICB3ZWJTZWFyY2hUb29sczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBXaGV0aGVyIHRvIGZ1enp5LW1hdGNoIGxvb3NlIG1vZGVsIG5hbWVzLiAqL1xuICBmdXp6eTogYm9vbGVhbjtcbiAgLyoqIEZ1c2UuanMgZnV6enkgdGhyZXNob2xkLiAqL1xuICBmdXp6eVRocmVzaG9sZDogbnVtYmVyO1xuICBtYXhDaXRhdGlvbnM6IG51bWJlcjtcbiAgZmV0Y2hNYXhMZW5ndGg6IG51bWJlcjtcbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIHNjcmFwZS1mYWxsYmFjayB3aGVuIG5vIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIGlzIGRlcGxveWVkLiAqL1xuICBzY3JhcGVGYWxsYmFjazogYm9vbGVhbjtcbiAgLyoqIFRoZSBuYW1lZCBVUkwgcG9saWN5IGluIGZvcmNlLiAqL1xuICB1cmxQb2xpY3k6IFVybFBvbGljeU1vZGU7XG4gIC8qKiBDb21waWxlZCBhbGxvdy1saXN0IChwZXJtaXQtYWxsIHVuZGVyIHRoZSBgdW5yZXN0cmljdGVkYCBwb2xpY3kpLiAqL1xuICBhbGxvd0xpc3Q6IFVybEFsbG93TGlzdDtcbiAgLyoqIERlZmF1bHQgcGVyLXRvb2wgYXBwcm92YWwgcG9saWN5LiAqL1xuICBhcHByb3ZhbDogQXBwcm92YWxQb2xpY3k7XG59XG5cbi8qKiBKU09OIFNjaGVtYSBwdWJsaXNoZWQgb24gdGhlIG1hbmlmZXN0J3MgYGNvbmZpZy5zY2hlbWFgLiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBtb2RlbDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRlZmF1bHQgd2ViLXNlYXJjaCBtb2RlbCAoZW5kcG9pbnQgbmFtZSwgbG9vc2UgbmFtZSwgb3IgY2xhc3MpLiBGdXp6eS1tYXRjaGVkLiBFbnY6IFdFQl9TRUFSQ0hfTU9ERUwsIHRoZW4gREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUUuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZhbGxiYWNrczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiT3JkZXJlZCB3ZWItc2VhcmNoIG1vZGVsIGNhbmRpZGF0ZXMgd2hlbiBgbW9kZWxgIGlzIHVuc2V0IChHZW1pbmksIHRoZW4gR1BUKS4gRW52OiBXRUJfU0VBUkNIX01PREVMX0ZBTExCQUNLUy5cIixcbiAgICB9LFxuICAgIHdlYlNlYXJjaFRvb2xzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdQcm92aWRlciAtPiB0b29sLXNwZWMgb3ZlcnJpZGUgbWFwIG1lcmdlZCBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cyAob3BlbmFpIC0+IHtcInR5cGVcIjpcIndlYl9zZWFyY2hcIn0sIGdlbWluaSAtPiB7XCJnb29nbGVfc2VhcmNoXCI6e319KS4gRW52OiBXRUJfU0VBUkNIX1RPT0xTIChKU09OKS4nLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eU1hdGNoOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1enp5LW1hdGNoIGxvb3NlIG1vZGVsIG5hbWVzIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlLiBEZWZhdWx0IHRydWUgKGVudjogV0VCX1NFQVJDSF9GVVpaWSkuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZ1enp5VGhyZXNob2xkOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggYSBmdXp6eSBtb2RlbCBtYXRjaCBpcyBhY2NlcHRlZCAoZW52OiBXRUJfU0VBUkNIX0ZVWlpZX1RIUkVTSE9MRCkuXCIsXG4gICAgfSxcbiAgICBtYXhDaXRhdGlvbnM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJIYXJkIGNhcCBvbiBjaXRhdGlvbnMgcmV0dXJuZWQgKGVudjogV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TKS5cIixcbiAgICB9LFxuICAgIGZldGNoTWF4TGVuZ3RoOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSGFyZCBjYXAgb24gd2ViX2ZldGNoIGNvbnRlbnQgbGVuZ3RoIChlbnY6IFdFQl9TRUFSQ0hfRkVUQ0hfTUFYX0xFTkdUSCkuXCIsXG4gICAgfSxcbiAgICB0aW1lb3V0TXM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQZXItcmVxdWVzdCBuZXR3b3JrIHRpbWVvdXQgaW4gbXMgKGVudjogV0VCX1NFQVJDSF9USU1FT1VUX01TKS5cIixcbiAgICB9LFxuICAgIHNjcmFwZUZhbGxiYWNrOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZhbGwgYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHdoZW4gbm8gd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGlzIGRlcGxveWVkLiBEZWZhdWx0IHRydWUgKGVudjogV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0spLlwiLFxuICAgIH0sXG4gICAgdXJsUG9saWN5OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZW51bTogW1widW5yZXN0cmljdGVkXCIsIFwiYWxsb3dsaXN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiV2hpY2ggVVJMcyB0aGUgdG9vbHMgbWF5IHJlYWNoLiBEZWZhdWx0cyB0byBhbGxvd2xpc3Qgd2hlbiBhbGxvd2VkVXJscyBoYXMgZW50cmllcywgZWxzZSB1bnJlc3RyaWN0ZWQgKGVudjogV0VCX1NFQVJDSF9VUkxfUE9MSUNZKS5cIixcbiAgICB9LFxuICAgIGFsbG93ZWRVcmxzOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1VSTCBhbGxvdy1saXN0IG9mIGdsb2JzIC8gYmFyZSBob3N0cyAoZS5nLiBcIiouZGF0YWJyaWNrcy5jb21cIiwgXCJkb2NzLmV4YW1wbGUuY29tXCIpLiBBbHNvIGFjY2VwdHMgYSBjb21tYS9zcGFjZS1zZXBhcmF0ZWQgc3RyaW5nLiBGYWxscyBiYWNrIHRvIFdFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTLiBFbXB0eSA9IHVucmVzdHJpY3RlZC4nLFxuICAgIH0sXG4gICAgYXBwcm92YWw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQXBwcm92YWwgZ2F0ZSBmb3IgYm90aCB0b29sczogdHJ1ZSBnYXRlcyBldmVyeSBjYWxsLCBhIGdsb2IgKG9yIGxpc3Qgb2YgZ2xvYnMpIGdhdGVzIG9ubHkgbWF0Y2hpbmcgVVJMcywgb3Igc3RhdGUgdGhlIG1vZGUgZGlyZWN0bHkgYXMge1wibW9kZVwiOlwibm9uZVwifFwiYWx3YXlzXCJ8XCJ1cmxzXCJ9LiBEZWZhdWx0IG5vbmUuJyxcbiAgICAgIG9uZU9mOiBbXG4gICAgICAgIHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbW9kZTogeyB0eXBlOiBcInN0cmluZ1wiLCBlbnVtOiBbXCJub25lXCIsIFwiYWx3YXlzXCIsIFwidXJsc1wiXSB9LFxuICAgICAgICAgICAgcGF0dGVybnM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJtb2RlXCJdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgYFdFQl9TRUFSQ0hfVE9PTFNgIGVudiB2YXIgKEpTT04gb2JqZWN0KSwgZWxzZSBge31gLiBBIHZhbHVlIHRoYXRcbiAqIGlzIHNldCBidXQgbm90IGEgSlNPTiBvYmplY3QgaXMgYSBkZXBsb3ltZW50IG1pc3Rha2UgdGhhdCB3b3VsZCBvdGhlcndpc2VcbiAqIHNpbGVudGx5IGxlYXZlIHRoZSBidWlsdC1pbiB0b29sIHNwZWNzIGluIHBsYWNlLCBzbyBpdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVG9vbHNFbnYoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCByYXcgPSBlbnYudGV4dChcIldFQl9TRUFSQ0hfVE9PTFNcIik7XG4gIGlmIChyYXcgPT09IG51bGwpIHJldHVybiB7fTtcbiAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZVJlY29yZChyYXcpO1xuICBpZiAoIXBhcnNlZCkge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICBcIldFQl9TRUFSQ0hfVE9PTFMgbXVzdCBiZSBhIEpTT04gb2JqZWN0IG1hcHBpbmcgYSBwcm92aWRlciBmYW1pbHkgdG8gaXRzIHRvb2wgc3BlY1wiLFxuICAgICAgeyBjb250ZXh0OiB7IGVudlZhcjogXCJXRUJfU0VBUkNIX1RPT0xTXCIgfSB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqIFJlYWQgdGhlIHBpbm5lZCBlbmRwb2ludCBpZCBhbmQgcmVjb3JkIHdoaWNoIHNvdXJjZSBzdXBwbGllZCBpdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbFBpbihjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyk6IHsgbW9kZWw/OiBzdHJpbmc7IHNvdXJjZTogTW9kZWxTb3VyY2UgfSB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBzdHJpbmcudHJpbVRvTnVsbChjb25maWcubW9kZWwpO1xuICBpZiAoZnJvbUNvbmZpZyAhPT0gbnVsbCkgcmV0dXJuIHsgbW9kZWw6IGZyb21Db25maWcsIHNvdXJjZTogXCJjb25maWdcIiB9O1xuICBjb25zdCBmcm9tTW9kZWxFbnYgPSBlbnYudGV4dChNT0RFTF9FTlYpO1xuICBpZiAoZnJvbU1vZGVsRW52ICE9PSBudWxsKSByZXR1cm4geyBtb2RlbDogZnJvbU1vZGVsRW52LCBzb3VyY2U6IE1PREVMX0VOViB9O1xuICBjb25zdCBmcm9tUmVzb3VyY2VFbnYgPSBlbnYudGV4dChTRVJWSU5HX0VORFBPSU5UX0VOVik7XG4gIGlmIChmcm9tUmVzb3VyY2VFbnYgIT09IG51bGwpIHJldHVybiB7IG1vZGVsOiBmcm9tUmVzb3VyY2VFbnYsIHNvdXJjZTogU0VSVklOR19FTkRQT0lOVF9FTlYgfTtcbiAgcmV0dXJuIHsgc291cmNlOiBcIm5vbmVcIiB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIG5hbWVkIHtAbGluayBVcmxQb2xpY3lNb2RlfSwgZmFpbGluZyBvbiBhIHN0YXRlZCBtb2RlIHRoYXRcbiAqIGNvbnRyYWRpY3RzIHRoZSBhbGxvdy1saXN0IGVudHJpZXMgaXQgd2FzIGdpdmVuLlxuICovXG5mdW5jdGlvbiByZXNvbHZlVXJsUG9saWN5KFxuICBjb25maWd1cmVkOiBVcmxQb2xpY3lNb2RlIHwgdW5kZWZpbmVkLFxuICBwYXR0ZXJuczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBVcmxQb2xpY3lNb2RlIHtcbiAgY29uc3QgcmF3ID0gY29uZmlndXJlZCA/PyBlbnYudGV4dChcIldFQl9TRUFSQ0hfVVJMX1BPTElDWVwiKSA/PyB1bmRlZmluZWQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHBhdHRlcm5zLmxlbmd0aCA+IDAgPyBcImFsbG93bGlzdFwiIDogXCJ1bnJlc3RyaWN0ZWRcIjtcbiAgaWYgKHJhdyAhPT0gXCJhbGxvd2xpc3RcIiAmJiByYXcgIT09IFwidW5yZXN0cmljdGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgJ3VybFBvbGljeSBtdXN0IGJlIFwiYWxsb3dsaXN0XCIgb3IgXCJ1bnJlc3RyaWN0ZWRcIiAoZW52OiBXRUJfU0VBUkNIX1VSTF9QT0xJQ1kpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJ1cmxQb2xpY3lcIiwgZW52VmFyOiBcIldFQl9TRUFSQ0hfVVJMX1BPTElDWVwiIH0gfSxcbiAgICApO1xuICB9XG4gIGlmIChyYXcgPT09IFwiYWxsb3dsaXN0XCIgJiYgcGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICd1cmxQb2xpY3kgXCJhbGxvd2xpc3RcIiBuZWVkcyBhdCBsZWFzdCBvbmUgZW50cnkgaW4gYWxsb3dlZFVybHMgKGVudjogV0VCX1NFQVJDSF9BTExPV0VEX1VSTFMpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJhbGxvd2VkVXJsc1wiLCBlbnZWYXI6IFwiV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNcIiB9IH0sXG4gICAgKTtcbiAgfVxuICBpZiAocmF3ID09PSBcInVucmVzdHJpY3RlZFwiICYmIHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgJ3VybFBvbGljeSBcInVucmVzdHJpY3RlZFwiIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFsbG93ZWRVcmxzIGVudHJpZXM7IGRyb3AgdGhlIGVudHJpZXMgb3Igc2V0IHVybFBvbGljeSB0byBcImFsbG93bGlzdFwiJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJhbGxvd2VkVXJsc1wiLCBlbnZWYXI6IFwiV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNcIiB9IH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbnkgYWNjZXB0ZWQgYXBwcm92YWwgc3BlbGxpbmcgaW50byBhbiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9LlxuICogQSBwYXR0ZXJuIGdhdGUgd2l0aCBubyB1c2FibGUgcGF0dGVybnMgY29sbGFwc2VzIHRvIGBcIm5vbmVcImAgcmF0aGVyIHRoYW5cbiAqIGdhdGluZyBldmVyeXRoaW5nLCBzbyBhIGJsYW5rIGVudiB2YXIgY2FuIG5ldmVyIHdlZGdlIHRoZSB0b29scyBiZWhpbmQgYW5cbiAqIGFwcHJvdmFsIG5vYm9keSBjb25maWd1cmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcHByb3ZhbFBvbGljeShnYXRlOiBBcHByb3ZhbEdhdGUgfCBBcHByb3ZhbFBvbGljeSB8IHVuZGVmaW5lZCk6IEFwcHJvdmFsUG9saWN5IHtcbiAgaWYgKGdhdGUgPT09IHVuZGVmaW5lZCB8fCBnYXRlID09PSBmYWxzZSkgcmV0dXJuIHsgbW9kZTogXCJub25lXCIgfTtcbiAgaWYgKGdhdGUgPT09IHRydWUpIHJldHVybiB7IG1vZGU6IFwiYWx3YXlzXCIgfTtcbiAgaWYgKG9iamVjdC5pc1JlY29yZChnYXRlKSAmJiBcIm1vZGVcIiBpbiBnYXRlKSB7XG4gICAgaWYgKGdhdGUubW9kZSA9PT0gXCJ1cmxzXCIpIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gcGFyc2VBbGxvd2VkVXJscyhbLi4uZ2F0ZS5wYXR0ZXJuc10pO1xuICAgICAgcmV0dXJuIHBhdHRlcm5zLmxlbmd0aCA+IDAgPyB7IG1vZGU6IFwidXJsc1wiLCBwYXR0ZXJucyB9IDogeyBtb2RlOiBcIm5vbmVcIiB9O1xuICAgIH1cbiAgICBpZiAoZ2F0ZS5tb2RlID09PSBcImFsd2F5c1wiIHx8IGdhdGUubW9kZSA9PT0gXCJub25lXCIpIHJldHVybiB7IG1vZGU6IGdhdGUubW9kZSB9O1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ2FwcHJvdmFsIG1vZGUgbXVzdCBiZSBcIm5vbmVcIiwgXCJhbHdheXNcIiBvciBcInVybHNcIicsIHtcbiAgICAgIGNvbnRleHQ6IHsgZmllbGQ6IFwiYXBwcm92YWxcIiB9LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBhdHRlcm5zID0gcGFyc2VBbGxvd2VkVXJscyh0eXBlb2YgZ2F0ZSA9PT0gXCJzdHJpbmdcIiA/IGdhdGUgOiBbLi4uZ2F0ZV0pO1xuICByZXR1cm4gcGF0dGVybnMubGVuZ3RoID4gMCA/IHsgbW9kZTogXCJ1cmxzXCIsIHBhdHRlcm5zIH0gOiB7IG1vZGU6IFwibm9uZVwiIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZ30uIFdoaWNoIG1vZGVsIGlzIHVzZWQgc3RheXMgbGF6eSAtIGl0IGlzXG4gKiBwaWNrZWQgYXQgY2FsbCB0aW1lIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlIC0gYnV0IGV2ZXJ5dGhpbmcgZWxzZSBpc1xuICogc2V0dGxlZCBoZXJlLCBhbmQgYSBjb250cmFkaWN0aW9uICh1bnBhcnNlYWJsZSBgV0VCX1NFQVJDSF9UT09MU2AsIGFuXG4gKiB1bmtub3duIFVSTCBwb2xpY3ksIGEgcG9saWN5IHRoYXQgZGlzYWdyZWVzIHdpdGggaXRzIGFsbG93LWxpc3QpIHRocm93cyBhXG4gKiB7QGxpbmsgQ29uZmlndXJhdGlvbkVycm9yfSBuYW1pbmcgdGhlIGZpZWxkIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29uZmlnKFxuICBjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyA9IHt9LFxuKTogUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcge1xuICBjb25zdCBwYXR0ZXJucyA9IHBhcnNlQWxsb3dlZFVybHMoXG4gICAgY29uZmlnLmFsbG93ZWRVcmxzID8/IGVudi50ZXh0KFwiV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNcIikgPz8gdW5kZWZpbmVkLFxuICApO1xuICBjb25zdCB1cmxQb2xpY3kgPSByZXNvbHZlVXJsUG9saWN5KGNvbmZpZy51cmxQb2xpY3ksIHBhdHRlcm5zKTtcbiAgY29uc3QgeyBtb2RlbCwgc291cmNlIH0gPSByZXNvbHZlTW9kZWxQaW4oY29uZmlnKTtcbiAgY29uc3QgZmFsbGJhY2tzID0gZW52Lmxpc3QoY29uZmlnLm1vZGVsRmFsbGJhY2tzLCBcIldFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTXCIpO1xuICByZXR1cm4ge1xuICAgIC4uLihtb2RlbCA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICBtb2RlbFNvdXJjZTogc291cmNlLFxuICAgIG1vZGVsRmFsbGJhY2tzOiBmYWxsYmFja3MubGVuZ3RoID4gMCA/IGZhbGxiYWNrcyA6IERFRkFVTFRfTU9ERUxfRkFMTEJBQ0tTLFxuICAgIHdlYlNlYXJjaFRvb2xzOiB7IC4uLnBhcnNlVG9vbHNFbnYoKSwgLi4uKGNvbmZpZy53ZWJTZWFyY2hUb29scyA/PyB7fSkgfSxcbiAgICBmdXp6eTogZW52LmJvb2xlYW4oY29uZmlnLm1vZGVsRnV6enlNYXRjaCwgXCJXRUJfU0VBUkNIX0ZVWlpZXCIpID8/IHRydWUsXG4gICAgZnV6enlUaHJlc2hvbGQ6IGVudi5wb3NpdGl2ZU51bWJlcihcbiAgICAgIGNvbmZpZy5tb2RlbEZ1enp5VGhyZXNob2xkLFxuICAgICAgXCJXRUJfU0VBUkNIX0ZVWlpZX1RIUkVTSE9MRFwiLFxuICAgICAgc2VydmluZy5ERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCxcbiAgICApLFxuICAgIG1heENpdGF0aW9uczogZW52LnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLm1heENpdGF0aW9ucyxcbiAgICAgIFwiV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TXCIsXG4gICAgICBERUZBVUxUX01BWF9DSVRBVElPTlMsXG4gICAgKSxcbiAgICBmZXRjaE1heExlbmd0aDogZW52LnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLmZldGNoTWF4TGVuZ3RoLFxuICAgICAgXCJXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEhcIixcbiAgICAgIERFRkFVTFRfRkVUQ0hfTUFYX0xFTkdUSCxcbiAgICApLFxuICAgIHRpbWVvdXRNczogZW52LnBvc2l0aXZlSW50KGNvbmZpZy50aW1lb3V0TXMsIFwiV0VCX1NFQVJDSF9USU1FT1VUX01TXCIsIERFRkFVTFRfVElNRU9VVF9NUyksXG4gICAgc2NyYXBlRmFsbGJhY2s6IGVudi5ib29sZWFuKGNvbmZpZy5zY3JhcGVGYWxsYmFjaywgXCJXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDS1wiKSA/PyB0cnVlLFxuICAgIHVybFBvbGljeSxcbiAgICBhbGxvd0xpc3Q6IHRvVXJsQWxsb3dMaXN0KHVybFBvbGljeSA9PT0gXCJhbGxvd2xpc3RcIiA/IHBhdHRlcm5zIDogW10pLFxuICAgIGFwcHJvdmFsOiB0b0FwcHJvdmFsUG9saWN5KGNvbmZpZy5hcHByb3ZhbCksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBhcHByb3ZhbCBnYXRlIGFnYWluc3QgYSBzZXQgb2YgY2FuZGlkYXRlIFVSTHMgaW50byBhIGNvbmNyZXRlXG4gKiBib29sZWFuOiBgXCJub25lXCJgIC8gYFwiYWx3YXlzXCJgIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaDsgYSBgXCJ1cmxzXCJgIHBvbGljeVxuICogZ2F0ZXMgd2hlbiBBTlkgY2FuZGlkYXRlIG1hdGNoZXMuIEVtcHR5IGNhbmRpZGF0ZXMgd2l0aCBhIHBhdHRlcm4gZ2F0ZVxuICogbmV2ZXIgbWF0Y2ggKG5vdGhpbmcgdG8gYXBwcm92ZSkuIFJldXNlcyB0aGUgYWxsb3ctbGlzdCBtYXRjaGVyIHNvIGFwcHJvdmFsXG4gKiBnbG9icyByZWFkIGV4YWN0bHkgbGlrZSBhbGxvdy1saXN0IGdsb2JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxNYXRjaGVzKFxuICBnYXRlOiBBcHByb3ZhbEdhdGUgfCBBcHByb3ZhbFBvbGljeSxcbiAgdXJsczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcG9saWN5ID0gdG9BcHByb3ZhbFBvbGljeShnYXRlKTtcbiAgaWYgKHBvbGljeS5tb2RlID09PSBcIm5vbmVcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAocG9saWN5Lm1vZGUgPT09IFwiYWx3YXlzXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBsaXN0ID0gdG9VcmxBbGxvd0xpc3QocG9saWN5LnBhdHRlcm5zKTtcbiAgcmV0dXJuIHVybHMuc29tZSgodXJsKSA9PiBsaXN0LmFsbG93cyh1cmwpKTtcbn1cbiJdfQ==
@@ -18,8 +18,8 @@
18
18
  *
19
19
  * @module
20
20
  */
21
- import { AppKitError, ExecutionError } from "@databricks/appkit";
22
- import { async, error, log } from "@dbx-tools/shared-core";
21
+ import { ExecutionError } from "@databricks/appkit";
22
+ import { execution, log } from "@dbx-tools/shared-core";
23
23
  import { resolveWebSearchConfig, } from "./config.js";
24
24
  const logger = log.logger("web-search/runtime");
25
25
  /**
@@ -27,18 +27,7 @@ const logger = log.logger("web-search/runtime");
27
27
  * directly, mapping a throw onto the same {@link ExecutionResult} shape so
28
28
  * call sites branch on `ok` either way.
29
29
  */
30
- const directExecute = async (fn) => {
31
- try {
32
- return { ok: true, data: await fn() };
33
- }
34
- catch (err) {
35
- return {
36
- ok: false,
37
- status: err instanceof AppKitError ? err.statusCode : 500,
38
- message: error.errorMessage(err),
39
- };
40
- }
41
- };
30
+ const directExecute = execution.directExecutor();
42
31
  let runtime;
43
32
  /**
44
33
  * Return the shared runtime, building it on first use from the supplied
@@ -77,19 +66,23 @@ export function resetWebSearchRuntime() {
77
66
  */
78
67
  export async function executeRead(operation, settings, fn, signal) {
79
68
  const { execute } = getWebSearchRuntime();
80
- const result = await execute((executeSignal) => fn(async.combineAbortSignals(executeSignal, signal)), settings);
81
- if (result.ok)
82
- return result.data;
83
- // A caller that cancelled is not a failure worth reporting as one.
84
- if (signal?.aborted)
85
- throw ExecutionError.canceled();
86
- logger.warn("execution-failed", {
69
+ return execution.run({
87
70
  operation,
88
- status: result.status,
89
- error: result.message,
90
- });
91
- throw new ExecutionError(`web-search: ${operation} failed`, {
92
- context: { operation, status: result.status },
71
+ settings,
72
+ execute,
73
+ fn,
74
+ signal,
75
+ canceled: ExecutionError.canceled,
76
+ failed: (failure) => {
77
+ logger.warn("execution-failed", {
78
+ operation: failure.operation,
79
+ status: failure.status,
80
+ error: failure.message,
81
+ });
82
+ return new ExecutionError(`web-search: ${failure.operation} failed`, {
83
+ context: { operation: failure.operation, status: failure.status },
84
+ });
85
+ },
93
86
  });
94
87
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQXdCLE1BQU0sb0JBQW9CLENBQUM7QUFDdkYsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFrQmhEOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBc0IsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQ3BELElBQUksQ0FBQztRQUNILE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixPQUFPO1lBQ0wsRUFBRSxFQUFFLEtBQUs7WUFDVCxNQUFNLEVBQUUsR0FBRyxZQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRztZQUN6RCxPQUFPLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDakMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixJQUFJLE9BQXFDLENBQUM7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQWlDO0lBQ25FLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE9BQTBCO0lBQzdELG1CQUFtQixFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQyxDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLFNBQWlCLEVBQ2pCLFFBQW9DLEVBQ3BDLEVBQXdDLEVBQ3hDLE1BQW9CO0lBRXBCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUMxQixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDdkUsUUFBUSxDQUNULENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2xDLG1FQUFtRTtJQUNuRSxJQUFJLE1BQU0sRUFBRSxPQUFPO1FBQUUsTUFBTSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUM5QixTQUFTO1FBQ1QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTztLQUN0QixDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksY0FBYyxDQUFDLGVBQWUsU0FBUyxTQUFTLEVBQUU7UUFDMUQsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO0tBQzlDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSB3ZWItc2VhcmNoIHJ1bnRpbWU6IGEgbGF6aWx5LXJlc29sdmVkLCBwcm9jZXNzLXdpZGUgY29uZmlnIHNoYXJlZCBieVxuICogdGhlIHBsdWdpbiBhbmQgdGhlIGB3ZWJfc2VhcmNoYCAvIGB3ZWJfZmV0Y2hgIHRvb2xzLCBzbyBib3RoIHJlYWQgb25lXG4gKiByZXNvbHZlZCBhbGxvdy1saXN0IC8gY2FwIC8gdGltZW91dCBzZXQuIFRoZSBmaXJzdCBjYWxsZXIgKG5vcm1hbGx5IHRoZVxuICogcGx1Z2luIGF0IHNldHVwKSBwcmltZXMgaXQgZnJvbSB0aGUgcGx1Z2luJ3MgY29uZmlnOyBsYXRlciBjYWxsZXJzICh0aGVcbiAqIHRvb2xzJyBgZXhlY3V0ZWApIHJldXNlIGl0LlxuICpcbiAqIFRoZSBydW50aW1lIGFsc28gY2FycmllcyB0aGUge0BsaW5rIFdlYlNlYXJjaEV4ZWN1dG9yfSBldmVyeSBvdXRib3VuZCBjYWxsXG4gKiBydW5zIHRocm91Z2guIFRoZSBwbHVnaW4gaW5zdGFsbHMgaXRzIG93biBgZXhlY3V0ZSgpYCB0aGVyZSBhdCBzZXR1cCwgd2hpY2hcbiAqIGlzIGhvdyB0aGUgdG9vbHMgLSBwbGFpbiBmdW5jdGlvbnMgd2l0aCBubyBwbHVnaW4gaW5zdGFuY2UgaW4gc2NvcGUgLSBzdGlsbFxuICogZ2V0IEFwcEtpdCdzIGNhY2hlIC8gcmV0cnkgLyB0aW1lb3V0IC8gdGVsZW1ldHJ5IGNoYWluLiBXaXRob3V0IGFcbiAqIHJlZ2lzdGVyZWQgcGx1Z2luIChhIGRpcmVjdCBjYWxsIGZyb20gYSBzY3JpcHQgb3IgYSB0ZXN0KSB0aGUgY2FsbHMgc3RpbGxcbiAqIHJ1biwganVzdCB3aXRob3V0IGludGVyY2VwdG9ycy5cbiAqXG4gKiBVbmxpa2UgdGhlIGVtYWlsIHJ1bnRpbWUgdGhlcmUgaXMgbm8gY29ubmVjdGlvbiB0byBwb29sIC0gdGhlIGJhY2tlbmQgaXNcbiAqIHN0YXRlbGVzcyBIVFRQIHBlciBjYWxsIC0gc28gdGhlIHJ1bnRpbWUgaG9sZHMgb25seSB0aGUgcmVzb2x2ZWQgY29uZmlnIGFuZFxuICogdGhhdCBleGVjdXRvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQXBwS2l0RXJyb3IsIEV4ZWN1dGlvbkVycm9yLCB0eXBlIEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jLCBlcnJvciwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVXZWJTZWFyY2hDb25maWcsXG4gIHR5cGUgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIHR5cGUgV2ViU2VhcmNoUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwid2ViLXNlYXJjaC9ydW50aW1lXCIpO1xuXG4vKipcbiAqIFJ1bnMgb25lIG91dGJvdW5kIGNhbGwgdGhyb3VnaCBBcHBLaXQncyBpbnRlcmNlcHRvciBjaGFpbi4gTWF0Y2hlc1xuICogYFBsdWdpbi5leGVjdXRlKClgLCB3aGljaCBuZXZlciB0aHJvd3M6IGEgZmFpbHVyZSBjb21lcyBiYWNrIGFzXG4gKiBgeyBvazogZmFsc2UgfWAuXG4gKi9cbmV4cG9ydCB0eXBlIFdlYlNlYXJjaEV4ZWN1dG9yID0gPFQ+KFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PjtcblxuLyoqIFRoZSBzaGFyZWQgcmVzb2x2ZWQgY29uZmlnIHBsdXMgdGhlIGV4ZWN1dG9yIG91dGJvdW5kIGNhbGxzIHJ1biB0aHJvdWdoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hSdW50aW1lIHtcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZztcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3I7XG59XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCB1bnRpbCAob3IgdW5sZXNzKSB0aGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd246IHJ1biB0aGUgY2FsbFxuICogZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvdyBvbnRvIHRoZSBzYW1lIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHNoYXBlIHNvXG4gKiBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGRpcmVjdEV4ZWN1dGU6IFdlYlNlYXJjaEV4ZWN1dG9yID0gYXN5bmMgKGZuKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IGF3YWl0IGZuKCkgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIHN0YXR1czogZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIuc3RhdHVzQ29kZSA6IDUwMCxcbiAgICAgIG1lc3NhZ2U6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH07XG4gIH1cbn07XG5cbmxldCBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc2hhcmVkIHJ1bnRpbWUsIGJ1aWxkaW5nIGl0IG9uIGZpcnN0IHVzZSBmcm9tIHRoZSBzdXBwbGllZFxuICogY29uZmlnIGxheWVyZWQgb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cy4gT3ZlcnJpZGVzIGFyZSBvbmx5IHJlYWQgd2hlbiB0aGVcbiAqIHJ1bnRpbWUgaXMgZmlyc3QgY3JlYXRlZCwgc28gcHJpbWUgaXQgZnJvbSB0aGUgcGx1Z2luJ3MgY29uZmlnIGF0IHNldHVwO1xuICogc3Vic2VxdWVudCBjYWxscyAodGhlIHRvb2xzJyBgZXhlY3V0ZWApIHBhc3Mgbm90aGluZyBhbmQgZ2V0IHRoZSBzYW1lXG4gKiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlNlYXJjaFJ1bnRpbWUob3ZlcnJpZGVzPzogV2ViU2VhcmNoUGx1Z2luQ29uZmlnKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIGlmICghcnVudGltZSkge1xuICAgIHJ1bnRpbWUgPSB7IGNvbmZpZzogcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyhvdmVycmlkZXMpLCBleGVjdXRlOiBkaXJlY3RFeGVjdXRlIH07XG4gIH1cbiAgcmV0dXJuIHJ1bnRpbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgZXhlY3V0b3Igb3V0Ym91bmQgY2FsbHMgcnVuIHRocm91Z2guIFRoZSBwbHVnaW4gY2FsbHMgdGhpcyBhdFxuICogc2V0dXAgd2l0aCBpdHMgb3duIGBleGVjdXRlKClgOyBhIHNlY29uZCBjYWxsIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBvbmUsIHNvXG4gKiBhIHJlLXJlZ2lzdGVyZWQgcGx1Z2luIGRvZXMgbm90IGxlYXZlIHRoZSB0b29scyBib3VuZCB0byBhIGRlYWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXZWJTZWFyY2hFeGVjdXRvcihleGVjdXRlOiBXZWJTZWFyY2hFeGVjdXRvcik6IHZvaWQge1xuICBnZXRXZWJTZWFyY2hSdW50aW1lKCkuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKiBEcm9wIHRoZSBtZW1vaXplZCBydW50aW1lIHNvIHRoZSBuZXh0IHtAbGluayBnZXRXZWJTZWFyY2hSdW50aW1lfSByZWJ1aWxkcyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdlYlNlYXJjaFJ1bnRpbWUoKTogdm9pZCB7XG4gIHJ1bnRpbWUgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUnVuIG9uZSBpZGVtcG90ZW50IHJlYWQgdGhyb3VnaCB0aGUgc2hhcmVkIGV4ZWN1dG9yIGFuZCB1bndyYXAgaXQuXG4gKlxuICogYGV4ZWN1dGUoKWAgbmV2ZXIgdGhyb3dzLCBzbyBhIGZhaWxlZCBjYWxsIGFycml2ZXMgYXMgYHsgb2s6IGZhbHNlIH1gIHdpdGhcbiAqIGEgc3RhdHVzIHRoZSBpbnRlcmNlcHRvcnMgYWxyZWFkeSBzYW5pdGl6ZWQ7IGl0IGlzIGxvZ2dlZCBoZXJlIGFuZCByZS1yYWlzZWRcbiAqIGFzIGEgc3RhYmxlIHtAbGluayBFeGVjdXRpb25FcnJvcn0gc28gYW4gdXBzdHJlYW0gbWVzc2FnZSBuZXZlciBiZWNvbWVzIHRoZVxuICogY2FsbGVyJ3MgZXJyb3IgdGV4dC4gYHNpZ25hbGAgaXMgdGhlIGNhbGxlcidzIG93biBjYW5jZWxsYXRpb24gKGFuIGFnZW50XG4gKiBydW4sIGEgcmVxdWVzdCB0ZWFyZG93bik7IGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBzaWduYWwgdGhlIHRpbWVvdXRcbiAqIGludGVyY2VwdG9yIHN1cHBsaWVzIHNvIGVpdGhlciBvbmUgdW53aW5kcyB0aGUgSS9PLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJlYWQ8VD4oXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgZXhlY3V0ZSB9ID0gZ2V0V2ViU2VhcmNoUnVudGltZSgpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKFxuICAgIChleGVjdXRlU2lnbmFsKSA9PiBmbihhc3luYy5jb21iaW5lQWJvcnRTaWduYWxzKGV4ZWN1dGVTaWduYWwsIHNpZ25hbCkpLFxuICAgIHNldHRpbmdzLFxuICApO1xuICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIC8vIEEgY2FsbGVyIHRoYXQgY2FuY2VsbGVkIGlzIG5vdCBhIGZhaWx1cmUgd29ydGggcmVwb3J0aW5nIGFzIG9uZS5cbiAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQoKTtcbiAgbG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHtcbiAgICBvcGVyYXRpb24sXG4gICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgfSk7XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgd2ViLXNlYXJjaDogJHtvcGVyYXRpb259IGZhaWxlZGAsIHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbiwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH0sXG4gIH0pO1xufVxuIl19
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxzQkFBc0IsR0FHdkIsTUFBTSxhQUFhLENBQUM7QUFHckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBa0JoRDs7OztHQUlHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLGNBQWMsRUFBOEIsQ0FBQztBQUU3RSxJQUFJLE9BQXFDLENBQUM7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQWlDO0lBQ25FLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE9BQTBCO0lBQzdELG1CQUFtQixFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQyxDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLFNBQWlCLEVBQ2pCLFFBQW9DLEVBQ3BDLEVBQXdDLEVBQ3hDLE1BQW9CO0lBRXBCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQzFDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUNuQixTQUFTO1FBQ1QsUUFBUTtRQUNSLE9BQU87UUFDUCxFQUFFO1FBQ0YsTUFBTTtRQUNOLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTtRQUNqQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxjQUFjLENBQUMsZUFBZSxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7Z0JBQ25FLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO2FBQ2xFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgd2ViLXNlYXJjaCBydW50aW1lOiBhIGxhemlseS1yZXNvbHZlZCwgcHJvY2Vzcy13aWRlIGNvbmZpZyBzaGFyZWQgYnlcbiAqIHRoZSBwbHVnaW4gYW5kIHRoZSBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB0b29scywgc28gYm90aCByZWFkIG9uZVxuICogcmVzb2x2ZWQgYWxsb3ctbGlzdCAvIGNhcCAvIHRpbWVvdXQgc2V0LiBUaGUgZmlyc3QgY2FsbGVyIChub3JtYWxseSB0aGVcbiAqIHBsdWdpbiBhdCBzZXR1cCkgcHJpbWVzIGl0IGZyb20gdGhlIHBsdWdpbidzIGNvbmZpZzsgbGF0ZXIgY2FsbGVycyAodGhlXG4gKiB0b29scycgYGV4ZWN1dGVgKSByZXVzZSBpdC5cbiAqXG4gKiBUaGUgcnVudGltZSBhbHNvIGNhcnJpZXMgdGhlIHtAbGluayBXZWJTZWFyY2hFeGVjdXRvcn0gZXZlcnkgb3V0Ym91bmQgY2FsbFxuICogcnVucyB0aHJvdWdoLiBUaGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd24gYGV4ZWN1dGUoKWAgdGhlcmUgYXQgc2V0dXAsIHdoaWNoXG4gKiBpcyBob3cgdGhlIHRvb2xzIC0gcGxhaW4gZnVuY3Rpb25zIHdpdGggbm8gcGx1Z2luIGluc3RhbmNlIGluIHNjb3BlIC0gc3RpbGxcbiAqIGdldCBBcHBLaXQncyBjYWNoZSAvIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi4gV2l0aG91dCBhXG4gKiByZWdpc3RlcmVkIHBsdWdpbiAoYSBkaXJlY3QgY2FsbCBmcm9tIGEgc2NyaXB0IG9yIGEgdGVzdCkgdGhlIGNhbGxzIHN0aWxsXG4gKiBydW4sIGp1c3Qgd2l0aG91dCBpbnRlcmNlcHRvcnMuXG4gKlxuICogVW5saWtlIHRoZSBlbWFpbCBydW50aW1lIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24gdG8gcG9vbCAtIHRoZSBiYWNrZW5kIGlzXG4gKiBzdGF0ZWxlc3MgSFRUUCBwZXIgY2FsbCAtIHNvIHRoZSBydW50aW1lIGhvbGRzIG9ubHkgdGhlIHJlc29sdmVkIGNvbmZpZyBhbmRcbiAqIHRoYXQgZXhlY3V0b3IuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCB0eXBlIEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWN1dGlvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVXZWJTZWFyY2hDb25maWcsXG4gIHR5cGUgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIHR5cGUgV2ViU2VhcmNoUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwid2ViLXNlYXJjaC9ydW50aW1lXCIpO1xuXG4vKipcbiAqIFJ1bnMgb25lIG91dGJvdW5kIGNhbGwgdGhyb3VnaCBBcHBLaXQncyBpbnRlcmNlcHRvciBjaGFpbi4gTWF0Y2hlc1xuICogYFBsdWdpbi5leGVjdXRlKClgLCB3aGljaCBuZXZlciB0aHJvd3M6IGEgZmFpbHVyZSBjb21lcyBiYWNrIGFzXG4gKiBgeyBvazogZmFsc2UgfWAuXG4gKi9cbmV4cG9ydCB0eXBlIFdlYlNlYXJjaEV4ZWN1dG9yID0gPFQ+KFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PjtcblxuLyoqIFRoZSBzaGFyZWQgcmVzb2x2ZWQgY29uZmlnIHBsdXMgdGhlIGV4ZWN1dG9yIG91dGJvdW5kIGNhbGxzIHJ1biB0aHJvdWdoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hSdW50aW1lIHtcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZztcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3I7XG59XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCB1bnRpbCAob3IgdW5sZXNzKSB0aGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd246IHJ1biB0aGUgY2FsbFxuICogZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvdyBvbnRvIHRoZSBzYW1lIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHNoYXBlIHNvXG4gKiBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGRpcmVjdEV4ZWN1dGUgPSBleGVjdXRpb24uZGlyZWN0RXhlY3V0b3I8V2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3M+KCk7XG5cbmxldCBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc2hhcmVkIHJ1bnRpbWUsIGJ1aWxkaW5nIGl0IG9uIGZpcnN0IHVzZSBmcm9tIHRoZSBzdXBwbGllZFxuICogY29uZmlnIGxheWVyZWQgb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cy4gT3ZlcnJpZGVzIGFyZSBvbmx5IHJlYWQgd2hlbiB0aGVcbiAqIHJ1bnRpbWUgaXMgZmlyc3QgY3JlYXRlZCwgc28gcHJpbWUgaXQgZnJvbSB0aGUgcGx1Z2luJ3MgY29uZmlnIGF0IHNldHVwO1xuICogc3Vic2VxdWVudCBjYWxscyAodGhlIHRvb2xzJyBgZXhlY3V0ZWApIHBhc3Mgbm90aGluZyBhbmQgZ2V0IHRoZSBzYW1lXG4gKiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlNlYXJjaFJ1bnRpbWUob3ZlcnJpZGVzPzogV2ViU2VhcmNoUGx1Z2luQ29uZmlnKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIGlmICghcnVudGltZSkge1xuICAgIHJ1bnRpbWUgPSB7IGNvbmZpZzogcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyhvdmVycmlkZXMpLCBleGVjdXRlOiBkaXJlY3RFeGVjdXRlIH07XG4gIH1cbiAgcmV0dXJuIHJ1bnRpbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgZXhlY3V0b3Igb3V0Ym91bmQgY2FsbHMgcnVuIHRocm91Z2guIFRoZSBwbHVnaW4gY2FsbHMgdGhpcyBhdFxuICogc2V0dXAgd2l0aCBpdHMgb3duIGBleGVjdXRlKClgOyBhIHNlY29uZCBjYWxsIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBvbmUsIHNvXG4gKiBhIHJlLXJlZ2lzdGVyZWQgcGx1Z2luIGRvZXMgbm90IGxlYXZlIHRoZSB0b29scyBib3VuZCB0byBhIGRlYWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXZWJTZWFyY2hFeGVjdXRvcihleGVjdXRlOiBXZWJTZWFyY2hFeGVjdXRvcik6IHZvaWQge1xuICBnZXRXZWJTZWFyY2hSdW50aW1lKCkuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKiBEcm9wIHRoZSBtZW1vaXplZCBydW50aW1lIHNvIHRoZSBuZXh0IHtAbGluayBnZXRXZWJTZWFyY2hSdW50aW1lfSByZWJ1aWxkcyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdlYlNlYXJjaFJ1bnRpbWUoKTogdm9pZCB7XG4gIHJ1bnRpbWUgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUnVuIG9uZSBpZGVtcG90ZW50IHJlYWQgdGhyb3VnaCB0aGUgc2hhcmVkIGV4ZWN1dG9yIGFuZCB1bndyYXAgaXQuXG4gKlxuICogYGV4ZWN1dGUoKWAgbmV2ZXIgdGhyb3dzLCBzbyBhIGZhaWxlZCBjYWxsIGFycml2ZXMgYXMgYHsgb2s6IGZhbHNlIH1gIHdpdGhcbiAqIGEgc3RhdHVzIHRoZSBpbnRlcmNlcHRvcnMgYWxyZWFkeSBzYW5pdGl6ZWQ7IGl0IGlzIGxvZ2dlZCBoZXJlIGFuZCByZS1yYWlzZWRcbiAqIGFzIGEgc3RhYmxlIHtAbGluayBFeGVjdXRpb25FcnJvcn0gc28gYW4gdXBzdHJlYW0gbWVzc2FnZSBuZXZlciBiZWNvbWVzIHRoZVxuICogY2FsbGVyJ3MgZXJyb3IgdGV4dC4gYHNpZ25hbGAgaXMgdGhlIGNhbGxlcidzIG93biBjYW5jZWxsYXRpb24gKGFuIGFnZW50XG4gKiBydW4sIGEgcmVxdWVzdCB0ZWFyZG93bik7IGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBzaWduYWwgdGhlIHRpbWVvdXRcbiAqIGludGVyY2VwdG9yIHN1cHBsaWVzIHNvIGVpdGhlciBvbmUgdW53aW5kcyB0aGUgSS9PLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJlYWQ8VD4oXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgZXhlY3V0ZSB9ID0gZ2V0V2ViU2VhcmNoUnVudGltZSgpO1xuICByZXR1cm4gZXhlY3V0aW9uLnJ1bih7XG4gICAgb3BlcmF0aW9uLFxuICAgIHNldHRpbmdzLFxuICAgIGV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbGVkOiBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCxcbiAgICBmYWlsZWQ6IChmYWlsdXJlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwge1xuICAgICAgICBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLFxuICAgICAgICBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzLFxuICAgICAgICBlcnJvcjogZmFpbHVyZS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKGB3ZWItc2VhcmNoOiAke2ZhaWx1cmUub3BlcmF0aW9ufSBmYWlsZWRgLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBmYWlsdXJlLm9wZXJhdGlvbiwgc3RhdHVzOiBmYWlsdXJlLnN0YXR1cyB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -26,10 +26,10 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@databricks/appkit": "^0.43.0",
29
- "@dbx-tools/model": "0.6.46",
30
- "@dbx-tools/path": "0.6.46",
31
- "@dbx-tools/shared-core": "0.6.46",
32
- "@dbx-tools/shared-model": "0.6.46",
29
+ "@dbx-tools/model": "0.6.48",
30
+ "@dbx-tools/path": "0.6.48",
31
+ "@dbx-tools/shared-core": "0.6.48",
32
+ "@dbx-tools/shared-model": "0.6.48",
33
33
  "@mastra/core": "^1.47.0",
34
34
  "got-scraping": "^4.2.1",
35
35
  "zod": "4.3.6"
@@ -48,7 +48,7 @@
48
48
  "./package.json": "./package.json"
49
49
  }
50
50
  },
51
- "version": "0.6.46",
51
+ "version": "0.6.48",
52
52
  "types": "./lib/index.d.ts",
53
53
  "type": "module",
54
54
  "exports": {
package/src/config.ts CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  import { ConfigurationError, type BasePluginConfig } from "@databricks/appkit";
48
48
  import { serving } from "@dbx-tools/model";
49
- import { json, object, type OneOrMany, string } from "@dbx-tools/shared-core";
49
+ import { env, json, object, type OneOrMany, string } from "@dbx-tools/shared-core";
50
50
  import type { JSONSchema7 } from "json-schema";
51
51
  import { parseAllowedUrls, toUrlAllowList, type UrlAllowList } from "./allowlist.ts";
52
52
 
@@ -300,20 +300,13 @@ export const WEB_SEARCH_CONFIG_SCHEMA: JSONSchema7 = {
300
300
  },
301
301
  };
302
302
 
303
- /** Parse a positive integer env/config value, else the fallback. */
304
- function resolvePositiveInt(value: number | undefined, envKey: string, fallback: number): number {
305
- if (typeof value === "number" && Number.isFinite(value) && value > 0) return Math.floor(value);
306
- const env = Number(process.env[envKey]);
307
- return Number.isFinite(env) && env > 0 ? Math.floor(env) : fallback;
308
- }
309
-
310
303
  /**
311
304
  * Parse the `WEB_SEARCH_TOOLS` env var (JSON object), else `{}`. A value that
312
305
  * is set but not a JSON object is a deployment mistake that would otherwise
313
306
  * silently leave the built-in tool specs in place, so it throws.
314
307
  */
315
308
  function parseToolsEnv(): Record<string, unknown> {
316
- const raw = string.trimToNull(process.env.WEB_SEARCH_TOOLS);
309
+ const raw = env.text("WEB_SEARCH_TOOLS");
317
310
  if (raw === null) return {};
318
311
  const parsed = json.parseRecord(raw);
319
312
  if (!parsed) {
@@ -329,9 +322,9 @@ function parseToolsEnv(): Record<string, unknown> {
329
322
  function resolveModelPin(config: WebSearchPluginConfig): { model?: string; source: ModelSource } {
330
323
  const fromConfig = string.trimToNull(config.model);
331
324
  if (fromConfig !== null) return { model: fromConfig, source: "config" };
332
- const fromModelEnv = string.trimToNull(process.env[MODEL_ENV]);
325
+ const fromModelEnv = env.text(MODEL_ENV);
333
326
  if (fromModelEnv !== null) return { model: fromModelEnv, source: MODEL_ENV };
334
- const fromResourceEnv = string.trimToNull(process.env[SERVING_ENDPOINT_ENV]);
327
+ const fromResourceEnv = env.text(SERVING_ENDPOINT_ENV);
335
328
  if (fromResourceEnv !== null) return { model: fromResourceEnv, source: SERVING_ENDPOINT_ENV };
336
329
  return { source: "none" };
337
330
  }
@@ -344,7 +337,7 @@ function resolveUrlPolicy(
344
337
  configured: UrlPolicyMode | undefined,
345
338
  patterns: readonly string[],
346
339
  ): UrlPolicyMode {
347
- const raw = configured ?? string.trimToNull(process.env.WEB_SEARCH_URL_POLICY) ?? undefined;
340
+ const raw = configured ?? env.text("WEB_SEARCH_URL_POLICY") ?? undefined;
348
341
  if (raw === undefined) return patterns.length > 0 ? "allowlist" : "unrestricted";
349
342
  if (raw !== "allowlist" && raw !== "unrestricted") {
350
343
  throw new ConfigurationError(
@@ -401,37 +394,35 @@ export function toApprovalPolicy(gate: ApprovalGate | ApprovalPolicy | undefined
401
394
  export function resolveWebSearchConfig(
402
395
  config: WebSearchPluginConfig = {},
403
396
  ): ResolvedWebSearchConfig {
404
- const patterns = parseAllowedUrls(config.allowedUrls ?? process.env.WEB_SEARCH_ALLOWED_URLS);
397
+ const patterns = parseAllowedUrls(
398
+ config.allowedUrls ?? env.text("WEB_SEARCH_ALLOWED_URLS") ?? undefined,
399
+ );
405
400
  const urlPolicy = resolveUrlPolicy(config.urlPolicy, patterns);
406
401
  const { model, source } = resolveModelPin(config);
407
- const fallbacks = string.parseList(
408
- config.modelFallbacks ?? process.env.WEB_SEARCH_MODEL_FALLBACKS,
409
- );
410
- const fuzzyThresholdRaw =
411
- config.modelFuzzyThreshold ?? Number(process.env.WEB_SEARCH_FUZZY_THRESHOLD);
402
+ const fallbacks = env.list(config.modelFallbacks, "WEB_SEARCH_MODEL_FALLBACKS");
412
403
  return {
413
404
  ...(model ? { model } : {}),
414
405
  modelSource: source,
415
406
  modelFallbacks: fallbacks.length > 0 ? fallbacks : DEFAULT_MODEL_FALLBACKS,
416
407
  webSearchTools: { ...parseToolsEnv(), ...(config.webSearchTools ?? {}) },
417
- fuzzy: config.modelFuzzyMatch ?? object.toBoolean(process.env.WEB_SEARCH_FUZZY) ?? true,
418
- fuzzyThreshold:
419
- Number.isFinite(fuzzyThresholdRaw) && fuzzyThresholdRaw
420
- ? Number(fuzzyThresholdRaw)
421
- : serving.DEFAULT_FUZZY_THRESHOLD,
422
- maxCitations: resolvePositiveInt(
408
+ fuzzy: env.boolean(config.modelFuzzyMatch, "WEB_SEARCH_FUZZY") ?? true,
409
+ fuzzyThreshold: env.positiveNumber(
410
+ config.modelFuzzyThreshold,
411
+ "WEB_SEARCH_FUZZY_THRESHOLD",
412
+ serving.DEFAULT_FUZZY_THRESHOLD,
413
+ ),
414
+ maxCitations: env.positiveInt(
423
415
  config.maxCitations,
424
416
  "WEB_SEARCH_MAX_CITATIONS",
425
417
  DEFAULT_MAX_CITATIONS,
426
418
  ),
427
- fetchMaxLength: resolvePositiveInt(
419
+ fetchMaxLength: env.positiveInt(
428
420
  config.fetchMaxLength,
429
421
  "WEB_SEARCH_FETCH_MAX_LENGTH",
430
422
  DEFAULT_FETCH_MAX_LENGTH,
431
423
  ),
432
- timeoutMs: resolvePositiveInt(config.timeoutMs, "WEB_SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
433
- scrapeFallback:
434
- config.scrapeFallback ?? object.toBoolean(process.env.WEB_SEARCH_SCRAPE_FALLBACK) ?? true,
424
+ timeoutMs: env.positiveInt(config.timeoutMs, "WEB_SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
425
+ scrapeFallback: env.boolean(config.scrapeFallback, "WEB_SEARCH_SCRAPE_FALLBACK") ?? true,
435
426
  urlPolicy,
436
427
  allowList: toUrlAllowList(urlPolicy === "allowlist" ? patterns : []),
437
428
  approval: toApprovalPolicy(config.approval),
package/src/runtime.ts CHANGED
@@ -19,8 +19,8 @@
19
19
  * @module
20
20
  */
21
21
 
22
- import { AppKitError, ExecutionError, type ExecutionResult } from "@databricks/appkit";
23
- import { async, error, log } from "@dbx-tools/shared-core";
22
+ import { ExecutionError, type ExecutionResult } from "@databricks/appkit";
23
+ import { execution, log } from "@dbx-tools/shared-core";
24
24
  import {
25
25
  resolveWebSearchConfig,
26
26
  type ResolvedWebSearchConfig,
@@ -51,17 +51,7 @@ export interface WebSearchRuntime {
51
51
  * directly, mapping a throw onto the same {@link ExecutionResult} shape so
52
52
  * call sites branch on `ok` either way.
53
53
  */
54
- const directExecute: WebSearchExecutor = async (fn) => {
55
- try {
56
- return { ok: true, data: await fn() };
57
- } catch (err) {
58
- return {
59
- ok: false,
60
- status: err instanceof AppKitError ? err.statusCode : 500,
61
- message: error.errorMessage(err),
62
- };
63
- }
64
- };
54
+ const directExecute = execution.directExecutor<WebSearchExecutionSettings>();
65
55
 
66
56
  let runtime: WebSearchRuntime | undefined;
67
57
 
@@ -110,19 +100,22 @@ export async function executeRead<T>(
110
100
  signal?: AbortSignal,
111
101
  ): Promise<T> {
112
102
  const { execute } = getWebSearchRuntime();
113
- const result = await execute(
114
- (executeSignal) => fn(async.combineAbortSignals(executeSignal, signal)),
115
- settings,
116
- );
117
- if (result.ok) return result.data;
118
- // A caller that cancelled is not a failure worth reporting as one.
119
- if (signal?.aborted) throw ExecutionError.canceled();
120
- logger.warn("execution-failed", {
103
+ return execution.run({
121
104
  operation,
122
- status: result.status,
123
- error: result.message,
124
- });
125
- throw new ExecutionError(`web-search: ${operation} failed`, {
126
- context: { operation, status: result.status },
105
+ settings,
106
+ execute,
107
+ fn,
108
+ signal,
109
+ canceled: ExecutionError.canceled,
110
+ failed: (failure) => {
111
+ logger.warn("execution-failed", {
112
+ operation: failure.operation,
113
+ status: failure.status,
114
+ error: failure.message,
115
+ });
116
+ return new ExecutionError(`web-search: ${failure.operation} failed`, {
117
+ context: { operation: failure.operation, status: failure.status },
118
+ });
119
+ },
127
120
  });
128
121
  }