appium-safari-driver 3.2.2 → 3.2.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/.eslintignore +1 -1
- package/.eslintrc.json +10 -0
- package/.github/workflows/functional-test.yml +55 -0
- package/.github/workflows/pr-title.yml +15 -0
- package/.github/workflows/publish.js.yml +4 -6
- package/.github/workflows/unit-test.yml +43 -0
- package/.mocharc.js +4 -0
- package/.releaserc +6 -4
- package/CHANGELOG.md +1 -0
- package/README.md +8 -3
- package/babel.config.json +25 -0
- package/build/index.js +2 -8
- package/build/index.js.map +1 -0
- package/build/lib/commands/cookies.js +2 -8
- package/build/lib/commands/cookies.js.map +1 -0
- package/build/lib/commands/find.js +3 -9
- package/build/lib/commands/find.js.map +1 -0
- package/build/lib/commands/index.js +4 -11
- package/build/lib/commands/index.js.map +1 -0
- package/build/lib/commands/record-screen.js +2 -64
- package/build/lib/commands/record-screen.js.map +1 -0
- package/build/lib/desired-caps.js +2 -6
- package/build/lib/desired-caps.js.map +1 -0
- package/build/lib/driver.js +4 -27
- package/build/lib/driver.js.map +1 -0
- package/build/lib/logger.js +2 -8
- package/build/lib/logger.js.map +1 -0
- package/build/lib/safari.js +2 -43
- package/build/lib/safari.js.map +1 -0
- package/build/lib/utils.js +2 -11
- package/build/lib/utils.js.map +1 -0
- package/npm-shrinkwrap.json +2091 -1153
- package/package.json +40 -22
- package/test/unit/driver-specs.js +1 -1
- package/.azure-pipelines.yml +0 -53
- package/.eslintrc +0 -3
- package/azure-templates/node_setup_steps.yml +0 -6
- package/build/test/functional/desktop-driver-e2e-specs.js +0 -48
- package/build/test/functional/mobile-driver-e2e-specs.js +0 -76
- package/build/test/unit/driver-specs.js +0 -20
- package/build/test/unit/utils-specs.js +0 -51
- package/build/test/utils.js +0 -18
- package/gulpfile.js +0 -13
|
@@ -1,34 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _support = require("appium/support");
|
|
15
|
-
|
|
16
11
|
var _asyncbox = require("asyncbox");
|
|
17
|
-
|
|
18
12
|
var _nodeSimctl = _interopRequireDefault(require("node-simctl"));
|
|
19
|
-
|
|
20
13
|
const commands = {};
|
|
21
14
|
const STARTUP_INTERVAL_MS = 300;
|
|
22
15
|
const STARTUP_TIMEOUT_MS = 10 * 1000;
|
|
23
16
|
const DEFAULT_TIME_LIMIT_MS = 60 * 10 * 1000;
|
|
24
17
|
const PROCESS_SHUTDOWN_TIMEOUT_MS = 10 * 1000;
|
|
25
18
|
const DEFAULT_EXT = '.mp4';
|
|
26
|
-
|
|
27
19
|
async function uploadRecordedMedia(localFile, remotePath = null, uploadOptions = {}) {
|
|
28
20
|
if (_lodash.default.isEmpty(remotePath)) {
|
|
29
21
|
return (await _support.util.toInMemoryBase64(localFile)).toString();
|
|
30
22
|
}
|
|
31
|
-
|
|
32
23
|
const {
|
|
33
24
|
user,
|
|
34
25
|
pass,
|
|
@@ -43,18 +34,15 @@ async function uploadRecordedMedia(localFile, remotePath = null, uploadOptions =
|
|
|
43
34
|
fileFieldName,
|
|
44
35
|
formFields
|
|
45
36
|
};
|
|
46
|
-
|
|
47
37
|
if (user && pass) {
|
|
48
38
|
options.auth = {
|
|
49
39
|
user,
|
|
50
40
|
pass
|
|
51
41
|
};
|
|
52
42
|
}
|
|
53
|
-
|
|
54
43
|
await _support.net.uploadFile(localFile, remotePath, options);
|
|
55
44
|
return '';
|
|
56
45
|
}
|
|
57
|
-
|
|
58
46
|
const VIDEO_FILES = new Set();
|
|
59
47
|
process.on('exit', () => {
|
|
60
48
|
for (const videoFile of VIDEO_FILES) {
|
|
@@ -63,7 +51,6 @@ process.on('exit', () => {
|
|
|
63
51
|
} catch (ign) {}
|
|
64
52
|
}
|
|
65
53
|
});
|
|
66
|
-
|
|
67
54
|
class ScreenRecorder {
|
|
68
55
|
constructor(udid, videoPath, log, opts = {}) {
|
|
69
56
|
this.log = log;
|
|
@@ -76,75 +63,57 @@ class ScreenRecorder {
|
|
|
76
63
|
this._timeLimitMs = opts.timeLimit > 0 ? opts.timeLimit * 1000 : DEFAULT_TIME_LIMIT_MS;
|
|
77
64
|
this._timer = null;
|
|
78
65
|
}
|
|
79
|
-
|
|
80
66
|
async getVideoPath() {
|
|
81
67
|
if (await _support.fs.exists(this._videoPath)) {
|
|
82
68
|
VIDEO_FILES.add(this._videoPath);
|
|
83
69
|
return this._videoPath;
|
|
84
70
|
}
|
|
85
|
-
|
|
86
71
|
return '';
|
|
87
72
|
}
|
|
88
|
-
|
|
89
73
|
get isRunning() {
|
|
90
74
|
var _this$_process;
|
|
91
|
-
|
|
92
75
|
return !!((_this$_process = this._process) !== null && _this$_process !== void 0 && _this$_process.isRunning);
|
|
93
76
|
}
|
|
94
|
-
|
|
95
77
|
async _enforceTermination() {
|
|
96
78
|
if (this.isRunning) {
|
|
97
79
|
this.log.debug('Force-stopping the currently running video recording');
|
|
98
|
-
|
|
99
80
|
try {
|
|
100
81
|
await this._process.stop('SIGKILL');
|
|
101
82
|
} catch (ign) {}
|
|
102
83
|
}
|
|
103
|
-
|
|
104
84
|
this._process = null;
|
|
105
85
|
const videoPath = await this.getVideoPath();
|
|
106
|
-
|
|
107
86
|
if (videoPath) {
|
|
108
87
|
await _support.fs.rimraf(videoPath);
|
|
109
88
|
VIDEO_FILES.delete(videoPath);
|
|
110
89
|
}
|
|
111
|
-
|
|
112
90
|
return '';
|
|
113
91
|
}
|
|
114
|
-
|
|
115
92
|
async start() {
|
|
116
93
|
const args = [this._udid, 'recordVideo'];
|
|
117
|
-
|
|
118
94
|
if (this._display) {
|
|
119
95
|
args.push('--display', this._display);
|
|
120
96
|
}
|
|
121
|
-
|
|
122
97
|
if (this._codec) {
|
|
123
98
|
args.push('--codec', this._codec);
|
|
124
99
|
}
|
|
125
|
-
|
|
126
100
|
if (this._mask) {
|
|
127
101
|
args.push('--mask', this._mask);
|
|
128
102
|
}
|
|
129
|
-
|
|
130
103
|
args.push('--force', this._videoPath);
|
|
131
104
|
this._process = await new _nodeSimctl.default().exec('io', {
|
|
132
105
|
args,
|
|
133
106
|
asynchronous: true
|
|
134
107
|
});
|
|
135
108
|
this.log.debug(`Starting video recording with arguments: ${_support.util.quote(args)}`);
|
|
136
|
-
|
|
137
109
|
this._process.on('output', (stdout, stderr) => {
|
|
138
110
|
const line = _lodash.default.trim(stdout || stderr);
|
|
139
|
-
|
|
140
111
|
if (line) {
|
|
141
112
|
this.log.debug(`[recordVideo@${this._udid.substring(0, 8)}] ${line}`);
|
|
142
113
|
}
|
|
143
114
|
});
|
|
144
|
-
|
|
145
115
|
this._process.once('exit', async (code, signal) => {
|
|
146
116
|
this._process = null;
|
|
147
|
-
|
|
148
117
|
if (code === 0) {
|
|
149
118
|
this.log.debug('Screen recording exited without errors');
|
|
150
119
|
} else {
|
|
@@ -152,15 +121,12 @@ class ScreenRecorder {
|
|
|
152
121
|
this.log.warn(`Screen recording exited with error code ${code}, signal ${signal}`);
|
|
153
122
|
}
|
|
154
123
|
});
|
|
155
|
-
|
|
156
124
|
await this._process.start(0);
|
|
157
|
-
|
|
158
125
|
try {
|
|
159
126
|
await (0, _asyncbox.waitForCondition)(async () => {
|
|
160
127
|
if (!this.isRunning) {
|
|
161
128
|
throw new Error();
|
|
162
129
|
}
|
|
163
|
-
|
|
164
130
|
return !!(await this.getVideoPath());
|
|
165
131
|
}, {
|
|
166
132
|
waitMs: STARTUP_TIMEOUT_MS,
|
|
@@ -170,7 +136,6 @@ class ScreenRecorder {
|
|
|
170
136
|
await this._enforceTermination();
|
|
171
137
|
this.log.errorAndThrow(`The expected screen record file '${this._videoPath}' does not exist after ${STARTUP_TIMEOUT_MS}ms. ` + `Check the server log for more details`);
|
|
172
138
|
}
|
|
173
|
-
|
|
174
139
|
this._timer = setTimeout(async () => {
|
|
175
140
|
if (this.isRunning) {
|
|
176
141
|
try {
|
|
@@ -182,41 +147,32 @@ class ScreenRecorder {
|
|
|
182
147
|
}, this._timeLimitMs);
|
|
183
148
|
this.log.info(`The video recording has started. Will timeout in ${this._timeLimitMs}ms`);
|
|
184
149
|
}
|
|
185
|
-
|
|
186
150
|
async stop(force = false) {
|
|
187
151
|
if (this._timer) {
|
|
188
152
|
clearTimeout(this._timer);
|
|
189
153
|
this._timer = null;
|
|
190
154
|
}
|
|
191
|
-
|
|
192
155
|
if (force) {
|
|
193
156
|
return await this._enforceTermination();
|
|
194
157
|
}
|
|
195
|
-
|
|
196
158
|
if (!this.isRunning) {
|
|
197
159
|
this.log.debug('Screen recording is not running. Returning the recently recorded video');
|
|
198
160
|
return await this.getVideoPath();
|
|
199
161
|
}
|
|
200
|
-
|
|
201
162
|
try {
|
|
202
163
|
await this._process.stop('SIGINT', PROCESS_SHUTDOWN_TIMEOUT_MS);
|
|
203
164
|
} catch (e) {
|
|
204
165
|
await this._enforceTermination();
|
|
205
166
|
throw new Error(`Screen recording has failed to stop after ${PROCESS_SHUTDOWN_TIMEOUT_MS}ms`);
|
|
206
167
|
}
|
|
207
|
-
|
|
208
168
|
return await this.getVideoPath();
|
|
209
169
|
}
|
|
210
|
-
|
|
211
170
|
}
|
|
212
|
-
|
|
213
171
|
async function extractSimulatorUdid(caps) {
|
|
214
172
|
if (caps['safari:useSimulator'] === false) {
|
|
215
173
|
return null;
|
|
216
174
|
}
|
|
217
|
-
|
|
218
175
|
const allDevices = _lodash.default.flatMap(_lodash.default.values(await new _nodeSimctl.default().getDevices(null, 'iOS')));
|
|
219
|
-
|
|
220
176
|
for (const {
|
|
221
177
|
name,
|
|
222
178
|
udid,
|
|
@@ -226,22 +182,18 @@ async function extractSimulatorUdid(caps) {
|
|
|
226
182
|
if (state !== 'Booted') {
|
|
227
183
|
continue;
|
|
228
184
|
}
|
|
229
|
-
|
|
230
185
|
if (_lodash.default.toLower(caps['safari:deviceUDID']) === _lodash.default.toLower(udid)) {
|
|
231
186
|
return udid;
|
|
232
187
|
}
|
|
233
|
-
|
|
234
188
|
if (_lodash.default.toLower(caps['safari:deviceName']) === _lodash.default.toLower(name) && (caps['safari:platformVersion'] && caps['safari:platformVersion'] === sdk || !caps['safari:platformVersion'])) {
|
|
235
189
|
return udid;
|
|
236
190
|
}
|
|
237
191
|
}
|
|
238
|
-
|
|
239
192
|
return null;
|
|
240
193
|
}
|
|
241
194
|
|
|
242
195
|
commands.startRecordingScreen = async function startRecordingScreen(options = {}) {
|
|
243
196
|
var _this$_screenRecorder;
|
|
244
|
-
|
|
245
197
|
const {
|
|
246
198
|
timeLimit,
|
|
247
199
|
codec,
|
|
@@ -249,26 +201,20 @@ commands.startRecordingScreen = async function startRecordingScreen(options = {}
|
|
|
249
201
|
mask,
|
|
250
202
|
forceRestart = true
|
|
251
203
|
} = options;
|
|
252
|
-
|
|
253
204
|
if ((_this$_screenRecorder = this._screenRecorder) !== null && _this$_screenRecorder !== void 0 && _this$_screenRecorder.isRunning) {
|
|
254
205
|
this.log.info('The screen recording is already running');
|
|
255
|
-
|
|
256
206
|
if (!forceRestart) {
|
|
257
207
|
this.log.info('Doing nothing');
|
|
258
208
|
return;
|
|
259
209
|
}
|
|
260
|
-
|
|
261
210
|
this.log.info('Forcing the active screen recording to stop');
|
|
262
211
|
await this._screenRecorder.stop(true);
|
|
263
212
|
}
|
|
264
|
-
|
|
265
213
|
this._screenRecorder = null;
|
|
266
214
|
const udid = await extractSimulatorUdid(this.caps);
|
|
267
|
-
|
|
268
215
|
if (!udid) {
|
|
269
216
|
throw new Error('Cannot determine Simulator UDID to record the video from. ' + 'Double check your session capabilities');
|
|
270
217
|
}
|
|
271
|
-
|
|
272
218
|
const videoPath = await _support.tempDir.path({
|
|
273
219
|
prefix: _support.util.uuidV4().substring(0, 8),
|
|
274
220
|
suffix: DEFAULT_EXT
|
|
@@ -279,7 +225,6 @@ commands.startRecordingScreen = async function startRecordingScreen(options = {}
|
|
|
279
225
|
display,
|
|
280
226
|
mask
|
|
281
227
|
});
|
|
282
|
-
|
|
283
228
|
try {
|
|
284
229
|
await this._screenRecorder.start();
|
|
285
230
|
} catch (e) {
|
|
@@ -293,27 +238,20 @@ commands.stopRecordingScreen = async function stopRecordingScreen(options = {})
|
|
|
293
238
|
this.log.info('No screen recording has been started. Doing nothing');
|
|
294
239
|
return '';
|
|
295
240
|
}
|
|
296
|
-
|
|
297
241
|
this.log.debug('Retrieving the resulting video data');
|
|
298
242
|
const videoPath = await this._screenRecorder.stop();
|
|
299
|
-
|
|
300
243
|
if (!videoPath) {
|
|
301
244
|
this.log.info('No video data is found. Returning an empty string');
|
|
302
245
|
return '';
|
|
303
246
|
}
|
|
304
|
-
|
|
305
247
|
if (_lodash.default.isEmpty(options.remotePath)) {
|
|
306
248
|
const {
|
|
307
249
|
size
|
|
308
250
|
} = await _support.fs.stat(videoPath);
|
|
309
251
|
this.log.debug(`The size of the resulting screen recording is ${_support.util.toReadableSizeString(size)}`);
|
|
310
252
|
}
|
|
311
|
-
|
|
312
253
|
return await uploadRecordedMedia(videoPath, options.remotePath, options);
|
|
313
254
|
};
|
|
314
|
-
|
|
315
255
|
var _default = commands;
|
|
316
|
-
exports.default = _default;
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL3JlY29yZC1zY3JlZW4uanMiLCJuYW1lcyI6WyJjb21tYW5kcyIsIlNUQVJUVVBfSU5URVJWQUxfTVMiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJERUZBVUxUX1RJTUVfTElNSVRfTVMiLCJQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVRfTVMiLCJERUZBVUxUX0VYVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwib3B0aW9ucyIsImF1dGgiLCJuZXQiLCJ1cGxvYWRGaWxlIiwiVklERU9fRklMRVMiLCJTZXQiLCJwcm9jZXNzIiwib24iLCJ2aWRlb0ZpbGUiLCJmcyIsInJpbXJhZlN5bmMiLCJpZ24iLCJTY3JlZW5SZWNvcmRlciIsImNvbnN0cnVjdG9yIiwidWRpZCIsInZpZGVvUGF0aCIsImxvZyIsIm9wdHMiLCJfcHJvY2VzcyIsIl91ZGlkIiwiX3ZpZGVvUGF0aCIsIl9jb2RlYyIsImNvZGVjIiwiX2Rpc3BsYXkiLCJkaXNwbGF5IiwiX21hc2siLCJtYXNrIiwiX3RpbWVMaW1pdE1zIiwidGltZUxpbWl0IiwiX3RpbWVyIiwiZ2V0VmlkZW9QYXRoIiwiZXhpc3RzIiwiYWRkIiwiaXNSdW5uaW5nIiwiX2VuZm9yY2VUZXJtaW5hdGlvbiIsImRlYnVnIiwic3RvcCIsInJpbXJhZiIsImRlbGV0ZSIsInN0YXJ0IiwiYXJncyIsInB1c2giLCJTaW1jdGwiLCJleGVjIiwiYXN5bmNocm9ub3VzIiwicXVvdGUiLCJzdGRvdXQiLCJzdGRlcnIiLCJsaW5lIiwidHJpbSIsInN1YnN0cmluZyIsIm9uY2UiLCJjb2RlIiwic2lnbmFsIiwid2FybiIsIndhaXRGb3JDb25kaXRpb24iLCJFcnJvciIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwiZXJyb3JBbmRUaHJvdyIsInNldFRpbWVvdXQiLCJlcnJvciIsImluZm8iLCJmb3JjZSIsImNsZWFyVGltZW91dCIsImV4dHJhY3RTaW11bGF0b3JVZGlkIiwiY2FwcyIsImFsbERldmljZXMiLCJmbGF0TWFwIiwidmFsdWVzIiwiZ2V0RGV2aWNlcyIsIm5hbWUiLCJzdGF0ZSIsInNkayIsInRvTG93ZXIiLCJzdGFydFJlY29yZGluZ1NjcmVlbiIsImZvcmNlUmVzdGFydCIsIl9zY3JlZW5SZWNvcmRlciIsInRlbXBEaXIiLCJwYXRoIiwicHJlZml4IiwidXVpZFY0Iiwic3VmZml4IiwicGFyc2VJbnQiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwic2l6ZSIsInN0YXQiLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9yZWNvcmQtc2NyZWVuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB1dGlsLCBmcywgbmV0LCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBTaW1jdGwgZnJvbSAnbm9kZS1zaW1jdGwnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IFNUQVJUVVBfSU5URVJWQUxfTVMgPSAzMDA7XG5jb25zdCBTVEFSVFVQX1RJTUVPVVRfTVMgPSAxMCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX1RJTUVfTElNSVRfTVMgPSA2MCAqIDEwICogMTAwMDsgLy8gMTAgbWludXRlc1xuY29uc3QgUFJPQ0VTU19TSFVURE9XTl9USU1FT1VUX01TID0gMTAgKiAxMDAwO1xuY29uc3QgREVGQVVMVF9FWFQgPSAnLm1wNCc7XG5cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkUmVjb3JkZWRNZWRpYSAobG9jYWxGaWxlLCByZW1vdGVQYXRoID0gbnVsbCwgdXBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgY29uc3Qge3VzZXIsIHBhc3MsIG1ldGhvZCwgaGVhZGVycywgZmlsZUZpZWxkTmFtZSwgZm9ybUZpZWxkc30gPSB1cGxvYWRPcHRpb25zO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQVVQnLFxuICAgIGhlYWRlcnMsXG4gICAgZmlsZUZpZWxkTmFtZSxcbiAgICBmb3JtRmllbGRzLFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuY29uc3QgVklERU9fRklMRVMgPSBuZXcgU2V0KCk7XG5wcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHZpZGVvRmlsZSBvZiBWSURFT19GSUxFUykge1xuICAgIHRyeSB7XG4gICAgICBmcy5yaW1yYWZTeW5jKHZpZGVvRmlsZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG59KTtcblxuY2xhc3MgU2NyZWVuUmVjb3JkZXIge1xuICBjb25zdHJ1Y3RvciAodWRpZCwgdmlkZW9QYXRoLCBsb2csIG9wdHMgPSB7fSkge1xuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuX3Byb2Nlc3MgPSBudWxsO1xuICAgIHRoaXMuX3VkaWQgPSB1ZGlkO1xuICAgIHRoaXMuX3ZpZGVvUGF0aCA9IHZpZGVvUGF0aDtcbiAgICB0aGlzLl9jb2RlYyA9IG9wdHMuY29kZWM7XG4gICAgdGhpcy5fZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcbiAgICB0aGlzLl9tYXNrID0gb3B0cy5tYXNrO1xuICAgIHRoaXMuX3RpbWVMaW1pdE1zID0gb3B0cy50aW1lTGltaXQgPiAwID8gb3B0cy50aW1lTGltaXQgKiAxMDAwIDogREVGQVVMVF9USU1FX0xJTUlUX01TO1xuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdldFZpZGVvUGF0aCAoKSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLl92aWRlb1BhdGgpKSB7XG4gICAgICBWSURFT19GSUxFUy5hZGQodGhpcy5fdmlkZW9QYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLl92aWRlb1BhdGg7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLl9wcm9jZXNzPy5pc1J1bm5pbmcpO1xuICB9XG5cbiAgYXN5bmMgX2VuZm9yY2VUZXJtaW5hdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnRm9yY2Utc3RvcHBpbmcgdGhlIGN1cnJlbnRseSBydW5uaW5nIHZpZGVvIHJlY29yZGluZycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcHJvY2Vzcy5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIHRoaXMuX3Byb2Nlc3MgPSBudWxsO1xuICAgIGNvbnN0IHZpZGVvUGF0aCA9IGF3YWl0IHRoaXMuZ2V0VmlkZW9QYXRoKCk7XG4gICAgaWYgKHZpZGVvUGF0aCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHZpZGVvUGF0aCk7XG4gICAgICBWSURFT19GSUxFUy5kZWxldGUodmlkZW9QYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICB0aGlzLl91ZGlkLCAncmVjb3JkVmlkZW8nXG4gICAgXTtcbiAgICBpZiAodGhpcy5fZGlzcGxheSkge1xuICAgICAgYXJncy5wdXNoKCctLWRpc3BsYXknLCB0aGlzLl9kaXNwbGF5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvZGVjKSB7XG4gICAgICBhcmdzLnB1c2goJy0tY29kZWMnLCB0aGlzLl9jb2RlYyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXNrKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbWFzaycsIHRoaXMuX21hc2spO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tZm9yY2UnLCB0aGlzLl92aWRlb1BhdGgpO1xuICAgIHRoaXMuX3Byb2Nlc3MgPSBhd2FpdCBuZXcgU2ltY3RsKCkuZXhlYygnaW8nLCB7XG4gICAgICBhcmdzLFxuICAgICAgYXN5bmNocm9ub3VzOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyB2aWRlbyByZWNvcmRpbmcgd2l0aCBhcmd1bWVudHM6ICR7dXRpbC5xdW90ZShhcmdzKX1gKTtcbiAgICB0aGlzLl9wcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgW3JlY29yZFZpZGVvQCR7dGhpcy5fdWRpZC5zdWJzdHJpbmcoMCwgOCl9XSAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fcHJvY2Vzcy5vbmNlKCdleGl0JywgYXN5bmMgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgdGhpcy5fcHJvY2VzcyA9IG51bGw7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnU2NyZWVuIHJlY29yZGluZyBleGl0ZWQgd2l0aG91dCBlcnJvcnMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBTY3JlZW4gcmVjb3JkaW5nIGV4aXRlZCB3aXRoIGVycm9yIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuX3Byb2Nlc3Muc3RhcnQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhKGF3YWl0IHRoaXMuZ2V0VmlkZW9QYXRoKCkpO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogU1RBUlRVUF9JTlRFUlZBTF9NUyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGV4cGVjdGVkIHNjcmVlbiByZWNvcmQgZmlsZSAnJHt0aGlzLl92aWRlb1BhdGh9JyBkb2VzIG5vdCBleGlzdCBhZnRlciAke1NUQVJUVVBfVElNRU9VVF9NU31tcy4gYCArXG4gICAgICAgIGBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcy5fdGltZUxpbWl0TXMpO1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSB2aWRlbyByZWNvcmRpbmcgaGFzIHN0YXJ0ZWQuIFdpbGwgdGltZW91dCBpbiAke3RoaXMuX3RpbWVMaW1pdE1zfW1zYCk7XG4gIH1cblxuICBhc3luYyBzdG9wIChmb3JjZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChmb3JjZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdTY3JlZW4gcmVjb3JkaW5nIGlzIG5vdCBydW5uaW5nLiBSZXR1cm5pbmcgdGhlIHJlY2VudGx5IHJlY29yZGVkIHZpZGVvJyk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWRlb1BhdGgoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fcHJvY2Vzcy5zdG9wKCdTSUdJTlQnLCBQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVRfTVMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW4gcmVjb3JkaW5nIGhhcyBmYWlsZWQgdG8gc3RvcCBhZnRlciAke1BST0NFU1NfU0hVVERPV05fVElNRU9VVF9NU31tc2ApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZGVvUGF0aCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTaW11bGF0b3JVZGlkIChjYXBzKSB7XG4gIGlmIChjYXBzWydzYWZhcmk6dXNlU2ltdWxhdG9yJ10gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhbGxEZXZpY2VzID0gXy5mbGF0TWFwKF8udmFsdWVzKGF3YWl0IG5ldyBTaW1jdGwoKS5nZXREZXZpY2VzKG51bGwsICdpT1MnKSkpO1xuICBmb3IgKGNvbnN0IHtuYW1lLCB1ZGlkLCBzdGF0ZSwgc2RrfSBvZiBhbGxEZXZpY2VzKSB7XG4gICAgaWYgKHN0YXRlICE9PSAnQm9vdGVkJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKF8udG9Mb3dlcihjYXBzWydzYWZhcmk6ZGV2aWNlVURJRCddKSA9PT0gXy50b0xvd2VyKHVkaWQpKSB7XG4gICAgICByZXR1cm4gdWRpZDtcbiAgICB9XG4gICAgaWYgKF8udG9Mb3dlcihjYXBzWydzYWZhcmk6ZGV2aWNlTmFtZSddKSA9PT0gXy50b0xvd2VyKG5hbWUpICYmXG4gICAgICAoY2Fwc1snc2FmYXJpOnBsYXRmb3JtVmVyc2lvbiddICYmIGNhcHNbJ3NhZmFyaTpwbGF0Zm9ybVZlcnNpb24nXSA9PT0gc2RrXG4gICAgICAgIHx8ICFjYXBzWydzYWZhcmk6cGxhdGZvcm1WZXJzaW9uJ10pKSB7XG4gICAgICByZXR1cm4gdWRpZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0UmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29kZWMgW2hldmNdIC0gU3BlY2lmaWVzIHRoZSBjb2RlYyB0eXBlOiBcImgyNjRcIiBvciBcImhldmNcIlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBkaXNwbGF5IFtpbnRlcm5hbF0gLSBTdXBwb3J0cyBcImludGVybmFsXCIgb3IgXCJleHRlcm5hbFwiLiBEZWZhdWx0IGlzIFwiaW50ZXJuYWxcIlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtYXNrIC0gRm9yIG5vbi1yZWN0YW5ndWxhciBkaXNwbGF5cywgaGFuZGxlIHRoZSBtYXNrIGJ5IHBvbGljeTpcbiAqIC0gaWdub3JlZDogVGhlIG1hc2sgaXMgaWdub3JlZCBhbmQgdGhlIHVubWFza2VkIGZyYW1lYnVmZmVyIGlzIHNhdmVkLlxuICogLSBhbHBoYTogTm90IHN1cHBvcnRlZCwgYnV0IHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5OyB0aGUgbWFzayBpcyByZW5kZXJlZCBibGFjay5cbiAqIC0gYmxhY2s6IFRoZSBtYXNrIGlzIHJlbmRlcmVkIGJsYWNrLlxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgWzYwMF0gLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy4gVGhlIGRlZmF1bHRcbiAqIHZhbHVlIGlzIDYwMCBzZWNvbmRzICgxMCBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZm9yY2VSZXN0YXJ0IFt0cnVlXSAtIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBjYWxsIGlmIGEgc2NyZWVuIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZ1xuICogKGBmYWxzZWApIG9yIHRvIHN0YXJ0IGEgbmV3IHJlY29yZGluZyBpbW1lZGlhdGVseSBhbmQgdGVybWluYXRlIHRoZSBleGlzdGluZyBvbmUgaWYgcnVubmluZyAoYHRydWVgKS5cbiAqL1xuXG4vKipcbiAqIFJlY29yZCB0aGUgU2ltdWxhdG9yJ3MgZGlzcGxheSBpbiBiYWNrZ3JvdW5kIHdoaWxlIHRoZSBhdXRvbWF0ZWQgdGVzdCBpcyBydW5uaW5nLlxuICogVGhpcyBtZXRob2QgdXNlcyBgeGNydW4gc2ltY3RsIGlvIHJlY29yZFZpZGVvYCBoZWxwZXIgdW5kZXIgdGhlIGhvb2QuXG4gKiBDaGVjayB0aGUgb3V0cHV0IG9mIGB4Y3J1biBzaW1jdGwgaW9gIGNvbW1hbmQgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnN0YXJ0UmVjb3JkaW5nU2NyZWVuID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRSZWNvcmRpbmdTY3JlZW4gKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGltZUxpbWl0LFxuICAgIGNvZGVjLFxuICAgIGRpc3BsYXksXG4gICAgbWFzayxcbiAgICBmb3JjZVJlc3RhcnQgPSB0cnVlLFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHRoaXMuX3NjcmVlblJlY29yZGVyPy5pc1J1bm5pbmcpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdUaGUgc2NyZWVuIHJlY29yZGluZyBpcyBhbHJlYWR5IHJ1bm5pbmcnKTtcbiAgICBpZiAoIWZvcmNlUmVzdGFydCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnRG9pbmcgbm90aGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKCdGb3JjaW5nIHRoZSBhY3RpdmUgc2NyZWVuIHJlY29yZGluZyB0byBzdG9wJyk7XG4gICAgYXdhaXQgdGhpcy5fc2NyZWVuUmVjb3JkZXIuc3RvcCh0cnVlKTtcbiAgfVxuICB0aGlzLl9zY3JlZW5SZWNvcmRlciA9IG51bGw7XG5cbiAgY29uc3QgdWRpZCA9IGF3YWl0IGV4dHJhY3RTaW11bGF0b3JVZGlkKHRoaXMuY2Fwcyk7XG4gIGlmICghdWRpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRldGVybWluZSBTaW11bGF0b3IgVURJRCB0byByZWNvcmQgdGhlIHZpZGVvIGZyb20uICcgK1xuICAgICAgJ0RvdWJsZSBjaGVjayB5b3VyIHNlc3Npb24gY2FwYWJpbGl0aWVzJyk7XG4gIH1cblxuICBjb25zdCB2aWRlb1BhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe1xuICAgIHByZWZpeDogdXRpbC51dWlkVjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgc3VmZml4OiBERUZBVUxUX0VYVCxcbiAgfSk7XG4gIHRoaXMuX3NjcmVlblJlY29yZGVyID0gbmV3IFNjcmVlblJlY29yZGVyKHVkaWQsIHZpZGVvUGF0aCwgdGhpcy5sb2csIHtcbiAgICB0aW1lTGltaXQ6IHBhcnNlSW50KHRpbWVMaW1pdCwgMTApLFxuICAgIGNvZGVjLFxuICAgIGRpc3BsYXksXG4gICAgbWFzayxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5fc2NyZWVuUmVjb3JkZXIuc3RhcnQoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMuX3NjcmVlblJlY29yZGVyID0gbnVsbDtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHJlbW90ZSBsb2NhdGlvbiwgd2hlcmUgdGhlIHJlc3VsdGluZyB2aWRlbyBzaG91bGQgYmUgdXBsb2FkZWQuXG4gKiBUaGUgZm9sbG93aW5nIHByb3RvY29scyBhcmUgc3VwcG9ydGVkOiBodHRwL2h0dHBzLCBmdHAuXG4gKiBOdWxsIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSAodGhlIGRlZmF1bHQgc2V0dGluZykgbWVhbnMgdGhlIGNvbnRlbnQgb2YgcmVzdWx0aW5nXG4gKiBmaWxlIHNob3VsZCBiZSBlbmNvZGVkIGFzIEJhc2U2NCBhbmQgcGFzc2VkIGFzIHRoZSBlbmRwb2ludCByZXNwb25zZSB2YWx1ZS5cbiAqIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZ2VuZXJhdGVkIG1lZGlhIGZpbGUgaXMgdG9vIGJpZyB0b1xuICogZml0IGludG8gdGhlIGF2YWlsYWJsZSBwcm9jZXNzIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXNlciAtIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXNzIC0gVGhlIHBhc3N3b3JkIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtZXRob2QgLSBUaGUgaHR0cCBtdWx0aXBhcnQgdXBsb2FkIG1ldGhvZCBuYW1lLiBUaGUgJ1BVVCcgb25lIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaGVhZGVycyAtIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0gZmllbGQsIHdoZXJlIHRoZSBmaWxlIGNvbnRlbnQgQkxPQiBzaG91bGQgYmUgc3RvcmVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fEFycmF5PFBhaXI+fSBmb3JtRmllbGRzIC0gQWRkaXRpb25hbCBmb3JtIGZpZWxkcyBmb3IgbXVsdGlwYXJ0IGh0dHAocykgdXBsb2Fkc1xuICovXG5cbi8qKlxuICogU3RvcCByZWNvcmRpbmcgdGhlIHNjcmVlbi5cbiAqIElmIG5vIHNjcmVlbiByZWNvcmRpbmcgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUgdGhlbiB0aGUgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7P1N0b3BSZWNvcmRpbmdPcHRpb25zfSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcmVjb3JkZWQgbWVkaWEgZmlsZSBpZiAncmVtb3RlUGF0aCdcbiAqIHBhcmFtZXRlciBpcyBmYWxzeSBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIG5hbWUgb2YgYSBtZWRpYSBmaWxlXG4gKiBvciB0aGUgZmlsZSBjb250ZW50IGNhbm5vdCBiZSB1cGxvYWRlZCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uXG4gKiBvciBzY3JlZW4gcmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5zdG9wUmVjb3JkaW5nU2NyZWVuID0gYXN5bmMgZnVuY3Rpb24gc3RvcFJlY29yZGluZ1NjcmVlbiAob3B0aW9ucyA9IHt9KSB7XG4gIGlmICghdGhpcy5fc2NyZWVuUmVjb3JkZXIpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdObyBzY3JlZW4gcmVjb3JkaW5nIGhhcyBiZWVuIHN0YXJ0ZWQuIERvaW5nIG5vdGhpbmcnKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZygnUmV0cmlldmluZyB0aGUgcmVzdWx0aW5nIHZpZGVvIGRhdGEnKTtcbiAgY29uc3QgdmlkZW9QYXRoID0gYXdhaXQgdGhpcy5fc2NyZWVuUmVjb3JkZXIuc3RvcCgpO1xuICBpZiAoIXZpZGVvUGF0aCkge1xuICAgIHRoaXMubG9nLmluZm8oJ05vIHZpZGVvIGRhdGEgaXMgZm91bmQuIFJldHVybmluZyBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShvcHRpb25zLnJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdCh2aWRlb1BhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHNjcmVlbiByZWNvcmRpbmcgaXMgJHt1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKHNpemUpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB1cGxvYWRSZWNvcmRlZE1lZGlhKHZpZGVvUGF0aCwgb3B0aW9ucy5yZW1vdGVQYXRoLCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFFBQVEsR0FBRyxFQUFqQjtBQUVBLE1BQU1DLG1CQUFtQixHQUFHLEdBQTVCO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsS0FBSyxJQUFoQztBQUNBLE1BQU1DLHFCQUFxQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXhDO0FBQ0EsTUFBTUMsMkJBQTJCLEdBQUcsS0FBSyxJQUF6QztBQUNBLE1BQU1DLFdBQVcsR0FBRyxNQUFwQjs7QUFHQSxlQUFlQyxtQkFBZixDQUFvQ0MsU0FBcEMsRUFBK0NDLFVBQVUsR0FBRyxJQUE1RCxFQUFrRUMsYUFBYSxHQUFHLEVBQWxGLEVBQXNGO0VBQ3BGLElBQUlDLGVBQUEsQ0FBRUMsT0FBRixDQUFVSCxVQUFWLENBQUosRUFBMkI7SUFDekIsT0FBTyxDQUFDLE1BQU1JLGFBQUEsQ0FBS0MsZ0JBQUwsQ0FBc0JOLFNBQXRCLENBQVAsRUFBeUNPLFFBQXpDLEVBQVA7RUFDRDs7RUFFRCxNQUFNO0lBQUNDLElBQUQ7SUFBT0MsSUFBUDtJQUFhQyxNQUFiO0lBQXFCQyxPQUFyQjtJQUE4QkMsYUFBOUI7SUFBNkNDO0VBQTdDLElBQTJEWCxhQUFqRTtFQUNBLE1BQU1ZLE9BQU8sR0FBRztJQUNkSixNQUFNLEVBQUVBLE1BQU0sSUFBSSxLQURKO0lBRWRDLE9BRmM7SUFHZEMsYUFIYztJQUlkQztFQUpjLENBQWhCOztFQU1BLElBQUlMLElBQUksSUFBSUMsSUFBWixFQUFrQjtJQUNoQkssT0FBTyxDQUFDQyxJQUFSLEdBQWU7TUFBQ1AsSUFBRDtNQUFPQztJQUFQLENBQWY7RUFDRDs7RUFDRCxNQUFNTyxZQUFBLENBQUlDLFVBQUosQ0FBZWpCLFNBQWYsRUFBMEJDLFVBQTFCLEVBQXNDYSxPQUF0QyxDQUFOO0VBQ0EsT0FBTyxFQUFQO0FBQ0Q7O0FBRUQsTUFBTUksV0FBVyxHQUFHLElBQUlDLEdBQUosRUFBcEI7QUFDQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0VBQ3ZCLEtBQUssTUFBTUMsU0FBWCxJQUF3QkosV0FBeEIsRUFBcUM7SUFDbkMsSUFBSTtNQUNGSyxXQUFBLENBQUdDLFVBQUgsQ0FBY0YsU0FBZDtJQUNELENBRkQsQ0FFRSxPQUFPRyxHQUFQLEVBQVksQ0FBRTtFQUNqQjtBQUNGLENBTkQ7O0FBUUEsTUFBTUMsY0FBTixDQUFxQjtFQUNuQkMsV0FBVyxDQUFFQyxJQUFGLEVBQVFDLFNBQVIsRUFBbUJDLEdBQW5CLEVBQXdCQyxJQUFJLEdBQUcsRUFBL0IsRUFBbUM7SUFDNUMsS0FBS0QsR0FBTCxHQUFXQSxHQUFYO0lBQ0EsS0FBS0UsUUFBTCxHQUFnQixJQUFoQjtJQUNBLEtBQUtDLEtBQUwsR0FBYUwsSUFBYjtJQUNBLEtBQUtNLFVBQUwsR0FBa0JMLFNBQWxCO0lBQ0EsS0FBS00sTUFBTCxHQUFjSixJQUFJLENBQUNLLEtBQW5CO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQk4sSUFBSSxDQUFDTyxPQUFyQjtJQUNBLEtBQUtDLEtBQUwsR0FBYVIsSUFBSSxDQUFDUyxJQUFsQjtJQUNBLEtBQUtDLFlBQUwsR0FBb0JWLElBQUksQ0FBQ1csU0FBTCxHQUFpQixDQUFqQixHQUFxQlgsSUFBSSxDQUFDVyxTQUFMLEdBQWlCLElBQXRDLEdBQTZDOUMscUJBQWpFO0lBQ0EsS0FBSytDLE1BQUwsR0FBYyxJQUFkO0VBQ0Q7O0VBRWlCLE1BQVpDLFlBQVksR0FBSTtJQUNwQixJQUFJLE1BQU1yQixXQUFBLENBQUdzQixNQUFILENBQVUsS0FBS1gsVUFBZixDQUFWLEVBQXNDO01BQ3BDaEIsV0FBVyxDQUFDNEIsR0FBWixDQUFnQixLQUFLWixVQUFyQjtNQUNBLE9BQU8sS0FBS0EsVUFBWjtJQUNEOztJQUNELE9BQU8sRUFBUDtFQUNEOztFQUVZLElBQVRhLFNBQVMsR0FBSTtJQUFBOztJQUNmLE9BQU8sQ0FBQyxvQkFBRSxLQUFLZixRQUFQLDJDQUFFLGVBQWVlLFNBQWpCLENBQVI7RUFDRDs7RUFFd0IsTUFBbkJDLG1CQUFtQixHQUFJO0lBQzNCLElBQUksS0FBS0QsU0FBVCxFQUFvQjtNQUNsQixLQUFLakIsR0FBTCxDQUFTbUIsS0FBVCxDQUFlLHNEQUFmOztNQUNBLElBQUk7UUFDRixNQUFNLEtBQUtqQixRQUFMLENBQWNrQixJQUFkLENBQW1CLFNBQW5CLENBQU47TUFDRCxDQUZELENBRUUsT0FBT3pCLEdBQVAsRUFBWSxDQUFFO0lBQ2pCOztJQUNELEtBQUtPLFFBQUwsR0FBZ0IsSUFBaEI7SUFDQSxNQUFNSCxTQUFTLEdBQUcsTUFBTSxLQUFLZSxZQUFMLEVBQXhCOztJQUNBLElBQUlmLFNBQUosRUFBZTtNQUNiLE1BQU1OLFdBQUEsQ0FBRzRCLE1BQUgsQ0FBVXRCLFNBQVYsQ0FBTjtNQUNBWCxXQUFXLENBQUNrQyxNQUFaLENBQW1CdkIsU0FBbkI7SUFDRDs7SUFDRCxPQUFPLEVBQVA7RUFDRDs7RUFFVSxNQUFMd0IsS0FBSyxHQUFJO0lBQ2IsTUFBTUMsSUFBSSxHQUFHLENBQ1gsS0FBS3JCLEtBRE0sRUFDQyxhQURELENBQWI7O0lBR0EsSUFBSSxLQUFLSSxRQUFULEVBQW1CO01BQ2pCaUIsSUFBSSxDQUFDQyxJQUFMLENBQVUsV0FBVixFQUF1QixLQUFLbEIsUUFBNUI7SUFDRDs7SUFDRCxJQUFJLEtBQUtGLE1BQVQsRUFBaUI7TUFDZm1CLElBQUksQ0FBQ0MsSUFBTCxDQUFVLFNBQVYsRUFBcUIsS0FBS3BCLE1BQTFCO0lBQ0Q7O0lBQ0QsSUFBSSxLQUFLSSxLQUFULEVBQWdCO01BQ2RlLElBQUksQ0FBQ0MsSUFBTCxDQUFVLFFBQVYsRUFBb0IsS0FBS2hCLEtBQXpCO0lBQ0Q7O0lBQ0RlLElBQUksQ0FBQ0MsSUFBTCxDQUFVLFNBQVYsRUFBcUIsS0FBS3JCLFVBQTFCO0lBQ0EsS0FBS0YsUUFBTCxHQUFnQixNQUFNLElBQUl3QixtQkFBSixHQUFhQyxJQUFiLENBQWtCLElBQWxCLEVBQXdCO01BQzVDSCxJQUQ0QztNQUU1Q0ksWUFBWSxFQUFFO0lBRjhCLENBQXhCLENBQXRCO0lBSUEsS0FBSzVCLEdBQUwsQ0FBU21CLEtBQVQsQ0FBZ0IsNENBQTJDNUMsYUFBQSxDQUFLc0QsS0FBTCxDQUFXTCxJQUFYLENBQWlCLEVBQTVFOztJQUNBLEtBQUt0QixRQUFMLENBQWNYLEVBQWQsQ0FBaUIsUUFBakIsRUFBMkIsQ0FBQ3VDLE1BQUQsRUFBU0MsTUFBVCxLQUFvQjtNQUM3QyxNQUFNQyxJQUFJLEdBQUczRCxlQUFBLENBQUU0RCxJQUFGLENBQU9ILE1BQU0sSUFBSUMsTUFBakIsQ0FBYjs7TUFDQSxJQUFJQyxJQUFKLEVBQVU7UUFDUixLQUFLaEMsR0FBTCxDQUFTbUIsS0FBVCxDQUFnQixnQkFBZSxLQUFLaEIsS0FBTCxDQUFXK0IsU0FBWCxDQUFxQixDQUFyQixFQUF3QixDQUF4QixDQUEyQixLQUFJRixJQUFLLEVBQW5FO01BQ0Q7SUFDRixDQUxEOztJQU1BLEtBQUs5QixRQUFMLENBQWNpQyxJQUFkLENBQW1CLE1BQW5CLEVBQTJCLE9BQU9DLElBQVAsRUFBYUMsTUFBYixLQUF3QjtNQUNqRCxLQUFLbkMsUUFBTCxHQUFnQixJQUFoQjs7TUFDQSxJQUFJa0MsSUFBSSxLQUFLLENBQWIsRUFBZ0I7UUFDZCxLQUFLcEMsR0FBTCxDQUFTbUIsS0FBVCxDQUFlLHdDQUFmO01BQ0QsQ0FGRCxNQUVPO1FBQ0wsTUFBTSxLQUFLRCxtQkFBTCxFQUFOO1FBQ0EsS0FBS2xCLEdBQUwsQ0FBU3NDLElBQVQsQ0FBZSwyQ0FBMENGLElBQUssWUFBV0MsTUFBTyxFQUFoRjtNQUNEO0lBQ0YsQ0FSRDs7SUFTQSxNQUFNLEtBQUtuQyxRQUFMLENBQWNxQixLQUFkLENBQW9CLENBQXBCLENBQU47O0lBQ0EsSUFBSTtNQUNGLE1BQU0sSUFBQWdCLDBCQUFBLEVBQWlCLFlBQVk7UUFDakMsSUFBSSxDQUFDLEtBQUt0QixTQUFWLEVBQXFCO1VBQ25CLE1BQU0sSUFBSXVCLEtBQUosRUFBTjtRQUNEOztRQUNELE9BQU8sQ0FBQyxFQUFFLE1BQU0sS0FBSzFCLFlBQUwsRUFBUixDQUFSO01BQ0QsQ0FMSyxFQUtIO1FBQ0QyQixNQUFNLEVBQUU1RSxrQkFEUDtRQUVENkUsVUFBVSxFQUFFOUU7TUFGWCxDQUxHLENBQU47SUFTRCxDQVZELENBVUUsT0FBTytFLENBQVAsRUFBVTtNQUNWLE1BQU0sS0FBS3pCLG1CQUFMLEVBQU47TUFDQSxLQUFLbEIsR0FBTCxDQUFTNEMsYUFBVCxDQUF3QixvQ0FBbUMsS0FBS3hDLFVBQVcsMEJBQXlCdkMsa0JBQW1CLE1BQWhHLEdBQ3BCLHVDQURIO0lBRUQ7O0lBQ0QsS0FBS2dELE1BQUwsR0FBY2dDLFVBQVUsQ0FBQyxZQUFZO01BQ25DLElBQUksS0FBSzVCLFNBQVQsRUFBb0I7UUFDbEIsSUFBSTtVQUNGLE1BQU0sS0FBS0csSUFBTCxFQUFOO1FBQ0QsQ0FGRCxDQUVFLE9BQU91QixDQUFQLEVBQVU7VUFDVixLQUFLM0MsR0FBTCxDQUFTOEMsS0FBVCxDQUFlSCxDQUFmO1FBQ0Q7TUFDRjtJQUNGLENBUnVCLEVBUXJCLEtBQUtoQyxZQVJnQixDQUF4QjtJQVNBLEtBQUtYLEdBQUwsQ0FBUytDLElBQVQsQ0FBZSxvREFBbUQsS0FBS3BDLFlBQWEsSUFBcEY7RUFDRDs7RUFFUyxNQUFKUyxJQUFJLENBQUU0QixLQUFLLEdBQUcsS0FBVixFQUFpQjtJQUN6QixJQUFJLEtBQUtuQyxNQUFULEVBQWlCO01BQ2ZvQyxZQUFZLENBQUMsS0FBS3BDLE1BQU4sQ0FBWjtNQUNBLEtBQUtBLE1BQUwsR0FBYyxJQUFkO0lBQ0Q7O0lBRUQsSUFBSW1DLEtBQUosRUFBVztNQUNULE9BQU8sTUFBTSxLQUFLOUIsbUJBQUwsRUFBYjtJQUNEOztJQUVELElBQUksQ0FBQyxLQUFLRCxTQUFWLEVBQXFCO01BQ25CLEtBQUtqQixHQUFMLENBQVNtQixLQUFULENBQWUsd0VBQWY7TUFDQSxPQUFPLE1BQU0sS0FBS0wsWUFBTCxFQUFiO0lBQ0Q7O0lBRUQsSUFBSTtNQUNGLE1BQU0sS0FBS1osUUFBTCxDQUFja0IsSUFBZCxDQUFtQixRQUFuQixFQUE2QnJELDJCQUE3QixDQUFOO0lBQ0QsQ0FGRCxDQUVFLE9BQU80RSxDQUFQLEVBQVU7TUFDVixNQUFNLEtBQUt6QixtQkFBTCxFQUFOO01BQ0EsTUFBTSxJQUFJc0IsS0FBSixDQUFXLDZDQUE0Q3pFLDJCQUE0QixJQUFuRixDQUFOO0lBQ0Q7O0lBRUQsT0FBTyxNQUFNLEtBQUsrQyxZQUFMLEVBQWI7RUFDRDs7QUE5SGtCOztBQWlJckIsZUFBZW9DLG9CQUFmLENBQXFDQyxJQUFyQyxFQUEyQztFQUN6QyxJQUFJQSxJQUFJLENBQUMscUJBQUQsQ0FBSixLQUFnQyxLQUFwQyxFQUEyQztJQUN6QyxPQUFPLElBQVA7RUFDRDs7RUFFRCxNQUFNQyxVQUFVLEdBQUcvRSxlQUFBLENBQUVnRixPQUFGLENBQVVoRixlQUFBLENBQUVpRixNQUFGLENBQVMsTUFBTSxJQUFJNUIsbUJBQUosR0FBYTZCLFVBQWIsQ0FBd0IsSUFBeEIsRUFBOEIsS0FBOUIsQ0FBZixDQUFWLENBQW5COztFQUNBLEtBQUssTUFBTTtJQUFDQyxJQUFEO0lBQU8xRCxJQUFQO0lBQWEyRCxLQUFiO0lBQW9CQztFQUFwQixDQUFYLElBQXVDTixVQUF2QyxFQUFtRDtJQUNqRCxJQUFJSyxLQUFLLEtBQUssUUFBZCxFQUF3QjtNQUN0QjtJQUNEOztJQUVELElBQUlwRixlQUFBLENBQUVzRixPQUFGLENBQVVSLElBQUksQ0FBQyxtQkFBRCxDQUFkLE1BQXlDOUUsZUFBQSxDQUFFc0YsT0FBRixDQUFVN0QsSUFBVixDQUE3QyxFQUE4RDtNQUM1RCxPQUFPQSxJQUFQO0lBQ0Q7O0lBQ0QsSUFBSXpCLGVBQUEsQ0FBRXNGLE9BQUYsQ0FBVVIsSUFBSSxDQUFDLG1CQUFELENBQWQsTUFBeUM5RSxlQUFBLENBQUVzRixPQUFGLENBQVVILElBQVYsQ0FBekMsS0FDREwsSUFBSSxDQUFDLHdCQUFELENBQUosSUFBa0NBLElBQUksQ0FBQyx3QkFBRCxDQUFKLEtBQW1DTyxHQUFyRSxJQUNJLENBQUNQLElBQUksQ0FBQyx3QkFBRCxDQUZSLENBQUosRUFFeUM7TUFDdkMsT0FBT3JELElBQVA7SUFDRDtFQUNGOztFQUVELE9BQU8sSUFBUDtBQUNEOztBQTBCRG5DLFFBQVEsQ0FBQ2lHLG9CQUFULEdBQWdDLGVBQWVBLG9CQUFmLENBQXFDNUUsT0FBTyxHQUFHLEVBQS9DLEVBQW1EO0VBQUE7O0VBQ2pGLE1BQU07SUFDSjRCLFNBREk7SUFFSk4sS0FGSTtJQUdKRSxPQUhJO0lBSUpFLElBSkk7SUFLSm1ELFlBQVksR0FBRztFQUxYLElBTUY3RSxPQU5KOztFQU9BLDZCQUFJLEtBQUs4RSxlQUFULGtEQUFJLHNCQUFzQjdDLFNBQTFCLEVBQXFDO0lBQ25DLEtBQUtqQixHQUFMLENBQVMrQyxJQUFULENBQWMseUNBQWQ7O0lBQ0EsSUFBSSxDQUFDYyxZQUFMLEVBQW1CO01BQ2pCLEtBQUs3RCxHQUFMLENBQVMrQyxJQUFULENBQWMsZUFBZDtNQUNBO0lBQ0Q7O0lBQ0QsS0FBSy9DLEdBQUwsQ0FBUytDLElBQVQsQ0FBYyw2Q0FBZDtJQUNBLE1BQU0sS0FBS2UsZUFBTCxDQUFxQjFDLElBQXJCLENBQTBCLElBQTFCLENBQU47RUFDRDs7RUFDRCxLQUFLMEMsZUFBTCxHQUF1QixJQUF2QjtFQUVBLE1BQU1oRSxJQUFJLEdBQUcsTUFBTW9ELG9CQUFvQixDQUFDLEtBQUtDLElBQU4sQ0FBdkM7O0VBQ0EsSUFBSSxDQUFDckQsSUFBTCxFQUFXO0lBQ1QsTUFBTSxJQUFJMEMsS0FBSixDQUFVLCtEQUNkLHdDQURJLENBQU47RUFFRDs7RUFFRCxNQUFNekMsU0FBUyxHQUFHLE1BQU1nRSxnQkFBQSxDQUFRQyxJQUFSLENBQWE7SUFDbkNDLE1BQU0sRUFBRTFGLGFBQUEsQ0FBSzJGLE1BQUwsR0FBY2hDLFNBQWQsQ0FBd0IsQ0FBeEIsRUFBMkIsQ0FBM0IsQ0FEMkI7SUFFbkNpQyxNQUFNLEVBQUVuRztFQUYyQixDQUFiLENBQXhCO0VBSUEsS0FBSzhGLGVBQUwsR0FBdUIsSUFBSWxFLGNBQUosQ0FBbUJFLElBQW5CLEVBQXlCQyxTQUF6QixFQUFvQyxLQUFLQyxHQUF6QyxFQUE4QztJQUNuRVksU0FBUyxFQUFFd0QsUUFBUSxDQUFDeEQsU0FBRCxFQUFZLEVBQVosQ0FEZ0Q7SUFFbkVOLEtBRm1FO0lBR25FRSxPQUhtRTtJQUluRUU7RUFKbUUsQ0FBOUMsQ0FBdkI7O0VBTUEsSUFBSTtJQUNGLE1BQU0sS0FBS29ELGVBQUwsQ0FBcUJ2QyxLQUFyQixFQUFOO0VBQ0QsQ0FGRCxDQUVFLE9BQU9vQixDQUFQLEVBQVU7SUFDVixLQUFLbUIsZUFBTCxHQUF1QixJQUF2QjtJQUNBLE1BQU1uQixDQUFOO0VBQ0Q7QUFDRixDQXpDRDs7QUF3RUFoRixRQUFRLENBQUMwRyxtQkFBVCxHQUErQixlQUFlQSxtQkFBZixDQUFvQ3JGLE9BQU8sR0FBRyxFQUE5QyxFQUFrRDtFQUMvRSxJQUFJLENBQUMsS0FBSzhFLGVBQVYsRUFBMkI7SUFDekIsS0FBSzlELEdBQUwsQ0FBUytDLElBQVQsQ0FBYyxxREFBZDtJQUNBLE9BQU8sRUFBUDtFQUNEOztFQUVELEtBQUsvQyxHQUFMLENBQVNtQixLQUFULENBQWUscUNBQWY7RUFDQSxNQUFNcEIsU0FBUyxHQUFHLE1BQU0sS0FBSytELGVBQUwsQ0FBcUIxQyxJQUFyQixFQUF4Qjs7RUFDQSxJQUFJLENBQUNyQixTQUFMLEVBQWdCO0lBQ2QsS0FBS0MsR0FBTCxDQUFTK0MsSUFBVCxDQUFjLG1EQUFkO0lBQ0EsT0FBTyxFQUFQO0VBQ0Q7O0VBQ0QsSUFBSTFFLGVBQUEsQ0FBRUMsT0FBRixDQUFVVSxPQUFPLENBQUNiLFVBQWxCLENBQUosRUFBbUM7SUFDakMsTUFBTTtNQUFDbUc7SUFBRCxJQUFTLE1BQU03RSxXQUFBLENBQUc4RSxJQUFILENBQVF4RSxTQUFSLENBQXJCO0lBQ0EsS0FBS0MsR0FBTCxDQUFTbUIsS0FBVCxDQUFnQixpREFBZ0Q1QyxhQUFBLENBQUtpRyxvQkFBTCxDQUEwQkYsSUFBMUIsQ0FBZ0MsRUFBaEc7RUFDRDs7RUFDRCxPQUFPLE1BQU1yRyxtQkFBbUIsQ0FBQzhCLFNBQUQsRUFBWWYsT0FBTyxDQUFDYixVQUFwQixFQUFnQ2EsT0FBaEMsQ0FBaEM7QUFDRCxDQWpCRDs7ZUFtQmVyQixRIn0=
|
|
256
|
+
exports.default = _default;
|
|
257
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIlNUQVJUVVBfSU5URVJWQUxfTVMiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJERUZBVUxUX1RJTUVfTElNSVRfTVMiLCJQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVRfTVMiLCJERUZBVUxUX0VYVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwib3B0aW9ucyIsImF1dGgiLCJuZXQiLCJ1cGxvYWRGaWxlIiwiVklERU9fRklMRVMiLCJTZXQiLCJwcm9jZXNzIiwib24iLCJ2aWRlb0ZpbGUiLCJmcyIsInJpbXJhZlN5bmMiLCJpZ24iLCJTY3JlZW5SZWNvcmRlciIsImNvbnN0cnVjdG9yIiwidWRpZCIsInZpZGVvUGF0aCIsImxvZyIsIm9wdHMiLCJfcHJvY2VzcyIsIl91ZGlkIiwiX3ZpZGVvUGF0aCIsIl9jb2RlYyIsImNvZGVjIiwiX2Rpc3BsYXkiLCJkaXNwbGF5IiwiX21hc2siLCJtYXNrIiwiX3RpbWVMaW1pdE1zIiwidGltZUxpbWl0IiwiX3RpbWVyIiwiZ2V0VmlkZW9QYXRoIiwiZXhpc3RzIiwiYWRkIiwiaXNSdW5uaW5nIiwiX2VuZm9yY2VUZXJtaW5hdGlvbiIsImRlYnVnIiwic3RvcCIsInJpbXJhZiIsImRlbGV0ZSIsInN0YXJ0IiwiYXJncyIsInB1c2giLCJTaW1jdGwiLCJleGVjIiwiYXN5bmNocm9ub3VzIiwicXVvdGUiLCJzdGRvdXQiLCJzdGRlcnIiLCJsaW5lIiwidHJpbSIsInN1YnN0cmluZyIsIm9uY2UiLCJjb2RlIiwic2lnbmFsIiwid2FybiIsIndhaXRGb3JDb25kaXRpb24iLCJFcnJvciIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwiZXJyb3JBbmRUaHJvdyIsInNldFRpbWVvdXQiLCJlcnJvciIsImluZm8iLCJmb3JjZSIsImNsZWFyVGltZW91dCIsImV4dHJhY3RTaW11bGF0b3JVZGlkIiwiY2FwcyIsImFsbERldmljZXMiLCJmbGF0TWFwIiwidmFsdWVzIiwiZ2V0RGV2aWNlcyIsIm5hbWUiLCJzdGF0ZSIsInNkayIsInRvTG93ZXIiLCJzdGFydFJlY29yZGluZ1NjcmVlbiIsImZvcmNlUmVzdGFydCIsIl9zY3JlZW5SZWNvcmRlciIsInRlbXBEaXIiLCJwYXRoIiwicHJlZml4IiwidXVpZFY0Iiwic3VmZml4IiwicGFyc2VJbnQiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwic2l6ZSIsInN0YXQiLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9yZWNvcmQtc2NyZWVuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB1dGlsLCBmcywgbmV0LCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBTaW1jdGwgZnJvbSAnbm9kZS1zaW1jdGwnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IFNUQVJUVVBfSU5URVJWQUxfTVMgPSAzMDA7XG5jb25zdCBTVEFSVFVQX1RJTUVPVVRfTVMgPSAxMCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX1RJTUVfTElNSVRfTVMgPSA2MCAqIDEwICogMTAwMDsgLy8gMTAgbWludXRlc1xuY29uc3QgUFJPQ0VTU19TSFVURE9XTl9USU1FT1VUX01TID0gMTAgKiAxMDAwO1xuY29uc3QgREVGQVVMVF9FWFQgPSAnLm1wNCc7XG5cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkUmVjb3JkZWRNZWRpYSAobG9jYWxGaWxlLCByZW1vdGVQYXRoID0gbnVsbCwgdXBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgY29uc3Qge3VzZXIsIHBhc3MsIG1ldGhvZCwgaGVhZGVycywgZmlsZUZpZWxkTmFtZSwgZm9ybUZpZWxkc30gPSB1cGxvYWRPcHRpb25zO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQVVQnLFxuICAgIGhlYWRlcnMsXG4gICAgZmlsZUZpZWxkTmFtZSxcbiAgICBmb3JtRmllbGRzLFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuY29uc3QgVklERU9fRklMRVMgPSBuZXcgU2V0KCk7XG5wcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHZpZGVvRmlsZSBvZiBWSURFT19GSUxFUykge1xuICAgIHRyeSB7XG4gICAgICBmcy5yaW1yYWZTeW5jKHZpZGVvRmlsZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG59KTtcblxuY2xhc3MgU2NyZWVuUmVjb3JkZXIge1xuICBjb25zdHJ1Y3RvciAodWRpZCwgdmlkZW9QYXRoLCBsb2csIG9wdHMgPSB7fSkge1xuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuX3Byb2Nlc3MgPSBudWxsO1xuICAgIHRoaXMuX3VkaWQgPSB1ZGlkO1xuICAgIHRoaXMuX3ZpZGVvUGF0aCA9IHZpZGVvUGF0aDtcbiAgICB0aGlzLl9jb2RlYyA9IG9wdHMuY29kZWM7XG4gICAgdGhpcy5fZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcbiAgICB0aGlzLl9tYXNrID0gb3B0cy5tYXNrO1xuICAgIHRoaXMuX3RpbWVMaW1pdE1zID0gb3B0cy50aW1lTGltaXQgPiAwID8gb3B0cy50aW1lTGltaXQgKiAxMDAwIDogREVGQVVMVF9USU1FX0xJTUlUX01TO1xuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdldFZpZGVvUGF0aCAoKSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLl92aWRlb1BhdGgpKSB7XG4gICAgICBWSURFT19GSUxFUy5hZGQodGhpcy5fdmlkZW9QYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLl92aWRlb1BhdGg7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLl9wcm9jZXNzPy5pc1J1bm5pbmcpO1xuICB9XG5cbiAgYXN5bmMgX2VuZm9yY2VUZXJtaW5hdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnRm9yY2Utc3RvcHBpbmcgdGhlIGN1cnJlbnRseSBydW5uaW5nIHZpZGVvIHJlY29yZGluZycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcHJvY2Vzcy5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIHRoaXMuX3Byb2Nlc3MgPSBudWxsO1xuICAgIGNvbnN0IHZpZGVvUGF0aCA9IGF3YWl0IHRoaXMuZ2V0VmlkZW9QYXRoKCk7XG4gICAgaWYgKHZpZGVvUGF0aCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHZpZGVvUGF0aCk7XG4gICAgICBWSURFT19GSUxFUy5kZWxldGUodmlkZW9QYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICB0aGlzLl91ZGlkLCAncmVjb3JkVmlkZW8nXG4gICAgXTtcbiAgICBpZiAodGhpcy5fZGlzcGxheSkge1xuICAgICAgYXJncy5wdXNoKCctLWRpc3BsYXknLCB0aGlzLl9kaXNwbGF5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvZGVjKSB7XG4gICAgICBhcmdzLnB1c2goJy0tY29kZWMnLCB0aGlzLl9jb2RlYyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXNrKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbWFzaycsIHRoaXMuX21hc2spO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tZm9yY2UnLCB0aGlzLl92aWRlb1BhdGgpO1xuICAgIHRoaXMuX3Byb2Nlc3MgPSBhd2FpdCBuZXcgU2ltY3RsKCkuZXhlYygnaW8nLCB7XG4gICAgICBhcmdzLFxuICAgICAgYXN5bmNocm9ub3VzOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyB2aWRlbyByZWNvcmRpbmcgd2l0aCBhcmd1bWVudHM6ICR7dXRpbC5xdW90ZShhcmdzKX1gKTtcbiAgICB0aGlzLl9wcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgW3JlY29yZFZpZGVvQCR7dGhpcy5fdWRpZC5zdWJzdHJpbmcoMCwgOCl9XSAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fcHJvY2Vzcy5vbmNlKCdleGl0JywgYXN5bmMgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgdGhpcy5fcHJvY2VzcyA9IG51bGw7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnU2NyZWVuIHJlY29yZGluZyBleGl0ZWQgd2l0aG91dCBlcnJvcnMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBTY3JlZW4gcmVjb3JkaW5nIGV4aXRlZCB3aXRoIGVycm9yIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuX3Byb2Nlc3Muc3RhcnQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhKGF3YWl0IHRoaXMuZ2V0VmlkZW9QYXRoKCkpO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogU1RBUlRVUF9JTlRFUlZBTF9NUyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGV4cGVjdGVkIHNjcmVlbiByZWNvcmQgZmlsZSAnJHt0aGlzLl92aWRlb1BhdGh9JyBkb2VzIG5vdCBleGlzdCBhZnRlciAke1NUQVJUVVBfVElNRU9VVF9NU31tcy4gYCArXG4gICAgICAgIGBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGhpcy5fdGltZUxpbWl0TXMpO1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSB2aWRlbyByZWNvcmRpbmcgaGFzIHN0YXJ0ZWQuIFdpbGwgdGltZW91dCBpbiAke3RoaXMuX3RpbWVMaW1pdE1zfW1zYCk7XG4gIH1cblxuICBhc3luYyBzdG9wIChmb3JjZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChmb3JjZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdTY3JlZW4gcmVjb3JkaW5nIGlzIG5vdCBydW5uaW5nLiBSZXR1cm5pbmcgdGhlIHJlY2VudGx5IHJlY29yZGVkIHZpZGVvJyk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWRlb1BhdGgoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fcHJvY2Vzcy5zdG9wKCdTSUdJTlQnLCBQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVRfTVMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2VuZm9yY2VUZXJtaW5hdGlvbigpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW4gcmVjb3JkaW5nIGhhcyBmYWlsZWQgdG8gc3RvcCBhZnRlciAke1BST0NFU1NfU0hVVERPV05fVElNRU9VVF9NU31tc2ApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZGVvUGF0aCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTaW11bGF0b3JVZGlkIChjYXBzKSB7XG4gIGlmIChjYXBzWydzYWZhcmk6dXNlU2ltdWxhdG9yJ10gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhbGxEZXZpY2VzID0gXy5mbGF0TWFwKF8udmFsdWVzKGF3YWl0IG5ldyBTaW1jdGwoKS5nZXREZXZpY2VzKG51bGwsICdpT1MnKSkpO1xuICBmb3IgKGNvbnN0IHtuYW1lLCB1ZGlkLCBzdGF0ZSwgc2RrfSBvZiBhbGxEZXZpY2VzKSB7XG4gICAgaWYgKHN0YXRlICE9PSAnQm9vdGVkJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKF8udG9Mb3dlcihjYXBzWydzYWZhcmk6ZGV2aWNlVURJRCddKSA9PT0gXy50b0xvd2VyKHVkaWQpKSB7XG4gICAgICByZXR1cm4gdWRpZDtcbiAgICB9XG4gICAgaWYgKF8udG9Mb3dlcihjYXBzWydzYWZhcmk6ZGV2aWNlTmFtZSddKSA9PT0gXy50b0xvd2VyKG5hbWUpICYmXG4gICAgICAoY2Fwc1snc2FmYXJpOnBsYXRmb3JtVmVyc2lvbiddICYmIGNhcHNbJ3NhZmFyaTpwbGF0Zm9ybVZlcnNpb24nXSA9PT0gc2RrXG4gICAgICAgIHx8ICFjYXBzWydzYWZhcmk6cGxhdGZvcm1WZXJzaW9uJ10pKSB7XG4gICAgICByZXR1cm4gdWRpZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0UmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29kZWMgW2hldmNdIC0gU3BlY2lmaWVzIHRoZSBjb2RlYyB0eXBlOiBcImgyNjRcIiBvciBcImhldmNcIlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBkaXNwbGF5IFtpbnRlcm5hbF0gLSBTdXBwb3J0cyBcImludGVybmFsXCIgb3IgXCJleHRlcm5hbFwiLiBEZWZhdWx0IGlzIFwiaW50ZXJuYWxcIlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtYXNrIC0gRm9yIG5vbi1yZWN0YW5ndWxhciBkaXNwbGF5cywgaGFuZGxlIHRoZSBtYXNrIGJ5IHBvbGljeTpcbiAqIC0gaWdub3JlZDogVGhlIG1hc2sgaXMgaWdub3JlZCBhbmQgdGhlIHVubWFza2VkIGZyYW1lYnVmZmVyIGlzIHNhdmVkLlxuICogLSBhbHBoYTogTm90IHN1cHBvcnRlZCwgYnV0IHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5OyB0aGUgbWFzayBpcyByZW5kZXJlZCBibGFjay5cbiAqIC0gYmxhY2s6IFRoZSBtYXNrIGlzIHJlbmRlcmVkIGJsYWNrLlxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgWzYwMF0gLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy4gVGhlIGRlZmF1bHRcbiAqIHZhbHVlIGlzIDYwMCBzZWNvbmRzICgxMCBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZm9yY2VSZXN0YXJ0IFt0cnVlXSAtIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBjYWxsIGlmIGEgc2NyZWVuIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZ1xuICogKGBmYWxzZWApIG9yIHRvIHN0YXJ0IGEgbmV3IHJlY29yZGluZyBpbW1lZGlhdGVseSBhbmQgdGVybWluYXRlIHRoZSBleGlzdGluZyBvbmUgaWYgcnVubmluZyAoYHRydWVgKS5cbiAqL1xuXG4vKipcbiAqIFJlY29yZCB0aGUgU2ltdWxhdG9yJ3MgZGlzcGxheSBpbiBiYWNrZ3JvdW5kIHdoaWxlIHRoZSBhdXRvbWF0ZWQgdGVzdCBpcyBydW5uaW5nLlxuICogVGhpcyBtZXRob2QgdXNlcyBgeGNydW4gc2ltY3RsIGlvIHJlY29yZFZpZGVvYCBoZWxwZXIgdW5kZXIgdGhlIGhvb2QuXG4gKiBDaGVjayB0aGUgb3V0cHV0IG9mIGB4Y3J1biBzaW1jdGwgaW9gIGNvbW1hbmQgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnN0YXJ0UmVjb3JkaW5nU2NyZWVuID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRSZWNvcmRpbmdTY3JlZW4gKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGltZUxpbWl0LFxuICAgIGNvZGVjLFxuICAgIGRpc3BsYXksXG4gICAgbWFzayxcbiAgICBmb3JjZVJlc3RhcnQgPSB0cnVlLFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHRoaXMuX3NjcmVlblJlY29yZGVyPy5pc1J1bm5pbmcpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdUaGUgc2NyZWVuIHJlY29yZGluZyBpcyBhbHJlYWR5IHJ1bm5pbmcnKTtcbiAgICBpZiAoIWZvcmNlUmVzdGFydCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnRG9pbmcgbm90aGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKCdGb3JjaW5nIHRoZSBhY3RpdmUgc2NyZWVuIHJlY29yZGluZyB0byBzdG9wJyk7XG4gICAgYXdhaXQgdGhpcy5fc2NyZWVuUmVjb3JkZXIuc3RvcCh0cnVlKTtcbiAgfVxuICB0aGlzLl9zY3JlZW5SZWNvcmRlciA9IG51bGw7XG5cbiAgY29uc3QgdWRpZCA9IGF3YWl0IGV4dHJhY3RTaW11bGF0b3JVZGlkKHRoaXMuY2Fwcyk7XG4gIGlmICghdWRpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRldGVybWluZSBTaW11bGF0b3IgVURJRCB0byByZWNvcmQgdGhlIHZpZGVvIGZyb20uICcgK1xuICAgICAgJ0RvdWJsZSBjaGVjayB5b3VyIHNlc3Npb24gY2FwYWJpbGl0aWVzJyk7XG4gIH1cblxuICBjb25zdCB2aWRlb1BhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe1xuICAgIHByZWZpeDogdXRpbC51dWlkVjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgc3VmZml4OiBERUZBVUxUX0VYVCxcbiAgfSk7XG4gIHRoaXMuX3NjcmVlblJlY29yZGVyID0gbmV3IFNjcmVlblJlY29yZGVyKHVkaWQsIHZpZGVvUGF0aCwgdGhpcy5sb2csIHtcbiAgICB0aW1lTGltaXQ6IHBhcnNlSW50KHRpbWVMaW1pdCwgMTApLFxuICAgIGNvZGVjLFxuICAgIGRpc3BsYXksXG4gICAgbWFzayxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5fc2NyZWVuUmVjb3JkZXIuc3RhcnQoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMuX3NjcmVlblJlY29yZGVyID0gbnVsbDtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHJlbW90ZSBsb2NhdGlvbiwgd2hlcmUgdGhlIHJlc3VsdGluZyB2aWRlbyBzaG91bGQgYmUgdXBsb2FkZWQuXG4gKiBUaGUgZm9sbG93aW5nIHByb3RvY29scyBhcmUgc3VwcG9ydGVkOiBodHRwL2h0dHBzLCBmdHAuXG4gKiBOdWxsIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSAodGhlIGRlZmF1bHQgc2V0dGluZykgbWVhbnMgdGhlIGNvbnRlbnQgb2YgcmVzdWx0aW5nXG4gKiBmaWxlIHNob3VsZCBiZSBlbmNvZGVkIGFzIEJhc2U2NCBhbmQgcGFzc2VkIGFzIHRoZSBlbmRwb2ludCByZXNwb25zZSB2YWx1ZS5cbiAqIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZ2VuZXJhdGVkIG1lZGlhIGZpbGUgaXMgdG9vIGJpZyB0b1xuICogZml0IGludG8gdGhlIGF2YWlsYWJsZSBwcm9jZXNzIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXNlciAtIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXNzIC0gVGhlIHBhc3N3b3JkIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtZXRob2QgLSBUaGUgaHR0cCBtdWx0aXBhcnQgdXBsb2FkIG1ldGhvZCBuYW1lLiBUaGUgJ1BVVCcgb25lIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaGVhZGVycyAtIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0gZmllbGQsIHdoZXJlIHRoZSBmaWxlIGNvbnRlbnQgQkxPQiBzaG91bGQgYmUgc3RvcmVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fEFycmF5PFBhaXI+fSBmb3JtRmllbGRzIC0gQWRkaXRpb25hbCBmb3JtIGZpZWxkcyBmb3IgbXVsdGlwYXJ0IGh0dHAocykgdXBsb2Fkc1xuICovXG5cbi8qKlxuICogU3RvcCByZWNvcmRpbmcgdGhlIHNjcmVlbi5cbiAqIElmIG5vIHNjcmVlbiByZWNvcmRpbmcgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUgdGhlbiB0aGUgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7P1N0b3BSZWNvcmRpbmdPcHRpb25zfSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcmVjb3JkZWQgbWVkaWEgZmlsZSBpZiAncmVtb3RlUGF0aCdcbiAqIHBhcmFtZXRlciBpcyBmYWxzeSBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIG5hbWUgb2YgYSBtZWRpYSBmaWxlXG4gKiBvciB0aGUgZmlsZSBjb250ZW50IGNhbm5vdCBiZSB1cGxvYWRlZCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uXG4gKiBvciBzY3JlZW4gcmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5zdG9wUmVjb3JkaW5nU2NyZWVuID0gYXN5bmMgZnVuY3Rpb24gc3RvcFJlY29yZGluZ1NjcmVlbiAob3B0aW9ucyA9IHt9KSB7XG4gIGlmICghdGhpcy5fc2NyZWVuUmVjb3JkZXIpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdObyBzY3JlZW4gcmVjb3JkaW5nIGhhcyBiZWVuIHN0YXJ0ZWQuIERvaW5nIG5vdGhpbmcnKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZygnUmV0cmlldmluZyB0aGUgcmVzdWx0aW5nIHZpZGVvIGRhdGEnKTtcbiAgY29uc3QgdmlkZW9QYXRoID0gYXdhaXQgdGhpcy5fc2NyZWVuUmVjb3JkZXIuc3RvcCgpO1xuICBpZiAoIXZpZGVvUGF0aCkge1xuICAgIHRoaXMubG9nLmluZm8oJ05vIHZpZGVvIGRhdGEgaXMgZm91bmQuIFJldHVybmluZyBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShvcHRpb25zLnJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdCh2aWRlb1BhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHNjcmVlbiByZWNvcmRpbmcgaXMgJHt1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKHNpemUpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB1cGxvYWRSZWNvcmRlZE1lZGlhKHZpZGVvUGF0aCwgb3B0aW9ucy5yZW1vdGVQYXRoLCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVuQixNQUFNQyxtQkFBbUIsR0FBRyxHQUFHO0FBQy9CLE1BQU1DLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQ3BDLE1BQU1DLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUM1QyxNQUFNQywyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUM3QyxNQUFNQyxXQUFXLEdBQUcsTUFBTTtBQUcxQixlQUFlQyxtQkFBbUIsQ0FBRUMsU0FBUyxFQUFFQyxVQUFVLEdBQUcsSUFBSSxFQUFFQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDcEYsSUFBSUMsZUFBQyxDQUFDQyxPQUFPLENBQUNILFVBQVUsQ0FBQyxFQUFFO0lBQ3pCLE9BQU8sQ0FBQyxNQUFNSSxhQUFJLENBQUNDLGdCQUFnQixDQUFDTixTQUFTLENBQUMsRUFBRU8sUUFBUSxFQUFFO0VBQzVEO0VBRUEsTUFBTTtJQUFDQyxJQUFJO0lBQUVDLElBQUk7SUFBRUMsTUFBTTtJQUFFQyxPQUFPO0lBQUVDLGFBQWE7SUFBRUM7RUFBVSxDQUFDLEdBQUdYLGFBQWE7RUFDOUUsTUFBTVksT0FBTyxHQUFHO0lBQ2RKLE1BQU0sRUFBRUEsTUFBTSxJQUFJLEtBQUs7SUFDdkJDLE9BQU87SUFDUEMsYUFBYTtJQUNiQztFQUNGLENBQUM7RUFDRCxJQUFJTCxJQUFJLElBQUlDLElBQUksRUFBRTtJQUNoQkssT0FBTyxDQUFDQyxJQUFJLEdBQUc7TUFBQ1AsSUFBSTtNQUFFQztJQUFJLENBQUM7RUFDN0I7RUFDQSxNQUFNTyxZQUFHLENBQUNDLFVBQVUsQ0FBQ2pCLFNBQVMsRUFBRUMsVUFBVSxFQUFFYSxPQUFPLENBQUM7RUFDcEQsT0FBTyxFQUFFO0FBQ1g7QUFF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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-screen.js","names":["commands","STARTUP_INTERVAL_MS","STARTUP_TIMEOUT_MS","DEFAULT_TIME_LIMIT_MS","PROCESS_SHUTDOWN_TIMEOUT_MS","DEFAULT_EXT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","options","auth","net","uploadFile","VIDEO_FILES","Set","process","on","videoFile","fs","rimrafSync","ign","ScreenRecorder","constructor","udid","videoPath","log","opts","_process","_udid","_videoPath","_codec","codec","_display","display","_mask","mask","_timeLimitMs","timeLimit","_timer","getVideoPath","exists","add","isRunning","_enforceTermination","debug","stop","rimraf","delete","start","args","push","Simctl","exec","asynchronous","quote","stdout","stderr","line","trim","substring","once","code","signal","warn","waitForCondition","Error","waitMs","intervalMs","e","errorAndThrow","setTimeout","error","info","force","clearTimeout","extractSimulatorUdid","caps","allDevices","flatMap","values","getDevices","name","state","sdk","toLower","startRecordingScreen","forceRestart","_screenRecorder","tempDir","path","prefix","uuidV4","suffix","parseInt","stopRecordingScreen","size","stat","toReadableSizeString"],"sources":["../../../lib/commands/record-screen.js"],"sourcesContent":["import _ from 'lodash';\nimport { util, fs, net, tempDir } from 'appium/support';\nimport { waitForCondition } from 'asyncbox';\nimport Simctl from 'node-simctl';\n\n\nconst commands = {};\n\nconst STARTUP_INTERVAL_MS = 300;\nconst STARTUP_TIMEOUT_MS = 10 * 1000;\nconst DEFAULT_TIME_LIMIT_MS = 60 * 10 * 1000; // 10 minutes\nconst PROCESS_SHUTDOWN_TIMEOUT_MS = 10 * 1000;\nconst DEFAULT_EXT = '.mp4';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {user, pass, method, headers, fileFieldName, formFields} = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nconst VIDEO_FILES = new Set();\nprocess.on('exit', () => {\n for (const videoFile of VIDEO_FILES) {\n try {\n fs.rimrafSync(videoFile);\n } catch (ign) {}\n }\n});\n\nclass ScreenRecorder {\n constructor (udid, videoPath, log, opts = {}) {\n this.log = log;\n this._process = null;\n this._udid = udid;\n this._videoPath = videoPath;\n this._codec = opts.codec;\n this._display = opts.display;\n this._mask = opts.mask;\n this._timeLimitMs = opts.timeLimit > 0 ? opts.timeLimit * 1000 : DEFAULT_TIME_LIMIT_MS;\n this._timer = null;\n }\n\n async getVideoPath () {\n if (await fs.exists(this._videoPath)) {\n VIDEO_FILES.add(this._videoPath);\n return this._videoPath;\n }\n return '';\n }\n\n get isRunning () {\n return !!(this._process?.isRunning);\n }\n\n async _enforceTermination () {\n if (this.isRunning) {\n this.log.debug('Force-stopping the currently running video recording');\n try {\n await this._process.stop('SIGKILL');\n } catch (ign) {}\n }\n this._process = null;\n const videoPath = await this.getVideoPath();\n if (videoPath) {\n await fs.rimraf(videoPath);\n VIDEO_FILES.delete(videoPath);\n }\n return '';\n }\n\n async start () {\n const args = [\n this._udid, 'recordVideo'\n ];\n if (this._display) {\n args.push('--display', this._display);\n }\n if (this._codec) {\n args.push('--codec', this._codec);\n }\n if (this._mask) {\n args.push('--mask', this._mask);\n }\n args.push('--force', this._videoPath);\n this._process = await new Simctl().exec('io', {\n args,\n asynchronous: true,\n });\n this.log.debug(`Starting video recording with arguments: ${util.quote(args)}`);\n this._process.on('output', (stdout, stderr) => {\n const line = _.trim(stdout || stderr);\n if (line) {\n this.log.debug(`[recordVideo@${this._udid.substring(0, 8)}] ${line}`);\n }\n });\n this._process.once('exit', async (code, signal) => {\n this._process = null;\n if (code === 0) {\n this.log.debug('Screen recording exited without errors');\n } else {\n await this._enforceTermination();\n this.log.warn(`Screen recording exited with error code ${code}, signal ${signal}`);\n }\n });\n await this._process.start(0);\n try {\n await waitForCondition(async () => {\n if (!this.isRunning) {\n throw new Error();\n }\n return !!(await this.getVideoPath());\n }, {\n waitMs: STARTUP_TIMEOUT_MS,\n intervalMs: STARTUP_INTERVAL_MS,\n });\n } catch (e) {\n await this._enforceTermination();\n this.log.errorAndThrow(`The expected screen record file '${this._videoPath}' does not exist after ${STARTUP_TIMEOUT_MS}ms. ` +\n `Check the server log for more details`);\n }\n this._timer = setTimeout(async () => {\n if (this.isRunning) {\n try {\n await this.stop();\n } catch (e) {\n this.log.error(e);\n }\n }\n }, this._timeLimitMs);\n this.log.info(`The video recording has started. Will timeout in ${this._timeLimitMs}ms`);\n }\n\n async stop (force = false) {\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n\n if (force) {\n return await this._enforceTermination();\n }\n\n if (!this.isRunning) {\n this.log.debug('Screen recording is not running. Returning the recently recorded video');\n return await this.getVideoPath();\n }\n\n try {\n await this._process.stop('SIGINT', PROCESS_SHUTDOWN_TIMEOUT_MS);\n } catch (e) {\n await this._enforceTermination();\n throw new Error(`Screen recording has failed to stop after ${PROCESS_SHUTDOWN_TIMEOUT_MS}ms`);\n }\n\n return await this.getVideoPath();\n }\n}\n\nasync function extractSimulatorUdid (caps) {\n if (caps['safari:useSimulator'] === false) {\n return null;\n }\n\n const allDevices = _.flatMap(_.values(await new Simctl().getDevices(null, 'iOS')));\n for (const {name, udid, state, sdk} of allDevices) {\n if (state !== 'Booted') {\n continue;\n }\n\n if (_.toLower(caps['safari:deviceUDID']) === _.toLower(udid)) {\n return udid;\n }\n if (_.toLower(caps['safari:deviceName']) === _.toLower(name) &&\n (caps['safari:platformVersion'] && caps['safari:platformVersion'] === sdk\n || !caps['safari:platformVersion'])) {\n return udid;\n }\n }\n\n return null;\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {?string} codec [hevc] - Specifies the codec type: \"h264\" or \"hevc\"\n * @property {?string} display [internal] - Supports \"internal\" or \"external\". Default is \"internal\"\n * @property {?string} mask - For non-rectangular displays, handle the mask by policy:\n * - ignored: The mask is ignored and the unmasked framebuffer is saved.\n * - alpha: Not supported, but retained for compatibility; the mask is rendered black.\n * - black: The mask is rendered black.\n * @property {string|number} timeLimit [600] - The maximum recording time, in seconds. The default\n * value is 600 seconds (10 minutes).\n * @property {boolean} forceRestart [true] - Whether to ignore the call if a screen recording is currently running\n * (`false`) or to start a new recording immediately and terminate the existing one if running (`true`).\n */\n\n/**\n * Record the Simulator's display in background while the automated test is running.\n * This method uses `xcrun simctl io recordVideo` helper under the hood.\n * Check the output of `xcrun simctl io` command for more details.\n *\n * @param {?StartRecordingOptions} options - The available options.\n * @throws {Error} If screen recording has failed to start or is not supported for the destination device.\n */\ncommands.startRecordingScreen = async function startRecordingScreen (options = {}) {\n const {\n timeLimit,\n codec,\n display,\n mask,\n forceRestart = true,\n } = options;\n if (this._screenRecorder?.isRunning) {\n this.log.info('The screen recording is already running');\n if (!forceRestart) {\n this.log.info('Doing nothing');\n return;\n }\n this.log.info('Forcing the active screen recording to stop');\n await this._screenRecorder.stop(true);\n }\n this._screenRecorder = null;\n\n const udid = await extractSimulatorUdid(this.caps);\n if (!udid) {\n throw new Error('Cannot determine Simulator UDID to record the video from. ' +\n 'Double check your session capabilities');\n }\n\n const videoPath = await tempDir.path({\n prefix: util.uuidV4().substring(0, 8),\n suffix: DEFAULT_EXT,\n });\n this._screenRecorder = new ScreenRecorder(udid, videoPath, this.log, {\n timeLimit: parseInt(timeLimit, 10),\n codec,\n display,\n mask,\n });\n try {\n await this._screenRecorder.start();\n } catch (e) {\n this._screenRecorder = null;\n throw e;\n }\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {?string} remotePath - The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoint response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {?string} user - The name of the user for the remote authentication.\n * @property {?string} pass - The password for the remote authentication.\n * @property {?string} method - The http multipart upload method name. The 'PUT' one is used by default.\n * @property {?Object} headers - Additional headers mapping for multipart http(s) uploads\n * @property {?string} fileFieldName [file] - The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {?Object|Array<Pair>} formFields - Additional form fields for multipart http(s) uploads\n */\n\n/**\n * Stop recording the screen.\n * If no screen recording has been started before then the method returns an empty string.\n *\n * @param {?StopRecordingOptions} options - The available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while getting the name of a media file\n * or the file content cannot be uploaded to the remote location\n * or screen recording is not supported on the device under test.\n */\ncommands.stopRecordingScreen = async function stopRecordingScreen (options = {}) {\n if (!this._screenRecorder) {\n this.log.info('No screen recording has been started. Doing nothing');\n return '';\n }\n\n this.log.debug('Retrieving the resulting video data');\n const videoPath = await this._screenRecorder.stop();\n if (!videoPath) {\n this.log.info('No video data is found. Returning an empty string');\n return '';\n }\n if (_.isEmpty(options.remotePath)) {\n const {size} = await fs.stat(videoPath);\n this.log.debug(`The size of the resulting screen recording is ${util.toReadableSizeString(size)}`);\n }\n return await uploadRecordedMedia(videoPath, options.remotePath, options);\n};\n\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.desiredCapConstraints = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
const desiredCapConstraints = {
|
|
11
9
|
browserName: {
|
|
12
10
|
isString: true
|
|
@@ -42,7 +40,5 @@ const desiredCapConstraints = {
|
|
|
42
40
|
isObject: true
|
|
43
41
|
}
|
|
44
42
|
};
|
|
45
|
-
exports.desiredCapConstraints = desiredCapConstraints;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2Rlc2lyZWQtY2Fwcy5qcyIsIm5hbWVzIjpbImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImJyb3dzZXJOYW1lIiwiaXNTdHJpbmciLCJicm93c2VyVmVyc2lvbiIsImlzQm9vbGVhbiIsImlzT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL2Rlc2lyZWQtY2Fwcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7XG4gIGJyb3dzZXJOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIGJyb3dzZXJWZXJzaW9uOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTpwbGF0Zm9ybVZlcnNpb24nOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTpwbGF0Zm9ybUJ1aWxkVmVyc2lvbic6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICAnc2FmYXJpOnVzZVNpbXVsYXRvcic6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTpkZXZpY2VUeXBlJzoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gICdzYWZhcmk6ZGV2aWNlTmFtZSc6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICAnc2FmYXJpOmRldmljZVVESUQnOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTphdXRvbWF0aWNJbnNwZWN0aW9uJzoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICAnc2FmYXJpOmF1dG9tYXRpY1Byb2ZpbGluZyc6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgJ3dlYmtpdDpXZWJSVEMnOiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbn07XG5cbmV4cG9ydCB7IGRlc2lyZWRDYXBDb25zdHJhaW50cyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxNQUFNQSxxQkFBcUIsR0FBRztFQUM1QkMsV0FBVyxFQUFFO0lBQ1hDLFFBQVEsRUFBRTtFQURDLENBRGU7RUFJNUJDLGNBQWMsRUFBRTtJQUNkRCxRQUFRLEVBQUU7RUFESSxDQUpZO0VBTzVCLDBCQUEwQjtJQUN4QkEsUUFBUSxFQUFFO0VBRGMsQ0FQRTtFQVU1QiwrQkFBK0I7SUFDN0JBLFFBQVEsRUFBRTtFQURtQixDQVZIO0VBYTVCLHVCQUF1QjtJQUNyQkUsU0FBUyxFQUFFO0VBRFUsQ0FiSztFQWdCNUIscUJBQXFCO0lBQ25CRixRQUFRLEVBQUU7RUFEUyxDQWhCTztFQW1CNUIscUJBQXFCO0lBQ25CQSxRQUFRLEVBQUU7RUFEUyxDQW5CTztFQXNCNUIscUJBQXFCO0lBQ25CQSxRQUFRLEVBQUU7RUFEUyxDQXRCTztFQXlCNUIsOEJBQThCO0lBQzVCRSxTQUFTLEVBQUU7RUFEaUIsQ0F6QkY7RUE0QjVCLDZCQUE2QjtJQUMzQkEsU0FBUyxFQUFFO0VBRGdCLENBNUJEO0VBK0I1QixpQkFBaUI7SUFDZkMsUUFBUSxFQUFFO0VBREs7QUEvQlcsQ0FBOUIifQ==
|
|
43
|
+
exports.desiredCapConstraints = desiredCapConstraints;
|
|
44
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJicm93c2VyTmFtZSIsImlzU3RyaW5nIiwiYnJvd3NlclZlcnNpb24iLCJpc0Jvb2xlYW4iLCJpc09iamVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kZXNpcmVkLWNhcHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICBicm93c2VyTmFtZToge1xuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBicm93c2VyVmVyc2lvbjoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gICdzYWZhcmk6cGxhdGZvcm1WZXJzaW9uJzoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gICdzYWZhcmk6cGxhdGZvcm1CdWlsZFZlcnNpb24nOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTp1c2VTaW11bGF0b3InOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gICdzYWZhcmk6ZGV2aWNlVHlwZSc6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICAnc2FmYXJpOmRldmljZU5hbWUnOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTpkZXZpY2VVRElEJzoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gICdzYWZhcmk6YXV0b21hdGljSW5zcGVjdGlvbic6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgJ3NhZmFyaTphdXRvbWF0aWNQcm9maWxpbmcnOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gICd3ZWJraXQ6V2ViUlRDJzoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG59O1xuXG5leHBvcnQgeyBkZXNpcmVkQ2FwQ29uc3RyYWludHMgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLHFCQUFxQixHQUFHO0VBQzVCQyxXQUFXLEVBQUU7SUFDWEMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEQyxjQUFjLEVBQUU7SUFDZEQsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNELHdCQUF3QixFQUFFO0lBQ3hCQSxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QsNkJBQTZCLEVBQUU7SUFDN0JBLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRCxxQkFBcUIsRUFBRTtJQUNyQkUsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNELG1CQUFtQixFQUFFO0lBQ25CRixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QsbUJBQW1CLEVBQUU7SUFDbkJBLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRCxtQkFBbUIsRUFBRTtJQUNuQkEsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNELDRCQUE0QixFQUFFO0lBQzVCRSxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0QsMkJBQTJCLEVBQUU7SUFDM0JBLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRCxlQUFlLEVBQUU7SUFDZkMsUUFBUSxFQUFFO0VBQ1o7QUFDRixDQUFDO0FBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desired-caps.js","names":["desiredCapConstraints","browserName","isString","browserVersion","isBoolean","isObject"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["const desiredCapConstraints = {\n browserName: {\n isString: true,\n },\n browserVersion: {\n isString: true\n },\n 'safari:platformVersion': {\n isString: true\n },\n 'safari:platformBuildVersion': {\n isString: true\n },\n 'safari:useSimulator': {\n isBoolean: true\n },\n 'safari:deviceType': {\n isString: true\n },\n 'safari:deviceName': {\n isString: true\n },\n 'safari:deviceUDID': {\n isString: true\n },\n 'safari:automaticInspection': {\n isBoolean: true\n },\n 'safari:automaticProfiling': {\n isBoolean: true\n },\n 'webkit:WebRTC': {\n isObject: true\n },\n};\n\nexport { desiredCapConstraints };\n"],"mappings":";;;;;;;AAAA,MAAMA,qBAAqB,GAAG;EAC5BC,WAAW,EAAE;IACXC,QAAQ,EAAE;EACZ,CAAC;EACDC,cAAc,EAAE;IACdD,QAAQ,EAAE;EACZ,CAAC;EACD,wBAAwB,EAAE;IACxBA,QAAQ,EAAE;EACZ,CAAC;EACD,6BAA6B,EAAE;IAC7BA,QAAQ,EAAE;EACZ,CAAC;EACD,qBAAqB,EAAE;IACrBE,SAAS,EAAE;EACb,CAAC;EACD,mBAAmB,EAAE;IACnBF,QAAQ,EAAE;EACZ,CAAC;EACD,mBAAmB,EAAE;IACnBA,QAAQ,EAAE;EACZ,CAAC;EACD,mBAAmB,EAAE;IACnBA,QAAQ,EAAE;EACZ,CAAC;EACD,4BAA4B,EAAE;IAC5BE,SAAS,EAAE;EACb,CAAC;EACD,2BAA2B,EAAE;IAC3BA,SAAS,EAAE;EACb,CAAC;EACD,eAAe,EAAE;IACfC,QAAQ,EAAE;EACZ;AACF,CAAC;AAAC"}
|
package/build/lib/driver.js
CHANGED
|
@@ -1,89 +1,66 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _driver = require("appium/driver");
|
|
15
|
-
|
|
16
11
|
var _safari = _interopRequireDefault(require("./safari"));
|
|
17
|
-
|
|
18
12
|
var _desiredCaps = require("./desired-caps");
|
|
19
|
-
|
|
20
13
|
var _index = _interopRequireDefault(require("./commands/index"));
|
|
21
|
-
|
|
22
14
|
var _utils = require("./utils");
|
|
23
|
-
|
|
24
15
|
const NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/element/[^/]+/elements?$')], ['POST', new RegExp('^/session/[^/]+/elements?$')], ['DELETE', new RegExp('^/session/[^/]+/cookie$')]];
|
|
25
|
-
|
|
26
16
|
class SafariDriver extends _driver.BaseDriver {
|
|
27
17
|
constructor(opts = {}) {
|
|
28
18
|
super(opts);
|
|
29
19
|
this.desiredCapConstraints = _desiredCaps.desiredCapConstraints;
|
|
30
|
-
this.locatorStrategies = ['xpath', 'tag name', 'link text', 'partial link text', 'css selector',
|
|
20
|
+
this.locatorStrategies = ['xpath', 'tag name', 'link text', 'partial link text', 'css selector',
|
|
21
|
+
'id', 'name'];
|
|
31
22
|
this.resetState();
|
|
32
|
-
|
|
33
23
|
for (const [cmd, fn] of _lodash.default.toPairs(_index.default)) {
|
|
34
24
|
SafariDriver.prototype[cmd] = fn;
|
|
35
25
|
}
|
|
36
26
|
}
|
|
37
|
-
|
|
38
27
|
resetState() {
|
|
39
28
|
this.safari = null;
|
|
40
29
|
this.proxyReqRes = null;
|
|
41
30
|
this.isProxyActive = false;
|
|
42
31
|
this._screenRecorder = null;
|
|
43
32
|
}
|
|
44
|
-
|
|
45
33
|
proxyActive() {
|
|
46
34
|
return this.isProxyActive;
|
|
47
35
|
}
|
|
48
|
-
|
|
49
36
|
getProxyAvoidList() {
|
|
50
37
|
return NO_PROXY;
|
|
51
38
|
}
|
|
52
|
-
|
|
53
39
|
canProxy() {
|
|
54
40
|
return true;
|
|
55
41
|
}
|
|
56
|
-
|
|
57
42
|
async createSession(...args) {
|
|
58
43
|
const [sessionId, caps] = await super.createSession(...args);
|
|
59
44
|
this.safari = new _safari.default(this.log);
|
|
60
|
-
|
|
61
45
|
try {
|
|
62
46
|
await this.safari.start((0, _utils.formatCapsForServer)(caps));
|
|
63
47
|
} catch (e) {
|
|
64
48
|
await this.deleteSession();
|
|
65
49
|
throw e;
|
|
66
50
|
}
|
|
67
|
-
|
|
68
51
|
this.proxyReqRes = this.safari.proxy.proxyReqRes.bind(this.safari.proxy);
|
|
69
52
|
this.isProxyActive = true;
|
|
70
53
|
return [sessionId, caps];
|
|
71
54
|
}
|
|
72
|
-
|
|
73
55
|
async deleteSession() {
|
|
74
56
|
var _this$_screenRecorder, _this$safari;
|
|
75
|
-
|
|
76
57
|
this.log.info('Ending Safari session');
|
|
77
58
|
await ((_this$_screenRecorder = this._screenRecorder) === null || _this$_screenRecorder === void 0 ? void 0 : _this$_screenRecorder.stop(true));
|
|
78
59
|
await ((_this$safari = this.safari) === null || _this$safari === void 0 ? void 0 : _this$safari.stop());
|
|
79
60
|
this.resetState();
|
|
80
61
|
await super.deleteSession();
|
|
81
62
|
}
|
|
82
|
-
|
|
83
63
|
}
|
|
84
|
-
|
|
85
64
|
var _default = SafariDriver;
|
|
86
|
-
exports.default = _default;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2RyaXZlci5qcyIsIm5hbWVzIjpbIk5PX1BST1hZIiwiUmVnRXhwIiwiU2FmYXJpRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImxvY2F0b3JTdHJhdGVnaWVzIiwicmVzZXRTdGF0ZSIsImNtZCIsImZuIiwiXyIsInRvUGFpcnMiLCJjb21tYW5kcyIsInByb3RvdHlwZSIsInNhZmFyaSIsInByb3h5UmVxUmVzIiwiaXNQcm94eUFjdGl2ZSIsIl9zY3JlZW5SZWNvcmRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsIlNhZmFyaURyaXZlclNlcnZlciIsImxvZyIsInN0YXJ0IiwiZm9ybWF0Q2Fwc0ZvclNlcnZlciIsImUiLCJkZWxldGVTZXNzaW9uIiwicHJveHkiLCJiaW5kIiwiaW5mbyIsInN0b3AiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvZHJpdmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgU2FmYXJpRHJpdmVyU2VydmVyIGZyb20gJy4vc2FmYXJpJztcbmltcG9ydCB7IGRlc2lyZWRDYXBDb25zdHJhaW50cyB9IGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzL2luZGV4JztcbmltcG9ydCB7IGZvcm1hdENhcHNGb3JTZXJ2ZXIgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZWxlbWVudHM/JCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnRzPyQnKV0sXG5cbiAgWydERUxFVEUnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29va2llJCcpXSxcbl07XG5cbmNsYXNzIFNhZmFyaURyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIob3B0cyk7XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICd4cGF0aCcsXG4gICAgICAndGFnIG5hbWUnLFxuICAgICAgJ2xpbmsgdGV4dCcsXG4gICAgICAncGFydGlhbCBsaW5rIHRleHQnLFxuICAgICAgJ2NzcyBzZWxlY3RvcicsXG4gICAgICAvLyBMZXQgdGhlc2UgdHdvIHJlYWNoIFNhZmFyaSBEcml2ZXIgYW5kIGZhaWwgdGhlcmUgd2l0aCBhIHByb3BlciBlcnJvciBtZXNzYWdlXG4gICAgICAnaWQnLFxuICAgICAgJ25hbWUnLFxuICAgIF07XG4gICAgdGhpcy5yZXNldFN0YXRlKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gICAgICBTYWZhcmlEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbiAgICB9XG4gIH1cblxuICByZXNldFN0YXRlICgpIHtcbiAgICB0aGlzLnNhZmFyaSA9IG51bGw7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IG51bGw7XG4gICAgdGhpcy5pc1Byb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fc2NyZWVuUmVjb3JkZXIgPSBudWxsO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKCkge1xuICAgIHJldHVybiB0aGlzLmlzUHJveHlBY3RpdmU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoKSB7XG4gICAgcmV0dXJuIE5PX1BST1hZO1xuICB9XG5cbiAgY2FuUHJveHkgKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIGNvbnN0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcbiAgICB0aGlzLnNhZmFyaSA9IG5ldyBTYWZhcmlEcml2ZXJTZXJ2ZXIodGhpcy5sb2cpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNhZmFyaS5zdGFydChmb3JtYXRDYXBzRm9yU2VydmVyKGNhcHMpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnNhZmFyaS5wcm94eS5wcm94eVJlcVJlcy5iaW5kKHRoaXMuc2FmYXJpLnByb3h5KTtcbiAgICB0aGlzLmlzUHJveHlBY3RpdmUgPSB0cnVlO1xuICAgIHJldHVybiBbc2Vzc2lvbklkLCBjYXBzXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ0VuZGluZyBTYWZhcmkgc2Vzc2lvbicpO1xuICAgIGF3YWl0IHRoaXMuX3NjcmVlblJlY29yZGVyPy5zdG9wKHRydWUpO1xuICAgIGF3YWl0IHRoaXMuc2FmYXJpPy5zdG9wKCk7XG4gICAgdGhpcy5yZXNldFN0YXRlKCk7XG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGVTZXNzaW9uKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2FmYXJpRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNB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
|
|
65
|
+
exports.default = _default;
|
|
66
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT19QUk9YWSIsIlJlZ0V4cCIsIlNhZmFyaURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJsb2NhdG9yU3RyYXRlZ2llcyIsInJlc2V0U3RhdGUiLCJjbWQiLCJmbiIsIl8iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJzYWZhcmkiLCJwcm94eVJlcVJlcyIsImlzUHJveHlBY3RpdmUiLCJfc2NyZWVuUmVjb3JkZXIiLCJwcm94eUFjdGl2ZSIsImdldFByb3h5QXZvaWRMaXN0IiwiY2FuUHJveHkiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsImNhcHMiLCJTYWZhcmlEcml2ZXJTZXJ2ZXIiLCJsb2ciLCJzdGFydCIsImZvcm1hdENhcHNGb3JTZXJ2ZXIiLCJlIiwiZGVsZXRlU2Vzc2lvbiIsInByb3h5IiwiYmluZCIsImluZm8iLCJzdG9wIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2RyaXZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZURyaXZlciB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IFNhZmFyaURyaXZlclNlcnZlciBmcm9tICcuL3NhZmFyaSc7XG5pbXBvcnQgeyBkZXNpcmVkQ2FwQ29uc3RyYWludHMgfSBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBmb3JtYXRDYXBzRm9yU2VydmVyIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2VsZW1lbnRzPyQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50cz8kJyldLFxuXG4gIFsnREVMRVRFJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2Nvb2tpZSQnKV0sXG5dO1xuXG5jbGFzcyBTYWZhcmlEcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIHN1cGVyKG9wdHMpO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ3RhZyBuYW1lJyxcbiAgICAgICdsaW5rIHRleHQnLFxuICAgICAgJ3BhcnRpYWwgbGluayB0ZXh0JyxcbiAgICAgICdjc3Mgc2VsZWN0b3InLFxuICAgICAgLy8gTGV0IHRoZXNlIHR3byByZWFjaCBTYWZhcmkgRHJpdmVyIGFuZCBmYWlsIHRoZXJlIHdpdGggYSBwcm9wZXIgZXJyb3IgbWVzc2FnZVxuICAgICAgJ2lkJyxcbiAgICAgICduYW1lJyxcbiAgICBdO1xuICAgIHRoaXMucmVzZXRTdGF0ZSgpO1xuXG4gICAgZm9yIChjb25zdCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICAgICAgU2FmYXJpRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTdGF0ZSAoKSB7XG4gICAgdGhpcy5zYWZhcmkgPSBudWxsO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICAgIHRoaXMuaXNQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3NjcmVlblJlY29yZGVyID0gbnVsbDtcbiAgfVxuXG4gIHByb3h5QWN0aXZlICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKCkge1xuICAgIHJldHVybiBOT19QUk9YWTtcbiAgfVxuXG4gIGNhblByb3h5ICgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG4gICAgdGhpcy5zYWZhcmkgPSBuZXcgU2FmYXJpRHJpdmVyU2VydmVyKHRoaXMubG9nKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zYWZhcmkuc3RhcnQoZm9ybWF0Q2Fwc0ZvclNlcnZlcihjYXBzKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5zYWZhcmkucHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLnNhZmFyaS5wcm94eSk7XG4gICAgdGhpcy5pc1Byb3h5QWN0aXZlID0gdHJ1ZTtcbiAgICByZXR1cm4gW3Nlc3Npb25JZCwgY2Fwc107XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdFbmRpbmcgU2FmYXJpIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLl9zY3JlZW5SZWNvcmRlcj8uc3RvcCh0cnVlKTtcbiAgICBhd2FpdCB0aGlzLnNhZmFyaT8uc3RvcCgpO1xuICAgIHRoaXMucmVzZXRTdGF0ZSgpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNhZmFyaURyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FDZixDQUFDLEtB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","names":["NO_PROXY","RegExp","SafariDriver","BaseDriver","constructor","opts","desiredCapConstraints","locatorStrategies","resetState","cmd","fn","_","toPairs","commands","prototype","safari","proxyReqRes","isProxyActive","_screenRecorder","proxyActive","getProxyAvoidList","canProxy","createSession","args","sessionId","caps","SafariDriverServer","log","start","formatCapsForServer","e","deleteSession","proxy","bind","info","stop"],"sources":["../../lib/driver.js"],"sourcesContent":["import _ from 'lodash';\nimport { BaseDriver } from 'appium/driver';\nimport SafariDriverServer from './safari';\nimport { desiredCapConstraints } from './desired-caps';\nimport commands from './commands/index';\nimport { formatCapsForServer } from './utils';\n\nconst NO_PROXY = [\n ['GET', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/appium')],\n ['POST', new RegExp('^/session/[^/]+/element/[^/]+/elements?$')],\n ['POST', new RegExp('^/session/[^/]+/elements?$')],\n\n ['DELETE', new RegExp('^/session/[^/]+/cookie$')],\n];\n\nclass SafariDriver extends BaseDriver {\n constructor (opts = {}) {\n super(opts);\n this.desiredCapConstraints = desiredCapConstraints;\n this.locatorStrategies = [\n 'xpath',\n 'tag name',\n 'link text',\n 'partial link text',\n 'css selector',\n // Let these two reach Safari Driver and fail there with a proper error message\n 'id',\n 'name',\n ];\n this.resetState();\n\n for (const [cmd, fn] of _.toPairs(commands)) {\n SafariDriver.prototype[cmd] = fn;\n }\n }\n\n resetState () {\n this.safari = null;\n this.proxyReqRes = null;\n this.isProxyActive = false;\n this._screenRecorder = null;\n }\n\n proxyActive () {\n return this.isProxyActive;\n }\n\n getProxyAvoidList () {\n return NO_PROXY;\n }\n\n canProxy () {\n return true;\n }\n\n async createSession (...args) {\n const [sessionId, caps] = await super.createSession(...args);\n this.safari = new SafariDriverServer(this.log);\n try {\n await this.safari.start(formatCapsForServer(caps));\n } catch (e) {\n await this.deleteSession();\n throw e;\n }\n this.proxyReqRes = this.safari.proxy.proxyReqRes.bind(this.safari.proxy);\n this.isProxyActive = true;\n return [sessionId, caps];\n }\n\n async deleteSession () {\n this.log.info('Ending Safari session');\n await this._screenRecorder?.stop(true);\n await this.safari?.stop();\n this.resetState();\n\n await super.deleteSession();\n }\n}\n\nexport default SafariDriver;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAMA,QAAQ,GAAG,CACf,CAAC,KAAK,EAAE,IAAIC,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC7C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAC9C,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,0CAA0C,CAAC,CAAC,EAChE,CAAC,MAAM,EAAE,IAAIA,MAAM,CAAC,4BAA4B,CAAC,CAAC,EAElD,CAAC,QAAQ,EAAE,IAAIA,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAClD;AAED,MAAMC,YAAY,SAASC,kBAAU,CAAC;EACpCC,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;IACtB,KAAK,CAACA,IAAI,CAAC;IACX,IAAI,CAACC,qBAAqB,GAAGA,kCAAqB;IAClD,IAAI,CAACC,iBAAiB,GAAG,CACvB,OAAO,EACP,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,cAAc;IAEd,IAAI,EACJ,MAAM,CACP;IACD,IAAI,CAACC,UAAU,EAAE;IAEjB,KAAK,MAAM,CAACC,GAAG,EAAEC,EAAE,CAAC,IAAIC,eAAC,CAACC,OAAO,CAACC,cAAQ,CAAC,EAAE;MAC3CX,YAAY,CAACY,SAAS,CAACL,GAAG,CAAC,GAAGC,EAAE;IAClC;EACF;EAEAF,UAAU,GAAI;IACZ,IAAI,CAACO,MAAM,GAAG,IAAI;IAClB,IAAI,CAACC,WAAW,GAAG,IAAI;IACvB,IAAI,CAACC,aAAa,GAAG,KAAK;IAC1B,IAAI,CAACC,eAAe,GAAG,IAAI;EAC7B;EAEAC,WAAW,GAAI;IACb,OAAO,IAAI,CAACF,aAAa;EAC3B;EAEAG,iBAAiB,GAAI;IACnB,OAAOpB,QAAQ;EACjB;EAEAqB,QAAQ,GAAI;IACV,OAAO,IAAI;EACb;EAEA,MAAMC,aAAa,CAAE,GAAGC,IAAI,EAAE;IAC5B,MAAM,CAACC,SAAS,EAAEC,IAAI,CAAC,GAAG,MAAM,KAAK,CAACH,aAAa,CAAC,GAAGC,IAAI,CAAC;IAC5D,IAAI,CAACR,MAAM,GAAG,IAAIW,eAAkB,CAAC,IAAI,CAACC,GAAG,CAAC;IAC9C,IAAI;MACF,MAAM,IAAI,CAACZ,MAAM,CAACa,KAAK,CAAC,IAAAC,0BAAmB,EAACJ,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM,IAAI,CAACC,aAAa,EAAE;MAC1B,MAAMD,CAAC;IACT;IACA,IAAI,CAACd,WAAW,GAAG,IAAI,CAACD,MAAM,CAACiB,KAAK,CAAChB,WAAW,CAACiB,IAAI,CAAC,IAAI,CAAClB,MAAM,CAACiB,KAAK,CAAC;IACxE,IAAI,CAACf,aAAa,GAAG,IAAI;IACzB,OAAO,CAACO,SAAS,EAAEC,IAAI,CAAC;EAC1B;EAEA,MAAMM,aAAa,GAAI;IAAA;IACrB,IAAI,CAACJ,GAAG,CAACO,IAAI,CAAC,uBAAuB,CAAC;IACtC,gCAAM,IAAI,CAAChB,eAAe,0DAApB,sBAAsBiB,IAAI,CAAC,IAAI,CAAC;IACtC,uBAAM,IAAI,CAACpB,MAAM,iDAAX,aAAaoB,IAAI,EAAE;IACzB,IAAI,CAAC3B,UAAU,EAAE;IAEjB,MAAM,KAAK,CAACuB,aAAa,EAAE;EAC7B;AACF;AAAC,eAEc7B,YAAY;AAAA"}
|
package/build/lib/logger.js
CHANGED
|
@@ -4,15 +4,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
var _support = require("appium/support");
|
|
11
|
-
|
|
12
9
|
const log = _support.logger.getLogger('Safari');
|
|
13
|
-
|
|
14
10
|
var _default = log;
|
|
15
|
-
exports.default = _default;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2xvZ2dlci5qcyIsIm5hbWVzIjpbImxvZyIsImxvZ2dlciIsImdldExvZ2dlciJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdTYWZhcmknKTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLGVBQUEsQ0FBT0MsU0FBUCxDQUFpQixRQUFqQixDQUFaOztlQUVlRixHIn0=
|
|
11
|
+
exports.default = _default;
|
|
12
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignU2FmYXJpJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFBQyxlQUV4QkYsR0FBRztBQUFBIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","names":["log","logger","getLogger"],"sources":["../../lib/logger.js"],"sourcesContent":["import { logger } from 'appium/support';\n\nconst log = logger.getLogger('Safari');\n\nexport default log;\n"],"mappings":";;;;;;;AAAA;AAEA,MAAMA,GAAG,GAAGC,eAAM,CAACC,SAAS,CAAC,QAAQ,CAAC;AAAC,eAExBF,GAAG;AAAA"}
|