@appium/support 2.55.3 → 2.55.4
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/image-util.js +3 -336
- package/build/test/image-util-e2e-specs.js +1 -150
- package/lib/image-util.js +3 -578
- package/package.json +3 -2
|
@@ -21,9 +21,6 @@ async function getImage(name) {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
describe('image-util', function () {
|
|
24
|
-
before(function () {
|
|
25
|
-
return this.skip();
|
|
26
|
-
});
|
|
27
24
|
describe('cropBase64Image', function () {
|
|
28
25
|
let originalImage = null;
|
|
29
26
|
before(async function () {
|
|
@@ -46,152 +43,6 @@ describe('image-util', function () {
|
|
|
46
43
|
croppedImage64.should.be.equal(croppedImageShouldBe);
|
|
47
44
|
});
|
|
48
45
|
});
|
|
49
|
-
describe('OpenCV helpers', function () {
|
|
50
|
-
this.timeout(120000);
|
|
51
|
-
let imgFixture = null;
|
|
52
|
-
let fullImage = null;
|
|
53
|
-
let partialImage = null;
|
|
54
|
-
let originalImage = null;
|
|
55
|
-
let changedImage = null;
|
|
56
|
-
let rotatedImage = null;
|
|
57
|
-
let numberImage = null;
|
|
58
|
-
before(async function () {
|
|
59
|
-
const imagePath = _path.default.resolve(FIXTURES_ROOT, 'full-image.b64');
|
|
60
|
-
|
|
61
|
-
imgFixture = Buffer.from(await _lib.fs.readFile(imagePath, 'binary'), 'base64');
|
|
62
|
-
fullImage = await _lib.fs.readFile(_path.default.resolve(FIXTURES_ROOT, 'findwaldo.jpg'));
|
|
63
|
-
partialImage = await _lib.fs.readFile(_path.default.resolve(FIXTURES_ROOT, 'waldo.jpg'));
|
|
64
|
-
originalImage = await _lib.fs.readFile(_path.default.resolve(FIXTURES_ROOT, 'cc1.png'));
|
|
65
|
-
changedImage = await _lib.fs.readFile(_path.default.resolve(FIXTURES_ROOT, 'cc2.png'));
|
|
66
|
-
numberImage = await _lib.fs.readFile(_path.default.resolve(FIXTURES_ROOT, 'number5.png'));
|
|
67
|
-
rotatedImage = await _lib.fs.readFile(_path.default.resolve(FIXTURES_ROOT, 'cc_rotated.png'));
|
|
68
|
-
});
|
|
69
|
-
describe('getImagesMatches', function () {
|
|
70
|
-
it('should calculate the number of matches between two images', async function () {
|
|
71
|
-
for (const detectorName of ['AKAZE', 'ORB']) {
|
|
72
|
-
const {
|
|
73
|
-
count,
|
|
74
|
-
totalCount
|
|
75
|
-
} = await (0, _imageUtil.getImagesMatches)(fullImage, fullImage, {
|
|
76
|
-
detectorName
|
|
77
|
-
});
|
|
78
|
-
count.should.be.above(0);
|
|
79
|
-
totalCount.should.eql(count);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
it('should visualize matches between two images', async function () {
|
|
83
|
-
const {
|
|
84
|
-
visualization
|
|
85
|
-
} = await (0, _imageUtil.getImagesMatches)(fullImage, fullImage, {
|
|
86
|
-
visualize: true
|
|
87
|
-
});
|
|
88
|
-
visualization.should.not.be.empty;
|
|
89
|
-
});
|
|
90
|
-
it('should visualize matches between two images and apply goodMatchesFactor', async function () {
|
|
91
|
-
const {
|
|
92
|
-
visualization,
|
|
93
|
-
points1,
|
|
94
|
-
rect1,
|
|
95
|
-
points2,
|
|
96
|
-
rect2
|
|
97
|
-
} = await (0, _imageUtil.getImagesMatches)(rotatedImage, originalImage, {
|
|
98
|
-
visualize: true,
|
|
99
|
-
matchFunc: 'BruteForceHamming',
|
|
100
|
-
goodMatchesFactor: 40
|
|
101
|
-
});
|
|
102
|
-
visualization.should.not.be.empty;
|
|
103
|
-
points1.length.should.be.above(4);
|
|
104
|
-
rect1.x.should.be.above(0);
|
|
105
|
-
rect1.y.should.be.above(0);
|
|
106
|
-
rect1.width.should.be.above(0);
|
|
107
|
-
rect1.height.should.be.above(0);
|
|
108
|
-
points2.length.should.be.above(4);
|
|
109
|
-
rect2.x.should.be.above(0);
|
|
110
|
-
rect2.y.should.be.above(0);
|
|
111
|
-
rect2.width.should.be.above(0);
|
|
112
|
-
rect2.height.should.be.above(0);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
describe('getImagesSimilarity', function () {
|
|
116
|
-
it('should calculate the similarity score between two images', async function () {
|
|
117
|
-
const {
|
|
118
|
-
score
|
|
119
|
-
} = await (0, _imageUtil.getImagesSimilarity)(imgFixture, imgFixture);
|
|
120
|
-
score.should.be.above(0);
|
|
121
|
-
});
|
|
122
|
-
it('should visualize the similarity between two images', async function () {
|
|
123
|
-
const {
|
|
124
|
-
visualization
|
|
125
|
-
} = await (0, _imageUtil.getImagesSimilarity)(originalImage, changedImage, {
|
|
126
|
-
visualize: true
|
|
127
|
-
});
|
|
128
|
-
visualization.should.not.be.empty;
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe('getImageOccurrence', function () {
|
|
132
|
-
it('should calculate the partial image position in the full image', async function () {
|
|
133
|
-
const {
|
|
134
|
-
rect,
|
|
135
|
-
score
|
|
136
|
-
} = await (0, _imageUtil.getImageOccurrence)(fullImage, partialImage);
|
|
137
|
-
rect.x.should.be.above(0);
|
|
138
|
-
rect.y.should.be.above(0);
|
|
139
|
-
rect.width.should.be.above(0);
|
|
140
|
-
rect.height.should.be.above(0);
|
|
141
|
-
score.should.be.above(0);
|
|
142
|
-
});
|
|
143
|
-
it('should reject matches that fall below a threshold', async function () {
|
|
144
|
-
await (0, _imageUtil.getImageOccurrence)(fullImage, partialImage, {
|
|
145
|
-
threshold: 1.0
|
|
146
|
-
}).should.eventually.be.rejectedWith(/threshold/);
|
|
147
|
-
});
|
|
148
|
-
it('should visualize the partial image position in the full image', async function () {
|
|
149
|
-
const {
|
|
150
|
-
visualization
|
|
151
|
-
} = await (0, _imageUtil.getImageOccurrence)(fullImage, partialImage, {
|
|
152
|
-
visualize: true
|
|
153
|
-
});
|
|
154
|
-
visualization.should.not.be.empty;
|
|
155
|
-
});
|
|
156
|
-
describe('multiple', function () {
|
|
157
|
-
it('should return matches in the full image', async function () {
|
|
158
|
-
const {
|
|
159
|
-
multiple
|
|
160
|
-
} = await (0, _imageUtil.getImageOccurrence)(originalImage, numberImage, {
|
|
161
|
-
threshold: 0.8,
|
|
162
|
-
multiple: true
|
|
163
|
-
});
|
|
164
|
-
multiple.length.should.be.eq(3);
|
|
165
|
-
|
|
166
|
-
for (const result of multiple) {
|
|
167
|
-
result.rect.x.should.be.above(0);
|
|
168
|
-
result.rect.y.should.be.above(0);
|
|
169
|
-
result.rect.width.should.be.above(0);
|
|
170
|
-
result.rect.height.should.be.above(0);
|
|
171
|
-
result.score.should.be.above(0);
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
it('should reject matches that fall below a threshold', async function () {
|
|
175
|
-
await (0, _imageUtil.getImageOccurrence)(originalImage, numberImage, {
|
|
176
|
-
threshold: 1.0,
|
|
177
|
-
multiple: true
|
|
178
|
-
}).should.eventually.be.rejectedWith(/threshold/);
|
|
179
|
-
});
|
|
180
|
-
it('should visualize the partial image position in the full image', async function () {
|
|
181
|
-
const {
|
|
182
|
-
multiple
|
|
183
|
-
} = await (0, _imageUtil.getImageOccurrence)(originalImage, numberImage, {
|
|
184
|
-
visualize: true,
|
|
185
|
-
multiple: true
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
for (const result of multiple) {
|
|
189
|
-
result.visualization.should.not.be.empty;
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
46
|
describe('Jimp helpers', function () {
|
|
196
47
|
it('should get a jimp object using image buffer', async function () {
|
|
197
48
|
const base64Image = await getImage('cropped-image.b64');
|
|
@@ -224,4 +75,4 @@ describe('image-util', function () {
|
|
|
224
75
|
});require('source-map-support').install();
|
|
225
76
|
|
|
226
77
|
|
|
227
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW1hZ2UtdXRpbC1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiRklYVFVSRVNfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZ2V0SW1hZ2UiLCJuYW1lIiwiaW1hZ2VQYXRoIiwiZnMiLCJyZWFkRmlsZSIsImRlc2NyaWJlIiwiYmVmb3JlIiwic2tpcCIsIm9yaWdpbmFsSW1hZ2UiLCJvcmlnaW5hbEltYWdlNjQiLCJ3aWR0aCIsInNob3VsZCIsImJlIiwiZXF1YWwiLCJoZWlnaHQiLCJpdCIsImNyb3BwZWRJbWFnZSIsImxlZnQiLCJ0b3AiLCJjcm9wcGVkSW1hZ2VTaG91bGRCZSIsImNyb3BwZWRJbWFnZTY0IiwidGltZW91dCIsImltZ0ZpeHR1cmUiLCJmdWxsSW1hZ2UiLCJwYXJ0aWFsSW1hZ2UiLCJjaGFuZ2VkSW1hZ2UiLCJyb3RhdGVkSW1hZ2UiLCJudW1iZXJJbWFnZSIsIkJ1ZmZlciIsImZyb20iLCJkZXRlY3Rvck5hbWUiLCJjb3VudCIsInRvdGFsQ291bnQiLCJhYm92ZSIsImVxbCIsInZpc3VhbGl6YXRpb24iLCJ2aXN1YWxpemUiLCJub3QiLCJlbXB0eSIsInBvaW50czEiLCJyZWN0MSIsInBvaW50czIiLCJyZWN0MiIsIm1hdGNoRnVuYyIsImdvb2RNYXRjaGVzRmFjdG9yIiwibGVuZ3RoIiwieCIsInkiLCJzY29yZSIsInJlY3QiLCJ0aHJlc2hvbGQiLCJldmVudHVhbGx5IiwicmVqZWN0ZWRXaXRoIiwibXVsdGlwbGUiLCJlcSIsInJlc3VsdCIsImJhc2U2NEltYWdlIiwiaW1hZ2VCdWZmZXIiLCJqaW1wSW1nIiwiaGFzaCIsImJpdG1hcCIsImJ1ZiIsImdldEJ1ZmZlciIsIk1JTUVfUE5HIiwiXyIsImlzQnVmZmVyIiwidHJ1ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsYUFBYSxHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0IsSUFBeEIs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QXJDLElBQUFBLEVBQUUsQ0FBQyx3Q0FBRCxFQUEyQyxrQkFBa0I7QUFDN0QsWUFBTSw2QkFBYSxLQUFiLEVBQW9CSixNQUFwQixDQUEyQndDLFVBQTNCLENBQXNDdkMsRUFBdEMsQ0FBeUN3QyxZQUF6QyxDQUFzRCxnQ0FBdEQsQ0FBTjtBQUNELEtBRkMsQ0FBRjtBQUdBckMsSUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLGtCQUFrQjtBQUNyRixZQUFNeUMsV0FBVyxHQUFHLE1BQU14RCxRQUFRLENBQUMsbUJBQUQsQ0FBbEM7QUFDQSxZQUFNMEQsT0FBTyxHQUFHLE1BQU0sNkJBQWFGLFdBQWIsQ0FBdEI7QUFDQSxZQUFNSyxHQUFHLEdBQUcsTUFBTUgsT0FBTyxDQUFDSSxTQUFSLENBQWtCQyxtQkFBbEIsQ0FBbEI7QUFDQUMsc0JBQUVDLFFBQUYsQ0FBV0osR0FBWCxFQUFnQmxELE1BQWhCLENBQXVCQyxFQUF2QixDQUEwQnNELElBQTFCO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0E1Qk8sQ0FBUjtBQTZCRCxDQXBMTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYmFzZTY0VG9JbWFnZSwgaW1hZ2VUb0Jhc2U2NCwgY3JvcEltYWdlLFxuICBnZXRJbWFnZXNNYXRjaGVzLCBnZXRJbWFnZXNTaW1pbGFyaXR5LCBnZXRJbWFnZU9jY3VycmVuY2UsXG4gIGdldEppbXBJbWFnZSwgTUlNRV9QTkcsXG59IGZyb20gJy4uL2xpYi9pbWFnZS11dGlsJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzIH0gZnJvbSAnLi4vbGliJztcblxuXG5jb25zdCBGSVhUVVJFU19ST09UID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3Rlc3QnLCAnaW1hZ2VzJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEltYWdlIChuYW1lKSB7XG4gIGNvbnN0IGltYWdlUGF0aCA9IHBhdGgucmVzb2x2ZShGSVhUVVJFU19ST09ULCBuYW1lKTtcbiAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKGltYWdlUGF0aCwgJ3V0ZjgnKTtcbn1cblxuZGVzY3JpYmUoJ2ltYWdlLXV0aWwnLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gb3BlbmN2NG5vZGVqcyBpcyBmaXhlZFxuICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Nyb3BCYXNlNjRJbWFnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgb3JpZ2luYWxJbWFnZSA9IG51bGw7XG5cbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxJbWFnZTY0ID0gYXdhaXQgZ2V0SW1hZ2UoJ2Z1bGwtaW1hZ2UuYjY0Jyk7XG4gICAgICBvcmlnaW5hbEltYWdlID0gYXdhaXQgYmFzZTY0VG9JbWFnZShvcmlnaW5hbEltYWdlNjQpO1xuXG4gICAgICAvLyB2ZXJpZnkgb3JpZ2luYWwgaW1hZ2Ugc2l6ZSwgdG8gYmUgc3VyZSB0aGF0IG9yaWdpbmFsIGltYWdlIGlzIGNvcnJlY3RcbiAgICAgIG9yaWdpbmFsSW1hZ2Uud2lkdGguc2hvdWxkLmJlLmVxdWFsKDY0MCwgJ3VuZXhwZWN0ZWQgd2lkdGgnKTtcbiAgICAgIG9yaWdpbmFsSW1hZ2UuaGVpZ2h0LnNob3VsZC5iZS5lcXVhbCgxMTM2LCAndW5leHBlY3RlZCBoZWlnaHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHRoYXQgYW4gaW1hZ2UgaXMgY3JvcHBlZCBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjcm9wcGVkSW1hZ2UgPSBhd2FpdCBjcm9wSW1hZ2Uob3JpZ2luYWxJbWFnZSwge2xlZnQ6IDM1LCB0b3A6IDEwNywgd2lkdGg6IDMyMywgaGVpZ2h0OiA0ODV9KTtcblxuICAgICAgLy8gdmVyaWZ5IGNyb3BwZWQgaW1hZ2Ugc2l6ZSwgaXQgc2hvdWxkIGJlIGxlc3MgdGhhbiBvcmlnaW5hbCBpbWFnZSBhY2NvcmRpbmcgdG8gY3JvcCByZWdpb25cbiAgICAgIGNyb3BwZWRJbWFnZS53aWR0aC5zaG91bGQuYmUuZXF1YWwoMzIzLCAndW5leHBlY3RlZCB3aWR0aCcpO1xuICAgICAgY3JvcHBlZEltYWdlLmhlaWdodC5zaG91bGQuYmUuZXF1YWwoNDg1LCAndW5leHBlY3RlZCBoZWlnaHQnKTtcblxuICAgICAgLy8gdmVyaWZ5IHRoYXQgaW1hZ2UgY3JvcHBlZCwgY29tcGFyZSBiYXNlNjQgcmVwcmVzZW50YXRpb25cbiAgICAgIGNvbnN0IGNyb3BwZWRJbWFnZVNob3VsZEJlID0gYXdhaXQgZ2V0SW1hZ2UoJ2Nyb3BwZWQtaW1hZ2UuYjY0Jyk7XG4gICAgICBjb25zdCBjcm9wcGVkSW1hZ2U2NCA9IGF3YWl0IGltYWdlVG9CYXNlNjQoY3JvcHBlZEltYWdlKTtcbiAgICAgIGNyb3BwZWRJbWFnZTY0LnNob3VsZC5iZS5lcXVhbChjcm9wcGVkSW1hZ2VTaG91bGRCZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdPcGVuQ1YgaGVscGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPcGVuQ1YgbmVlZHMgc2V2ZXJhbCBzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMudGltZW91dCgxMjAwMDApO1xuXG4gICAgbGV0IGltZ0ZpeHR1cmUgPSBudWxsO1xuICAgIGxldCBmdWxsSW1hZ2UgPSBudWxsO1xuICAgIGxldCBwYXJ0aWFsSW1hZ2UgPSBudWxsO1xuICAgIGxldCBvcmlnaW5hbEltYWdlID0gbnVsbDtcbiAgICBsZXQgY2hhbmdlZEltYWdlID0gbnVsbDtcbiAgICBsZXQgcm90YXRlZEltYWdlID0gbnVsbDtcbiAgICBsZXQgbnVtYmVySW1hZ2UgPSBudWxsO1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IHBhdGgucmVzb2x2ZShGSVhUVVJFU19ST09ULCAnZnVsbC1pbWFnZS5iNjQnKTtcbiAgICAgIGltZ0ZpeHR1cmUgPSBCdWZmZXIuZnJvbShhd2FpdCBmcy5yZWFkRmlsZShpbWFnZVBhdGgsICdiaW5hcnknKSwgJ2Jhc2U2NCcpO1xuICAgICAgZnVsbEltYWdlID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKEZJWFRVUkVTX1JPT1QsICdmaW5kd2FsZG8uanBnJykpO1xuICAgICAgcGFydGlhbEltYWdlID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKEZJWFRVUkVTX1JPT1QsICd3YWxkby5qcGcnKSk7XG4gICAgICBvcmlnaW5hbEltYWdlID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKEZJWFRVUkVTX1JPT1QsICdjYzEucG5nJykpO1xuICAgICAgY2hhbmdlZEltYWdlID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKEZJWFRVUkVTX1JPT1QsICdjYzIucG5nJykpO1xuICAgICAgbnVtYmVySW1hZ2UgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLnJlc29sdmUoRklYVFVSRVNfUk9PVCwgJ251bWJlcjUucG5nJykpO1xuICAgICAgcm90YXRlZEltYWdlID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKEZJWFRVUkVTX1JPT1QsICdjY19yb3RhdGVkLnBuZycpKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRJbWFnZXNNYXRjaGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBtYXRjaGVzIGJldHdlZW4gdHdvIGltYWdlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXRlY3Rvck5hbWUgb2YgWydBS0FaRScsICdPUkInXSkge1xuICAgICAgICAgIGNvbnN0IHtjb3VudCwgdG90YWxDb3VudH0gPSBhd2FpdCBnZXRJbWFnZXNNYXRjaGVzKGZ1bGxJbWFnZSwgZnVsbEltYWdlLCB7ZGV0ZWN0b3JOYW1lfSk7XG4gICAgICAgICAgY291bnQuc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICAgIHRvdGFsQ291bnQuc2hvdWxkLmVxbChjb3VudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZpc3VhbGl6ZSBtYXRjaGVzIGJldHdlZW4gdHdvIGltYWdlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qge3Zpc3VhbGl6YXRpb259ID0gYXdhaXQgZ2V0SW1hZ2VzTWF0Y2hlcyhmdWxsSW1hZ2UsIGZ1bGxJbWFnZSwge3Zpc3VhbGl6ZTogdHJ1ZX0pO1xuICAgICAgICB2aXN1YWxpemF0aW9uLnNob3VsZC5ub3QuYmUuZW1wdHk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2aXN1YWxpemUgbWF0Y2hlcyBiZXR3ZWVuIHR3byBpbWFnZXMgYW5kIGFwcGx5IGdvb2RNYXRjaGVzRmFjdG9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB7dmlzdWFsaXphdGlvbiwgcG9pbnRzMSwgcmVjdDEsIHBvaW50czIsIHJlY3QyfSA9IGF3YWl0IGdldEltYWdlc01hdGNoZXMocm90YXRlZEltYWdlLCBvcmlnaW5hbEltYWdlLCB7XG4gICAgICAgICAgdmlzdWFsaXplOiB0cnVlLFxuICAgICAgICAgIG1hdGNoRnVuYzogJ0JydXRlRm9yY2VIYW1taW5nJyxcbiAgICAgICAgICBnb29kTWF0Y2hlc0ZhY3RvcjogNDBcbiAgICAgICAgfSk7XG4gICAgICAgIHZpc3VhbGl6YXRpb24uc2hvdWxkLm5vdC5iZS5lbXB0eTtcbiAgICAgICAgcG9pbnRzMS5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDQpO1xuICAgICAgICByZWN0MS54LnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgcmVjdDEueS5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgIHJlY3QxLndpZHRoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgcmVjdDEuaGVpZ2h0LnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgcG9pbnRzMi5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDQpO1xuICAgICAgICByZWN0Mi54LnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgcmVjdDIueS5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgIHJlY3QyLndpZHRoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgcmVjdDIuaGVpZ2h0LnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldEltYWdlc1NpbWlsYXJpdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0aGUgc2ltaWxhcml0eSBzY29yZSBiZXR3ZWVuIHR3byBpbWFnZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHtzY29yZX0gPSBhd2FpdCBnZXRJbWFnZXNTaW1pbGFyaXR5KGltZ0ZpeHR1cmUsIGltZ0ZpeHR1cmUpO1xuICAgICAgICBzY29yZS5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2aXN1YWxpemUgdGhlIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gaW1hZ2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB7dmlzdWFsaXphdGlvbn0gPSBhd2FpdCBnZXRJbWFnZXNTaW1pbGFyaXR5KG9yaWdpbmFsSW1hZ2UsIGNoYW5nZWRJbWFnZSwge3Zpc3VhbGl6ZTogdHJ1ZX0pO1xuICAgICAgICB2aXN1YWxpemF0aW9uLnNob3VsZC5ub3QuYmUuZW1wdHk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRJbWFnZU9jY3VycmVuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0aGUgcGFydGlhbCBpbWFnZSBwb3NpdGlvbiBpbiB0aGUgZnVsbCBpbWFnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qge3JlY3QsIHNjb3JlfSA9IGF3YWl0IGdldEltYWdlT2NjdXJyZW5jZShmdWxsSW1hZ2UsIHBhcnRpYWxJbWFnZSk7XG4gICAgICAgIHJlY3QueC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgIHJlY3QueS5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgIHJlY3Qud2lkdGguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICByZWN0LmhlaWdodC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgIHNjb3JlLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBtYXRjaGVzIHRoYXQgZmFsbCBiZWxvdyBhIHRocmVzaG9sZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZ2V0SW1hZ2VPY2N1cnJlbmNlKGZ1bGxJbWFnZSwgcGFydGlhbEltYWdlLCB7dGhyZXNob2xkOiAxLjB9KVxuICAgICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL3RocmVzaG9sZC8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmlzdWFsaXplIHRoZSBwYXJ0aWFsIGltYWdlIHBvc2l0aW9uIGluIHRoZSBmdWxsIGltYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB7dmlzdWFsaXphdGlvbn0gPSBhd2FpdCBnZXRJbWFnZU9jY3VycmVuY2UoZnVsbEltYWdlLCBwYXJ0aWFsSW1hZ2UsIHt2aXN1YWxpemU6IHRydWV9KTtcbiAgICAgICAgdmlzdWFsaXphdGlvbi5zaG91bGQubm90LmJlLmVtcHR5O1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdtdWx0aXBsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gbWF0Y2hlcyBpbiB0aGUgZnVsbCBpbWFnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB7IG11bHRpcGxlIH0gPSBhd2FpdCBnZXRJbWFnZU9jY3VycmVuY2Uob3JpZ2luYWxJbWFnZSwgbnVtYmVySW1hZ2UsIHt0aHJlc2hvbGQ6IDAuOCwgbXVsdGlwbGU6IHRydWV9KTtcbiAgICAgICAgICBtdWx0aXBsZS5sZW5ndGguc2hvdWxkLmJlLmVxKDMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWN0Lnguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICAgICAgcmVzdWx0LnJlY3QueS5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgICAgICByZXN1bHQucmVjdC53aWR0aC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICAgICAgICByZXN1bHQucmVjdC5oZWlnaHQuc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICAgICAgcmVzdWx0LnNjb3JlLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IG1hdGNoZXMgdGhhdCBmYWxsIGJlbG93IGEgdGhyZXNob2xkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGdldEltYWdlT2NjdXJyZW5jZShvcmlnaW5hbEltYWdlLCBudW1iZXJJbWFnZSwge3RocmVzaG9sZDogMS4wLCBtdWx0aXBsZTogdHJ1ZX0pXG4gICAgICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC90aHJlc2hvbGQvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB2aXN1YWxpemUgdGhlIHBhcnRpYWwgaW1hZ2UgcG9zaXRpb24gaW4gdGhlIGZ1bGwgaW1hZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBtdWx0aXBsZSB9ID0gYXdhaXQgZ2V0SW1hZ2VPY2N1cnJlbmNlKG9yaWdpbmFsSW1hZ2UsIG51bWJlckltYWdlLCB7dmlzdWFsaXplOiB0cnVlLCBtdWx0aXBsZTogdHJ1ZX0pO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC52aXN1YWxpemF0aW9uLnNob3VsZC5ub3QuYmUuZW1wdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSmltcCBoZWxwZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgamltcCBvYmplY3QgdXNpbmcgaW1hZ2UgYnVmZmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGltYWdlQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0SW1hZ2UsICdiYXNlNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoaW1hZ2VCdWZmZXIpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBqaW1wIG9iamVjdCB1c2luZyBiNjQgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoYmFzZTY0SW1hZ2UpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBkYXRhIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBnZXRKaW1wSW1hZ2UoMTIzNCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9zdHJpbmcgb3IgYnVmZmVyLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBpbWFnZSBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZ2V0SmltcEltYWdlKCdmb28nKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL0NvdWxkIG5vdCBmaW5kIE1JTUUgZm9yIEJ1ZmZlci8pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGltYWdlIGJ1ZmZlciB2aWEgdGhlIG92ZXJyaWRkZW4gZ2V0QnVmZmVyIG1ldGhvZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gYXdhaXQgZ2V0SW1hZ2UoJ2Nyb3BwZWQtaW1hZ2UuYjY0Jyk7XG4gICAgICBjb25zdCBqaW1wSW1nID0gYXdhaXQgZ2V0SmltcEltYWdlKGJhc2U2NEltYWdlKTtcbiAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IGppbXBJbWcuZ2V0QnVmZmVyKE1JTUVfUE5HKTtcbiAgICAgIF8uaXNCdWZmZXIoYnVmKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9pbWFnZS11dGlsLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
78
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW1hZ2UtdXRpbC1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiRklYVFVSRVNfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZ2V0SW1hZ2UiLCJuYW1lIiwiaW1hZ2VQYXRoIiwiZnMiLCJyZWFkRmlsZSIsImRlc2NyaWJlIiwib3JpZ2luYWxJbWFnZSIsImJlZm9yZSIsIm9yaWdpbmFsSW1hZ2U2NCIsIndpZHRoIiwic2hvdWxkIiwiYmUiLCJlcXVhbCIsImhlaWdodCIsIml0IiwiY3JvcHBlZEltYWdlIiwibGVmdCIsInRvcCIsImNyb3BwZWRJbWFnZVNob3VsZEJlIiwiY3JvcHBlZEltYWdlNjQiLCJiYXNlNjRJbWFnZSIsImltYWdlQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImppbXBJbWciLCJoYXNoIiwiZXFsIiwiYml0bWFwIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsImJ1ZiIsImdldEJ1ZmZlciIsIk1JTUVfUE5HIiwiXyIsImlzQnVmZmVyIiwidHJ1ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsYUFBYSxHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsTUFBcEMsRUFBNEMsUUFBNUMsQ0FBdEI7O0FBRUEsZUFBZUMsUUFBZixDQUF5QkMsSUFBekIsRUFBK0I7QUFDN0IsUUFBTUMsU0FBUyxHQUFHTCxjQUFLQyxPQUFMLENBQWFGLGFBQWIsRUFBNEJLLElBQTVCLENBQWxCOztBQUNBLFNBQU8sTUFBTUUsUUFBR0MsUUFBSCxDQUFZRixTQUFaLEVBQXVCLE1BQXZCLENBQWI7QUFDRDs7QUFFREcsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFZO0FBRWpDQSxFQUFBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsWUFBWTtBQUN0QyxRQUFJQyxhQUFhLEdBQUcsSUFBcEI7QUFFQUMsSUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QixZQUFNQyxlQUFlLEdBQUcsTUFBTVIsUUFBUSxDQUFDLGdCQUFELENBQXRDO0FBQ0FNLE1BQUFBLGFBQWEsR0FBRyxNQUFNLDhCQUFjRSxlQUFkLENBQXRCO0FBR0FGLE1BQUFBLGFBQWEsQ0FBQ0csS0FBZCxDQUFvQkMsTUFBcEIsQ0FBMkJDLEVBQTNCLENBQThCQyxLQUE5QixDQUFvQyxHQUFwQyxFQUF5QyxrQkFBekM7QUFDQU4sTUFBQUEsYUFBYSxDQUFDTyxNQUFkLENBQXFCSCxNQUFyQixDQUE0QkMsRUFBNUIsQ0FBK0JDLEtBQS9CLENBQXFDLElBQXJDLEVBQTJDLG1CQUEzQztBQUNELEtBUEssQ0FBTjtBQVNBRSxJQUFBQSxFQUFFLENBQUMsa0RBQUQsRUFBcUQsa0JBQWtCO0FBQ3ZFLFlBQU1DLFlBQVksR0FBRyxNQUFNLDBCQUFVVCxhQUFWLEVBQXlCO0FBQUNVLFFBQUFBLElBQUksRUFBRSxFQUFQO0FBQVdDLFFBQUFBLEdBQUcsRUFBRSxHQUFoQjtBQUFxQlIsUUFBQUEsS0FBSyxFQUFFLEdBQTVCO0FBQWlDSSxRQUFBQSxNQUFNLEVBQUU7QUFBekMsT0FBekIsQ0FBM0I7QUFHQUUsTUFBQUEsWUFBWSxDQUFDTixLQUFiLENBQW1CQyxNQUFuQixDQUEwQkMsRUFBMUIsQ0FBNkJDLEtBQTdCLENBQW1DLEdBQW5DLEVBQXdDLGtCQUF4QztBQUNBRyxNQUFBQSxZQUFZLENBQUNGLE1BQWIsQ0FBb0JILE1BQXBCLENBQTJCQyxFQUEzQixDQUE4QkMsS0FBOUIsQ0FBb0MsR0FBcEMsRUFBeUMsbUJBQXpDO0FBR0EsWUFBTU0sb0JBQW9CLEdBQUcsTUFBTWxCLFFBQVEsQ0FBQyxtQkFBRCxDQUEzQztBQUNBLFlBQU1tQixjQUFjLEdBQUcsTUFBTSw4QkFBY0osWUFBZCxDQUE3QjtBQUNBSSxNQUFBQSxjQUFjLENBQUNULE1BQWYsQ0FBc0JDLEVBQXRCLENBQXlCQyxLQUF6QixDQUErQk0sb0JBQS9CO0FBQ0QsS0FYQyxDQUFGO0FBWUQsR0F4Qk8sQ0FBUjtBQTBCQWIsRUFBQUEsUUFBUSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUNuQ1MsSUFBQUEsRUFBRSxDQUFDLDZDQUFELEVBQWdELGtCQUFrQjtBQUNsRSxZQUFNTSxXQUFXLEdBQUcsTUFBTXBCLFFBQVEsQ0FBQyxtQkFBRCxDQUFsQztBQUNBLFlBQU1xQixXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSCxXQUFaLEVBQXlCLFFBQXpCLENBQXBCO0FBQ0EsWUFBTUksT0FBTyxHQUFHLE1BQU0sNkJBQWFILFdBQWIsQ0FBdEI7QUFDQUcsTUFBQUEsT0FBTyxDQUFDQyxJQUFSLEdBQWVmLE1BQWYsQ0FBc0JnQixHQUF0QixDQUEwQixhQUExQjtBQUNBRixNQUFBQSxPQUFPLENBQUNHLE1BQVIsQ0FBZWQsTUFBZixDQUFzQkgsTUFBdEIsQ0FBNkJnQixHQUE3QixDQUFpQyxHQUFqQztBQUNBRixNQUFBQSxPQUFPLENBQUNHLE1BQVIsQ0FBZWxCLEtBQWYsQ0FBcUJDLE1BQXJCLENBQTRCZ0IsR0FBNUIsQ0FBZ0MsR0FBaEM7QUFDRCxLQVBDLENBQUY7QUFRQVosSUFBQUEsRUFBRSxDQUFDLDJDQUFELEVBQThDLGtCQUFrQjtBQUNoRSxZQUFNTSxXQUFXLEdBQUcsTUFBTXBCLFFBQVEsQ0FBQyxtQkFBRCxDQUFsQztBQUNBLFlBQU13QixPQUFPLEdBQUcsTUFBTSw2QkFBYUosV0FBYixDQUF0QjtBQUNBSSxNQUFBQSxPQUFPLENBQUNDLElBQVIsR0FBZWYsTUFBZixDQUFzQmdCLEdBQXRCLENBQTBCLGFBQTFCO0FBQ0FGLE1BQUFBLE9BQU8sQ0FBQ0csTUFBUixDQUFlZCxNQUFmLENBQXNCSCxNQUF0QixDQUE2QmdCLEdBQTdCLENBQWlDLEdBQWpDO0FBQ0FGLE1BQUFBLE9BQU8sQ0FBQ0csTUFBUixDQUFlbEIsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEJnQixHQUE1QixDQUFnQyxHQUFoQztBQUNELEtBTkMsQ0FBRjtBQU9BWixJQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsa0JBQWtCO0FBQzVELFlBQU0sNkJBQWEsSUFBYixFQUFtQkosTUFBbkIsQ0FBMEJrQixVQUExQixDQUFxQ2pCLEVBQXJDLENBQXdDa0IsWUFBeEMsQ0FBcUQsa0JBQXJELENBQU47QUFDRCxLQUZDLENBQUY7QUFHQWYsSUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTJDLGtCQUFrQjtBQUM3RCxZQUFNLDZCQUFhLEtBQWIsRUFBb0JKLE1BQXBCLENBQTJCa0IsVUFBM0IsQ0FBc0NqQixFQUF0QyxDQUF5Q2tCLFlBQXpDLENBQXNELGdDQUF0RCxDQUFOO0FBQ0QsS0FGQyxDQUFGO0FBR0FmLElBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxrQkFBa0I7QUFDckYsWUFBTU0sV0FBVyxHQUFHLE1BQU1wQixRQUFRLENBQUMsbUJBQUQsQ0FBbEM7QUFDQSxZQUFNd0IsT0FBTyxHQUFHLE1BQU0sNkJBQWFKLFdBQWIsQ0FBdEI7QUFDQSxZQUFNVSxHQUFHLEdBQUcsTUFBTU4sT0FBTyxDQUFDTyxTQUFSLENBQWtCQyxtQkFBbEIsQ0FBbEI7QUFDQUMsc0JBQUVDLFFBQUYsQ0FBV0osR0FBWCxFQUFnQnBCLE1BQWhCLENBQXVCQyxFQUF2QixDQUEwQndCLElBQTFCO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0E1Qk8sQ0FBUjtBQTZCRCxDQXpETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYmFzZTY0VG9JbWFnZSwgaW1hZ2VUb0Jhc2U2NCwgY3JvcEltYWdlLFxuICBnZXRKaW1wSW1hZ2UsIE1JTUVfUE5HLFxufSBmcm9tICcuLi9saWIvaW1hZ2UtdXRpbCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcyB9IGZyb20gJy4uL2xpYic7XG5cblxuY29uc3QgRklYVFVSRVNfUk9PVCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsICd0ZXN0JywgJ2ltYWdlcycpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZSAobmFtZSkge1xuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLnJlc29sdmUoRklYVFVSRVNfUk9PVCwgbmFtZSk7XG4gIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShpbWFnZVBhdGgsICd1dGY4Jyk7XG59XG5cbmRlc2NyaWJlKCdpbWFnZS11dGlsJywgZnVuY3Rpb24gKCkge1xuXG4gIGRlc2NyaWJlKCdjcm9wQmFzZTY0SW1hZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG9yaWdpbmFsSW1hZ2UgPSBudWxsO1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2U2NCA9IGF3YWl0IGdldEltYWdlKCdmdWxsLWltYWdlLmI2NCcpO1xuICAgICAgb3JpZ2luYWxJbWFnZSA9IGF3YWl0IGJhc2U2NFRvSW1hZ2Uob3JpZ2luYWxJbWFnZTY0KTtcblxuICAgICAgLy8gdmVyaWZ5IG9yaWdpbmFsIGltYWdlIHNpemUsIHRvIGJlIHN1cmUgdGhhdCBvcmlnaW5hbCBpbWFnZSBpcyBjb3JyZWN0XG4gICAgICBvcmlnaW5hbEltYWdlLndpZHRoLnNob3VsZC5iZS5lcXVhbCg2NDAsICd1bmV4cGVjdGVkIHdpZHRoJyk7XG4gICAgICBvcmlnaW5hbEltYWdlLmhlaWdodC5zaG91bGQuYmUuZXF1YWwoMTEzNiwgJ3VuZXhwZWN0ZWQgaGVpZ2h0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGltYWdlIGlzIGNyb3BwZWQgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3JvcHBlZEltYWdlID0gYXdhaXQgY3JvcEltYWdlKG9yaWdpbmFsSW1hZ2UsIHtsZWZ0OiAzNSwgdG9wOiAxMDcsIHdpZHRoOiAzMjMsIGhlaWdodDogNDg1fSk7XG5cbiAgICAgIC8vIHZlcmlmeSBjcm9wcGVkIGltYWdlIHNpemUsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gb3JpZ2luYWwgaW1hZ2UgYWNjb3JkaW5nIHRvIGNyb3AgcmVnaW9uXG4gICAgICBjcm9wcGVkSW1hZ2Uud2lkdGguc2hvdWxkLmJlLmVxdWFsKDMyMywgJ3VuZXhwZWN0ZWQgd2lkdGgnKTtcbiAgICAgIGNyb3BwZWRJbWFnZS5oZWlnaHQuc2hvdWxkLmJlLmVxdWFsKDQ4NSwgJ3VuZXhwZWN0ZWQgaGVpZ2h0Jyk7XG5cbiAgICAgIC8vIHZlcmlmeSB0aGF0IGltYWdlIGNyb3BwZWQsIGNvbXBhcmUgYmFzZTY0IHJlcHJlc2VudGF0aW9uXG4gICAgICBjb25zdCBjcm9wcGVkSW1hZ2VTaG91bGRCZSA9IGF3YWl0IGdldEltYWdlKCdjcm9wcGVkLWltYWdlLmI2NCcpO1xuICAgICAgY29uc3QgY3JvcHBlZEltYWdlNjQgPSBhd2FpdCBpbWFnZVRvQmFzZTY0KGNyb3BwZWRJbWFnZSk7XG4gICAgICBjcm9wcGVkSW1hZ2U2NC5zaG91bGQuYmUuZXF1YWwoY3JvcHBlZEltYWdlU2hvdWxkQmUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSmltcCBoZWxwZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgamltcCBvYmplY3QgdXNpbmcgaW1hZ2UgYnVmZmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGltYWdlQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0SW1hZ2UsICdiYXNlNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoaW1hZ2VCdWZmZXIpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBqaW1wIG9iamVjdCB1c2luZyBiNjQgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBhd2FpdCBnZXRJbWFnZSgnY3JvcHBlZC1pbWFnZS5iNjQnKTtcbiAgICAgIGNvbnN0IGppbXBJbWcgPSBhd2FpdCBnZXRKaW1wSW1hZ2UoYmFzZTY0SW1hZ2UpO1xuICAgICAgamltcEltZy5oYXNoKCkuc2hvdWxkLmVxbCgnODAwMDAwMDAwMDAnKTtcbiAgICAgIGppbXBJbWcuYml0bWFwLmhlaWdodC5zaG91bGQuZXFsKDQ4NSk7XG4gICAgICBqaW1wSW1nLmJpdG1hcC53aWR0aC5zaG91bGQuZXFsKDMyMyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBkYXRhIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBnZXRKaW1wSW1hZ2UoMTIzNCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9zdHJpbmcgb3IgYnVmZmVyLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aXRoIGluY29ycmVjdCBpbWFnZSBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZ2V0SmltcEltYWdlKCdmb28nKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL0NvdWxkIG5vdCBmaW5kIE1JTUUgZm9yIEJ1ZmZlci8pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGltYWdlIGJ1ZmZlciB2aWEgdGhlIG92ZXJyaWRkZW4gZ2V0QnVmZmVyIG1ldGhvZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gYXdhaXQgZ2V0SW1hZ2UoJ2Nyb3BwZWQtaW1hZ2UuYjY0Jyk7XG4gICAgICBjb25zdCBqaW1wSW1nID0gYXdhaXQgZ2V0SmltcEltYWdlKGJhc2U2NEltYWdlKTtcbiAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IGppbXBJbWcuZ2V0QnVmZmVyKE1JTUVfUE5HKTtcbiAgICAgIF8uaXNCdWZmZXIoYnVmKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9pbWFnZS11dGlsLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|