appium 2.0.0-beta.24 → 2.0.0-beta.27
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/build/lib/appium-config.schema.json +278 -0
- package/build/lib/appium.js +45 -66
- package/build/lib/cli/args.js +19 -39
- package/build/lib/cli/driver-command.js +5 -9
- package/build/lib/cli/extension-command.js +73 -64
- package/build/lib/cli/extension.js +10 -23
- package/build/lib/cli/parser.js +9 -19
- package/build/lib/cli/plugin-command.js +5 -9
- package/build/lib/cli/utils.js +2 -4
- package/build/lib/config-file.js +5 -10
- package/build/lib/config.js +50 -20
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logsink.js +2 -4
- package/build/lib/main.js +42 -71
- package/build/lib/schema/appium-config-schema.js +2 -4
- package/build/lib/schema/arg-spec.js +11 -14
- package/build/lib/schema/cli-args.js +2 -4
- package/build/lib/schema/cli-transformers.js +2 -4
- package/build/lib/schema/index.js +2 -4
- package/build/lib/schema/keywords.js +2 -4
- package/build/lib/schema/schema.js +61 -37
- package/build/lib/utils.js +1 -32
- package/lib/appium.js +50 -68
- package/lib/cli/args.js +19 -23
- package/lib/cli/driver-command.js +10 -2
- package/lib/cli/extension-command.js +216 -135
- package/lib/cli/extension.js +7 -15
- package/lib/cli/parser.js +6 -14
- package/lib/cli/plugin-command.js +1 -2
- package/lib/config-file.js +12 -15
- package/lib/config.js +55 -24
- package/lib/constants.js +79 -0
- package/lib/extension/driver-config.js +230 -0
- package/lib/extension/extension-config.js +459 -0
- package/lib/extension/index.js +103 -0
- package/lib/extension/manifest.js +590 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +111 -0
- package/lib/grid-register.js +4 -4
- package/lib/main.js +57 -93
- package/lib/schema/arg-spec.js +3 -3
- package/lib/schema/cli-args.js +1 -0
- package/lib/schema/keywords.js +1 -1
- package/lib/schema/schema.js +67 -29
- package/lib/utils.js +2 -32
- package/package.json +29 -21
- package/{postinstall.js → scripts/postinstall.js} +1 -1
- package/types/types.d.ts +70 -31
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/check-npm-pack-files.js +0 -23
- package/build/commands-yml/parse.js +0 -319
- package/build/commands-yml/validator.js +0 -130
- package/build/index.js +0 -19
- package/build/lib/cli/npm.js +0 -220
- package/build/lib/driver-config.js +0 -100
- package/build/lib/drivers.js +0 -100
- package/build/lib/ext-config-io.js +0 -165
- package/build/lib/extension-config.js +0 -320
- package/build/lib/plugin-config.js +0 -69
- package/build/lib/plugins.js +0 -18
- package/build/postinstall.js +0 -90
- package/build/test/cli/cli-e2e-specs.js +0 -221
- package/build/test/cli/cli-helpers.js +0 -86
- package/build/test/cli/cli-specs.js +0 -71
- package/build/test/cli/fixtures/test-driver/package.json +0 -27
- package/build/test/cli/schema-args-specs.js +0 -48
- package/build/test/cli/schema-e2e-specs.js +0 -47
- package/build/test/config-e2e-specs.js +0 -112
- package/build/test/config-file-e2e-specs.js +0 -209
- package/build/test/config-file-specs.js +0 -281
- package/build/test/config-specs.js +0 -246
- package/build/test/driver-e2e-specs.js +0 -435
- package/build/test/driver-specs.js +0 -386
- package/build/test/ext-config-io-specs.js +0 -181
- package/build/test/extension-config-specs.js +0 -365
- package/build/test/fixtures/allow-feat.txt +0 -5
- package/build/test/fixtures/caps.json +0 -3
- package/build/test/fixtures/config/allow-insecure.txt +0 -3
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
- package/build/test/fixtures/config/appium.config.bad.json +0 -32
- package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
- package/build/test/fixtures/config/appium.config.good.js +0 -40
- package/build/test/fixtures/config/appium.config.good.json +0 -33
- package/build/test/fixtures/config/appium.config.good.yaml +0 -30
- package/build/test/fixtures/config/appium.config.invalid.json +0 -31
- package/build/test/fixtures/config/appium.config.security-array.json +0 -5
- package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
- package/build/test/fixtures/config/appium.config.security-path.json +0 -5
- package/build/test/fixtures/config/driver-fake.config.json +0 -8
- package/build/test/fixtures/config/nodeconfig.json +0 -3
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +0 -35
- package/build/test/fixtures/deny-feat.txt +0 -5
- package/build/test/fixtures/driver.schema.js +0 -20
- package/build/test/fixtures/extensions.yaml +0 -27
- package/build/test/fixtures/flattened-schema.js +0 -532
- package/build/test/fixtures/plugin.schema.js +0 -20
- package/build/test/fixtures/schema-with-extensions.js +0 -28
- package/build/test/grid-register-specs.js +0 -74
- package/build/test/helpers.js +0 -75
- package/build/test/logger-specs.js +0 -76
- package/build/test/npm-specs.js +0 -20
- package/build/test/parser-specs.js +0 -319
- package/build/test/plugin-e2e-specs.js +0 -316
- package/build/test/schema/arg-spec-specs.js +0 -70
- package/build/test/schema/cli-args-specs.js +0 -408
- package/build/test/schema/schema-specs.js +0 -407
- package/build/test/utils-specs.js +0 -288
- package/lib/cli/npm.js +0 -251
- package/lib/driver-config.js +0 -101
- package/lib/drivers.js +0 -84
- package/lib/ext-config-io.js +0 -287
- package/lib/extension-config.js +0 -366
- package/lib/plugin-config.js +0 -63
- package/lib/plugins.js +0 -13
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("source-map-support/register");
|
|
4
|
-
|
|
5
|
-
var _parser = require("../lib/cli/parser");
|
|
6
|
-
|
|
7
|
-
var _extensionConfig = require("../lib/extension-config");
|
|
8
|
-
|
|
9
|
-
var schema = _interopRequireWildcard(require("../lib/schema/schema"));
|
|
10
|
-
|
|
11
|
-
var _configFile = require("../lib/config-file");
|
|
12
|
-
|
|
13
|
-
var _helpers = require("./helpers");
|
|
14
|
-
|
|
15
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
-
|
|
17
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
-
|
|
19
|
-
const ALLOW_FIXTURE = (0, _helpers.resolveFixture)('allow-feat.txt');
|
|
20
|
-
const DENY_FIXTURE = (0, _helpers.resolveFixture)('deny-feat.txt');
|
|
21
|
-
const CAPS_FIXTURE = (0, _helpers.resolveFixture)('caps.json');
|
|
22
|
-
describe('parser', function () {
|
|
23
|
-
let p;
|
|
24
|
-
describe('Main Parser', function () {
|
|
25
|
-
beforeEach(async function () {
|
|
26
|
-
p = await (0, _parser.getParser)(true);
|
|
27
|
-
});
|
|
28
|
-
it('should accept only server and driver subcommands', function () {
|
|
29
|
-
p.parseArgs([]);
|
|
30
|
-
p.parseArgs(['server']);
|
|
31
|
-
p.parseArgs(['driver', 'list']);
|
|
32
|
-
(() => p.parseArgs(['foo'])).should.throw();
|
|
33
|
-
(() => p.parseArgs(['foo --bar'])).should.throw();
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
describe('Server Parser', function () {
|
|
37
|
-
describe('Appium arguments', function () {
|
|
38
|
-
beforeEach(async function () {
|
|
39
|
-
p = await (0, _parser.getParser)(true);
|
|
40
|
-
});
|
|
41
|
-
it('should return an arg parser', function () {
|
|
42
|
-
should.exist(p.parseArgs);
|
|
43
|
-
p.parseArgs([]).should.have.property('port');
|
|
44
|
-
});
|
|
45
|
-
it('should default to the server subcommand', function () {
|
|
46
|
-
p.parseArgs([]).subcommand.should.eql('server');
|
|
47
|
-
p.parseArgs([]).should.eql(p.parseArgs(['server']));
|
|
48
|
-
});
|
|
49
|
-
it('should keep the raw server flags array', function () {
|
|
50
|
-
should.exist(p.rawArgs);
|
|
51
|
-
});
|
|
52
|
-
it('should have help for every arg', function () {
|
|
53
|
-
for (let arg of p.rawArgs) {
|
|
54
|
-
arg[1].should.have.property('help');
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
describe('invalid arguments', function () {
|
|
58
|
-
it('should throw an error with unknown argument', function () {
|
|
59
|
-
(() => {
|
|
60
|
-
p.parseArgs(['--apple']);
|
|
61
|
-
}).should.throw(/unrecognized arguments: --apple/i);
|
|
62
|
-
});
|
|
63
|
-
it('should throw an error for an invalid value ("hostname")', function () {
|
|
64
|
-
(() => {
|
|
65
|
-
p.parseArgs(['--address', '-42']);
|
|
66
|
-
}).should.throw(/must match format "hostname"/i);
|
|
67
|
-
});
|
|
68
|
-
it('should throw an error for an invalid value ("uri")', function () {
|
|
69
|
-
(() => {
|
|
70
|
-
p.parseArgs(['--webhook', 'blub']);
|
|
71
|
-
}).should.throw(/must match format "uri"/i);
|
|
72
|
-
});
|
|
73
|
-
it('should throw an error for an invalid value (using "enum")', function () {
|
|
74
|
-
(() => {
|
|
75
|
-
p.parseArgs(['--log-level', '-42']);
|
|
76
|
-
}).should.throw(/must be equal to one of the allowed values/i);
|
|
77
|
-
});
|
|
78
|
-
it('should throw an error for incorrectly formatted arg (matching "dest")', function () {
|
|
79
|
-
(() => {
|
|
80
|
-
p.parseArgs(['--loglevel', '-42']);
|
|
81
|
-
}).should.throw(/unrecognized arguments: --loglevel/i);
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
it('should parse default capabilities correctly from a string', function () {
|
|
85
|
-
let defaultCapabilities = {
|
|
86
|
-
a: 'b'
|
|
87
|
-
};
|
|
88
|
-
let args = p.parseArgs(['--default-capabilities', JSON.stringify(defaultCapabilities)]);
|
|
89
|
-
args.defaultCapabilities.should.eql(defaultCapabilities);
|
|
90
|
-
});
|
|
91
|
-
it('should parse default capabilities correctly from a file', function () {
|
|
92
|
-
let defaultCapabilities = {
|
|
93
|
-
a: 'b'
|
|
94
|
-
};
|
|
95
|
-
let args = p.parseArgs(['--default-capabilities', CAPS_FIXTURE]);
|
|
96
|
-
args.defaultCapabilities.should.eql(defaultCapabilities);
|
|
97
|
-
});
|
|
98
|
-
it('should throw an error with invalid arg to default capabilities', function () {
|
|
99
|
-
(() => {
|
|
100
|
-
p.parseArgs(['-dc', '42']);
|
|
101
|
-
}).should.throw();
|
|
102
|
-
(() => {
|
|
103
|
-
p.parseArgs(['-dc', 'false']);
|
|
104
|
-
}).should.throw();
|
|
105
|
-
(() => {
|
|
106
|
-
p.parseArgs(['-dc', 'null']);
|
|
107
|
-
}).should.throw();
|
|
108
|
-
(() => {
|
|
109
|
-
p.parseArgs(['-dc', 'does/not/exist.json']);
|
|
110
|
-
}).should.throw();
|
|
111
|
-
});
|
|
112
|
-
it('should parse --allow-insecure correctly', function () {
|
|
113
|
-
p.parseArgs([]).should.not.have.property('allowInsecure');
|
|
114
|
-
p.parseArgs(['--allow-insecure', '']).allowInsecure.should.eql([]);
|
|
115
|
-
p.parseArgs(['--allow-insecure', 'foo']).allowInsecure.should.eql(['foo']);
|
|
116
|
-
p.parseArgs(['--allow-insecure', 'foo,bar']).allowInsecure.should.eql(['foo', 'bar']);
|
|
117
|
-
p.parseArgs(['--allow-insecure', 'foo ,bar']).allowInsecure.should.eql(['foo', 'bar']);
|
|
118
|
-
});
|
|
119
|
-
it('should parse --deny-insecure correctly', function () {
|
|
120
|
-
p.parseArgs([]).should.not.have.property('denyInsecure');
|
|
121
|
-
p.parseArgs(['--deny-insecure', '']).denyInsecure.should.eql([]);
|
|
122
|
-
p.parseArgs(['--deny-insecure', 'foo']).denyInsecure.should.eql(['foo']);
|
|
123
|
-
p.parseArgs(['--deny-insecure', 'foo,bar']).denyInsecure.should.eql(['foo', 'bar']);
|
|
124
|
-
p.parseArgs(['--deny-insecure', 'foo ,bar']).denyInsecure.should.eql(['foo', 'bar']);
|
|
125
|
-
});
|
|
126
|
-
it('should parse --allow-insecure & --deny-insecure from files', function () {
|
|
127
|
-
const parsed = p.parseArgs(['--allow-insecure', ALLOW_FIXTURE, '--deny-insecure', DENY_FIXTURE]);
|
|
128
|
-
parsed.allowInsecure.should.eql(['feature1', 'feature2', 'feature3']);
|
|
129
|
-
parsed.denyInsecure.should.eql(['nofeature1', 'nofeature2', 'nofeature3']);
|
|
130
|
-
});
|
|
131
|
-
it('should allow a string for --use-drivers', function () {
|
|
132
|
-
p.parseArgs(['--use-drivers', 'fake']).useDrivers.should.eql(['fake']);
|
|
133
|
-
});
|
|
134
|
-
it('should allow multiple --use-drivers', function () {
|
|
135
|
-
p.parseArgs(['--use-drivers', 'fake,phony']).useDrivers.should.eql(['fake', 'phony']);
|
|
136
|
-
});
|
|
137
|
-
it('should respect --relaxed-security', function () {
|
|
138
|
-
p.parseArgs(['--relaxed-security']).should.have.property('relaxedSecurityEnabled', true);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
describe('extension arguments', function () {
|
|
142
|
-
beforeEach(async function () {
|
|
143
|
-
schema.resetSchema();
|
|
144
|
-
schema.registerSchema('driver', 'fake', require('@appium/fake-driver/build/lib/fake-driver-schema').default);
|
|
145
|
-
schema.finalizeSchema();
|
|
146
|
-
p = await (0, _parser.getParser)(true);
|
|
147
|
-
});
|
|
148
|
-
it('should parse driver args correctly from a string', async function () {
|
|
149
|
-
const {
|
|
150
|
-
config
|
|
151
|
-
} = await (0, _configFile.readConfigFile)((0, _helpers.resolveFixture)('config', 'driver-fake.config.json'));
|
|
152
|
-
const fakeDriverArgs = {
|
|
153
|
-
fake: {
|
|
154
|
-
sillyWebServerPort: 1234,
|
|
155
|
-
sillyWebServerHost: 'hey'
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
const args = p.parseArgs(['--driver-fake-silly-web-server-port', fakeDriverArgs.fake.sillyWebServerPort, '--driver-fake-silly-web-server-host', fakeDriverArgs.fake.sillyWebServerHost]);
|
|
159
|
-
args.driver.fake.should.eql(config.driver.fake);
|
|
160
|
-
});
|
|
161
|
-
it('should not yet apply defaults', function () {
|
|
162
|
-
const args = p.parseArgs([]);
|
|
163
|
-
args.should.not.have.property('driver');
|
|
164
|
-
});
|
|
165
|
-
it('should nicely handle extensions w/ dashes in them', async function () {
|
|
166
|
-
schema.resetSchema();
|
|
167
|
-
schema.registerSchema('plugin', 'crypto-fiend', {
|
|
168
|
-
type: 'object',
|
|
169
|
-
properties: {
|
|
170
|
-
elite: {
|
|
171
|
-
type: 'boolean'
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
schema.finalizeSchema();
|
|
176
|
-
p = await (0, _parser.getParser)(true);
|
|
177
|
-
const args = p.parseArgs(['--plugin-crypto-fiend-elite']);
|
|
178
|
-
args.should.have.nested.property('plugin.crypto-fiend.elite', true);
|
|
179
|
-
});
|
|
180
|
-
describe('when user supplies invalid args', function () {
|
|
181
|
-
it('should error out', function () {
|
|
182
|
-
(() => p.parseArgs(['--driver-fake-silly-web-server-port', 'foo'])).should.throw(/must be integer/i);
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
it('should not support --driver-args', function () {
|
|
186
|
-
(() => p.parseArgs(['--driver-args', '/some/file.json'])).should.throw(/unrecognized arguments/i);
|
|
187
|
-
});
|
|
188
|
-
it('should not support --plugin-args', function () {
|
|
189
|
-
(() => p.parseArgs(['--plugin-args', '/some/file.json'])).should.throw(/unrecognized arguments/i);
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
describe('Driver Parser', function () {
|
|
194
|
-
it('should not allow random sub-subcommands', function () {
|
|
195
|
-
(() => p.parseArgs(['driver', 'foo'])).should.throw();
|
|
196
|
-
});
|
|
197
|
-
describe('list', function () {
|
|
198
|
-
it('should allow an empty argument list', function () {
|
|
199
|
-
const args = p.parseArgs(['driver', 'list']);
|
|
200
|
-
args.subcommand.should.eql('driver');
|
|
201
|
-
args.driverCommand.should.eql('list');
|
|
202
|
-
args.showInstalled.should.eql(false);
|
|
203
|
-
args.showUpdates.should.eql(false);
|
|
204
|
-
args.json.should.eql(false);
|
|
205
|
-
});
|
|
206
|
-
it('should allow json format', function () {
|
|
207
|
-
const args = p.parseArgs(['driver', 'list', '--json']);
|
|
208
|
-
args.json.should.eql(true);
|
|
209
|
-
});
|
|
210
|
-
it('should allow --installed', function () {
|
|
211
|
-
const args = p.parseArgs(['driver', 'list', '--installed']);
|
|
212
|
-
args.showInstalled.should.eql(true);
|
|
213
|
-
});
|
|
214
|
-
it('should allow --updates', function () {
|
|
215
|
-
const args = p.parseArgs(['driver', 'list', '--updates']);
|
|
216
|
-
args.showUpdates.should.eql(true);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
describe('install', function () {
|
|
220
|
-
it('should not allow an empty argument list', function () {
|
|
221
|
-
(() => p.parseArgs(['driver', 'install'])).should.throw();
|
|
222
|
-
});
|
|
223
|
-
it('should take a driver name to install', function () {
|
|
224
|
-
const args = p.parseArgs(['driver', 'install', 'foobar']);
|
|
225
|
-
args.subcommand.should.eql('driver');
|
|
226
|
-
args.driverCommand.should.eql('install');
|
|
227
|
-
args.driver.should.eql('foobar');
|
|
228
|
-
should.not.exist(args.installType);
|
|
229
|
-
args.json.should.eql(false);
|
|
230
|
-
});
|
|
231
|
-
it('should allow json format', function () {
|
|
232
|
-
const args = p.parseArgs(['driver', 'install', 'foobar', '--json']);
|
|
233
|
-
args.json.should.eql(true);
|
|
234
|
-
});
|
|
235
|
-
it('should allow --source', function () {
|
|
236
|
-
for (const source of _extensionConfig.INSTALL_TYPES) {
|
|
237
|
-
const args = p.parseArgs(['driver', 'install', 'foobar', '--source', source]);
|
|
238
|
-
args.installType.should.eql(source);
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
it('should not allow unknown --source', function () {
|
|
242
|
-
(() => p.parseArgs(['driver', 'install', 'fobar', '--source', 'blah'])).should.throw();
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
describe('uninstall', function () {
|
|
246
|
-
it('should not allow an empty argument list', function () {
|
|
247
|
-
(() => p.parseArgs(['driver', 'uninstall'])).should.throw();
|
|
248
|
-
});
|
|
249
|
-
it('should take a driver name to uninstall', function () {
|
|
250
|
-
const args = p.parseArgs(['driver', 'uninstall', 'foobar']);
|
|
251
|
-
args.subcommand.should.eql('driver');
|
|
252
|
-
args.driverCommand.should.eql('uninstall');
|
|
253
|
-
args.driver.should.eql('foobar');
|
|
254
|
-
args.json.should.eql(false);
|
|
255
|
-
});
|
|
256
|
-
it('should allow json format', function () {
|
|
257
|
-
const args = p.parseArgs(['driver', 'uninstall', 'foobar', '--json']);
|
|
258
|
-
args.json.should.eql(true);
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
describe('update', function () {
|
|
262
|
-
it('should not allow an empty argument list', function () {
|
|
263
|
-
(() => p.parseArgs(['driver', 'update'])).should.throw();
|
|
264
|
-
});
|
|
265
|
-
it('should take a driver name to update', function () {
|
|
266
|
-
const args = p.parseArgs(['driver', 'update', 'foobar']);
|
|
267
|
-
args.subcommand.should.eql('driver');
|
|
268
|
-
args.driverCommand.should.eql('update');
|
|
269
|
-
args.driver.should.eql('foobar');
|
|
270
|
-
args.json.should.eql(false);
|
|
271
|
-
});
|
|
272
|
-
it('should allow json format', function () {
|
|
273
|
-
const args = p.parseArgs(['driver', 'update', 'foobar', '--json']);
|
|
274
|
-
args.json.should.eql(true);
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
describe('run', function () {
|
|
278
|
-
it('should not allow an empty driver argument list', function () {
|
|
279
|
-
(() => p.parseArgs(['driver', 'run'])).should.throw();
|
|
280
|
-
});
|
|
281
|
-
it('should not allow no driver scriptName', function () {
|
|
282
|
-
(() => p.parseArgs(['driver', 'run', 'foo'])).should.throw();
|
|
283
|
-
});
|
|
284
|
-
it('should take a driverName and scriptName to run', function () {
|
|
285
|
-
const args = p.parseArgs(['driver', 'run', 'foo', 'bar']);
|
|
286
|
-
args.subcommand.should.eql('driver');
|
|
287
|
-
args.driverCommand.should.eql('run');
|
|
288
|
-
args.driver.should.eql('foo');
|
|
289
|
-
args.scriptName.should.eql('bar');
|
|
290
|
-
args.json.should.eql(false);
|
|
291
|
-
});
|
|
292
|
-
it('should allow json format for driver', function () {
|
|
293
|
-
const args = p.parseArgs(['driver', 'run', 'foo', 'bar', '--json']);
|
|
294
|
-
args.json.should.eql(true);
|
|
295
|
-
});
|
|
296
|
-
it('should not allow an empty plugin argument list', function () {
|
|
297
|
-
(() => p.parseArgs(['plugin', 'run'])).should.throw();
|
|
298
|
-
});
|
|
299
|
-
it('should not allow no plugin scriptName', function () {
|
|
300
|
-
(() => p.parseArgs(['plugin', 'run', 'foo'])).should.throw();
|
|
301
|
-
});
|
|
302
|
-
it('should take a pluginName and scriptName to run', function () {
|
|
303
|
-
const args = p.parseArgs(['plugin', 'run', 'foo', 'bar']);
|
|
304
|
-
args.subcommand.should.eql('plugin');
|
|
305
|
-
args.pluginCommand.should.eql('run');
|
|
306
|
-
args.plugin.should.eql('foo');
|
|
307
|
-
args.scriptName.should.eql('bar');
|
|
308
|
-
args.json.should.eql(false);
|
|
309
|
-
});
|
|
310
|
-
it('should allow json format for plugin', function () {
|
|
311
|
-
const args = p.parseArgs(['plugin', 'run', 'foo', 'bar', '--json']);
|
|
312
|
-
args.json.should.eql(true);
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
});require('source-map-support').install();
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvcGFyc2VyLXNwZWNzLmpzIl0sIm5hbWVzIjpbIkFMTE9XX0ZJWFRVUkUiLCJERU5ZX0ZJWFRVUkUiLCJDQVBTX0ZJWFRVUkUiLCJkZXNjcmliZSIsInAiLCJiZWZvcmVFYWNoIiwiaXQiLCJwYXJzZUFyZ3MiLCJzaG91bGQiLCJ0aHJvdyIsImV4aXN0IiwiaGF2ZSIsInByb3BlcnR5Iiwic3ViY29tbWFuZCIsImVxbCIsInJhd0FyZ3MiLCJhcmciLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiYSIsImFyZ3MiLCJKU09OIiwic3RyaW5naWZ5Iiwibm90IiwiYWxsb3dJbnNlY3VyZSIsImRlbnlJbnNlY3VyZSIsInBhcnNlZCIsInVzZURyaXZlcnMiLCJzY2hlbWEiLCJyZXNldFNjaGVtYSIsInJlZ2lzdGVyU2NoZW1hIiwicmVxdWlyZSIsImRlZmF1bHQiLCJmaW5hbGl6ZVNjaGVtYSIsImNvbmZpZyIsImZha2VEcml2ZXJBcmdzIiwiZmFrZSIsInNpbGx5V2ViU2VydmVyUG9ydCIsInNpbGx5V2ViU2VydmVySG9zdCIsImRyaXZlciIsInR5cGUiLCJwcm9wZXJ0aWVzIiwiZWxpdGUiLCJuZXN0ZWQiLCJkcml2ZXJDb21tYW5kIiwic2hvd0luc3RhbGxlZCIsInNob3dVcGRhdGVzIiwianNvbiIsImluc3RhbGxUeXBlIiwic291cmNlIiwiSU5TVEFMTF9UWVBFUyIsInNjcmlwdE5hbWUiLCJwbHVnaW5Db21tYW5kIiwicGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBLE1BQU1BLGFBQWEsR0FBRyw2QkFBZSxnQkFBZixDQUF0QjtBQUNBLE1BQU1DLFlBQVksR0FBRyw2QkFBZSxlQUFmLENBQXJCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLDZCQUFlLFdBQWYsQ0FBckI7QUFFQUMsUUFBUSxDQUFDLFFBQUQsRUFBVyxZQUFZO0FBQzdCLE1BQUlDLENBQUo7QUFFQUQsRUFBQUEsUUFBUSxDQUFD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QixDQUFaLENBQWI7QUFDQVksUUFBQUEsSUFBSSxDQUFDTixVQUFMLENBQWdCTCxNQUFoQixDQUF1Qk0sR0FBdkIsQ0FBMkIsUUFBM0I7QUFDQUssUUFBQUEsSUFBSSxDQUFDZ0MsYUFBTCxDQUFtQjNDLE1BQW5CLENBQTBCTSxHQUExQixDQUE4QixLQUE5QjtBQUNBSyxRQUFBQSxJQUFJLENBQUNpQyxNQUFMLENBQVk1QyxNQUFaLENBQW1CTSxHQUFuQixDQUF1QixLQUF2QjtBQUNBSyxRQUFBQSxJQUFJLENBQUMrQixVQUFMLENBQWdCMUMsTUFBaEIsQ0FBdUJNLEdBQXZCLENBQTJCLEtBQTNCO0FBQ0FLLFFBQUFBLElBQUksQ0FBQzJCLElBQUwsQ0FBVXRDLE1BQVYsQ0FBaUJNLEdBQWpCLENBQXFCLEtBQXJCO0FBQ0QsT0FQQyxDQUFGO0FBUUFSLE1BQUFBLEVBQUUsQ0FBQyxxQ0FBRCxFQUF3QyxZQUFZO0FBQ3BELGNBQU1hLElBQUksR0FBR2YsQ0FBQyxDQUFDRyxTQUFGLENBQVksQ0FBQyxRQUFELEVBQVcsS0FBWCxFQUFrQixLQUFsQixFQUF5QixLQUF6QixFQUFnQyxRQUFoQyxDQUFaLENBQWI7QUFDQVksUUFBQUEsSUFBSSxDQUFDMkIsSUFBTCxDQUFVdEMsTUFBVixDQUFpQk0sR0FBakIsQ0FBcUIsSUFBckI7QUFDRCxPQUhDLENBQUY7QUFJRCxLQXJDTyxDQUFSO0FBc0NELEdBMUhPLENBQVI7QUEySEQsQ0FqVE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBnZXRQYXJzZXIgfSBmcm9tICcuLi9saWIvY2xpL3BhcnNlcic7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVTIH0gZnJvbSAnLi4vbGliL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0ICogYXMgc2NoZW1hIGZyb20gJy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcbmltcG9ydCB7IHJlYWRDb25maWdGaWxlIH0gZnJvbSAnLi4vbGliL2NvbmZpZy1maWxlJztcbmltcG9ydCB7IHJlc29sdmVGaXh0dXJlIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLy8gdGhlc2UgcGF0aHMgc2hvdWxkIG5vdCBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG5jb25zdCBBTExPV19GSVhUVVJFID0gcmVzb2x2ZUZpeHR1cmUoJ2FsbG93LWZlYXQudHh0Jyk7XG5jb25zdCBERU5ZX0ZJWFRVUkUgPSByZXNvbHZlRml4dHVyZSgnZGVueS1mZWF0LnR4dCcpO1xuY29uc3QgQ0FQU19GSVhUVVJFID0gcmVzb2x2ZUZpeHR1cmUoJ2NhcHMuanNvbicpO1xuXG5kZXNjcmliZSgncGFyc2VyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgcDtcblxuICBkZXNjcmliZSgnTWFpbiBQYXJzZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBwID0gYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgb25seSBzZXJ2ZXIgYW5kIGRyaXZlciBzdWJjb21tYW5kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHAucGFyc2VBcmdzKFtdKTtcbiAgICAgIHAucGFyc2VBcmdzKFsnc2VydmVyJ10pO1xuICAgICAgcC5wYXJzZUFyZ3MoWydkcml2ZXInLCAnbGlzdCddKTtcbiAgICAgICgoKSA9PiBwLnBhcnNlQXJncyhbJ2ZvbyddKSkuc2hvdWxkLnRocm93KCk7XG4gICAgICAoKCkgPT4gcC5wYXJzZUFyZ3MoWydmb28gLS1iYXInXSkpLnNob3VsZC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2VydmVyIFBhcnNlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnQXBwaXVtIGFyZ3VtZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBwID0gYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGFyZyBwYXJzZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5leGlzdChwLnBhcnNlQXJncyk7XG4gICAgICAgIHAucGFyc2VBcmdzKFtdKS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncG9ydCcpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGRlZmF1bHQgdG8gdGhlIHNlcnZlciBzdWJjb21tYW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBwLnBhcnNlQXJncyhbXSkuc3ViY29tbWFuZC5zaG91bGQuZXFsKCdzZXJ2ZXInKTtcbiAgICAgICAgcC5wYXJzZUFyZ3MoW10pLnNob3VsZC5lcWwocC5wYXJzZUFyZ3MoWydzZXJ2ZXInXSkpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGtlZXAgdGhlIHJhdyBzZXJ2ZXIgZmxhZ3MgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5leGlzdChwLnJhd0FyZ3MpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGhhdmUgaGVscCBmb3IgZXZlcnkgYXJnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGxldCBhcmcgb2YgcC5yYXdBcmdzKSB7XG4gICAgICAgICAgYXJnWzFdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdoZWxwJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyBiZXN0IHRvIHN1cHByZXNzIGNvbG9yIGluIGVycm9yIG1lc3NhZ2VcbiAgICAgIGRlc2NyaWJlKCdpbnZhbGlkIGFyZ3VtZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aXRoIHVua25vd24gYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgKCgpID0+IHtwLnBhcnNlQXJncyhbJy0tYXBwbGUnXSk7fSkuc2hvdWxkLnRocm93KC91bnJlY29nbml6ZWQgYXJndW1lbnRzOiAtLWFwcGxlL2kpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBhbiBpbnZhbGlkIHZhbHVlIChcImhvc3RuYW1lXCIpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICgoKSA9PiB7cC5wYXJzZUFyZ3MoWyctLWFkZHJlc3MnLCAnLTQyJ10pO30pLnNob3VsZC50aHJvdygvbXVzdCBtYXRjaCBmb3JtYXQgXCJob3N0bmFtZVwiL2kpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBhbiBpbnZhbGlkIHZhbHVlIChcInVyaVwiKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAoKCkgPT4ge3AucGFyc2VBcmdzKFsnLS13ZWJob29rJywgJ2JsdWInXSk7fSkuc2hvdWxkLnRocm93KC9tdXN0IG1hdGNoIGZvcm1hdCBcInVyaVwiL2kpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBhbiBpbnZhbGlkIHZhbHVlICh1c2luZyBcImVudW1cIiknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgKCgpID0+IHtwLnBhcnNlQXJncyhbJy0tbG9nLWxldmVsJywgJy00MiddKTt9KS5zaG91bGQudGhyb3coL211c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlcy9pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW5jb3JyZWN0bHkgZm9ybWF0dGVkIGFyZyAobWF0Y2hpbmcgXCJkZXN0XCIpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICgoKSA9PiB7cC5wYXJzZUFyZ3MoWyctLWxvZ2xldmVsJywgJy00MiddKTt9KS5zaG91bGQudGhyb3coL3VucmVjb2duaXplZCBhcmd1bWVudHM6IC0tbG9nbGV2ZWwvaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgZGVmYXVsdCBjYXBhYmlsaXRpZXMgY29ycmVjdGx5IGZyb20gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0ge2E6ICdiJ307XG4gICAgICAgIGxldCBhcmdzID0gcC5wYXJzZUFyZ3MoWyctLWRlZmF1bHQtY2FwYWJpbGl0aWVzJywgSlNPTi5zdHJpbmdpZnkoZGVmYXVsdENhcGFiaWxpdGllcyldKTtcbiAgICAgICAgYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzLnNob3VsZC5lcWwoZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSBkZWZhdWx0IGNhcGFiaWxpdGllcyBjb3JyZWN0bHkgZnJvbSBhIGZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0ge2E6ICdiJ307XG4gICAgICAgIGxldCBhcmdzID0gcC5wYXJzZUFyZ3MoWyctLWRlZmF1bHQtY2FwYWJpbGl0aWVzJywgQ0FQU19GSVhUVVJFXSk7XG4gICAgICAgIGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcy5zaG91bGQuZXFsKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2l0aCBpbnZhbGlkIGFyZyB0byBkZWZhdWx0IGNhcGFiaWxpdGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtwLnBhcnNlQXJncyhbJy1kYycsICc0MiddKTt9KS5zaG91bGQudGhyb3coKTtcbiAgICAgICAgKCgpID0+IHtwLnBhcnNlQXJncyhbJy1kYycsICdmYWxzZSddKTt9KS5zaG91bGQudGhyb3coKTtcbiAgICAgICAgKCgpID0+IHtwLnBhcnNlQXJncyhbJy1kYycsICdudWxsJ10pO30pLnNob3VsZC50aHJvdygpO1xuICAgICAgICAoKCkgPT4ge3AucGFyc2VBcmdzKFsnLWRjJywgJ2RvZXMvbm90L2V4aXN0Lmpzb24nXSk7fSkuc2hvdWxkLnRocm93KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSAtLWFsbG93LWluc2VjdXJlIGNvcnJlY3RseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcC5wYXJzZUFyZ3MoW10pLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnYWxsb3dJbnNlY3VyZScpO1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tYWxsb3ctaW5zZWN1cmUnLCAnJ10pLmFsbG93SW5zZWN1cmUuc2hvdWxkLmVxbChbXSk7XG4gICAgICAgIHAucGFyc2VBcmdzKFsnLS1hbGxvdy1pbnNlY3VyZScsICdmb28nXSkuYWxsb3dJbnNlY3VyZS5zaG91bGQuZXFsKFsnZm9vJ10pO1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tYWxsb3ctaW5zZWN1cmUnLCAnZm9vLGJhciddKS5hbGxvd0luc2VjdXJlLnNob3VsZC5lcWwoWydmb28nLCAnYmFyJ10pO1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tYWxsb3ctaW5zZWN1cmUnLCAnZm9vICxiYXInXSkuYWxsb3dJbnNlY3VyZS5zaG91bGQuZXFsKFsnZm9vJywgJ2JhciddKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhcnNlIC0tZGVueS1pbnNlY3VyZSBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHAucGFyc2VBcmdzKFtdKS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2RlbnlJbnNlY3VyZScpO1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tZGVueS1pbnNlY3VyZScsICcnXSkuZGVueUluc2VjdXJlLnNob3VsZC5lcWwoW10pO1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tZGVueS1pbnNlY3VyZScsICdmb28nXSkuZGVueUluc2VjdXJlLnNob3VsZC5lcWwoWydmb28nXSk7XG4gICAgICAgIHAucGFyc2VBcmdzKFsnLS1kZW55LWluc2VjdXJlJywgJ2ZvbyxiYXInXSkuZGVueUluc2VjdXJlLnNob3VsZC5lcWwoWydmb28nLCAnYmFyJ10pO1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tZGVueS1pbnNlY3VyZScsICdmb28gLGJhciddKS5kZW55SW5zZWN1cmUuc2hvdWxkLmVxbChbJ2ZvbycsICdiYXInXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSAtLWFsbG93LWluc2VjdXJlICYgLS1kZW55LWluc2VjdXJlIGZyb20gZmlsZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHAucGFyc2VBcmdzKFtcbiAgICAgICAgICAnLS1hbGxvdy1pbnNlY3VyZScsIEFMTE9XX0ZJWFRVUkUsICctLWRlbnktaW5zZWN1cmUnLCBERU5ZX0ZJWFRVUkVcbiAgICAgICAgXSk7XG4gICAgICAgIHBhcnNlZC5hbGxvd0luc2VjdXJlLnNob3VsZC5lcWwoWydmZWF0dXJlMScsICdmZWF0dXJlMicsICdmZWF0dXJlMyddKTtcbiAgICAgICAgcGFyc2VkLmRlbnlJbnNlY3VyZS5zaG91bGQuZXFsKFsnbm9mZWF0dXJlMScsICdub2ZlYXR1cmUyJywgJ25vZmVhdHVyZTMnXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBmb3IgLS11c2UtZHJpdmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcC5wYXJzZUFyZ3MoWyctLXVzZS1kcml2ZXJzJywgJ2Zha2UnXSkudXNlRHJpdmVycy5zaG91bGQuZXFsKFsnZmFrZSddKTtcbiAgICAgIH0pO1xuXG5cbiAgICAgIGl0KCdzaG91bGQgYWxsb3cgbXVsdGlwbGUgLS11c2UtZHJpdmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcC5wYXJzZUFyZ3MoWyctLXVzZS1kcml2ZXJzJywgJ2Zha2UscGhvbnknXSkudXNlRHJpdmVycy5zaG91bGQuZXFsKFsnZmFrZScsICdwaG9ueSddKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlc3BlY3QgLS1yZWxheGVkLXNlY3VyaXR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBwLnBhcnNlQXJncyhbJy0tcmVsYXhlZC1zZWN1cml0eSddKS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVsYXhlZFNlY3VyaXR5RW5hYmxlZCcsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXh0ZW5zaW9uIGFyZ3VtZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBzY2hlbWEucmVzZXRTY2hlbWEoKTtcbiAgICAgICAgLy8gd2UgaGF2ZSB0byByZXF1aXJlKCkgaGVyZSBiZWNhdXNlIGJhYmVsIHdpbGwgbm90IGNvbXBpbGUgc3R1ZmYgaW4gbm9kZV9tb2R1bGVzXG4gICAgICAgIC8vIChldmVuIGlmIGl0J3MgaW4gdGhlIG1vbm9yZXBvOyB0aGVyZSBtYXkgYmUgYSB3YXkgYXJvdW5kIHRoaXMpXG4gICAgICAgIC8vIGFueXdheSwgaWYgd2UgZG8gdGhhdCwgd2UgbmVlZCB0byB1c2UgdGhlIGBkZWZhdWx0YCBwcm9wLlxuICAgICAgICBzY2hlbWEucmVnaXN0ZXJTY2hlbWEoJ2RyaXZlcicsICdmYWtlJywgcmVxdWlyZSgnQGFwcGl1bS9mYWtlLWRyaXZlci9idWlsZC9saWIvZmFrZS1kcml2ZXItc2NoZW1hJykuZGVmYXVsdCk7XG4gICAgICAgIHNjaGVtYS5maW5hbGl6ZVNjaGVtYSgpO1xuICAgICAgICBwID0gYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgZHJpdmVyIGFyZ3MgY29ycmVjdGx5IGZyb20gYSBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoaXMgdGVzdCByZWFkcyB0aGUgYWN0dWFsIHNjaGVtYSBwcm92aWRlZCBieSB0aGUgZmFrZSBkcml2ZXIuXG4gICAgICAgIC8vIHRoZSBjb25maWcgZmlsZSBjb3JyZXNwb25kcyB0byB0aGF0IHNjaGVtYS5cbiAgICAgICAgLy8gdGhlIGNvbW1hbmQtbGluZSBmbGFncyBhcmUgZGVyaXZlZCBhbHNvIGZyb20gdGhlIHNjaGVtYS5cbiAgICAgICAgLy8gdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhhdCB0aGUgcGFyc2VkIGFyZ3Mgc2hvdWxkIG1hdGNoIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgY29uc3Qge2NvbmZpZ30gPSBhd2FpdCByZWFkQ29uZmlnRmlsZShyZXNvbHZlRml4dHVyZSgnY29uZmlnJywgJ2RyaXZlci1mYWtlLmNvbmZpZy5qc29uJykpO1xuICAgICAgICBjb25zdCBmYWtlRHJpdmVyQXJncyA9IHtmYWtlOiB7c2lsbHlXZWJTZXJ2ZXJQb3J0OiAxMjM0LCBzaWxseVdlYlNlcnZlckhvc3Q6ICdoZXknfX07XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwLnBhcnNlQXJncyhbXG4gICAgICAgICAgJy0tZHJpdmVyLWZha2Utc2lsbHktd2ViLXNlcnZlci1wb3J0JyxcbiAgICAgICAgICBmYWtlRHJpdmVyQXJncy5mYWtlLnNpbGx5V2ViU2VydmVyUG9ydCxcbiAgICAgICAgICAnLS1kcml2ZXItZmFrZS1zaWxseS13ZWItc2VydmVyLWhvc3QnLFxuICAgICAgICAgIGZha2VEcml2ZXJBcmdzLmZha2Uuc2lsbHlXZWJTZXJ2ZXJIb3N0XG4gICAgICAgIF0pO1xuXG4gICAgICAgIGFyZ3MuZHJpdmVyLmZha2Uuc2hvdWxkLmVxbChjb25maWcuZHJpdmVyLmZha2UpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHlldCBhcHBseSBkZWZhdWx0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFtdKTtcbiAgICAgICAgYXJncy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2RyaXZlcicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbmljZWx5IGhhbmRsZSBleHRlbnNpb25zIHcvIGRhc2hlcyBpbiB0aGVtJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBzY2hlbWEucmVzZXRTY2hlbWEoKTtcbiAgICAgICAgc2NoZW1hLnJlZ2lzdGVyU2NoZW1hKCdwbHVnaW4nLCAnY3J5cHRvLWZpZW5kJywge3R5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7ZWxpdGU6IHt0eXBlOiAnYm9vbGVhbid9fX0pO1xuICAgICAgICBzY2hlbWEuZmluYWxpemVTY2hlbWEoKTtcbiAgICAgICAgcCA9IGF3YWl0IGdldFBhcnNlcih0cnVlKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFtcbiAgICAgICAgICAnLS1wbHVnaW4tY3J5cHRvLWZpZW5kLWVsaXRlJ1xuICAgICAgICBdKTtcblxuICAgICAgICBhcmdzLnNob3VsZC5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZScsIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHVzZXIgc3VwcGxpZXMgaW52YWxpZCBhcmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGVycm9yIG91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAoKCkgPT4gcC5wYXJzZUFyZ3MoWyctLWRyaXZlci1mYWtlLXNpbGx5LXdlYi1zZXJ2ZXItcG9ydCcsICdmb28nXSkpLnNob3VsZC50aHJvdygvbXVzdCBiZSBpbnRlZ2VyL2kpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBzdXBwb3J0IC0tZHJpdmVyLWFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBwLnBhcnNlQXJncyhbJy0tZHJpdmVyLWFyZ3MnLCAnL3NvbWUvZmlsZS5qc29uJ10pKS5zaG91bGQudGhyb3coL3VucmVjb2duaXplZCBhcmd1bWVudHMvaSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3Qgc3VwcG9ydCAtLXBsdWdpbi1hcmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gcC5wYXJzZUFyZ3MoWyctLXBsdWdpbi1hcmdzJywgJy9zb21lL2ZpbGUuanNvbiddKSkuc2hvdWxkLnRocm93KC91bnJlY29nbml6ZWQgYXJndW1lbnRzL2kpO1xuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0RyaXZlciBQYXJzZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgcmFuZG9tIHN1Yi1zdWJjb21tYW5kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBwLnBhcnNlQXJncyhbJ2RyaXZlcicsICdmb28nXSkpLnNob3VsZC50aHJvdygpO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdsaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBhbGxvdyBhbiBlbXB0eSBhcmd1bWVudCBsaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gcC5wYXJzZUFyZ3MoWydkcml2ZXInLCAnbGlzdCddKTtcbiAgICAgICAgYXJncy5zdWJjb21tYW5kLnNob3VsZC5lcWwoJ2RyaXZlcicpO1xuICAgICAgICBhcmdzLmRyaXZlckNvbW1hbmQuc2hvdWxkLmVxbCgnbGlzdCcpO1xuICAgICAgICBhcmdzLnNob3dJbnN0YWxsZWQuc2hvdWxkLmVxbChmYWxzZSk7XG4gICAgICAgIGFyZ3Muc2hvd1VwZGF0ZXMuc2hvdWxkLmVxbChmYWxzZSk7XG4gICAgICAgIGFyZ3MuanNvbi5zaG91bGQuZXFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBhbGxvdyBqc29uIGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ2xpc3QnLCAnLS1qc29uJ10pO1xuICAgICAgICBhcmdzLmpzb24uc2hvdWxkLmVxbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBhbGxvdyAtLWluc3RhbGxlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ2xpc3QnLCAnLS1pbnN0YWxsZWQnXSk7XG4gICAgICAgIGFyZ3Muc2hvd0luc3RhbGxlZC5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGFsbG93IC0tdXBkYXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ2xpc3QnLCAnLS11cGRhdGVzJ10pO1xuICAgICAgICBhcmdzLnNob3dVcGRhdGVzLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgbm90IGFsbG93IGFuIGVtcHR5IGFyZ3VtZW50IGxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBwLnBhcnNlQXJncyhbJ2RyaXZlcicsICdpbnN0YWxsJ10pKS5zaG91bGQudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0YWtlIGEgZHJpdmVyIG5hbWUgdG8gaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ2luc3RhbGwnLCAnZm9vYmFyJ10pO1xuICAgICAgICBhcmdzLnN1YmNvbW1hbmQuc2hvdWxkLmVxbCgnZHJpdmVyJyk7XG4gICAgICAgIGFyZ3MuZHJpdmVyQ29tbWFuZC5zaG91bGQuZXFsKCdpbnN0YWxsJyk7XG4gICAgICAgIGFyZ3MuZHJpdmVyLnNob3VsZC5lcWwoJ2Zvb2JhcicpO1xuICAgICAgICBzaG91bGQubm90LmV4aXN0KGFyZ3MuaW5zdGFsbFR5cGUpO1xuICAgICAgICBhcmdzLmpzb24uc2hvdWxkLmVxbChmYWxzZSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWxsb3cganNvbiBmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwLnBhcnNlQXJncyhbJ2RyaXZlcicsICdpbnN0YWxsJywgJ2Zvb2JhcicsICctLWpzb24nXSk7XG4gICAgICAgIGFyZ3MuanNvbi5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGFsbG93IC0tc291cmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBJTlNUQUxMX1RZUEVTKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ2luc3RhbGwnLCAnZm9vYmFyJywgJy0tc291cmNlJywgc291cmNlXSk7XG4gICAgICAgICAgYXJncy5pbnN0YWxsVHlwZS5zaG91bGQuZXFsKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgdW5rbm93biAtLXNvdXJjZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ2luc3RhbGwnLCAnZm9iYXInLCAnLS1zb3VyY2UnLCAnYmxhaCddKSkuc2hvdWxkLnRocm93KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgndW5pbnN0YWxsJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgYW4gZW1wdHkgYXJndW1lbnQgbGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ3VuaW5zdGFsbCddKSkuc2hvdWxkLnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgdGFrZSBhIGRyaXZlciBuYW1lIHRvIHVuaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ3VuaW5zdGFsbCcsICdmb29iYXInXSk7XG4gICAgICAgIGFyZ3Muc3ViY29tbWFuZC5zaG91bGQuZXFsKCdkcml2ZXInKTtcbiAgICAgICAgYXJncy5kcml2ZXJDb21tYW5kLnNob3VsZC5lcWwoJ3VuaW5zdGFsbCcpO1xuICAgICAgICBhcmdzLmRyaXZlci5zaG91bGQuZXFsKCdmb29iYXInKTtcbiAgICAgICAgYXJncy5qc29uLnNob3VsZC5lcWwoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGFsbG93IGpzb24gZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gcC5wYXJzZUFyZ3MoWydkcml2ZXInLCAndW5pbnN0YWxsJywgJ2Zvb2JhcicsICctLWpzb24nXSk7XG4gICAgICAgIGFyZ3MuanNvbi5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ3VwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgbm90IGFsbG93IGFuIGVtcHR5IGFyZ3VtZW50IGxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBwLnBhcnNlQXJncyhbJ2RyaXZlcicsICd1cGRhdGUnXSkpLnNob3VsZC50aHJvdygpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHRha2UgYSBkcml2ZXIgbmFtZSB0byB1cGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwLnBhcnNlQXJncyhbJ2RyaXZlcicsICd1cGRhdGUnLCAnZm9vYmFyJ10pO1xuICAgICAgICBhcmdzLnN1YmNvbW1hbmQuc2hvdWxkLmVxbCgnZHJpdmVyJyk7XG4gICAgICAgIGFyZ3MuZHJpdmVyQ29tbWFuZC5zaG91bGQuZXFsKCd1cGRhdGUnKTtcbiAgICAgICAgYXJncy5kcml2ZXIuc2hvdWxkLmVxbCgnZm9vYmFyJyk7XG4gICAgICAgIGFyZ3MuanNvbi5zaG91bGQuZXFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBhbGxvdyBqc29uIGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ3VwZGF0ZScsICdmb29iYXInLCAnLS1qc29uJ10pO1xuICAgICAgICBhcmdzLmpzb24uc2hvdWxkLmVxbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBhbiBlbXB0eSBkcml2ZXIgYXJndW1lbnQgbGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ3J1biddKSkuc2hvdWxkLnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgbm90IGFsbG93IG5vIGRyaXZlciBzY3JpcHROYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gcC5wYXJzZUFyZ3MoWydkcml2ZXInLCAncnVuJywgJ2ZvbyddKSkuc2hvdWxkLnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgdGFrZSBhIGRyaXZlck5hbWUgYW5kIHNjcmlwdE5hbWUgdG8gcnVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gcC5wYXJzZUFyZ3MoWydkcml2ZXInLCAncnVuJywgJ2ZvbycsICdiYXInXSk7XG4gICAgICAgIGFyZ3Muc3ViY29tbWFuZC5zaG91bGQuZXFsKCdkcml2ZXInKTtcbiAgICAgICAgYXJncy5kcml2ZXJDb21tYW5kLnNob3VsZC5lcWwoJ3J1bicpO1xuICAgICAgICBhcmdzLmRyaXZlci5zaG91bGQuZXFsKCdmb28nKTtcbiAgICAgICAgYXJncy5zY3JpcHROYW1lLnNob3VsZC5lcWwoJ2JhcicpO1xuICAgICAgICBhcmdzLmpzb24uc2hvdWxkLmVxbChmYWxzZSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWxsb3cganNvbiBmb3JtYXQgZm9yIGRyaXZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHAucGFyc2VBcmdzKFsnZHJpdmVyJywgJ3J1bicsICdmb28nLCAnYmFyJywgJy0tanNvbiddKTtcbiAgICAgICAgYXJncy5qc29uLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgbm90IGFsbG93IGFuIGVtcHR5IHBsdWdpbiBhcmd1bWVudCBsaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gcC5wYXJzZUFyZ3MoWydwbHVnaW4nLCAncnVuJ10pKS5zaG91bGQudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgbm8gcGx1Z2luIHNjcmlwdE5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBwLnBhcnNlQXJncyhbJ3BsdWdpbicsICdydW4nLCAnZm9vJ10pKS5zaG91bGQudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0YWtlIGEgcGx1Z2luTmFtZSBhbmQgc2NyaXB0TmFtZSB0byBydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwLnBhcnNlQXJncyhbJ3BsdWdpbicsICdydW4nLCAnZm9vJywgJ2JhciddKTtcbiAgICAgICAgYXJncy5zdWJjb21tYW5kLnNob3VsZC5lcWwoJ3BsdWdpbicpO1xuICAgICAgICBhcmdzLnBsdWdpbkNvbW1hbmQuc2hvdWxkLmVxbCgncnVuJyk7XG4gICAgICAgIGFyZ3MucGx1Z2luLnNob3VsZC5lcWwoJ2ZvbycpO1xuICAgICAgICBhcmdzLnNjcmlwdE5hbWUuc2hvdWxkLmVxbCgnYmFyJyk7XG4gICAgICAgIGFyZ3MuanNvbi5zaG91bGQuZXFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBhbGxvdyBqc29uIGZvcm1hdCBmb3IgcGx1Z2luJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gcC5wYXJzZUFyZ3MoWydwbHVnaW4nLCAncnVuJywgJ2ZvbycsICdiYXInLCAnLS1qc29uJ10pO1xuICAgICAgICBhcmdzLmpzb24uc2hvdWxkLmVxbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L3BhcnNlci1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|