@dbx-tools/search 0.9.154 → 0.9.158

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
@@ -22,8 +22,8 @@
22
22
  * @module
23
23
  */
24
24
  import { ConfigurationError } from "@databricks/appkit";
25
- import { configUtils } from "@dbx-tools/core";
26
- import { object, stringUtils } from "@dbx-tools/shared-core";
25
+ import { text, ENV_ONLY, string, list, positiveInt, boolean } from "@dbx-tools/core";
26
+ import { optional, trimToNull } from "@dbx-tools/shared-core";
27
27
  /** The default index, honoring AppKit's standard Vector Search binding name. */
28
28
  export const INDEX_ENV = "SEARCH_INDEX";
29
29
  /** AppKit's standard environment name for a Vector Search index binding. */
@@ -111,19 +111,19 @@ export function defaultAlias(name) {
111
111
  /** Normalize a config index entry (string or object) into a {@link ResolvedIndexConfig}. */
112
112
  function toResolvedIndex(entry) {
113
113
  const raw = typeof entry === "string" ? { name: entry } : entry;
114
- const name = stringUtils.trimToNull(raw.name);
114
+ const name = trimToNull(raw.name);
115
115
  if (name === null)
116
116
  return null;
117
117
  return {
118
118
  name,
119
- alias: stringUtils.trimToNull(raw.alias) ?? defaultAlias(name),
119
+ alias: trimToNull(raw.alias) ?? defaultAlias(name),
120
120
  ...(raw.primaryKey ? { primaryKey: raw.primaryKey } : {}),
121
121
  ...(raw.columns && raw.columns.length > 0 ? { columns: [...raw.columns] } : {}),
122
122
  };
123
123
  }
124
124
  /** Parse and validate a {@link SearchMode} from config or an env var. */
125
125
  function resolveMode(configured) {
126
- const raw = configured ?? configUtils.text("SEARCH_MODE", configUtils.ENV_ONLY);
126
+ const raw = configured ?? text("SEARCH_MODE", ENV_ONLY);
127
127
  if (raw === undefined)
128
128
  return DEFAULT_MODE;
129
129
  if (raw !== "hybrid" && raw !== "vector" && raw !== "keyword") {
@@ -138,13 +138,13 @@ function resolveMode(configured) {
138
138
  * and a bad mode throws a {@link ConfigurationError} naming the field.
139
139
  */
140
140
  export function resolveSearchConfig(config = {}) {
141
- const defaultIndexRaw = configUtils.string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV], configUtils.ENV_ONLY);
141
+ const defaultIndexRaw = string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV], ENV_ONLY);
142
142
  const configured = (config.indexes ?? [])
143
143
  .map(toResolvedIndex)
144
144
  .filter((entry) => entry !== null);
145
145
  // Ensure the default index is represented in the known set.
146
146
  if (defaultIndexRaw && !configured.some((i) => i.name === defaultIndexRaw)) {
147
- const envColumns = configUtils.list(undefined, "SEARCH_COLUMNS", undefined, configUtils.ENV_ONLY);
147
+ const envColumns = list(undefined, "SEARCH_COLUMNS", undefined, ENV_ONLY);
148
148
  configured.unshift({
149
149
  name: defaultIndexRaw,
150
150
  alias: defaultAlias(defaultIndexRaw),
@@ -160,17 +160,17 @@ export function resolveSearchConfig(config = {}) {
160
160
  return { ...entry, alias };
161
161
  });
162
162
  const defaultIndex = defaultIndexRaw ?? indexes[0]?.name;
163
- const columns = configUtils.list(config.columns, "SEARCH_COLUMNS", undefined, configUtils.ENV_ONLY);
163
+ const columns = list(config.columns, "SEARCH_COLUMNS", undefined, ENV_ONLY);
164
164
  return {
165
- ...object.optional("defaultIndex", defaultIndex),
165
+ ...optional("defaultIndex", defaultIndex),
166
166
  indexes,
167
- ...object.optional("endpoint", configUtils.string(config.endpoint, ENDPOINT_ENV, configUtils.ENV_ONLY)),
167
+ ...optional("endpoint", string(config.endpoint, ENDPOINT_ENV, ENV_ONLY)),
168
168
  ...(columns.length > 0 ? { columns } : {}),
169
- pageSize: configUtils.positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE, configUtils.ENV_ONLY),
169
+ pageSize: positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE, ENV_ONLY),
170
170
  mode: resolveMode(config.mode),
171
- ...object.optional("embeddingModel", configUtils.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", configUtils.ENV_ONLY)),
172
- timeoutMs: configUtils.positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, configUtils.ENV_ONLY),
173
- allowWrite: configUtils.boolean(config.allowWrite, "SEARCH_WRITE", configUtils.ENV_ONLY) ?? false,
171
+ ...optional("embeddingModel", string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", ENV_ONLY)),
172
+ timeoutMs: positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, ENV_ONLY),
173
+ allowWrite: boolean(config.allowWrite, "SEARCH_WRITE", ENV_ONLY) ?? false,
174
174
  ...(config.ensureOnSetup ? { ensureOnSetup: config.ensureOnSetup } : {}),
175
175
  };
176
176
  }
@@ -181,7 +181,7 @@ export function resolveSearchConfig(config = {}) {
181
181
  * raise a stable, user-facing error rather than calling a phantom index.
182
182
  */
183
183
  export function resolveIndexName(config, reference) {
184
- const ref = stringUtils.trimToNull(reference);
184
+ const ref = trimToNull(reference);
185
185
  if (ref === null)
186
186
  return config.defaultIndex ?? null;
187
187
  const byAlias = config.indexes.find((i) => i.alias === ref || i.name === ref);
@@ -196,4 +196,4 @@ export function resolveIndexName(config, reference) {
196
196
  export function indexConfigFor(config, name) {
197
197
  return config.indexes.find((i) => i.name === name || i.alias === name);
198
198
  }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUk3RCxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQztBQUV4Qyw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsZ0NBQWdDLENBQUM7QUFFckUsb0ZBQW9GO0FBQ3BGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztBQUU5QywyRkFBMkY7QUFDM0YsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFlLFFBQVEsQ0FBQztBQUVqRCx5RkFBeUY7QUFDekYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRXBDLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFvR3pDLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZ0I7SUFDL0MsSUFBSSxFQUFFLFFBQVE7SUFDZCxvQkFBb0IsRUFBRSxJQUFJO0lBQzFCLFVBQVUsRUFBRTtRQUNWLEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHVFQUF1RTtTQUNyRjtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsV0FBVyxFQUFFLDRFQUE0RTtZQUN6RixLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFO29CQUNMLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFB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WSxJQUFJLElBQUksQ0FBQztBQUNyQyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxjQUFjLENBQzVCLE1BQTRCLEVBQzVCLElBQVk7SUFFWixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBBSSBTZWFyY2ggcGx1Z2luOiB0aGUgdHlwZWRcbiAqIHtAbGluayBTZWFyY2hQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0IGNvbmZpZyksIHRoZSBKU09OXG4gKiBTY2hlbWEgdGhlIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3IgaXQsIGFuZCB7QGxpbmsgcmVzb2x2ZVNlYXJjaENvbmZpZ31cbiAqIHdoaWNoIGxheWVycyB0aGF0IGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRTZWFyY2hDb25maWd9IHRoZSBydW50aW1lLCBjbGllbnQsIHRvb2xzLCBhbmQgcm91dGVzIHJlYWQuXG4gKlxuICogVGhlIGRlc2lnbiBnb2FsIGlzIFwib25lIGluZGV4LCB6ZXJvIGNvbmZpZ1wiOiBuYW1lIGEgZGVmYXVsdCBpbmRleCAob3Igc2V0XG4gKiBgREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0lOREVYYCkgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBjb2x1bW5zIHRvXG4gKiByZXR1cm4sIHRoZSBwYWdlIHNpemUsIHRoZSBtYXRjaCBtb2RlLCBhbmQgdGhlIGVtYmVkZGluZyBtb2RlbCB1c2VkIHdoZW5cbiAqIGNyZWF0aW5nIGFuIGluZGV4IC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGNhbiBiZVxuICogb3ZlcnJpZGRlbiB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKlxuICogV2hpY2ggaW5kZXggLyBlbmRwb2ludCBpcyB1c2VkIGZvbGxvd3MgdGhlIHN0YW5kYXJkIHByZWNlZGVuY2U6IGV4cGxpY2l0XG4gKiBwbHVnaW4gY29uZmlnLCB0aGVuIGVudmlyb25tZW50LCB0aGVuIGEgZGVmYXVsdC5cbiAqXG4gKiBFbnYgZmFsbGJhY2tzOiBgREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0lOREVYYCAodGhlIGRlZmF1bHQgaW5kZXgpLFxuICogYFNFQVJDSF9JTkRFWGAsIGBTRUFSQ0hfRU5EUE9JTlRgLCBgU0VBUkNIX0NPTFVNTlNgLFxuICogYFNFQVJDSF9QQUdFX1NJWkVgLCBgU0VBUkNIX01PREVgLCBgU0VBUkNIX0VNQkVERElOR19NT0RFTGAsXG4gKiBgU0VBUkNIX1RJTUVPVVRfTVNgLCBgU0VBUkNIX1dSSVRFYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCB0eXBlIEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjb25maWdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hEb2N1bWVudCwgU2VhcmNoTW9kZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcblxuLyoqIFRoZSBkZWZhdWx0IGluZGV4LCBob25vcmluZyBBcHBLaXQncyBzdGFuZGFyZCBWZWN0b3IgU2VhcmNoIGJpbmRpbmcgbmFtZS4gKi9cbmV4cG9ydCBjb25zdCBJTkRFWF9FTlYgPSBcIlNFQVJDSF9JTkRFWFwiO1xuXG4vKiogQXBwS2l0J3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQgbmFtZSBmb3IgYSBWZWN0b3IgU2VhcmNoIGluZGV4IGJpbmRpbmcuICovXG5leHBvcnQgY29uc3QgREFUQUJSSUNLU19JTkRFWF9FTlYgPSBcIkRBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWFwiO1xuXG4vKiogRGVkaWNhdGVkIG92ZXJyaWRlIGZvciB0aGUgVmVjdG9yIFNlYXJjaCBzZXJ2aW5nIGVuZHBvaW50IHRoYXQgaG9zdHMgaW5kZXhlcy4gKi9cbmV4cG9ydCBjb25zdCBFTkRQT0lOVF9FTlYgPSBcIlNFQVJDSF9FTkRQT0lOVFwiO1xuXG4vKiogRGVmYXVsdCBtYXRjaCBtb2RlIHdoZW4gYSByZXF1ZXN0IGRvZXMgbm90IG5hbWUgb25lLiBIeWJyaWQgc3VpdHMgbW9zdCBzZWFyY2ggYm94ZXMuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFOiBTZWFyY2hNb2RlID0gXCJoeWJyaWRcIjtcblxuLyoqIERlZmF1bHQgbnVtYmVyIG9mIGhpdHMgYSBzZWFyY2ggcmV0dXJucyAoYSBnb29kIGF1dG9jb21wbGV0ZSAvIHJlc3VsdHMtbGlzdCBzaXplKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BBR0VfU0laRSA9IDEwO1xuXG4vKiogRGVmYXVsdCBwZXItY2FsbCB0aW1lb3V0IGZvciBhIHNlYXJjaCAvIGluZGV4IG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogQSBjb25maWd1cmVkIGluZGV4IHRoZSBwbHVnaW4ga25vd3MgYWJvdXQgYWhlYWQgb2YgdGltZS4gT25seSBgbmFtZWAgKG9yXG4gKiBgYWxpYXNgKSBpcyByZXF1aXJlZDsgdGhlIHJlc3QgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgbGl2ZSBpbmRleCBkZWZpbml0aW9uXG4gKiB3aGVuIG9taXR0ZWQsIHNvIGEgZGVwbG95bWVudCBjYW4gcmVnaXN0ZXIgYHsgbmFtZSB9YCBhbmQgbGV0IHRoZSBwbHVnaW4gZmlsbFxuICogaW4gdGhlIHByaW1hcnkga2V5IGFuZCBjb2x1bW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEluZGV4Q29uZmlnIHtcbiAgLyoqIFVuaXR5IENhdGFsb2cgbmFtZSBvZiB0aGUgaW5kZXggKGNhdGFsb2cuc2NoZW1hLmluZGV4KS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2hvcnQgYWxpYXMgYSBjYWxsZXIgbWF5IHVzZSBpbiBwbGFjZSBvZiBgbmFtZWAgKGRlZmF1bHRzIHRvIHRoZSBsYXN0IG5hbWUgc2VnbWVudCkuICovXG4gIGFsaWFzPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBSZXNvbHZlZCBmcm9tIHRoZSBpbmRleCBkZWZpbml0aW9uIHdoZW4gb21pdHRlZC4gKi9cbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgLyoqIENvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQsIGluIGRpc3BsYXkgb3JkZXIuIERlZmF1bHRzIHRvIGV2ZXJ5IGluZGV4ZWQgY29sdW1uLiAqL1xuICBjb2x1bW5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbCAtIHRoZVxuICogcGx1Z2luIHdvcmtzIHdpdGggbm90aGluZyBidXQgYW4gaW5kZXggbmFtZSBpbiB0aGUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgZGVmYXVsdCBpbmRleCBzZWFyY2hlZCB3aGVuIGEgcmVxdWVzdCBvbWl0cyBvbmUgKG5hbWUgb3IgYWxpYXMpLiAqL1xuICBpbmRleD86IHN0cmluZztcbiAgLyoqIEluZGV4ZXMgdGhlIHBsdWdpbiBzaG91bGQga25vdyBhYm91dCAoZm9yIGFsaWFzZXMsIHVuaXZlcnNhbCBzZWFyY2gsIGFuZCB0aGUgVUkgY2F0YWxvZ3VlKS4gKi9cbiAgaW5kZXhlcz86IEFycmF5PHN0cmluZyB8IFNlYXJjaEluZGV4Q29uZmlnPjtcbiAgLyoqIFRoZSBWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgaW5kZXhlcyBsaXZlIG9uIChvbmx5IG5lZWRlZCB0byBjcmVhdGUgYW4gaW5kZXgpLiAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIERlZmF1bHQgY29sdW1ucyB0byByZXR1cm4gcGVyIGhpdC4gRmFsbHMgYmFjayB0byBlYWNoIGluZGV4J3Mgb3duIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbiAgLyoqIERlZmF1bHQgbnVtYmVyIG9mIGhpdHMgYSBzZWFyY2ggcmV0dXJucy4gKi9cbiAgcGFnZVNpemU/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IG1hdGNoIG1vZGUuICovXG4gIG1vZGU/OiBTZWFyY2hNb2RlO1xuICAvKiogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50IHVzZWQgd2hlbiB0aGUgcGx1Z2luIENSRUFURVMgYSBEZWx0YSBTeW5jIGluZGV4LiBGdXp6eS1yZXNvbHZlZC4gKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBQZXItY2FsbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogRW5hYmxlIHRoZSB3cml0ZSBzdXJmYWNlIChgYWRkX2RvY3VtZW50c2AgdG9vbCArIGBQT1NUIC9kb2N1bWVudHNgKS4gT2ZmIGJ5IGRlZmF1bHQuICovXG4gIGFsbG93V3JpdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUHJvdmlzaW9uIGEgUkVBTCBpbmRleCBhdCBib290OiBlbnN1cmUgdGhlIGVuZHBvaW50ICsgaW5kZXggZXhpc3QgYW5kIHNlZWRcbiAgICogZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LiBSdW5zIGluIHRoZSBiYWNrZ3JvdW5kIGR1cmluZyBgc2V0dXAoKWBcbiAgICogKGEgc2xvdyBmaXJzdC10aW1lIGVuZHBvaW50L2luZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyKSB1c2luZyB0aGVcbiAgICogYm9vdC10aW1lIFNESyBhdXRoIChlbnYgLyBjb25maWcgcHJvZmlsZSkuIElkZW1wb3RlbnQgLSBzYWZlIGV2ZXJ5IGJvb3QuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGlzIGEgTUFOQUdFRCBkaXJlY3QtYWNjZXNzIGluZGV4IChEYXRhYnJpY2tzIGVtYmVkcyB0aGUgdGV4dFxuICAgKiBjb2x1bW4pLCBzbyBgZG9jdW1lbnRzYCBhcmUgcGxhaW4gcm93cyBhbmQgc2VhcmNoLWJ5LXRleHQgd29ya3Mgd2l0aCBub1xuICAgKiBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlLCBhbmQgbm8gdmVjdG9ycyB0byBjb21wdXRlLiBQb2ludCBpdCBhdCBhXG4gICAqIGBzb3VyY2VUYWJsZWAgdG8gcHJvdmlzaW9uIGEgRGVsdGEgU3luYyBpbmRleCBpbnN0ZWFkLlxuICAgKi9cbiAgZW5zdXJlT25TZXR1cD86IEVuc3VyZU9uU2V0dXBDb25maWc7XG59XG5cbi8qKiBCb290LXRpbWUgcHJvdmlzaW9uaW5nICsgc2VlZGluZyBmb3IgYSBzaW5nbGUgaW5kZXggKHNlZSBgZW5zdXJlT25TZXR1cGApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVPblNldHVwQ29uZmlnIHtcbiAgLyoqIFVDIG5hbWUgb2YgdGhlIGluZGV4IHRvIGVuc3VyZSAoY2F0YWxvZy5zY2hlbWEuaW5kZXgpLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGluZGV4YC4gKi9cbiAgaW5kZXg/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgaXQgb24uIERlZmF1bHRzIHRvIHRoZSBwbHVnaW4ncyBgZW5kcG9pbnRgLiAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIFByaW1hcnkta2V5IGNvbHVtbi4gRGVmYXVsdHMgdG8gYGlkYC4gKi9cbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgLyoqIFRleHQgY29sdW1uIERhdGFicmlja3MgZW1iZWRzIChtYW5hZ2VkIGRpcmVjdC1hY2Nlc3MpLiBEZWZhdWx0cyB0byBgdGV4dGAuICovXG4gIHRleHRDb2x1bW4/OiBzdHJpbmc7XG4gIC8qKiBFbWJlZGRpbmcgbW9kZWwgZW5kcG9pbnQuIEZ1enp5LW1hdGNoZWQ7IGRlZmF1bHRzIHRvIHRoZSBiZXN0IGVtYmVkZGluZyBlbmRwb2ludC4gKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBEZWx0YSBTeW5jIGluZGV4IGluc3RlYWQgb2YgbWFuYWdlZCBkaXJlY3QtYWNjZXNzOiB0aGUgc291cmNlIERlbHRhIHRhYmxlLiAqL1xuICBzb3VyY2VUYWJsZT86IHN0cmluZztcbiAgLyoqIENvbHVtbiAtPiB0eXBlIG1hcCBmb3IgdGhlIG1hbmFnZWQgZGlyZWN0LWFjY2VzcyBgc2NoZW1hX2pzb25gLiBJbmZlcnJlZCBmcm9tIGBkb2N1bWVudHNgIHdoZW4gb21pdHRlZC4gKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LiBQbGFpbiBgeyBpZCwgdGV4dCwgLi4uIH1gIHJvd3MgZm9yIGEgbWFuYWdlZCBpbmRleC4gKi9cbiAgZG9jdW1lbnRzPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqIE1heCB0aW1lIHRvIHdhaXQgZm9yIGVuZHBvaW50ICsgaW5kZXggcmVhZGluZXNzLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKiBBIGZ1bGx5IHJlc29sdmVkIGluZGV4IGVudHJ5ICh0aGUgcGx1Z2luLWtub3duIGZvcm0pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEluZGV4Q29uZmlnIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICBjb2x1bW5zPzogc3RyaW5nW107XG59XG5cbi8qKiBUaGUgY29uY3JldGUgY29uZmlnIHRoZSBydW50aW1lLCBjbGllbnQsIHRvb2xzLCBhbmQgcm91dGVzIHJlYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2VhcmNoQ29uZmlnIHtcbiAgZGVmYXVsdEluZGV4Pzogc3RyaW5nO1xuICBpbmRleGVzOiBSZXNvbHZlZEluZGV4Q29uZmlnW107XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICBjb2x1bW5zPzogc3RyaW5nW107XG4gIHBhZ2VTaXplOiBudW1iZXI7XG4gIG1vZGU6IFNlYXJjaE1vZGU7XG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICB0aW1lb3V0TXM6IG51bWJlcjtcbiAgYWxsb3dXcml0ZTogYm9vbGVhbjtcbiAgZW5zdXJlT25TZXR1cD86IEVuc3VyZU9uU2V0dXBDb25maWc7XG59XG5cbi8qKiBKU09OIFNjaGVtYSB0aGUgcGx1Z2luIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3Ige0BsaW5rIFNlYXJjaFBsdWdpbkNvbmZpZ30uICovXG5leHBvcnQgY29uc3QgU0VBUkNIX0NPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgcHJvcGVydGllczoge1xuICAgIGluZGV4OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBpbmRleCB0byBzZWFyY2ggKGNhdGFsb2cuc2NoZW1hLmluZGV4IG9yIGEgY29uZmlndXJlZCBhbGlhcykuXCIsXG4gICAgfSxcbiAgICBpbmRleGVzOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJJbmRleGVzIHRoZSBwbHVnaW4ga25vd3MgYWJvdXQsIGZvciBhbGlhc2VzLCB1bml2ZXJzYWwgc2VhcmNoLCBhbmQgdGhlIFVJLlwiLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIl0sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICBhbGlhczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIHByaW1hcnlLZXk6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICBjb2x1bW5zOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZW5kcG9pbnQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgaW5kZXhlcyBsaXZlIG9uIChuZWVkZWQgb25seSB0byBjcmVhdGUgb25lKS5cIixcbiAgICB9LFxuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgY29sdW1ucyB0byByZXR1cm4uXCIsXG4gICAgfSxcbiAgICBwYWdlU2l6ZTogeyB0eXBlOiBcIm51bWJlclwiLCBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IG51bWJlciBvZiBoaXRzIHBlciBzZWFyY2guXCIgfSxcbiAgICBtb2RlOiB7IGVudW06IFtcImh5YnJpZFwiLCBcInZlY3RvclwiLCBcImtleXdvcmRcIl0sIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgbWF0Y2ggbW9kZS5cIiB9LFxuICAgIGVtYmVkZGluZ01vZGVsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRW1iZWRkaW5nIGVuZHBvaW50IHVzZWQgd2hlbiBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXggKGZ1enp5LW1hdGNoZWQpLlwiLFxuICAgIH0sXG4gICAgdGltZW91dE1zOiB7IHR5cGU6IFwibnVtYmVyXCIsIGRlc2NyaXB0aW9uOiBcIlBlci1jYWxsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlwiIH0sXG4gICAgYWxsb3dXcml0ZToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFbmFibGUgdGhlIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UgKGFkZF9kb2N1bWVudHMgdG9vbCArIHJvdXRlKS5cIixcbiAgICB9LFxuICAgIGVuc3VyZU9uU2V0dXA6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQcm92aXNpb24gYSByZWFsIGluZGV4IGF0IGJvb3Q6IGVuc3VyZSB0aGUgZW5kcG9pbnQgKyBpbmRleCBleGlzdCBhbmQgc2VlZCBcIiArXG4gICAgICAgIFwiZG9jdW1lbnRzIHdoZW4gZW1wdHkuIFJ1bnMgaW4gdGhlIGJhY2tncm91bmQgZHVyaW5nIHNldHVwIHVzaW5nIGJvb3QtdGltZSBhdXRoLlwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGluZGV4OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZW5kcG9pbnQ6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBwcmltYXJ5S2V5OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgdGV4dENvbHVtbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGVtYmVkZGluZ01vZGVsOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgc291cmNlVGFibGU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBzY2hlbWE6IHsgdHlwZTogXCJvYmplY3RcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgIGRvY3VtZW50czogeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IFwib2JqZWN0XCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlIH0gfSxcbiAgICAgICAgdGltZW91dE1zOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKiBEZXJpdmUgdGhlIGRlZmF1bHQgYWxpYXMgZm9yIGFuIGluZGV4IG5hbWUgKGl0cyBsYXN0IGRvdHRlZCBzZWdtZW50KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QWxpYXMobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBuYW1lLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAwID8gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gOiBuYW1lO1xufVxuXG4vKiogTm9ybWFsaXplIGEgY29uZmlnIGluZGV4IGVudHJ5IChzdHJpbmcgb3Igb2JqZWN0KSBpbnRvIGEge0BsaW5rIFJlc29sdmVkSW5kZXhDb25maWd9LiAqL1xuZnVuY3Rpb24gdG9SZXNvbHZlZEluZGV4KGVudHJ5OiBzdHJpbmcgfCBTZWFyY2hJbmRleENvbmZpZyk6IFJlc29sdmVkSW5kZXhDb25maWcgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8geyBuYW1lOiBlbnRyeSB9IDogZW50cnk7XG4gIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHJhdy5uYW1lKTtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgYWxpYXM6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmF3LmFsaWFzKSA/PyBkZWZhdWx0QWxpYXMobmFtZSksXG4gICAgLi4uKHJhdy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiByYXcucHJpbWFyeUtleSB9IDoge30pLFxuICAgIC4uLihyYXcuY29sdW1ucyAmJiByYXcuY29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zOiBbLi4ucmF3LmNvbHVtbnNdIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSB7QGxpbmsgU2VhcmNoTW9kZX0gZnJvbSBjb25maWcgb3IgYW4gZW52IHZhci4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlKGNvbmZpZ3VyZWQ6IFNlYXJjaE1vZGUgfCB1bmRlZmluZWQpOiBTZWFyY2hNb2RlIHtcbiAgY29uc3QgcmF3ID0gY29uZmlndXJlZCA/PyBjb25maWdVdGlscy50ZXh0KFwiU0VBUkNIX01PREVcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHJldHVybiBERUZBVUxUX01PREU7XG4gIGlmIChyYXcgIT09IFwiaHlicmlkXCIgJiYgcmF3ICE9PSBcInZlY3RvclwiICYmIHJhdyAhPT0gXCJrZXl3b3JkXCIpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgJ21vZGUgbXVzdCBiZSBcImh5YnJpZFwiLCBcInZlY3RvclwiIG9yIFwia2V5d29yZFwiIChlbnY6IFNFQVJDSF9NT0RFKScsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwibW9kZVwiLCBlbnZWYXI6IFwiU0VBUkNIX01PREVcIiB9IH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRTZWFyY2hDb25maWd9LiBUaGUgZGVmYXVsdCBpbmRleCBpcyB1bmlvbmVkIGludG8gdGhlIGtub3duXG4gKiBpbmRleGVzIHNvIGl0IGFsd2F5cyBhcHBlYXJzIGluIHRoZSBjYXRhbG9ndWUsIGFsaWFzZXMgYXJlIGRlLWR1cGxpY2F0ZWQsXG4gKiBhbmQgYSBiYWQgbW9kZSB0aHJvd3MgYSB7QGxpbmsgQ29uZmlndXJhdGlvbkVycm9yfSBuYW1pbmcgdGhlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlYXJjaENvbmZpZyhjb25maWc6IFNlYXJjaFBsdWdpbkNvbmZpZyA9IHt9KTogUmVzb2x2ZWRTZWFyY2hDb25maWcge1xuICBjb25zdCBkZWZhdWx0SW5kZXhSYXcgPSBjb25maWdVdGlscy5zdHJpbmcoXG4gICAgY29uZmlnLmluZGV4LFxuICAgIFtJTkRFWF9FTlYsIERBVEFCUklDS1NfSU5ERVhfRU5WXSxcbiAgICBjb25maWdVdGlscy5FTlZfT05MWSxcbiAgKTtcblxuICBjb25zdCBjb25maWd1cmVkID0gKGNvbmZpZy5pbmRleGVzID8/IFtdKVxuICAgIC5tYXAodG9SZXNvbHZlZEluZGV4KVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVzb2x2ZWRJbmRleENvbmZpZyA9PiBlbnRyeSAhPT0gbnVsbCk7XG5cbiAgLy8gRW5zdXJlIHRoZSBkZWZhdWx0IGluZGV4IGlzIHJlcHJlc2VudGVkIGluIHRoZSBrbm93biBzZXQuXG4gIGlmIChkZWZhdWx0SW5kZXhSYXcgJiYgIWNvbmZpZ3VyZWQuc29tZSgoaSkgPT4gaS5uYW1lID09PSBkZWZhdWx0SW5kZXhSYXcpKSB7XG4gICAgY29uc3QgZW52Q29sdW1ucyA9IGNvbmZpZ1V0aWxzLmxpc3QoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBcIlNFQVJDSF9DT0xVTU5TXCIsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjb25maWdVdGlscy5FTlZfT05MWSxcbiAgICApO1xuICAgIGNvbmZpZ3VyZWQudW5zaGlmdCh7XG4gICAgICBuYW1lOiBkZWZhdWx0SW5kZXhSYXcsXG4gICAgICBhbGlhczogZGVmYXVsdEFsaWFzKGRlZmF1bHRJbmRleFJhdyksXG4gICAgICAuLi4oZW52Q29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zOiBlbnZDb2x1bW5zIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzZWVuQWxpYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBpbmRleGVzID0gY29uZmlndXJlZC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgbGV0IGFsaWFzID0gZW50cnkuYWxpYXM7XG4gICAgd2hpbGUgKHNlZW5BbGlhc2VzLmhhcyhhbGlhcykpIGFsaWFzID0gYCR7YWxpYXN9X2A7XG4gICAgc2VlbkFsaWFzZXMuYWRkKGFsaWFzKTtcbiAgICByZXR1cm4geyAuLi5lbnRyeSwgYWxpYXMgfTtcbiAgfSk7XG5cbiAgY29uc3QgZGVmYXVsdEluZGV4ID0gZGVmYXVsdEluZGV4UmF3ID8/IGluZGV4ZXNbMF0/Lm5hbWU7XG4gIGNvbnN0IGNvbHVtbnMgPSBjb25maWdVdGlscy5saXN0KFxuICAgIGNvbmZpZy5jb2x1bW5zLFxuICAgIFwiU0VBUkNIX0NPTFVNTlNcIixcbiAgICB1bmRlZmluZWQsXG4gICAgY29uZmlnVXRpbHMuRU5WX09OTFksXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJkZWZhdWx0SW5kZXhcIiwgZGVmYXVsdEluZGV4KSxcbiAgICBpbmRleGVzLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcbiAgICAgIFwiZW5kcG9pbnRcIixcbiAgICAgIGNvbmZpZ1V0aWxzLnN0cmluZyhjb25maWcuZW5kcG9pbnQsIEVORFBPSU5UX0VOViwgY29uZmlnVXRpbHMuRU5WX09OTFkpLFxuICAgICksXG4gICAgLi4uKGNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1ucyB9IDoge30pLFxuICAgIHBhZ2VTaXplOiBjb25maWdVdGlscy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIFwiU0VBUkNIX1BBR0VfU0laRVwiLFxuICAgICAgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBjb25maWdVdGlscy5FTlZfT05MWSxcbiAgICApLFxuICAgIG1vZGU6IHJlc29sdmVNb2RlKGNvbmZpZy5tb2RlKSxcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXG4gICAgICBcImVtYmVkZGluZ01vZGVsXCIsXG4gICAgICBjb25maWdVdGlscy5zdHJpbmcoY29uZmlnLmVtYmVkZGluZ01vZGVsLCBcIlNFQVJDSF9FTUJFRERJTkdfTU9ERUxcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpLFxuICAgICksXG4gICAgdGltZW91dE1zOiBjb25maWdVdGlscy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy50aW1lb3V0TXMsXG4gICAgICBcIlNFQVJDSF9USU1FT1VUX01TXCIsXG4gICAgICBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICBjb25maWdVdGlscy5FTlZfT05MWSxcbiAgICApLFxuICAgIGFsbG93V3JpdGU6XG4gICAgICBjb25maWdVdGlscy5ib29sZWFuKGNvbmZpZy5hbGxvd1dyaXRlLCBcIlNFQVJDSF9XUklURVwiLCBjb25maWdVdGlscy5FTlZfT05MWSkgPz8gZmFsc2UsXG4gICAgLi4uKGNvbmZpZy5lbnN1cmVPblNldHVwID8geyBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBjYWxsZXItc3VwcGxpZWQgaW5kZXggcmVmZXJlbmNlIChhIGZ1bGwgVUMgbmFtZSBvciBhIGNvbmZpZ3VyZWRcbiAqIGFsaWFzKSBpbnRvIGEgY29uY3JldGUgaW5kZXggbmFtZS4gRmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBpbmRleCB3aGVuIHRoZVxuICogcmVmZXJlbmNlIGlzIGVtcHR5LiBSZXR1cm5zIGBudWxsYCB3aGVuIG5vdGhpbmcgY2FuIGJlIHJlc29sdmVkIHNvIGNhbGxlcnNcbiAqIHJhaXNlIGEgc3RhYmxlLCB1c2VyLWZhY2luZyBlcnJvciByYXRoZXIgdGhhbiBjYWxsaW5nIGEgcGhhbnRvbSBpbmRleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmRleE5hbWUoXG4gIGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcsXG4gIHJlZmVyZW5jZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHJlZiA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVmZXJlbmNlKTtcbiAgaWYgKHJlZiA9PT0gbnVsbCkgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbiAgY29uc3QgYnlBbGlhcyA9IGNvbmZpZy5pbmRleGVzLmZpbmQoKGkpID0+IGkuYWxpYXMgPT09IHJlZiB8fCBpLm5hbWUgPT09IHJlZik7XG4gIGlmIChieUFsaWFzKSByZXR1cm4gYnlBbGlhcy5uYW1lO1xuICAvLyBBY2NlcHQgYW4gdW5yZWdpc3RlcmVkIGJ1dCBmdWxseS1xdWFsaWZpZWQgVUMgbmFtZSAodGhyZWUgZG90dGVkIHBhcnRzKS5cbiAgaWYgKHJlZi5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA9PT0gMykgcmV0dXJuIHJlZjtcbiAgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbn1cblxuLyoqIFRoZSBrbm93biBjb25maWcgZm9yIGFuIGluZGV4IG5hbWUsIHdoZW4gdGhlIHBsdWdpbiB3YXMgdG9sZCBhYm91dCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleENvbmZpZ0ZvcihcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb25maWcuaW5kZXhlcy5maW5kKChpKSA9PiBpLm5hbWUgPT09IG5hbWUgfHwgaS5hbGlhcyA9PT0gbmFtZSk7XG59XG4iXX0=
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTlELGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO0FBRXhDLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQUVyRSxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDO0FBRTlDLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWUsUUFBUSxDQUFDO0FBRWpELHlGQUF5RjtBQUN6RixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFcEMsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQW9HekMsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFnQjtJQUMvQyxJQUFJLEVBQUUsUUFBUTtJQUNkLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsdUVBQXVFO1NBQ3JGO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLE9BQU87WUFDYixXQUFXLEVBQUUsNEVBQTRFO1lBQ3pGLEtBQUss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QUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFJIFNlYXJjaCBwbHVnaW46IHRoZSB0eXBlZFxuICoge0BsaW5rIFNlYXJjaFBsdWdpbkNvbmZpZ30gKHRoZSBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnKSwgdGhlIEpTT05cbiAqIFNjaGVtYSB0aGUgbWFuaWZlc3QgcHVibGlzaGVzIGZvciBpdCwgYW5kIHtAbGluayByZXNvbHZlU2VhcmNoQ29uZmlnfVxuICogd2hpY2ggbGF5ZXJzIHRoYXQgY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30gdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC5cbiAqXG4gKiBUaGUgZGVzaWduIGdvYWwgaXMgXCJvbmUgaW5kZXgsIHplcm8gY29uZmlnXCI6IG5hbWUgYSBkZWZhdWx0IGluZGV4IChvciBzZXRcbiAqIGBEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhgKSBhbmQgZXZlcnl0aGluZyBlbHNlIC0gdGhlIGNvbHVtbnMgdG9cbiAqIHJldHVybiwgdGhlIHBhZ2Ugc2l6ZSwgdGhlIG1hdGNoIG1vZGUsIGFuZCB0aGUgZW1iZWRkaW5nIG1vZGVsIHVzZWQgd2hlblxuICogY3JlYXRpbmcgYW4gaW5kZXggLSBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0IHRoYXQgY2FuIGJlXG4gKiBvdmVycmlkZGVuIHdoZW4gYSBkZXBsb3ltZW50IG5lZWRzIHRvIGdvIGRlZXBlci5cbiAqXG4gKiBXaGljaCBpbmRleCAvIGVuZHBvaW50IGlzIHVzZWQgZm9sbG93cyB0aGUgc3RhbmRhcmQgcHJlY2VkZW5jZTogZXhwbGljaXRcbiAqIHBsdWdpbiBjb25maWcsIHRoZW4gZW52aXJvbm1lbnQsIHRoZW4gYSBkZWZhdWx0LlxuICpcbiAqIEVudiBmYWxsYmFja3M6IGBEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhgICh0aGUgZGVmYXVsdCBpbmRleCksXG4gKiBgU0VBUkNIX0lOREVYYCwgYFNFQVJDSF9FTkRQT0lOVGAsIGBTRUFSQ0hfQ09MVU1OU2AsXG4gKiBgU0VBUkNIX1BBR0VfU0laRWAsIGBTRUFSQ0hfTU9ERWAsIGBTRUFSQ0hfRU1CRURESU5HX01PREVMYCxcbiAqIGBTRUFSQ0hfVElNRU9VVF9NU2AsIGBTRUFSQ0hfV1JJVEVgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHRleHQsIEVOVl9PTkxZLCBzdHJpbmcsIGxpc3QsIHBvc2l0aXZlSW50LCBib29sZWFuIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgb3B0aW9uYWwsIHRyaW1Ub051bGwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hEb2N1bWVudCwgU2VhcmNoTW9kZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcblxuLyoqIFRoZSBkZWZhdWx0IGluZGV4LCBob25vcmluZyBBcHBLaXQncyBzdGFuZGFyZCBWZWN0b3IgU2VhcmNoIGJpbmRpbmcgbmFtZS4gKi9cbmV4cG9ydCBjb25zdCBJTkRFWF9FTlYgPSBcIlNFQVJDSF9JTkRFWFwiO1xuXG4vKiogQXBwS2l0J3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQgbmFtZSBmb3IgYSBWZWN0b3IgU2VhcmNoIGluZGV4IGJpbmRpbmcuICovXG5leHBvcnQgY29uc3QgREFUQUJSSUNLU19JTkRFWF9FTlYgPSBcIkRBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWFwiO1xuXG4vKiogRGVkaWNhdGVkIG92ZXJyaWRlIGZvciB0aGUgVmVjdG9yIFNlYXJjaCBzZXJ2aW5nIGVuZHBvaW50IHRoYXQgaG9zdHMgaW5kZXhlcy4gKi9cbmV4cG9ydCBjb25zdCBFTkRQT0lOVF9FTlYgPSBcIlNFQVJDSF9FTkRQT0lOVFwiO1xuXG4vKiogRGVmYXVsdCBtYXRjaCBtb2RlIHdoZW4gYSByZXF1ZXN0IGRvZXMgbm90IG5hbWUgb25lLiBIeWJyaWQgc3VpdHMgbW9zdCBzZWFyY2ggYm94ZXMuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFOiBTZWFyY2hNb2RlID0gXCJoeWJyaWRcIjtcblxuLyoqIERlZmF1bHQgbnVtYmVyIG9mIGhpdHMgYSBzZWFyY2ggcmV0dXJucyAoYSBnb29kIGF1dG9jb21wbGV0ZSAvIHJlc3VsdHMtbGlzdCBzaXplKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BBR0VfU0laRSA9IDEwO1xuXG4vKiogRGVmYXVsdCBwZXItY2FsbCB0aW1lb3V0IGZvciBhIHNlYXJjaCAvIGluZGV4IG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogQSBjb25maWd1cmVkIGluZGV4IHRoZSBwbHVnaW4ga25vd3MgYWJvdXQgYWhlYWQgb2YgdGltZS4gT25seSBgbmFtZWAgKG9yXG4gKiBgYWxpYXNgKSBpcyByZXF1aXJlZDsgdGhlIHJlc3QgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgbGl2ZSBpbmRleCBkZWZpbml0aW9uXG4gKiB3aGVuIG9taXR0ZWQsIHNvIGEgZGVwbG95bWVudCBjYW4gcmVnaXN0ZXIgYHsgbmFtZSB9YCBhbmQgbGV0IHRoZSBwbHVnaW4gZmlsbFxuICogaW4gdGhlIHByaW1hcnkga2V5IGFuZCBjb2x1bW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEluZGV4Q29uZmlnIHtcbiAgLyoqIFVuaXR5IENhdGFsb2cgbmFtZSBvZiB0aGUgaW5kZXggKGNhdGFsb2cuc2NoZW1hLmluZGV4KS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2hvcnQgYWxpYXMgYSBjYWxsZXIgbWF5IHVzZSBpbiBwbGFjZSBvZiBgbmFtZWAgKGRlZmF1bHRzIHRvIHRoZSBsYXN0IG5hbWUgc2VnbWVudCkuICovXG4gIGFsaWFzPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBSZXNvbHZlZCBmcm9tIHRoZSBpbmRleCBkZWZpbml0aW9uIHdoZW4gb21pdHRlZC4gKi9cbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgLyoqIENvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQsIGluIGRpc3BsYXkgb3JkZXIuIERlZmF1bHRzIHRvIGV2ZXJ5IGluZGV4ZWQgY29sdW1uLiAqL1xuICBjb2x1bW5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbCAtIHRoZVxuICogcGx1Z2luIHdvcmtzIHdpdGggbm90aGluZyBidXQgYW4gaW5kZXggbmFtZSBpbiB0aGUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgZGVmYXVsdCBpbmRleCBzZWFyY2hlZCB3aGVuIGEgcmVxdWVzdCBvbWl0cyBvbmUgKG5hbWUgb3IgYWxpYXMpLiAqL1xuICBpbmRleD86IHN0cmluZztcbiAgLyoqIEluZGV4ZXMgdGhlIHBsdWdpbiBzaG91bGQga25vdyBhYm91dCAoZm9yIGFsaWFzZXMsIHVuaXZlcnNhbCBzZWFyY2gsIGFuZCB0aGUgVUkgY2F0YWxvZ3VlKS4gKi9cbiAgaW5kZXhlcz86IEFycmF5PHN0cmluZyB8IFNlYXJjaEluZGV4Q29uZmlnPjtcbiAgLyoqIFRoZSBWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgaW5kZXhlcyBsaXZlIG9uIChvbmx5IG5lZWRlZCB0byBjcmVhdGUgYW4gaW5kZXgpLiAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIERlZmF1bHQgY29sdW1ucyB0byByZXR1cm4gcGVyIGhpdC4gRmFsbHMgYmFjayB0byBlYWNoIGluZGV4J3Mgb3duIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbiAgLyoqIERlZmF1bHQgbnVtYmVyIG9mIGhpdHMgYSBzZWFyY2ggcmV0dXJucy4gKi9cbiAgcGFnZVNpemU/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IG1hdGNoIG1vZGUuICovXG4gIG1vZGU/OiBTZWFyY2hNb2RlO1xuICAvKiogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50IHVzZWQgd2hlbiB0aGUgcGx1Z2luIENSRUFURVMgYSBEZWx0YSBTeW5jIGluZGV4LiBGdXp6eS1yZXNvbHZlZC4gKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBQZXItY2FsbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogRW5hYmxlIHRoZSB3cml0ZSBzdXJmYWNlIChgYWRkX2RvY3VtZW50c2AgdG9vbCArIGBQT1NUIC9kb2N1bWVudHNgKS4gT2ZmIGJ5IGRlZmF1bHQuICovXG4gIGFsbG93V3JpdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUHJvdmlzaW9uIGEgUkVBTCBpbmRleCBhdCBib290OiBlbnN1cmUgdGhlIGVuZHBvaW50ICsgaW5kZXggZXhpc3QgYW5kIHNlZWRcbiAgICogZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LiBSdW5zIGluIHRoZSBiYWNrZ3JvdW5kIGR1cmluZyBgc2V0dXAoKWBcbiAgICogKGEgc2xvdyBmaXJzdC10aW1lIGVuZHBvaW50L2luZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyKSB1c2luZyB0aGVcbiAgICogYm9vdC10aW1lIFNESyBhdXRoIChlbnYgLyBjb25maWcgcHJvZmlsZSkuIElkZW1wb3RlbnQgLSBzYWZlIGV2ZXJ5IGJvb3QuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGlzIGEgTUFOQUdFRCBkaXJlY3QtYWNjZXNzIGluZGV4IChEYXRhYnJpY2tzIGVtYmVkcyB0aGUgdGV4dFxuICAgKiBjb2x1bW4pLCBzbyBgZG9jdW1lbnRzYCBhcmUgcGxhaW4gcm93cyBhbmQgc2VhcmNoLWJ5LXRleHQgd29ya3Mgd2l0aCBub1xuICAgKiBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlLCBhbmQgbm8gdmVjdG9ycyB0byBjb21wdXRlLiBQb2ludCBpdCBhdCBhXG4gICAqIGBzb3VyY2VUYWJsZWAgdG8gcHJvdmlzaW9uIGEgRGVsdGEgU3luYyBpbmRleCBpbnN0ZWFkLlxuICAgKi9cbiAgZW5zdXJlT25TZXR1cD86IEVuc3VyZU9uU2V0dXBDb25maWc7XG59XG5cbi8qKiBCb290LXRpbWUgcHJvdmlzaW9uaW5nICsgc2VlZGluZyBmb3IgYSBzaW5nbGUgaW5kZXggKHNlZSBgZW5zdXJlT25TZXR1cGApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVPblNldHVwQ29uZmlnIHtcbiAgLyoqIFVDIG5hbWUgb2YgdGhlIGluZGV4IHRvIGVuc3VyZSAoY2F0YWxvZy5zY2hlbWEuaW5kZXgpLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGluZGV4YC4gKi9cbiAgaW5kZXg/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgaXQgb24uIERlZmF1bHRzIHRvIHRoZSBwbHVnaW4ncyBgZW5kcG9pbnRgLiAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIFByaW1hcnkta2V5IGNvbHVtbi4gRGVmYXVsdHMgdG8gYGlkYC4gKi9cbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgLyoqIFRleHQgY29sdW1uIERhdGFicmlja3MgZW1iZWRzIChtYW5hZ2VkIGRpcmVjdC1hY2Nlc3MpLiBEZWZhdWx0cyB0byBgdGV4dGAuICovXG4gIHRleHRDb2x1bW4/OiBzdHJpbmc7XG4gIC8qKiBFbWJlZGRpbmcgbW9kZWwgZW5kcG9pbnQuIEZ1enp5LW1hdGNoZWQ7IGRlZmF1bHRzIHRvIHRoZSBiZXN0IGVtYmVkZGluZyBlbmRwb2ludC4gKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBEZWx0YSBTeW5jIGluZGV4IGluc3RlYWQgb2YgbWFuYWdlZCBkaXJlY3QtYWNjZXNzOiB0aGUgc291cmNlIERlbHRhIHRhYmxlLiAqL1xuICBzb3VyY2VUYWJsZT86IHN0cmluZztcbiAgLyoqIENvbHVtbiAtPiB0eXBlIG1hcCBmb3IgdGhlIG1hbmFnZWQgZGlyZWN0LWFjY2VzcyBgc2NoZW1hX2pzb25gLiBJbmZlcnJlZCBmcm9tIGBkb2N1bWVudHNgIHdoZW4gb21pdHRlZC4gKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LiBQbGFpbiBgeyBpZCwgdGV4dCwgLi4uIH1gIHJvd3MgZm9yIGEgbWFuYWdlZCBpbmRleC4gKi9cbiAgZG9jdW1lbnRzPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqIE1heCB0aW1lIHRvIHdhaXQgZm9yIGVuZHBvaW50ICsgaW5kZXggcmVhZGluZXNzLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKiBBIGZ1bGx5IHJlc29sdmVkIGluZGV4IGVudHJ5ICh0aGUgcGx1Z2luLWtub3duIGZvcm0pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEluZGV4Q29uZmlnIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICBjb2x1bW5zPzogc3RyaW5nW107XG59XG5cbi8qKiBUaGUgY29uY3JldGUgY29uZmlnIHRoZSBydW50aW1lLCBjbGllbnQsIHRvb2xzLCBhbmQgcm91dGVzIHJlYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2VhcmNoQ29uZmlnIHtcbiAgZGVmYXVsdEluZGV4Pzogc3RyaW5nO1xuICBpbmRleGVzOiBSZXNvbHZlZEluZGV4Q29uZmlnW107XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICBjb2x1bW5zPzogc3RyaW5nW107XG4gIHBhZ2VTaXplOiBudW1iZXI7XG4gIG1vZGU6IFNlYXJjaE1vZGU7XG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICB0aW1lb3V0TXM6IG51bWJlcjtcbiAgYWxsb3dXcml0ZTogYm9vbGVhbjtcbiAgZW5zdXJlT25TZXR1cD86IEVuc3VyZU9uU2V0dXBDb25maWc7XG59XG5cbi8qKiBKU09OIFNjaGVtYSB0aGUgcGx1Z2luIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3Ige0BsaW5rIFNlYXJjaFBsdWdpbkNvbmZpZ30uICovXG5leHBvcnQgY29uc3QgU0VBUkNIX0NPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgcHJvcGVydGllczoge1xuICAgIGluZGV4OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBpbmRleCB0byBzZWFyY2ggKGNhdGFsb2cuc2NoZW1hLmluZGV4IG9yIGEgY29uZmlndXJlZCBhbGlhcykuXCIsXG4gICAgfSxcbiAgICBpbmRleGVzOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJJbmRleGVzIHRoZSBwbHVnaW4ga25vd3MgYWJvdXQsIGZvciBhbGlhc2VzLCB1bml2ZXJzYWwgc2VhcmNoLCBhbmQgdGhlIFVJLlwiLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIl0sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICBhbGlhczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIHByaW1hcnlLZXk6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICBjb2x1bW5zOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZW5kcG9pbnQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgaW5kZXhlcyBsaXZlIG9uIChuZWVkZWQgb25seSB0byBjcmVhdGUgb25lKS5cIixcbiAgICB9LFxuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgY29sdW1ucyB0byByZXR1cm4uXCIsXG4gICAgfSxcbiAgICBwYWdlU2l6ZTogeyB0eXBlOiBcIm51bWJlclwiLCBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IG51bWJlciBvZiBoaXRzIHBlciBzZWFyY2guXCIgfSxcbiAgICBtb2RlOiB7IGVudW06IFtcImh5YnJpZFwiLCBcInZlY3RvclwiLCBcImtleXdvcmRcIl0sIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgbWF0Y2ggbW9kZS5cIiB9LFxuICAgIGVtYmVkZGluZ01vZGVsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRW1iZWRkaW5nIGVuZHBvaW50IHVzZWQgd2hlbiBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXggKGZ1enp5LW1hdGNoZWQpLlwiLFxuICAgIH0sXG4gICAgdGltZW91dE1zOiB7IHR5cGU6IFwibnVtYmVyXCIsIGRlc2NyaXB0aW9uOiBcIlBlci1jYWxsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlwiIH0sXG4gICAgYWxsb3dXcml0ZToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFbmFibGUgdGhlIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UgKGFkZF9kb2N1bWVudHMgdG9vbCArIHJvdXRlKS5cIixcbiAgICB9LFxuICAgIGVuc3VyZU9uU2V0dXA6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQcm92aXNpb24gYSByZWFsIGluZGV4IGF0IGJvb3Q6IGVuc3VyZSB0aGUgZW5kcG9pbnQgKyBpbmRleCBleGlzdCBhbmQgc2VlZCBcIiArXG4gICAgICAgIFwiZG9jdW1lbnRzIHdoZW4gZW1wdHkuIFJ1bnMgaW4gdGhlIGJhY2tncm91bmQgZHVyaW5nIHNldHVwIHVzaW5nIGJvb3QtdGltZSBhdXRoLlwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGluZGV4OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZW5kcG9pbnQ6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBwcmltYXJ5S2V5OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgdGV4dENvbHVtbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGVtYmVkZGluZ01vZGVsOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgc291cmNlVGFibGU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBzY2hlbWE6IHsgdHlwZTogXCJvYmplY3RcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgIGRvY3VtZW50czogeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IFwib2JqZWN0XCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlIH0gfSxcbiAgICAgICAgdGltZW91dE1zOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKiBEZXJpdmUgdGhlIGRlZmF1bHQgYWxpYXMgZm9yIGFuIGluZGV4IG5hbWUgKGl0cyBsYXN0IGRvdHRlZCBzZWdtZW50KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QWxpYXMobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBuYW1lLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAwID8gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gOiBuYW1lO1xufVxuXG4vKiogTm9ybWFsaXplIGEgY29uZmlnIGluZGV4IGVudHJ5IChzdHJpbmcgb3Igb2JqZWN0KSBpbnRvIGEge0BsaW5rIFJlc29sdmVkSW5kZXhDb25maWd9LiAqL1xuZnVuY3Rpb24gdG9SZXNvbHZlZEluZGV4KGVudHJ5OiBzdHJpbmcgfCBTZWFyY2hJbmRleENvbmZpZyk6IFJlc29sdmVkSW5kZXhDb25maWcgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8geyBuYW1lOiBlbnRyeSB9IDogZW50cnk7XG4gIGNvbnN0IG5hbWUgPSB0cmltVG9OdWxsKHJhdy5uYW1lKTtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgYWxpYXM6IHRyaW1Ub051bGwocmF3LmFsaWFzKSA/PyBkZWZhdWx0QWxpYXMobmFtZSksXG4gICAgLi4uKHJhdy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiByYXcucHJpbWFyeUtleSB9IDoge30pLFxuICAgIC4uLihyYXcuY29sdW1ucyAmJiByYXcuY29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zOiBbLi4ucmF3LmNvbHVtbnNdIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSB7QGxpbmsgU2VhcmNoTW9kZX0gZnJvbSBjb25maWcgb3IgYW4gZW52IHZhci4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlKGNvbmZpZ3VyZWQ6IFNlYXJjaE1vZGUgfCB1bmRlZmluZWQpOiBTZWFyY2hNb2RlIHtcbiAgY29uc3QgcmF3ID0gY29uZmlndXJlZCA/PyB0ZXh0KFwiU0VBUkNIX01PREVcIiwgRU5WX09OTFkpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHJldHVybiBERUZBVUxUX01PREU7XG4gIGlmIChyYXcgIT09IFwiaHlicmlkXCIgJiYgcmF3ICE9PSBcInZlY3RvclwiICYmIHJhdyAhPT0gXCJrZXl3b3JkXCIpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgJ21vZGUgbXVzdCBiZSBcImh5YnJpZFwiLCBcInZlY3RvclwiIG9yIFwia2V5d29yZFwiIChlbnY6IFNFQVJDSF9NT0RFKScsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwibW9kZVwiLCBlbnZWYXI6IFwiU0VBUkNIX01PREVcIiB9IH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRTZWFyY2hDb25maWd9LiBUaGUgZGVmYXVsdCBpbmRleCBpcyB1bmlvbmVkIGludG8gdGhlIGtub3duXG4gKiBpbmRleGVzIHNvIGl0IGFsd2F5cyBhcHBlYXJzIGluIHRoZSBjYXRhbG9ndWUsIGFsaWFzZXMgYXJlIGRlLWR1cGxpY2F0ZWQsXG4gKiBhbmQgYSBiYWQgbW9kZSB0aHJvd3MgYSB7QGxpbmsgQ29uZmlndXJhdGlvbkVycm9yfSBuYW1pbmcgdGhlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlYXJjaENvbmZpZyhjb25maWc6IFNlYXJjaFBsdWdpbkNvbmZpZyA9IHt9KTogUmVzb2x2ZWRTZWFyY2hDb25maWcge1xuICBjb25zdCBkZWZhdWx0SW5kZXhSYXcgPSBzdHJpbmcoY29uZmlnLmluZGV4LCBbSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOVl0sIEVOVl9PTkxZKTtcblxuICBjb25zdCBjb25maWd1cmVkID0gKGNvbmZpZy5pbmRleGVzID8/IFtdKVxuICAgIC5tYXAodG9SZXNvbHZlZEluZGV4KVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVzb2x2ZWRJbmRleENvbmZpZyA9PiBlbnRyeSAhPT0gbnVsbCk7XG5cbiAgLy8gRW5zdXJlIHRoZSBkZWZhdWx0IGluZGV4IGlzIHJlcHJlc2VudGVkIGluIHRoZSBrbm93biBzZXQuXG4gIGlmIChkZWZhdWx0SW5kZXhSYXcgJiYgIWNvbmZpZ3VyZWQuc29tZSgoaSkgPT4gaS5uYW1lID09PSBkZWZhdWx0SW5kZXhSYXcpKSB7XG4gICAgY29uc3QgZW52Q29sdW1ucyA9IGxpc3QodW5kZWZpbmVkLCBcIlNFQVJDSF9DT0xVTU5TXCIsIHVuZGVmaW5lZCwgRU5WX09OTFkpO1xuICAgIGNvbmZpZ3VyZWQudW5zaGlmdCh7XG4gICAgICBuYW1lOiBkZWZhdWx0SW5kZXhSYXcsXG4gICAgICBhbGlhczogZGVmYXVsdEFsaWFzKGRlZmF1bHRJbmRleFJhdyksXG4gICAgICAuLi4oZW52Q29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zOiBlbnZDb2x1bW5zIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzZWVuQWxpYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBpbmRleGVzID0gY29uZmlndXJlZC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgbGV0IGFsaWFzID0gZW50cnkuYWxpYXM7XG4gICAgd2hpbGUgKHNlZW5BbGlhc2VzLmhhcyhhbGlhcykpIGFsaWFzID0gYCR7YWxpYXN9X2A7XG4gICAgc2VlbkFsaWFzZXMuYWRkKGFsaWFzKTtcbiAgICByZXR1cm4geyAuLi5lbnRyeSwgYWxpYXMgfTtcbiAgfSk7XG5cbiAgY29uc3QgZGVmYXVsdEluZGV4ID0gZGVmYXVsdEluZGV4UmF3ID8/IGluZGV4ZXNbMF0/Lm5hbWU7XG4gIGNvbnN0IGNvbHVtbnMgPSBsaXN0KGNvbmZpZy5jb2x1bW5zLCBcIlNFQVJDSF9DT0xVTU5TXCIsIHVuZGVmaW5lZCwgRU5WX09OTFkpO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9uYWwoXCJkZWZhdWx0SW5kZXhcIiwgZGVmYXVsdEluZGV4KSxcbiAgICBpbmRleGVzLFxuICAgIC4uLm9wdGlvbmFsKFwiZW5kcG9pbnRcIiwgc3RyaW5nKGNvbmZpZy5lbmRwb2ludCwgRU5EUE9JTlRfRU5WLCBFTlZfT05MWSkpLFxuICAgIC4uLihjb2x1bW5zLmxlbmd0aCA+IDAgPyB7IGNvbHVtbnMgfSA6IHt9KSxcbiAgICBwYWdlU2l6ZTogcG9zaXRpdmVJbnQoY29uZmlnLnBhZ2VTaXplLCBcIlNFQVJDSF9QQUdFX1NJWkVcIiwgREVGQVVMVF9QQUdFX1NJWkUsIEVOVl9PTkxZKSxcbiAgICBtb2RlOiByZXNvbHZlTW9kZShjb25maWcubW9kZSksXG4gICAgLi4ub3B0aW9uYWwoXG4gICAgICBcImVtYmVkZGluZ01vZGVsXCIsXG4gICAgICBzdHJpbmcoY29uZmlnLmVtYmVkZGluZ01vZGVsLCBcIlNFQVJDSF9FTUJFRERJTkdfTU9ERUxcIiwgRU5WX09OTFkpLFxuICAgICksXG4gICAgdGltZW91dE1zOiBwb3NpdGl2ZUludChjb25maWcudGltZW91dE1zLCBcIlNFQVJDSF9USU1FT1VUX01TXCIsIERFRkFVTFRfVElNRU9VVF9NUywgRU5WX09OTFkpLFxuICAgIGFsbG93V3JpdGU6IGJvb2xlYW4oY29uZmlnLmFsbG93V3JpdGUsIFwiU0VBUkNIX1dSSVRFXCIsIEVOVl9PTkxZKSA/PyBmYWxzZSxcbiAgICAuLi4oY29uZmlnLmVuc3VyZU9uU2V0dXAgPyB7IGVuc3VyZU9uU2V0dXA6IGNvbmZpZy5lbnN1cmVPblNldHVwIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNhbGxlci1zdXBwbGllZCBpbmRleCByZWZlcmVuY2UgKGEgZnVsbCBVQyBuYW1lIG9yIGEgY29uZmlndXJlZFxuICogYWxpYXMpIGludG8gYSBjb25jcmV0ZSBpbmRleCBuYW1lLiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGluZGV4IHdoZW4gdGhlXG4gKiByZWZlcmVuY2UgaXMgZW1wdHkuIFJldHVybnMgYG51bGxgIHdoZW4gbm90aGluZyBjYW4gYmUgcmVzb2x2ZWQgc28gY2FsbGVyc1xuICogcmFpc2UgYSBzdGFibGUsIHVzZXItZmFjaW5nIGVycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYSBwaGFudG9tIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluZGV4TmFtZShcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgcmVmZXJlbmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gdHJpbVRvTnVsbChyZWZlcmVuY2UpO1xuICBpZiAocmVmID09PSBudWxsKSByZXR1cm4gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBudWxsO1xuICBjb25zdCBieUFsaWFzID0gY29uZmlnLmluZGV4ZXMuZmluZCgoaSkgPT4gaS5hbGlhcyA9PT0gcmVmIHx8IGkubmFtZSA9PT0gcmVmKTtcbiAgaWYgKGJ5QWxpYXMpIHJldHVybiBieUFsaWFzLm5hbWU7XG4gIC8vIEFjY2VwdCBhbiB1bnJlZ2lzdGVyZWQgYnV0IGZ1bGx5LXF1YWxpZmllZCBVQyBuYW1lICh0aHJlZSBkb3R0ZWQgcGFydHMpLlxuICBpZiAocmVmLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoID09PSAzKSByZXR1cm4gcmVmO1xuICByZXR1cm4gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBudWxsO1xufVxuXG4vKiogVGhlIGtub3duIGNvbmZpZyBmb3IgYW4gaW5kZXggbmFtZSwgd2hlbiB0aGUgcGx1Z2luIHdhcyB0b2xkIGFib3V0IGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4Q29uZmlnRm9yKFxuICBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBSZXNvbHZlZEluZGV4Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbmZpZy5pbmRleGVzLmZpbmQoKGkpID0+IGkubmFtZSA9PT0gbmFtZSB8fCBpLmFsaWFzID09PSBuYW1lKTtcbn1cbiJdfQ==
@@ -4,8 +4,8 @@
4
4
  * @module
5
5
  */
6
6
  import { lakebase, Plugin, toPlugin, ValidationError, } from "@databricks/appkit";
7
- import { pluginRegistry } from "@dbx-tools/appkit";
8
- import { log, object, stringUtils } from "@dbx-tools/shared-core";
7
+ import { require } from "@dbx-tools/appkit";
8
+ import { log, isRecord, trimToNull } from "@dbx-tools/shared-core";
9
9
  import { LakebaseSearchBackend } from "./lakebase.js";
10
10
  const logger = log.logger("search/lakebase-plugin");
11
11
  const CONFIG_SCHEMA = {
@@ -51,8 +51,8 @@ export class LakebaseAiSearchPlugin extends Plugin {
51
51
  for (const index of indexes)
52
52
  this.validateAuth(index);
53
53
  this.context?.onLifecycle("setup:complete", async () => {
54
- const lake = pluginRegistry.require(this.context, lakebase, this);
55
- const schema = stringUtils.trimToNull(this.config.schema) ?? "public";
54
+ const lake = require(this.context, lakebase, this);
55
+ const schema = trimToNull(this.config.schema) ?? "public";
56
56
  this.servicePrincipalBackend = new LakebaseSearchBackend(lake.exports().pool, schema);
57
57
  this.userBackend = new LakebaseSearchBackend({ managedPool: () => lake.exports().pool }, schema);
58
58
  for (const index of indexes) {
@@ -76,9 +76,7 @@ export class LakebaseAiSearchPlugin extends Plugin {
76
76
  try {
77
77
  const alias = routeParam(req.params.alias);
78
78
  const index = this.resolveIndex(alias);
79
- const { columns: _untrustedColumns, ...request } = object.isRecord(req.body)
80
- ? req.body
81
- : {};
79
+ const { columns: _untrustedColumns, ...request } = isRecord(req.body) ? req.body : {};
82
80
  res.json(await this.routeRuntime(index, req).query(alias, request));
83
81
  }
84
82
  catch (error) {
@@ -114,7 +112,7 @@ export class LakebaseAiSearchPlugin extends Plugin {
114
112
  const alias = routeParam(req.params.alias);
115
113
  const index = this.resolveIndex(alias);
116
114
  const documents = Array.isArray(req.body?.documents)
117
- ? req.body.documents.filter(object.isRecord)
115
+ ? req.body.documents.filter(isRecord)
118
116
  : [];
119
117
  res.json(await this.routeRuntime(index, req).addDocuments(alias, documents));
120
118
  },
@@ -156,7 +154,7 @@ export class LakebaseAiSearchPlugin extends Plugin {
156
154
  throw new ValidationError("Lakebase AI Search writes are disabled");
157
155
  }
158
156
  const index = this.resolveIndex(alias);
159
- return this.requireBackend(index).addDocuments(index.indexName, documents.filter(object.isRecord), index.config.textColumn ?? "text");
157
+ return this.requireBackend(index).addDocuments(index.indexName, documents.filter(isRecord), index.config.textColumn ?? "text");
160
158
  }
161
159
  clientConfig() {
162
160
  return {
@@ -182,7 +180,7 @@ export class LakebaseAiSearchPlugin extends Plugin {
182
180
  indexes() {
183
181
  return Object.entries(this.config.indexes ?? {}).map(([alias, config]) => ({
184
182
  alias,
185
- indexName: stringUtils.trimToNull(config.indexName) ?? alias,
183
+ indexName: trimToNull(config.indexName) ?? alias,
186
184
  config,
187
185
  }));
188
186
  }
@@ -215,4 +213,4 @@ export class LakebaseAiSearchPlugin extends Plugin {
215
213
  }
216
214
  /** AppKit-compatible Lakebase AI Search provider. */
217
215
  export const lakebaseAiSearch = toPlugin(LakebaseAiSearchPlugin);
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xha2ViYXNlLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FJaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQXNCcEQsTUFBTSxhQUFhLEdBQWdCO0lBQ2pDLElBQUksRUFBRSxRQUFRO0lBQ2QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3JCLFVBQVUsRUFBRTtRQUNWLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxRQUFRO1lBQ2Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO29CQUM3QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDckQsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDOUIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLEVBQUU7b0JBQzFELFVBQVUsRUFBRSxFQUFF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SUFBNkIsRUFDN0IsT0FBNkI7UUFFN0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNuRixDQUFDO0lBQ0osQ0FBQzs7QUFHSCxxREFBcUQ7QUFDckQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdC1jb21wYXRpYmxlIEFJIFNlYXJjaCBwcm92aWRlciBiYWNrZWQgYnkgTGFrZWJhc2UgZnVsbC10ZXh0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgdG9QbHVnaW4sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgSW5kZXhDb25maWcsIFNlYXJjaFJlcXVlc3QsIFNlYXJjaFJlc3BvbnNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoRG9jdW1lbnQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2xha2ViYXNlLXBsdWdpblwiKTtcblxuLyoqIFBlci1hbGlhcyBMYWtlYmFzZSBzZWFyY2ggY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnIGV4dGVuZHMgT21pdDxcbiAgSW5kZXhDb25maWcsXG4gIFwiZW1iZWRkaW5nRm5cIiB8IFwiZW5kcG9pbnROYW1lXCIgfCBcInBhZ2luYXRpb25cIiB8IFwicmVyYW5rZXJcIlxuPiB7XG4gIC8qKiBEb2N1bWVudHMgdXNlZCB0byBzZWVkIGFuIGVtcHR5IGZ1bGwtdGV4dCB0YWJsZSBkdXJpbmcgc2V0dXAuICovXG4gIGRvY3VtZW50cz86IFNlYXJjaERvY3VtZW50W107XG4gIC8qKiBEb2N1bWVudCBmaWVsZCBpbmRleGVkIGZpcnN0LiBEZWZhdWx0cyB0byBgdGV4dGAuICovXG4gIHRleHRDb2x1bW4/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciB0aGUgTGFrZWJhc2UgaW1wbGVtZW50YXRpb24gb2YgQXBwS2l0IEFJIFNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VBaVNlYXJjaENvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICBpbmRleGVzPzogUmVjb3JkPHN0cmluZywgTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnPjtcbiAgLyoqIFBvc3RncmVTUUwgc2NoZW1hIHRoYXQgb3ducyB0aGUgZ2VuZXJhdGVkIGZ1bGwtdGV4dCB0YWJsZXMuICovXG4gIHNjaGVtYT86IHN0cmluZztcbiAgLyoqIEVuYWJsZSB0aGUgZG9jdW1lbnQgdXBzZXJ0IHJvdXRlIGFuZCBleHBvcnRlZCBtZXRob2QuICovXG4gIGFsbG93V3JpdGU/OiBib29sZWFuO1xufVxuXG5jb25zdCBDT05GSUdfU0NIRU1BOiBKU09OU2NoZW1hNyA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcmVxdWlyZWQ6IFtcImluZGV4ZXNcIl0sXG4gIHByb3BlcnRpZXM6IHtcbiAgICBpbmRleGVzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGluZGV4TmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgY29sdW1uczogeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSB9LFxuICAgICAgICAgIG51bVJlc3VsdHM6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHF1ZXJ5VHlwZTogeyBlbnVtOiBbXCJmdWxsX3RleHRcIl0gfSxcbiAgICAgICAgICBhdXRoOiB7IGVudW06IFtcInNlcnZpY2UtcHJpbmNpcGFsXCIsIFwib24tYmVoYWxmLW9mLXVzZXJcIl0gfSxcbiAgICAgICAgICB0ZXh0Q29sdW1uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBkb2N1bWVudHM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcIm9iamVjdFwiIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgIGFsbG93V3JpdGU6IHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBSZXNvbHZlZExha2ViYXNlSW5kZXgge1xuICBhbGlhczogc3RyaW5nO1xuICBpbmRleE5hbWU6IHN0cmluZztcbiAgY29uZmlnOiBMYWtlYmFzZUFpU2VhcmNoSW5kZXhDb25maWc7XG59XG5cbmZ1bmN0aW9uIHJvdXRlUGFyYW0odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gKHZhbHVlWzBdID8/IFwiXCIpIDogdmFsdWU7XG59XG5cbi8qKiBMYWtlYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmF0aXZlIEFwcEtpdCBgYWlTZWFyY2hgIGNvbnRyYWN0LiAqL1xuZXhwb3J0IGNsYXNzIExha2ViYXNlQWlTZWFyY2hQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TGFrZWJhc2VBaVNlYXJjaENvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJhaVNlYXJjaFwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkxha2ViYXNlIEFJIFNlYXJjaFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFwcEtpdCBBSSBTZWFyY2ggY29udHJhY3QgYmFja2VkIGJ5IFBvc3RncmVTUUwgZnVsbC10ZXh0IHNlYXJjaFwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7IHJlcXVpcmVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sXG4gICAgY29uZmlnOiB7IHNjaGVtYTogQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImFpU2VhcmNoXCI+O1xuXG4gIGRlY2xhcmUgcHJvdGVjdGVkIGNvbmZpZzogTGFrZWJhc2VBaVNlYXJjaENvbmZpZztcbiAgcHJpdmF0ZSBzZXJ2aWNlUHJpbmNpcGFsQmFja2VuZDogTGFrZWJhc2VTZWFyY2hCYWNrZW5kIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZXJCYWNrZW5kOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfCB1bmRlZmluZWQ7XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlcyA9IHRoaXMuaW5kZXhlcygpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykgdGhpcy52YWxpZGF0ZUF1dGgoaW5kZXgpO1xuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBsYWtlID0gcGx1Z2luUmVnaXN0cnkucmVxdWlyZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlLCB0aGlzKTtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodGhpcy5jb25maWcuc2NoZW1hKSA/PyBcInB1YmxpY1wiO1xuICAgICAgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsQmFja2VuZCA9IG5ldyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQobGFrZS5leHBvcnRzKCkucG9vbCwgc2NoZW1hKTtcbiAgICAgIHRoaXMudXNlckJhY2tlbmQgPSBuZXcgTGFrZWJhc2VTZWFyY2hCYWNrZW5kKFxuICAgICAgICB7IG1hbmFnZWRQb29sOiAoKSA9PiBsYWtlLmV4cG9ydHMoKS5wb29sIH0sXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsQmFja2VuZC5wcm92aXNpb24oaW5kZXguaW5kZXhOYW1lLCB7XG4gICAgICAgICAgdGV4dENvbHVtbjogaW5kZXguY29uZmlnLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsXG4gICAgICAgICAgLi4uKGluZGV4LmNvbmZpZy5kb2N1bWVudHMgPyB7IHNlZWQ6IGluZGV4LmNvbmZpZy5kb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgICAgaW5kZXhlczogdGhpcy5pbmRleGVzKCkubWFwKChpbmRleCkgPT4gaW5kZXguYWxpYXMpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJxdWVyeVwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiLzphbGlhcy9xdWVyeVwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbGlhcyA9IHJvdXRlUGFyYW0ocmVxLnBhcmFtcy5hbGlhcyk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc29sdmVJbmRleChhbGlhcyk7XG4gICAgICAgICAgY29uc3QgeyBjb2x1bW5zOiBfdW50cnVzdGVkQ29sdW1ucywgLi4ucmVxdWVzdCB9ID0gb2JqZWN0LmlzUmVjb3JkKHJlcS5ib2R5KVxuICAgICAgICAgICAgPyByZXEuYm9keVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICByZXMuanNvbihhd2FpdCB0aGlzLnJvdXRlUnVudGltZShpbmRleCwgcmVxKS5xdWVyeShhbGlhcywgcmVxdWVzdCBhcyBTZWFyY2hSZXF1ZXN0KSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJTZWFyY2ggZmFpbGVkXCIsXG4gICAgICAgICAgICBwbHVnaW46IHRoaXMubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZXRDb25maWdcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFwiLzphbGlhcy9jb25maWdcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgocm91dGVQYXJhbShyZXEucGFyYW1zLmFsaWFzKSk7XG4gICAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgICBhbGlhczogaW5kZXguYWxpYXMsXG4gICAgICAgICAgY29sdW1uczogaW5kZXguY29uZmlnLmNvbHVtbnMsXG4gICAgICAgICAgcXVlcnlUeXBlOiBcImZ1bGxfdGV4dFwiLFxuICAgICAgICAgIG51bVJlc3VsdHM6IGluZGV4LmNvbmZpZy5udW1SZXN1bHRzID8/IDIwLFxuICAgICAgICAgIHJlcmFua2VyOiBmYWxzZSxcbiAgICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgICBuYW1lOiBcImFkZERvY3VtZW50c1wiLFxuICAgICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgICBwYXRoOiBcIi86YWxpYXMvZG9jdW1lbnRzXCIsXG4gICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWxpYXMgPSByb3V0ZVBhcmFtKHJlcS5wYXJhbXMuYWxpYXMpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50cyA9IEFycmF5LmlzQXJyYXkocmVxLmJvZHk/LmRvY3VtZW50cylcbiAgICAgICAgICAgID8gcmVxLmJvZHkuZG9jdW1lbnRzLmZpbHRlcihvYmplY3QuaXNSZWNvcmQpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICAgIHJlcy5qc29uKGF3YWl0IHRoaXMucm91dGVSdW50aW1lKGluZGV4LCByZXEpLmFkZERvY3VtZW50cyhhbGlhcywgZG9jdW1lbnRzKSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogUXVlcnkgb25lIGNvbmZpZ3VyZWQgTGFrZWJhc2UgZnVsbC10ZXh0IGluZGV4IHVzaW5nIEFwcEtpdCdzIHJlc3BvbnNlIHNoYXBlLiAqL1xuICBhc3luYyBxdWVyeShcbiAgICBhbGlhczogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IFNlYXJjaFJlcXVlc3QsXG4gICk6IFByb21pc2U8U2VhcmNoUmVzcG9uc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gICAgaWYgKCFyZXF1ZXN0LnF1ZXJ5VGV4dCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkxha2ViYXNlIEFJIFNlYXJjaCByZXF1aXJlcyBxdWVyeVRleHRcIik7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0LnF1ZXJ5VmVjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIGRvZXMgbm90IGFjY2VwdCBxdWVyeVZlY3RvclwiKTtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QucXVlcnlUeXBlICYmIHJlcXVlc3QucXVlcnlUeXBlICE9PSBcImZ1bGxfdGV4dFwiKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIHN1cHBvcnRzIG9ubHkgZnVsbF90ZXh0IHF1ZXJpZXNcIik7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWlyZUJhY2tlbmQoaW5kZXgpLnNlYXJjaChpbmRleC5pbmRleE5hbWUsIHJlcXVlc3QucXVlcnlUZXh0LCB7XG4gICAgICBsaW1pdDogcmVxdWVzdC5udW1SZXN1bHRzID8/IGluZGV4LmNvbmZpZy5udW1SZXN1bHRzID8/IDIwLFxuICAgICAgLi4uKHJlcXVlc3QuZmlsdGVycyA/IHsgZmlsdGVyOiByZXF1ZXN0LmZpbHRlcnMgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCBjb2x1bW5zID0gcmVxdWVzdC5jb2x1bW5zID8/IGluZGV4LmNvbmZpZy5jb2x1bW5zO1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiByZXN1bHQuaGl0cy5tYXAoKGhpdCkgPT4gKHtcbiAgICAgICAgc2NvcmU6IGhpdC5zY29yZSxcbiAgICAgICAgZGF0YTogdGhpcy5wcm9qZWN0KHsgaWQ6IGhpdC5pZCwgLi4uaGl0LmZpZWxkcyB9LCBjb2x1bW5zKSxcbiAgICAgIH0pKSxcbiAgICAgIHRvdGFsQ291bnQ6IHJlc3VsdC5jb3VudCxcbiAgICAgIHF1ZXJ5VGltZU1zOiBNYXRoLm1heCgwLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCksXG4gICAgICBxdWVyeVR5cGU6IFwiZnVsbF90ZXh0XCIsXG4gICAgICBuZXh0UGFnZVRva2VuOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gb25lIGNvbmZpZ3VyZWQgTGFrZWJhc2UgZnVsbC10ZXh0IGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoYWxpYXM6IHN0cmluZywgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIHdyaXRlcyBhcmUgZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgIHJldHVybiB0aGlzLnJlcXVpcmVCYWNrZW5kKGluZGV4KS5hZGREb2N1bWVudHMoXG4gICAgICBpbmRleC5pbmRleE5hbWUsXG4gICAgICBkb2N1bWVudHMuZmlsdGVyKG9iamVjdC5pc1JlY29yZCksXG4gICAgICBpbmRleC5jb25maWcudGV4dENvbHVtbiA/PyBcInRleHRcIixcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMoKS5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgICBhbGlhczogaW5kZXguYWxpYXMsXG4gICAgICAgIHF1ZXJ5VHlwZTogXCJmdWxsX3RleHRcIiBhcyBjb25zdCxcbiAgICAgICAgcGFnaW5hdGlvbjogZmFsc2UsXG4gICAgICB9KSksXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3ZpZGVyS2luZDogXCJsYWtlYmFzZVwiIGFzIGNvbnN0LFxuICAgICAgcXVlcnk6IHRoaXMucXVlcnkuYmluZCh0aGlzKSxcbiAgICAgIGFkZERvY3VtZW50czogdGhpcy5hZGREb2N1bWVudHMuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQ/LmNsb3NlKCksIHRoaXMudXNlckJhY2tlbmQ/LmNsb3NlKCldKTtcbiAgICB0aGlzLnNlcnZpY2VQcmluY2lwYWxCYWNrZW5kID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudXNlckJhY2tlbmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGluZGV4ZXMoKTogUmVzb2x2ZWRMYWtlYmFzZUluZGV4W10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmNvbmZpZy5pbmRleGVzID8/IHt9KS5tYXAoKFthbGlhcywgY29uZmlnXSkgPT4gKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5kZXhOYW1lOiBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNvbmZpZy5pbmRleE5hbWUpID8/IGFsaWFzLFxuICAgICAgY29uZmlnLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUluZGV4KGFsaWFzOiBzdHJpbmcpOiBSZXNvbHZlZExha2ViYXNlSW5kZXgge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleGVzKCkuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuYWxpYXMgPT09IGFsaWFzKTtcbiAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBVbmtub3duIEFJIFNlYXJjaCBpbmRleCBhbGlhcyBcIiR7YWxpYXN9XCJgKTtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQXV0aChpbmRleDogUmVzb2x2ZWRMYWtlYmFzZUluZGV4KTogdm9pZCB7XG4gICAgY29uc3QgYXV0aCA9IChpbmRleC5jb25maWcgYXMgeyBhdXRoPzogdW5rbm93biB9KS5hdXRoO1xuICAgIGlmIChhdXRoICE9PSB1bmRlZmluZWQgJiYgYXV0aCAhPT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiICYmIGF1dGggIT09IFwib24tYmVoYWxmLW9mLXVzZXJcIikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVW5rbm93biBBSSBTZWFyY2ggYXV0aCBtb2RlIGZvciBcIiR7aW5kZXguYWxpYXN9XCJgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJvdXRlUnVudGltZShpbmRleDogUmVzb2x2ZWRMYWtlYmFzZUluZGV4LCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHRoaXMge1xuICAgIHJldHVybiBpbmRleC5jb25maWcuYXV0aCA9PT0gXCJvbi1iZWhhbGYtb2YtdXNlclwiID8gdGhpcy5hc1VzZXIocmVxKSA6IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVCYWNrZW5kKGluZGV4OiBSZXNvbHZlZExha2ViYXNlSW5kZXgpOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQge1xuICAgIGNvbnN0IGJhY2tlbmQgPVxuICAgICAgaW5kZXguY29uZmlnLmF1dGggPT09IFwib24tYmVoYWxmLW9mLXVzZXJcIiA/IHRoaXMudXNlckJhY2tlbmQgOiB0aGlzLnNlcnZpY2VQcmluY2lwYWxCYWNrZW5kO1xuICAgIGlmICghYmFja2VuZCkgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkxha2ViYXNlIEFJIFNlYXJjaCBpcyBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuIGJhY2tlbmQ7XG4gIH1cblxuICBwcml2YXRlIHByb2plY3QoXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIWNvbHVtbnM/Lmxlbmd0aCkgcmV0dXJuIGRhdGE7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbiBpbiBkYXRhKS5tYXAoKGNvbHVtbikgPT4gW2NvbHVtbiwgZGF0YVtjb2x1bW5dXSksXG4gICAgKTtcbiAgfVxufVxuXG4vKiogQXBwS2l0LWNvbXBhdGlibGUgTGFrZWJhc2UgQUkgU2VhcmNoIHByb3ZpZGVyLiAqL1xuZXhwb3J0IGNvbnN0IGxha2ViYXNlQWlTZWFyY2ggPSB0b1BsdWdpbihMYWtlYmFzZUFpU2VhcmNoUGx1Z2luKTtcbiJdfQ==
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xha2ViYXNlLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FJaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQXNCcEQsTUFBTSxhQUFhLEdBQWdCO0lBQ2pDLElBQUksRUFBRSxRQUFRO0lBQ2QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3JCLFVBQVUsRUFBRTtRQUNWLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxRQUFRO1lBQ2Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO29CQUM3QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDckQsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDOUIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLEVBQUU7b0JBQzFELFVBQVUsRUFBRSxFQUFF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SSxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDbkYsQ0FBQztJQUNKLENBQUM7O0FBR0gscURBQXFEO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQtY29tcGF0aWJsZSBBSSBTZWFyY2ggcHJvdmlkZXIgYmFja2VkIGJ5IExha2ViYXNlIGZ1bGwtdGV4dCBzZWFyY2guXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEluZGV4Q29uZmlnLCBTZWFyY2hSZXF1ZXN0LCBTZWFyY2hSZXNwb25zZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcmVxdWlyZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nLCBpc1JlY29yZCwgdHJpbVRvTnVsbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaERvY3VtZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuaW1wb3J0IHsgTGFrZWJhc2VTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vbGFrZWJhc2UudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9sYWtlYmFzZS1wbHVnaW5cIik7XG5cbi8qKiBQZXItYWxpYXMgTGFrZWJhc2Ugc2VhcmNoIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQWlTZWFyY2hJbmRleENvbmZpZyBleHRlbmRzIE9taXQ8XG4gIEluZGV4Q29uZmlnLFxuICBcImVtYmVkZGluZ0ZuXCIgfCBcImVuZHBvaW50TmFtZVwiIHwgXCJwYWdpbmF0aW9uXCIgfCBcInJlcmFua2VyXCJcbj4ge1xuICAvKiogRG9jdW1lbnRzIHVzZWQgdG8gc2VlZCBhbiBlbXB0eSBmdWxsLXRleHQgdGFibGUgZHVyaW5nIHNldHVwLiAqL1xuICBkb2N1bWVudHM/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKiogRG9jdW1lbnQgZmllbGQgaW5kZXhlZCBmaXJzdC4gRGVmYXVsdHMgdG8gYHRleHRgLiAqL1xuICB0ZXh0Q29sdW1uPzogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIExha2ViYXNlIGltcGxlbWVudGF0aW9uIG9mIEFwcEtpdCBBSSBTZWFyY2guICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQWlTZWFyY2hDb25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgaW5kZXhlcz86IFJlY29yZDxzdHJpbmcsIExha2ViYXNlQWlTZWFyY2hJbmRleENvbmZpZz47XG4gIC8qKiBQb3N0Z3JlU1FMIHNjaGVtYSB0aGF0IG93bnMgdGhlIGdlbmVyYXRlZCBmdWxsLXRleHQgdGFibGVzLiAqL1xuICBzY2hlbWE/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgdGhlIGRvY3VtZW50IHVwc2VydCByb3V0ZSBhbmQgZXhwb3J0ZWQgbWV0aG9kLiAqL1xuICBhbGxvd1dyaXRlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHJlcXVpcmVkOiBbXCJpbmRleGVzXCJdLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgaW5kZXhlczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpbmRleE5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGNvbHVtbnM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICBudW1SZXN1bHRzOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICBxdWVyeVR5cGU6IHsgZW51bTogW1wiZnVsbF90ZXh0XCJdIH0sXG4gICAgICAgICAgYXV0aDogeyBlbnVtOiBbXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBcIm9uLWJlaGFsZi1vZi11c2VyXCJdIH0sXG4gICAgICAgICAgdGV4dENvbHVtbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgZG9jdW1lbnRzOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJvYmplY3RcIiB9IH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2NoZW1hOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBhbGxvd1dyaXRlOiB7IHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgUmVzb2x2ZWRMYWtlYmFzZUluZGV4IHtcbiAgYWxpYXM6IHN0cmluZztcbiAgaW5kZXhOYW1lOiBzdHJpbmc7XG4gIGNvbmZpZzogTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnO1xufVxuXG5mdW5jdGlvbiByb3V0ZVBhcmFtKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZVswXSA/PyBcIlwiKSA6IHZhbHVlO1xufVxuXG4vKiogTGFrZWJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIG5hdGl2ZSBBcHBLaXQgYGFpU2VhcmNoYCBjb250cmFjdC4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYmFzZUFpU2VhcmNoUGx1Z2luIGV4dGVuZHMgUGx1Z2luPExha2ViYXNlQWlTZWFyY2hDb25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwiYWlTZWFyY2hcIixcbiAgICBkaXNwbGF5TmFtZTogXCJMYWtlYmFzZSBBSSBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBcHBLaXQgQUkgU2VhcmNoIGNvbnRyYWN0IGJhY2tlZCBieSBQb3N0Z3JlU1FMIGZ1bGwtdGV4dCBzZWFyY2hcIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IENPTkZJR19TQ0hFTUEgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJhaVNlYXJjaFwiPjtcblxuICBkZWNsYXJlIHByb3RlY3RlZCBjb25maWc6IExha2ViYXNlQWlTZWFyY2hDb25maWc7XG4gIHByaXZhdGUgc2VydmljZVByaW5jaXBhbEJhY2tlbmQ6IExha2ViYXNlU2VhcmNoQmFja2VuZCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB1c2VyQmFja2VuZDogTGFrZWJhc2VTZWFyY2hCYWNrZW5kIHwgdW5kZWZpbmVkO1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmluZGV4ZXMoKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHRoaXMudmFsaWRhdGVBdXRoKGluZGV4KTtcbiAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbGFrZSA9IHJlcXVpcmUodGhpcy5jb250ZXh0LCBsYWtlYmFzZSwgdGhpcyk7XG4gICAgICBjb25zdCBzY2hlbWEgPSB0cmltVG9OdWxsKHRoaXMuY29uZmlnLnNjaGVtYSkgPz8gXCJwdWJsaWNcIjtcbiAgICAgIHRoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQgPSBuZXcgTGFrZWJhc2VTZWFyY2hCYWNrZW5kKGxha2UuZXhwb3J0cygpLnBvb2wsIHNjaGVtYSk7XG4gICAgICB0aGlzLnVzZXJCYWNrZW5kID0gbmV3IExha2ViYXNlU2VhcmNoQmFja2VuZChcbiAgICAgICAgeyBtYW5hZ2VkUG9vbDogKCkgPT4gbGFrZS5leHBvcnRzKCkucG9vbCB9LFxuICAgICAgICBzY2hlbWEsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQucHJvdmlzaW9uKGluZGV4LmluZGV4TmFtZSwge1xuICAgICAgICAgIHRleHRDb2x1bW46IGluZGV4LmNvbmZpZy50ZXh0Q29sdW1uID8/IFwidGV4dFwiLFxuICAgICAgICAgIC4uLihpbmRleC5jb25maWcuZG9jdW1lbnRzID8geyBzZWVkOiBpbmRleC5jb25maWcuZG9jdW1lbnRzIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcygpLm1hcCgoaW5kZXgpID0+IGluZGV4LmFsaWFzKSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwicXVlcnlcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBcIi86YWxpYXMvcXVlcnlcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWxpYXMgPSByb3V0ZVBhcmFtKHJlcS5wYXJhbXMuYWxpYXMpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgICAgICAgIGNvbnN0IHsgY29sdW1uczogX3VudHJ1c3RlZENvbHVtbnMsIC4uLnJlcXVlc3QgfSA9IGlzUmVjb3JkKHJlcS5ib2R5KSA/IHJlcS5ib2R5IDoge307XG4gICAgICAgICAgcmVzLmpzb24oYXdhaXQgdGhpcy5yb3V0ZVJ1bnRpbWUoaW5kZXgsIHJlcSkucXVlcnkoYWxpYXMsIHJlcXVlc3QgYXMgU2VhcmNoUmVxdWVzdCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiU2VhcmNoIGZhaWxlZFwiLFxuICAgICAgICAgICAgcGx1Z2luOiB0aGlzLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2V0Q29uZmlnXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi86YWxpYXMvY29uZmlnXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzb2x2ZUluZGV4KHJvdXRlUGFyYW0ocmVxLnBhcmFtcy5hbGlhcykpO1xuICAgICAgICByZXMuanNvbih7XG4gICAgICAgICAgYWxpYXM6IGluZGV4LmFsaWFzLFxuICAgICAgICAgIGNvbHVtbnM6IGluZGV4LmNvbmZpZy5jb2x1bW5zLFxuICAgICAgICAgIHF1ZXJ5VHlwZTogXCJmdWxsX3RleHRcIixcbiAgICAgICAgICBudW1SZXN1bHRzOiBpbmRleC5jb25maWcubnVtUmVzdWx0cyA/PyAyMCxcbiAgICAgICAgICByZXJhbmtlcjogZmFsc2UsXG4gICAgICAgICAgcGFnaW5hdGlvbjogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgICAgbmFtZTogXCJhZGREb2N1bWVudHNcIixcbiAgICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgICAgcGF0aDogXCIvOmFsaWFzL2RvY3VtZW50c1wiLFxuICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFsaWFzID0gcm91dGVQYXJhbShyZXEucGFyYW1zLmFsaWFzKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzb2x2ZUluZGV4KGFsaWFzKTtcbiAgICAgICAgICBjb25zdCBkb2N1bWVudHMgPSBBcnJheS5pc0FycmF5KHJlcS5ib2R5Py5kb2N1bWVudHMpXG4gICAgICAgICAgICA/IHJlcS5ib2R5LmRvY3VtZW50cy5maWx0ZXIoaXNSZWNvcmQpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICAgIHJlcy5qc29uKGF3YWl0IHRoaXMucm91dGVSdW50aW1lKGluZGV4LCByZXEpLmFkZERvY3VtZW50cyhhbGlhcywgZG9jdW1lbnRzKSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogUXVlcnkgb25lIGNvbmZpZ3VyZWQgTGFrZWJhc2UgZnVsbC10ZXh0IGluZGV4IHVzaW5nIEFwcEtpdCdzIHJlc3BvbnNlIHNoYXBlLiAqL1xuICBhc3luYyBxdWVyeShcbiAgICBhbGlhczogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IFNlYXJjaFJlcXVlc3QsXG4gICk6IFByb21pc2U8U2VhcmNoUmVzcG9uc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gICAgaWYgKCFyZXF1ZXN0LnF1ZXJ5VGV4dCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkxha2ViYXNlIEFJIFNlYXJjaCByZXF1aXJlcyBxdWVyeVRleHRcIik7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0LnF1ZXJ5VmVjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIGRvZXMgbm90IGFjY2VwdCBxdWVyeVZlY3RvclwiKTtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QucXVlcnlUeXBlICYmIHJlcXVlc3QucXVlcnlUeXBlICE9PSBcImZ1bGxfdGV4dFwiKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIHN1cHBvcnRzIG9ubHkgZnVsbF90ZXh0IHF1ZXJpZXNcIik7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWlyZUJhY2tlbmQoaW5kZXgpLnNlYXJjaChpbmRleC5pbmRleE5hbWUsIHJlcXVlc3QucXVlcnlUZXh0LCB7XG4gICAgICBsaW1pdDogcmVxdWVzdC5udW1SZXN1bHRzID8/IGluZGV4LmNvbmZpZy5udW1SZXN1bHRzID8/IDIwLFxuICAgICAgLi4uKHJlcXVlc3QuZmlsdGVycyA/IHsgZmlsdGVyOiByZXF1ZXN0LmZpbHRlcnMgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCBjb2x1bW5zID0gcmVxdWVzdC5jb2x1bW5zID8/IGluZGV4LmNvbmZpZy5jb2x1bW5zO1xuICAgIHJldHVybiB7XG4gICAgICByZXN1bHRzOiByZXN1bHQuaGl0cy5tYXAoKGhpdCkgPT4gKHtcbiAgICAgICAgc2NvcmU6IGhpdC5zY29yZSxcbiAgICAgICAgZGF0YTogdGhpcy5wcm9qZWN0KHsgaWQ6IGhpdC5pZCwgLi4uaGl0LmZpZWxkcyB9LCBjb2x1bW5zKSxcbiAgICAgIH0pKSxcbiAgICAgIHRvdGFsQ291bnQ6IHJlc3VsdC5jb3VudCxcbiAgICAgIHF1ZXJ5VGltZU1zOiBNYXRoLm1heCgwLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCksXG4gICAgICBxdWVyeVR5cGU6IFwiZnVsbF90ZXh0XCIsXG4gICAgICBuZXh0UGFnZVRva2VuOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gb25lIGNvbmZpZ3VyZWQgTGFrZWJhc2UgZnVsbC10ZXh0IGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoYWxpYXM6IHN0cmluZywgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIHdyaXRlcyBhcmUgZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgIHJldHVybiB0aGlzLnJlcXVpcmVCYWNrZW5kKGluZGV4KS5hZGREb2N1bWVudHMoXG4gICAgICBpbmRleC5pbmRleE5hbWUsXG4gICAgICBkb2N1bWVudHMuZmlsdGVyKGlzUmVjb3JkKSxcbiAgICAgIGluZGV4LmNvbmZpZy50ZXh0Q29sdW1uID8/IFwidGV4dFwiLFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcygpLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgcXVlcnlUeXBlOiBcImZ1bGxfdGV4dFwiIGFzIGNvbnN0LFxuICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXJLaW5kOiBcImxha2ViYXNlXCIgYXMgY29uc3QsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgYWRkRG9jdW1lbnRzOiB0aGlzLmFkZERvY3VtZW50cy5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5zZXJ2aWNlUHJpbmNpcGFsQmFja2VuZD8uY2xvc2UoKSwgdGhpcy51c2VyQmFja2VuZD8uY2xvc2UoKV0pO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy51c2VyQmFja2VuZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5kZXhlcygpOiBSZXNvbHZlZExha2ViYXNlSW5kZXhbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLmluZGV4ZXMgPz8ge30pLm1hcCgoW2FsaWFzLCBjb25maWddKSA9PiAoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbmRleE5hbWU6IHRyaW1Ub051bGwoY29uZmlnLmluZGV4TmFtZSkgPz8gYWxpYXMsXG4gICAgICBjb25maWcsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlSW5kZXgoYWxpYXM6IHN0cmluZyk6IFJlc29sdmVkTGFrZWJhc2VJbmRleCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4ZXMoKS5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5hbGlhcyA9PT0gYWxpYXMpO1xuICAgIGlmICghaW5kZXgpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFVua25vd24gQUkgU2VhcmNoIGluZGV4IGFsaWFzIFwiJHthbGlhc31cImApO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBdXRoKGluZGV4OiBSZXNvbHZlZExha2ViYXNlSW5kZXgpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRoID0gKGluZGV4LmNvbmZpZyBhcyB7IGF1dGg/OiB1bmtub3duIH0pLmF1dGg7XG4gICAgaWYgKGF1dGggIT09IHVuZGVmaW5lZCAmJiBhdXRoICE9PSBcInNlcnZpY2UtcHJpbmNpcGFsXCIgJiYgYXV0aCAhPT0gXCJvbi1iZWhhbGYtb2YtdXNlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBVbmtub3duIEFJIFNlYXJjaCBhdXRoIG1vZGUgZm9yIFwiJHtpbmRleC5hbGlhc31cImApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcm91dGVSdW50aW1lKGluZGV4OiBSZXNvbHZlZExha2ViYXNlSW5kZXgsIHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIGluZGV4LmNvbmZpZy5hdXRoID09PSBcIm9uLWJlaGFsZi1vZi11c2VyXCIgPyB0aGlzLmFzVXNlcihyZXEpIDogdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZUJhY2tlbmQoaW5kZXg6IFJlc29sdmVkTGFrZWJhc2VJbmRleCk6IExha2ViYXNlU2VhcmNoQmFja2VuZCB7XG4gICAgY29uc3QgYmFja2VuZCA9XG4gICAgICBpbmRleC5jb25maWcuYXV0aCA9PT0gXCJvbi1iZWhhbGYtb2YtdXNlclwiID8gdGhpcy51c2VyQmFja2VuZCA6IHRoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQ7XG4gICAgaWYgKCFiYWNrZW5kKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIGlzIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gYmFja2VuZDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvamVjdChcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghY29sdW1ucz8ubGVuZ3RoKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uIGluIGRhdGEpLm1hcCgoY29sdW1uKSA9PiBbY29sdW1uLCBkYXRhW2NvbHVtbl1dKSxcbiAgICApO1xuICB9XG59XG5cbi8qKiBBcHBLaXQtY29tcGF0aWJsZSBMYWtlYmFzZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG5leHBvcnQgY29uc3QgbGFrZWJhc2VBaVNlYXJjaCA9IHRvUGx1Z2luKExha2ViYXNlQWlTZWFyY2hQbHVnaW4pO1xuIl19