@nlabs/lex 1.47.2 → 1.48.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/.gitattributes +1 -0
- package/.storybook/main.ts +86 -0
- package/.storybook/preview.ts +15 -0
- package/.vscode/settings.json +83 -0
- package/CHANGELOG.md +1 -0
- package/TYPESCRIPT_CONFIGS.md +103 -0
- package/__mocks__/LexConfig.js +17 -2
- package/__mocks__/execa.js +9 -7
- package/__mocks__/file.js +50 -0
- package/__mocks__/ora.js +10 -1
- package/config.json +33 -0
- package/dist/LexConfig.js +93 -5
- package/dist/commands/ai/ai.js +1 -1
- package/dist/commands/build/build.js +15 -11
- package/dist/commands/clean/clean.js +10 -4
- package/dist/commands/compile/compile.js +29 -34
- package/dist/commands/create/create.js +5 -5
- package/dist/commands/dev/dev.js +11 -7
- package/dist/commands/init/init.js +5 -5
- package/dist/commands/lint/lint.js +55 -64
- package/dist/commands/migrate/migrate.js +2 -2
- package/dist/commands/storybook/storybook.js +174 -0
- package/dist/commands/test/test.js +51 -13
- package/dist/commands/update/update.js +3 -2
- package/dist/commands/upgrade/upgrade.js +3 -3
- package/dist/commands/versions/versions.js +3 -3
- package/dist/create/changelog.js +1 -1
- package/dist/dist/LexConfig.d.ts +119 -0
- package/dist/dist/utils/file.d.ts +7 -0
- package/dist/dist/utils/log.d.ts +1 -0
- package/dist/index.js +4 -3
- package/dist/lex.js +14 -1
- package/dist/utils/aiService.js +2 -2
- package/dist/utils/app.js +3 -3
- package/dist/utils/file.js +78 -4
- package/eslint.config.js +5 -3
- package/examples/lex.config.js +50 -0
- package/jest.config.cjs +14 -14
- package/jest.setup.js +30 -4
- package/package.json +40 -23
- package/tsconfig.build.json +38 -5
- package/tsconfig.json +28 -1
- package/tsconfig.lint.json +44 -0
- package/tsconfig.test.json +48 -0
- package/webpack.config.js +14 -13
- package/dist/LexConfig.d.ts +0 -79
- package/dist/commands/ai/ai.d.ts +0 -17
- package/dist/commands/ai/index.d.ts +0 -8
- package/dist/commands/build/build.cli.test.d.ts +0 -5
- package/dist/commands/build/build.d.ts +0 -18
- package/dist/commands/build/build.integration.test.d.ts +0 -1
- package/dist/commands/build/build.options.test.d.ts +0 -5
- package/dist/commands/clean/clean.cli.test.d.ts +0 -1
- package/dist/commands/clean/clean.d.ts +0 -7
- package/dist/commands/clean/clean.integration.test.d.ts +0 -1
- package/dist/commands/clean/clean.options.test.d.ts +0 -1
- package/dist/commands/compile/compile.cli.test.d.ts +0 -1
- package/dist/commands/compile/compile.d.ts +0 -2
- package/dist/commands/compile/compile.integration.test.d.ts +0 -1
- package/dist/commands/compile/compile.options.test.d.ts +0 -1
- package/dist/commands/config/config.cli.test.d.ts +0 -1
- package/dist/commands/config/config.d.ts +0 -7
- package/dist/commands/config/config.integration.test.d.ts +0 -1
- package/dist/commands/config/config.options.test.d.ts +0 -1
- package/dist/commands/copy/copy.cli.test.d.ts +0 -1
- package/dist/commands/copy/copy.d.ts +0 -6
- package/dist/commands/copy/copy.integration.test.d.ts +0 -1
- package/dist/commands/copy/copy.options.test.d.ts +0 -1
- package/dist/commands/create/create.cli.test.d.ts +0 -1
- package/dist/commands/create/create.d.ts +0 -8
- package/dist/commands/create/create.integration.test.d.ts +0 -1
- package/dist/commands/create/create.options.test.d.ts +0 -1
- package/dist/commands/dev/dev.cli.test.d.ts +0 -1
- package/dist/commands/dev/dev.d.ts +0 -11
- package/dist/commands/dev/dev.integration.test.d.ts +0 -1
- package/dist/commands/dev/dev.options.test.d.ts +0 -1
- package/dist/commands/init/init.cli.test.d.ts +0 -1
- package/dist/commands/init/init.d.ts +0 -9
- package/dist/commands/init/init.integration.test.d.ts +0 -1
- package/dist/commands/init/init.options.test.d.ts +0 -1
- package/dist/commands/link/link.cli.test.d.ts +0 -1
- package/dist/commands/link/link.d.ts +0 -6
- package/dist/commands/link/link.integration.test.d.ts +0 -1
- package/dist/commands/link/link.options.test.d.ts +0 -1
- package/dist/commands/lint/autofix.d.ts +0 -2
- package/dist/commands/lint/lint.cli.test.d.ts +0 -1
- package/dist/commands/lint/lint.d.ts +0 -39
- package/dist/commands/lint/lint.integration.test.d.ts +0 -1
- package/dist/commands/lint/lint.options.test.d.ts +0 -1
- package/dist/commands/migrate/migrate.cli.test.d.ts +0 -1
- package/dist/commands/migrate/migrate.d.ts +0 -7
- package/dist/commands/migrate/migrate.integration.test.d.ts +0 -1
- package/dist/commands/migrate/migrate.options.test.d.ts +0 -1
- package/dist/commands/publish/publish.cli.test.d.ts +0 -1
- package/dist/commands/publish/publish.d.ts +0 -12
- package/dist/commands/publish/publish.integration.test.d.ts +0 -1
- package/dist/commands/publish/publish.options.test.d.ts +0 -1
- package/dist/commands/test/test.cli.test.d.ts +0 -1
- package/dist/commands/test/test.d.ts +0 -50
- package/dist/commands/test/test.integration.test.d.ts +0 -1
- package/dist/commands/test/test.options.test.d.ts +0 -1
- package/dist/commands/test/test.test.d.ts +0 -1
- package/dist/commands/update/update.cli.test.d.ts +0 -1
- package/dist/commands/update/update.d.ts +0 -9
- package/dist/commands/update/update.integration.test.d.ts +0 -1
- package/dist/commands/update/update.options.test.d.ts +0 -1
- package/dist/commands/upgrade/upgrade.cli.test.d.ts +0 -1
- package/dist/commands/upgrade/upgrade.d.ts +0 -7
- package/dist/commands/upgrade/upgrade.integration.test.d.ts +0 -1
- package/dist/commands/upgrade/upgrade.options.test.d.ts +0 -1
- package/dist/commands/versions/versions.cli.test.d.ts +0 -1
- package/dist/commands/versions/versions.d.ts +0 -13
- package/dist/commands/versions/versions.integration.test.d.ts +0 -1
- package/dist/commands/versions/versions.options.test.d.ts +0 -1
- package/dist/create/changelog.d.ts +0 -6
- package/dist/index.d.ts +0 -31
- package/dist/lex.d.ts +0 -2
- package/dist/types.d.ts +0 -5
- package/dist/utils/aiService.d.ts +0 -9
- package/dist/utils/app.d.ts +0 -41
- package/dist/utils/file.d.ts +0 -3
- package/dist/utils/log.d.ts +0 -1
- package/dist/utils/reactShim.d.ts +0 -2
- /package/{jest.config.lex.d.ts → dist/jest.config.lex.d.ts} +0 -0
package/.gitattributes
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/.pnp.* binary linguist-generated
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { StorybookConfig } from '@storybook/react-webpack5';
|
|
2
|
+
import { dirname, resolve } from 'path';
|
|
3
|
+
|
|
4
|
+
const getLexNodeModulesPath = () => {
|
|
5
|
+
const lexPackageRoot = dirname(__dirname); // Go up from .storybook to lex root
|
|
6
|
+
return resolve(lexPackageRoot, 'node_modules');
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const lexModule = (modulePath: string) => resolve(getLexNodeModulesPath(), modulePath);
|
|
10
|
+
|
|
11
|
+
const config: StorybookConfig = {
|
|
12
|
+
addons: [
|
|
13
|
+
lexModule('@storybook/addon-docs'),
|
|
14
|
+
lexModule('@storybook/addon-links'),
|
|
15
|
+
lexModule('@storybook/addon-themes')
|
|
16
|
+
],
|
|
17
|
+
framework: {
|
|
18
|
+
name: lexModule('@storybook/react-webpack5'),
|
|
19
|
+
options: {
|
|
20
|
+
builder: {
|
|
21
|
+
useSWC: true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(ts|tsx)'],
|
|
26
|
+
webpackFinal: async (config) => ({
|
|
27
|
+
...config,
|
|
28
|
+
module: {
|
|
29
|
+
...config.module,
|
|
30
|
+
rules: [
|
|
31
|
+
...(config.module?.rules || []),
|
|
32
|
+
{
|
|
33
|
+
loader: lexModule('babel-loader/lib/index.js'),
|
|
34
|
+
options: {
|
|
35
|
+
babelrc: false,
|
|
36
|
+
plugins: [
|
|
37
|
+
['@babel/plugin-transform-nullish-coalescing-operator'],
|
|
38
|
+
['@babel/plugin-transform-optional-chaining']
|
|
39
|
+
],
|
|
40
|
+
presets: [
|
|
41
|
+
'@babel/preset-typescript',
|
|
42
|
+
[
|
|
43
|
+
'@babel/preset-react',
|
|
44
|
+
{
|
|
45
|
+
runtime: 'automatic'
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
test: /\.(ts|tsx)$/
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
resolve: {
|
|
55
|
+
...config.resolve,
|
|
56
|
+
extensions: ['.js', '.ts', '.tsx'],
|
|
57
|
+
plugins: [
|
|
58
|
+
...(config.resolve?.plugins || [])
|
|
59
|
+
],
|
|
60
|
+
fallback: {
|
|
61
|
+
...config.resolve?.fallback,
|
|
62
|
+
"process": require.resolve("process/browser"),
|
|
63
|
+
"buffer": require.resolve("buffer"),
|
|
64
|
+
"util": require.resolve("util"),
|
|
65
|
+
"stream": require.resolve("stream-browserify"),
|
|
66
|
+
"crypto": require.resolve("crypto-browserify"),
|
|
67
|
+
"path": require.resolve("path-browserify"),
|
|
68
|
+
"os": require.resolve("os-browserify/browser"),
|
|
69
|
+
"vm": require.resolve("vm-browserify"),
|
|
70
|
+
"fs": false,
|
|
71
|
+
"net": false,
|
|
72
|
+
"tls": false
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
plugins: [
|
|
76
|
+
...(config.plugins || []),
|
|
77
|
+
new (require('webpack')).ProvidePlugin({
|
|
78
|
+
process: 'process/browser',
|
|
79
|
+
Buffer: ['buffer', 'Buffer']
|
|
80
|
+
})
|
|
81
|
+
],
|
|
82
|
+
stats: 'verbose'
|
|
83
|
+
})
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export default config;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Preview } from '@storybook/react';
|
|
2
|
+
|
|
3
|
+
const preview: Preview = {
|
|
4
|
+
parameters: {
|
|
5
|
+
actions: { argTypesRegex: '^on[A-Z].*' },
|
|
6
|
+
controls: {
|
|
7
|
+
matchers: {
|
|
8
|
+
color: /(background|color)$/i,
|
|
9
|
+
date: /Date$/,
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default preview;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"[javascript]": {
|
|
3
|
+
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
|
|
4
|
+
},
|
|
5
|
+
"[javascriptreact]": {
|
|
6
|
+
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
|
|
7
|
+
},
|
|
8
|
+
"[typescript]": {
|
|
9
|
+
"editor.defaultFormatter": "vscode.typescript-language-features"
|
|
10
|
+
},
|
|
11
|
+
"[typescriptreact]": {
|
|
12
|
+
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
|
|
13
|
+
},
|
|
14
|
+
"cSpell.words": [
|
|
15
|
+
"lex",
|
|
16
|
+
"nitrogenlabs",
|
|
17
|
+
"nlabs",
|
|
18
|
+
"transpiler"
|
|
19
|
+
],
|
|
20
|
+
"css.validate": false,
|
|
21
|
+
"editor.autoClosingBrackets": "never",
|
|
22
|
+
"editor.codeActionsOnSave": {
|
|
23
|
+
"source.fixAll.eslint": "explicit",
|
|
24
|
+
"source.organizeImports": "explicit"
|
|
25
|
+
},
|
|
26
|
+
"editor.detectIndentation": false,
|
|
27
|
+
"editor.formatOnSave": true,
|
|
28
|
+
"editor.rulers": [
|
|
29
|
+
120
|
|
30
|
+
],
|
|
31
|
+
"editor.tabCompletion": "on",
|
|
32
|
+
"editor.tabSize": 2,
|
|
33
|
+
"editor.wordWrap": "off",
|
|
34
|
+
"editor.wordWrapColumn": 120,
|
|
35
|
+
"editor.wrappingIndent": "indent",
|
|
36
|
+
"emmet.includeLanguages": {
|
|
37
|
+
"postcss": "css"
|
|
38
|
+
},
|
|
39
|
+
"emmet.syntaxProfiles": {
|
|
40
|
+
"postcss": "css"
|
|
41
|
+
},
|
|
42
|
+
"eslint.enable": true,
|
|
43
|
+
"eslint.experimental.useFlatConfig": true,
|
|
44
|
+
"eslint.format.enable": true,
|
|
45
|
+
"eslint.lintTask.enable": true,
|
|
46
|
+
"eslint.nodePath": "./node_modules",
|
|
47
|
+
"eslint.options": {
|
|
48
|
+
"overrideConfigFile": "./eslint.config.js"
|
|
49
|
+
},
|
|
50
|
+
"eslint.run": "onType",
|
|
51
|
+
"eslint.runtime": "./node_modules/eslint/bin/eslint.js",
|
|
52
|
+
"eslint.validate": [
|
|
53
|
+
"javascript",
|
|
54
|
+
"javascriptreact",
|
|
55
|
+
"typescript",
|
|
56
|
+
"typescriptreact"
|
|
57
|
+
],
|
|
58
|
+
"eslint.workingDirectories": [
|
|
59
|
+
"."
|
|
60
|
+
],
|
|
61
|
+
"explorer.confirmDragAndDrop": false,
|
|
62
|
+
"explorer.decorations.badges": false,
|
|
63
|
+
"files.autoSave": "onFocusChange",
|
|
64
|
+
"files.trimTrailingWhitespace": true,
|
|
65
|
+
"html.autoClosingTags": false,
|
|
66
|
+
"html.format.enable": false,
|
|
67
|
+
"html.format.extraLiners": "",
|
|
68
|
+
"html.format.indentHandlebars": true,
|
|
69
|
+
"html.format.indentInnerHtml": true,
|
|
70
|
+
"html.suggest.html5": false,
|
|
71
|
+
"javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
|
|
72
|
+
"javascript.format.insertSpaceAfterKeywordsInControlFlowStatements": false,
|
|
73
|
+
"javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": false,
|
|
74
|
+
"javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false,
|
|
75
|
+
"javascript.updateImportsOnFileMove.enabled": "never",
|
|
76
|
+
"prettier.enable": false,
|
|
77
|
+
"typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
|
|
78
|
+
"typescript.format.insertSpaceAfterKeywordsInControlFlowStatements": false,
|
|
79
|
+
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": false,
|
|
80
|
+
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false,
|
|
81
|
+
"typescript.updateImportsOnFileMove.enabled": "never",
|
|
82
|
+
"window.zoomLevel": 0
|
|
83
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Changes
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# TypeScript Configurations in Lex
|
|
2
|
+
|
|
3
|
+
Lex now uses specialized TypeScript configurations for different commands to optimize performance and functionality.
|
|
4
|
+
|
|
5
|
+
## Configuration Files
|
|
6
|
+
|
|
7
|
+
### 1. `tsconfig.build.json` - For Compilation and Building
|
|
8
|
+
|
|
9
|
+
Used by: `lex compile`, `lex build`
|
|
10
|
+
|
|
11
|
+
**Purpose:** Optimized for compilation and bundling with ESM output.
|
|
12
|
+
|
|
13
|
+
**Key Features:**
|
|
14
|
+
|
|
15
|
+
- ESM module format (`"module": "ESNext"`)
|
|
16
|
+
- Declaration file generation (`"declaration": true`)
|
|
17
|
+
- Source maps for debugging (`"inlineSourceMap": true`)
|
|
18
|
+
- Strict type checking (`"strict": true`)
|
|
19
|
+
- Excludes test files for faster compilation
|
|
20
|
+
|
|
21
|
+
**Use Cases:**
|
|
22
|
+
|
|
23
|
+
- Building production bundles
|
|
24
|
+
- Generating type declarations
|
|
25
|
+
- Compiling source code for distribution
|
|
26
|
+
|
|
27
|
+
### 2. `tsconfig.lint.json` - For Static Analysis
|
|
28
|
+
|
|
29
|
+
Used by: `lex lint`
|
|
30
|
+
|
|
31
|
+
**Purpose:** Optimized for static analysis and linting.
|
|
32
|
+
|
|
33
|
+
**Key Features:**
|
|
34
|
+
|
|
35
|
+
- No emission (`"noEmit": true`)
|
|
36
|
+
- Strict unused variable checking (`"noUnusedLocals": true`)
|
|
37
|
+
- Disabled pretty printing for faster analysis
|
|
38
|
+
- Excludes test files to focus on source code
|
|
39
|
+
- ESLint-friendly settings
|
|
40
|
+
|
|
41
|
+
**Use Cases:**
|
|
42
|
+
|
|
43
|
+
- Static type checking
|
|
44
|
+
- Code quality analysis
|
|
45
|
+
- Linting with ESLint + TypeScript
|
|
46
|
+
|
|
47
|
+
### 3. `tsconfig.test.json` - For Testing
|
|
48
|
+
|
|
49
|
+
Used by: `lex test`
|
|
50
|
+
|
|
51
|
+
**Purpose:** Optimized for testing environment.
|
|
52
|
+
|
|
53
|
+
**Key Features:**
|
|
54
|
+
|
|
55
|
+
- Includes test files (`**/*.test.*`, `**/*.spec.*`)
|
|
56
|
+
- Jest types included (`"types": ["jest", "node"]`)
|
|
57
|
+
- Relaxed strict mode for test flexibility (`"strict": false`)
|
|
58
|
+
- Source maps for debugging tests
|
|
59
|
+
- Coverage reporting support
|
|
60
|
+
|
|
61
|
+
**Use Cases:**
|
|
62
|
+
|
|
63
|
+
- Running unit tests
|
|
64
|
+
- Integration testing
|
|
65
|
+
- Test debugging and coverage
|
|
66
|
+
|
|
67
|
+
## Automatic Configuration
|
|
68
|
+
|
|
69
|
+
Lex automatically creates these configuration files when needed:
|
|
70
|
+
|
|
71
|
+
1. **First run:** If no specialized config exists, Lex creates it from templates
|
|
72
|
+
2. **Fallback:** If specialized config doesn't exist, falls back to default `tsconfig.json`
|
|
73
|
+
3. **Custom configs:** You can override any config by creating your own version
|
|
74
|
+
|
|
75
|
+
## Migration from Single Config
|
|
76
|
+
|
|
77
|
+
If you're migrating from a single `tsconfig.json`:
|
|
78
|
+
|
|
79
|
+
1. **Keep your existing config:** It will be used as a fallback
|
|
80
|
+
2. **Customize specialized configs:** Modify the generated configs for your needs
|
|
81
|
+
3. **Gradual adoption:** Commands will automatically use the appropriate config
|
|
82
|
+
|
|
83
|
+
## Customization
|
|
84
|
+
|
|
85
|
+
You can customize any of these configurations:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
// tsconfig.build.json - Customize for your build needs
|
|
89
|
+
{
|
|
90
|
+
"extends": "../../tsconfig.base.json",
|
|
91
|
+
"compilerOptions": {
|
|
92
|
+
"outDir": "./lib", // Custom output directory
|
|
93
|
+
"target": "ES2020" // Custom target
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Benefits
|
|
99
|
+
|
|
100
|
+
1. **Performance:** Each config is optimized for its specific use case
|
|
101
|
+
2. **Clarity:** Clear separation of concerns between compilation, linting, and testing
|
|
102
|
+
3. **Flexibility:** Easy to customize each workflow independently
|
|
103
|
+
4. **Compatibility:** Maintains backward compatibility with existing setups
|
package/__mocks__/LexConfig.js
CHANGED
|
@@ -11,10 +11,25 @@ const defaultConfigValues = {
|
|
|
11
11
|
const LexConfig = {
|
|
12
12
|
config: defaultConfigValues,
|
|
13
13
|
parseConfig: jest.fn(),
|
|
14
|
-
checkTypescriptConfig: jest.fn()
|
|
14
|
+
checkTypescriptConfig: jest.fn(),
|
|
15
|
+
checkCompileTypescriptConfig: jest.fn(),
|
|
16
|
+
checkLintTypescriptConfig: jest.fn(),
|
|
17
|
+
checkTestTypescriptConfig: jest.fn(),
|
|
18
|
+
getLexDir: jest.fn(() => '/mock/lex/dir'),
|
|
19
|
+
updateConfig: jest.fn((config) => ({ ...defaultConfigValues, ...config })),
|
|
20
|
+
addConfigParams: jest.fn(),
|
|
21
|
+
get useTypescript() {
|
|
22
|
+
return this.config.useTypescript;
|
|
23
|
+
},
|
|
24
|
+
set useTypescript(value) {
|
|
25
|
+
this.config.useTypescript = value;
|
|
26
|
+
}
|
|
15
27
|
};
|
|
16
28
|
|
|
29
|
+
const getTypeScriptConfigPath = jest.fn((configName) => `/mock/lex/dir/${configName}`);
|
|
30
|
+
|
|
17
31
|
module.exports = {
|
|
18
32
|
LexConfig,
|
|
19
|
-
defaultConfigValues
|
|
33
|
+
defaultConfigValues,
|
|
34
|
+
getTypeScriptConfigPath
|
|
20
35
|
};
|
package/__mocks__/execa.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// Mock implementation of execa
|
|
2
|
-
const mockExeca = jest.fn().mockImplementation(() =>
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
const mockExeca = jest.fn().mockImplementation(() =>
|
|
3
|
+
Promise.resolve({
|
|
4
|
+
stdout: '',
|
|
5
|
+
stderr: '',
|
|
6
|
+
exitCode: 0,
|
|
7
|
+
command: 'mocked-command',
|
|
8
|
+
pid: 123
|
|
9
|
+
})
|
|
10
|
+
);
|
|
9
11
|
|
|
10
12
|
mockExeca.sync = jest.fn().mockImplementation(() => ({
|
|
11
13
|
stdout: '',
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
|
|
4
|
+
// Mock implementations that don't use import.meta.url
|
|
5
|
+
function getDirName() {
|
|
6
|
+
return process.cwd();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function getFilePath(relativePath) {
|
|
10
|
+
// For testing, resolve relative to process.cwd()
|
|
11
|
+
return path.resolve(process.cwd(), relativePath);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function getLexPackageJsonPath() {
|
|
15
|
+
// For testing, return a mock path
|
|
16
|
+
return path.resolve(process.cwd(), 'package.json');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function relativeFilePath(filename, dirPath = './', backUp = 0) {
|
|
20
|
+
// Mock implementation
|
|
21
|
+
return path.resolve(process.cwd(), filename);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function relativeNodePath(filename, dirPath = './', backUp = 0) {
|
|
25
|
+
// Mock implementation
|
|
26
|
+
return path.resolve(process.cwd(), `node_modules/${filename}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getNodePath(moduleName) {
|
|
30
|
+
// Mock implementation
|
|
31
|
+
return path.resolve(process.cwd(), `node_modules/${moduleName}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function resolveBinaryPath(binaryName, packageName) {
|
|
35
|
+
// Mock implementation
|
|
36
|
+
if (packageName) {
|
|
37
|
+
return path.resolve(process.cwd(), `node_modules/${packageName}/bin/${binaryName}`);
|
|
38
|
+
}
|
|
39
|
+
return path.resolve(process.cwd(), `node_modules/.bin/${binaryName}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
getDirName,
|
|
44
|
+
getFilePath,
|
|
45
|
+
getLexPackageJsonPath,
|
|
46
|
+
relativeFilePath,
|
|
47
|
+
relativeNodePath,
|
|
48
|
+
getNodePath,
|
|
49
|
+
resolveBinaryPath
|
|
50
|
+
};
|
package/__mocks__/ora.js
CHANGED
|
@@ -13,5 +13,14 @@ const mockSpinner = {
|
|
|
13
13
|
|
|
14
14
|
const mockOra = jest.fn().mockImplementation(() => mockSpinner);
|
|
15
15
|
|
|
16
|
-
module.exports =
|
|
16
|
+
module.exports = () => ({
|
|
17
|
+
start: jest.fn().mockReturnThis(),
|
|
18
|
+
succeed: jest.fn().mockReturnThis(),
|
|
19
|
+
fail: jest.fn().mockReturnThis(),
|
|
20
|
+
stop: jest.fn().mockReturnThis(),
|
|
21
|
+
info: jest.fn().mockReturnThis(),
|
|
22
|
+
warn: jest.fn().mockReturnThis(),
|
|
23
|
+
text: ''
|
|
24
|
+
});
|
|
25
|
+
|
|
17
26
|
module.exports.default = mockOra;
|
package/config.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"useTypescript": true,
|
|
3
|
+
"sourcePath": "./src",
|
|
4
|
+
"outputPath": "./dist",
|
|
5
|
+
"targetEnvironment": "web",
|
|
6
|
+
"preset": "web",
|
|
7
|
+
"packageManager": "npm",
|
|
8
|
+
"ai": {
|
|
9
|
+
"provider": "none",
|
|
10
|
+
"model": "gpt-4o",
|
|
11
|
+
"maxTokens": 4000,
|
|
12
|
+
"temperature": 0.1
|
|
13
|
+
},
|
|
14
|
+
"esbuild": {
|
|
15
|
+
"minify": true,
|
|
16
|
+
"treeShaking": true,
|
|
17
|
+
"drop": [],
|
|
18
|
+
"pure": [],
|
|
19
|
+
"legalComments": "none",
|
|
20
|
+
"splitting": true,
|
|
21
|
+
"metafile": false,
|
|
22
|
+
"sourcemap": false
|
|
23
|
+
},
|
|
24
|
+
"webpack": {},
|
|
25
|
+
"jest": {},
|
|
26
|
+
"outputHash": false,
|
|
27
|
+
"useGraphQl": false,
|
|
28
|
+
"configFiles": [],
|
|
29
|
+
"copyFiles": [],
|
|
30
|
+
"entryHTML": "index.html",
|
|
31
|
+
"entryJs": "index.js",
|
|
32
|
+
"env": null
|
|
33
|
+
}
|
package/dist/LexConfig.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
-
import { extname as pathExtname, resolve as pathResolve } from "path";
|
|
2
|
+
import { dirname, extname as pathExtname, resolve as pathResolve } from "path";
|
|
3
3
|
import { URL } from "url";
|
|
4
|
-
import { relativeFilePath } from "./utils/file.js";
|
|
4
|
+
import { getDirName, getLexPackageJsonPath, relativeFilePath } from "./utils/file.js";
|
|
5
5
|
import { log } from "./utils/log.js";
|
|
6
6
|
const cwd = process.cwd();
|
|
7
7
|
const defaultConfigValues = {
|
|
@@ -39,10 +39,67 @@ const defaultConfigValues = {
|
|
|
39
39
|
useTypescript: false,
|
|
40
40
|
webpack: {}
|
|
41
41
|
};
|
|
42
|
+
function findLexRoot(startDir) {
|
|
43
|
+
let dir = startDir;
|
|
44
|
+
console.log("DEBUG: findLexRoot starting with dir:", dir);
|
|
45
|
+
while (dir !== "/" && dir !== ".") {
|
|
46
|
+
const pkgPath = pathResolve(dir, "package.json");
|
|
47
|
+
console.log("DEBUG: findLexRoot checking", pkgPath);
|
|
48
|
+
if (existsSync(pkgPath)) {
|
|
49
|
+
try {
|
|
50
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
51
|
+
if (pkg.name === "@nlabs/lex") {
|
|
52
|
+
return dir;
|
|
53
|
+
}
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const parent = dirname(dir);
|
|
58
|
+
console.log("DEBUG: findLexRoot parent of", dir, "is", parent);
|
|
59
|
+
if (parent === dir) {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
dir = parent;
|
|
63
|
+
}
|
|
64
|
+
throw new Error("Could not find @nlabs/lex root");
|
|
65
|
+
}
|
|
66
|
+
function getTypeScriptConfigPath(configName) {
|
|
67
|
+
const cwd2 = process.cwd();
|
|
68
|
+
if (configName === "tsconfig.build.json") {
|
|
69
|
+
const projectBuildConfig = pathResolve(cwd2, "tsconfig.build.json");
|
|
70
|
+
if (existsSync(projectBuildConfig)) {
|
|
71
|
+
return projectBuildConfig;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (configName === "tsconfig.lint.json") {
|
|
75
|
+
const projectLintConfig = pathResolve(cwd2, "tsconfig.eslint.json");
|
|
76
|
+
if (existsSync(projectLintConfig)) {
|
|
77
|
+
return projectLintConfig;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (configName === "tsconfig.test.json") {
|
|
81
|
+
const projectTestConfig = pathResolve(cwd2, "tsconfig.test.json");
|
|
82
|
+
if (existsSync(projectTestConfig)) {
|
|
83
|
+
return projectTestConfig;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const projectConfigPath = pathResolve(cwd2, configName);
|
|
87
|
+
if (existsSync(projectConfigPath)) {
|
|
88
|
+
return projectConfigPath;
|
|
89
|
+
}
|
|
90
|
+
const lexDir = LexConfig.getLexDir();
|
|
91
|
+
return pathResolve(lexDir, configName);
|
|
92
|
+
}
|
|
42
93
|
class LexConfig {
|
|
43
94
|
static config = {
|
|
44
95
|
...defaultConfigValues
|
|
45
96
|
};
|
|
97
|
+
/**
|
|
98
|
+
* Get the Lex package root directory, handling both development and installed environments
|
|
99
|
+
*/
|
|
100
|
+
static getLexDir() {
|
|
101
|
+
return dirname(getLexPackageJsonPath());
|
|
102
|
+
}
|
|
46
103
|
static set useTypescript(value) {
|
|
47
104
|
LexConfig.config.useTypescript = value;
|
|
48
105
|
const { sourceFullPath } = LexConfig.config;
|
|
@@ -192,13 +249,44 @@ ${cliName} Error: Config file must be a JS, CJS, MJS, TS, or JSON file.`, "error
|
|
|
192
249
|
static checkTypescriptConfig() {
|
|
193
250
|
const tsconfigPath = pathResolve(cwd, "./tsconfig.json");
|
|
194
251
|
if (!existsSync(tsconfigPath)) {
|
|
195
|
-
const dirName =
|
|
252
|
+
const dirName = getDirName();
|
|
196
253
|
writeFileSync(tsconfigPath, readFileSync(pathResolve(dirName, "../../../tsconfig.base.json")));
|
|
197
254
|
}
|
|
198
255
|
}
|
|
256
|
+
static checkCompileTypescriptConfig() {
|
|
257
|
+
const lexDir = LexConfig.getLexDir();
|
|
258
|
+
const tsconfigCompilePath = pathResolve(lexDir, "./tsconfig.build.json");
|
|
259
|
+
if (!existsSync(tsconfigCompilePath)) {
|
|
260
|
+
const templatePath = pathResolve(lexDir, "tsconfig.build.json");
|
|
261
|
+
if (existsSync(templatePath)) {
|
|
262
|
+
writeFileSync(tsconfigCompilePath, readFileSync(templatePath));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
static checkLintTypescriptConfig() {
|
|
267
|
+
const lexDir = LexConfig.getLexDir();
|
|
268
|
+
const tsconfigLintPath = pathResolve(lexDir, "./tsconfig.lint.json");
|
|
269
|
+
if (!existsSync(tsconfigLintPath)) {
|
|
270
|
+
const templatePath = pathResolve(lexDir, "tsconfig.lint.json");
|
|
271
|
+
if (existsSync(templatePath)) {
|
|
272
|
+
writeFileSync(tsconfigLintPath, readFileSync(templatePath));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
static checkTestTypescriptConfig() {
|
|
277
|
+
const lexDir = LexConfig.getLexDir();
|
|
278
|
+
const tsconfigTestPath = pathResolve(lexDir, "./tsconfig.test.json");
|
|
279
|
+
if (!existsSync(tsconfigTestPath)) {
|
|
280
|
+
const templatePath = pathResolve(lexDir, "tsconfig.test.json");
|
|
281
|
+
if (existsSync(templatePath)) {
|
|
282
|
+
writeFileSync(tsconfigTestPath, readFileSync(templatePath));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
199
286
|
}
|
|
200
287
|
export {
|
|
201
288
|
LexConfig,
|
|
202
|
-
defaultConfigValues
|
|
289
|
+
defaultConfigValues,
|
|
290
|
+
getTypeScriptConfigPath
|
|
203
291
|
};
|
|
204
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2V4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7cmVsYXRpdmVGaWxlUGF0aH0gZnJvbSAnLi91dGlscy9maWxlLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuL3V0aWxzL2xvZy5qcyc7XG5cbmNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcblxuZXhwb3J0IGludGVyZmFjZSBFc2J1aWxkQ29uZmlnIHtcbiAgZW50cnlQb2ludHM/OiBzdHJpbmdbXTtcbiAgb3V0ZGlyPzogc3RyaW5nO1xuICBwbGF0Zm9ybT86ICdub2RlJyB8ICdicm93c2VyJztcbiAgdGFyZ2V0Pzogc3RyaW5nO1xuICBmb3JtYXQ/OiAnY2pzJyB8ICdlc20nO1xuICBtaW5pZnk/OiBib29sZWFuO1xuICB0cmVlU2hha2luZz86IGJvb2xlYW47XG4gIGRyb3A/OiBzdHJpbmdbXTtcbiAgcHVyZT86IHN0cmluZ1tdO1xuICBleHRlcm5hbD86IHN0cmluZ1tdO1xuICBzcGxpdHRpbmc/OiBib29sZWFuO1xuICBtZXRhZmlsZT86IGJvb2xlYW47XG4gIHNvdXJjZW1hcD86IGJvb2xlYW4gfCAnaW5saW5lJyB8ICdleHRlcm5hbCc7XG4gIGxlZ2FsQ29tbWVudHM/OiAnbm9uZScgfCAnaW5saW5lJyB8ICdlb2YnIHwgJ2xpbmtlZCcgfCAnc2VwYXJhdGUnO1xuICBiYW5uZXI/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBmb290ZXI/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBkZWZpbmU/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEplc3RDb25maWcge1xuICByb290cz86IHN0cmluZ1tdO1xuICB0ZXN0RW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHRyYW5zZm9ybT86IFJlY29yZDxzdHJpbmcsIFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XT47XG4gIHRyYW5zZm9ybUlnbm9yZVBhdHRlcm5zPzogc3RyaW5nW107XG4gIG1vZHVsZU5hbWVNYXBwZXI/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBleHRlbnNpb25zVG9UcmVhdEFzRXNtPzogc3RyaW5nW107XG4gIHByZXNldD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJwYWNrQ29uZmlnIHtcbiAgZW50cnk/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgb3V0cHV0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1vZHVsZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwbHVnaW5zPzogdW5rbm93bltdO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFJQ29uZmlnIHtcbiAgcHJvdmlkZXI/OiAnY3Vyc29yJyB8ICdjb3BpbG90JyB8ICdvcGVuYWknIHwgJ2FudGhyb3BpYycgfCAnbm9uZSc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIG1heFRva2Vucz86IG51bWJlcjtcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIExleENvbmZpZ1R5cGUge1xuICBhaT86IEFJQ29uZmlnO1xuICBjb25maWdGaWxlcz86IHN0cmluZ1tdO1xuICBjb3B5RmlsZXM/OiBzdHJpbmdbXTtcbiAgZW50cnlIVE1MPzogc3RyaW5nO1xuICBlbnRyeUpzPzogc3RyaW5nO1xuICBlc2J1aWxkPzogRXNidWlsZENvbmZpZztcbiAgZW52Pzogb2JqZWN0O1xuICBnaXRVcmw/OiBzdHJpbmc7XG4gIGplc3Q/OiBKZXN0Q29uZmlnO1xuICBsaWJyYXJ5TmFtZT86IHN0cmluZztcbiAgbGlicmFyeVRhcmdldD86IHN0cmluZztcbiAgb3V0cHV0RmlsZT86IHN0cmluZztcbiAgb3V0cHV0RnVsbFBhdGg/OiBzdHJpbmc7XG4gIG91dHB1dEhhc2g/OiBib29sZWFuO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICBwYWNrYWdlTWFuYWdlcj86ICducG0nIHwgJ3lhcm4nO1xuICBwcmVzZXQ/OiAnd2ViJyB8ICdub2RlJyB8ICdsYW1iZGEnIHwgJ21vYmlsZSc7XG4gIHNvdXJjZUZ1bGxQYXRoPzogc3RyaW5nO1xuICBzb3VyY2VQYXRoPzogc3RyaW5nO1xuICB0YXJnZXRFbnZpcm9ubWVudD86ICdub2RlJyB8ICd3ZWInO1xuICB1c2VHcmFwaFFsPzogYm9vbGVhbjtcbiAgdXNlVHlwZXNjcmlwdD86IGJvb2xlYW47XG4gIHdlYnBhY2s/OiBXZWJwYWNrQ29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBMZXhDb25maWdUeXBlO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZ1ZhbHVlczogTGV4Q29uZmlnVHlwZSA9IHtcbiAgYWk6IHtcbiAgICBwcm92aWRlcjogJ25vbmUnLFxuICAgIG1vZGVsOiAnZ3B0LTRvJyxcbiAgICBtYXhUb2tlbnM6IDQwMDAsXG4gICAgdGVtcGVyYXR1cmU6IDAuMVxuICB9LFxuICBjb25maWdGaWxlczogW10sXG4gIGNvcHlGaWxlczogW10sXG4gIGVudHJ5SFRNTDogJ2luZGV4Lmh0bWwnLFxuICBlbnRyeUpzOiAnaW5kZXguanMnLFxuICBlc2J1aWxkOiB7XG4gICAgbWluaWZ5OiB0cnVlLFxuICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgIGRyb3A6IFsnY29uc29sZScsICdkZWJ1Z2dlciddLFxuICAgIHB1cmU6IFsnY29uc29sZS5sb2cnLCAnY29uc29sZS53YXJuJywgJ2NvbnNvbGUuZXJyb3InXSxcbiAgICBsZWdhbENvbW1lbnRzOiAnbm9uZScsXG4gICAgc3BsaXR0aW5nOiB0cnVlLFxuICAgIG1ldGFmaWxlOiBmYWxzZSxcbiAgICBzb3VyY2VtYXA6IGZhbHNlXG4gIH0sXG4gIGVudjogbnVsbCxcbiAgamVzdDoge30sXG4gIG91dHB1dEZ1bGxQYXRoOiBwYXRoUmVzb2x2ZShjd2QsICcuL2Rpc3QnKSxcbiAgb3V0cHV0SGFzaDogZmFsc2UsXG4gIG91dHB1dFBhdGg6ICcuL2Rpc3QnLFxuICBwYWNrYWdlTWFuYWdlcjogJ25wbScsXG4gIHByZXNldDogJ3dlYicsXG4gIHNvdXJjZUZ1bGxQYXRoOiBwYXRoUmVzb2x2ZShjd2QsICcuL3NyYycpLFxuICBzb3VyY2VQYXRoOiAnLi9zcmMnLFxuICB0YXJnZXRFbnZpcm9ubWVudDogJ3dlYicsXG4gIHVzZUdyYXBoUWw6IGZhbHNlLFxuICB1c2VUeXBlc2NyaXB0OiBmYWxzZSxcbiAgd2VicGFjazoge31cbn07XG5cbmV4cG9ydCBjbGFzcyBMZXhDb25maWcge1xuICBzdGF0aWMgY29uZmlnOiBMZXhDb25maWdUeXBlID0ge1xuICAgIC4uLmRlZmF1bHRDb25maWdWYWx1ZXNcbiAgfTtcblxuICBzdGF0aWMgc2V0IHVzZVR5cGVzY3JpcHQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBMZXhDb25maWcuY29uZmlnLnVzZVR5cGVzY3JpcHQgPSB2YWx1ZTtcbiAgICBjb25zdCB7c291cmNlRnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGNvbnN0IHtlbnRyeUpzfSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgICBpZihlbnRyeUpzID09PSAnaW5kZXguanMnICYmIHZhbHVlKSB7XG4gICAgICBjb25zdCBpbmRleFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlRnVsbFBhdGgsICdpbmRleC50c3gnKTtcbiAgICAgIGNvbnN0IGhhc0luZGV4VHN4OiBib29sZWFuID0gZXhpc3RzU3luYyhpbmRleFBhdGgpO1xuXG4gICAgICBpZihoYXNJbmRleFRzeCkge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmVudHJ5SnMgPSAnaW5kZXgudHN4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50cyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnOiBMZXhDb25maWdUeXBlKTogTGV4Q29uZmlnVHlwZSB7XG4gICAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCBzb3VyY2VGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdCwgYWl9ID0gdXBkYXRlZENvbmZpZztcbiAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICBpZih1c2VUeXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gdXNlVHlwZXNjcmlwdDtcbiAgICB9XG5cbiAgICBpZihvdXRwdXRQYXRoICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0RnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5vdXRwdXRGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgb3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZUZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcuc291cmNlRnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIHNvdXJjZVBhdGgpO1xuICAgIH1cblxuICAgIGlmKGFpKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmFpfTtcblxuICAgICAgaWYocHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgPT09ICdub25lJykge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID0gJ2N1cnNvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcblxuICAgIHJldHVybiBMZXhDb25maWcuY29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGFkZENvbmZpZ1BhcmFtcyhjbWQsIHBhcmFtczogTGV4Q29uZmlnVHlwZSkge1xuICAgIGNvbnN0IG5hbWVQcm9wZXJ0eTogc3RyaW5nID0gJ19uYW1lJztcbiAgICBjb25zdCB7ZW52aXJvbm1lbnQsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHR5cGVzY3JpcHR9ID0gY21kO1xuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgICBwYXJhbXMub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIGlmKHNvdXJjZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICAgICAgcGFyYW1zLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZih0eXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VUeXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZihlbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudGFyZ2V0RW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudCA9PT0gJ3dlYicgPyAnd2ViJyA6ICdub2RlJztcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVudi5MRVhfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIC4uLkxleENvbmZpZy51cGRhdGVDb25maWcocGFyYW1zKSxcbiAgICAgICAgY29tbWFuZE5hbWU6IGNtZFtuYW1lUHJvcGVydHldLFxuICAgICAgICBpc1N0YXRpYzogY21kLnN0YXRpY1xuICAgICAgfSwgbnVsbCwgMFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcGFyc2VDb25maWcoY21kLCBpc1Jvb3Q6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2NsaU5hbWUgPSAnTGV4JywgbGV4Q29uZmlnLCBsZXhDb25maWdOYW1lLCBxdWlldCwgdHlwZXNjcmlwdCwgZGVidWcgPSBmYWxzZX0gPSBjbWQ7XG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG4gICAgY29uc3QgY29uZmlnQmFzZU5hbWU6IHN0cmluZyA9IGxleENvbmZpZ05hbWUgfHwgJ2xleC5jb25maWcnO1xuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgPSBsZXhDb25maWcgfHwgJyc7XG4gICAgbGV0IGNvbmZpZ0V4aXN0czogYm9vbGVhbiA9IGxleENvbmZpZyA/IGV4aXN0c1N5bmMoY29uZmlnUGF0aCkgOiBmYWxzZTtcblxuICAgIGlmKCFjb25maWdQYXRoIHx8ICFjb25maWdFeGlzdHMpIHtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgU2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMgd2l0aCBiYXNlIG5hbWU6ICR7Y29uZmlnQmFzZU5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGZvcihjb25zdCBmb3JtYXQgb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gaXNSb290XG4gICAgICAgICAgPyBwYXRoUmVzb2x2ZShjd2QsIGAuLyR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWApXG4gICAgICAgICAgOiByZWxhdGl2ZUZpbGVQYXRoKGAke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gLCBjd2QpO1xuXG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBDaGVja2luZyBmb3IgY29uZmlnIGZpbGU6ICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGV4aXN0c1N5bmMocG90ZW50aWFsUGF0aCkpIHtcbiAgICAgICAgICBjb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgICAgICBjb25maWdFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnRXhpc3RzKSB7XG4gICAgICBsb2coYFVzaW5nICR7Y2xpTmFtZX0gY29uZmlndXJhdGlvbiBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ25vdGUnLCBxdWlldCk7XG4gICAgICBjb25zdCBleHQ6IHN0cmluZyA9IHBhdGhFeHRuYW1lKGNvbmZpZ1BhdGgpO1xuXG4gICAgICBpZihleHQgPT09ICcuanNvbicpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudDogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG5cbiAgICAgICAgaWYoY29uZmlnQ29udGVudCkge1xuICAgICAgICAgIGxldCBjb25maWdKc29uOiBMZXhDb25maWdUeXBlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpPy5kZWZhdWx0IHx8IHt9O1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHBhcnNlIEpTT04gY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgY29uZmlnSnNvbiA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWdKc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG1hbGZvcm1lZCwgJHtjb25maWdQYXRofWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKFsnLmpzJywgJy5tanMnLCAnLmNqcycsICcudHMnXS5pbmNsdWRlcyhleHQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IGxleEN1c3RvbUNvbmZpZztcblxuICAgICAgICAgIGlmKGV4dCA9PT0gJy5janMnKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gbmV3IFVSTChgZmlsZTovLy8ke3BhdGhSZXNvbHZlKGNvbmZpZ1BhdGgpfWApLmhyZWY7XG5cbiAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGxvZyhgTG9hZGluZyBDb21tb25KUyBjb25maWcgZnJvbTogJHtmaWxlVXJsfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV4Q3VzdG9tQ29uZmlnID0gYXdhaXQgaW1wb3J0KGZpbGVVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgRVNNL1RTIGNvbmZpZyBmcm9tOiAke2NvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb25maWcgPSBsZXhDdXN0b21Db25maWcuZGVmYXVsdCB8fCBsZXhDdXN0b21Db25maWc7XG5cbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBMb2FkZWQgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoIWNvbmZpZykge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IFdhcm5pbmc6IENvbmZpZyBmaWxlIGxvYWRlZCBidXQgbm8gY29uZmlndXJhdGlvbiBmb3VuZGAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWcgfHwge30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG11c3QgYmUgYSBKUywgQ0pTLCBNSlMsIFRTLCBvciBKU09OIGZpbGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coJ05vIGNvbmZpZyBmaWxlIGZvdW5kLiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gISF0eXBlc2NyaXB0O1xuICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIExleENvbmZpZy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja1R5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgdHNjb25maWdQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsICcuL3RzY29uZmlnLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBuZXcgVVJMKCcuJywgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZTtcbiAgICAgIHdyaXRlRmlsZVN5bmModHNjb25maWdQYXRoLCByZWFkRmlsZVN5bmMocGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uLy4uL3RzY29uZmlnLmJhc2UuanNvbicpKSk7XG4gICAgfVxuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLGNBQWMscUJBQW9CO0FBQ3RELFNBQVEsV0FBVyxhQUFhLFdBQVcsbUJBQWtCO0FBQzdELFNBQVEsV0FBVTtBQUVsQixTQUFRLHdCQUF1QjtBQUMvQixTQUFRLFdBQVU7QUFFbEIsTUFBTSxNQUFjLFFBQVEsSUFBSTtBQTZFekIsTUFBTSxzQkFBcUM7QUFBQSxFQUNoRCxJQUFJO0FBQUEsSUFDRixVQUFVO0FBQUEsSUFDVixPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsRUFDZjtBQUFBLEVBQ0EsYUFBYSxDQUFDO0FBQUEsRUFDZCxXQUFXLENBQUM7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNS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
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIGV4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7Z2V0RGlyTmFtZSwgZ2V0TGV4UGFja2FnZUpzb25QYXRoLCByZWxhdGl2ZUZpbGVQYXRofSBmcm9tICcuL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vdXRpbHMvbG9nLmpzJztcblxuY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVzYnVpbGRDb25maWcge1xuICBlbnRyeVBvaW50cz86IHN0cmluZ1tdO1xuICBvdXRkaXI/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogJ25vZGUnIHwgJ2Jyb3dzZXInO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gIG1pbmlmeT86IGJvb2xlYW47XG4gIHRyZWVTaGFraW5nPzogYm9vbGVhbjtcbiAgZHJvcD86IHN0cmluZ1tdO1xuICBwdXJlPzogc3RyaW5nW107XG4gIGV4dGVybmFsPzogc3RyaW5nW107XG4gIHNwbGl0dGluZz86IGJvb2xlYW47XG4gIG1ldGFmaWxlPzogYm9vbGVhbjtcbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2V4dGVybmFsJztcbiAgbGVnYWxDb21tZW50cz86ICdub25lJyB8ICdpbmxpbmUnIHwgJ2VvZicgfCAnbGlua2VkJyB8ICdzZXBhcmF0ZSc7XG4gIGJhbm5lcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGZvb3Rlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGRlZmluZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmVzdENvbmZpZyB7XG4gIHJvb3RzPzogc3RyaW5nW107XG4gIHRlc3RFbnZpcm9ubWVudD86IHN0cmluZztcbiAgdHJhbnNmb3JtPzogUmVjb3JkPHN0cmluZywgW3N0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dPjtcbiAgdHJhbnNmb3JtSWdub3JlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgbW9kdWxlTmFtZU1hcHBlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGV4dGVuc2lvbnNUb1RyZWF0QXNFc20/OiBzdHJpbmdbXTtcbiAgcHJlc2V0Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhY2tDb25maWcge1xuICBlbnRyeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBvdXRwdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBsdWdpbnM/OiB1bmtub3duW107XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlDb25maWcge1xuICBwcm92aWRlcj86ICdjdXJzb3InIHwgJ2NvcGlsb3QnIHwgJ29wZW5haScgfCAnYW50aHJvcGljJyB8ICdub25lJztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGV4Q29uZmlnVHlwZSB7XG4gIGFpPzogQUlDb25maWc7XG4gIGNvbmZpZ0ZpbGVzPzogc3RyaW5nW107XG4gIGNvcHlGaWxlcz86IHN0cmluZ1tdO1xuICBlbnRyeUhUTUw/OiBzdHJpbmc7XG4gIGVudHJ5SnM/OiBzdHJpbmc7XG4gIGVzYnVpbGQ/OiBFc2J1aWxkQ29uZmlnO1xuICBlbnY/OiBvYmplY3Q7XG4gIGdpdFVybD86IHN0cmluZztcbiAgamVzdD86IEplc3RDb25maWc7XG4gIGxpYnJhcnlOYW1lPzogc3RyaW5nO1xuICBsaWJyYXJ5VGFyZ2V0Pzogc3RyaW5nO1xuICBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICBvdXRwdXRGdWxsUGF0aD86IHN0cmluZztcbiAgb3V0cHV0SGFzaD86IGJvb2xlYW47XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyPzogJ25wbScgfCAneWFybic7XG4gIHByZXNldD86ICd3ZWInIHwgJ25vZGUnIHwgJ2xhbWJkYScgfCAnbW9iaWxlJztcbiAgc291cmNlRnVsbFBhdGg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHRhcmdldEVudmlyb25tZW50PzogJ25vZGUnIHwgJ3dlYic7XG4gIHVzZUdyYXBoUWw/OiBib29sZWFuO1xuICB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbiAgd2VicGFjaz86IFdlYnBhY2tDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IExleENvbmZpZ1R5cGU7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnVmFsdWVzOiBMZXhDb25maWdUeXBlID0ge1xuICBhaToge1xuICAgIHByb3ZpZGVyOiAnbm9uZScsXG4gICAgbW9kZWw6ICdncHQtNG8nLFxuICAgIG1heFRva2VuczogNDAwMCxcbiAgICB0ZW1wZXJhdHVyZTogMC4xXG4gIH0sXG4gIGNvbmZpZ0ZpbGVzOiBbXSxcbiAgY29weUZpbGVzOiBbXSxcbiAgZW50cnlIVE1MOiAnaW5kZXguaHRtbCcsXG4gIGVudHJ5SnM6ICdpbmRleC5qcycsXG4gIGVzYnVpbGQ6IHtcbiAgICBtaW5pZnk6IHRydWUsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZHJvcDogWydjb25zb2xlJywgJ2RlYnVnZ2VyJ10sXG4gICAgcHVyZTogWydjb25zb2xlLmxvZycsICdjb25zb2xlLndhcm4nLCAnY29uc29sZS5lcnJvciddLFxuICAgIGxlZ2FsQ29tbWVudHM6ICdub25lJyxcbiAgICBzcGxpdHRpbmc6IHRydWUsXG4gICAgbWV0YWZpbGU6IGZhbHNlLFxuICAgIHNvdXJjZW1hcDogZmFsc2VcbiAgfSxcbiAgZW52OiBudWxsLFxuICBqZXN0OiB7fSxcbiAgb3V0cHV0RnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vZGlzdCcpLFxuICBvdXRwdXRIYXNoOiBmYWxzZSxcbiAgb3V0cHV0UGF0aDogJy4vZGlzdCcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnbnBtJyxcbiAgcHJlc2V0OiAnd2ViJyxcbiAgc291cmNlRnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vc3JjJyksXG4gIHNvdXJjZVBhdGg6ICcuL3NyYycsXG4gIHRhcmdldEVudmlyb25tZW50OiAnd2ViJyxcbiAgdXNlR3JhcGhRbDogZmFsc2UsXG4gIHVzZVR5cGVzY3JpcHQ6IGZhbHNlLFxuICB3ZWJwYWNrOiB7fVxufTtcblxuZnVuY3Rpb24gZmluZExleFJvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBzdGFydERpcjtcbiAgY29uc29sZS5sb2coJ0RFQlVHOiBmaW5kTGV4Um9vdCBzdGFydGluZyB3aXRoIGRpcjonLCBkaXIpOyAvLyBURU1QIERFQlVHXG4gIHdoaWxlKGRpciAhPT0gJy8nICYmIGRpciAhPT0gJy4nKSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGhSZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGNvbnNvbGUubG9nKCdERUJVRzogZmluZExleFJvb3QgY2hlY2tpbmcnLCBwa2dQYXRoKTsgLy8gVEVNUCBERUJVR1xuICAgIGlmKGV4aXN0c1N5bmMocGtnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBrZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICBpZihwa2cubmFtZSA9PT0gJ0BubGFicy9sZXgnKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaHt9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcbiAgICBjb25zb2xlLmxvZygnREVCVUc6IGZpbmRMZXhSb290IHBhcmVudCBvZicsIGRpciwgJ2lzJywgcGFyZW50KTsgLy8gVEVNUCBERUJVR1xuICAgIGlmKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgQG5sYWJzL2xleCByb290Jyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhcHByb3ByaWF0ZSBUeXBlU2NyaXB0IGNvbmZpZyBwYXRoLCBwcmlvcml0aXppbmcgcHJvamVjdCBjb25maWdzIG92ZXIgTGV4IGNvbmZpZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVTY3JpcHRDb25maWdQYXRoKGNvbmZpZ05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gRm9yIGNvbXBpbGUgY29tbWFuZCwgY2hlY2sgZm9yIHByb2plY3QncyBidWlsZCBjb25maWcgZmlyc3RcbiAgaWYoY29uZmlnTmFtZSA9PT0gJ3RzY29uZmlnLmJ1aWxkLmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdEJ1aWxkQ29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuYnVpbGQuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocHJvamVjdEJ1aWxkQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RCdWlsZENvbmZpZztcbiAgICB9XG4gIH1cblxuICAvLyBGb3IgbGludCBjb21tYW5kLCBjaGVjayBmb3IgcHJvamVjdCdzIGxpbnQgY29uZmlnIGZpcnN0XG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy5saW50Lmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdExpbnRDb25maWcgPSBwYXRoUmVzb2x2ZShjd2QsICd0c2NvbmZpZy5lc2xpbnQuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocHJvamVjdExpbnRDb25maWcpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdExpbnRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gRm9yIHRlc3QgY29tbWFuZCwgY2hlY2sgZm9yIHByb2plY3QncyB0ZXN0IGNvbmZpZyBmaXJzdFxuICBpZihjb25maWdOYW1lID09PSAndHNjb25maWcudGVzdC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RUZXN0Q29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwcm9qZWN0VGVzdENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0VGVzdENvbmZpZztcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBmb3IgdGhlIGV4YWN0IGNvbmZpZyBuYW1lIGluIHRoZSBwcm9qZWN0XG4gIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBjb25maWdOYW1lKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdENvbmZpZ1BhdGg7XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIHVzZSBMZXgncyBjb25maWdcbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICByZXR1cm4gcGF0aFJlc29sdmUobGV4RGlyLCBjb25maWdOYW1lKTtcbn1cblxuZXhwb3J0IGNsYXNzIExleENvbmZpZyB7XG4gIHN0YXRpYyBjb25maWc6IExleENvbmZpZ1R5cGUgPSB7XG4gICAgLi4uZGVmYXVsdENvbmZpZ1ZhbHVlc1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIExleCBwYWNrYWdlIHJvb3QgZGlyZWN0b3J5LCBoYW5kbGluZyBib3RoIGRldmVsb3BtZW50IGFuZCBpbnN0YWxsZWQgZW52aXJvbm1lbnRzXG4gICAqL1xuICBzdGF0aWMgZ2V0TGV4RGlyKCk6IHN0cmluZyB7XG4gICAgLy8gQWx3YXlzIHVzZSB0aGUgZGlyZWN0b3J5IG9mIExleCdzIG93biBwYWNrYWdlLmpzb25cbiAgICByZXR1cm4gZGlybmFtZShnZXRMZXhQYWNrYWdlSnNvblBhdGgoKSk7XG4gIH1cblxuICBzdGF0aWMgc2V0IHVzZVR5cGVzY3JpcHQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBMZXhDb25maWcuY29uZmlnLnVzZVR5cGVzY3JpcHQgPSB2YWx1ZTtcbiAgICBjb25zdCB7c291cmNlRnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGNvbnN0IHtlbnRyeUpzfSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgICBpZihlbnRyeUpzID09PSAnaW5kZXguanMnICYmIHZhbHVlKSB7XG4gICAgICBjb25zdCBpbmRleFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlRnVsbFBhdGgsICdpbmRleC50c3gnKTtcbiAgICAgIGNvbnN0IGhhc0luZGV4VHN4OiBib29sZWFuID0gZXhpc3RzU3luYyhpbmRleFBhdGgpO1xuXG4gICAgICBpZihoYXNJbmRleFRzeCkge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmVudHJ5SnMgPSAnaW5kZXgudHN4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50cyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnOiBMZXhDb25maWdUeXBlKTogTGV4Q29uZmlnVHlwZSB7XG4gICAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCBzb3VyY2VGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdCwgYWl9ID0gdXBkYXRlZENvbmZpZztcbiAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICBpZih1c2VUeXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gdXNlVHlwZXNjcmlwdDtcbiAgICB9XG5cbiAgICBpZihvdXRwdXRQYXRoICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0RnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5vdXRwdXRGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgb3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZUZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcuc291cmNlRnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIHNvdXJjZVBhdGgpO1xuICAgIH1cblxuICAgIGlmKGFpKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmFpfTtcblxuICAgICAgaWYocHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgPT09ICdub25lJykge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID0gJ2N1cnNvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcblxuICAgIHJldHVybiBMZXhDb25maWcuY29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGFkZENvbmZpZ1BhcmFtcyhjbWQsIHBhcmFtczogTGV4Q29uZmlnVHlwZSkge1xuICAgIGNvbnN0IG5hbWVQcm9wZXJ0eTogc3RyaW5nID0gJ19uYW1lJztcbiAgICBjb25zdCB7ZW52aXJvbm1lbnQsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHR5cGVzY3JpcHR9ID0gY21kO1xuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgICBwYXJhbXMub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIGlmKHNvdXJjZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICAgICAgcGFyYW1zLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZih0eXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VUeXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZihlbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudGFyZ2V0RW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudCA9PT0gJ3dlYicgPyAnd2ViJyA6ICdub2RlJztcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVudi5MRVhfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIC4uLkxleENvbmZpZy51cGRhdGVDb25maWcocGFyYW1zKSxcbiAgICAgICAgY29tbWFuZE5hbWU6IGNtZFtuYW1lUHJvcGVydHldLFxuICAgICAgICBpc1N0YXRpYzogY21kLnN0YXRpY1xuICAgICAgfSwgbnVsbCwgMFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcGFyc2VDb25maWcoY21kLCBpc1Jvb3Q6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2NsaU5hbWUgPSAnTGV4JywgbGV4Q29uZmlnLCBsZXhDb25maWdOYW1lLCBxdWlldCwgdHlwZXNjcmlwdCwgZGVidWcgPSBmYWxzZX0gPSBjbWQ7XG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG4gICAgY29uc3QgY29uZmlnQmFzZU5hbWU6IHN0cmluZyA9IGxleENvbmZpZ05hbWUgfHwgJ2xleC5jb25maWcnO1xuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgPSBsZXhDb25maWcgfHwgJyc7XG4gICAgbGV0IGNvbmZpZ0V4aXN0czogYm9vbGVhbiA9IGxleENvbmZpZyA/IGV4aXN0c1N5bmMoY29uZmlnUGF0aCkgOiBmYWxzZTtcblxuICAgIGlmKCFjb25maWdQYXRoIHx8ICFjb25maWdFeGlzdHMpIHtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgU2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMgd2l0aCBiYXNlIG5hbWU6ICR7Y29uZmlnQmFzZU5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGZvcihjb25zdCBmb3JtYXQgb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gaXNSb290XG4gICAgICAgICAgPyBwYXRoUmVzb2x2ZShjd2QsIGAuLyR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWApXG4gICAgICAgICAgOiByZWxhdGl2ZUZpbGVQYXRoKGAke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gLCBjd2QpO1xuXG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBDaGVja2luZyBmb3IgY29uZmlnIGZpbGU6ICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGV4aXN0c1N5bmMocG90ZW50aWFsUGF0aCkpIHtcbiAgICAgICAgICBjb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgICAgICBjb25maWdFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnRXhpc3RzKSB7XG4gICAgICBsb2coYFVzaW5nICR7Y2xpTmFtZX0gY29uZmlndXJhdGlvbiBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ25vdGUnLCBxdWlldCk7XG4gICAgICBjb25zdCBleHQ6IHN0cmluZyA9IHBhdGhFeHRuYW1lKGNvbmZpZ1BhdGgpO1xuXG4gICAgICBpZihleHQgPT09ICcuanNvbicpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudDogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG5cbiAgICAgICAgaWYoY29uZmlnQ29udGVudCkge1xuICAgICAgICAgIGxldCBjb25maWdKc29uOiBMZXhDb25maWdUeXBlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpPy5kZWZhdWx0IHx8IHt9O1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHBhcnNlIEpTT04gY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgY29uZmlnSnNvbiA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWdKc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG1hbGZvcm1lZCwgJHtjb25maWdQYXRofWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKFsnLmpzJywgJy5tanMnLCAnLmNqcycsICcudHMnXS5pbmNsdWRlcyhleHQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IGxleEN1c3RvbUNvbmZpZztcblxuICAgICAgICAgIGlmKGV4dCA9PT0gJy5janMnKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gbmV3IFVSTChgZmlsZTovLy8ke3BhdGhSZXNvbHZlKGNvbmZpZ1BhdGgpfWApLmhyZWY7XG5cbiAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGxvZyhgTG9hZGluZyBDb21tb25KUyBjb25maWcgZnJvbTogJHtmaWxlVXJsfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV4Q3VzdG9tQ29uZmlnID0gYXdhaXQgaW1wb3J0KGZpbGVVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgRVNNL1RTIGNvbmZpZyBmcm9tOiAke2NvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb25maWcgPSBsZXhDdXN0b21Db25maWcuZGVmYXVsdCB8fCBsZXhDdXN0b21Db25maWc7XG5cbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBMb2FkZWQgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoIWNvbmZpZykge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IFdhcm5pbmc6IENvbmZpZyBmaWxlIGxvYWRlZCBidXQgbm8gY29uZmlndXJhdGlvbiBmb3VuZGAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWcgfHwge30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG11c3QgYmUgYSBKUywgQ0pTLCBNSlMsIFRTLCBvciBKU09OIGZpbGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coJ05vIGNvbmZpZyBmaWxlIGZvdW5kLiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gISF0eXBlc2NyaXB0O1xuICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIExleENvbmZpZy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja1R5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgdHNjb25maWdQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsICcuL3RzY29uZmlnLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnUGF0aCwgcmVhZEZpbGVTeW5jKHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLi8uLi90c2NvbmZpZy5iYXNlLmpzb24nKSkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0NvbXBpbGVUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICBjb25zdCB0c2NvbmZpZ0NvbXBpbGVQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShsZXhEaXIsICcuL3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnQ29tcGlsZVBhdGgpKSB7XG4gICAgICAvLyBUcnkgdG8gY29weSBmcm9tIHRoZSB0ZW1wbGF0ZSBsb2NhdGlvblxuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcuYnVpbGQuanNvbicpO1xuICAgICAgaWYoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIHdyaXRlRmlsZVN5bmModHNjb25maWdDb21waWxlUGF0aCwgcmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0xpbnRUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICBjb25zdCB0c2NvbmZpZ0xpbnRQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShsZXhEaXIsICcuL3RzY29uZmlnLmxpbnQuanNvbicpO1xuXG4gICAgaWYoIWV4aXN0c1N5bmModHNjb25maWdMaW50UGF0aCkpIHtcbiAgICAgIC8vIFRyeSB0byBjb3B5IGZyb20gdGhlIHRlbXBsYXRlIGxvY2F0aW9uXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsICd0c2NvbmZpZy5saW50Lmpzb24nKTtcbiAgICAgIGlmKGV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnTGludFBhdGgsIHJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tUZXN0VHlwZXNjcmlwdENvbmZpZygpIHtcbiAgICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gICAgY29uc3QgdHNjb25maWdUZXN0UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUobGV4RGlyLCAnLi90c2NvbmZpZy50ZXN0Lmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnVGVzdFBhdGgpKSB7XG4gICAgICAvLyBUcnkgdG8gY29weSBmcm9tIHRoZSB0ZW1wbGF0ZSBsb2NhdGlvblxuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1Rlc3RQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLGNBQWMscUJBQW9CO0FBQ3RELFNBQVEsU0FBUyxXQUFXLGFBQWEsV0FBVyxtQkFBa0I7QUFDdEUsU0FBUSxXQUFVO0FBRWxCLFNBQVEsWUFBWSx1QkFBdUIsd0JBQXVCO0FBQ2xFLFNBQVEsV0FBVTtBQUVsQixNQUFNLE1BQWMsUUFBUSxJQUFJO0FBNkV6QixNQUFNLHNCQUFxQztBQUFBLEVBQ2hELElBQUk7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
|