@appium/support 2.55.4 → 2.56.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/build/lib/env.js +102 -0
- package/build/lib/fs.js +74 -56
- package/build/lib/image-util.js +2 -4
- package/build/lib/index.js +18 -6
- package/build/lib/log-internal.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logging.js +2 -4
- package/build/lib/mjpeg.js +2 -4
- package/build/lib/mkdirp.js +7 -11
- package/build/lib/net.js +2 -4
- package/build/lib/node.js +99 -2
- package/build/lib/npm.js +240 -0
- package/build/lib/plist.js +2 -4
- package/build/lib/process.js +2 -4
- package/build/lib/system.js +2 -4
- package/build/lib/tempdir.js +2 -4
- package/build/lib/timing.js +2 -4
- package/build/lib/util.js +6 -8
- package/build/lib/zip.js +4 -8
- package/lib/env.js +162 -0
- package/lib/fs.js +193 -69
- package/lib/index.js +8 -2
- package/lib/log-internal.js +2 -2
- package/lib/logging.js +1 -1
- package/lib/mkdirp.js +3 -6
- package/lib/net.js +4 -4
- package/lib/node.js +104 -1
- package/lib/npm.js +335 -0
- package/lib/tempdir.js +6 -6
- package/lib/util.js +28 -24
- package/lib/zip.js +7 -8
- package/package.json +20 -10
- package/build/test/assets/sample_binary.plist +0 -0
- package/build/test/assets/sample_text.plist +0 -28
- package/build/test/fs-specs.js +0 -264
- package/build/test/helpers.js +0 -35
- package/build/test/image-util-e2e-specs.js +0 -78
- package/build/test/index-specs.js +0 -49
- package/build/test/log-internals-specs.js +0 -97
- package/build/test/logger/helpers.js +0 -71
- package/build/test/logger/logger-force-specs.js +0 -41
- package/build/test/logger/logger-normal-specs.js +0 -113
- package/build/test/logger/logger-test-specs.js +0 -40
- package/build/test/mjpeg-e2e-specs.js +0 -96
- package/build/test/net-e2e-specs.js +0 -32
- package/build/test/node-e2e-specs.js +0 -22
- package/build/test/plist-specs.js +0 -54
- package/build/test/process-specs.js +0 -104
- package/build/test/system-specs.js +0 -136
- package/build/test/tempdir-specs.js +0 -86
- package/build/test/timing-specs.js +0 -125
- package/build/test/util-e2e-specs.js +0 -136
- package/build/test/util-specs.js +0 -537
- package/build/test/zip-e2e-specs.js +0 -233
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
-
<plist version="1.0">
|
|
4
|
-
<dict>
|
|
5
|
-
<key>com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework</key>
|
|
6
|
-
<dict>
|
|
7
|
-
<key>Whitelisted</key>
|
|
8
|
-
<false/>
|
|
9
|
-
<key>Executable</key>
|
|
10
|
-
<string></string>
|
|
11
|
-
<key>BundlePath</key>
|
|
12
|
-
<string>/System/Library/PrivateFrameworks/Parsec.framework</string>
|
|
13
|
-
<key>Registered</key>
|
|
14
|
-
<string></string>
|
|
15
|
-
</dict>
|
|
16
|
-
<key>com.apple.locationd.bundle-/System/Library/PrivateFrameworks/WirelessDiagnostics.framework</key>
|
|
17
|
-
<dict>
|
|
18
|
-
<key>Whitelisted</key>
|
|
19
|
-
<false/>
|
|
20
|
-
<key>Executable</key>
|
|
21
|
-
<string></string>
|
|
22
|
-
<key>BundlePath</key>
|
|
23
|
-
<string>/System/Library/PrivateFrameworks/WirelessDiagnostics.framework</string>
|
|
24
|
-
<key>Registered</key>
|
|
25
|
-
<string></string>
|
|
26
|
-
</dict>
|
|
27
|
-
</dict>
|
|
28
|
-
</plist>
|
package/build/test/fs-specs.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _index = require("../lib/index.js");
|
|
8
|
-
|
|
9
|
-
var _path = _interopRequireDefault(require("path"));
|
|
10
|
-
|
|
11
|
-
var _teen_process = require("teen_process");
|
|
12
|
-
|
|
13
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
14
|
-
|
|
15
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
16
|
-
|
|
17
|
-
const MOCHA_TIMEOUT = 20000;
|
|
18
|
-
describe('fs', function () {
|
|
19
|
-
this.timeout(MOCHA_TIMEOUT);
|
|
20
|
-
|
|
21
|
-
const existingPath = _path.default.resolve(__dirname, 'fs-specs.js');
|
|
22
|
-
|
|
23
|
-
it('should have expected methods', function () {
|
|
24
|
-
should.exist(_index.fs.open);
|
|
25
|
-
should.exist(_index.fs.close);
|
|
26
|
-
should.exist(_index.fs.access);
|
|
27
|
-
should.exist(_index.fs.mkdir);
|
|
28
|
-
should.exist(_index.fs.readlink);
|
|
29
|
-
should.exist(_index.fs.exists);
|
|
30
|
-
should.exist(_index.fs.rimraf);
|
|
31
|
-
should.exist(_index.fs.rimrafSync);
|
|
32
|
-
should.exist(_index.fs.readFile);
|
|
33
|
-
should.exist(_index.fs.writeFile);
|
|
34
|
-
should.exist(_index.fs.lstat);
|
|
35
|
-
should.exist(_index.fs.mv);
|
|
36
|
-
});
|
|
37
|
-
describe('mkdir', function () {
|
|
38
|
-
let dirName = _path.default.resolve(__dirname, 'tmp');
|
|
39
|
-
|
|
40
|
-
it('should make a directory that does not exist', async function () {
|
|
41
|
-
await _index.fs.rimraf(dirName);
|
|
42
|
-
await _index.fs.mkdir(dirName);
|
|
43
|
-
let exists = await _index.fs.hasAccess(dirName);
|
|
44
|
-
exists.should.be.true;
|
|
45
|
-
});
|
|
46
|
-
it('should not complain if the dir already exists', async function () {
|
|
47
|
-
let exists = await _index.fs.hasAccess(dirName);
|
|
48
|
-
exists.should.be.true;
|
|
49
|
-
await _index.fs.mkdir(dirName);
|
|
50
|
-
});
|
|
51
|
-
it('should still throw an error if something else goes wrong', async function () {
|
|
52
|
-
await _index.fs.mkdir('/bin/foo').should.be.rejected;
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
it('hasAccess', async function () {
|
|
56
|
-
(await _index.fs.exists(existingPath)).should.be.ok;
|
|
57
|
-
|
|
58
|
-
let nonExistingPath = _path.default.resolve(__dirname, 'wrong-specs.js');
|
|
59
|
-
|
|
60
|
-
(await _index.fs.hasAccess(nonExistingPath)).should.not.be.ok;
|
|
61
|
-
});
|
|
62
|
-
it('exists', async function () {
|
|
63
|
-
(await _index.fs.exists(existingPath)).should.be.ok;
|
|
64
|
-
|
|
65
|
-
let nonExistingPath = _path.default.resolve(__dirname, 'wrong-specs.js');
|
|
66
|
-
|
|
67
|
-
(await _index.fs.exists(nonExistingPath)).should.not.be.ok;
|
|
68
|
-
});
|
|
69
|
-
it('readFile', async function () {
|
|
70
|
-
(await _index.fs.readFile(existingPath, 'utf8')).should.contain('readFile');
|
|
71
|
-
});
|
|
72
|
-
describe('copyFile', function () {
|
|
73
|
-
it('should be able to copy a file', async function () {
|
|
74
|
-
let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
|
|
75
|
-
|
|
76
|
-
await _index.fs.copyFile(existingPath, newPath);
|
|
77
|
-
(await _index.fs.readFile(newPath, 'utf8')).should.contain('readFile');
|
|
78
|
-
});
|
|
79
|
-
it('should throw an error if the source does not exist', async function () {
|
|
80
|
-
await _index.fs.copyFile('/sdfsdfsdfsdf', '/tmp/bla').should.eventually.be.rejected;
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
it('rimraf', async function () {
|
|
84
|
-
let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
|
|
85
|
-
|
|
86
|
-
await _index.fs.copyFile(existingPath, newPath);
|
|
87
|
-
(await _index.fs.exists(newPath)).should.be.true;
|
|
88
|
-
await _index.fs.rimraf(newPath);
|
|
89
|
-
(await _index.fs.exists(newPath)).should.be.false;
|
|
90
|
-
});
|
|
91
|
-
it('sanitizeName', function () {
|
|
92
|
-
_index.fs.sanitizeName(':file?.txt', {
|
|
93
|
-
replacement: '-'
|
|
94
|
-
}).should.eql('-file-.txt');
|
|
95
|
-
});
|
|
96
|
-
it('rimrafSync', async function () {
|
|
97
|
-
let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
|
|
98
|
-
|
|
99
|
-
await _index.fs.copyFile(existingPath, newPath);
|
|
100
|
-
(await _index.fs.exists(newPath)).should.be.true;
|
|
101
|
-
|
|
102
|
-
_index.fs.rimrafSync(newPath);
|
|
103
|
-
|
|
104
|
-
(await _index.fs.exists(newPath)).should.be.false;
|
|
105
|
-
});
|
|
106
|
-
describe('md5', function () {
|
|
107
|
-
this.timeout(1200000);
|
|
108
|
-
let smallFilePath;
|
|
109
|
-
let bigFilePath;
|
|
110
|
-
before(async function () {
|
|
111
|
-
smallFilePath = existingPath;
|
|
112
|
-
bigFilePath = _path.default.resolve(await _index.tempDir.openDir(), 'enormous.txt');
|
|
113
|
-
let file = await _index.fs.open(bigFilePath, 'w');
|
|
114
|
-
let fileData = '';
|
|
115
|
-
|
|
116
|
-
for (let i = 0; i < 4096; i++) {
|
|
117
|
-
fileData += '1';
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
for (let i = 0; i < 40000; i++) {
|
|
121
|
-
await _index.fs.write(file, fileData);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
await _index.fs.close(file);
|
|
125
|
-
});
|
|
126
|
-
after(async function () {
|
|
127
|
-
await _index.fs.unlink(bigFilePath);
|
|
128
|
-
});
|
|
129
|
-
it('should calculate hash of correct length', async function () {
|
|
130
|
-
(await _index.fs.md5(smallFilePath)).should.have.length(32);
|
|
131
|
-
});
|
|
132
|
-
it('should be able to run on huge file', async function () {
|
|
133
|
-
(await _index.fs.md5(bigFilePath)).should.have.length(32);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe('hash', function () {
|
|
137
|
-
it('should calculate sha1 hash', async function () {
|
|
138
|
-
(await _index.fs.hash(existingPath, 'sha1')).should.have.length(40);
|
|
139
|
-
});
|
|
140
|
-
it('should calculate md5 hash', async function () {
|
|
141
|
-
(await _index.fs.hash(existingPath, 'md5')).should.have.length(32);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
it('stat', async function () {
|
|
145
|
-
let stat = await _index.fs.stat(existingPath);
|
|
146
|
-
stat.should.have.property('atime');
|
|
147
|
-
});
|
|
148
|
-
describe('which', function () {
|
|
149
|
-
it('should find correct executable', async function () {
|
|
150
|
-
let systemNpmPath = (await (0, _teen_process.exec)('which', ['npm'])).stdout.trim();
|
|
151
|
-
let npmPath = await _index.fs.which('npm');
|
|
152
|
-
npmPath.should.equal(systemNpmPath);
|
|
153
|
-
});
|
|
154
|
-
it('should fail gracefully', async function () {
|
|
155
|
-
await _index.fs.which('something_that_does_not_exist').should.eventually.be.rejected;
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
it('glob', async function () {
|
|
159
|
-
let glob = '*-specs.js';
|
|
160
|
-
let tests = await _index.fs.glob(glob, {
|
|
161
|
-
cwd: __dirname
|
|
162
|
-
});
|
|
163
|
-
tests.should.be.an('array');
|
|
164
|
-
tests.should.have.length.above(2);
|
|
165
|
-
});
|
|
166
|
-
describe('walkDir', function () {
|
|
167
|
-
it('walkDir recursive', async function () {
|
|
168
|
-
let inCallback = 0;
|
|
169
|
-
const filePath = await _index.fs.walkDir(__dirname, true, async item => {
|
|
170
|
-
if (item.endsWith('logger/helpers.js')) {
|
|
171
|
-
++inCallback;
|
|
172
|
-
await _bluebird.default.delay(500);
|
|
173
|
-
--inCallback;
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
inCallback.should.equal(0);
|
|
178
|
-
filePath.should.not.be.null;
|
|
179
|
-
});
|
|
180
|
-
it('should walk all elements recursive', async function () {
|
|
181
|
-
let inCallback = 0;
|
|
182
|
-
const filePath = await _index.fs.walkDir(__dirname, true, async () => {
|
|
183
|
-
++inCallback;
|
|
184
|
-
await _bluebird.default.delay(500);
|
|
185
|
-
--inCallback;
|
|
186
|
-
});
|
|
187
|
-
inCallback.should.equal(0);
|
|
188
|
-
_lodash.default.isNil(filePath).should.be.true;
|
|
189
|
-
});
|
|
190
|
-
it('should throw error through callback', async function () {
|
|
191
|
-
let processed = 0;
|
|
192
|
-
await chai.expect(_index.fs.walkDir(__dirname, true, () => {
|
|
193
|
-
++processed;
|
|
194
|
-
throw 'Callback error';
|
|
195
|
-
})).to.be.rejectedWith('Callback error');
|
|
196
|
-
processed.should.equal(1);
|
|
197
|
-
});
|
|
198
|
-
it('should traverse non-recursively', async function () {
|
|
199
|
-
const filePath = await _index.fs.walkDir(__dirname, false, item => item.endsWith('logger/helpers.js'));
|
|
200
|
-
_lodash.default.isNil(filePath).should.be.true;
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
describe('findRoot()', function () {
|
|
204
|
-
describe('when not provided an argument', function () {
|
|
205
|
-
it('should throw', function () {
|
|
206
|
-
(() => _index.fs.findRoot()).should.throw(TypeError);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
describe('when provided a relative path', function () {
|
|
210
|
-
it('should throw', function () {
|
|
211
|
-
(() => _index.fs.findRoot('./foo')).should.throw(TypeError);
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
describe('when provided an empty string', function () {
|
|
215
|
-
it('should throw', function () {
|
|
216
|
-
(() => _index.fs.findRoot('')).should.throw(TypeError);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
describe('when provided an absolute path', function () {
|
|
220
|
-
describe('when the path has a parent `package.json`', function () {
|
|
221
|
-
it('should locate the dir with the closest `package.json`', function () {
|
|
222
|
-
_index.fs.findRoot(__dirname).should.be.a('string');
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
describe('when the path does not have a parent `package.json`', function () {
|
|
226
|
-
it('should throw', function () {
|
|
227
|
-
(() => _index.fs.findRoot('/')).should.throw(Error);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
describe('readPackageJsonFrom()', function () {
|
|
233
|
-
describe('when not provided an argument', function () {
|
|
234
|
-
it('should throw', function () {
|
|
235
|
-
(() => _index.fs.readPackageJsonFrom()).should.throw(TypeError, /non-empty, absolute path/);
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe('when provided a relative path', function () {
|
|
239
|
-
it('should throw', function () {
|
|
240
|
-
(() => _index.fs.readPackageJsonFrom('./foo')).should.throw(TypeError);
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
describe('when provided an empty string', function () {
|
|
244
|
-
it('should throw', function () {
|
|
245
|
-
(() => _index.fs.readPackageJsonFrom('')).should.throw(TypeError);
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
describe('when provided an absolute path', function () {
|
|
249
|
-
describe('when the path does not have a parent `package.json`', function () {
|
|
250
|
-
it('should throw', function () {
|
|
251
|
-
(() => _index.fs.readPackageJsonFrom('/')).should.throw(Error);
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
describe('when the path has a parent `package.json`', function () {
|
|
255
|
-
it('should read the `package.json` found in the root dir', function () {
|
|
256
|
-
_index.fs.readPackageJsonFrom(__dirname).should.be.an('object');
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});require('source-map-support').install();
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnMtc3BlY3MuanMiXSwibmFtZXMiOlsiTU9DSEFfVElNRU9VVCIsImRlc2NyaWJlIiwidGltZW91dCIsImV4aXN0aW5nUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiaXQiLCJzaG91bGQiLCJleGlzdCIsImZzIiwib3BlbiIsImNsb3NlIiwiYWNjZXNzIiwibWtkaXIiLCJyZWFkbGluayIsImV4aXN0cyIsInJpbXJhZiIsInJpbXJhZlN5bmMiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImxzdGF0IiwibXYiLCJkaXJOYW1lIiwiaGFzQWNjZXNzIiwiYmUiLCJ0cnVlIiwicmVqZWN0ZWQiLCJvayIsIm5vbkV4aXN0aW5nUGF0aCIsIm5vdCIsImNvbnRhaW4iLCJuZXdQYXRoIiwidGVtcERpciIsIm9wZW5EaXIiLCJjb3B5RmlsZSIsImV2ZW50dWFsbHkiLCJmYWxzZSIsInNhbml0aXplTmFtZSIsInJlcGxhY2VtZW50IiwiZXFsIiwic21hbGxGaWxlUGF0aCIsImJpZ0ZpbGVQYXRoIiwiYmVmb3JlIiwiZmlsZSIsImZpbGVEYXRhIiwiaSIsIndyaXRlIiwiYWZ0ZXIiLCJ1bmxpbmsiLCJtZDUiLCJoYXZlIiwibGVuZ3RoIiwiaGFzaCIsInN0YXQiLCJwcm9wZXJ0eSIsInN5c3RlbU5wbVBhdGgiLCJzdGRvdXQiLCJ0cmltIiwibnBtUGF0aCIsIndoaWNoIiwiZXF1YWwiLCJnbG9iIiwidGVzdHMiLCJjd2QiLCJhbiIsImFib3ZlIiwiaW5DYWxsYmFjayIsImZpbGVQYXRoIiwid2Fsa0RpciIsIml0ZW0iLCJlbmRzV2l0aCIsIkIiLCJkZWxheSIsIm51bGwiLCJfIiwiaXNOaWwiLCJwcm9jZXNzZWQiLCJjaGFpIiwiZXhwZWN0IiwidG8iLCJyZWplY3RlZFdpdGgiLCJmaW5kUm9vdCIsInRocm93IiwiVHlwZUVycm9yIiwiYSIsIkVycm9yIiwicmVhZFBhY2thZ2VKc29uRnJvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FB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Qy9FLE1BQXhDLENBQStDMkUsS0FBL0MsQ0FBcURDLFNBQXJEO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0FKTyxDQUFSO0FBTUFuRixJQUFBQSxRQUFRLENBQUMsK0JBQUQsRUFBa0MsWUFBWTtBQUNwRE0sTUFBQUEsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUM3QixTQUFDLE1BQU1HLFVBQUc2RSxtQkFBSCxDQUF1QixFQUF2QixDQUFQLEVBQW1DL0UsTUFBbkMsQ0FBMEMyRSxLQUExQyxDQUFnREMsU0FBaEQ7QUFDRCxPQUZDLENBQUY7QUFHRCxLQUpPLENBQVI7QUFNQW5GLElBQUFBLFFBQVEsQ0FBQyxnQ0FBRCxFQUFtQyxZQUFZO0FBQ3JEQSxNQUFBQSxRQUFRLENBQUMscURBQUQsRUFBd0QsWUFBWTtBQUMxRU0sUUFBQUEsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUM3QixXQUFDLE1BQU1HLFVBQUc2RSxtQkFBSCxDQUF1QixHQUF2QixDQUFQLEVBQW9DL0UsTUFBcEMsQ0FBMkMyRSxLQUEzQyxDQUFpREcsS0FBakQ7QUFDRCxTQUZDLENBQUY7QUFHRCxPQUpPLENBQVI7QUFNQXJGLE1BQUFBLFFBQVEsQ0FBQywyQ0FBRCxFQUE4QyxZQUFZO0FBQ2hFTSxRQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsWUFBWTtBQUNyRUcsb0JBQUc2RSxtQkFBSCxDQUF1QmpGLFNBQXZCLEVBQWtDRSxNQUFsQyxDQUF5Q2lCLEVBQXpDLENBQTRDd0MsRUFBNUMsQ0FBK0MsUUFBL0M7QUFDRCxTQUZDLENBQUY7QUFHRCxPQUpPLENBQVI7QUFLRCxLQVpPLENBQVI7QUFhRCxHQWhDTyxDQUFSO0FBaUNELENBOVBPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJy4uL2xpYi9pbmRleC5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBNT0NIQV9USU1FT1VUID0gMjAwMDA7XG5cbmRlc2NyaWJlKCdmcycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy50aW1lb3V0KE1PQ0hBX1RJTUVPVVQpO1xuXG4gIGNvbnN0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdmcy1zcGVjcy5qcycpO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBleHBlY3RlZCBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZC5leGlzdChmcy5vcGVuKTtcbiAgICBzaG91bGQuZXhpc3QoZnMuY2xvc2UpO1xuICAgIHNob3VsZC5leGlzdChmcy5hY2Nlc3MpO1xuICAgIHNob3VsZC5leGlzdChmcy5ta2Rpcik7XG4gICAgc2hvdWxkLmV4aXN0KGZzLnJlYWRsaW5rKTtcbiAgICBzaG91bGQuZXhpc3QoZnMuZXhpc3RzKTtcbiAgICBzaG91bGQuZXhpc3QoZnMucmltcmFmKTtcbiAgICBzaG91bGQuZXhpc3QoZnMucmltcmFmU3luYyk7XG4gICAgc2hvdWxkLmV4aXN0KGZzLnJlYWRGaWxlKTtcbiAgICBzaG91bGQuZXhpc3QoZnMud3JpdGVGaWxlKTtcbiAgICBzaG91bGQuZXhpc3QoZnMubHN0YXQpO1xuICAgIHNob3VsZC5leGlzdChmcy5tdik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdta2RpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGlyTmFtZSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICd0bXAnKTtcblxuICAgIGl0KCdzaG91bGQgbWFrZSBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGRpck5hbWUpO1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGlyTmFtZSk7XG4gICAgICBsZXQgZXhpc3RzID0gYXdhaXQgZnMuaGFzQWNjZXNzKGRpck5hbWUpO1xuICAgICAgZXhpc3RzLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgY29tcGxhaW4gaWYgdGhlIGRpciBhbHJlYWR5IGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBleGlzdHMgPSBhd2FpdCBmcy5oYXNBY2Nlc3MoZGlyTmFtZSk7XG4gICAgICBleGlzdHMuc2hvdWxkLmJlLnRydWU7XG4gICAgICBhd2FpdCBmcy5ta2RpcihkaXJOYW1lKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RpbGwgdGhyb3cgYW4gZXJyb3IgaWYgc29tZXRoaW5nIGVsc2UgZ29lcyB3cm9uZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKCcvYmluL2ZvbycpLnNob3VsZC5iZS5yZWplY3RlZDtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhc0FjY2VzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKGV4aXN0aW5nUGF0aCkpLnNob3VsZC5iZS5vaztcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dyb25nLXNwZWNzLmpzJyk7XG4gICAgKGF3YWl0IGZzLmhhc0FjY2Vzcyhub25FeGlzdGluZ1BhdGgpKS5zaG91bGQubm90LmJlLm9rO1xuICB9KTtcbiAgaXQoJ2V4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKGV4aXN0aW5nUGF0aCkpLnNob3VsZC5iZS5vaztcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dyb25nLXNwZWNzLmpzJyk7XG4gICAgKGF3YWl0IGZzLmV4aXN0cyhub25FeGlzdGluZ1BhdGgpKS5zaG91bGQubm90LmJlLm9rO1xuICB9KTtcbiAgaXQoJ3JlYWRGaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIChhd2FpdCBmcy5yZWFkRmlsZShleGlzdGluZ1BhdGgsICd1dGY4JykpLnNob3VsZC5jb250YWluKCdyZWFkRmlsZScpO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29weUZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGNvcHkgYSBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG5ld1BhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGVtcERpci5vcGVuRGlyKCksICdmcy1zcGVjcy5qcycpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoZXhpc3RpbmdQYXRoLCBuZXdQYXRoKTtcbiAgICAgIChhd2FpdCBmcy5yZWFkRmlsZShuZXdQYXRoLCAndXRmOCcpKS5zaG91bGQuY29udGFpbigncmVhZEZpbGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKCcvc2Rmc2Rmc2Rmc2RmJywgJy90bXAvYmxhJykuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyaW1yYWYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5ld1BhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGVtcERpci5vcGVuRGlyKCksICdmcy1zcGVjcy5qcycpO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGV4aXN0aW5nUGF0aCwgbmV3UGF0aCk7XG4gICAgKGF3YWl0IGZzLmV4aXN0cyhuZXdQYXRoKSkuc2hvdWxkLmJlLnRydWU7XG4gICAgYXdhaXQgZnMucmltcmFmKG5ld1BhdGgpO1xuICAgIChhd2FpdCBmcy5leGlzdHMobmV3UGF0aCkpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG4gIGl0KCdzYW5pdGl6ZU5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgZnMuc2FuaXRpemVOYW1lKCc6ZmlsZT8udHh0Jywge1xuICAgICAgcmVwbGFjZW1lbnQ6ICctJyxcbiAgICB9KS5zaG91bGQuZXFsKCctZmlsZS0udHh0Jyk7XG4gIH0pO1xuICBpdCgncmltcmFmU3luYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgbmV3UGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ2ZzLXNwZWNzLmpzJyk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoZXhpc3RpbmdQYXRoLCBuZXdQYXRoKTtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKG5ld1BhdGgpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBmcy5yaW1yYWZTeW5jKG5ld1BhdGgpO1xuICAgIChhd2FpdCBmcy5leGlzdHMobmV3UGF0aCkpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdtZDUnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDEyMDAwMDApO1xuICAgIGxldCBzbWFsbEZpbGVQYXRoO1xuICAgIGxldCBiaWdGaWxlUGF0aDtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZ2V0IHRoZSBwYXRoIG9mIGEgc21hbGwgZmlsZSAodGhpcyBzb3VyY2UgZmlsZSlcbiAgICAgIHNtYWxsRmlsZVBhdGggPSBleGlzdGluZ1BhdGg7XG5cbiAgICAgIC8vIGNyZWF0ZSBhIGxhcmdlIGZpbGUgdG8gdGVzdCwgYWJvdXQgMTYzODQwMDAwIGJ5dGVzXG4gICAgICBiaWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ2Vub3Jtb3VzLnR4dCcpO1xuICAgICAgbGV0IGZpbGUgPSBhd2FpdCBmcy5vcGVuKGJpZ0ZpbGVQYXRoLCAndycpO1xuICAgICAgbGV0IGZpbGVEYXRhID0gJyc7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwOTY7IGkrKykge1xuICAgICAgICBmaWxlRGF0YSArPSAnMSc7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwMDAwOyBpKyspIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGUoZmlsZSwgZmlsZURhdGEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMuY2xvc2UoZmlsZSk7XG4gICAgfSk7XG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGJpZ0ZpbGVQYXRoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBoYXNoIG9mIGNvcnJlY3QgbGVuZ3RoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLm1kNShzbWFsbEZpbGVQYXRoKSkuc2hvdWxkLmhhdmUubGVuZ3RoKDMyKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gcnVuIG9uIGh1Z2UgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCBmcy5tZDUoYmlnRmlsZVBhdGgpKS5zaG91bGQuaGF2ZS5sZW5ndGgoMzIpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2hhc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgc2hhMSBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLmhhc2goZXhpc3RpbmdQYXRoLCAnc2hhMScpKS5zaG91bGQuaGF2ZS5sZW5ndGgoNDApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIG1kNSBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLmhhc2goZXhpc3RpbmdQYXRoLCAnbWQ1JykpLnNob3VsZC5oYXZlLmxlbmd0aCgzMik7XG4gICAgfSk7XG4gIH0pO1xuICBpdCgnc3RhdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZXhpc3RpbmdQYXRoKTtcbiAgICBzdGF0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdhdGltZScpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3doaWNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZmluZCBjb3JyZWN0IGV4ZWN1dGFibGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgc3lzdGVtTnBtUGF0aCA9IChhd2FpdCBleGVjKCd3aGljaCcsIFsnbnBtJ10pKS5zdGRvdXQudHJpbSgpO1xuICAgICAgbGV0IG5wbVBhdGggPSBhd2FpdCBmcy53aGljaCgnbnBtJyk7XG4gICAgICBucG1QYXRoLnNob3VsZC5lcXVhbChzeXN0ZW1OcG1QYXRoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZ3JhY2VmdWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLndoaWNoKCdzb21ldGhpbmdfdGhhdF9kb2VzX25vdF9leGlzdCcpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZDtcbiAgICB9KTtcbiAgfSk7XG4gIGl0KCdnbG9iJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBnbG9iID0gJyotc3BlY3MuanMnO1xuICAgIGxldCB0ZXN0cyA9IGF3YWl0IGZzLmdsb2IoZ2xvYiwge2N3ZDogX19kaXJuYW1lfSk7XG4gICAgdGVzdHMuc2hvdWxkLmJlLmFuKCdhcnJheScpO1xuICAgIHRlc3RzLnNob3VsZC5oYXZlLmxlbmd0aC5hYm92ZSgyKTtcbiAgfSk7XG4gIGRlc2NyaWJlKCd3YWxrRGlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCd3YWxrRGlyIHJlY3Vyc2l2ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkNhbGxiYWNrID0gMDtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgZnMud2Fsa0RpcihfX2Rpcm5hbWUsIHRydWUsIGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmVuZHNXaXRoKCdsb2dnZXIvaGVscGVycy5qcycpKSB7XG4gICAgICAgICAgKytpbkNhbGxiYWNrO1xuICAgICAgICAgIC8vIFRoaXMgaXMgdG8gdmVyaWZ5IHByb3BlciBhd2FpdCBmdW5jdGlvbmFsaXR5IG9mIHRoZVxuICAgICAgICAgIC8vIGNhbGxiYWNrIGludm9jYXRpb24gaW5zaWRlIHRoZSBmaWxlIHN5c3RlbSB3YWxrZXJcbiAgICAgICAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gICAgICAgICAgLS1pbkNhbGxiYWNrO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGluQ2FsbGJhY2suc2hvdWxkLmVxdWFsKDApO1xuICAgICAgZmlsZVBhdGguc2hvdWxkLm5vdC5iZS5udWxsO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgd2FsayBhbGwgZWxlbWVudHMgcmVjdXJzaXZlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGluQ2FsbGJhY2sgPSAwO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBmcy53YWxrRGlyKF9fZGlybmFtZSwgdHJ1ZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICArK2luQ2FsbGJhY2s7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgICAgICAgLS1pbkNhbGxiYWNrO1xuXG4gICAgICB9KTtcbiAgICAgIGluQ2FsbGJhY2suc2hvdWxkLmVxdWFsKDApO1xuICAgICAgXy5pc05pbChmaWxlUGF0aCkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB0aHJvdWdoIGNhbGxiYWNrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHByb2Nlc3NlZCA9IDA7XG4gICAgICBhd2FpdCBjaGFpLmV4cGVjdChmcy53YWxrRGlyKF9fZGlybmFtZSwgdHJ1ZSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICsrcHJvY2Vzc2VkO1xuICAgICAgICAgIHRocm93ICdDYWxsYmFjayBlcnJvcic7XG4gICAgICAgIH0pKS50by5iZS5yZWplY3RlZFdpdGgoJ0NhbGxiYWNrIGVycm9yJyk7XG4gICAgICBwcm9jZXNzZWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdHJhdmVyc2Ugbm9uLXJlY3Vyc2l2ZWx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBmcy53YWxrRGlyKF9fZGlybmFtZSwgZmFsc2UsIChpdGVtKSA9PiBpdGVtLmVuZHNXaXRoKCdsb2dnZXIvaGVscGVycy5qcycpKTtcbiAgICAgIF8uaXNOaWwoZmlsZVBhdGgpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmluZFJvb3QoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiBub3QgcHJvdmlkZWQgYW4gYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZnMuZmluZFJvb3QoKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgcmVsYXRpdmUgcGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5maW5kUm9vdCgnLi9mb28nKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5maW5kUm9vdCgnJykpLnNob3VsZC50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhbiBhYnNvbHV0ZSBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIHBhdGggaGFzIGEgcGFyZW50IGBwYWNrYWdlLmpzb25gJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGxvY2F0ZSB0aGUgZGlyIHdpdGggdGhlIGNsb3Nlc3QgYHBhY2thZ2UuanNvbmAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnMuZmluZFJvb3QoX19kaXJuYW1lKS5zaG91bGQuYmUuYSgnc3RyaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQgYHBhY2thZ2UuanNvbmAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgKCgpID0+IGZzLmZpbmRSb290KCcvJykpLnNob3VsZC50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkUGFja2FnZUpzb25Gcm9tKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ3doZW4gbm90IHByb3ZpZGVkIGFuIGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IGZzLnJlYWRQYWNrYWdlSnNvbkZyb20oKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvciwgL25vbi1lbXB0eSwgYWJzb2x1dGUgcGF0aC8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHJlbGF0aXZlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZnMucmVhZFBhY2thZ2VKc29uRnJvbSgnLi9mb28nKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKCcnKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGFic29sdXRlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2hlbiB0aGUgcGF0aCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGBwYWNrYWdlLmpzb25gJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICgoKSA9PiBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKCcvJykpLnNob3VsZC50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBwYXRoIGhhcyBhIHBhcmVudCBgcGFja2FnZS5qc29uYCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWFkIHRoZSBgcGFja2FnZS5qc29uYCBmb3VuZCBpbiB0aGUgcm9vdCBkaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnMucmVhZFBhY2thZ2VKc29uRnJvbShfX2Rpcm5hbWUpLnNob3VsZC5iZS5hbignb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvZnMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/test/helpers.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.MockReadWriteStream = void 0;
|
|
7
|
-
|
|
8
|
-
require("source-map-support/register");
|
|
9
|
-
|
|
10
|
-
var _events = require("events");
|
|
11
|
-
|
|
12
|
-
class MockReadWriteStream extends _events.EventEmitter {
|
|
13
|
-
resume() {}
|
|
14
|
-
|
|
15
|
-
pause() {}
|
|
16
|
-
|
|
17
|
-
setEncoding() {}
|
|
18
|
-
|
|
19
|
-
flush() {}
|
|
20
|
-
|
|
21
|
-
write(msg) {
|
|
22
|
-
this.emit('data', msg);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
end() {
|
|
26
|
-
this.emit('end');
|
|
27
|
-
this.emit('finish');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
exports.MockReadWriteStream = MockReadWriteStream;require('source-map-support').install();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaGVscGVycy5qcyJdLCJuYW1lcyI6WyJNb2NrUmVhZFdyaXRlU3RyZWFtIiwiRXZlbnRFbWl0dGVyIiwicmVzdW1lIiwicGF1c2UiLCJzZXRFbmNvZGluZyIsImZsdXNoIiwid3JpdGUiLCJtc2ciLCJlbWl0IiwiZW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxtQkFBTixTQUFrQ0Msb0JBQWxDLENBQStDO0FBQzdDQyxFQUFBQSxNQUFNLEdBQUksQ0FBRTs7QUFFWkMsRUFBQUEsS0FBSyxHQUFJLENBQUU7O0FBRVhDLEVBQUFBLFdBQVcsR0FBSSxDQUFFOztBQUVqQkMsRUFBQUEsS0FBSyxHQUFJLENBQUU7O0FBRVhDLEVBQUFBLEtBQUssQ0FBRUMsR0FBRixFQUFPO0FBQ1YsU0FBS0MsSUFBTCxDQUFVLE1BQVYsRUFBa0JELEdBQWxCO0FBQ0Q7O0FBRURFLEVBQUFBLEdBQUcsR0FBSTtBQUNMLFNBQUtELElBQUwsQ0FBVSxLQUFWO0FBQ0EsU0FBS0EsSUFBTCxDQUFVLFFBQVY7QUFDRDs7QUFoQjRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuY2xhc3MgTW9ja1JlYWRXcml0ZVN0cmVhbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHJlc3VtZSAoKSB7fVxuXG4gIHBhdXNlICgpIHt9XG5cbiAgc2V0RW5jb2RpbmcgKCkge31cblxuICBmbHVzaCAoKSB7fVxuXG4gIHdyaXRlIChtc2cpIHtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBtc2cpO1xuICB9XG5cbiAgZW5kICgpIHtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMuZW1pdCgnZmluaXNoJyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW9ja1JlYWRXcml0ZVN0cmVhbSB9O1xuIl0sImZpbGUiOiJ0ZXN0L2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _imageUtil = require("../lib/image-util");
|
|
8
|
-
|
|
9
|
-
var _path = _interopRequireDefault(require("path"));
|
|
10
|
-
|
|
11
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
12
|
-
|
|
13
|
-
var _lib = require("../lib");
|
|
14
|
-
|
|
15
|
-
const FIXTURES_ROOT = _path.default.resolve(__dirname, '..', '..', 'test', 'images');
|
|
16
|
-
|
|
17
|
-
async function getImage(name) {
|
|
18
|
-
const imagePath = _path.default.resolve(FIXTURES_ROOT, name);
|
|
19
|
-
|
|
20
|
-
return await _lib.fs.readFile(imagePath, 'utf8');
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe('image-util', function () {
|
|
24
|
-
describe('cropBase64Image', function () {
|
|
25
|
-
let originalImage = null;
|
|
26
|
-
before(async function () {
|
|
27
|
-
const originalImage64 = await getImage('full-image.b64');
|
|
28
|
-
originalImage = await (0, _imageUtil.base64ToImage)(originalImage64);
|
|
29
|
-
originalImage.width.should.be.equal(640, 'unexpected width');
|
|
30
|
-
originalImage.height.should.be.equal(1136, 'unexpected height');
|
|
31
|
-
});
|
|
32
|
-
it('should verify that an image is cropped correctly', async function () {
|
|
33
|
-
const croppedImage = await (0, _imageUtil.cropImage)(originalImage, {
|
|
34
|
-
left: 35,
|
|
35
|
-
top: 107,
|
|
36
|
-
width: 323,
|
|
37
|
-
height: 485
|
|
38
|
-
});
|
|
39
|
-
croppedImage.width.should.be.equal(323, 'unexpected width');
|
|
40
|
-
croppedImage.height.should.be.equal(485, 'unexpected height');
|
|
41
|
-
const croppedImageShouldBe = await getImage('cropped-image.b64');
|
|
42
|
-
const croppedImage64 = await (0, _imageUtil.imageToBase64)(croppedImage);
|
|
43
|
-
croppedImage64.should.be.equal(croppedImageShouldBe);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
describe('Jimp helpers', function () {
|
|
47
|
-
it('should get a jimp object using image buffer', async function () {
|
|
48
|
-
const base64Image = await getImage('cropped-image.b64');
|
|
49
|
-
const imageBuffer = Buffer.from(base64Image, 'base64');
|
|
50
|
-
const jimpImg = await (0, _imageUtil.getJimpImage)(imageBuffer);
|
|
51
|
-
jimpImg.hash().should.eql('80000000000');
|
|
52
|
-
jimpImg.bitmap.height.should.eql(485);
|
|
53
|
-
jimpImg.bitmap.width.should.eql(323);
|
|
54
|
-
});
|
|
55
|
-
it('should get a jimp object using b64 string', async function () {
|
|
56
|
-
const base64Image = await getImage('cropped-image.b64');
|
|
57
|
-
const jimpImg = await (0, _imageUtil.getJimpImage)(base64Image);
|
|
58
|
-
jimpImg.hash().should.eql('80000000000');
|
|
59
|
-
jimpImg.bitmap.height.should.eql(485);
|
|
60
|
-
jimpImg.bitmap.width.should.eql(323);
|
|
61
|
-
});
|
|
62
|
-
it('should error with incorrect data type', async function () {
|
|
63
|
-
await (0, _imageUtil.getJimpImage)(1234).should.eventually.be.rejectedWith(/string or buffer/);
|
|
64
|
-
});
|
|
65
|
-
it('should error with incorrect image data', async function () {
|
|
66
|
-
await (0, _imageUtil.getJimpImage)('foo').should.eventually.be.rejectedWith(/Could not find MIME for Buffer/);
|
|
67
|
-
});
|
|
68
|
-
it('should get an image buffer via the overridden getBuffer method', async function () {
|
|
69
|
-
const base64Image = await getImage('cropped-image.b64');
|
|
70
|
-
const jimpImg = await (0, _imageUtil.getJimpImage)(base64Image);
|
|
71
|
-
const buf = await jimpImg.getBuffer(_imageUtil.MIME_PNG);
|
|
72
|
-
_lodash.default.isBuffer(buf).should.be.true;
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
});require('source-map-support').install();
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW1hZ2UtdXRpbC1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiRklYVFVSRVNfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZ2V0SW1hZ2UiLCJuYW1lIiwiaW1hZ2VQYXRoIiwiZnMiLCJyZWFkRmlsZSIsImRlc2NyaWJlIiwib3JpZ2luYWxJbWFnZSIsImJlZm9yZSIsIm9yaWdpbmFsSW1hZ2U2NCIsIndpZHRoIiwic2hvdWxkIiwiYmUiLCJlcXVhbCIsImhlaWdodCIsIml0IiwiY3JvcHBlZEltYWdlIiwibGVmdCIsInRvcCIsImNyb3BwZWRJbWFnZVNob3VsZEJlIiwiY3JvcHBlZEltYWdlNjQiLCJiYXNlNjRJbWFnZSIsImltYWdlQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImppbXBJbWciLCJoYXNoIiwiZXFsIiwiYml0bWFwIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsImJ1ZiIsImdldEJ1ZmZlciIsIk1JTUVfUE5HIiwiXyIsImlzQnVmZmVyIiwidHJ1ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsYUFBYSxHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsTUFBcEMsRUFBNEMsUUFBNUMsQ0FBdEI7O0FBRUEsZUFBZUMsUUFBZixDQUF5QkMsSUFBekIsRUFBK0I7QUFDN0IsUUFBTUMsU0FBUyxHQUFHTCxjQUFLQyxPQUFMLENBQWFGLGFBQWIsRUFBNEJLLElBQTVCLENBQWxCOztBQUNBLFNBQU8sTUFBTUUsUUFBR0MsUUFBSCxDQUFZRixTQUFaLEVBQXVCLE1BQXZCLENBQWI7QUFDRDs7QUFFREcsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFZO0FBRWpDQSxFQUFBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsWUFBWTtBQUN0QyxRQUFJQyxhQUFhLEdBQUcsSUFBcEI7QUFFQUMsSUFBQUEsTUFBTSxDQUFD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NkJBQWEsSUFBYixFQUFtQkosTUFBbkIsQ0FBMEJrQixVQUExQixDQUFxQ2pCLEVBQXJDLENBQXdDa0IsWUFBeEMsQ0FBcUQsa0JBQXJELENBQU47QUFDRCxLQUZDLENBQUY7QUFHQWYsSUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTJDLGtCQUFrQjtBQUM3RCxZQUFNLDZCQUFhLEtBQWIsRUFBb0JKLE1BQXBCLENBQTJCa0IsVUFBM0IsQ0FBc0NqQixFQUF0QyxDQUF5Q2tCLFlBQXpDLENBQXNELGdDQUF0RCxDQUFOO0FBQ0QsS0FGQyxDQUFGO0FBR0FmLElBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxrQkFBa0I7QUFDckYsWUFBTU0sV0FBVyxHQUFHLE1BQU1wQixRQUFRLENBQUMsbUJBQUQsQ0FBbEM7QUFDQSxZQUFNd0IsT0FBTyxHQUFHLE1BQU0sNkJBQWFKLFdBQWIsQ0FBdEI7QUFDQSxZQUFNVSxHQUFHLEdBQUcsTUFBTU4sT0FBTyxDQUFDTyxTQUFSLENBQWtCQyxtQkFBbEIsQ0FBbEI7QUFDQUMsc0JBQUVDLFFBQUYsQ0FBV0osR0FBWCxFQUFnQnBCLE1BQWhCLENBQXVCQyxFQUF2QixDQUEwQndCLElBQTFCO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0E1Qk8sQ0FBUjtBQTZCRCxDQXpETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYmFzZTY0VG9JbWFnZSwgaW1hZ2VUb0Jhc2U2NCwgY3JvcEltYWdlLFxuICBnZXRKaW1wSW1hZ2UsIE1JTUVfUE5HLFxufSBmcm9tICcuLi9saWIvaW1hZ2UtdXRpbCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcyB9IGZyb20gJy4uL2xpYic7XG5cblxuY29uc3QgRklYVFVSRVNfUk9PVCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsICd0ZXN0JywgJ2ltYWdlcycpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZSAobmFtZSkge1xuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLnJlc29sdmUoRklYVFVSRVNfUk9PVCwgbmFtZSk7XG4gIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShpbWFnZVBhdGgsICd1dGY4Jyk7XG59XG5cbmRlc2NyaWJlKCdpbWFnZS11dGlsJywgZnVuY3Rpb24gKCkge1xuXG4gIGRlc2NyaWJlKCdjcm9wQmFzZTY0SW1hZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG9yaWdpbmFsSW1hZ2UgPSBudWxsO1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2U2NCA9IGF3YWl0IGdldEltYWdlKCdmdWxsLWltYWdlLmI2NCcpO1xuICAgICAgb3JpZ2luYWxJbWFnZSA9IGF3YWl0IGJhc2U2NFRvSW1hZ2Uob3JpZ2luYWxJbWFnZTY0KTtcblxuICAgICAgLy8gdmVyaWZ5IG9yaWdpbmFsIGltYWdlIHNpemUsIHRvIGJlIHN1cmUgdGhhdCBvcmlnaW5hbCBpbWFnZSBpcyBjb3JyZWN0XG4gICAgICBvcmlnaW5hbEltYWdlLndpZHRoLnNob3VsZC5iZS5lcXVhbCg2NDAsICd1bmV4cGVjdGVkIHdpZHRoJyk7XG4gICAgICBvcmlnaW5hbEltYWdlLmhlaWdodC5zaG91bGQuYmUuZXF1YWwoMTEzNiwgJ3VuZXhwZWN0ZWQgaGVpZ2h0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGltYWdlIGlzIGNyb3BwZWQgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3JvcHBlZEltYWdlID0gYXdhaXQgY3JvcEltYWdlKG9yaWdpbmFsSW1hZ2UsIHtsZWZ0OiAzNSwgdG9wOiAxMDcsIHdpZHRoOiAzMjMsIGhlaWdodDogNDg1fSk7XG5cbiAgICAgIC8vIHZlcmlmeSBjcm9wcGVkIGltYWdlIHNpemUsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gb3JpZ2luYWwgaW1hZ2UgYWNjb3JkaW5nIHRvIGNyb3AgcmVnaW9uXG4gICAgICBjcm9wcGVkSW1hZ2Uud2lkdGguc2hvdWxkLmJlLmVxdWFsKDMyMywgJ3VuZXhwZWN0ZWQgd2lkdGgnKTtcbiAgICAgIGNyb3BwZWRJbWFnZS5oZWlnaHQuc2hvdWxkLmJlLmVxdWFsKDQ4NSwgJ3VuZXhwZWN0ZWQgaGVpZ2h0Jyk7XG5cbiAgICAgIC8vIHZlcmlmeSB0aGF0IGltYWdlIGNyb3BwZWQsIGNvbXBhcmUgYmFzZTY0IHJlcHJlc2VudGF0aW9uXG4gICAgICBjb25zdCBjcm9wcGVkSW1hZ2VTaG91bGRCZSA9IGF3YWl0IGdldEltYWdlKCdjcm9wcGVkLWltYWdlLmI2NCcpO1xuICAgICAgY29uc3QgY3JvcHBlZEltYWdlNjQgPSBhd2FpdCBpbWFnZVRvQmFzZTY0KGNyb3BwZWRJbWFnZSk7XG4gICAgICBjcm9wcGVkSW1hZ2U2NC5zaG91bGQuYmUuZXF1YWwoY3JvcHBlZEltYWdlU2hvdWxkQmUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSmltcCBoZWxwZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgamltcCBvYmplY3QgdXNpbmcgaW1hZ2UgYnVmZmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGltYWdlQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0SW1hZ2UsICdiYXNlNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoaW1hZ2VCdWZmZXIpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBqaW1wIG9iamVjdCB1c2luZyBiNjQgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoYmFzZTY0SW1hZ2UpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBkYXRhIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBnZXRKaW1wSW1hZ2UoMTIzNCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9zdHJpbmcgb3IgYnVmZmVyLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBpbWFnZSBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZ2V0SmltcEltYWdlKCdmb28nKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL0NvdWxkIG5vdCBmaW5kIE1JTUUgZm9yIEJ1ZmZlci8pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGltYWdlIGJ1ZmZlciB2aWEgdGhlIG92ZXJyaWRkZW4gZ2V0QnVmZmVyIG1ldGhvZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gYXdhaXQgZ2V0SW1hZ2UoJ2Nyb3BwZWQtaW1hZ2UuYjY0Jyk7XG4gICAgICBjb25zdCBqaW1wSW1nID0gYXdhaXQgZ2V0SmltcEltYWdlKGJhc2U2NEltYWdlKTtcbiAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IGppbXBJbWcuZ2V0QnVmZmVyKE1JTUVfUE5HKTtcbiAgICAgIF8uaXNCdWZmZXIoYnVmKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9pbWFnZS11dGlsLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _index = _interopRequireDefault(require("../lib/index.js"));
|
|
8
|
-
|
|
9
|
-
let {
|
|
10
|
-
system,
|
|
11
|
-
tempDir,
|
|
12
|
-
util
|
|
13
|
-
} = _index.default;
|
|
14
|
-
describe('index', function () {
|
|
15
|
-
describe('default', function () {
|
|
16
|
-
it('should expose an object', function () {
|
|
17
|
-
_index.default.should.exist;
|
|
18
|
-
|
|
19
|
-
_index.default.should.be.an.instanceof(Object);
|
|
20
|
-
});
|
|
21
|
-
it('should expose system object', function () {
|
|
22
|
-
_index.default.system.should.exist;
|
|
23
|
-
|
|
24
|
-
_index.default.system.should.be.an.instanceof(Object);
|
|
25
|
-
});
|
|
26
|
-
it('should expose tempDir object', function () {
|
|
27
|
-
_index.default.tempDir.should.exist;
|
|
28
|
-
|
|
29
|
-
_index.default.tempDir.should.be.an.instanceof(Object);
|
|
30
|
-
});
|
|
31
|
-
it('should expose util object', function () {
|
|
32
|
-
_index.default.util.should.exist;
|
|
33
|
-
|
|
34
|
-
_index.default.util.should.be.an.instanceof(Object);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
it('should expose an object as "system" ', function () {
|
|
38
|
-
system.should.be.an.instanceof(Object);
|
|
39
|
-
});
|
|
40
|
-
it('should expose an object as "tempDir" ', function () {
|
|
41
|
-
tempDir.should.be.an.instanceof(Object);
|
|
42
|
-
});
|
|
43
|
-
it('should expose an object as "util" ', function () {
|
|
44
|
-
util.should.be.an.instanceof(Object);
|
|
45
|
-
});
|
|
46
|
-
});require('source-map-support').install();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5kZXgtc3BlY3MuanMiXSwibmFtZXMiOlsic3lzdGVtIiwidGVtcERpciIsInV0aWwiLCJBcHBpdW1TdXBwb3J0IiwiZGVzY3JpYmUiLCJpdCIsInNob3VsZCIsImV4aXN0IiwiYmUiLCJhbiIsImluc3RhbmNlb2YiLCJPYmplY3QiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOztBQUVBLElBQUk7QUFBRUEsRUFBQUEsTUFBRjtBQUFVQyxFQUFBQSxPQUFWO0FBQW1CQyxFQUFBQTtBQUFuQixJQUE0QkMsY0FBaEM7QUFFQUMsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFZO0FBQzVCQSxFQUFBQSxRQUFRLENBQUMsU0FBRCxFQUFZLFlBQVk7QUFDOUJDLElBQUFBLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixZQUFZO0FBQ3hDRixxQkFBY0csTUFBZCxDQUFxQkMsS0FBckI7O0FBQ0FKLHFCQUFjRyxNQUFkLENBQXFCRSxFQUFyQixDQUF3QkMsRUFBeEIsQ0FBMkJDLFVBQTNCLENBQXNDQyxNQUF0QztBQUNELEtBSEMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMsNkJBQUQsRUFBZ0MsWUFBWTtBQUM1Q0YscUJBQWNILE1BQWQsQ0FBcUJNLE1BQXJCLENBQTRCQyxLQUE1Qjs7QUFDQUoscUJBQWNILE1BQWQsQ0FBcUJNLE1BQXJCLENBQTRCRSxFQUE1QixDQUErQkMsRUFBL0IsQ0FBa0NDLFVBQWxDLENBQTZDQyxNQUE3QztBQUNELEtBSEMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMsOEJBQUQsRUFBaUMsWUFBWTtBQUM3Q0YscUJBQWNGLE9BQWQsQ0FBc0JLLE1BQXRCLENBQTZCQyxLQUE3Qjs7QUFDQUoscUJBQWNGLE9BQWQsQ0FBc0JLLE1BQXRCLENBQTZCRSxFQUE3QixDQUFnQ0MsRUFBaEMsQ0FBbUNDLFVBQW5DLENBQThDQyxNQUE5QztBQUNELEtBSEMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMsMkJBQUQsRUFBOEIsWUFBWTtBQUMxQ0YscUJBQWNELElBQWQsQ0FBbUJJLE1BQW5CLENBQTBCQyxLQUExQjs7QUFDQUoscUJBQWNELElBQWQsQ0FBbUJJLE1BQW5CLENBQTBCRSxFQUExQixDQUE2QkMsRUFBN0IsQ0FBZ0NDLFVBQWhDLENBQTJDQyxNQUEzQztBQUNELEtBSEMsQ0FBRjtBQUlELEdBakJPLENBQVI7QUFtQkFOLEVBQUFBLEVBQUUsQ0FBQyxzQ0FBRCxFQUF5QyxZQUFZO0FBQ3JETCxJQUFBQSxNQUFNLENBQUNNLE1BQVAsQ0FBY0UsRUFBZCxDQUFpQkMsRUFBakIsQ0FBb0JDLFVBQXBCLENBQStCQyxNQUEvQjtBQUNELEdBRkMsQ0FBRjtBQUlBTixFQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsWUFBWTtBQUN0REosSUFBQUEsT0FBTyxDQUFDSyxNQUFSLENBQWVFLEVBQWYsQ0FBa0JDLEVBQWxCLENBQXFCQyxVQUFyQixDQUFnQ0MsTUFBaEM7QUFDRCxHQUZDLENBQUY7QUFJQU4sRUFBQUEsRUFBRSxDQUFDLG9DQUFELEVBQXVDLFlBQVk7QUFDbkRILElBQUFBLElBQUksQ0FBQ0ksTUFBTCxDQUFZRSxFQUFaLENBQWVDLEVBQWYsQ0FBa0JDLFVBQWxCLENBQTZCQyxNQUE3QjtBQUNELEdBRkMsQ0FBRjtBQUdELENBL0JPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBBcHBpdW1TdXBwb3J0IGZyb20gJy4uL2xpYi9pbmRleC5qcyc7XG5cbmxldCB7IHN5c3RlbSwgdGVtcERpciwgdXRpbCB9ID0gQXBwaXVtU3VwcG9ydDtcblxuZGVzY3JpYmUoJ2luZGV4JywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSBhbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBBcHBpdW1TdXBwb3J0LnNob3VsZC5leGlzdDtcbiAgICAgIEFwcGl1bVN1cHBvcnQuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSBzeXN0ZW0gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgQXBwaXVtU3VwcG9ydC5zeXN0ZW0uc2hvdWxkLmV4aXN0O1xuICAgICAgQXBwaXVtU3VwcG9ydC5zeXN0ZW0uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSB0ZW1wRGlyIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIEFwcGl1bVN1cHBvcnQudGVtcERpci5zaG91bGQuZXhpc3Q7XG4gICAgICBBcHBpdW1TdXBwb3J0LnRlbXBEaXIuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGV4cG9zZSB1dGlsIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIEFwcGl1bVN1cHBvcnQudXRpbC5zaG91bGQuZXhpc3Q7XG4gICAgICBBcHBpdW1TdXBwb3J0LnV0aWwuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBvc2UgYW4gb2JqZWN0IGFzIFwic3lzdGVtXCIgJywgZnVuY3Rpb24gKCkge1xuICAgIHN5c3RlbS5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihPYmplY3QpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cG9zZSBhbiBvYmplY3QgYXMgXCJ0ZW1wRGlyXCIgJywgZnVuY3Rpb24gKCkge1xuICAgIHRlbXBEaXIuc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoT2JqZWN0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBvc2UgYW4gb2JqZWN0IGFzIFwidXRpbFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICB1dGlsLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKE9iamVjdCk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvaW5kZXgtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _index = require("../lib/index");
|
|
8
|
-
|
|
9
|
-
var _os = _interopRequireDefault(require("os"));
|
|
10
|
-
|
|
11
|
-
var _path = _interopRequireDefault(require("path"));
|
|
12
|
-
|
|
13
|
-
var _logInternal = require("../lib/log-internal");
|
|
14
|
-
|
|
15
|
-
const CONFIG_PATH = _path.default.resolve(_os.default.tmpdir(), 'rules.json');
|
|
16
|
-
|
|
17
|
-
describe('Log Internals', function () {
|
|
18
|
-
let preprocessor;
|
|
19
|
-
beforeEach(function () {
|
|
20
|
-
preprocessor = new _logInternal.SecureValuesPreprocessor();
|
|
21
|
-
});
|
|
22
|
-
it('should preprocess a string and make replacements', async function () {
|
|
23
|
-
const issues = await preprocessor.loadRules(['yolo']);
|
|
24
|
-
issues.length.should.eql(0);
|
|
25
|
-
preprocessor.rules.length.should.eql(1);
|
|
26
|
-
const replacer = preprocessor.rules[0].replacer;
|
|
27
|
-
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`:${replacer}" yo Yolo yyolo`);
|
|
28
|
-
});
|
|
29
|
-
it('should preprocess a string and make replacements with multiple simple rules', async function () {
|
|
30
|
-
const issues = await preprocessor.loadRules(['yolo', 'yo']);
|
|
31
|
-
issues.length.should.eql(0);
|
|
32
|
-
preprocessor.rules.length.should.eql(2);
|
|
33
|
-
const replacer = preprocessor.rules[0].replacer;
|
|
34
|
-
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`:${replacer}" ${replacer} Yolo yyolo`);
|
|
35
|
-
});
|
|
36
|
-
it('should preprocess a string and make replacements with multiple complex rules', async function () {
|
|
37
|
-
const replacer2 = '***';
|
|
38
|
-
const issues = await preprocessor.loadRules([{
|
|
39
|
-
text: 'yolo',
|
|
40
|
-
flags: 'i'
|
|
41
|
-
}, {
|
|
42
|
-
pattern: '^:',
|
|
43
|
-
replacer: replacer2
|
|
44
|
-
}]);
|
|
45
|
-
issues.length.should.eql(0);
|
|
46
|
-
preprocessor.rules.length.should.eql(2);
|
|
47
|
-
const replacer = preprocessor.rules[0].replacer;
|
|
48
|
-
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`${replacer2}${replacer}" yo ${replacer} yyolo`);
|
|
49
|
-
});
|
|
50
|
-
it(`should preprocess a string and apply a rule where 'pattern' has priority over 'text'`, async function () {
|
|
51
|
-
const replacer = '***';
|
|
52
|
-
const issues = await preprocessor.loadRules([{
|
|
53
|
-
pattern: '^:',
|
|
54
|
-
text: 'yo',
|
|
55
|
-
replacer
|
|
56
|
-
}]);
|
|
57
|
-
issues.length.should.eql(0);
|
|
58
|
-
preprocessor.rules.length.should.eql(1);
|
|
59
|
-
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`${replacer}yolo" yo Yolo yyolo`);
|
|
60
|
-
});
|
|
61
|
-
it('should preprocess a string and make replacements with multiple complex rules and issues', async function () {
|
|
62
|
-
const replacer2 = '***';
|
|
63
|
-
const issues = await preprocessor.loadRules([{
|
|
64
|
-
text: 'yolo',
|
|
65
|
-
flags: 'i'
|
|
66
|
-
}, {
|
|
67
|
-
pattern: '^:(',
|
|
68
|
-
replacer: replacer2
|
|
69
|
-
}]);
|
|
70
|
-
issues.length.should.eql(1);
|
|
71
|
-
preprocessor.rules.length.should.eql(1);
|
|
72
|
-
const replacer = preprocessor.rules[0].replacer;
|
|
73
|
-
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(`:${replacer}" yo ${replacer} yyolo`);
|
|
74
|
-
});
|
|
75
|
-
it('should leave the string unchanged if all rules have issues', async function () {
|
|
76
|
-
const replacer2 = '***';
|
|
77
|
-
const issues = await preprocessor.loadRules([null, {
|
|
78
|
-
flags: 'i'
|
|
79
|
-
}, {
|
|
80
|
-
pattern: '^:(',
|
|
81
|
-
replacer: replacer2
|
|
82
|
-
}]);
|
|
83
|
-
issues.length.should.eql(3);
|
|
84
|
-
preprocessor.rules.length.should.eql(0);
|
|
85
|
-
preprocessor.preprocess(':yolo" yo Yolo yyolo').should.eql(':yolo" yo Yolo yyolo');
|
|
86
|
-
});
|
|
87
|
-
it('should fail if rules cannot be accessed', async function () {
|
|
88
|
-
await preprocessor.loadRules('bla').should.eventually.be.rejected;
|
|
89
|
-
});
|
|
90
|
-
it('should fail if rules JSON cannot be parsed', async function () {
|
|
91
|
-
await _index.fs.writeFile(CONFIG_PATH, 'blabla', 'utf8');
|
|
92
|
-
await preprocessor.loadRules(CONFIG_PATH).should.eventually.be.rejected;
|
|
93
|
-
});
|
|
94
|
-
});require('source-map-support').install();
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvbG9nLWludGVybmFscy1zcGVjcy5qcyJdLCJuYW1lcyI6WyJDT05GSUdfUEFUSCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJkZXNjcmliZSIsInByZXByb2Nlc3NvciIsImJlZm9yZUVhY2giLCJTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzb3IiLCJpdCIsImlzc3VlcyIsImxvYWRSdWxlcyIsImxlbmd0aCIsInNob3VsZCIsImVxbCIsInJ1bGVzIiwicmVwbGFjZXIiLCJwcmVwcm9jZXNzIiwicmVwbGFjZXIyIiwidGV4dCIsImZsYWdzIiwicGF0dGVybiIsImV2ZW50dWFsbHkiLCJiZSIsInJlamVjdGVkIiwiZnMiLCJ3cml0ZUZpbGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFdBQVcsR0FBR0MsY0FBS0MsT0FBTCxDQUFhQyxZQUFHQyxNQUFILEVBQWIsRUFBMEIsWUFBMUIsQ0FBcEI7O0FBS0FDLFFBQVEsQ0FBQyxlQUFELEVBQWtCLFlBQVk7QUFDcEMsTUFBSUMsWUFBSjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBWTtBQUNyQkQsSUFBQUEsWUFBWSxHQUFHLElBQUlFLHFDQUFKLEVBQWY7QUFDRCxHQUZTLENBQVY7QUFJQUMsRUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtBQUN2RSxVQUFNQyxNQUFNLEdBQUcsTUFBTUosWUFBWSxDQUFDSyxTQUFiLENBQXVCLENBQzFDLE1BRDBDLENBQXZCLENBQXJCO0FBR0FELElBQUFBLE1BQU0sQ0FBQ0UsTUFBUCxDQUFjQyxNQUFkLENBQXFCQyxHQUFyQixDQUF5QixDQUF6QjtBQUNBUixJQUFBQSxZQUFZLENBQUNTLEtBQWIsQ0FBbUJILE1BQW5CLENBQTBCQyxNQUExQixDQUFpQ0MsR0FBakMsQ0FBcUMsQ0FBckM7QUFDQSxVQUFNRSxRQUFRLEdBQUdWLFlBQVksQ0FBQ1MsS0FBYixDQUFtQixDQUFuQixFQUFz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QyxDQUFGO0FBWUFMLEVBQUFBLEVBQUUsQ0FBQyx5Q0FBRCxFQUE0QyxrQkFBa0I7QUFDOUQsVUFBTUgsWUFBWSxDQUFDSyxTQUFiLENBQXVCLEtBQXZCLEVBQThCRSxNQUE5QixDQUFxQ1MsVUFBckMsQ0FBZ0RDLEVBQWhELENBQW1EQyxRQUF6RDtBQUNELEdBRkMsQ0FBRjtBQUlBZixFQUFBQSxFQUFFLENBQUMsNENBQUQsRUFBK0Msa0JBQWtCO0FBQ2pFLFVBQU1nQixVQUFHQyxTQUFILENBQWExQixXQUFiLEVBQTBCLFFBQTFCLEVBQW9DLE1BQXBDLENBQU47QUFDQSxVQUFNTSxZQUFZLENBQUNLLFNBQWIsQ0FBdUJYLFdBQXZCLEVBQW9DYSxNQUFwQyxDQUEyQ1MsVUFBM0MsQ0FBc0RDLEVBQXRELENBQXlEQyxRQUEvRDtBQUNELEdBSEMsQ0FBRjtBQUlELENBbEZPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcyB9IGZyb20gJy4uL2xpYi9pbmRleCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzb3IgfSBmcm9tICcuLi9saWIvbG9nLWludGVybmFsJztcblxuXG5jb25zdCBDT05GSUdfUEFUSCA9IHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ3J1bGVzLmpzb24nKTtcblxuXG5cblxuZGVzY3JpYmUoJ0xvZyBJbnRlcm5hbHMnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBwcmVwcm9jZXNzb3I7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcHJlcHJvY2Vzc29yID0gbmV3IFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NvcigpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByZXByb2Nlc3MgYSBzdHJpbmcgYW5kIG1ha2UgcmVwbGFjZW1lbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlzc3VlcyA9IGF3YWl0IHByZXByb2Nlc3Nvci5sb2FkUnVsZXMoW1xuICAgICAgJ3lvbG8nLFxuICAgIF0pO1xuICAgIGlzc3Vlcy5sZW5ndGguc2hvdWxkLmVxbCgwKTtcbiAgICBwcmVwcm9jZXNzb3IucnVsZXMubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgY29uc3QgcmVwbGFjZXIgPSBwcmVwcm9jZXNzb3IucnVsZXNbMF0ucmVwbGFjZXI7XG4gICAgcHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpLnNob3VsZC5lcWwoYDoke3JlcGxhY2VyfVwiIHlvIFlvbG8geXlvbG9gKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcmVwcm9jZXNzIGEgc3RyaW5nIGFuZCBtYWtlIHJlcGxhY2VtZW50cyB3aXRoIG11bHRpcGxlIHNpbXBsZSBydWxlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBwcmVwcm9jZXNzb3IubG9hZFJ1bGVzKFtcbiAgICAgICd5b2xvJyxcbiAgICAgICd5bycsXG4gICAgXSk7XG4gICAgaXNzdWVzLmxlbmd0aC5zaG91bGQuZXFsKDApO1xuICAgIHByZXByb2Nlc3Nvci5ydWxlcy5sZW5ndGguc2hvdWxkLmVxbCgyKTtcbiAgICBjb25zdCByZXBsYWNlciA9IHByZXByb2Nlc3Nvci5ydWxlc1swXS5yZXBsYWNlcjtcbiAgICBwcmVwcm9jZXNzb3IucHJlcHJvY2VzcygnOnlvbG9cIiB5byBZb2xvIHl5b2xvJykuc2hvdWxkLmVxbChgOiR7cmVwbGFjZXJ9XCIgJHtyZXBsYWNlcn0gWW9sbyB5eW9sb2ApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByZXByb2Nlc3MgYSBzdHJpbmcgYW5kIG1ha2UgcmVwbGFjZW1lbnRzIHdpdGggbXVsdGlwbGUgY29tcGxleCBydWxlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXBsYWNlcjIgPSAnKioqJztcbiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBwcmVwcm9jZXNzb3IubG9hZFJ1bGVzKFtcbiAgICAgIHsgdGV4dDogJ3lvbG8nLCBmbGFnczogJ2knIH0sXG4gICAgICB7IHBhdHRlcm46ICdeOicsIHJlcGxhY2VyOiByZXBsYWNlcjIgfSxcbiAgICBdKTtcbiAgICBpc3N1ZXMubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgcHJlcHJvY2Vzc29yLnJ1bGVzLmxlbmd0aC5zaG91bGQuZXFsKDIpO1xuICAgIGNvbnN0IHJlcGxhY2VyID0gcHJlcHJvY2Vzc29yLnJ1bGVzWzBdLnJlcGxhY2VyO1xuICAgIHByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKCc6eW9sb1wiIHlvIFlvbG8geXlvbG8nKS5zaG91bGQuZXFsKGAke3JlcGxhY2VyMn0ke3JlcGxhY2VyfVwiIHlvICR7cmVwbGFjZXJ9IHl5b2xvYCk7XG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgcHJlcHJvY2VzcyBhIHN0cmluZyBhbmQgYXBwbHkgYSBydWxlIHdoZXJlICdwYXR0ZXJuJyBoYXMgcHJpb3JpdHkgb3ZlciAndGV4dCdgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVwbGFjZXIgPSAnKioqJztcbiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBwcmVwcm9jZXNzb3IubG9hZFJ1bGVzKFtcbiAgICAgIHsgcGF0dGVybjogJ146JywgdGV4dDogJ3lvJywgcmVwbGFjZXIgfSxcbiAgICBdKTtcbiAgICBpc3N1ZXMubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgcHJlcHJvY2Vzc29yLnJ1bGVzLmxlbmd0aC5zaG91bGQuZXFsKDEpO1xuICAgIHByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKCc6eW9sb1wiIHlvIFlvbG8geXlvbG8nKS5zaG91bGQuZXFsKGAke3JlcGxhY2VyfXlvbG9cIiB5byBZb2xvIHl5b2xvYCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcHJlcHJvY2VzcyBhIHN0cmluZyBhbmQgbWFrZSByZXBsYWNlbWVudHMgd2l0aCBtdWx0aXBsZSBjb21wbGV4IHJ1bGVzIGFuZCBpc3N1ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVwbGFjZXIyID0gJyoqKic7XG4gICAgY29uc3QgaXNzdWVzID0gYXdhaXQgcHJlcHJvY2Vzc29yLmxvYWRSdWxlcyhbXG4gICAgICB7IHRleHQ6ICd5b2xvJywgZmxhZ3M6ICdpJyB9LFxuICAgICAgeyBwYXR0ZXJuOiAnXjooJywgcmVwbGFjZXI6IHJlcGxhY2VyMiB9LFxuICAgIF0pO1xuICAgIGlzc3Vlcy5sZW5ndGguc2hvdWxkLmVxbCgxKTtcbiAgICBwcmVwcm9jZXNzb3IucnVsZXMubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgY29uc3QgcmVwbGFjZXIgPSBwcmVwcm9jZXNzb3IucnVsZXNbMF0ucmVwbGFjZXI7XG4gICAgcHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpLnNob3VsZC5lcWwoYDoke3JlcGxhY2VyfVwiIHlvICR7cmVwbGFjZXJ9IHl5b2xvYCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbGVhdmUgdGhlIHN0cmluZyB1bmNoYW5nZWQgaWYgYWxsIHJ1bGVzIGhhdmUgaXNzdWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlcGxhY2VyMiA9ICcqKionO1xuICAgIGNvbnN0IGlzc3VlcyA9IGF3YWl0IHByZXByb2Nlc3Nvci5sb2FkUnVsZXMoW1xuICAgICAgbnVsbCxcbiAgICAgIHsgZmxhZ3M6ICdpJyB9LFxuICAgICAgeyBwYXR0ZXJuOiAnXjooJywgcmVwbGFjZXI6IHJlcGxhY2VyMiB9LFxuICAgIF0pO1xuICAgIGlzc3Vlcy5sZW5ndGguc2hvdWxkLmVxbCgzKTtcbiAgICBwcmVwcm9jZXNzb3IucnVsZXMubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgcHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpLnNob3VsZC5lcWwoJzp5b2xvXCIgeW8gWW9sbyB5eW9sbycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgcnVsZXMgY2Fubm90IGJlIGFjY2Vzc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHByZXByb2Nlc3Nvci5sb2FkUnVsZXMoJ2JsYScpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgcnVsZXMgSlNPTiBjYW5ub3QgYmUgcGFyc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShDT05GSUdfUEFUSCwgJ2JsYWJsYScsICd1dGY4Jyk7XG4gICAgYXdhaXQgcHJlcHJvY2Vzc29yLmxvYWRSdWxlcyhDT05GSUdfUEFUSCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvbG9nLWludGVybmFscy1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|