ember-scoped-css 0.24.2 → 1.0.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 +110 -115
- package/declarations/lib/path/template-transform-paths.d.ts.map +1 -1
- package/declarations/lib/path/utils.d.ts.map +1 -1
- package/declarations/lib/path/utils.paths.test.d.ts +0 -3
- package/declarations/lib/path/utils.paths.test.d.ts.map +1 -1
- package/dist/cjs/babel-plugin.cjs +2 -72
- package/dist/cjs/index.cjs +206 -390
- package/dist/cjs/template-plugin.cjs +201 -120
- package/package.json +5 -18
- package/src/build/babel-plugin.js +2 -38
- package/src/build/index.js +4 -0
- package/src/build/scoped-css-unplugin.js +31 -193
- package/src/build/template-plugin.js +124 -9
- package/src/lib/{rewriteCss.js → css/rewrite.js} +2 -2
- package/src/lib/css/utils.js +74 -3
- package/src/lib/path/hash-from-absolute-path.test.ts +2 -24
- package/src/lib/path/template-transform-paths.js +0 -15
- package/src/lib/path/template-transform-paths.test.ts +8 -69
- package/src/lib/path/utils.appPath.test.ts +4 -15
- package/src/lib/path/utils.findWorkspacePath.test.ts +16 -22
- package/src/lib/path/utils.hashFrom.test.ts +8 -8
- package/src/lib/path/utils.isRelevantFile.test.ts +9 -29
- package/src/lib/path/utils.js +2 -79
- package/src/lib/path/utils.paths.test.ts +1 -4
- package/src/lib/request.js +40 -0
- package/src/lib/rewriteHbs.js +1 -1
- package/dist/cjs/app-css-loader.cjs +0 -531
- package/dist/cjs/ember-classic-support.cjs +0 -708
- package/src/build/app-css-livereload-loader.js +0 -119
- package/src/build/app-css-loader.js +0 -38
- package/src/build/ember-classic-support.js +0 -293
- package/src/lib/findCssInJs.js +0 -29
- package/src/lib/getClassesTagsFromCss.js +0 -48
- package/src/lib/getImportedCssFiles.js +0 -19
- package/src/lib/isInsideGlobal.js +0 -8
- package/src/lib/replaceGlimmerAst.js +0 -63
- package/src/lib/replaceHbsInJs.js +0 -113
package/README.md
CHANGED
|
@@ -1,8 +1,42 @@
|
|
|
1
1
|
# ember-scoped-css
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Scope your component styles and never worry about a collision ever again.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
```gjs
|
|
6
|
+
const greeting = "hello world";
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<div>{{greeting}}</div>
|
|
10
|
+
|
|
11
|
+
<style scoped>
|
|
12
|
+
div {
|
|
13
|
+
color: blue;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
16
|
+
</template>
|
|
17
|
+
```
|
|
18
|
+
becomes the equivelent of;
|
|
19
|
+
```gjs
|
|
20
|
+
const greeting = "hello world";
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<div class="abcd1234">{{greeting}}</div>
|
|
24
|
+
|
|
25
|
+
<style scoped>
|
|
26
|
+
div.abcd1234 {
|
|
27
|
+
color: blue;
|
|
28
|
+
}
|
|
29
|
+
</style>
|
|
30
|
+
</template>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This is a build-time-only addon, so there is no need to worry about runtime performance.
|
|
34
|
+
|
|
35
|
+
You can also write your styles as a co-located `.css` file, right next to your `.gjs`/`.gts` files.
|
|
36
|
+
Every selector you write in your styles is automatically scoped to the component.
|
|
37
|
+
So you can develop your component with styles isolated from the rest of the application and you don't have to worry about CSS selectors collisions or issues with the CSS cascade.
|
|
38
|
+
|
|
39
|
+
_See [Usage](#usage) for details_.
|
|
6
40
|
|
|
7
41
|
If you want to read more specifics on how this addon achieves isolation with CSS you can read more in the [detailed CSS isolation documentation](docs/css-isolation.md)
|
|
8
42
|
|
|
@@ -11,7 +45,7 @@ As selectors are scoped/renamed during the build process. So there is no perform
|
|
|
11
45
|
The philosophy of `ember-scoped-css` is to stick as close to CSS and HTML as possible and not introduce new syntax or concepts unless it is absolutely necessary.
|
|
12
46
|
|
|
13
47
|
You may also find the docs on [CSS `@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) interesting.
|
|
14
|
-
This build tool
|
|
48
|
+
This build tool can emit CSS in a `@layer`.
|
|
15
49
|
|
|
16
50
|
## Compatibility
|
|
17
51
|
|
|
@@ -20,12 +54,21 @@ This build tool emits CSS in a `@layer`.
|
|
|
20
54
|
- non-embroider apps
|
|
21
55
|
- embroider apps
|
|
22
56
|
|
|
23
|
-
| You Have | ember-scoped-css | ember-scoped-css-compat |
|
|
24
|
-
| -------- | ----------- | ---------------------- |
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
57
|
+
| You Have | ember-scoped-css | ember-scoped-css-compat | docs |
|
|
58
|
+
| -------- | ----------- | ---------------------- | --- |
|
|
59
|
+
| vite | >= 1.0.0 | 🚫 | [main][docs-main]
|
|
60
|
+
| gjs / gts library (no hbs) | >= 1.0.0 | 🚫 | [main][docs-main]
|
|
61
|
+
| webpack | <= 0.24.3 | <= 10.0.0 | [0.24.3][docs-2]
|
|
62
|
+
| hbs | <= 0.24.3 | <= 10.0.0 | [0.24.3][docs-2]
|
|
63
|
+
| ember-template-imports@v4 or babel-plugin-ember-template-compilation@2.2.5+ | 0.19.0 | 10.0.0 | [0.19][docs-3] - [0.24][docs-2]
|
|
64
|
+
| ember-template-imports@v3 or babel-plugin-ember-template-compilation@2.2.1 or rollup-plugin-glimmer-template-tag | <= 0.18.0 | <= 9.0.0 | [0.18][docs-4]
|
|
65
|
+
| classic components | <= 0.18.0 | <= 8.0.0 | [0.18][docs-4]
|
|
66
|
+
| ember < 4 | <= 0.18.0 | <= 8.0.0 | [0.18][docs-4]
|
|
67
|
+
|
|
68
|
+
[docs-main]: https://github.com/auditboard/ember-scoped-css/
|
|
69
|
+
[docs-2]: https://github.com/auditboard/ember-scoped-css/tree/v0.24.3-ember-scoped-css
|
|
70
|
+
[docs-3]: https://github.com/auditboard/ember-scoped-css/tree/v0.19.1-ember-scoped-css
|
|
71
|
+
[docs-4]: https://github.com/auditboard/ember-scoped-css/tree/ember-scoped-css%400.18.0
|
|
29
72
|
|
|
30
73
|
## Installation for a Vite app
|
|
31
74
|
|
|
@@ -56,6 +99,7 @@ import * as scopedCSS from "ember-scoped-css/build";
|
|
|
56
99
|
module.exports = {
|
|
57
100
|
plugins: [
|
|
58
101
|
// ...
|
|
102
|
+
[scopedCSS.babelPlugin, {}],
|
|
59
103
|
[
|
|
60
104
|
'babel-plugin-ember-template-compilation',
|
|
61
105
|
{
|
|
@@ -70,29 +114,16 @@ module.exports = {
|
|
|
70
114
|
|
|
71
115
|
```
|
|
72
116
|
|
|
73
|
-
|
|
117
|
+
If you have a rollup config:
|
|
118
|
+
```js
|
|
119
|
+
import * as scopedCss from 'ember-scoped-css/build';
|
|
74
120
|
|
|
75
|
-
|
|
76
|
-
|
|
121
|
+
// ...
|
|
122
|
+
plugins: [
|
|
123
|
+
scopedCss.rollupPlugin(),
|
|
124
|
+
]
|
|
77
125
|
```
|
|
78
126
|
|
|
79
|
-
### Configuration
|
|
80
|
-
|
|
81
|
-
In your `ember-cli-build.js`, you can configure the behavior of scoped-css transformations within the app via
|
|
82
|
-
```js
|
|
83
|
-
|
|
84
|
-
const app = new EmberApp(defaults, {
|
|
85
|
-
/* ... */
|
|
86
|
-
'ember-scoped-css': {
|
|
87
|
-
layerName: 'app-styles', // default: 'components', set to false to disable the layer
|
|
88
|
-
additionalRoots: ['routes/'], // default: [], set this to use scoped-css in pods-using apps
|
|
89
|
-
passthrough: ['some-other-file.css'], // default: [] this is only used in a non-embroider app to pass files through the build pipeline
|
|
90
|
-
passthroughDestination: 'assets' // default: undefined this alters where the passthrough files are placed in the output tree
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Note that supporting `pods` is _opt in_, because all apps can have their pods root directory configured differently.
|
|
96
127
|
|
|
97
128
|
## Installation for an embroider app
|
|
98
129
|
|
|
@@ -100,91 +131,62 @@ Note that supporting `pods` is _opt in_, because all apps can have their pods ro
|
|
|
100
131
|
npm install --save-dev ember-scoped-css ember-scoped-css-compat
|
|
101
132
|
```
|
|
102
133
|
|
|
103
|
-
|
|
104
|
-
```js
|
|
105
|
-
// ember-cli-build.js
|
|
106
|
-
module.exports = async function (defaults) {
|
|
107
|
-
const app = new EmberApp(defaults, { /* ... */ });
|
|
108
|
-
|
|
109
|
-
const { Webpack } = require('@embroider/webpack');
|
|
110
|
-
|
|
111
|
-
return require('@embroider/compat').compatBuild(app, Webpack, {
|
|
112
|
-
/* ... */
|
|
113
|
-
packagerOptions: {
|
|
114
|
-
webpackConfig: {
|
|
115
|
-
module: {
|
|
116
|
-
rules: [
|
|
117
|
-
// css loaders for your app CSS
|
|
118
|
-
{
|
|
119
|
-
test: /\.css$/,
|
|
120
|
-
use: [
|
|
121
|
-
{
|
|
122
|
-
loader: require.resolve(
|
|
123
|
-
'ember-scoped-css/build/app-css-loader'
|
|
124
|
-
),
|
|
125
|
-
options: {
|
|
126
|
-
layerName: 'the-layer-name', // optional
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
},
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## Installation for a V2 Addon
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
npm install --save-dev ember-scoped-css
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
1. If you want to use `.gjs/gts` components, [`@embroider/addon-dev`](https://github.com/embroider-build/embroider/tree/main/packages/addon-dev) provides a plugin for you, `addon.gjs()`.
|
|
146
|
-
|
|
147
|
-
<details><summary>An older approach</summary>
|
|
148
|
-
|
|
149
|
-
There is a deprecated plugin (superseded by `@embroider/addon-dev`) that uses ember-template-imports -- to use this follow the instructions from [rollup-plugin-glimmer-template-tag](https://github.com/NullVoxPopuli/rollup-plugin-glimmer-template-tag) addon.
|
|
150
|
-
|
|
151
|
-
This plugin is not recommended, and is archived.
|
|
152
|
-
|
|
153
|
-
</details>
|
|
134
|
+
### Configuration
|
|
154
135
|
|
|
155
|
-
|
|
136
|
+
All forms of `scopedCss` take an options hash except for the rollup and vite plugins.
|
|
156
137
|
|
|
157
|
-
|
|
158
|
-
+ import { scopedCssUnplugin } from 'ember-scoped-css/build';
|
|
138
|
+
Configuration in the two locations in the babel config should match, for example:
|
|
159
139
|
|
|
160
|
-
// if you want to have some global styles in your addon then
|
|
161
|
-
// put them in the styles folder and change the path to the styles folder
|
|
162
|
-
// if there are no global styles then you can remove addon.keepAssets
|
|
163
|
-
- addon.keepAssets(['**/*.css']),
|
|
164
|
-
+ addon.keepAssets(['**/styles/*.css']),
|
|
165
140
|
|
|
166
|
-
|
|
167
|
-
|
|
141
|
+
```js
|
|
142
|
+
plugins: [
|
|
143
|
+
[scopedCSS.babelPlugin, { layerName: 'my-library' }],
|
|
144
|
+
|
|
145
|
+
[
|
|
146
|
+
'babel-plugin-ember-template-compilation',
|
|
147
|
+
{
|
|
148
|
+
targetFormat: 'hbs',
|
|
149
|
+
transforms: [scopedCSS.templatePlugin({ layerName: 'my-libarry' })],
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
],
|
|
168
153
|
```
|
|
169
154
|
|
|
170
|
-
|
|
155
|
+
## Usage
|
|
171
156
|
|
|
172
|
-
|
|
157
|
+
With `ember-scoped-css` you define styles in an inline `<style scoped>` block or `.css` files that are colocated with your components
|
|
173
158
|
|
|
174
|
-
|
|
159
|
+
```gjs
|
|
160
|
+
// ...
|
|
175
161
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
162
|
+
<template>
|
|
163
|
+
<div data-test-my-component class='hello-class header'>
|
|
164
|
+
<b>Hello</b>, world!
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<style scoped>
|
|
168
|
+
.hello-class {
|
|
169
|
+
color: red;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* the :global() pseudo-class is used to define a global class.
|
|
173
|
+
It mean that header class wont be scoped to that component */
|
|
174
|
+
.hello-class:global(.header) {
|
|
175
|
+
font-size: 20px;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
b {
|
|
179
|
+
color: blue;
|
|
180
|
+
}
|
|
181
|
+
</style>
|
|
182
|
+
</template>
|
|
180
183
|
```
|
|
181
184
|
|
|
182
|
-
|
|
185
|
+
Note that `<style>` (without `scoped`) will continue to work as it does today and be "global styles"
|
|
183
186
|
|
|
184
|
-
|
|
187
|
+
<details><summary>separate CSS file</summary>
|
|
185
188
|
|
|
186
189
|
```hbs
|
|
187
|
-
{{! src/components/my-component.hbs }}
|
|
188
190
|
<div data-test-my-component class='hello-class header'><b>Hello</b>, world!</div>
|
|
189
191
|
```
|
|
190
192
|
|
|
@@ -206,22 +208,14 @@ b {
|
|
|
206
208
|
|
|
207
209
|
NOTE: that if you're using pods, css co-located with templates/routes/etc will need to be named `styles.css`
|
|
208
210
|
|
|
211
|
+
</details>
|
|
212
|
+
|
|
209
213
|
|
|
210
214
|
|
|
211
215
|
### Passing classes as arguments to a component
|
|
212
216
|
|
|
213
|
-
There is a `
|
|
217
|
+
There is a `scopedClass` helper that you can use to pass a class name as an argument to a component. The helper takes a class name and returns a scoped class name. `scopedClass` helper is replaced at build time so there is no performance hit when running the app.
|
|
214
218
|
|
|
215
|
-
```hbs
|
|
216
|
-
{{! src/components/my-component.hbs }}
|
|
217
|
-
<OtherComponent @internalClass={{scoped-class 'hello-class'}} />
|
|
218
|
-
<OtherComponent @internalClass={{(scoped-class 'hello-class')}} />
|
|
219
|
-
<OtherComponent
|
|
220
|
-
@internalClass={{concat (scoped-class 'hello-class') ' other-class'}}
|
|
221
|
-
/>
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
In gjs/gts/`<template>`, the above would look like:
|
|
225
219
|
```gjs
|
|
226
220
|
import { scopedClass } from 'ember-scoped-css';
|
|
227
221
|
|
|
@@ -240,15 +234,15 @@ As classes are renamed during the build process you can't directly verify if cla
|
|
|
240
234
|
|
|
241
235
|
The path to the CSS file is always relative to the V2 addon root no matter where the test is located.
|
|
242
236
|
|
|
243
|
-
```
|
|
237
|
+
```gjs
|
|
244
238
|
import { scopedClass } from 'ember-scoped-css/test-support';
|
|
245
239
|
|
|
246
240
|
test('MyComponent has hello-class', async function (assert) {
|
|
247
241
|
assert.expect(1);
|
|
248
242
|
|
|
249
|
-
await render(
|
|
243
|
+
await render(<template>
|
|
250
244
|
<MyComponent />
|
|
251
|
-
|
|
245
|
+
</template>);
|
|
252
246
|
|
|
253
247
|
const rewrittenClass = scopedClass(
|
|
254
248
|
'hello-class',
|
|
@@ -261,7 +255,7 @@ test('MyComponent has hello-class', async function (assert) {
|
|
|
261
255
|
|
|
262
256
|
## Linting
|
|
263
257
|
|
|
264
|
-
`ember-scoped-css` exports a ember-template-lint plugin with one rule `scoped-class-helper`. This lint rule is intended to help you prevent improper use of the `
|
|
258
|
+
`ember-scoped-css` exports a ember-template-lint plugin with one rule `scoped-class-helper`. This lint rule is intended to help you prevent improper use of the `scopedClass` helper which might not be immediately obvious during regular development. You can read more information in the [lint rules documentation](docs/lint-rules.md)
|
|
265
259
|
|
|
266
260
|
### Steps for adding the rule to the project
|
|
267
261
|
|
|
@@ -288,6 +282,7 @@ module.exports = {
|
|
|
288
282
|
],
|
|
289
283
|
rules: {
|
|
290
284
|
+ 'scoped-class-helper': 'error',
|
|
285
|
+
+ 'no-forbidden-elements': ['meta', 'html', 'script'], // style removed
|
|
291
286
|
}
|
|
292
287
|
|
|
293
288
|
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-transform-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/path/template-transform-paths.js"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,sCAHW,MAAM,GACJ,MAAM,
|
|
1
|
+
{"version":3,"file":"template-transform-paths.d.ts","sourceRoot":"","sources":["../../../src/lib/path/template-transform-paths.js"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,sCAHW,MAAM,GACJ,MAAM,CAqDlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.js"],"names":[],"mappings":"AA4BA;;;;;;GAMG;AACH,mCAHW,MAAM,UAShB;AAED;;GAEG;AACH,6EAEC;AA4CD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qCAHW,MAAM,GACJ,MAAM,CAalB;AAED;;;;;GAKG;AACH,wCAFW,MAAM,WAQhB;AAED;;;;;;;;;;GAUG;AACH,gCAFW,MAAM,WAYhB;AAED;;;;GAIG;AACH,2CAHW,MAAM,UAOhB;AAED;;;;;;;;;GASG;AACH,yCAJW,MAAM,4BACN;IAAE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,uBA0CrD;AAED,8EAsCC;AAED;;;;;;GAMG;AACH,iDAsBC;AA0BD,sEAgCC;AA2BD;;;;GAIG;AACH,uCAFW,MAAM,OAOhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.paths.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.paths.test.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"utils.paths.test.d.ts","sourceRoot":"","sources":["../../../src/lib/path/utils.paths.test.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,KAAK;;;CAGjB,CAAC"}
|
|
@@ -33,9 +33,6 @@ __export(babel_plugin_exports, {
|
|
|
33
33
|
default: () => babel_plugin_default
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(babel_plugin_exports);
|
|
36
|
-
var import_babel_import_util = require("babel-import-util");
|
|
37
|
-
var import_fs = require("fs");
|
|
38
|
-
var import_path = __toESM(require("path"), 1);
|
|
39
36
|
|
|
40
37
|
// src/lib/path/utils.js
|
|
41
38
|
var import_node_assert = __toESM(require("node:assert"), 1);
|
|
@@ -48,59 +45,15 @@ var ourRequire = globalThis.require ? globalThis.require : here && (0, import_no
|
|
|
48
45
|
if (!ourRequire) {
|
|
49
46
|
ourRequire = require;
|
|
50
47
|
}
|
|
51
|
-
var EMBROIDER_DIR = "node_modules/.embroider";
|
|
52
|
-
var EMBROIDER_3_REWRITTEN_APP_PATH = `${EMBROIDER_DIR}/rewritten-app`;
|
|
53
|
-
var EMBROIDER_3_REWRITTEN_APP_ASSETS = `${EMBROIDER_3_REWRITTEN_APP_PATH}/assets`;
|
|
54
|
-
var EMBROIDER_3_REWRITTEN_PACKAGES = `${EMBROIDER_DIR}/rewritten-packages`;
|
|
55
48
|
var IRRELEVANT_PATHS = ["node_modules/.pnpm", "__vite-"];
|
|
56
49
|
var UNSUPPORTED_DIRECTORIES = /* @__PURE__ */ new Set(["tests"]);
|
|
57
50
|
var CWD = process.cwd();
|
|
58
|
-
function cssPathFor(fileName) {
|
|
59
|
-
let withoutExt = withoutExtension(fileName);
|
|
60
|
-
let cssPath = withoutExt + ".css";
|
|
61
|
-
if (isPod(fileName)) {
|
|
62
|
-
cssPath = fileName.replace(/template\.js$/, "styles.css").replace(/template\.hbs/, "styles.css");
|
|
63
|
-
}
|
|
64
|
-
return cssPath;
|
|
65
|
-
}
|
|
66
|
-
function isPodTemplate(filePath) {
|
|
67
|
-
if (filePath.includes("/components/")) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
return filePath.endsWith("template.js") || filePath.endsWith("template.hbs");
|
|
71
|
-
}
|
|
72
|
-
function isPod(filePath) {
|
|
73
|
-
if (filePath.includes("/components/")) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
if (isPodTemplate(filePath)) {
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
return filePath.endsWith("styles.css");
|
|
80
|
-
}
|
|
81
|
-
function withoutExtension(filePath) {
|
|
82
|
-
let parsed = import_node_path.default.parse(filePath);
|
|
83
|
-
return import_node_path.default.join(parsed.dir, parsed.name);
|
|
84
|
-
}
|
|
85
51
|
function isRelevantFile(fileName, { additionalRoots, cwd }) {
|
|
52
|
+
if (fileName.startsWith("/testem")) return false;
|
|
86
53
|
if (fileName.startsWith("\0")) return false;
|
|
87
54
|
if (fileName.match(/^[a-zA-Z]/)) return false;
|
|
88
55
|
if (fileName.startsWith("/@embroider")) return false;
|
|
89
56
|
if (IRRELEVANT_PATHS.some((i) => fileName.includes(i))) return false;
|
|
90
|
-
if (fileName.includes("/node_modules/")) {
|
|
91
|
-
if (!fileName.includes(EMBROIDER_DIR)) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
if (fileName.includes(EMBROIDER_3_REWRITTEN_PACKAGES)) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
if (fileName.includes(EMBROIDER_3_REWRITTEN_APP_ASSETS)) {
|
|
98
|
-
if (fileName.endsWith(`${EMBROIDER_3_REWRITTEN_APP_ASSETS}/tests.js`)) {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
57
|
let workspace = findWorkspacePath(fileName);
|
|
105
58
|
(0, import_node_assert.default)(cwd, `cwd was not passed to isRelevantFile`);
|
|
106
59
|
let ourWorkspace = findWorkspacePath(cwd);
|
|
@@ -132,9 +85,6 @@ function getSeen(sourcePath) {
|
|
|
132
85
|
}
|
|
133
86
|
function findWorkspacePath(sourcePath, options) {
|
|
134
87
|
let cwd = options?.cwd ?? CWD;
|
|
135
|
-
if (sourcePath.includes(EMBROIDER_3_REWRITTEN_APP_PATH)) {
|
|
136
|
-
sourcePath = sourcePath.split(EMBROIDER_3_REWRITTEN_APP_PATH)[0];
|
|
137
|
-
}
|
|
138
88
|
if (sourcePath.endsWith("/")) {
|
|
139
89
|
sourcePath = sourcePath.replace(/\/$/, "");
|
|
140
90
|
}
|
|
@@ -190,7 +140,6 @@ var babel_plugin_default = (env, options, workingDirectory) => {
|
|
|
190
140
|
state.canSkip = true;
|
|
191
141
|
return;
|
|
192
142
|
}
|
|
193
|
-
state.importUtil = new import_babel_import_util.ImportUtil(env, path2);
|
|
194
143
|
}
|
|
195
144
|
},
|
|
196
145
|
ImportDeclaration(path2, state) {
|
|
@@ -220,27 +169,8 @@ var babel_plugin_default = (env, options, workingDirectory) => {
|
|
|
220
169
|
if (path2.node.value.type === "Identifier" && path2.node.value.name === state.file.opts?.importedScopedClass) {
|
|
221
170
|
path2.remove();
|
|
222
171
|
}
|
|
223
|
-
},
|
|
224
|
-
/**
|
|
225
|
-
* If there is a CSS file, AND a corresponding template,
|
|
226
|
-
* we can import the CSS to then defer to the CSS loader
|
|
227
|
-
* or other CSS processing to handle the postfixing
|
|
228
|
-
*/
|
|
229
|
-
CallExpression(path2, state) {
|
|
230
|
-
if (state.canSkip) {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const node = path2.node;
|
|
234
|
-
if (node.callee.name === "precompileTemplate" || node.callee.name === "hbs" || node.callee.name === "createTemplateFactory") {
|
|
235
|
-
const fileName = state.file.opts.sourceFileName || state.file.opts.filename;
|
|
236
|
-
let cssPath = cssPathFor(fileName);
|
|
237
|
-
if ((0, import_fs.existsSync)(cssPath)) {
|
|
238
|
-
let baseCSS = import_path.default.basename(cssPath);
|
|
239
|
-
state.importUtil.importForSideEffect(`./${baseCSS}`);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
172
|
}
|
|
243
173
|
}
|
|
244
174
|
};
|
|
245
175
|
};
|
|
246
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2JhYmVsLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvdXRpbHMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEltcG9ydFV0aWwgfSBmcm9tICdiYWJlbC1pbXBvcnQtdXRpbCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IG5vZGVQYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBjc3NQYXRoRm9yLCBpc1JlbGV2YW50RmlsZSB9IGZyb20gJy4uL2xpYi9wYXRoL3V0aWxzLmpzJztcblxuZnVuY3Rpb24gX2lzUmVsZXZhbnRGaWxlKHN0YXRlLCBjd2QpIHtcbiAgbGV0IGZpbGVOYW1lID0gc3RhdGUuZmlsZS5vcHRzLmZpbGVuYW1lO1xuICBsZXQgYWRkaXRpb25hbFJvb3RzID0gc3RhdGUub3B0cz8uYWRkaXRpb25hbFJvb3RzO1xuXG4gIHJldHVybiBpc1JlbGV2YW50RmlsZShmaWxlTmFtZSwge1xuICAgIGFkZGl0aW9uYWxSb290cyxcbiAgICBjd2QsXG4gIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBlbnYgLSBiYWJlbCBwbHVnaW4gZW52LCBlbnYudHlwZXMgaXMgbW9zdCBjb21tb25seSB1c2VkIChlc3AgaW4gVFMpXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIHRoZSBvcHRpb25zIGZvciBzY29wZWQtY3NzIC0tIHRoaXMgaXMgYWxzbyBhdmFpbGFibGUgaW4gZWFjaCB2aXNpdG9yJ3Mgc3RhdGUub3B0c1xuICogQHBhcmFtIHtzdHJpbmd9IHdvcmtpbmdEaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGVudiwgb3B0aW9ucywgd29ya2luZ0RpcmVjdG9yeSkgPT4ge1xuICAvKipcbiAgICogVGhpcyBiYWJlbCBwbHVnaW4gZG9lcyB0aHJlZSB0aGluZ3M6XG4gICAqIC0gcmVtb3ZlcyB0aGUgaW1wb3J0IG9mIHNjb3BlZENsYXNzLCBpZiBpdCBleGlzdHNcbiAgICogICAtIGlmIHNjb3BlZENsYXNzIHdhcyBpbXBvcnRlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFueSBjb21wb25lbnQncyBcInNjb3BlIGJhZ1wiXG4gICAqICAgICAodGhlIHNjb3BlIGJhZyBiZWluZyBhIGxvdy1sZXZlbCBvYmplY3QgdXNlZCBmb3IgcGFzc2luZyB3aGF0IGlzIFwiaW4gc2NvcGVcIiBmb3IgYSBjb21wb25lbnQpXG4gICAqIC0gYWRkcyBhbiBpbXBvcnQgdG8gdGhlIENTUyBmaWxlLCBpZiBpdCBleGlzdHNcbiAgICovXG4gIHJldHVybiB7XG4gICAgdmlzaXRvcjoge1xuICAgICAgUHJvZ3JhbToge1xuICAgICAgICBlbnRlcihwYXRoLCBzdGF0ZSkge1xuICAgICAgICAgIGlmICghX2lzUmVsZXZhbnRGaWxlKHN0YXRlLCB3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgc3RhdGUuY2FuU2tpcCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0ZS5pbXBvcnRVdGlsID0gbmV3IEltcG9ydFV0aWwoZW52LCBwYXRoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBJbXBvcnREZWNsYXJhdGlvbihwYXRoLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUuY2FuU2tpcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLm5vZGUuc291cmNlLnZhbHVlID09PSAnZW1iZXItc2NvcGVkLWNzcycpIHtcbiAgICAgICAgICBsZXQgc3BlY2lmaWVyID0gcGF0aC5ub2RlLnNwZWNpZmllcnMuZmluZChcbiAgICAgICAgICAgICh4KSA9PiB4LmltcG9ydGVkLm5hbWUgPT09ICdzY29wZWRDbGFzcycsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgICAgICAgIHN0YXRlLmZpbGUub3B0cy5pbXBvcnRlZFNjb3BlZENsYXNzID0gc3BlY2lmaWVyLmxvY2FsLm5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNwZWNpZmllci5sb2NhbC5uYW1lICE9PSAnc2NvcGVkQ2xhc3MnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgc2NvcGVkQ2xhc3MgaW1wb3J0IGlzIGEgcHN1ZWRvLWhlbHBlciwgYW5kIG1heSBub3QgYmUgcmVuYW1lZCBhcyBpdCBpcyByZW1vdmVkIGF0IGJ1aWxkIHRpbWUuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGF0aC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogT25seSBpbiBzdHJpY3QgbW9kZSwgZG8gd2UgY2FyZSBhYm91dCByZW1vbmluZyB0aGUgc2NvcGUgYmFnIHJlZmVyZW5jZVxuICAgICAgICovXG4gICAgICBPYmplY3RQcm9wZXJ0eShwYXRoLCBzdGF0ZSkge1xuICAgICAgICBpZiAoIXN0YXRlLmZpbGUub3B0cz8uaW1wb3J0ZWRTY29wZWRDbGFzcykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYXRoLm5vZGUudmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgICAgICAgcGF0aC5ub2RlLnZhbHVlLm5hbWUgPT09IHN0YXRlLmZpbGUub3B0cz8uaW1wb3J0ZWRTY29wZWRDbGFzc1xuICAgICAgICApIHtcbiAgICAgICAgICBwYXRoLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGVyZSBpcyBhIENTUyBmaWxlLCBBTkQgYSBjb3JyZXNwb25kaW5nIHRlbXBsYXRlLFxuICAgICAgICogd2UgY2FuIGltcG9ydCB0aGUgQ1NTIHRvIHRoZW4gZGVmZXIgdG8gdGhlIENTUyBsb2FkZXJcbiAgICAgICAqIG9yIG90aGVyIENTUyBwcm9jZXNzaW5nIHRvIGhhbmRsZSB0aGUgcG9zdGZpeGluZ1xuICAgICAgICovXG4gICAgICBDYWxsRXhwcmVzc2lvbihwYXRoLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUuY2FuU2tpcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBwYXRoLm5vZGU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUuY2FsbGVlLm5hbWUgPT09ICdwcmVjb21waWxlVGVtcGxhdGUnIHx8XG4gICAgICAgICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ2hicycgfHxcbiAgICAgICAgICBub2RlLmNhbGxlZS5uYW1lID09PSAnY3JlYXRlVGVtcGxhdGVGYWN0b3J5J1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9XG4gICAgICAgICAgICBzdGF0ZS5maWxlLm9wdHMuc291cmNlRmlsZU5hbWUgfHwgc3RhdGUuZmlsZS5vcHRzLmZpbGVuYW1lO1xuXG4gICAgICAgICAgbGV0IGNzc1BhdGggPSBjc3NQYXRoRm9yKGZpbGVOYW1lKTtcblxuICAgICAgICAgIGlmIChleGlzdHNTeW5jKGNzc1BhdGgpKSB7XG4gICAgICAgICAgICBsZXQgYmFzZUNTUyA9IG5vZGVQYXRoLmJhc2VuYW1lKGNzc1BhdGgpO1xuXG4gICAgICAgICAgICBzdGF0ZS5pbXBvcnRVdGlsLmltcG9ydEZvclNpZGVFZmZlY3QoYC4vJHtiYXNlQ1NTfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufTtcbiIsICJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmc1N5bmMsIHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5pbXBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmV4cG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5leHBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmNvbnN0IENPTVBPTkVOVF9FWFRFTlNJT05TID0gWycuZ3RzJywgJy5nanMnLCAnLnRzJywgJy5qcycsICcuaGJzJ107XG5cbi8vIENKUyAvIEVTTT9cbmxldCBoZXJlID0gaW1wb3J0Lm1ldGEudXJsO1xubGV0IG91clJlcXVpcmUgPSBnbG9iYWxUaGlzLnJlcXVpcmVcbiAgPyBnbG9iYWxUaGlzLnJlcXVpcmVcbiAgOiBoZXJlICYmIGNyZWF0ZVJlcXVpcmUoaGVyZSk7XG5cbmlmICghb3VyUmVxdWlyZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgb3VyUmVxdWlyZSA9IHJlcXVpcmU7XG59XG5cbmNvbnN0IEVNQlJPSURFUl9ESVIgPSAnbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXInO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIID0gYCR7RU1CUk9JREVSX0RJUn0vcmV3cml0dGVuLWFwcGA7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX0FTU0VUUyA9IGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYXNzZXRzYDtcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUyA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1wYWNrYWdlc2A7XG5jb25zdCBJUlJFTEVWQU5UX1BBVEhTID0gWydub2RlX21vZHVsZXMvLnBucG0nLCAnX192aXRlLSddO1xuY29uc3QgVU5TVVBQT1JURURfRElSRUNUT1JJRVMgPSBuZXcgU2V0KFsndGVzdHMnXSk7XG5cbmNvbnN0IENXRCA9IHByb2Nlc3MuY3dkKCk7XG5cbi8qKlxuICogUmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBmaWxlUGF0aCBmb3JtYXQgaXMsXG4gKiB0aGlzIHdpbGwgdHJ5IHRvIHJldHVybiB0aGUgY29ycmVjdCBwb3N0Zml4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hGcm9tKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gaGFzaEZyb21BYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGhhc2hGcm9tTW9kdWxlUGF0aChmaWxlUGF0aCk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0hhc0Fzc29jaWF0ZWRDb21wb25lbnQoY3NzUGF0aCkge1xuICByZXR1cm4gY3NzSGFzU3RhbmRhcmRGaWxlKGNzc1BhdGgpIHx8IGNzc0hhc1BvZHNGaWxlKGNzc1BhdGgpO1xufVxuXG5mdW5jdGlvbiBjc3NIYXNTdGFuZGFyZEZpbGUoaWQpIHtcbiAgLyoqXG4gICAqIE5vcm1hbGx5IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYSBKUyBwYXRoIGhlcmUsIGJ1dCB3aGVuIHVzaW5nXG4gICAqIGVtYnJvaWRlckAzLCB3ZSBoYXZlIGEgXCJyZXdyaXR0ZW4gYXBwXCIsIHdoaWNoIGhhcyBhbGwgb3VyIHNvdXJjZVxuICAgKiBwcmVwcm9jZXNzZWQgYSBiaXQgYmVmb3JlIHNjb3BlZC1jc3MgdHJhbnNmb3JtYXRpb25zLlxuICAgKlxuICAgKiAoSW4gVml0ZSwgd2Ugb3BlcmF0ZSBtb3JlIGRpcmVjdGx5IHdpdGggdGhlIHNvdXJjZSlcbiAgICovXG4gIGZvciAobGV0IGV4dCBvZiBDT01QT05FTlRfRVhURU5TSU9OUykge1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gaWQucmVwbGFjZSgvXFwuY3NzJC8sIGV4dCk7XG5cbiAgICBpZiAoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjc3NIYXNQb2RzRmlsZShpZCkge1xuICBpZiAoIWlkLmVuZHNXaXRoKCdzdHlsZXMuY3NzJykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsbHkgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhIEpTIHBhdGggaGVyZSwgYnV0IHdoZW4gdXNpbmdcbiAgICogZW1icm9pZGVyQDMsIHdlIGhhdmUgYSBcInJld3JpdHRlbiBhcHBcIiwgd2hpY2ggaGFzIGFsbCBvdXIgc291cmNlXG4gICAqIHByZXByb2Nlc3NlZCBhIGJpdCBiZWZvcmUgc2NvcGVkLWNzcyB0cmFuc2Zvcm1hdGlvbnMuXG4gICAqXG4gICAqIChJbiBWaXRlLCB3ZSBvcGVyYXRlIG1vcmUgZGlyZWN0bHkgd2l0aCB0aGUgc291cmNlKVxuICAgKi9cbiAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgbGV0IGNhbmRpZGF0ZVBhdGggPSBpZC5yZXBsYWNlKC9zdHlsZXNcXC5jc3MkLywgYHRlbXBsYXRlJHtleHR9YCk7XG5cbiAgICBpZiAoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJhc2VkIG9uIGVtYmVyJ3MgY29tcG9uZW50IGxvY2F0aW9uIGNvbnZlbnRpb25zLFxuICogdGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgYSBwYXRoIGZvciB3aGVyZSB3ZVxuICogZXhwZWN0IHRoZSBDU1MgdG8gbGl2ZS5cbiAqXG4gKiBGb3IgY28tbG9jYXRlZCBzdHJ1Y3R1cmU6XG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuY3NzXG4gKlxuICogRm9yIG5lc3RlZCBjby1sb2NhdGVkIHN0cnVjdHVyZVxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uY3NzXG4gKlxuICogRm9yIFBvZHMgcm91dGVzIHN0cnVjdHVyZVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS90ZW1wbGF0ZS57aGJzLGpzfVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS9zdHlsZXMuY3NzXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0ZWQ6XG4gKiAgIC0gY29tcG9uZW50cyB3LyBwb2RzIC0tIHRoaXMgaXMgZGVwcmVjYXRlZCBpbiA1LjEwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gdGhlIGhicywganMsIGdqcywgZ3RzIG9yIHdoYXRldmVyIGNvLWxvY2F0ZWQgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gZXhwZWN0ZWQgY3NzIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1BhdGhGb3IoZmlsZU5hbWUpIHtcbiAgbGV0IHdpdGhvdXRFeHQgPSB3aXRob3V0RXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgbGV0IGNzc1BhdGggPSB3aXRob3V0RXh0ICsgJy5jc3MnO1xuXG4gIGlmIChpc1BvZChmaWxlTmFtZSkpIHtcbiAgICBjc3NQYXRoID0gZmlsZU5hbWVcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmpzJC8sICdzdHlsZXMuY3NzJylcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmhicy8sICdzdHlsZXMuY3NzJyk7XG4gIH1cblxuICByZXR1cm4gY3NzUGF0aDtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmpzJykgfHwgZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmhicycpO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGVuZHMgd2l0aFxuICogLSB0ZW1wbGF0ZS5qc1xuICogLSB0ZW1wbGF0ZS5oYnNcbiAqIC0gc3R5bGVzLmNzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2QoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJyk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMgdGhlIHNhbWUgcGF0aCwgYnV0IHdpdGhvdXQgdGhlIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEV4dGVuc2lvbihmaWxlUGF0aCkge1xuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG5cbiAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG59XG5cbi8qKlxuICogRXhhbXBsZXMgZm9yIGZpbGVOYW1lXG4gKiAtIGFic29sdXRlIG9uLWRpc2sgcGF0aFxuICogLSBpbiB3ZWJwYWNrXG4gKiAgIC0gVVJMLWFic29sdXRlIHBhdGgsIHN0YXJ0aW5nIHdpdGggL1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZVxuICogQHBhcmFtIHt7IGFkZGl0aW9uYWxSb290cz86IHN0cmluZ1tdOyBjd2Q6IHN0cmluZyB9fSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxldmFudEZpbGUoZmlsZU5hbWUsIHsgYWRkaXRpb25hbFJvb3RzLCBjd2QgfSkge1xuICAvLyBQcml2YXRlIFZpcnR1YWwgTW9kdWxlc1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnXFwwJykpIHJldHVybiBmYWxzZTtcbiAgLy8gVGhlc2UgYXJlIG5vdCB2YWxpZCB1c2VybGFuZCBuYW1lcyAob3IgYXJlIGZyb20gbGlicmFyaWVzKVxuICBpZiAoZmlsZU5hbWUubWF0Y2goL15bYS16QS1aXS8pKSByZXR1cm4gZmFsc2U7XG4gIC8vIEV4dGVybmFsIHRvIHVzXG4gIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCcvQGVtYnJvaWRlcicpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChJUlJFTEVWQU5UX1BBVEhTLnNvbWUoKGkpID0+IGZpbGVOYW1lLmluY2x1ZGVzKGkpKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChmaWxlTmFtZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSkge1xuICAgIC8vIGlmIGEgZmlsZSBpcyBub3QgdGhlIGVtYnJvaWRlciBjYWNoZSBkaXJlY3RvcnlcbiAgICAvLyBhbmQgaXMgaW4gbm9kZV9tb2R1bGVzLCBza2lwIGl0LlxuICAgIGlmICghZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSX0RJUikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyByZXdyaXR0ZW4gcGFja2FnZXMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhdCB0aGVpciBvd25cbiAgICAvLyBwdWJsaXNoIHRpbWVcbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX1BBQ0tBR0VTKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoZXNlIGFyZSBhbHJlYWR5IHRoZSBidW5kbGVkIGZpbGVzLlxuICAgIGlmIChmaWxlTmFtZS5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX0FTU0VUUykpIHtcbiAgICAgIC8vIG5vdCBzdXBwb3J0ZWQsIG5ldmVyIHdpbGwgYmVcbiAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aChgJHtFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX0FTU0VUU30vdGVzdHMuanNgKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElkZWFsbHksIHdlIG5ldmVyIGdldCBoZXJlIC0tIGluZGljYXRlcyB3ZSdyZSBub3QgZmlsdGVyaW5nIGVmZmVjdGl2ZWx5IGluIGJhYmVsXG4gICAgICAvLyBOT1RFOiBpZiB3ZSBnZXQgaGVyZSwgd2UncmUgdHJ5aW5nIHRvIG9wZXJhdGUgb24gYSBmaWxlIHRvbyBsYXRlLlxuICAgICAgLy8gICAgICAgd2UgbmVlZCBTY29wZWRDU1MgdG8gb3BlcmF0ZSBhcyBjbG9zZSB0byBvcmlnaW5hbCBzb3VyY2UgYXMgcG9zc2libGUgLS0gbm90IG91dHB1dCBmaWxlcy5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIGFzc2VydChjd2QsIGBjd2Qgd2FzIG5vdCBwYXNzZWQgdG8gaXNSZWxldmFudEZpbGVgKTtcblxuICBsZXQgb3VyV29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoY3dkKTtcblxuICBpZiAod29ya3NwYWNlICE9PSBvdXJXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgbG9jYWwgPSBmaWxlTmFtZS5yZXBsYWNlKHdvcmtzcGFjZSwgJycpO1xuICBsZXQgWywgLi4ucGFydHNdID0gbG9jYWwuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTLmhhcyhwYXJ0c1swXSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IHBvZHMgc3VwcG9ydC5cbiAgICogZm9sa3MgbmVlZCB0byBvcHQgaW4gdG8gcG9kcyAocm91dGVzKSwgYmVjYXVzZSBldmVyeSBwb2RzIGFwcCBjYW4gYmUgY29uZmlndXJlZCBkaWZmZXJlbnRseVxuICAgKi9cbiAgbGV0IHJvb3RzID0gWycvY29tcG9uZW50cy8nLCAnL3RlbXBsYXRlcy8nLCAuLi4oYWRkaXRpb25hbFJvb3RzIHx8IFtdKV07XG5cbiAgaWYgKCFyb290cy5zb21lKChyb290KSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhyb290KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHBhY2thZ2VTY29wZWRQYXRoKSB7XG4gIC8qKlxuICAgKiAqQnkgY29udmVudGlvbiosIGBzcmNgIGlzIG9taXR0ZWQgZnJvbSBjb21wb25lbnQgcGF0aHMuXG4gICAqIFdlIGNhbiByZWZsZWN0IHRoZSBzYW1lIGJlaGF2aW9yIGJ5IHJlcGxhY2luZyBzcmMvXG4gICAqIHdpdGggYW4gZW1wdHkgc3RyaW5nLlxuICAgKlxuICAgKiBDU1MgaXNuJ3QgZW1pdHRlZCBhcyBhIGNvLWxvY2F0ZWQgbW9kdWxlLCBidXRcbiAgICogdG8ga2VlcCBjb252ZW50aW9ucyBjb25zaXN0ZW50IGFjcm9zcyBsYW5ndWFnZXMsXG4gICAqIHdlIGNhbiBwcmV0ZW5kIGl0IGlzLlxuICAgKlxuICAgKiBBbnkgY3VzdG9taXphdGlvbiBiZXlvbmQgcmVtb3ZpbmcgYHNyY2AgYW5kIGBhcHBgIGlzIHBvdGVudGlhbGx5IGNvbmZ1c2luZy5cbiAgICogSWYgd2UgbmVlZCBmdXJ0aGVyIGN1c3RvbWl6YXRpb25zLCB3ZSdsbCB3YW50IHRvIG1hdGNoIG9uIGBleHBvcnRzYCBpbiB0aGVcbiAgICogY29ycmVzcG9uZGluZyBwYWNrYWdlLmpzb25cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlU2NvcGVkUGF0aC5yZXBsYWNlKC9eXFwvc3JjXFwvLywgJy8nKTtcblxuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIGlmIChpc1BvZChwYWNrYWdlUmVsYXRpdmUpKSB7XG4gICAgLyoqXG4gICAgICogRm9yIHBvZHMsIHdlIGNob3Agb2ZmIHRoZSB3aG9sZSBmaWxlLCBhbmQgdXNlIHRoZSBkaXIgbmFtZSBhcyB0aGUgXCJtb2R1bGVQYXRoXCJcbiAgICAgKi9cbiAgICByZXR1cm4gcGFyc2VkLmRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gaXMgcGFzc2VkLCByZW1vdmUgaXQuXG4gICAqIFdoZW4gdXNpbmcgcGFja2FnZXJzLCBmb2xrcyBhcmUgdXNlZCB0byBub3QgaGF2aW5nIHRvIHNwZWNpZnkgZXh0ZW5zaW9ucyBmb3IgZmlsZXMuXG4gICAqIFNpbmNlIHdlIGRvbid0IGV2ZW4gZW1pdCBjc3MgZmlsZXMgY28tbG9jYXRlZCB0byBlYWNoIG1vZHVsZSxcbiAgICogdGhpcyBoZWxwcyB1cyBub3QgY29udmV5IGEgbGllIHRoYXQgYSBmaWxlIG1heSBleGlzdCBpbiBhdCBydW50aW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSBgPG1vZHVsZS1uYW1lPi9jb21wb25lbnRzL2J1dHRvbmAuXG4gICAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGV4dGVuc2lvbiBpcywgYmVjYXVzZSB5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgY3NzIGZpbGVcbiAgICogZm9yIHRoZSBidXR0b24gbW9kdWxlIGFueXdheS5cbiAgICovXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcblxuICByZXR1cm4gbG9jYWxQYWNrYWdlclN0eWxlUGF0aDtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBhcHAtbW9kdWxlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlXG4gKlxuICogVGhpcyBhc3N1bWVzIG5vcm1hbCBlbWJlciBhcHAgY29udmVudGlvbnNcbiAqXG4gKiB3aGljaCBpcyBgPHBhY2thZ2UuanNvbiNuYW1lPi9wYXRoLXRvLWZpbGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBQYXRoKHNvdXJjZVBhdGgpIHtcbiAgbGV0IHdvcmtzcGFjZVBhdGggPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgbGV0IG5hbWUgPSBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpO1xuXG4gIC8qKlxuICAgKiAgVW5kZXIgZW1icm9pZGVyIGJ1aWxkcywgdGhlIHNwZWMtY29tcGxpYW50IHZlcnNpb24gb2YgdGhlIGFwcFxuICAgKiBoYXMgYWxsIHRoZSBmaWxlcyB1bmRlciBhIGZvbGRlciB3aGljaCByZXByZXNlbnRzIHRoZSBwYWNrYWdlIG5hbWUsXG4gICAqIHJhdGhlciB0aGFuIFwiYXBwXCIuXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gc291cmNlUGF0aC5yZXBsYWNlKHdvcmtzcGFjZVBhdGgsICcnKTtcblxuICAvKipcbiAgICogQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCAnYXBwJyAtLSB3aGljaCBpcyBwcmVzZW50IGluIHRoZSB2MSBhZGRvbiBwaXBlbGluZVxuICAgKi9cbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoYC9hcHAvYCwgYC9gKTtcblxuICAvKipcbiAgICogYWxzbyBhbHNvLCB3ZSBrbm93IHRoYXQgdGhlIHJlLXdyaXR0ZW4gYXBwIHN0cnVjdHVyZSBpbiBlbWJyb2lkZXJAdjNcbiAgICogaXMgZXh0cmFuZW91cywgYW5kIHdlIGNhbiBjb2xsYXBzZSBpdFxuICAgKi9cbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoXG4gICAgYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIfS9gLFxuICAgICcvJyxcbiAgKTtcblxuICAvLyBBbnkgb2YgdGhlIGFib3ZlIHJlbHBhY2VtZW50cyBjb3VsZCBhY2NpZGVudGFsbHkgZ2l2ZSB1cyBhbiBleHRyYSAvIChkZXBlbmRpbmcgb24gb3VyIGJ1aWxkIGVudmlyb25tZW50KVxuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZSgnLy8nLCAnLycpO1xuXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVJlbGF0aXZlKTtcblxuICByZXR1cm4gYCR7bmFtZX0ke2xvY2FsUGFja2FnZXJTdHlsZVBhdGh9YDtcbn1cblxuLyoqXG4gKiBUbyBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzZXRtLCB3ZSdsbCBzdG9yZSBhbGwgZm91bmRcbiAqIHByb2plY3QgcGF0aHMgYmVyZSwgc28gd2UgY2FuLCBpbiBtZW1vcnksXG4gKiBnZXQgdGhlIGZvbGRlciB3aGVyZSBhIHBhY2thZ2UuanNvbiBleGlzdHMsIHJhdGhlciB0aGFuXG4gKiBoaXQgdGhlIGZpbGUgc3lzdGVtIGV2ZXJ5IHRpbWUuXG4gKi9cbmNvbnN0IFNFRU4gPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIGdldFNlZW4oc291cmNlUGF0aCkge1xuICBpZiAoU0VFTi5oYXMoc291cmNlUGF0aCkpIHJldHVybiBzb3VyY2VQYXRoO1xuXG4gIGxldCBwYXJ0cyA9IHNvdXJjZVBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHNlZW4gPSBTRUVOLmhhcyh0b0NoZWNrKTtcblxuICAgIGlmIChzZWVuKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG5cbiAgaWYgKHNvdXJjZVBhdGguaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnNwbGl0KEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSClbMF07XG4gIH1cblxuICBpZiAoc291cmNlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgfVxuXG4gIGxldCBzZWVuID0gZ2V0U2Vlbihzb3VyY2VQYXRoKTtcblxuICBpZiAoc2Vlbikge1xuICAgIHJldHVybiBzZWVuO1xuICB9XG5cbiAgbGV0IGNhbmRpZGF0ZVBhdGggPSBwYXRoLmpvaW4oc291cmNlUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGNvbnN0IGlzV29ya3NwYWNlID0gZnNTeW5jLmV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCk7XG5cbiAgaWYgKGlzV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZVBhdGg7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBmaW5kUGFja2FnZUpzb25VcChzb3VyY2VQYXRoLCB7IGN3ZCB9KTtcblxuICBpZiAoIXBhY2thZ2VKc29uUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwcm9qZWN0IGZvciAke3NvdXJjZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYXRoID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCk7XG5cbiAgU0VFTi5hZGQod29ya3NwYWNlUGF0aCk7XG5cbiAgcmV0dXJuIHdvcmtzcGFjZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblVwKHN0YXJ0UGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcbiAgbGV0IHBhcnRzID0gc3RhcnRQYXRoLnNwbGl0KCcvJyk7XG5cbiAgZm9yIChsZXQgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPiAxOyBpLS0pIHtcbiAgICBsZXQgdG9DaGVjayA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTtcblxuICAgIGxldCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbih0b0NoZWNrLCAncGFja2FnZS5qc29uJyk7XG4gICAgbGV0IGV4aXN0cyA9IGZzU3luYy5leGlzdHNTeW5jKHBhY2thZ2VKc29uKTtcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIHJldHVybiBwYWNrYWdlSnNvbjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB0cmF2ZXJzZSBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uXG4gICAgaWYgKHRvQ2hlY2sgPT09IGN3ZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IE1BTklGRVNUX0NBQ0hFID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFdpbGwgcmV0dXJuIHRoZSBwYWNrYWdlLmpzb24jbmFtZSwgb3IgY29uZmlnL2Vudmlyb25tZW50I21vdWRsZVByZWZpeCAoaWYgdjEgYXBwKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKTtcblxuICBpZiAobWFuaWZlc3RbJ2VtYmVyLWFkZG9uJ10pIHtcbiAgICAvKipcbiAgICAgKiBMaWJyYXJpZXMgYXJlIG5vdCBhbGxvd2VkIHRvIGN1c3RvbWl6ZSB0aGVpciBtb2R1bGUgbmFtZVxuICAgICAqIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZWlyIHBhY2thZ2UgbmFtZS5cbiAgICAgKlxuICAgICAqIChJdCdzIGFsc28gYm9ua2VycyB0aGF0IHRoaXMgaXMgYWxsb3dlZCBmb3IgdjEgYXBwcylcbiAgICAgKi9cbiAgICByZXR1cm4gbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgdjEgYXBwcywgd2UgbmVlZCB0byByZWZlcmVuY2UgdGhlIGNvbmZpZy9lbnZpcm9ubWVudC5qcyBmaWxlXG4gICAqIHRvIHNlZSBpZiB0aGUgbW9kdWxlUHJlZml4IHNldHRpbmcgZGlmZmVycyBmcm9tIG1hbmlmZXN0Lm5hbWU7XG4gICAqL1xuICBsZXQgZW52aXJvbm1lbnRKUyA9IHBhdGguam9pbih3b3Jrc3BhY2UsICdjb25maWcvZW52aXJvbm1lbnQuanMnKTtcblxuICAvKipcbiAgICogTk9URTogdGhlIGVudmlyb25tZW50LmpzIGlzIGEgY29tbW9uSlMgZmlsZSwgc28gd2UgY2FuIHN5bmNocm9ub3VzbHkgcmVxdWlyZSBpdFxuICAgKlxuICAgKiBUT0RPOiBpZiB3ZSBoYXZlIGlzc3VlcyB3aXRoIGxvYWRpbmcgdGhpcyBmaWxlIGxhdGVyIHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IHJ1biBqc2NvZGVzaGlmdCBvbiBpdFxuICAgKiAgICAgICBidXQgdGhhdCBjb3VsZCBhbGxvdyB1cyB0byBiZSBicml0dGxlIGluIGRpZmZlcmVudCB3YXlzLCBsaWtlIGlmIGZvbGtzIHN0cmF5IGZyb20gdGhlIHdheSB0aGVcbiAgICogICAgICAgZmlsZSBpcyBsYWlkIG91dCBmcm9tIHRoZSBibHVlcHJpbnQgZGVmYXVsdHMuXG4gICAqL1xuICBpZiAoZnNTeW5jLmV4aXN0c1N5bmMoZW52aXJvbm1lbnRKUykpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYgLS0gdGhpcyBleGlzdHNcbiAgICBjb25zdCBlbnZGbiA9IG91clJlcXVpcmUoZW52aXJvbm1lbnRKUyk7XG4gICAgY29uc3QgZW52ID0gZW52Rm4oJ2VtYmVyLXNjb3BlZC1jc3MnKTtcblxuICAgIHJldHVybiBlbnYubW9kdWxlUHJlZml4IHx8IG1hbmlmZXN0Lm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgdG8gdGhlIHRydWVcdTIxMjIgbW9kdWxlXHUyMTIyIG5hbWUuXG4gICAqL1xuICByZXR1cm4gbWFuaWZlc3QubmFtZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya3NwYWNlXG4gKi9cbmZ1bmN0aW9uIGdldE1hbmlmZXN0KHdvcmtzcGFjZSkge1xuICBsZXQgZXhpc3RpbmcgPSBNQU5JRkVTVF9DQUNIRS5nZXQod29ya3NwYWNlKTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBsZXQgYnVmZmVyID0gZnNTeW5jLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya3NwYWNlLCAncGFja2FnZS5qc29uJykpO1xuICBsZXQgY29udGVudCA9IGJ1ZmZlci50b1N0cmluZygpO1xuICBsZXQganNvbiA9IEpTT04ucGFyc2UoY29udGVudCk7XG5cbiAgTUFOSUZFU1RfQ0FDSEUuc2V0KHdvcmtzcGFjZSwganNvbik7XG5cbiAgcmV0dXJuIGpzb247XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFB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
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2JhYmVsLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvdXRpbHMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGlzUmVsZXZhbnRGaWxlIH0gZnJvbSAnLi4vbGliL3BhdGgvdXRpbHMuanMnO1xuXG5mdW5jdGlvbiBfaXNSZWxldmFudEZpbGUoc3RhdGUsIGN3ZCkge1xuICBsZXQgZmlsZU5hbWUgPSBzdGF0ZS5maWxlLm9wdHMuZmlsZW5hbWU7XG4gIGxldCBhZGRpdGlvbmFsUm9vdHMgPSBzdGF0ZS5vcHRzPy5hZGRpdGlvbmFsUm9vdHM7XG5cbiAgcmV0dXJuIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7XG4gICAgYWRkaXRpb25hbFJvb3RzLFxuICAgIGN3ZCxcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGVudiAtIGJhYmVsIHBsdWdpbiBlbnYsIGVudi50eXBlcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgKGVzcCBpbiBUUylcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gdGhlIG9wdGlvbnMgZm9yIHNjb3BlZC1jc3MgLS0gdGhpcyBpcyBhbHNvIGF2YWlsYWJsZSBpbiBlYWNoIHZpc2l0b3IncyBzdGF0ZS5vcHRzXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya2luZ0RpcmVjdG9yeVxuICovXG5leHBvcnQgZGVmYXVsdCAoZW52LCBvcHRpb25zLCB3b3JraW5nRGlyZWN0b3J5KSA9PiB7XG4gIC8qKlxuICAgKiBUaGlzIGJhYmVsIHBsdWdpbiBkb2VzIHR3byB0aGluZ3M6XG4gICAqIC0gcmVtb3ZlcyB0aGUgaW1wb3J0IG9mIHNjb3BlZENsYXNzLCBpZiBpdCBleGlzdHNcbiAgICogICAtIGlmIHNjb3BlZENsYXNzIHdhcyBpbXBvcnRlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFueSBjb21wb25lbnQncyBcInNjb3BlIGJhZ1wiXG4gICAqICAgICAodGhlIHNjb3BlIGJhZyBiZWluZyBhIGxvdy1sZXZlbCBvYmplY3QgdXNlZCBmb3IgcGFzc2luZyB3aGF0IGlzIFwiaW4gc2NvcGVcIiBmb3IgYSBjb21wb25lbnQpXG4gICAqL1xuICByZXR1cm4ge1xuICAgIHZpc2l0b3I6IHtcbiAgICAgIFByb2dyYW06IHtcbiAgICAgICAgZW50ZXIocGF0aCwgc3RhdGUpIHtcbiAgICAgICAgICBpZiAoIV9pc1JlbGV2YW50RmlsZShzdGF0ZSwgd29ya2luZ0RpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIHN0YXRlLmNhblNraXAgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jYW5Ta2lwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGgubm9kZS5zb3VyY2UudmFsdWUgPT09ICdlbWJlci1zY29wZWQtY3NzJykge1xuICAgICAgICAgIGxldCBzcGVjaWZpZXIgPSBwYXRoLm5vZGUuc3BlY2lmaWVycy5maW5kKFxuICAgICAgICAgICAgKHgpID0+IHguaW1wb3J0ZWQubmFtZSA9PT0gJ3Njb3BlZENsYXNzJyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgICAgICAgc3RhdGUuZmlsZS5vcHRzLmltcG9ydGVkU2NvcGVkQ2xhc3MgPSBzcGVjaWZpZXIubG9jYWwubmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyLmxvY2FsLm5hbWUgIT09ICdzY29wZWRDbGFzcycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBzY29wZWRDbGFzcyBpbXBvcnQgaXMgYSBwc3VlZG8taGVscGVyLCBhbmQgbWF5IG5vdCBiZSByZW5hbWVkIGFzIGl0IGlzIHJlbW92ZWQgYXQgYnVpbGQgdGltZS5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IGluIHN0cmljdCBtb2RlLCBkbyB3ZSBjYXJlIGFib3V0IHJlbW9uaW5nIHRoZSBzY29wZSBiYWcgcmVmZXJlbmNlXG4gICAgICAgKi9cbiAgICAgIE9iamVjdFByb3BlcnR5KHBhdGgsIHN0YXRlKSB7XG4gICAgICAgIGlmICghc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzKSByZXR1cm47XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhdGgubm9kZS52YWx1ZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAgICAgICBwYXRoLm5vZGUudmFsdWUubmFtZSA9PT0gc3RhdGUuZmlsZS5vcHRzPy5pbXBvcnRlZFNjb3BlZENsYXNzXG4gICAgICAgICkge1xuICAgICAgICAgIHBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn07XG4iLCAiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnNTeW5jLCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnLmd0cycsICcuZ2pzJywgJy50cycsICcuanMnLCAnLmhicyddO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgb3VyUmVxdWlyZSA9IHJlcXVpcmU7XG59XG5cbmNvbnN0IElSUkVMRVZBTlRfUEFUSFMgPSBbJ25vZGVfbW9kdWxlcy8ucG5wbScsICdfX3ZpdGUtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzSGFzQXNzb2NpYXRlZENvbXBvbmVudChjc3NQYXRoKSB7XG4gIHJldHVybiBjc3NIYXNTdGFuZGFyZEZpbGUoY3NzUGF0aCkgfHwgY3NzSGFzUG9kc0ZpbGUoY3NzUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1N0YW5kYXJkRmlsZShpZCkge1xuICAvKipcbiAgICogTm9ybWFsbHkgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhIEpTIHBhdGggaGVyZSwgYnV0IHdoZW4gdXNpbmdcbiAgICogZW1icm9pZGVyQDMsIHdlIGhhdmUgYSBcInJld3JpdHRlbiBhcHBcIiwgd2hpY2ggaGFzIGFsbCBvdXIgc291cmNlXG4gICAqIHByZXByb2Nlc3NlZCBhIGJpdCBiZWZvcmUgc2NvcGVkLWNzcyB0cmFuc2Zvcm1hdGlvbnMuXG4gICAqXG4gICAqIChJbiBWaXRlLCB3ZSBvcGVyYXRlIG1vcmUgZGlyZWN0bHkgd2l0aCB0aGUgc291cmNlKVxuICAgKi9cbiAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgbGV0IGNhbmRpZGF0ZVBhdGggPSBpZC5yZXBsYWNlKC9cXC5jc3MkLywgZXh0KTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1BvZHNGaWxlKGlkKSB7XG4gIGlmICghaWQuZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGEgSlMgcGF0aCBoZXJlLCBidXQgd2hlbiB1c2luZ1xuICAgKiBlbWJyb2lkZXJAMywgd2UgaGF2ZSBhIFwicmV3cml0dGVuIGFwcFwiLCB3aGljaCBoYXMgYWxsIG91ciBzb3VyY2VcbiAgICogcHJlcHJvY2Vzc2VkIGEgYml0IGJlZm9yZSBzY29wZWQtY3NzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogKEluIFZpdGUsIHdlIG9wZXJhdGUgbW9yZSBkaXJlY3RseSB3aXRoIHRoZSBzb3VyY2UpXG4gICAqL1xuICBmb3IgKGxldCBleHQgb2YgQ09NUE9ORU5UX0VYVEVOU0lPTlMpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGlkLnJlcGxhY2UoL3N0eWxlc1xcLmNzcyQvLCBgdGVtcGxhdGUke2V4dH1gKTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQmFzZWQgb24gZW1iZXIncyBjb21wb25lbnQgbG9jYXRpb24gY29udmVudGlvbnMsXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSBhIHBhdGggZm9yIHdoZXJlIHdlXG4gKiBleHBlY3QgdGhlIENTUyB0byBsaXZlLlxuICpcbiAqIEZvciBjby1sb2NhdGVkIHN0cnVjdHVyZTpcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5jc3NcbiAqXG4gKiBGb3IgbmVzdGVkIGNvLWxvY2F0ZWQgc3RydWN0dXJlXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5jc3NcbiAqXG4gKiBGb3IgUG9kcyByb3V0ZXMgc3RydWN0dXJlXG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3RlbXBsYXRlLntoYnMsanN9XG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3N0eWxlcy5jc3NcbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IHN1cHBvcnRlZDpcbiAqICAgLSBjb21wb25lbnRzIHcvIHBvZHMgLS0gdGhpcyBpcyBkZXByZWNhdGVkIGluIDUuMTBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSB0aGUgaGJzLCBqcywgZ2pzLCBndHMgb3Igd2hhdGV2ZXIgY28tbG9jYXRlZCBwYXRoLlxuICogQHJldHVybnMge3N0cmluZ30gLSBleHBlY3RlZCBjc3MgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzUGF0aEZvcihmaWxlTmFtZSkge1xuICBsZXQgd2l0aG91dEV4dCA9IHdpdGhvdXRFeHRlbnNpb24oZmlsZU5hbWUpO1xuICBsZXQgY3NzUGF0aCA9IHdpdGhvdXRFeHQgKyAnLmNzcyc7XG5cbiAgaWYgKGlzUG9kKGZpbGVOYW1lKSkge1xuICAgIGNzc1BhdGggPSBmaWxlTmFtZVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuanMkLywgJ3N0eWxlcy5jc3MnKVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuaGJzLywgJ3N0eWxlcy5jc3MnKTtcbiAgfVxuXG4gIHJldHVybiBjc3NQYXRoO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuanMnKSB8fCBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuaGJzJyk7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIENoZWNrcyBpZiBhIGZpbGUgZW5kcyB3aXRoXG4gKiAtIHRlbXBsYXRlLmpzXG4gKiAtIHRlbXBsYXRlLmhic1xuICogLSBzdHlsZXMuY3NzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZChmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJucyB0aGUgc2FtZSBwYXRoLCBidXQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0RXh0ZW5zaW9uKGZpbGVQYXRoKSB7XG4gIGxldCBwYXJzZWQgPSBwYXRoLnBhcnNlKGZpbGVQYXRoKTtcblxuICByZXR1cm4gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcbn1cblxuLyoqXG4gKiBFeGFtcGxlcyBmb3IgZmlsZU5hbWVcbiAqIC0gYWJzb2x1dGUgb24tZGlzayBwYXRoXG4gKiAtIGluIHdlYnBhY2tcbiAqICAgLSBVUkwtYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcgd2l0aCAvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcGFyYW0ge3sgYWRkaXRpb25hbFJvb3RzPzogc3RyaW5nW107IGN3ZDogc3RyaW5nIH19IG9wdGlvbnNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGV2YW50RmlsZShmaWxlTmFtZSwgeyBhZGRpdGlvbmFsUm9vdHMsIGN3ZCB9KSB7XG4gIC8vIEZha2UgZmlsZSBoYW5kbGVkIGJ5IHRlc3RlbSBzZXJ2ZXIgd2hlbiBpdCBydW5zXG4gIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCcvdGVzdGVtJykpIHJldHVybiBmYWxzZTtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIGFzc2VydChjd2QsIGBjd2Qgd2FzIG5vdCBwYXNzZWQgdG8gaXNSZWxldmFudEZpbGVgKTtcblxuICBsZXQgb3VyV29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoY3dkKTtcblxuICBpZiAod29ya3NwYWNlICE9PSBvdXJXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgbG9jYWwgPSBmaWxlTmFtZS5yZXBsYWNlKHdvcmtzcGFjZSwgJycpO1xuICBsZXQgWywgLi4ucGFydHNdID0gbG9jYWwuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTLmhhcyhwYXJ0c1swXSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IHBvZHMgc3VwcG9ydC5cbiAgICogZm9sa3MgbmVlZCB0byBvcHQgaW4gdG8gcG9kcyAocm91dGVzKSwgYmVjYXVzZSBldmVyeSBwb2RzIGFwcCBjYW4gYmUgY29uZmlndXJlZCBkaWZmZXJlbnRseVxuICAgKi9cbiAgbGV0IHJvb3RzID0gWycvY29tcG9uZW50cy8nLCAnL3RlbXBsYXRlcy8nLCAuLi4oYWRkaXRpb25hbFJvb3RzIHx8IFtdKV07XG5cbiAgaWYgKCFyb290cy5zb21lKChyb290KSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhyb290KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHBhY2thZ2VTY29wZWRQYXRoKSB7XG4gIC8qKlxuICAgKiAqQnkgY29udmVudGlvbiosIGBzcmNgIGlzIG9taXR0ZWQgZnJvbSBjb21wb25lbnQgcGF0aHMuXG4gICAqIFdlIGNhbiByZWZsZWN0IHRoZSBzYW1lIGJlaGF2aW9yIGJ5IHJlcGxhY2luZyBzcmMvXG4gICAqIHdpdGggYW4gZW1wdHkgc3RyaW5nLlxuICAgKlxuICAgKiBDU1MgaXNuJ3QgZW1pdHRlZCBhcyBhIGNvLWxvY2F0ZWQgbW9kdWxlLCBidXRcbiAgICogdG8ga2VlcCBjb252ZW50aW9ucyBjb25zaXN0ZW50IGFjcm9zcyBsYW5ndWFnZXMsXG4gICAqIHdlIGNhbiBwcmV0ZW5kIGl0IGlzLlxuICAgKlxuICAgKiBBbnkgY3VzdG9taXphdGlvbiBiZXlvbmQgcmVtb3ZpbmcgYHNyY2AgYW5kIGBhcHBgIGlzIHBvdGVudGlhbGx5IGNvbmZ1c2luZy5cbiAgICogSWYgd2UgbmVlZCBmdXJ0aGVyIGN1c3RvbWl6YXRpb25zLCB3ZSdsbCB3YW50IHRvIG1hdGNoIG9uIGBleHBvcnRzYCBpbiB0aGVcbiAgICogY29ycmVzcG9uZGluZyBwYWNrYWdlLmpzb25cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlU2NvcGVkUGF0aC5yZXBsYWNlKC9eXFwvc3JjXFwvLywgJy8nKTtcblxuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIGlmIChpc1BvZChwYWNrYWdlUmVsYXRpdmUpKSB7XG4gICAgLyoqXG4gICAgICogRm9yIHBvZHMsIHdlIGNob3Agb2ZmIHRoZSB3aG9sZSBmaWxlLCBhbmQgdXNlIHRoZSBkaXIgbmFtZSBhcyB0aGUgXCJtb2R1bGVQYXRoXCJcbiAgICAgKi9cbiAgICByZXR1cm4gcGFyc2VkLmRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gaXMgcGFzc2VkLCByZW1vdmUgaXQuXG4gICAqIFdoZW4gdXNpbmcgcGFja2FnZXJzLCBmb2xrcyBhcmUgdXNlZCB0byBub3QgaGF2aW5nIHRvIHNwZWNpZnkgZXh0ZW5zaW9ucyBmb3IgZmlsZXMuXG4gICAqIFNpbmNlIHdlIGRvbid0IGV2ZW4gZW1pdCBjc3MgZmlsZXMgY28tbG9jYXRlZCB0byBlYWNoIG1vZHVsZSxcbiAgICogdGhpcyBoZWxwcyB1cyBub3QgY29udmV5IGEgbGllIHRoYXQgYSBmaWxlIG1heSBleGlzdCBpbiBhdCBydW50aW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSBgPG1vZHVsZS1uYW1lPi9jb21wb25lbnRzL2J1dHRvbmAuXG4gICAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGV4dGVuc2lvbiBpcywgYmVjYXVzZSB5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgY3NzIGZpbGVcbiAgICogZm9yIHRoZSBidXR0b24gbW9kdWxlIGFueXdheS5cbiAgICovXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcblxuICByZXR1cm4gbG9jYWxQYWNrYWdlclN0eWxlUGF0aDtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBhcHAtbW9kdWxlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlXG4gKlxuICogVGhpcyBhc3N1bWVzIG5vcm1hbCBlbWJlciBhcHAgY29udmVudGlvbnNcbiAqXG4gKiB3aGljaCBpcyBgPHBhY2thZ2UuanNvbiNuYW1lPi9wYXRoLXRvLWZpbGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBQYXRoKHNvdXJjZVBhdGgpIHtcbiAgbGV0IHdvcmtzcGFjZVBhdGggPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgbGV0IG5hbWUgPSBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpO1xuXG4gIC8qKlxuICAgKiAgVW5kZXIgZW1icm9pZGVyIGJ1aWxkcywgdGhlIHNwZWMtY29tcGxpYW50IHZlcnNpb24gb2YgdGhlIGFwcFxuICAgKiBoYXMgYWxsIHRoZSBmaWxlcyB1bmRlciBhIGZvbGRlciB3aGljaCByZXByZXNlbnRzIHRoZSBwYWNrYWdlIG5hbWUsXG4gICAqIHJhdGhlciB0aGFuIFwiYXBwXCIuXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gc291cmNlUGF0aC5yZXBsYWNlKHdvcmtzcGFjZVBhdGgsICcnKTtcblxuICAvKipcbiAgICogQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCAnYXBwJyAtLSB3aGljaCBpcyBwcmVzZW50IGluIHRoZSB2MSBhZGRvbiBwaXBlbGluZVxuICAgKi9cbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoYC9hcHAvYCwgYC9gKTtcblxuICAvLyBBbnkgb2YgdGhlIGFib3ZlIHJlbHBhY2VtZW50cyBjb3VsZCBhY2NpZGVudGFsbHkgZ2l2ZSB1cyBhbiBleHRyYSAvIChkZXBlbmRpbmcgb24gb3VyIGJ1aWxkIGVudmlyb25tZW50KVxuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZSgnLy8nLCAnLycpO1xuXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVJlbGF0aXZlKTtcblxuICByZXR1cm4gYCR7bmFtZX0ke2xvY2FsUGFja2FnZXJTdHlsZVBhdGh9YDtcbn1cblxuLyoqXG4gKiBUbyBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzZXRtLCB3ZSdsbCBzdG9yZSBhbGwgZm91bmRcbiAqIHByb2plY3QgcGF0aHMgYmVyZSwgc28gd2UgY2FuLCBpbiBtZW1vcnksXG4gKiBnZXQgdGhlIGZvbGRlciB3aGVyZSBhIHBhY2thZ2UuanNvbiBleGlzdHMsIHJhdGhlciB0aGFuXG4gKiBoaXQgdGhlIGZpbGUgc3lzdGVtIGV2ZXJ5IHRpbWUuXG4gKi9cbmNvbnN0IFNFRU4gPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIGdldFNlZW4oc291cmNlUGF0aCkge1xuICBpZiAoU0VFTi5oYXMoc291cmNlUGF0aCkpIHJldHVybiBzb3VyY2VQYXRoO1xuXG4gIGxldCBwYXJ0cyA9IHNvdXJjZVBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHNlZW4gPSBTRUVOLmhhcyh0b0NoZWNrKTtcblxuICAgIGlmIChzZWVuKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG5cbiAgaWYgKHNvdXJjZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIH1cblxuICBsZXQgc2VlbiA9IGdldFNlZW4oc291cmNlUGF0aCk7XG5cbiAgaWYgKHNlZW4pIHtcbiAgICByZXR1cm4gc2VlbjtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHNvdXJjZVBhdGgsICdwYWNrYWdlLmpzb24nKTtcblxuICBjb25zdCBpc1dvcmtzcGFjZSA9IGZzU3luYy5leGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpO1xuXG4gIGlmIChpc1dvcmtzcGFjZSkge1xuICAgIHJldHVybiBzb3VyY2VQYXRoO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uVXAoc291cmNlUGF0aCwgeyBjd2QgfSk7XG5cbiAgaWYgKCFwYWNrYWdlSnNvblBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJvamVjdCBmb3IgJHtzb3VyY2VQYXRofWApO1xuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGF0aCA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpO1xuXG4gIFNFRU4uYWRkKHdvcmtzcGFjZVBhdGgpO1xuXG4gIHJldHVybiB3b3Jrc3BhY2VQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb25VcChzdGFydFBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG4gIGxldCBwYXJ0cyA9IHN0YXJ0UGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4odG9DaGVjaywgJ3BhY2thZ2UuanNvbicpO1xuICAgIGxldCBleGlzdHMgPSBmc1N5bmMuZXhpc3RzU3luYyhwYWNrYWdlSnNvbik7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gcGFja2FnZUpzb247XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdHJhdmVyc2UgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGUgc3lzdGVtLlxuICAgIGlmICh0b0NoZWNrID09PSBjd2QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBNQU5JRkVTVF9DQUNIRSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBXaWxsIHJldHVybiB0aGUgcGFja2FnZS5qc29uI25hbWUsIG9yIGNvbmZpZy9lbnZpcm9ubWVudCNtb3VkbGVQcmVmaXggKGlmIHYxIGFwcClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlTmFtZShzb3VyY2VQYXRoKSB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KHdvcmtzcGFjZSk7XG5cbiAgcmV0dXJuIG1hbmlmZXN0Lm5hbWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmtzcGFjZVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpIHtcbiAgbGV0IGV4aXN0aW5nID0gTUFOSUZFU1RfQ0FDSEUuZ2V0KHdvcmtzcGFjZSk7XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgbGV0IGJ1ZmZlciA9IGZzU3luYy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3BhY2thZ2UuanNvbicpKTtcbiAgbGV0IGNvbnRlbnQgPSBidWZmZXIudG9TdHJpbmcoKTtcbiAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gIE1BTklGRVNUX0NBQ0hFLnNldCh3b3Jrc3BhY2UsIGpzb24pO1xuXG4gIHJldHVybiBqc29uO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEseUJBQW1CO0FBQ25CLHFCQUFtQztBQUNuQyx5QkFBOEI7QUFDOUIsdUJBQWlCO0FBSGpCO0FBY0EsSUFBSSxPQUFPLFlBQVk7QUFDdkIsSUFBSSxhQUFhLFdBQVcsVUFDeEIsV0FBVyxVQUNYLFlBQVEsa0NBQWMsSUFBSTtBQUU5QixJQUFJLENBQUMsWUFBWTtBQUNmLGVBQWE7QUFDZjtBQUVBLElBQU0sbUJBQW1CLENBQUMsc0JBQXNCLFNBQVM7QUFDekQsSUFBTSwwQkFBMEIsb0JBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVq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
|