expand-my-type 0.6.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -137,6 +137,15 @@ the following ways:
137
137
  /* { a: string; b: number } */
138
138
  ```
139
139
 
140
+ For local development in this repository, use Bun:
141
+
142
+ ```sh
143
+ bun install
144
+ bun run check
145
+ bun run build
146
+ bun run deps:update
147
+ ```
148
+
140
149
  ## How It Works
141
150
 
142
151
  Expand My Type uses the following utility types to expand the type expression:
@@ -0,0 +1,16 @@
1
+ import ts from "typescript";
2
+ type ExtractFunctions<T, K extends keyof T = keyof T> = {
3
+ [P in K]: T[P] extends (...args: any[]) => any ? T[P] : never;
4
+ };
5
+ export type CompilerHostFunctionOverrides = Partial<ExtractFunctions<ts.CompilerHost>>;
6
+ /**
7
+ * Creates a custom compiler host that augments the specified source file for expanding a type expression.
8
+ *
9
+ * @param sourceFileName Name of the source file to augment.
10
+ * @param codeToAdd Type expression.
11
+ * @param compilerOptions TypeScript compiler options.
12
+ * @param compilerHostFunctionOverrides A record of functions to override in the compiler host. Useful for mocking.
13
+ * @returns A custom compiler host that returns an augmented source file that can be used to expand the type expression.
14
+ */
15
+ export declare const createAugmenterCompilerHost: (sourceFileName: string, codeToAdd: string, compilerOptions?: ts.CompilerOptions, compilerHostFunctionOverrides?: CompilerHostFunctionOverrides) => ts.CompilerHost;
16
+ export {};
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js CHANGED
@@ -2,18 +2,22 @@
2
2
 
3
3
  // src/augmenter-compiler-host.ts
4
4
  import ts from "typescript";
5
- var createAugmenterCompilerHost = (sourceFileName2, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
5
+ var createAugmenterCompilerHost = (sourceFileName, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
6
6
  const customCompilerHost = ts.createCompilerHost(compilerOptions ?? {}, true);
7
- for (const key of Object.keys(compilerHostFunctionOverrides ?? {})) {
8
- customCompilerHost[key] = compilerHostFunctionOverrides[key];
7
+ const overrides = compilerHostFunctionOverrides ?? {};
8
+ for (const key of Object.keys(overrides)) {
9
+ const override = overrides[key];
10
+ if (override) {
11
+ customCompilerHost[key] = override;
12
+ }
9
13
  }
10
14
  const originalReadFile = customCompilerHost.readFile;
11
15
  customCompilerHost.readFile = (fileName) => {
12
16
  const contents = originalReadFile(fileName);
13
- if (contents === void 0) {
17
+ if (contents === undefined) {
14
18
  return contents;
15
19
  }
16
- if (fileName !== sourceFileName2) {
20
+ if (fileName !== sourceFileName) {
17
21
  return contents;
18
22
  }
19
23
  return `${codeToAdd}
@@ -25,9 +29,9 @@ ${contents}`;
25
29
  // src/code-generator.ts
26
30
  import { format } from "prettier";
27
31
  var identifierPrefix = "__EXPAND_MY_TYPE__";
28
- var createExpandCodeBlock = (typeExpression2) => {
32
+ var createExpandCodeBlock = (typeExpression) => {
29
33
  return `type ${identifierPrefix}Result = ${identifierPrefix}Expand<${identifierPrefix}Expression>;
30
- type ${identifierPrefix}Expression = ${typeExpression2};
34
+ type ${identifierPrefix}Expression = ${typeExpression};
31
35
 
32
36
  type ${identifierPrefix}Expand<T> =
33
37
  T extends (...args: infer A) => infer R ? (...args: ${identifierPrefix}Expand<A>) => ${identifierPrefix}Expand<R>
@@ -42,13 +46,10 @@ var createExpandCodeBlock = (typeExpression2) => {
42
46
  type ${identifierPrefix}RemoveUnderscore<T extends string> = T extends \`\${infer U}_\` ? U : never;`;
43
47
  };
44
48
  var formatTypeExpression = async (code, prettierOptions) => {
45
- return (await format(
46
- `type ${identifierPrefix} = ${code}`,
47
- prettierOptions ?? {
48
- parser: "typescript",
49
- semi: false
50
- }
51
- )).trim().substring(`type ${identifierPrefix} = `.length);
49
+ return (await format(`type ${identifierPrefix} = ${code}`, prettierOptions ?? {
50
+ parser: "typescript",
51
+ semi: false
52
+ })).trim().substring(`type ${identifierPrefix} = `.length);
52
53
  };
53
54
 
54
55
  // src/index.ts
@@ -57,7 +58,7 @@ import ts2 from "typescript";
57
58
  var findResultIdentifierNode = (node) => {
58
59
  if (node.getChildCount() == 0) {
59
60
  if (!ts2.isIdentifier(node)) {
60
- return void 0;
61
+ return;
61
62
  }
62
63
  return node;
63
64
  }
@@ -96,17 +97,8 @@ async function expandMyType(options) {
96
97
  if (!tsCompilerOptions.strictNullChecks) {
97
98
  throw new Error("strictNullChecks must be enabled!");
98
99
  }
99
- const compilerHost = createAugmenterCompilerHost(
100
- resolvedSourceFileName,
101
- createExpandCodeBlock(options.typeExpression),
102
- tsCompilerOptions,
103
- options.compilerHostFunctionOverrides
104
- );
105
- const program = ts2.createProgram(
106
- [resolvedSourceFileName],
107
- tsCompilerOptions,
108
- compilerHost
109
- );
100
+ const compilerHost = createAugmenterCompilerHost(resolvedSourceFileName, createExpandCodeBlock(options.typeExpression), tsCompilerOptions, options.compilerHostFunctionOverrides);
101
+ const program = ts2.createProgram([resolvedSourceFileName], tsCompilerOptions, compilerHost);
110
102
  const sourceFile = program.getSourceFile(resolvedSourceFileName);
111
103
  if (!sourceFile) {
112
104
  throw new Error("Source file not found!");
@@ -116,11 +108,7 @@ async function expandMyType(options) {
116
108
  throw new Error("No node found!");
117
109
  }
118
110
  const typeChecker = program.getTypeChecker();
119
- const expandedTypeString = typeChecker.typeToString(
120
- typeChecker.getTypeAtLocation(resultIdentifierNode),
121
- void 0,
122
- ts2.TypeFormatFlags.NodeBuilderFlagsMask
123
- );
111
+ const expandedTypeString = typeChecker.typeToString(typeChecker.getTypeAtLocation(resultIdentifierNode), undefined, ts2.TypeFormatFlags.NodeBuilderFlagsMask);
124
112
  if (options.prettify && options.prettify.enabled === false) {
125
113
  return expandedTypeString;
126
114
  }
@@ -131,37 +119,37 @@ async function expandMyType(options) {
131
119
  import { parseArgs } from "node:util";
132
120
  import ts3 from "typescript";
133
121
  var tryParse = (options) => {
134
- let result2;
122
+ let result;
135
123
  try {
136
- result2 = parseArgs({
124
+ result = parseArgs({
137
125
  options,
138
126
  tokens: true,
139
127
  allowPositionals: true
140
128
  });
141
- } catch (error2) {
129
+ } catch (error) {
142
130
  return {
143
- error: error2,
131
+ error: error instanceof Error ? error : new Error(String(error)),
144
132
  values: {},
145
133
  positionals: []
146
134
  };
147
135
  }
148
- const { tokens, values: values2, positionals: positionals2 } = result2;
136
+ const { tokens, values, positionals } = result;
149
137
  for (const token of tokens ?? []) {
150
138
  if (token.kind === "option-terminator" || token.kind === "positional") {
151
139
  continue;
152
140
  }
153
141
  if (token.name.startsWith("no-")) {
154
142
  const positiveName = token.name.slice("no-".length);
155
- values2[positiveName] = false;
156
- delete values2[token.name];
143
+ values[positiveName] = false;
144
+ delete values[token.name];
157
145
  } else {
158
- values2[token.name] = token.value ?? true;
146
+ values[token.name] = token.value ?? true;
159
147
  }
160
148
  }
161
149
  return {
162
- error: void 0,
163
- values: values2,
164
- positionals: positionals2
150
+ error: undefined,
151
+ values,
152
+ positionals
165
153
  };
166
154
  };
167
155
  var { error, values, positionals } = tryParse({
@@ -192,11 +180,12 @@ var usagePrompt = [
192
180
  " expand-my-type [options] <source-file> <expression>",
193
181
  "",
194
182
  "Options:",
195
- " -h, --help Show this help message",
196
- " -p, --prettify Prettify the output (default)",
197
- " -P, --no-prettify Do not prettify the output",
198
- " -c, --tsconfig <file> Use the specified tsconfig.json file"
199
- ].join("\n");
183
+ " -h, --help\t\t\tShow this help message",
184
+ " -p, --prettify\t\tPrettify the output (default)",
185
+ " -P, --no-prettify\t\tDo not prettify the output",
186
+ " -c, --tsconfig <file>\t\tUse the specified tsconfig.json file"
187
+ ].join(`
188
+ `);
200
189
  if (positionals.length !== 2) {
201
190
  console.error(usagePrompt);
202
191
  process.exit(1);
@@ -210,11 +199,7 @@ var { prettify, tsconfig: tsConfigFileName } = values;
210
199
  var tsParsedCommandLine;
211
200
  if (tsConfigFileName) {
212
201
  const configFile = ts3.readConfigFile(tsConfigFileName, ts3.sys.readFile);
213
- const compilerOptions = ts3.parseJsonConfigFileContent(
214
- configFile.config,
215
- ts3.sys,
216
- "./"
217
- );
202
+ const compilerOptions = ts3.parseJsonConfigFileContent(configFile.config, ts3.sys, "./");
218
203
  tsParsedCommandLine = compilerOptions;
219
204
  }
220
205
  var result = await expandMyType({
@@ -226,4 +211,6 @@ var result = await expandMyType({
226
211
  tsCompilerOptions: tsParsedCommandLine?.options
227
212
  });
228
213
  console.log(result);
229
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgIi4uL3NyYy9jb2RlLWdlbmVyYXRvci50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0ge1xuICBbUCBpbiBLXTogVFtQXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtQXSA6IG5ldmVyO1xufTtcbmV4cG9ydCB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID0gUGFydGlhbDxcbiAgRXh0cmFjdEZ1bmN0aW9uczx0cy5Db21waWxlckhvc3Q+XG4+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IGF1Z21lbnRzIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUgZm9yIGV4cGFuZGluZyBhIHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gYXVnbWVudC5cbiAqIEBwYXJhbSBjb2RlVG9BZGQgVHlwZSBleHByZXNzaW9uLlxuICogQHBhcmFtIGNvbXBpbGVyT3B0aW9ucyBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gKiBAcGFyYW0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgQSByZWNvcmQgb2YgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGluIHRoZSBjb21waWxlciBob3N0LiBVc2VmdWwgZm9yIG1vY2tpbmcuXG4gKiBAcmV0dXJucyBBIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgcmV0dXJucyBhbiBhdWdtZW50ZWQgc291cmNlIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBleHBhbmQgdGhlIHR5cGUgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCA9IChcbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZyxcbiAgY29kZVRvQWRkOiBzdHJpbmcsXG4gIGNvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucyxcbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbikgPT4ge1xuICBjb25zdCBjdXN0b21Db21waWxlckhvc3QgPSB0cy5jcmVhdGVDb21waWxlckhvc3QoY29tcGlsZXJPcHRpb25zID8/IHt9LCB0cnVlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPz8ge30pKSB7XG4gICAgY3VzdG9tQ29tcGlsZXJIb3N0W2tleV0gPSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyFba2V5XTtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsUmVhZEZpbGUgPSBjdXN0b21Db21waWxlckhvc3QucmVhZEZpbGU7XG5cbiAgY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKSA9PiB7XG4gICAgY29uc3QgY29udGVudHMgPSBvcmlnaW5hbFJlYWRGaWxlKGZpbGVOYW1lKTtcblxuICAgIGlmIChjb250ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29udGVudHM7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVOYW1lICE9PSBzb3VyY2VGaWxlTmFtZSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtjb2RlVG9BZGR9XFxuJHtjb250ZW50c31gO1xuICB9O1xuXG4gIHJldHVybiBjdXN0b21Db21waWxlckhvc3Q7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBQcmV0dGllck9wdGlvbnMgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJwcmV0dGllclwiO1xuXG5jb25zdCBpZGVudGlmaWVyUHJlZml4ID0gXCJfX0VYUEFORF9NWV9UWVBFX19cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGFuZENvZGVCbG9jayA9ICh0eXBlRXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21haW4vdGVzdHMvY2FzZXMvY29tcGlsZXIvY29tcHV0ZWRUeXBlc0tleW9mTm9JbmRleFNpZ25hdHVyZVR5cGUudHNcbiAgcmV0dXJuIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZXN1bHQgPSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPCR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uPjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uID0gJHt0eXBlRXhwcmVzc2lvbn07XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VD4gPSBcbiAgICAgICAgVCBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8QT4pID0+ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8Uj5cbiAgICAgIDogVCBleHRlbmRzIFByb21pc2U8aW5mZXIgVT4gPyBQcm9taXNlPCR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VT4+XG4gICAgICA6IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBzdHJpbmcgPyAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFRbS10+IDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUW0tdPjsgfSAmIHt9O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFQ+ID0gW1QgJiB7fV0gZXh0ZW5kcyBbbmV2ZXJdID8gVCA6IFQgJiB7fSBleHRlbmRzIHZvaWQgPyBUIDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUICYge30+O1xuXG4gICAgLy8gRm9yY2VzIGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWwgdHlwZXMgdG8gYmUgZXhwYW5kZWRcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VCBleHRlbmRzIHN0cmluZz4gPSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTwke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUPj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFxcYFxcJHtUfV9cXGAgZXh0ZW5kcyBzdHJpbmcgPyBcXGBcXCR7VH1fXFxgIDogbmV2ZXI7XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFQgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgVX1fXFxgID8gVSA6IG5ldmVyO2A7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VHlwZUV4cHJlc3Npb24gPSBhc3luYyAoXG4gIGNvZGU6IHN0cmluZyxcbiAgcHJldHRpZXJPcHRpb25zPzogUHJldHRpZXJPcHRpb25zLFxuKSA9PiB7XG4gIHJldHVybiAoXG4gICAgYXdhaXQgZm9ybWF0KFxuICAgICAgYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fSA9ICR7Y29kZX1gLFxuICAgICAgcHJldHRpZXJPcHRpb25zID8/IHtcbiAgICAgICAgcGFyc2VyOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgc2VtaTogZmFsc2UsXG4gICAgICB9LFxuICAgIClcbiAgKVxuICAgIC50cmltKClcbiAgICAuc3Vic3RyaW5nKGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSBgLmxlbmd0aCk7XG59O1xuIiwgImltcG9ydCB7IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIH0gZnJvbSBcIi4vYXVnbWVudGVyLWNvbXBpbGVyLWhvc3QudHNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUV4cGFuZENvZGVCbG9jayxcbiAgZm9ybWF0VHlwZUV4cHJlc3Npb24sXG59IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdHlwZSB0eXBlIHNob3VsZCBiZSBzZWFyY2hlZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKi9cbmNvbnN0IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSA9IChub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZXIgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUHJldHRpZXIgb3B0aW9ucy4gRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgcGFyc2VyIHRvIFwidHlwZXNjcmlwdFwiLlxuICAgICAqIEBkZWZhdWx0IHsgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiwgc2VtaTogZmFsc2UgfVxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcmV0dGllck9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nXG4gICAqL1xuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBzb3VyY2UgdGV4dCB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlVGV4dDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZE15VHlwZU9wdGlvbnMgPVxuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnNcbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBFeHBhbmRzIGEgVHlwZVNjcmlwdCB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBleHBhbmRlZCB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUob3B0aW9uczogRXhwYW5kTXlUeXBlT3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlRXhwcmVzc2lvbi50cmltKCkgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gXCJuZXZlclwiO1xuICB9XG5cbiAgaWYgKFwic291cmNlVGV4dFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkdW1teUZpbGVOYW1lID0gXCJleHBhbmQtbXktdHlwZS1kdW1teS50c1wiO1xuXG4gICAgcmV0dXJuIGV4cGFuZE15VHlwZSh7XG4gICAgICBzb3VyY2VGaWxlTmFtZTogZHVtbXlGaWxlTmFtZSxcbiAgICAgIHR5cGVFeHByZXNzaW9uOiBvcHRpb25zLnR5cGVFeHByZXNzaW9uLFxuICAgICAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM6IHtcbiAgICAgICAgcmVhZEZpbGUoZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICAgIGlmIChwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSA9PT0gZHVtbXlGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlVGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHMuc3lzLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0c0NvbXBpbGVyT3B0aW9uczogb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyxcbiAgICAgIHByZXR0aWZ5OiBvcHRpb25zLnByZXR0aWZ5LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnNvdXJjZUZpbGVOYW1lKTtcblxuICBjb25zdCB0c0NvbXBpbGVyT3B0aW9ucyA9IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMgPz8ge1xuICAgIG5vRW1pdDogdHJ1ZSxcblxuICAgIHN0cmljdE51bGxDaGVja3M6IHRydWUsXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICBhbGxvd0FyYml0cmFyeUV4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgfTtcblxuICBpZiAoIXRzQ29tcGlsZXJPcHRpb25zLnN0cmljdE51bGxDaGVja3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpY3ROdWxsQ2hlY2tzIG11c3QgYmUgZW5hYmxlZCFcIik7XG4gIH1cblxuICBjb25zdCBjb21waWxlckhvc3QgPSBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QoXG4gICAgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSxcbiAgICBjcmVhdGVFeHBhbmRDb2RlQmxvY2sob3B0aW9ucy50eXBlRXhwcmVzc2lvbiksXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgb3B0aW9ucy5jb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbiAgKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbShcbiAgICBbcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZV0sXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgY29tcGlsZXJIb3N0LFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSk7XG4gIGlmICghc291cmNlRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlNvdXJjZSBmaWxlIG5vdCBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCByZXN1bHRJZGVudGlmaWVyTm9kZSA9IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZShzb3VyY2VGaWxlKTtcbiAgaWYgKCFyZXN1bHRJZGVudGlmaWVyTm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG5vZGUgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZUNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGV4cGFuZGVkVHlwZVN0cmluZyA9IHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhcbiAgICB0eXBlQ2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihyZXN1bHRJZGVudGlmaWVyTm9kZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHRzLlR5cGVGb3JtYXRGbGFncy5Ob2RlQnVpbGRlckZsYWdzTWFzayxcbiAgKTtcblxuICBpZiAob3B0aW9ucy5wcmV0dGlmeSAmJiBvcHRpb25zLnByZXR0aWZ5LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGVkVHlwZVN0cmluZztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRUeXBlRXhwcmVzc2lvbihleHBhbmRlZFR5cGVTdHJpbmcsIG9wdGlvbnMucHJldHRpZnk/Lm9wdGlvbnMpO1xufVxuIiwgIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IGV4cGFuZE15VHlwZSB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUFyZ3MsIHR5cGUgUGFyc2VBcmdzQ29uZmlnIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgVmFsdWVzID0ge1xuICBoZWxwPzogYm9vbGVhbjtcbiAgcHJldHRpZnk6IGJvb2xlYW47XG4gIHRzY29uZmlnPzogc3RyaW5nO1xufTtcblxuY29uc3QgdHJ5UGFyc2UgPSA8XG4gIFZhbHVlcyBleHRlbmRzIFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nIHwgYm9vbGVhbiB8IEFycmF5PHN0cmluZyB8IGJvb2xlYW4+IHwgdW5kZWZpbmVkXG4gID4sXG4gIE9wdGlvbnMgZXh0ZW5kcyBQYXJzZUFyZ3NDb25maWdbXCJvcHRpb25zXCJdID0gUGFyc2VBcmdzQ29uZmlnW1wib3B0aW9uc1wiXSxcbj4oXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4pOiB7IGVycm9yPzogRXJyb3I7IHZhbHVlczogVmFsdWVzOyBwb3NpdGlvbmFsczogc3RyaW5nW10gfSA9PiB7XG4gIGxldCByZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlQXJncz47XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gcGFyc2VBcmdzKHtcbiAgICAgIG9wdGlvbnMsXG4gICAgICB0b2tlbnM6IHRydWUsXG4gICAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcixcbiAgICAgIHZhbHVlczoge30gYXMgVmFsdWVzLFxuICAgICAgcG9zaXRpb25hbHM6IFtdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHRva2VucywgdmFsdWVzLCBwb3NpdGlvbmFscyB9ID0gcmVzdWx0O1xuXG4gIC8vIFJlcHJvY2VzcyB0aGUgb3B0aW9uIHRva2VucyBhbmQgb3ZlcndyaXRlIHRoZSByZXR1cm5lZCB2YWx1ZXMuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zID8/IFtdKSB7XG4gICAgaWYgKHRva2VuLmtpbmQgPT09IFwib3B0aW9uLXRlcm1pbmF0b3JcIiB8fCB0b2tlbi5raW5kID09PSBcInBvc2l0aW9uYWxcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLm5hbWUuc3RhcnRzV2l0aChcIm5vLVwiKSkge1xuICAgICAgLy8gU3RvcmUgZm9vOmZhbHNlIGZvciAtLW5vLWZvb1xuICAgICAgY29uc3QgcG9zaXRpdmVOYW1lID0gdG9rZW4ubmFtZS5zbGljZShcIm5vLVwiLmxlbmd0aCk7XG4gICAgICB2YWx1ZXNbcG9zaXRpdmVOYW1lXSA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHZhbHVlc1t0b2tlbi5uYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzYXZlIHZhbHVlIHNvIGxhc3Qgb25lIHdpbnMgaWYgYm90aCAtLWZvbyBhbmQgLS1uby1mb28uXG4gICAgICB2YWx1ZXNbdG9rZW4ubmFtZV0gPSB0b2tlbi52YWx1ZSA/PyB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZXM6IHZhbHVlcyBhcyBWYWx1ZXMsXG4gICAgcG9zaXRpb25hbHMsXG4gIH07XG59O1xuXG5jb25zdCB7IGVycm9yLCB2YWx1ZXMsIHBvc2l0aW9uYWxzIH0gPSB0cnlQYXJzZTxWYWx1ZXM+KHtcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgfSxcbiAgcHJldHRpZnk6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJwXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgXCJuby1wcmV0dGlmeVwiOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiUFwiLFxuICB9LFxuICB0c2NvbmZpZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiY1wiLFxuICB9LFxufSk7XG5cbmlmIChlcnJvcikge1xuICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmNvbnN0IHVzYWdlUHJvbXB0ID0gW1xuICBcIlVzYWdlOlwiLFxuICBcIiAgZXhwYW5kLW15LXR5cGUgW29wdGlvbnNdIDxzb3VyY2UtZmlsZT4gPGV4cHJlc3Npb24+XCIsXG4gIFwiXCIsXG4gIFwiT3B0aW9uczpcIixcbiAgXCIgIC1oLCAtLWhlbHBcXHRcXHRcXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlXCIsXG4gIFwiICAtcCwgLS1wcmV0dGlmeVxcdFxcdFByZXR0aWZ5IHRoZSBvdXRwdXQgKGRlZmF1bHQpXCIsXG4gIFwiICAtUCwgLS1uby1wcmV0dGlmeVxcdFxcdERvIG5vdCBwcmV0dGlmeSB0aGUgb3V0cHV0XCIsXG4gIFwiICAtYywgLS10c2NvbmZpZyA8ZmlsZT5cXHRcXHRVc2UgdGhlIHNwZWNpZmllZCB0c2NvbmZpZy5qc29uIGZpbGVcIixcbl0uam9pbihcIlxcblwiKTtcblxuaWYgKHBvc2l0aW9uYWxzLmxlbmd0aCAhPT0gMikge1xuICBjb25zb2xlLmVycm9yKHVzYWdlUHJvbXB0KTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pZiAodmFsdWVzLmhlbHApIHtcbiAgY29uc29sZS5lcnJvcih1c2FnZVByb21wdCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc3QgW3NvdXJjZUZpbGVOYW1lLCB0eXBlRXhwcmVzc2lvbl0gPSBwb3NpdGlvbmFscztcbmNvbnN0IHsgcHJldHRpZnksIHRzY29uZmlnOiB0c0NvbmZpZ0ZpbGVOYW1lIH0gPSB2YWx1ZXM7XG5cbmxldCB0c1BhcnNlZENvbW1hbmRMaW5lOiB0cy5QYXJzZWRDb21tYW5kTGluZSB8IHVuZGVmaW5lZDtcblxuaWYgKHRzQ29uZmlnRmlsZU5hbWUpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKHRzQ29uZmlnRmlsZU5hbWUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHRzLnBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50KFxuICAgIGNvbmZpZ0ZpbGUuY29uZmlnLFxuICAgIHRzLnN5cyxcbiAgICBcIi4vXCIsXG4gICk7XG5cbiAgdHNQYXJzZWRDb21tYW5kTGluZSA9IGNvbXBpbGVyT3B0aW9ucztcbn1cblxuY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwYW5kTXlUeXBlKHtcbiAgc291cmNlRmlsZU5hbWUsXG4gIHR5cGVFeHByZXNzaW9uLFxuICBwcmV0dGlmeToge1xuICAgIGVuYWJsZWQ6IHByZXR0aWZ5LFxuICB9LFxuICB0c0NvbXBpbGVyT3B0aW9uczogdHNQYXJzZWRDb21tYW5kTGluZT8ub3B0aW9ucyxcbn0pO1xuXG5jb25zb2xlLmxvZyhyZXN1bHQpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQUEsT0FBTyxRQUFRO0FBa0JSLElBQU0sOEJBQThCLENBQ3pDQSxpQkFDQSxXQUNBLGlCQUNBLGtDQUNHO0FBQ0gsUUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsbUJBQW1CLENBQUMsR0FBRyxJQUFJO0FBQzVFLGFBQVcsT0FBTyxPQUFPLEtBQUssaUNBQWlDLENBQUMsQ0FBQyxHQUFHO0FBQ2xFLHVCQUFt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Z0JBQWdCLGNBQWMsSUFBSTtBQUN6QyxJQUFNLEVBQUUsVUFBVSxVQUFVLGlCQUFpQixJQUFJO0FBRWpELElBQUk7QUFFSixJQUFJLGtCQUFrQjtBQUNwQixRQUFNLGFBQWFKLElBQUcsZUFBZSxrQkFBa0JBLElBQUcsSUFBSSxRQUFRO0FBQ3RFLFFBQU0sa0JBQWtCQSxJQUFHO0FBQUEsSUFDekIsV0FBVztBQUFBLElBQ1hBLElBQUc7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLHdCQUFzQjtBQUN4QjtBQUVBLElBQU0sU0FBUyxNQUFNLGFBQWE7QUFBQSxFQUNoQztBQUFBLEVBQ0E7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLFNBQVM7QUFBQSxFQUNYO0FBQUEsRUFDQSxtQkFBbUIscUJBQXFCO0FBQzFDLENBQUM7QUFFRCxRQUFRLElBQUksTUFBTTsiLAogICJuYW1lcyI6IFsic291cmNlRmlsZU5hbWUiLCAidHlwZUV4cHJlc3Npb24iLCAidHMiLCAidHMiLCAicmVzdWx0IiwgImVycm9yIiwgInZhbHVlcyIsICJwb3NpdGlvbmFscyJdCn0K
214
+
215
+ //# debugId=CDA842588C4AEC4564756E2164756E21
216
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgIi4uL3NyYy9jb2RlLWdlbmVyYXRvci50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxudHlwZSBFeHRyYWN0RnVuY3Rpb25zPFQsIEsgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4gPSB7XG4gIFtQIGluIEtdOiBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogbmV2ZXI7XG59O1xuZXhwb3J0IHR5cGUgQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPSBQYXJ0aWFsPFxuICBFeHRyYWN0RnVuY3Rpb25zPHRzLkNvbXBpbGVySG9zdD5cbj47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgYXVnbWVudHMgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZSBmb3IgZXhwYW5kaW5nIGEgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhdWdtZW50LlxuICogQHBhcmFtIGNvZGVUb0FkZCBUeXBlIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gY29tcGlsZXJPcHRpb25zIFR5cGVTY3JpcHQgY29tcGlsZXIgb3B0aW9ucy5cbiAqIEBwYXJhbSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZy5cbiAqIEByZXR1cm5zIEEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCByZXR1cm5zIGFuIGF1Z21lbnRlZCBzb3VyY2UgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4cGFuZCB0aGUgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0ID0gKFxuICBzb3VyY2VGaWxlTmFtZTogc3RyaW5nLFxuICBjb2RlVG9BZGQ6IHN0cmluZyxcbiAgY29tcGlsZXJPcHRpb25zPzogdHMuQ29tcGlsZXJPcHRpb25zLFxuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuKSA9PiB7XG4gIGNvbnN0IGN1c3RvbUNvbXBpbGVySG9zdCA9IHRzLmNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMgPz8ge30sIHRydWUpO1xuICBjb25zdCBvdmVycmlkZXMgPSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA/PyB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdmVycmlkZXMpIGFzIEFycmF5PFxuICAgIGtleW9mIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzXG4gID4pIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlc1trZXldO1xuXG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAoY3VzdG9tQ29tcGlsZXJIb3N0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPVxuICAgICAgICBvdmVycmlkZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFByZXR0aWVyT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5cbmNvbnN0IGlkZW50aWZpZXJQcmVmaXggPSBcIl9fRVhQQU5EX01ZX1RZUEVfX1wiO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRXhwYW5kQ29kZUJsb2NrID0gKHR5cGVFeHByZXNzaW9uOiBzdHJpbmcpID0+IHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvbWFpbi90ZXN0cy9jYXNlcy9jb21waWxlci9jb21wdXRlZFR5cGVzS2V5b2ZOb0luZGV4U2lnbmF0dXJlVHlwZS50c1xuICByZXR1cm4gYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlc3VsdCA9ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8JHtpZGVudGlmaWVyUHJlZml4fUV4cHJlc3Npb24+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cHJlc3Npb24gPSAke3R5cGVFeHByZXNzaW9ufTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUPiA9IFxuICAgICAgICBUIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgPyAoLi4uYXJnczogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxBPikgPT4gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxSPlxuICAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBVPiA/IFByb21pc2U8JHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxVPj5cbiAgICAgIDogeyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIHN0cmluZyA/ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VFtLXT4gOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFRbS10+OyB9ICYge307XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VD4gPSBbVCAmIHt9XSBleHRlbmRzIFtuZXZlcl0gPyBUIDogVCAmIHt9IGV4dGVuZHMgdm9pZCA/IFQgOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQgJiB7fT47XG5cbiAgICAvLyBGb3JjZXMgYSB1bmlvbiBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlcyB0byBiZSBleHBhbmRlZFxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUIGV4dGVuZHMgc3RyaW5nPiA9ICR7aWRlbnRpZmllclByZWZpeH1SZW1vdmVVbmRlcnNjb3JlPCR7aWRlbnRpZmllclByZWZpeH1BcHBlbmRVbmRlcnNjb3JlPFQ+PjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1BcHBlbmRVbmRlcnNjb3JlPFQgZXh0ZW5kcyBzdHJpbmc+ID0gXFxgXFwke1R9X1xcYCBleHRlbmRzIHN0cmluZyA/IFxcYFxcJHtUfV9cXGAgOiBuZXZlcjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZW1vdmVVbmRlcnNjb3JlPFQgZXh0ZW5kcyBzdHJpbmc+ID0gVCBleHRlbmRzIFxcYFxcJHtpbmZlciBVfV9cXGAgPyBVIDogbmV2ZXI7YDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRUeXBlRXhwcmVzc2lvbiA9IGFzeW5jIChcbiAgY29kZTogc3RyaW5nLFxuICBwcmV0dGllck9wdGlvbnM/OiBQcmV0dGllck9wdGlvbnMsXG4pID0+IHtcbiAgcmV0dXJuIChcbiAgICBhd2FpdCBmb3JtYXQoXG4gICAgICBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gJHtjb2RlfWAsXG4gICAgICBwcmV0dGllck9wdGlvbnMgPz8ge1xuICAgICAgICBwYXJzZXI6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgICBzZW1pOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKVxuICApXG4gICAgLnRyaW0oKVxuICAgIC5zdWJzdHJpbmcoYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fSA9IGAubGVuZ3RoKTtcbn07XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LmpzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIH0gZnJvbSBcIi4vYXVnbWVudGVyLWNvbXBpbGVyLWhvc3QuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUV4cGFuZENvZGVCbG9jayxcbiAgZm9ybWF0VHlwZUV4cHJlc3Npb24sXG59IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yLmpzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdHlwZSB0eXBlIHNob3VsZCBiZSBzZWFyY2hlZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKi9cbmNvbnN0IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSA9IChub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZXIgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUHJldHRpZXIgb3B0aW9ucy4gRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgcGFyc2VyIHRvIFwidHlwZXNjcmlwdFwiLlxuICAgICAqIEBkZWZhdWx0IHsgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiwgc2VtaTogZmFsc2UgfVxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcmV0dGllck9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nXG4gICAqL1xuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBzb3VyY2UgdGV4dCB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlVGV4dDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZE15VHlwZU9wdGlvbnMgPVxuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnNcbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBFeHBhbmRzIGEgVHlwZVNjcmlwdCB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBleHBhbmRlZCB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUob3B0aW9uczogRXhwYW5kTXlUeXBlT3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlRXhwcmVzc2lvbi50cmltKCkgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gXCJuZXZlclwiO1xuICB9XG5cbiAgaWYgKFwic291cmNlVGV4dFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkdW1teUZpbGVOYW1lID0gXCJleHBhbmQtbXktdHlwZS1kdW1teS50c1wiO1xuXG4gICAgcmV0dXJuIGV4cGFuZE15VHlwZSh7XG4gICAgICBzb3VyY2VGaWxlTmFtZTogZHVtbXlGaWxlTmFtZSxcbiAgICAgIHR5cGVFeHByZXNzaW9uOiBvcHRpb25zLnR5cGVFeHByZXNzaW9uLFxuICAgICAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM6IHtcbiAgICAgICAgcmVhZEZpbGUoZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICAgIGlmIChwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSA9PT0gZHVtbXlGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlVGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHMuc3lzLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0c0NvbXBpbGVyT3B0aW9uczogb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyxcbiAgICAgIHByZXR0aWZ5OiBvcHRpb25zLnByZXR0aWZ5LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnNvdXJjZUZpbGVOYW1lKTtcblxuICBjb25zdCB0c0NvbXBpbGVyT3B0aW9ucyA9IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMgPz8ge1xuICAgIG5vRW1pdDogdHJ1ZSxcblxuICAgIHN0cmljdE51bGxDaGVja3M6IHRydWUsXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICBhbGxvd0FyYml0cmFyeUV4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgfTtcblxuICBpZiAoIXRzQ29tcGlsZXJPcHRpb25zLnN0cmljdE51bGxDaGVja3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpY3ROdWxsQ2hlY2tzIG11c3QgYmUgZW5hYmxlZCFcIik7XG4gIH1cblxuICBjb25zdCBjb21waWxlckhvc3QgPSBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QoXG4gICAgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSxcbiAgICBjcmVhdGVFeHBhbmRDb2RlQmxvY2sob3B0aW9ucy50eXBlRXhwcmVzc2lvbiksXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgb3B0aW9ucy5jb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbiAgKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbShcbiAgICBbcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZV0sXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgY29tcGlsZXJIb3N0LFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSk7XG4gIGlmICghc291cmNlRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlNvdXJjZSBmaWxlIG5vdCBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCByZXN1bHRJZGVudGlmaWVyTm9kZSA9IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZShzb3VyY2VGaWxlKTtcbiAgaWYgKCFyZXN1bHRJZGVudGlmaWVyTm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG5vZGUgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZUNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGV4cGFuZGVkVHlwZVN0cmluZyA9IHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhcbiAgICB0eXBlQ2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihyZXN1bHRJZGVudGlmaWVyTm9kZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHRzLlR5cGVGb3JtYXRGbGFncy5Ob2RlQnVpbGRlckZsYWdzTWFzayxcbiAgKTtcblxuICBpZiAob3B0aW9ucy5wcmV0dGlmeSAmJiBvcHRpb25zLnByZXR0aWZ5LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGVkVHlwZVN0cmluZztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRUeXBlRXhwcmVzc2lvbihleHBhbmRlZFR5cGVTdHJpbmcsIG9wdGlvbnMucHJldHRpZnk/Lm9wdGlvbnMpO1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBleHBhbmRNeVR5cGUgfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgcGFyc2VBcmdzLCB0eXBlIFBhcnNlQXJnc0NvbmZpZyB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG50eXBlIFZhbHVlcyA9IHtcbiAgaGVscD86IGJvb2xlYW47XG4gIHByZXR0aWZ5OiBib29sZWFuO1xuICB0c2NvbmZpZz86IHN0cmluZztcbn07XG5cbmNvbnN0IHRyeVBhcnNlID0gPFxuICBWYWx1ZXMgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHN0cmluZyB8IGJvb2xlYW4gfCBBcnJheTxzdHJpbmcgfCBib29sZWFuPiB8IHVuZGVmaW5lZFxuICA+LFxuICBPcHRpb25zIGV4dGVuZHMgUGFyc2VBcmdzQ29uZmlnW1wib3B0aW9uc1wiXSA9IFBhcnNlQXJnc0NvbmZpZ1tcIm9wdGlvbnNcIl0sXG4+KFxuICBvcHRpb25zOiBPcHRpb25zLFxuKTogeyBlcnJvcj86IEVycm9yOyB2YWx1ZXM6IFZhbHVlczsgcG9zaXRpb25hbHM6IHN0cmluZ1tdIH0gPT4ge1xuICBsZXQgcmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiBwYXJzZUFyZ3M+O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IHBhcnNlQXJncyh7XG4gICAgICBvcHRpb25zLFxuICAgICAgdG9rZW5zOiB0cnVlLFxuICAgICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcbiAgICAgIHZhbHVlczoge30gYXMgVmFsdWVzLFxuICAgICAgcG9zaXRpb25hbHM6IFtdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHRva2VucywgdmFsdWVzLCBwb3NpdGlvbmFscyB9ID0gcmVzdWx0O1xuXG4gIC8vIFJlcHJvY2VzcyB0aGUgb3B0aW9uIHRva2VucyBhbmQgb3ZlcndyaXRlIHRoZSByZXR1cm5lZCB2YWx1ZXMuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zID8/IFtdKSB7XG4gICAgaWYgKHRva2VuLmtpbmQgPT09IFwib3B0aW9uLXRlcm1pbmF0b3JcIiB8fCB0b2tlbi5raW5kID09PSBcInBvc2l0aW9uYWxcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLm5hbWUuc3RhcnRzV2l0aChcIm5vLVwiKSkge1xuICAgICAgLy8gU3RvcmUgZm9vOmZhbHNlIGZvciAtLW5vLWZvb1xuICAgICAgY29uc3QgcG9zaXRpdmVOYW1lID0gdG9rZW4ubmFtZS5zbGljZShcIm5vLVwiLmxlbmd0aCk7XG4gICAgICB2YWx1ZXNbcG9zaXRpdmVOYW1lXSA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHZhbHVlc1t0b2tlbi5uYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzYXZlIHZhbHVlIHNvIGxhc3Qgb25lIHdpbnMgaWYgYm90aCAtLWZvbyBhbmQgLS1uby1mb28uXG4gICAgICB2YWx1ZXNbdG9rZW4ubmFtZV0gPSB0b2tlbi52YWx1ZSA/PyB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZXM6IHZhbHVlcyBhcyBWYWx1ZXMsXG4gICAgcG9zaXRpb25hbHMsXG4gIH07XG59O1xuXG5jb25zdCB7IGVycm9yLCB2YWx1ZXMsIHBvc2l0aW9uYWxzIH0gPSB0cnlQYXJzZTxWYWx1ZXM+KHtcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgfSxcbiAgcHJldHRpZnk6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJwXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgXCJuby1wcmV0dGlmeVwiOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiUFwiLFxuICB9LFxuICB0c2NvbmZpZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiY1wiLFxuICB9LFxufSk7XG5cbmlmIChlcnJvcikge1xuICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmNvbnN0IHVzYWdlUHJvbXB0ID0gW1xuICBcIlVzYWdlOlwiLFxuICBcIiAgZXhwYW5kLW15LXR5cGUgW29wdGlvbnNdIDxzb3VyY2UtZmlsZT4gPGV4cHJlc3Npb24+XCIsXG4gIFwiXCIsXG4gIFwiT3B0aW9uczpcIixcbiAgXCIgIC1oLCAtLWhlbHBcXHRcXHRcXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlXCIsXG4gIFwiICAtcCwgLS1wcmV0dGlmeVxcdFxcdFByZXR0aWZ5IHRoZSBvdXRwdXQgKGRlZmF1bHQpXCIsXG4gIFwiICAtUCwgLS1uby1wcmV0dGlmeVxcdFxcdERvIG5vdCBwcmV0dGlmeSB0aGUgb3V0cHV0XCIsXG4gIFwiICAtYywgLS10c2NvbmZpZyA8ZmlsZT5cXHRcXHRVc2UgdGhlIHNwZWNpZmllZCB0c2NvbmZpZy5qc29uIGZpbGVcIixcbl0uam9pbihcIlxcblwiKTtcblxuaWYgKHBvc2l0aW9uYWxzLmxlbmd0aCAhPT0gMikge1xuICBjb25zb2xlLmVycm9yKHVzYWdlUHJvbXB0KTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pZiAodmFsdWVzLmhlbHApIHtcbiAgY29uc29sZS5lcnJvcih1c2FnZVByb21wdCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc3QgW3NvdXJjZUZpbGVOYW1lLCB0eXBlRXhwcmVzc2lvbl0gPSBwb3NpdGlvbmFscztcbmNvbnN0IHsgcHJldHRpZnksIHRzY29uZmlnOiB0c0NvbmZpZ0ZpbGVOYW1lIH0gPSB2YWx1ZXM7XG5cbmxldCB0c1BhcnNlZENvbW1hbmRMaW5lOiB0cy5QYXJzZWRDb21tYW5kTGluZSB8IHVuZGVmaW5lZDtcblxuaWYgKHRzQ29uZmlnRmlsZU5hbWUpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKHRzQ29uZmlnRmlsZU5hbWUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHRzLnBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50KFxuICAgIGNvbmZpZ0ZpbGUuY29uZmlnLFxuICAgIHRzLnN5cyxcbiAgICBcIi4vXCIsXG4gICk7XG5cbiAgdHNQYXJzZWRDb21tYW5kTGluZSA9IGNvbXBpbGVyT3B0aW9ucztcbn1cblxuY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwYW5kTXlUeXBlKHtcbiAgc291cmNlRmlsZU5hbWUsXG4gIHR5cGVFeHByZXNzaW9uLFxuICBwcmV0dGlmeToge1xuICAgIGVuYWJsZWQ6IHByZXR0aWZ5LFxuICB9LFxuICB0c0NvbXBpbGVyT3B0aW9uczogdHNQYXJzZWRDb21tYW5kTGluZT8ub3B0aW9ucyxcbn0pO1xuXG5jb25zb2xlLmxvZyhyZXN1bHQpO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQUE7QUFrQk8sSUFBTSw4QkFBOEIsQ0FDekMsZ0JBQ0EsV0FDQSxpQkFDQSxrQ0FDRztBQUFBLEVBQ0gsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsbUJBQW1CLENBQUMsR0FBRyxJQUFJO0FBQUEsRUFDNUUsTUFBTSxZQUFZLGlDQUFpQyxDQUFDO0FBQUEsRUFFcEQsV0FBVyxPQUFPLE9BQU8sS0FBSyxTQUFTLEdBRXBDO0FBQUEsSUFDRCxNQUFNLFdBQVcsVUFBVTtBQUFBLElBRTNCLElBQUksVUFBVTtBQUFBLE1BQ1gsbUJBQTBELE9BQ3pEO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU0sbUJBQW1CLG1CQUFtQjtBQUFBLEVBRTVDLG1CQUFtQixXQUFXLENBQUMsYUFBYTtBQUFBLElBQzFDLE1BQU0sV0FBVyxpQkFBaUIsUUFBUTtBQUFBLElBRTFDLElBQUksYUFBYSxXQUFXO0FBQUEsTUFDMUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksYUFBYSxnQkFBZ0I7QUFBQSxNQUMvQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsT0FBTyxHQUFHO0FBQUEsRUFBYztBQUFBO0FBQUEsRUFHMUIsT0FBTztBQUFBOzs7QUNyRFQ7QUFFQSxJQUFNLG1CQUFtQjtBQUVsQixJQUFNLHdCQUF3QixDQUFDLG1CQUEyQjtBQUFBLEVBRS9ELE9BQU8sUUFBUSw0QkFBNEIsMEJBQTBCO0FBQUEsV0FDNUQsZ0NBQWdDO0FBQUE7QUFBQSxXQUVoQztBQUFBLDhEQUNtRCxpQ0FBaUM7QUFBQSwrQ0FDaEQ7QUFBQSxrREFDRyx3Q0FBd0M7QUFBQTtBQUFBLFdBRS9FLG9HQUFvRztBQUFBO0FBQUE7QUFBQSxXQUdwRyxvREFBb0Qsb0NBQW9DO0FBQUEsV0FDeEY7QUFBQSxXQUNBO0FBQUE7QUFHSixJQUFNLHVCQUF1QixPQUNsQyxNQUNB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aEI7QUFFQSxJQUFNLGNBQWM7QUFBQSxFQUNsQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixFQUFFLEtBQUs7QUFBQSxDQUFJO0FBRVgsSUFBSSxZQUFZLFdBQVcsR0FBRztBQUFBLEVBQzVCLFFBQVEsTUFBTSxXQUFXO0FBQUEsRUFDekIsUUFBUSxLQUFLLENBQUM7QUFDaEI7QUFFQSxJQUFJLE9BQU8sTUFBTTtBQUFBLEVBQ2YsUUFBUSxNQUFNLFdBQVc7QUFBQSxFQUN6QixRQUFRLEtBQUssQ0FBQztBQUNoQjtBQUVBLEtBQU8sZ0JBQWdCLGtCQUFrQjtBQUN6QyxNQUFRLFVBQVUsVUFBVSxxQkFBcUI7QUFFakQsSUFBSTtBQUVKLElBQUksa0JBQWtCO0FBQUEsRUFDcEIsTUFBTSxhQUFhLElBQUcsZUFBZSxrQkFBa0IsSUFBRyxJQUFJLFFBQVE7QUFBQSxFQUN0RSxNQUFNLGtCQUFrQixJQUFHLDJCQUN6QixXQUFXLFFBQ1gsSUFBRyxLQUNILElBQ0Y7QUFBQSxFQUVBLHNCQUFzQjtBQUN4QjtBQUVBLElBQU0sU0FBUyxNQUFNLGFBQWE7QUFBQSxFQUNoQztBQUFBLEVBQ0E7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLFNBQVM7QUFBQSxFQUNYO0FBQUEsRUFDQSxtQkFBbUIscUJBQXFCO0FBQzFDLENBQUM7QUFFRCxRQUFRLElBQUksTUFBTTsiLAogICJkZWJ1Z0lkIjogIkNEQTg0MjU4OEM0QUVDNDU2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
@@ -0,0 +1,3 @@
1
+ import type { Options as PrettierOptions } from "prettier";
2
+ export declare const createExpandCodeBlock: (typeExpression: string) => string;
3
+ export declare const formatTypeExpression: (code: string, prettierOptions?: PrettierOptions) => Promise<string>;
package/dist/index.cjs CHANGED
@@ -1,49 +1,87 @@
1
1
  var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
2
3
  var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
7
+ function __accessProp(key) {
8
+ return this[key];
9
+ }
10
+ var __toESMCache_node;
11
+ var __toESMCache_esm;
12
+ var __toESM = (mod, isNodeMode, target) => {
13
+ var canCache = mod != null && typeof mod === "object";
14
+ if (canCache) {
15
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
+ var cached = cache.get(mod);
17
+ if (cached)
18
+ return cached;
19
+ }
20
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
21
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
+ for (let key of __getOwnPropNames(mod))
23
+ if (!__hasOwnProp.call(to, key))
24
+ __defProp(to, key, {
25
+ get: __accessProp.bind(mod, key),
26
+ enumerable: true
27
+ });
28
+ if (canCache)
29
+ cache.set(mod, to);
30
+ return to;
10
31
  };
11
- var __copyProps = (to, from, except, desc) => {
32
+ var __toCommonJS = (from) => {
33
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
34
+ if (entry)
35
+ return entry;
36
+ entry = __defProp({}, "__esModule", { value: true });
12
37
  if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
38
+ for (var key of __getOwnPropNames(from))
39
+ if (!__hasOwnProp.call(entry, key))
40
+ __defProp(entry, key, {
41
+ get: __accessProp.bind(from, key),
42
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
43
+ });
16
44
  }
17
- return to;
45
+ __moduleCache.set(from, entry);
46
+ return entry;
47
+ };
48
+ var __moduleCache;
49
+ var __returnValue = (v) => v;
50
+ function __exportSetter(name, newValue) {
51
+ this[name] = __returnValue.bind(null, newValue);
52
+ }
53
+ var __export = (target, all) => {
54
+ for (var name in all)
55
+ __defProp(target, name, {
56
+ get: all[name],
57
+ enumerable: true,
58
+ configurable: true,
59
+ set: __exportSetter.bind(all, name)
60
+ });
18
61
  };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
62
 
29
63
  // src/index.ts
30
- var src_exports = {};
31
- __export(src_exports, {
64
+ var exports_src = {};
65
+ __export(exports_src, {
32
66
  expandMyType: () => expandMyType
33
67
  });
34
- module.exports = __toCommonJS(src_exports);
68
+ module.exports = __toCommonJS(exports_src);
35
69
 
36
70
  // src/augmenter-compiler-host.ts
37
- var import_typescript = __toESM(require("typescript"), 1);
71
+ var import_typescript = __toESM(require("typescript"));
38
72
  var createAugmenterCompilerHost = (sourceFileName, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
39
73
  const customCompilerHost = import_typescript.default.createCompilerHost(compilerOptions ?? {}, true);
40
- for (const key of Object.keys(compilerHostFunctionOverrides ?? {})) {
41
- customCompilerHost[key] = compilerHostFunctionOverrides[key];
74
+ const overrides = compilerHostFunctionOverrides ?? {};
75
+ for (const key of Object.keys(overrides)) {
76
+ const override = overrides[key];
77
+ if (override) {
78
+ customCompilerHost[key] = override;
79
+ }
42
80
  }
43
81
  const originalReadFile = customCompilerHost.readFile;
44
82
  customCompilerHost.readFile = (fileName) => {
45
83
  const contents = originalReadFile(fileName);
46
- if (contents === void 0) {
84
+ if (contents === undefined) {
47
85
  return contents;
48
86
  }
49
87
  if (fileName !== sourceFileName) {
@@ -75,22 +113,19 @@ var createExpandCodeBlock = (typeExpression) => {
75
113
  type ${identifierPrefix}RemoveUnderscore<T extends string> = T extends \`\${infer U}_\` ? U : never;`;
76
114
  };
77
115
  var formatTypeExpression = async (code, prettierOptions) => {
78
- return (await (0, import_prettier.format)(
79
- `type ${identifierPrefix} = ${code}`,
80
- prettierOptions ?? {
81
- parser: "typescript",
82
- semi: false
83
- }
84
- )).trim().substring(`type ${identifierPrefix} = `.length);
116
+ return (await import_prettier.format(`type ${identifierPrefix} = ${code}`, prettierOptions ?? {
117
+ parser: "typescript",
118
+ semi: false
119
+ })).trim().substring(`type ${identifierPrefix} = `.length);
85
120
  };
86
121
 
87
122
  // src/index.ts
88
- var import_node_path = __toESM(require("path"), 1);
89
- var import_typescript2 = __toESM(require("typescript"), 1);
123
+ var import_node_path = __toESM(require("node:path"));
124
+ var import_typescript2 = __toESM(require("typescript"));
90
125
  var findResultIdentifierNode = (node) => {
91
126
  if (node.getChildCount() == 0) {
92
127
  if (!import_typescript2.default.isIdentifier(node)) {
93
- return void 0;
128
+ return;
94
129
  }
95
130
  return node;
96
131
  }
@@ -129,17 +164,8 @@ async function expandMyType(options) {
129
164
  if (!tsCompilerOptions.strictNullChecks) {
130
165
  throw new Error("strictNullChecks must be enabled!");
131
166
  }
132
- const compilerHost = createAugmenterCompilerHost(
133
- resolvedSourceFileName,
134
- createExpandCodeBlock(options.typeExpression),
135
- tsCompilerOptions,
136
- options.compilerHostFunctionOverrides
137
- );
138
- const program = import_typescript2.default.createProgram(
139
- [resolvedSourceFileName],
140
- tsCompilerOptions,
141
- compilerHost
142
- );
167
+ const compilerHost = createAugmenterCompilerHost(resolvedSourceFileName, createExpandCodeBlock(options.typeExpression), tsCompilerOptions, options.compilerHostFunctionOverrides);
168
+ const program = import_typescript2.default.createProgram([resolvedSourceFileName], tsCompilerOptions, compilerHost);
143
169
  const sourceFile = program.getSourceFile(resolvedSourceFileName);
144
170
  if (!sourceFile) {
145
171
  throw new Error("Source file not found!");
@@ -149,18 +175,12 @@ async function expandMyType(options) {
149
175
  throw new Error("No node found!");
150
176
  }
151
177
  const typeChecker = program.getTypeChecker();
152
- const expandedTypeString = typeChecker.typeToString(
153
- typeChecker.getTypeAtLocation(resultIdentifierNode),
154
- void 0,
155
- import_typescript2.default.TypeFormatFlags.NodeBuilderFlagsMask
156
- );
178
+ const expandedTypeString = typeChecker.typeToString(typeChecker.getTypeAtLocation(resultIdentifierNode), undefined, import_typescript2.default.TypeFormatFlags.NodeBuilderFlagsMask);
157
179
  if (options.prettify && options.prettify.enabled === false) {
158
180
  return expandedTypeString;
159
181
  }
160
182
  return formatTypeExpression(expandedTypeString, options.prettify?.options);
161
183
  }
162
- // Annotate the CommonJS export names for ESM import in node:
163
- 0 && (module.exports = {
164
- expandMyType
165
- });
166
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50cyIsICIuLi9zcmMvY29kZS1nZW5lcmF0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIH0gZnJvbSBcIi4vYXVnbWVudGVyLWNvbXBpbGVyLWhvc3QudHNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUV4cGFuZENvZGVCbG9jayxcbiAgZm9ybWF0VHlwZUV4cHJlc3Npb24sXG59IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdHlwZSB0eXBlIHNob3VsZCBiZSBzZWFyY2hlZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKi9cbmNvbnN0IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSA9IChub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZXIgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUHJldHRpZXIgb3B0aW9ucy4gRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgcGFyc2VyIHRvIFwidHlwZXNjcmlwdFwiLlxuICAgICAqIEBkZWZhdWx0IHsgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiwgc2VtaTogZmFsc2UgfVxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcmV0dGllck9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nXG4gICAqL1xuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBzb3VyY2UgdGV4dCB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlVGV4dDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZE15VHlwZU9wdGlvbnMgPVxuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnNcbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBFeHBhbmRzIGEgVHlwZVNjcmlwdCB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBleHBhbmRlZCB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUob3B0aW9uczogRXhwYW5kTXlUeXBlT3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlRXhwcmVzc2lvbi50cmltKCkgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gXCJuZXZlclwiO1xuICB9XG5cbiAgaWYgKFwic291cmNlVGV4dFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkdW1teUZpbGVOYW1lID0gXCJleHBhbmQtbXktdHlwZS1kdW1teS50c1wiO1xuXG4gICAgcmV0dXJuIGV4cGFuZE15VHlwZSh7XG4gICAgICBzb3VyY2VGaWxlTmFtZTogZHVtbXlGaWxlTmFtZSxcbiAgICAgIHR5cGVFeHByZXNzaW9uOiBvcHRpb25zLnR5cGVFeHByZXNzaW9uLFxuICAgICAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM6IHtcbiAgICAgICAgcmVhZEZpbGUoZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICAgIGlmIChwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSA9PT0gZHVtbXlGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlVGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHMuc3lzLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0c0NvbXBpbGVyT3B0aW9uczogb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyxcbiAgICAgIHByZXR0aWZ5OiBvcHRpb25zLnByZXR0aWZ5LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnNvdXJjZUZpbGVOYW1lKTtcblxuICBjb25zdCB0c0NvbXBpbGVyT3B0aW9ucyA9IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMgPz8ge1xuICAgIG5vRW1pdDogdHJ1ZSxcblxuICAgIHN0cmljdE51bGxDaGVja3M6IHRydWUsXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICBhbGxvd0FyYml0cmFyeUV4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgfTtcblxuICBpZiAoIXRzQ29tcGlsZXJPcHRpb25zLnN0cmljdE51bGxDaGVja3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpY3ROdWxsQ2hlY2tzIG11c3QgYmUgZW5hYmxlZCFcIik7XG4gIH1cblxuICBjb25zdCBjb21waWxlckhvc3QgPSBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QoXG4gICAgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSxcbiAgICBjcmVhdGVFeHBhbmRDb2RlQmxvY2sob3B0aW9ucy50eXBlRXhwcmVzc2lvbiksXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgb3B0aW9ucy5jb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbiAgKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbShcbiAgICBbcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZV0sXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgY29tcGlsZXJIb3N0LFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSk7XG4gIGlmICghc291cmNlRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlNvdXJjZSBmaWxlIG5vdCBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCByZXN1bHRJZGVudGlmaWVyTm9kZSA9IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZShzb3VyY2VGaWxlKTtcbiAgaWYgKCFyZXN1bHRJZGVudGlmaWVyTm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG5vZGUgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZUNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGV4cGFuZGVkVHlwZVN0cmluZyA9IHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhcbiAgICB0eXBlQ2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihyZXN1bHRJZGVudGlmaWVyTm9kZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHRzLlR5cGVGb3JtYXRGbGFncy5Ob2RlQnVpbGRlckZsYWdzTWFzayxcbiAgKTtcblxuICBpZiAob3B0aW9ucy5wcmV0dGlmeSAmJiBvcHRpb25zLnByZXR0aWZ5LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGVkVHlwZVN0cmluZztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRUeXBlRXhwcmVzc2lvbihleHBhbmRlZFR5cGVTdHJpbmcsIG9wdGlvbnMucHJldHRpZnk/Lm9wdGlvbnMpO1xufVxuIiwgImltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG50eXBlIEV4dHJhY3RGdW5jdGlvbnM8VCwgSyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IHtcbiAgW1AgaW4gS106IFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiBuZXZlcjtcbn07XG5leHBvcnQgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA9IFBhcnRpYWw8XG4gIEV4dHJhY3RGdW5jdGlvbnM8dHMuQ29tcGlsZXJIb3N0PlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCBhdWdtZW50cyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlIGZvciBleHBhbmRpbmcgYSB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGF1Z21lbnQuXG4gKiBAcGFyYW0gY29kZVRvQWRkIFR5cGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjb21waWxlck9wdGlvbnMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICogQHBhcmFtIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nLlxuICogQHJldHVybnMgQSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IHJldHVybnMgYW4gYXVnbWVudGVkIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwYW5kIHRoZSB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgPSAoXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmcsXG4gIGNvZGVUb0FkZDogc3RyaW5nLFxuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnMsXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4pID0+IHtcbiAgY29uc3QgY3VzdG9tQ29tcGlsZXJIb3N0ID0gdHMuY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucyA/PyB7fSwgdHJ1ZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID8/IHt9KSkge1xuICAgIGN1c3RvbUNvbXBpbGVySG9zdFtrZXldID0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMhW2tleV07XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcblxuY29uc3QgaWRlbnRpZmllclByZWZpeCA9IFwiX19FWFBBTkRfTVlfVFlQRV9fXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVFeHBhbmRDb2RlQmxvY2sgPSAodHlwZUV4cHJlc3Npb246IHN0cmluZykgPT4ge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi9tYWluL3Rlc3RzL2Nhc2VzL2NvbXBpbGVyL2NvbXB1dGVkVHlwZXNLZXlvZk5vSW5kZXhTaWduYXR1cmVUeXBlLnRzXG4gIHJldHVybiBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVzdWx0ID0gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDwke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbiA9ICR7dHlwZUV4cHJlc3Npb259O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQ+ID0gXG4gICAgICAgIFQgZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiA/ICguLi5hcmdzOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPEE+KSA9PiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFI+XG4gICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFU+ID8gUHJvbWlzZTwke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFU+PlxuICAgICAgOiB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgc3RyaW5nID8gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUW0tdPiA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VFtLXT47IH0gJiB7fTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxUPiA9IFtUICYge31dIGV4dGVuZHMgW25ldmVyXSA/IFQgOiBUICYge30gZXh0ZW5kcyB2b2lkID8gVCA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VCAmIHt9PjtcblxuICAgIC8vIEZvcmNlcyBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFsIHR5cGVzIHRvIGJlIGV4cGFuZGVkXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0gJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8JHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VD4+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBcXGBcXCR7VH1fXFxgIGV4dGVuZHMgc3RyaW5nID8gXFxgXFwke1R9X1xcYCA6IG5ldmVyO1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBUIGV4dGVuZHMgXFxgXFwke2luZmVyIFV9X1xcYCA/IFUgOiBuZXZlcjtgO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFR5cGVFeHByZXNzaW9uID0gYXN5bmMgKFxuICBjb2RlOiBzdHJpbmcsXG4gIHByZXR0aWVyT3B0aW9ucz86IFByZXR0aWVyT3B0aW9ucyxcbikgPT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IGZvcm1hdChcbiAgICAgIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSAke2NvZGV9YCxcbiAgICAgIHByZXR0aWVyT3B0aW9ucyA/PyB7XG4gICAgICAgIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIHNlbWk6IGZhbHNlLFxuICAgICAgfSxcbiAgICApXG4gIClcbiAgICAudHJpbSgpXG4gICAgLnN1YnN0cmluZyhgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gYC5sZW5ndGgpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsd0JBQWU7QUFrQlIsSUFBTSw4QkFBOEIsQ0FDekMsZ0JBQ0EsV0FDQSxpQkFDQSxrQ0FDRztBQUNILFFBQU0scUJBQXFCLGtCQUFBQSxRQUFHLG1CQUFtQixtQkFBbUIsQ0FBQyxHQUFHLElBQUk7QUFDNUUsYUFBVyxPQUFPLE9BQU8sS0FBSyxpQ0FBaUMsQ0FBQyxDQUFDLEdBQUc7QUFDbEUsdUJBQW1CLEdBQUcsSUFBSSw4QkFBK0IsR0FBRztBQUFBLEVBQzlEO0FBRUEsUUFBTSxtQkFBbUIsbUJBQW1CO0FBRTVDLHFCQUFtQixXQUFXLENBQUMsYUFBYTtBQUMxQyxVQUFNLFdBQVcsaUJBQWlCLFFBQVE7QUFFMUMsUUFBSSxhQUFhLFFBQVc7QUFDMUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLGFBQWEsZ0JBQWdCO0FBQy9CLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTyxHQUFHLFNBQVM7QUFBQSxFQUFLLFFBQVE7QUFBQSxFQUNsQztBQUVBLFNBQU87QUFDVDs7O0FDN0NBLHNCQUF1QjtBQUV2QixJQUFNLG1CQUFtQjtBQUVsQixJQUFNLHdCQUF3QixDQUFDLG1CQUEyQjtBQUUvRCxTQUFPLFFBQVEsZ0JBQWdCLFlBQVksZ0JBQWdCLFVBQVUsZ0JBQWdCO0FBQUEsV0FDNUUsZ0JBQWdCLGdCQUFnQixjQUFjO0FBQUE7QUFBQSxXQUU5QyxnQkFBZ0I7QUFB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
184
+
185
+ //# debugId=FD61D95A1BB3AC7F64756E2164756E21
186
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgInNyYy9jb2RlLWdlbmVyYXRvci50cyIsICJzcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0ge1xuICBbUCBpbiBLXTogVFtQXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtQXSA6IG5ldmVyO1xufTtcbmV4cG9ydCB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID0gUGFydGlhbDxcbiAgRXh0cmFjdEZ1bmN0aW9uczx0cy5Db21waWxlckhvc3Q+XG4+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IGF1Z21lbnRzIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUgZm9yIGV4cGFuZGluZyBhIHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gYXVnbWVudC5cbiAqIEBwYXJhbSBjb2RlVG9BZGQgVHlwZSBleHByZXNzaW9uLlxuICogQHBhcmFtIGNvbXBpbGVyT3B0aW9ucyBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gKiBAcGFyYW0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgQSByZWNvcmQgb2YgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGluIHRoZSBjb21waWxlciBob3N0LiBVc2VmdWwgZm9yIG1vY2tpbmcuXG4gKiBAcmV0dXJucyBBIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgcmV0dXJucyBhbiBhdWdtZW50ZWQgc291cmNlIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBleHBhbmQgdGhlIHR5cGUgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCA9IChcbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZyxcbiAgY29kZVRvQWRkOiBzdHJpbmcsXG4gIGNvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucyxcbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbikgPT4ge1xuICBjb25zdCBjdXN0b21Db21waWxlckhvc3QgPSB0cy5jcmVhdGVDb21waWxlckhvc3QoY29tcGlsZXJPcHRpb25zID8/IHt9LCB0cnVlKTtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPz8ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3ZlcnJpZGVzKSBhcyBBcnJheTxcbiAgICBrZXlvZiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlc1xuICA+KSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXNba2V5XTtcblxuICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgKGN1c3RvbUNvbXBpbGVySG9zdCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID1cbiAgICAgICAgb3ZlcnJpZGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxSZWFkRmlsZSA9IGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZTtcblxuICBjdXN0b21Db21waWxlckhvc3QucmVhZEZpbGUgPSAoZmlsZU5hbWUpID0+IHtcbiAgICBjb25zdCBjb250ZW50cyA9IG9yaWdpbmFsUmVhZEZpbGUoZmlsZU5hbWUpO1xuXG4gICAgaWYgKGNvbnRlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICBpZiAoZmlsZU5hbWUgIT09IHNvdXJjZUZpbGVOYW1lKSB7XG4gICAgICByZXR1cm4gY29udGVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2NvZGVUb0FkZH1cXG4ke2NvbnRlbnRzfWA7XG4gIH07XG5cbiAgcmV0dXJuIGN1c3RvbUNvbXBpbGVySG9zdDtcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBQcmV0dGllck9wdGlvbnMgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJwcmV0dGllclwiO1xuXG5jb25zdCBpZGVudGlmaWVyUHJlZml4ID0gXCJfX0VYUEFORF9NWV9UWVBFX19cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGFuZENvZGVCbG9jayA9ICh0eXBlRXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21haW4vdGVzdHMvY2FzZXMvY29tcGlsZXIvY29tcHV0ZWRUeXBlc0tleW9mTm9JbmRleFNpZ25hdHVyZVR5cGUudHNcbiAgcmV0dXJuIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZXN1bHQgPSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPCR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uPjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uID0gJHt0eXBlRXhwcmVzc2lvbn07XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VD4gPSBcbiAgICAgICAgVCBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8QT4pID0+ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8Uj5cbiAgICAgIDogVCBleHRlbmRzIFByb21pc2U8aW5mZXIgVT4gPyBQcm9taXNlPCR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VT4+XG4gICAgICA6IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBzdHJpbmcgPyAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFRbS10+IDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUW0tdPjsgfSAmIHt9O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFQ+ID0gW1QgJiB7fV0gZXh0ZW5kcyBbbmV2ZXJdID8gVCA6IFQgJiB7fSBleHRlbmRzIHZvaWQgPyBUIDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUICYge30+O1xuXG4gICAgLy8gRm9yY2VzIGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWwgdHlwZXMgdG8gYmUgZXhwYW5kZWRcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VCBleHRlbmRzIHN0cmluZz4gPSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTwke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUPj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFxcYFxcJHtUfV9cXGAgZXh0ZW5kcyBzdHJpbmcgPyBcXGBcXCR7VH1fXFxgIDogbmV2ZXI7XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFQgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgVX1fXFxgID8gVSA6IG5ldmVyO2A7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VHlwZUV4cHJlc3Npb24gPSBhc3luYyAoXG4gIGNvZGU6IHN0cmluZyxcbiAgcHJldHRpZXJPcHRpb25zPzogUHJldHRpZXJPcHRpb25zLFxuKSA9PiB7XG4gIHJldHVybiAoXG4gICAgYXdhaXQgZm9ybWF0KFxuICAgICAgYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fSA9ICR7Y29kZX1gLFxuICAgICAgcHJldHRpZXJPcHRpb25zID8/IHtcbiAgICAgICAgcGFyc2VyOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgc2VtaTogZmFsc2UsXG4gICAgICB9LFxuICAgIClcbiAgKVxuICAgIC50cmltKClcbiAgICAuc3Vic3RyaW5nKGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSBgLmxlbmd0aCk7XG59O1xuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgfSBmcm9tIFwiLi9hdWdtZW50ZXItY29tcGlsZXItaG9zdC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBhbmRDb2RlQmxvY2ssXG4gIGZvcm1hdFR5cGVFeHByZXNzaW9uLFxufSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvci5qc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFByZXR0aWVyT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdoaWNoIHR5cGUgdHlwZSBzaG91bGQgYmUgc2VhcmNoZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICovXG5jb25zdCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUgPSAobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMCkge1xuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIHdlIHB1dCB0aGUgX188SURFTlRJRklFUj5fXyB0eXBlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gICAgLy8gZmlsZSwgd2UgY2FuIHJldHVybiB0aGUgZmlyc3QgaWRlbnRpZmllciB3ZSBmaW5kLlxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIHRzLmZvckVhY2hDaGlsZChub2RlLCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUpO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZU9wdGlvbnNCYXNlID0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgZXhwcmVzc2lvbiB0byBleHBhbmQuXG4gICAqIEBleGFtcGxlIFwiUmV0dXJuVHlwZTx0eXBlb2YgbXlGdW5jdGlvbj5cIlxuICAgKi9cbiAgdHlwZUV4cHJlc3Npb246IHN0cmluZztcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgdHNDb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFByZXR0aWVyIG9wdGlvbnMuXG4gICAqL1xuICBwcmV0dGlmeT86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHByZXR0aWZ5IHRoZSBvdXRwdXQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFByZXR0aWVyIG9wdGlvbnMuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHBhcnNlciB0byBcInR5cGVzY3JpcHRcIi5cbiAgICAgKiBAZGVmYXVsdCB7IHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsIHNlbWk6IGZhbHNlIH1cbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJldHRpZXJPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZ1xuICAgKi9cbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgc291cmNlIHRleHQgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZVRleHQ6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRNeVR5cGVPcHRpb25zID1cbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zXG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogRXhwYW5kcyBhIFR5cGVTY3JpcHQgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZXhwYW5kZWQgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKG9wdGlvbnM6IEV4cGFuZE15VHlwZU9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZUV4cHJlc3Npb24udHJpbSgpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwibmV2ZXJcIjtcbiAgfVxuXG4gIGlmIChcInNvdXJjZVRleHRcIiBpbiBvcHRpb25zKSB7XG4gICAgY29uc3QgZHVtbXlGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUtZHVtbXkudHNcIjtcblxuICAgIHJldHVybiBleHBhbmRNeVR5cGUoe1xuICAgICAgc291cmNlRmlsZU5hbWU6IGR1bW15RmlsZU5hbWUsXG4gICAgICB0eXBlRXhwcmVzc2lvbjogb3B0aW9ucy50eXBlRXhwcmVzc2lvbixcbiAgICAgIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHJlYWRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAocGF0aC5iYXNlbmFtZShmaWxlTmFtZSkgPT09IGR1bW15RmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNvdXJjZVRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRzLnN5cy5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHNDb21waWxlck9wdGlvbnM6IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMsXG4gICAgICBwcmV0dGlmeTogb3B0aW9ucy5wcmV0dGlmeSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkU291cmNlRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5zb3VyY2VGaWxlTmFtZSk7XG5cbiAgY29uc3QgdHNDb21waWxlck9wdGlvbnMgPSBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zID8/IHtcbiAgICBub0VtaXQ6IHRydWUsXG5cbiAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgYWxsb3dBcmJpdHJhcnlFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SnM6IHRydWUsXG4gIH07XG5cbiAgaWYgKCF0c0NvbXBpbGVyT3B0aW9ucy5zdHJpY3ROdWxsQ2hlY2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RyaWN0TnVsbENoZWNrcyBtdXN0IGJlIGVuYWJsZWQhXCIpO1xuICB9XG5cbiAgY29uc3QgY29tcGlsZXJIb3N0ID0gY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0KFxuICAgIHJlc29sdmVkU291cmNlRmlsZU5hbWUsXG4gICAgY3JlYXRlRXhwYW5kQ29kZUJsb2NrKG9wdGlvbnMudHlwZUV4cHJlc3Npb24pLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIG9wdGlvbnMuY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4gICk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgW3Jlc29sdmVkU291cmNlRmlsZU5hbWVdLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIGNvbXBpbGVySG9zdCxcbiAgKTtcblxuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVkU291cmNlRmlsZU5hbWUpO1xuICBpZiAoIXNvdXJjZUZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZmlsZSBub3QgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0SWRlbnRpZmllck5vZGUgPSBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUoc291cmNlRmlsZSk7XG4gIGlmICghcmVzdWx0SWRlbnRpZmllck5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBleHBhbmRlZFR5cGVTdHJpbmcgPSB0eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoXG4gICAgdHlwZUNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24ocmVzdWx0SWRlbnRpZmllck5vZGUpLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuTm9kZUJ1aWxkZXJGbGFnc01hc2ssXG4gICk7XG5cbiAgaWYgKG9wdGlvbnMucHJldHRpZnkgJiYgb3B0aW9ucy5wcmV0dGlmeS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBleHBhbmRlZFR5cGVTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VHlwZUV4cHJlc3Npb24oZXhwYW5kZWRUeXBlU3RyaW5nLCBvcHRpb25zLnByZXR0aWZ5Py5vcHRpb25zKTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZSxJQUFmO0FBa0JPLElBQU0sOEJBQThCLENBQ3pDLGdCQUNBLFdBQ0EsaUJBQ0Esa0NBQ0c7QUFBQSxFQUNILE1BQU0scUJBQXFCLDBCQUFHLG1CQUFtQixtQkFBbUIsQ0FBQyxHQUFHLElBQUk7QUFBQSxFQUM1RSxNQUFNLFlBQVksaUNBQWlDLENBQUM7QUFBQSxFQUVwRCxXQUFXLE9BQU8sT0FBTyxLQUFLLFNBQVMsR0FFcEM7QUFBQSxJQUNELE1BQU0sV0FBVyxVQUFVO0FBQUEsSUFFM0IsSUFBSSxVQUFVO0FBQUEsTUFDWCxtQkFBMEQsT0FDekQ7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBTSxtQkFBbUIsbUJBQW1CO0FBQUEsRUFFNUMsbUJBQW1CLFdBQVcsQ0FBQyxhQUFhO0FBQUEsSUFDMUMsTUFBTSxXQUFXLGlCQUFpQixRQUFRO0FBQUEsSUFFMUMsSUFBSSxhQUFhLFdBQVc7QUFBQSxNQUMxQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSSxhQUFhLGdCQUFnQjtBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPLEdBQUc7QUFBQSxFQUFjO0FBQUE7QUFBQSxFQUcxQixPQUFPO0FBQUE7OztBQ3JEYyxJQUF2QjtBQUVBLElBQU0sbUJBQW1CO0FBRWxCLElBQU0sd0JBQXdCLENBQUMsbUJBQTJCO0FBQUEsRUFFL0QsT0FBTyxRQUFRLDRCQUE0QiwwQkFBMEI7QUFBQSxXQUM1RCxnQ0FBZ0M7QUFBQTtBQUFBLFdBRWhDO0FBQUEsOERBQ21ELGlDQUFpQztBQUFBLCtDQUNoRDtBQUFBLGtEQUNHLHdDQUF3QztBQUFBO0FBQUEsV0FFL0Usb0dBQW9HO0FBQUE7QUFBQTtBQUFBLFdBR3BHLG9EQUFvRCxvQ0FBb0M7QUFBQSxXQUN4RjtBQUFBLFdBQ0E7QUFBQTtBQUdKLElBQU0sdUJBQXVCLE9BQ2xDLE1BQ0Esb0JBQ0c7QUFBQSxFQUNILFFBQ0UsTUFBTSx1QkFDSixRQUFRLHNCQUFzQixRQUM5QixtQkFBbUI7QUFBQSxJQUNqQixRQUFRO0FBQUEsSUFDUixNQUFNO0FBQUEsRUFDUixDQUNGLEdBRUMsS0FBSyxFQUNMLFVBQVUsUUFBUSxzQkFBc0IsTUFBTTtBQUFBOzs7QUMvQmxDLElBQWpCO0FBRWUsSUFBZjtBQVFBLElBQU0sMkJBQTJCLENBQUMsU0FBdUM7QUFBQSxFQUN2RSxJQUFJLEtBQUssY0FBYyxLQUFLLEdBQUc7QUFBQSxJQUM3QixJQUFJLENBQUMsMkJBQUcsYUFBYSxJQUFJLEdBQUc7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFBQSxJQUlBLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPLDJCQUFHLGFBQWEsTUFBTSx3QkFBd0I7QUFBQTtBQWlFdkQsZUFBc0IsWUFBWSxDQUFDLFNBQThCO0FBQUEsRUFDL0QsSUFBSSxRQUFRLGVBQWUsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUN4QyxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsSUFBSSxnQkFBZ0IsU0FBUztBQUFBLElBQzNCLE1BQU0sZ0JBQWdCO0FBQUEsSUFFdEIsT0FBTyxhQUFhO0FBQUEsTUFDbEIsZ0JBQWdCO0FBQUEsTUFDaEIsZ0JBQWdCLFFBQVE7QUFBQSxNQUN4QiwrQkFBK0I7QUFBQSxRQUM3QixRQUFRLENBQUMsVUFBa0I7QUFBQSxVQUN6QixJQUFJLHlCQUFLLFNBQVMsUUFBUSxNQUFNLGVBQWU7QUFBQSxZQUM3QyxPQUFPLFFBQVE7QUFBQSxVQUNqQjtBQUFBLFVBRUEsT0FBTywyQkFBRyxJQUFJLFNBQVMsUUFBUTtBQUFBO0FBQUEsTUFFbkM7QUFBQSxNQUNBLG1CQUFtQixRQUFRO0FBQUEsTUFDM0IsVUFBVSxRQUFRO0FBQUEsSUFDcEIsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLE1BQU0seUJBQXlCLHlCQUFLLFFBQVEsUUFBUSxjQUFjO0FBQUEsRUFFbEUsTUFBTSxvQkFBb0IsUUFBUSxxQkFBcUI7QUFBQSxJQUNyRCxRQUFRO0FBQUEsSUFFUixrQkFBa0I7QUFBQSxJQUNsQiw4QkFBOEI7QUFBQSxJQUM5QiwwQkFBMEI7QUFBQSxJQUMxQiw0QkFBNEI7QUFBQSxJQUM1QixTQUFTO0FBQUEsRUFDWDtBQUFBLEVBRUEsSUFBSSxDQUFDLGtCQUFrQixrQkFBa0I7QUFBQSxJQUN2QyxNQUFNLElBQUksTUFBTSxtQ0FBbUM7QUFBQSxFQUNyRDtBQUFBLEVBRUEsTUFBTSxlQUFlLDRCQUNuQix3QkFDQSxzQkFBc0IsUUFBUSxjQUFjLEdBQzVDLG1CQUNBLFFBQVEsNkJBQ1Y7QUFBQSxFQUVBLE1BQU0sVUFBVSwyQkFBRyxjQUNqQixDQUFDLHNCQUFzQixHQUN2QixtQkFDQSxZQUNGO0FBQUEsRUFFQSxNQUFNLGFBQWEsUUFBUSxjQUFjLHNCQUFzQjtBQUFBLEVBQy9ELElBQUksQ0FBQyxZQUFZO0FBQUEsSUFDZixNQUFNLElBQUksTUFBTSx3QkFBd0I7QUFBQSxFQUMxQztBQUFBLEVBRUEsTUFBTSx1QkFBdUIseUJBQXlCLFVBQVU7QUFBQSxFQUNoRSxJQUFJLENBQUMsc0JBQXNCO0FBQUEsSUFDekIsTUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsRUFDbEM7QUFBQSxFQUVBLE1BQU0sY0FBYyxRQUFRLGVBQWU7QUFBQSxFQUMzQyxNQUFNLHFCQUFxQixZQUFZLGFBQ3JDLFlBQVksa0JBQWtCLG9CQUFvQixHQUNsRCxXQUNBLDJCQUFHLGdCQUFnQixvQkFDckI7QUFBQSxFQUVBLElBQUksUUFBUSxZQUFZLFFBQVEsU0FBUyxZQUFZLE9BQU87QUFBQSxJQUMxRCxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsT0FBTyxxQkFBcUIsb0JBQW9CLFFBQVEsVUFBVSxPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICJGRDYxRDk1QTFCQjNBQzdGNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/dist/index.d.ts CHANGED
@@ -1,12 +1,7 @@
1
- import ts from 'typescript';
2
- import { Options } from 'prettier';
3
-
4
- type ExtractFunctions<T, K extends keyof T = keyof T> = {
5
- [P in K]: T[P] extends (...args: any[]) => any ? T[P] : never;
6
- };
7
- type CompilerHostFunctionOverrides = Partial<ExtractFunctions<ts.CompilerHost>>;
8
-
9
- type ExpandTypeOptionsBase = {
1
+ import { type CompilerHostFunctionOverrides } from "./augmenter-compiler-host.js";
2
+ import type { Options as PrettierOptions } from "prettier";
3
+ import ts from "typescript";
4
+ export type ExpandTypeOptionsBase = {
10
5
  /**
11
6
  * The type expression to expand.
12
7
  * @example "ReturnType<typeof myFunction>"
@@ -29,27 +24,25 @@ type ExpandTypeOptionsBase = {
29
24
  * Prettier options. Don't forget to set the parser to "typescript".
30
25
  * @default { parser: "typescript", semi: false }
31
26
  */
32
- options?: Options;
27
+ options?: PrettierOptions;
33
28
  };
34
29
  /**
35
30
  * A record of functions to override in the compiler host. Useful for mocking
36
31
  */
37
32
  compilerHostFunctionOverrides?: CompilerHostFunctionOverrides;
38
33
  };
39
- type ExpandTypeFromSourceFileOptions = ExpandTypeOptionsBase & {
34
+ export type ExpandTypeFromSourceFileOptions = ExpandTypeOptionsBase & {
40
35
  /**
41
36
  * Name of the source file to evaluate the type expression in.
42
37
  */
43
38
  sourceFileName: string;
44
39
  };
45
- type ExpandTypeFromSourceTextOptions = ExpandTypeOptionsBase & {
40
+ export type ExpandTypeFromSourceTextOptions = ExpandTypeOptionsBase & {
46
41
  /**
47
42
  * TypeScript source text to evaluate the type expression in.
48
43
  */
49
44
  sourceText: string;
50
45
  };
51
- type ExpandMyTypeOptions = ExpandTypeFromSourceFileOptions | ExpandTypeFromSourceTextOptions;
52
- declare function expandMyType(options: ExpandTypeFromSourceTextOptions): Promise<string>;
53
- declare function expandMyType(options: ExpandTypeFromSourceFileOptions): Promise<string>;
54
-
55
- export { type ExpandMyTypeOptions, type ExpandTypeFromSourceFileOptions, type ExpandTypeFromSourceTextOptions, type ExpandTypeOptionsBase, expandMyType };
46
+ export type ExpandMyTypeOptions = ExpandTypeFromSourceFileOptions | ExpandTypeFromSourceTextOptions;
47
+ export declare function expandMyType(options: ExpandTypeFromSourceTextOptions): Promise<string>;
48
+ export declare function expandMyType(options: ExpandTypeFromSourceFileOptions): Promise<string>;
package/dist/index.js CHANGED
@@ -2,13 +2,17 @@
2
2
  import ts from "typescript";
3
3
  var createAugmenterCompilerHost = (sourceFileName, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
4
4
  const customCompilerHost = ts.createCompilerHost(compilerOptions ?? {}, true);
5
- for (const key of Object.keys(compilerHostFunctionOverrides ?? {})) {
6
- customCompilerHost[key] = compilerHostFunctionOverrides[key];
5
+ const overrides = compilerHostFunctionOverrides ?? {};
6
+ for (const key of Object.keys(overrides)) {
7
+ const override = overrides[key];
8
+ if (override) {
9
+ customCompilerHost[key] = override;
10
+ }
7
11
  }
8
12
  const originalReadFile = customCompilerHost.readFile;
9
13
  customCompilerHost.readFile = (fileName) => {
10
14
  const contents = originalReadFile(fileName);
11
- if (contents === void 0) {
15
+ if (contents === undefined) {
12
16
  return contents;
13
17
  }
14
18
  if (fileName !== sourceFileName) {
@@ -40,13 +44,10 @@ var createExpandCodeBlock = (typeExpression) => {
40
44
  type ${identifierPrefix}RemoveUnderscore<T extends string> = T extends \`\${infer U}_\` ? U : never;`;
41
45
  };
42
46
  var formatTypeExpression = async (code, prettierOptions) => {
43
- return (await format(
44
- `type ${identifierPrefix} = ${code}`,
45
- prettierOptions ?? {
46
- parser: "typescript",
47
- semi: false
48
- }
49
- )).trim().substring(`type ${identifierPrefix} = `.length);
47
+ return (await format(`type ${identifierPrefix} = ${code}`, prettierOptions ?? {
48
+ parser: "typescript",
49
+ semi: false
50
+ })).trim().substring(`type ${identifierPrefix} = `.length);
50
51
  };
51
52
 
52
53
  // src/index.ts
@@ -55,7 +56,7 @@ import ts2 from "typescript";
55
56
  var findResultIdentifierNode = (node) => {
56
57
  if (node.getChildCount() == 0) {
57
58
  if (!ts2.isIdentifier(node)) {
58
- return void 0;
59
+ return;
59
60
  }
60
61
  return node;
61
62
  }
@@ -94,17 +95,8 @@ async function expandMyType(options) {
94
95
  if (!tsCompilerOptions.strictNullChecks) {
95
96
  throw new Error("strictNullChecks must be enabled!");
96
97
  }
97
- const compilerHost = createAugmenterCompilerHost(
98
- resolvedSourceFileName,
99
- createExpandCodeBlock(options.typeExpression),
100
- tsCompilerOptions,
101
- options.compilerHostFunctionOverrides
102
- );
103
- const program = ts2.createProgram(
104
- [resolvedSourceFileName],
105
- tsCompilerOptions,
106
- compilerHost
107
- );
98
+ const compilerHost = createAugmenterCompilerHost(resolvedSourceFileName, createExpandCodeBlock(options.typeExpression), tsCompilerOptions, options.compilerHostFunctionOverrides);
99
+ const program = ts2.createProgram([resolvedSourceFileName], tsCompilerOptions, compilerHost);
108
100
  const sourceFile = program.getSourceFile(resolvedSourceFileName);
109
101
  if (!sourceFile) {
110
102
  throw new Error("Source file not found!");
@@ -114,11 +106,7 @@ async function expandMyType(options) {
114
106
  throw new Error("No node found!");
115
107
  }
116
108
  const typeChecker = program.getTypeChecker();
117
- const expandedTypeString = typeChecker.typeToString(
118
- typeChecker.getTypeAtLocation(resultIdentifierNode),
119
- void 0,
120
- ts2.TypeFormatFlags.NodeBuilderFlagsMask
121
- );
109
+ const expandedTypeString = typeChecker.typeToString(typeChecker.getTypeAtLocation(resultIdentifierNode), undefined, ts2.TypeFormatFlags.NodeBuilderFlagsMask);
122
110
  if (options.prettify && options.prettify.enabled === false) {
123
111
  return expandedTypeString;
124
112
  }
@@ -127,4 +115,6 @@ async function expandMyType(options) {
127
115
  export {
128
116
  expandMyType
129
117
  };
130
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgIi4uL3NyYy9jb2RlLWdlbmVyYXRvci50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG50eXBlIEV4dHJhY3RGdW5jdGlvbnM8VCwgSyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IHtcbiAgW1AgaW4gS106IFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiBuZXZlcjtcbn07XG5leHBvcnQgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA9IFBhcnRpYWw8XG4gIEV4dHJhY3RGdW5jdGlvbnM8dHMuQ29tcGlsZXJIb3N0PlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCBhdWdtZW50cyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlIGZvciBleHBhbmRpbmcgYSB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGF1Z21lbnQuXG4gKiBAcGFyYW0gY29kZVRvQWRkIFR5cGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjb21waWxlck9wdGlvbnMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICogQHBhcmFtIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nLlxuICogQHJldHVybnMgQSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IHJldHVybnMgYW4gYXVnbWVudGVkIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwYW5kIHRoZSB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgPSAoXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmcsXG4gIGNvZGVUb0FkZDogc3RyaW5nLFxuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnMsXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4pID0+IHtcbiAgY29uc3QgY3VzdG9tQ29tcGlsZXJIb3N0ID0gdHMuY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucyA/PyB7fSwgdHJ1ZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID8/IHt9KSkge1xuICAgIGN1c3RvbUNvbXBpbGVySG9zdFtrZXldID0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMhW2tleV07XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcblxuY29uc3QgaWRlbnRpZmllclByZWZpeCA9IFwiX19FWFBBTkRfTVlfVFlQRV9fXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVFeHBhbmRDb2RlQmxvY2sgPSAodHlwZUV4cHJlc3Npb246IHN0cmluZykgPT4ge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi9tYWluL3Rlc3RzL2Nhc2VzL2NvbXBpbGVyL2NvbXB1dGVkVHlwZXNLZXlvZk5vSW5kZXhTaWduYXR1cmVUeXBlLnRzXG4gIHJldHVybiBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVzdWx0ID0gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDwke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbiA9ICR7dHlwZUV4cHJlc3Npb259O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQ+ID0gXG4gICAgICAgIFQgZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiA/ICguLi5hcmdzOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPEE+KSA9PiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFI+XG4gICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFU+ID8gUHJvbWlzZTwke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFU+PlxuICAgICAgOiB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgc3RyaW5nID8gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUW0tdPiA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VFtLXT47IH0gJiB7fTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxUPiA9IFtUICYge31dIGV4dGVuZHMgW25ldmVyXSA/IFQgOiBUICYge30gZXh0ZW5kcyB2b2lkID8gVCA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VCAmIHt9PjtcblxuICAgIC8vIEZvcmNlcyBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFsIHR5cGVzIHRvIGJlIGV4cGFuZGVkXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0gJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8JHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VD4+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBcXGBcXCR7VH1fXFxgIGV4dGVuZHMgc3RyaW5nID8gXFxgXFwke1R9X1xcYCA6IG5ldmVyO1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBUIGV4dGVuZHMgXFxgXFwke2luZmVyIFV9X1xcYCA/IFUgOiBuZXZlcjtgO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFR5cGVFeHByZXNzaW9uID0gYXN5bmMgKFxuICBjb2RlOiBzdHJpbmcsXG4gIHByZXR0aWVyT3B0aW9ucz86IFByZXR0aWVyT3B0aW9ucyxcbikgPT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IGZvcm1hdChcbiAgICAgIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSAke2NvZGV9YCxcbiAgICAgIHByZXR0aWVyT3B0aW9ucyA/PyB7XG4gICAgICAgIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIHNlbWk6IGZhbHNlLFxuICAgICAgfSxcbiAgICApXG4gIClcbiAgICAudHJpbSgpXG4gICAgLnN1YnN0cmluZyhgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gYC5sZW5ndGgpO1xufTtcbiIsICJpbXBvcnQgeyBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgfSBmcm9tIFwiLi9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50c1wiO1xuaW1wb3J0IHsgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBhbmRDb2RlQmxvY2ssXG4gIGZvcm1hdFR5cGVFeHByZXNzaW9uLFxufSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvci50c1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFByZXR0aWVyT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdoaWNoIHR5cGUgdHlwZSBzaG91bGQgYmUgc2VhcmNoZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICovXG5jb25zdCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUgPSAobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMCkge1xuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIHdlIHB1dCB0aGUgX188SURFTlRJRklFUj5fXyB0eXBlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gICAgLy8gZmlsZSwgd2UgY2FuIHJldHVybiB0aGUgZmlyc3QgaWRlbnRpZmllciB3ZSBmaW5kLlxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIHRzLmZvckVhY2hDaGlsZChub2RlLCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUpO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZU9wdGlvbnNCYXNlID0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgZXhwcmVzc2lvbiB0byBleHBhbmQuXG4gICAqIEBleGFtcGxlIFwiUmV0dXJuVHlwZTx0eXBlb2YgbXlGdW5jdGlvbj5cIlxuICAgKi9cbiAgdHlwZUV4cHJlc3Npb246IHN0cmluZztcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgdHNDb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFByZXR0aWVyIG9wdGlvbnMuXG4gICAqL1xuICBwcmV0dGlmeT86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHByZXR0aWZ5IHRoZSBvdXRwdXQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFByZXR0aWVyIG9wdGlvbnMuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHBhcnNlciB0byBcInR5cGVzY3JpcHRcIi5cbiAgICAgKiBAZGVmYXVsdCB7IHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsIHNlbWk6IGZhbHNlIH1cbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJldHRpZXJPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZ1xuICAgKi9cbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgc291cmNlIHRleHQgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZVRleHQ6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRNeVR5cGVPcHRpb25zID1cbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zXG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogRXhwYW5kcyBhIFR5cGVTY3JpcHQgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZXhwYW5kZWQgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKG9wdGlvbnM6IEV4cGFuZE15VHlwZU9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZUV4cHJlc3Npb24udHJpbSgpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwibmV2ZXJcIjtcbiAgfVxuXG4gIGlmIChcInNvdXJjZVRleHRcIiBpbiBvcHRpb25zKSB7XG4gICAgY29uc3QgZHVtbXlGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUtZHVtbXkudHNcIjtcblxuICAgIHJldHVybiBleHBhbmRNeVR5cGUoe1xuICAgICAgc291cmNlRmlsZU5hbWU6IGR1bW15RmlsZU5hbWUsXG4gICAgICB0eXBlRXhwcmVzc2lvbjogb3B0aW9ucy50eXBlRXhwcmVzc2lvbixcbiAgICAgIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHJlYWRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAocGF0aC5iYXNlbmFtZShmaWxlTmFtZSkgPT09IGR1bW15RmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNvdXJjZVRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRzLnN5cy5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHNDb21waWxlck9wdGlvbnM6IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMsXG4gICAgICBwcmV0dGlmeTogb3B0aW9ucy5wcmV0dGlmeSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkU291cmNlRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5zb3VyY2VGaWxlTmFtZSk7XG5cbiAgY29uc3QgdHNDb21waWxlck9wdGlvbnMgPSBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zID8/IHtcbiAgICBub0VtaXQ6IHRydWUsXG5cbiAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgYWxsb3dBcmJpdHJhcnlFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SnM6IHRydWUsXG4gIH07XG5cbiAgaWYgKCF0c0NvbXBpbGVyT3B0aW9ucy5zdHJpY3ROdWxsQ2hlY2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RyaWN0TnVsbENoZWNrcyBtdXN0IGJlIGVuYWJsZWQhXCIpO1xuICB9XG5cbiAgY29uc3QgY29tcGlsZXJIb3N0ID0gY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0KFxuICAgIHJlc29sdmVkU291cmNlRmlsZU5hbWUsXG4gICAgY3JlYXRlRXhwYW5kQ29kZUJsb2NrKG9wdGlvbnMudHlwZUV4cHJlc3Npb24pLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIG9wdGlvbnMuY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4gICk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgW3Jlc29sdmVkU291cmNlRmlsZU5hbWVdLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIGNvbXBpbGVySG9zdCxcbiAgKTtcblxuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVkU291cmNlRmlsZU5hbWUpO1xuICBpZiAoIXNvdXJjZUZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZmlsZSBub3QgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0SWRlbnRpZmllck5vZGUgPSBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUoc291cmNlRmlsZSk7XG4gIGlmICghcmVzdWx0SWRlbnRpZmllck5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBleHBhbmRlZFR5cGVTdHJpbmcgPSB0eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoXG4gICAgdHlwZUNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24ocmVzdWx0SWRlbnRpZmllck5vZGUpLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuTm9kZUJ1aWxkZXJGbGFnc01hc2ssXG4gICk7XG5cbiAgaWYgKG9wdGlvbnMucHJldHRpZnkgJiYgb3B0aW9ucy5wcmV0dGlmeS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBleHBhbmRlZFR5cGVTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VHlwZUV4cHJlc3Npb24oZXhwYW5kZWRUeXBlU3RyaW5nLCBvcHRpb25zLnByZXR0aWZ5Py5vcHRpb25zKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxPQUFPLFFBQVE7QUFrQlIsSUFBTSw4QkFBOEIsQ0FDekMsZ0JBQ0EsV0FDQSxpQkFDQSxrQ0FDRztBQUNILFFBQU0scUJBQXFCLEdBQUcsbUJBQW1CLG1CQUFtQixDQUFDLEdBQUcsSUFBSTtBQUM1RSxhQUFXLE9BQU8sT0FBTyxLQUFLLGlDQUFpQyxDQUFDLENBQUMsR0FBRztBQUNsRSx1QkFBbUIsR0FBRyxJQUFJLDhCQUErQixHQUFHO0FBQUEsRUFDOUQ7QUFFQSxRQUFNLG1CQUFtQixtQkFBbUI7QUFFNUMscUJBQW1CLFdBQVcsQ0FBQyxhQUFhO0FBQzFDLFVBQU0sV0FBVyxpQkFBaUIsUUFBUTtBQUUxQyxRQUFJLGFBQWEsUUFBVztBQUMxQixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksYUFBYSxnQkFBZ0I7QUFDL0IsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLEdBQUcsU0FBUztBQUFBLEVBQUssUUFBUTtBQUFBLEVBQ2xDO0FBRUEsU0FBTztBQUNUOzs7QUM3Q0EsU0FBUyxjQUFjO0FBRXZCLElBQU0sbUJBQW1CO0FBRWxCLElBQU0sd0JBQXdCLENBQUMsbUJBQTJCO0FBRS9ELFNBQU8sUUFBUSxnQkFBZ0IsWUFBWSxnQkFBZ0IsVUFBVSxnQkFBZ0I7QUFBQSxXQUM1RSxnQkFBZ0IsZ0JBQWdCLGNBQWM7QUFBQTtBQUFBLFdBRTlDLGdCQUFnQjtBQUFBLDhEQUNtQyxnQkFBZ0IsaUJBQWlCLGdCQUFnQjtBQUFBLCtDQUNoRSxnQkFBZ0I7QUFBQSxr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
118
+
119
+ //# debugId=FA40E2FF4FF7499A64756E2164756E21
120
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgIi4uL3NyYy9jb2RlLWdlbmVyYXRvci50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0ge1xuICBbUCBpbiBLXTogVFtQXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtQXSA6IG5ldmVyO1xufTtcbmV4cG9ydCB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID0gUGFydGlhbDxcbiAgRXh0cmFjdEZ1bmN0aW9uczx0cy5Db21waWxlckhvc3Q+XG4+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IGF1Z21lbnRzIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUgZm9yIGV4cGFuZGluZyBhIHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gYXVnbWVudC5cbiAqIEBwYXJhbSBjb2RlVG9BZGQgVHlwZSBleHByZXNzaW9uLlxuICogQHBhcmFtIGNvbXBpbGVyT3B0aW9ucyBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gKiBAcGFyYW0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgQSByZWNvcmQgb2YgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGluIHRoZSBjb21waWxlciBob3N0LiBVc2VmdWwgZm9yIG1vY2tpbmcuXG4gKiBAcmV0dXJucyBBIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgcmV0dXJucyBhbiBhdWdtZW50ZWQgc291cmNlIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBleHBhbmQgdGhlIHR5cGUgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCA9IChcbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZyxcbiAgY29kZVRvQWRkOiBzdHJpbmcsXG4gIGNvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucyxcbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbikgPT4ge1xuICBjb25zdCBjdXN0b21Db21waWxlckhvc3QgPSB0cy5jcmVhdGVDb21waWxlckhvc3QoY29tcGlsZXJPcHRpb25zID8/IHt9LCB0cnVlKTtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPz8ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3ZlcnJpZGVzKSBhcyBBcnJheTxcbiAgICBrZXlvZiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlc1xuICA+KSB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXNba2V5XTtcblxuICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgKGN1c3RvbUNvbXBpbGVySG9zdCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID1cbiAgICAgICAgb3ZlcnJpZGU7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxSZWFkRmlsZSA9IGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZTtcblxuICBjdXN0b21Db21waWxlckhvc3QucmVhZEZpbGUgPSAoZmlsZU5hbWUpID0+IHtcbiAgICBjb25zdCBjb250ZW50cyA9IG9yaWdpbmFsUmVhZEZpbGUoZmlsZU5hbWUpO1xuXG4gICAgaWYgKGNvbnRlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICBpZiAoZmlsZU5hbWUgIT09IHNvdXJjZUZpbGVOYW1lKSB7XG4gICAgICByZXR1cm4gY29udGVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2NvZGVUb0FkZH1cXG4ke2NvbnRlbnRzfWA7XG4gIH07XG5cbiAgcmV0dXJuIGN1c3RvbUNvbXBpbGVySG9zdDtcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBQcmV0dGllck9wdGlvbnMgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJwcmV0dGllclwiO1xuXG5jb25zdCBpZGVudGlmaWVyUHJlZml4ID0gXCJfX0VYUEFORF9NWV9UWVBFX19cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGFuZENvZGVCbG9jayA9ICh0eXBlRXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21haW4vdGVzdHMvY2FzZXMvY29tcGlsZXIvY29tcHV0ZWRUeXBlc0tleW9mTm9JbmRleFNpZ25hdHVyZVR5cGUudHNcbiAgcmV0dXJuIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZXN1bHQgPSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPCR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uPjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uID0gJHt0eXBlRXhwcmVzc2lvbn07XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VD4gPSBcbiAgICAgICAgVCBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8QT4pID0+ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8Uj5cbiAgICAgIDogVCBleHRlbmRzIFByb21pc2U8aW5mZXIgVT4gPyBQcm9taXNlPCR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VT4+XG4gICAgICA6IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBzdHJpbmcgPyAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFRbS10+IDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUW0tdPjsgfSAmIHt9O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFQ+ID0gW1QgJiB7fV0gZXh0ZW5kcyBbbmV2ZXJdID8gVCA6IFQgJiB7fSBleHRlbmRzIHZvaWQgPyBUIDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUICYge30+O1xuXG4gICAgLy8gRm9yY2VzIGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWwgdHlwZXMgdG8gYmUgZXhwYW5kZWRcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VCBleHRlbmRzIHN0cmluZz4gPSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTwke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUPj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFxcYFxcJHtUfV9cXGAgZXh0ZW5kcyBzdHJpbmcgPyBcXGBcXCR7VH1fXFxgIDogbmV2ZXI7XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFQgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgVX1fXFxgID8gVSA6IG5ldmVyO2A7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VHlwZUV4cHJlc3Npb24gPSBhc3luYyAoXG4gIGNvZGU6IHN0cmluZyxcbiAgcHJldHRpZXJPcHRpb25zPzogUHJldHRpZXJPcHRpb25zLFxuKSA9PiB7XG4gIHJldHVybiAoXG4gICAgYXdhaXQgZm9ybWF0KFxuICAgICAgYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fSA9ICR7Y29kZX1gLFxuICAgICAgcHJldHRpZXJPcHRpb25zID8/IHtcbiAgICAgICAgcGFyc2VyOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgc2VtaTogZmFsc2UsXG4gICAgICB9LFxuICAgIClcbiAgKVxuICAgIC50cmltKClcbiAgICAuc3Vic3RyaW5nKGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSBgLmxlbmd0aCk7XG59O1xuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgfSBmcm9tIFwiLi9hdWdtZW50ZXItY29tcGlsZXItaG9zdC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBhbmRDb2RlQmxvY2ssXG4gIGZvcm1hdFR5cGVFeHByZXNzaW9uLFxufSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvci5qc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFByZXR0aWVyT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdoaWNoIHR5cGUgdHlwZSBzaG91bGQgYmUgc2VhcmNoZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICovXG5jb25zdCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUgPSAobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMCkge1xuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIHdlIHB1dCB0aGUgX188SURFTlRJRklFUj5fXyB0eXBlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gICAgLy8gZmlsZSwgd2UgY2FuIHJldHVybiB0aGUgZmlyc3QgaWRlbnRpZmllciB3ZSBmaW5kLlxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIHRzLmZvckVhY2hDaGlsZChub2RlLCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUpO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZU9wdGlvbnNCYXNlID0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgZXhwcmVzc2lvbiB0byBleHBhbmQuXG4gICAqIEBleGFtcGxlIFwiUmV0dXJuVHlwZTx0eXBlb2YgbXlGdW5jdGlvbj5cIlxuICAgKi9cbiAgdHlwZUV4cHJlc3Npb246IHN0cmluZztcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgdHNDb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFByZXR0aWVyIG9wdGlvbnMuXG4gICAqL1xuICBwcmV0dGlmeT86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHByZXR0aWZ5IHRoZSBvdXRwdXQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFByZXR0aWVyIG9wdGlvbnMuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHBhcnNlciB0byBcInR5cGVzY3JpcHRcIi5cbiAgICAgKiBAZGVmYXVsdCB7IHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsIHNlbWk6IGZhbHNlIH1cbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJldHRpZXJPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZ1xuICAgKi9cbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgc291cmNlIHRleHQgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZVRleHQ6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRNeVR5cGVPcHRpb25zID1cbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zXG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogRXhwYW5kcyBhIFR5cGVTY3JpcHQgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZXhwYW5kZWQgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKG9wdGlvbnM6IEV4cGFuZE15VHlwZU9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZUV4cHJlc3Npb24udHJpbSgpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwibmV2ZXJcIjtcbiAgfVxuXG4gIGlmIChcInNvdXJjZVRleHRcIiBpbiBvcHRpb25zKSB7XG4gICAgY29uc3QgZHVtbXlGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUtZHVtbXkudHNcIjtcblxuICAgIHJldHVybiBleHBhbmRNeVR5cGUoe1xuICAgICAgc291cmNlRmlsZU5hbWU6IGR1bW15RmlsZU5hbWUsXG4gICAgICB0eXBlRXhwcmVzc2lvbjogb3B0aW9ucy50eXBlRXhwcmVzc2lvbixcbiAgICAgIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHJlYWRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAocGF0aC5iYXNlbmFtZShmaWxlTmFtZSkgPT09IGR1bW15RmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNvdXJjZVRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRzLnN5cy5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHNDb21waWxlck9wdGlvbnM6IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMsXG4gICAgICBwcmV0dGlmeTogb3B0aW9ucy5wcmV0dGlmeSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkU291cmNlRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5zb3VyY2VGaWxlTmFtZSk7XG5cbiAgY29uc3QgdHNDb21waWxlck9wdGlvbnMgPSBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zID8/IHtcbiAgICBub0VtaXQ6IHRydWUsXG5cbiAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgYWxsb3dBcmJpdHJhcnlFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SnM6IHRydWUsXG4gIH07XG5cbiAgaWYgKCF0c0NvbXBpbGVyT3B0aW9ucy5zdHJpY3ROdWxsQ2hlY2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RyaWN0TnVsbENoZWNrcyBtdXN0IGJlIGVuYWJsZWQhXCIpO1xuICB9XG5cbiAgY29uc3QgY29tcGlsZXJIb3N0ID0gY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0KFxuICAgIHJlc29sdmVkU291cmNlRmlsZU5hbWUsXG4gICAgY3JlYXRlRXhwYW5kQ29kZUJsb2NrKG9wdGlvbnMudHlwZUV4cHJlc3Npb24pLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIG9wdGlvbnMuY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4gICk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgW3Jlc29sdmVkU291cmNlRmlsZU5hbWVdLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIGNvbXBpbGVySG9zdCxcbiAgKTtcblxuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVkU291cmNlRmlsZU5hbWUpO1xuICBpZiAoIXNvdXJjZUZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZmlsZSBub3QgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0SWRlbnRpZmllck5vZGUgPSBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUoc291cmNlRmlsZSk7XG4gIGlmICghcmVzdWx0SWRlbnRpZmllck5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBleHBhbmRlZFR5cGVTdHJpbmcgPSB0eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoXG4gICAgdHlwZUNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24ocmVzdWx0SWRlbnRpZmllck5vZGUpLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuTm9kZUJ1aWxkZXJGbGFnc01hc2ssXG4gICk7XG5cbiAgaWYgKG9wdGlvbnMucHJldHRpZnkgJiYgb3B0aW9ucy5wcmV0dGlmeS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBleHBhbmRlZFR5cGVTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VHlwZUV4cHJlc3Npb24oZXhwYW5kZWRUeXBlU3RyaW5nLCBvcHRpb25zLnByZXR0aWZ5Py5vcHRpb25zKTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQWtCTyxJQUFNLDhCQUE4QixDQUN6QyxnQkFDQSxXQUNBLGlCQUNBLGtDQUNHO0FBQUEsRUFDSCxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixtQkFBbUIsQ0FBQyxHQUFHLElBQUk7QUFBQSxFQUM1RSxNQUFNLFlBQVksaUNBQWlDLENBQUM7QUFBQSxFQUVwRCxXQUFXLE9BQU8sT0FBTyxLQUFLLFNBQVMsR0FFcEM7QUFBQSxJQUNELE1BQU0sV0FBVyxVQUFVO0FBQUEsSUFFM0IsSUFBSSxVQUFVO0FBQUEsTUFDWCxtQkFBMEQsT0FDekQ7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBTSxtQkFBbUIsbUJBQW1CO0FBQUEsRUFFNUMsbUJBQW1CLFdBQVcsQ0FBQyxhQUFhO0FBQUEsSUFDMUMsTUFBTSxXQUFXLGlCQUFpQixRQUFRO0FBQUEsSUFFMUMsSUFBSSxhQUFhLFdBQVc7QUFBQSxNQUMxQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSSxhQUFhLGdCQUFnQjtBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPLEdBQUc7QUFBQSxFQUFjO0FBQUE7QUFBQSxFQUcxQixPQUFPO0FBQUE7OztBQ3JEVDtBQUVBLElBQU0sbUJBQW1CO0FBRWxCLElBQU0sd0JBQXdCLENBQUMsbUJBQTJCO0FBQUEsRUFFL0QsT0FBTyxRQUFRLDRCQUE0QiwwQkFBMEI7QUFBQSxXQUM1RCxnQ0FBZ0M7QUFBQTtBQUFBLFdBRWhDO0FBQUEsOERBQ21ELGlDQUFpQztBQUFBLCtDQUNoRDtBQUFBLGtEQUNHLHdDQUF3QztBQUFBO0FBQUEsV0FFL0Usb0dBQW9HO0FBQUE7QUFBQTtBQUFBLFdBR3BHLG9EQUFvRCxvQ0FBb0M7QUFBQSxXQUN4RjtBQUFBLFdBQ0E7QUFBQTtBQUdKLElBQU0sdUJBQXVCLE9BQ2xDLE1BQ0Esb0JBQ0c7QUFBQSxFQUNILFFBQ0UsTUFBTSxPQUNKLFFBQVEsc0JBQXNCLFFBQzlCLG1CQUFtQjtBQUFBLElBQ2pCLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxFQUNSLENBQ0YsR0FFQyxLQUFLLEVBQ0wsVUFBVSxRQUFRLHNCQUFzQixNQUFNO0FBQUE7OztBQy9CbkQ7QUFFQTtBQVFBLElBQU0sMkJBQTJCLENBQUMsU0FBdUM7QUFBQSxFQUN2RSxJQUFJLEtBQUssY0FBYyxLQUFLLEdBQUc7QUFBQSxJQUM3QixJQUFJLENBQUMsSUFBRyxhQUFhLElBQUksR0FBRztBQUFBLE1BQzFCO0FBQUEsSUFDRjtBQUFBLElBSUEsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE9BQU8sSUFBRyxhQUFhLE1BQU0sd0JBQXdCO0FBQUE7QUFpRXZELGVBQXNCLFlBQVksQ0FBQyxTQUE4QjtBQUFBLEVBQy9ELElBQUksUUFBUSxlQUFlLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFDeEMsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLElBQUksZ0JBQWdCLFNBQVM7QUFBQSxJQUMzQixNQUFNLGdCQUFnQjtBQUFBLElBRXRCLE9BQU8sYUFBYTtBQUFBLE1BQ2xCLGdCQUFnQjtBQUFBLE1BQ2hCLGdCQUFnQixRQUFRO0FBQUEsTUFDeEIsK0JBQStCO0FBQUEsUUFDN0IsUUFBUSxDQUFDLFVBQWtCO0FBQUEsVUFDekIsSUFBSSxLQUFLLFNBQVMsUUFBUSxNQUFNLGVBQWU7QUFBQSxZQUM3QyxPQUFPLFFBQVE7QUFBQSxVQUNqQjtBQUFBLFVBRUEsT0FBTyxJQUFHLElBQUksU0FBUyxRQUFRO0FBQUE7QUFBQSxNQUVuQztBQUFBLE1BQ0EsbUJBQW1CLFFBQVE7QUFBQSxNQUMzQixVQUFVLFFBQVE7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsTUFBTSx5QkFBeUIsS0FBSyxRQUFRLFFBQVEsY0FBYztBQUFBLEVBRWxFLE1BQU0sb0JBQW9CLFFBQVEscUJBQXFCO0FBQUEsSUFDckQsUUFBUTtBQUFBLElBRVIsa0JBQWtCO0FBQUEsSUFDbEIsOEJBQThCO0FBQUEsSUFDOUIsMEJBQTBCO0FBQUEsSUFDMUIsNEJBQTRCO0FBQUEsSUFDNUIsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUVBLElBQUksQ0FBQyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDdkMsTUFBTSxJQUFJLE1BQU0sbUNBQW1DO0FBQUEsRUFDckQ7QUFBQSxFQUVBLE1BQU0sZUFBZSw0QkFDbkIsd0JBQ0Esc0JBQXNCLFFBQVEsY0FBYyxHQUM1QyxtQkFDQSxRQUFRLDZCQUNWO0FBQUEsRUFFQSxNQUFNLFVBQVUsSUFBRyxjQUNqQixDQUFDLHNCQUFzQixHQUN2QixtQkFDQSxZQUNGO0FBQUEsRUFFQSxNQUFNLGFBQWEsUUFBUSxjQUFjLHNCQUFzQjtBQUFBLEVBQy9ELElBQUksQ0FBQyxZQUFZO0FBQUEsSUFDZixNQUFNLElBQUksTUFBTSx3QkFBd0I7QUFBQSxFQUMxQztBQUFBLEVBRUEsTUFBTSx1QkFBdUIseUJBQXlCLFVBQVU7QUFBQSxFQUNoRSxJQUFJLENBQUMsc0JBQXNCO0FBQUEsSUFDekIsTUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsRUFDbEM7QUFBQSxFQUVBLE1BQU0sY0FBYyxRQUFRLGVBQWU7QUFBQSxFQUMzQyxNQUFNLHFCQUFxQixZQUFZLGFBQ3JDLFlBQVksa0JBQWtCLG9CQUFvQixHQUNsRCxXQUNBLElBQUcsZ0JBQWdCLG9CQUNyQjtBQUFBLEVBRUEsSUFBSSxRQUFRLFlBQVksUUFBUSxTQUFTLFlBQVksT0FBTztBQUFBLElBQzFELE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPLHFCQUFxQixvQkFBb0IsUUFBUSxVQUFVLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIkZBNDBFMkZGNEZGNzQ5OUE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expand-my-type",
3
- "version": "0.6.7",
3
+ "version": "0.7.0",
4
4
  "description": "Expand TypeScript type expressions programmatically",
5
5
  "keywords": [
6
6
  "expand",
@@ -20,14 +20,9 @@
20
20
  "type": "module",
21
21
  "exports": {
22
22
  ".": {
23
- "require": {
24
- "default": "./dist/index.cjs",
25
- "types": "./dist/index.d.cts"
26
- },
27
- "import": {
28
- "default": "./dist/index.js",
29
- "types": "./dist/index.d.ts"
30
- }
23
+ "types": "./dist/index.d.ts",
24
+ "require": "./dist/index.cjs",
25
+ "import": "./dist/index.js"
31
26
  }
32
27
  },
33
28
  "main": "dist/index.cjs",
@@ -36,30 +31,28 @@
36
31
  "expand-my-type": "./dist/cli.js"
37
32
  },
38
33
  "files": [
39
- "dist/index.cjs",
40
- "dist/index.d.cts",
41
- "dist/index.d.ts",
42
- "dist/index.js",
43
- "dist/cli.js"
34
+ "dist"
44
35
  ],
45
36
  "scripts": {
46
- "bundle-cli": "tsup ./src/cli.ts --format esm --sourcemap inline --silent",
47
- "bundle-lib": "tsup ./src/index.ts --format cjs,esm --dts --clean --sourcemap inline --silent",
37
+ "build": "bun run clean && bun run build:esm && bun run build:cjs && bun run build:types",
38
+ "build:cjs": "bun build ./src/index.ts --target node --format cjs --packages external --outfile ./dist/index.cjs --sourcemap=inline",
39
+ "build:esm": "bun build ./src/index.ts ./src/cli.ts --target node --format esm --packages external --outdir ./dist --root ./src --sourcemap=inline",
40
+ "build:types": "tsc -p tsconfig.build.json",
41
+ "check": "bun run typecheck && bun test ./src/index.test.ts",
42
+ "clean": "rm -rf dist",
43
+ "deps:update": "bun update --latest",
48
44
  "format": "prettier --write .",
49
- "prepare": "npm run bundle-lib && npm run bundle-cli",
50
- "pretest": "tsc",
51
- "test": "tsx --test --test-reporter spec ./src/index.test.ts"
45
+ "test": "bun test ./src/index.test.ts",
46
+ "typecheck": "tsc --noEmit"
52
47
  },
53
48
  "dependencies": {
54
- "prettier": "^3.3.3",
55
- "typescript": "^5.6.3"
49
+ "prettier": "^3.8.1",
50
+ "typescript": "^6.0.2"
56
51
  },
57
52
  "devDependencies": {
58
- "@trivago/prettier-plugin-sort-imports": "^4.3.0",
59
- "@types/node": "^22.5.5",
60
- "npm-check-updates": "^17.1.1",
61
- "prettier-plugin-packagejson": "^2.5.2",
62
- "tsup": "^8.2.4",
63
- "tsx": "^4.19.1"
64
- }
53
+ "@trivago/prettier-plugin-sort-imports": "^6.0.2",
54
+ "@types/node": "^22.19.11",
55
+ "prettier-plugin-packagejson": "^2.5.22"
56
+ },
57
+ "packageManager": "bun@1.3.11"
65
58
  }
package/dist/index.d.cts DELETED
@@ -1,55 +0,0 @@
1
- import ts from 'typescript';
2
- import { Options } from 'prettier';
3
-
4
- type ExtractFunctions<T, K extends keyof T = keyof T> = {
5
- [P in K]: T[P] extends (...args: any[]) => any ? T[P] : never;
6
- };
7
- type CompilerHostFunctionOverrides = Partial<ExtractFunctions<ts.CompilerHost>>;
8
-
9
- type ExpandTypeOptionsBase = {
10
- /**
11
- * The type expression to expand.
12
- * @example "ReturnType<typeof myFunction>"
13
- */
14
- typeExpression: string;
15
- /**
16
- * TypeScript compiler options.
17
- */
18
- tsCompilerOptions?: ts.CompilerOptions;
19
- /**
20
- * Prettier options.
21
- */
22
- prettify?: {
23
- /**
24
- * Whether to prettify the output.
25
- * @default true
26
- */
27
- enabled?: boolean;
28
- /**
29
- * Prettier options. Don't forget to set the parser to "typescript".
30
- * @default { parser: "typescript", semi: false }
31
- */
32
- options?: Options;
33
- };
34
- /**
35
- * A record of functions to override in the compiler host. Useful for mocking
36
- */
37
- compilerHostFunctionOverrides?: CompilerHostFunctionOverrides;
38
- };
39
- type ExpandTypeFromSourceFileOptions = ExpandTypeOptionsBase & {
40
- /**
41
- * Name of the source file to evaluate the type expression in.
42
- */
43
- sourceFileName: string;
44
- };
45
- type ExpandTypeFromSourceTextOptions = ExpandTypeOptionsBase & {
46
- /**
47
- * TypeScript source text to evaluate the type expression in.
48
- */
49
- sourceText: string;
50
- };
51
- type ExpandMyTypeOptions = ExpandTypeFromSourceFileOptions | ExpandTypeFromSourceTextOptions;
52
- declare function expandMyType(options: ExpandTypeFromSourceTextOptions): Promise<string>;
53
- declare function expandMyType(options: ExpandTypeFromSourceFileOptions): Promise<string>;
54
-
55
- export { type ExpandMyTypeOptions, type ExpandTypeFromSourceFileOptions, type ExpandTypeFromSourceTextOptions, type ExpandTypeOptionsBase, expandMyType };