appium-xcuitest-driver 3.59.1 → 3.59.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -28,12 +28,11 @@ On top of standard Appium requirements XCUITest driver also expects the followin
28
28
  - Web views must be debuggable in order to test them. If it is not possible to connect to your web view(s) using [Safari remote debugger](https://appletoolbox.com/use-web-inspector-debug-mobile-safari/) then XCUITest won't be able to connect to them as well.
29
29
  - Since version 3.33.0 (included into Appium 1.20.0+) of XCUITest driver the [Carthage](https://github.com/Carthage/Carthage) dependency *is not needed anymore*. Prior to that version it was required and could be installed using [brew](https://brew.sh/): `brew install carthage`.
30
30
 
31
-
32
31
  ## Optional dependencies
33
32
 
34
33
  - [xcpretty](https://github.com/supermarin/xcpretty) tool could be used to make Xcode output easier to read. It could be installed using `gem install xcpretty` command.
35
34
  - For test video recording we use [ffmpeg](https://ffmpeg.org/). It could be installed using [brew](https://brew.sh/): `brew install ffmpeg`
36
- - Facebook's [IDB](https://github.com/facebook/idb) tool could be used to improve some real device/Simulator interactions
35
+ - [IDB](https://github.com/facebook/idb), [go-ios](https://github.com/danielpaulus/go-ios) and [tidevice](https://github.com/alibaba/taobao-iphone-device) could be used to improve some real device/Simulator interactions
37
36
  - [WIX AppleSimulatorUtils](https://github.com/wix/AppleSimulatorUtils) could be used to improve some Simulator interactions
38
37
 
39
38
 
@@ -53,7 +52,9 @@ See [real device configuration documentation](docs/real-device-config.md).
53
52
 
54
53
  ### Known problems
55
54
 
56
- After many failures on real devices it could transition to a state where connections are no longer being accepted. To possibly remedy this issue reboot the device. Read https://github.com/facebook/WebDriverAgent/issues/507 for more details.
55
+ - After many failures on real devices it could transition to a state where connections are no longer being accepted. To possibly remedy this issue reboot the device. Read https://github.com/facebook/WebDriverAgent/issues/507 for more details.
56
+ - iPhone/iPad real devices show overlay, which has `Automation Running Hold both volume buttons to stop` text, since iOS/iPadOS 15. This is a known limitation of XCTest framework. This limitation does not affect screenshooting APIs though (e.g. the overlay is not visible on taken screenshots).
57
+ - iPhone/iPad real devices [require passcode or touch id](https://github.com/appium/appium/issues/15898#issuecomment-927340411) when they start a XCTest session since iOS/iPadOS 15. Disabling passcode/touch id in the device preference allows to workaround the behaviour above.
57
58
 
58
59
  #### Weird state
59
60
 
@@ -39,33 +39,62 @@ async function pullFile(afcService, remotePath) {
39
39
  return Buffer.concat(buffers);
40
40
  }
41
41
 
42
+ async function folderExists(folderPath) {
43
+ try {
44
+ return (await _appiumSupport.fs.stat(folderPath)).isDirectory();
45
+ } catch (e) {
46
+ return false;
47
+ }
48
+ }
49
+
42
50
  async function pullFolder(afcService, remoteRootPath) {
43
51
  const tmpFolder = await _appiumSupport.tempDir.openDir();
44
52
 
45
53
  try {
54
+ let localTopItem = null;
55
+ let countFilesSuccess = 0;
56
+ let countFilesFail = 0;
57
+ let countFolders = 0;
46
58
  const pullPromises = [];
47
- await afcService.walkDir(remoteRootPath, true, async (itemPath, isDir) => {
48
- const pathOnServer = _path.default.join(tmpFolder, itemPath);
59
+ await afcService.walkDir(remoteRootPath, true, async (remotePath, isDir) => {
60
+ const localPath = _path.default.join(tmpFolder, remotePath);
61
+
62
+ const dirname = isDir ? localPath : _path.default.dirname(localPath);
63
+
64
+ if (!(await folderExists(dirname))) {
65
+ await (0, _appiumSupport.mkdirp)(dirname);
66
+ }
67
+
68
+ if (!localTopItem || localPath.split(_path.default.sep).length < localTopItem.split(_path.default.sep).length) {
69
+ localTopItem = localPath;
70
+ }
49
71
 
50
72
  if (isDir) {
51
- await (0, _appiumSupport.mkdirp)(pathOnServer);
73
+ ++countFolders;
52
74
  return;
53
75
  }
54
76
 
55
- const readStream = await afcService.createReadStream(itemPath, {
77
+ const readStream = await afcService.createReadStream(remotePath, {
56
78
  autoDestroy: true
57
79
  });
58
80
 
59
- const writeStream = _appiumSupport.fs.createWriteStream(pathOnServer, {
81
+ const writeStream = _appiumSupport.fs.createWriteStream(localPath, {
60
82
  autoClose: true
61
83
  });
62
84
 
63
- pullPromises.push(new _bluebird.default((resolve, reject) => {
64
- writeStream.on('close', resolve);
85
+ pullPromises.push(new _bluebird.default(resolve => {
86
+ writeStream.on('close', () => {
87
+ ++countFilesSuccess;
88
+ resolve();
89
+ });
65
90
 
66
91
  const onStreamingError = e => {
67
92
  readStream.unpipe(writeStream);
68
- reject(e);
93
+
94
+ _logger.default.warn(`Cannot pull '${remotePath}' to '${localPath}'. ` + `The file will be skipped. Original error: ${e.message}`);
95
+
96
+ ++countFilesFail;
97
+ resolve();
69
98
  };
70
99
 
71
100
  writeStream.on('error', onStreamingError);
@@ -79,8 +108,14 @@ async function pullFolder(afcService, remoteRootPath) {
79
108
 
80
109
  _lodash.default.remove(pullPromises, p => p.isFulfilled());
81
110
  });
82
- await _bluebird.default.all(pullPromises);
83
- return await _appiumSupport.zip.toInMemoryZip(tmpFolder, {
111
+
112
+ if (!_lodash.default.isEmpty(pullPromises)) {
113
+ await _bluebird.default.all(pullPromises);
114
+ }
115
+
116
+ _logger.default.info(`Pulled ${_appiumSupport.util.pluralize('file', countFilesSuccess, true)} out of ` + `${countFilesSuccess + countFilesFail} and ${_appiumSupport.util.pluralize('folder', countFolders, true)} ` + `from '${remoteRootPath}'`);
117
+
118
+ return await _appiumSupport.zip.toInMemoryZip(localTopItem ? _path.default.dirname(localTopItem) : tmpFolder, {
84
119
  encodeToBase64: true
85
120
  });
86
121
  } finally {
@@ -232,4 +267,4 @@ async function pushFolder(afcService, srcRootPath, dstRootPath, opts = {}) {
232
267
  }require('source-map-support').install();
233
268
 
234
269
 
235
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pb3MtZnMtaGVscGVycy5qcyJdLCJuYW1lcyI6WyJJT19USU1FT1VUX01TIiwiTUFYX0lPX0NIVU5LX1NJWkUiLCJwdWxsRmlsZSIsImFmY1NlcnZpY2UiLCJyZW1vdGVQYXRoIiwic3RyZWFtIiwiY3JlYXRlUmVhZFN0cmVhbSIsImF1dG9EZXN0cm95IiwicHVsbFByb21pc2UiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidGltZW91dCIsImJ1ZmZlcnMiLCJkYXRhIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsInB1bGxGb2xkZXIiLCJyZW1vdGVSb290UGF0aCIsInRtcEZvbGRlciIsInRlbXBEaXIiLCJvcGVuRGlyIiwicHVsbFByb21pc2VzIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXIiLCJwYXRoT25TZXJ2ZXIiLCJwYXRoIiwiam9pbiIsInJlYWRTdHJlYW0iLCJ3cml0ZVN0cmVhbSIsImZzIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJhdXRvQ2xvc2UiLCJvblN0cmVhbWluZ0Vycm9yIiwiZSIsInVucGlwZSIsInBpcGUiLCJsZW5ndGgiLCJhbnkiLCJfIiwicmVtb3ZlIiwicCIsImlzRnVsZmlsbGVkIiwiYWxsIiwiemlwIiwidG9Jbk1lbW9yeVppcCIsImVuY29kZVRvQmFzZTY0IiwicmltcmFmIiwicmVtb3RlTWtkaXJwIiwicmVtb3RlUm9vdCIsImxpc3REaXJlY3RvcnkiLCJkaXJuYW1lIiwiY3JlYXRlRGlyZWN0b3J5IiwicHVzaEZpbGUiLCJiYXNlNjREYXRhIiwicHVzaEVycm9yIiwicHVzaFByb21pc2UiLCJ3cml0ZSIsImZyb20iLCJlbmQiLCJwdXNoRm9sZGVyIiwic3JjUm9vdFBhdGgiLCJkc3RSb290UGF0aCIsIm9wdHMiLCJ0aW1lb3V0TXMiLCJlbmFibGVQYXJhbGxlbFB1c2giLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJpdGVtc1RvUHVzaCIsImdsb2IiLCJjd2QiLCJub3NvcnQiLCJtYXJrIiwibG9nIiwiZGVidWciLCJmb2xkZXJzVG9QdXNoIiwiZmlsZXNUb1B1c2giLCJyZWR1Y2UiLCJhY2MiLCJ4IiwiZW5kc1dpdGgiLCJzZXAiLCJ1dGlsIiwicGx1cmFsaXplIiwiZGVsZXRlRGlyZWN0b3J5IiwiaWduIiwiZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5Iiwic29ydCIsImEiLCJiIiwic3BsaXQiLCJyZWxhdGl2ZUZvbGRlclBhdGgiLCJhYnNvbHV0ZUZvbGRlclBhdGgiLCJ0cmltRW5kIiwicmVsYXRpdmVQYXRoIiwiYWJzb2x1dGVTb3VyY2VQYXRoIiwiYWJzb2x1dGVEZXN0aW5hdGlvblBhdGgiLCJkZXN0cm95IiwiZmlsZVB1c2hQcm9taXNlIiwib25TdHJlYW1FcnJvciIsInB1c2hQcm9taXNlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJzaHVmZmxlIiwiaXNFbXB0eSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxJQUFJLEVBQUosR0FBUyxJQUEvQjtBQUdBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCOztBQVVBLGVBQWVDLFFBQWYsQ0FBeUJDLFVBQXpCLEVBQXFDQyxVQUFyQyxFQUFpRDtBQUMvQyxRQUFNQyxNQUFNLEdBQUcsTUFBTUYsVUFBVSxDQUFDRyxnQkFBWCxDQUE0QkYsVUFBNUIsRUFBd0M7QUFBRUcsSUFBQUEsV0FBVyxFQUFFO0FBQWYsR0FBeEMsQ0FBckI7QUFDQSxRQUFNQyxXQUFXLEdBQUcsSUFBSUMsaUJBQUosQ0FBTSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDN0NOLElBQUFBLE1BQU0sQ0FBQ08sRUFBUCxDQUFVLE9BQVYsRUFBbUJGLE9BQW5CO0FBQ0FMLElBQUFBLE1BQU0sQ0FBQ08sRUFBUCxDQUFVLE9BQVYsRUFBbUJELE1BQW5CO0FBQ0QsR0FIbUIsRUFHakJFLE9B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RDtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBta2RpcnAsIHppcCwgdXRpbCwgdGltaW5nIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuY29uc3QgSU9fVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG4vLyBNb2JpbGUgZGV2aWNlcyB1c2UgTkFORCBtZW1vcnkgbW9kdWxlcyBmb3IgdGhlIHN0b3JhZ2UsXG4vLyBhbmQgdGhlIHBhcmFsbGVsaXNtIHRoZXJlIGlzIG5vdCBhcyBwZXJmb3JtYW50IGFzIG9uIHJlZ3VsYXIgU1NEc1xuY29uc3QgTUFYX0lPX0NIVU5LX1NJWkUgPSA4O1xuXG4vKipcbiAqIFJldHJpZXZlIGEgZmlsZSBmcm9tIGEgcmVhbCBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggUmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgZGV2aWNlXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBUaGUgZmlsZSBjb250ZW50IGFzIGEgYnVmZmVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxGaWxlIChhZmNTZXJ2aWNlLCByZW1vdGVQYXRoKSB7XG4gIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlUmVhZFN0cmVhbShyZW1vdGVQYXRoLCB7IGF1dG9EZXN0cm95OiB0cnVlIH0pO1xuICBjb25zdCBwdWxsUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzdHJlYW0ub24oJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pLnRpbWVvdXQoSU9fVElNRU9VVF9NUyk7XG4gIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgc3RyZWFtLm9uKCdkYXRhJywgKGRhdGEpID0+IGJ1ZmZlcnMucHVzaChkYXRhKSk7XG4gIGF3YWl0IHB1bGxQcm9taXNlO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBhIGZvbGRlciBmcm9tIGEgcmVhbCBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVJvb3RQYXRoIFJlbGF0aXZlIHBhdGggdG8gdGhlIGZvbGRlciBvbiB0aGUgZGV2aWNlXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBUaGUgZm9sZGVyIGNvbnRlbnQgYXMgYSB6aXBwZWQgYmFzZTY0LWVuY29kZWQgYnVmZmVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxGb2xkZXIgKGFmY1NlcnZpY2UsIHJlbW90ZVJvb3RQYXRoKSB7XG4gIGNvbnN0IHRtcEZvbGRlciA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICB0cnkge1xuICAgIGNvbnN0IHB1bGxQcm9taXNlcyA9IFtdO1xuICAgIGF3YWl0IGFmY1NlcnZpY2Uud2Fsa0RpcihyZW1vdGVSb290UGF0aCwgdHJ1ZSwgYXN5bmMgKGl0ZW1QYXRoLCBpc0RpcikgPT4ge1xuICAgICAgY29uc3QgcGF0aE9uU2VydmVyID0gcGF0aC5qb2luKHRtcEZvbGRlciwgaXRlbVBhdGgpO1xuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgIGF3YWl0IG1rZGlycChwYXRoT25TZXJ2ZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZVJlYWRTdHJlYW0oaXRlbVBhdGgsIHthdXRvRGVzdHJveTogdHJ1ZX0pO1xuICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShwYXRoT25TZXJ2ZXIsIHthdXRvQ2xvc2U6IHRydWV9KTtcbiAgICAgIHB1bGxQcm9taXNlcy5wdXNoKG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICAgIGNvbnN0IG9uU3RyZWFtaW5nRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH07XG4gICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsIG9uU3RyZWFtaW5nRXJyb3IpO1xuICAgICAgICByZWFkU3RyZWFtLm9uKCdlcnJvcicsIG9uU3RyZWFtaW5nRXJyb3IpO1xuICAgICAgfSkudGltZW91dChJT19USU1FT1VUX01TKSk7XG4gICAgICByZWFkU3RyZWFtLnBpcGUod3JpdGVTdHJlYW0pO1xuICAgICAgaWYgKHB1bGxQcm9taXNlcy5sZW5ndGggPj0gTUFYX0lPX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgYXdhaXQgQi5hbnkocHVsbFByb21pc2VzKTtcbiAgICAgIH1cbiAgICAgIF8ucmVtb3ZlKHB1bGxQcm9taXNlcywgKHApID0+IHAuaXNGdWxmaWxsZWQoKSk7XG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNodW5rc1xuICAgIGF3YWl0IEIuYWxsKHB1bGxQcm9taXNlcyk7XG4gICAgcmV0dXJuIGF3YWl0IHppcC50b0luTWVtb3J5WmlwKHRtcEZvbGRlciwge1xuICAgICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcEZvbGRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHJlbW90ZSBmb2xkZXIgcGF0aCByZWN1cnNpdmVseS4gTm9vcCBpZiB0aGUgZ2l2ZW4gcGF0aFxuICogYWxyZWFkeSBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVJvb3QgVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJlbW90ZSBmb2xkZXIgc3RydWN0dXJlXG4gKiB0byBiZSBjcmVhdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW90ZU1rZGlycCAoYWZjU2VydmljZSwgcmVtb3RlUm9vdCkge1xuICBpZiAocmVtb3RlUm9vdCA9PT0gJy4nIHx8IHJlbW90ZVJvb3QgPT09ICcvJykge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFmY1NlcnZpY2UubGlzdERpcmVjdG9yeShyZW1vdGVSb290KTtcbiAgICByZXR1cm47XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBtaXNzaW5nIGFuZCB3ZSBnb3QgYW4gb2JqZWN0IG5vdCBmb3VuZCBlcnJvci5cbiAgICAvLyBUaGVyZWZvcmUsIHdlIGFyZSBnb2luZyB0byB0aGUgcGFyZW50XG4gICAgYXdhaXQgcmVtb3RlTWtkaXJwKGFmY1NlcnZpY2UsIHBhdGguZGlybmFtZShyZW1vdGVSb290KSk7XG4gIH1cbiAgYXdhaXQgYWZjU2VydmljZS5jcmVhdGVEaXJlY3RvcnkocmVtb3RlUm9vdCk7XG59XG5cbi8qKlxuICogUHVzaGVzIGEgZmlsZSB0byBhIHJlYWwgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGRldmljZS4gVGhlIHJlbW90ZVxuICogZm9sZGVyIHN0cnVjdHVyZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbmVjZXNzYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSB3cml0dGVuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1c2hGaWxlIChhZmNTZXJ2aWNlLCByZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGF3YWl0IHJlbW90ZU1rZGlycChhZmNTZXJ2aWNlLCBwYXRoLmRpcm5hbWUocmVtb3RlUGF0aCkpO1xuICBjb25zdCBzdHJlYW0gPSBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZVdyaXRlU3RyZWFtKHJlbW90ZVBhdGgsIHthdXRvRGVzdHJveTogdHJ1ZX0pO1xuICBsZXQgcHVzaEVycm9yID0gbnVsbDtcbiAgY29uc3QgcHVzaFByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICBwdXNoRXJyb3IgPSBlO1xuICAgIH0pO1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBpZiAocHVzaEVycm9yKSB7XG4gICAgICAgIHJlamVjdChwdXNoRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KS50aW1lb3V0KElPX1RJTUVPVVRfTVMpO1xuICBzdHJlYW0ud3JpdGUoQnVmZmVyLmZyb20oYmFzZTY0RGF0YSwgJ2Jhc2U2NCcpKTtcbiAgc3RyZWFtLmVuZCgpO1xuICBhd2FpdCBwdXNoUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoRm9sZGVyT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzI0MDAwMF0gVGhlIG1heGltdW0gdGltZW91dCB0byB3YWl0IHVudGlsIGFcbiAqIHNpbmdsZSBmaWxlIGlzIGNvcGllZFxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVQYXJhbGxlbFB1c2ggW2ZhbHNlXSBXaGV0aGVyIHRvIHB1c2ggZmlsZXMgaW4gcGFyYWxsZWwuXG4gKiBUaGlzIHVzdWFsbHkgZ2l2ZXMgYmV0dGVyIHBlcmZvcm1hbmNlLCBidXQgbWlnaHQgc29tZXRpbWVzIGJlIGxlc3Mgc3RhYmxlLlxuICovXG5cbi8qKlxuICogUHVzaGVzIGEgZm9sZGVyIHRvIGEgcmVhbCBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FmY1NlcnZpY2V9IGFmY1NlcnZpY2UgQXBwbGUgRmlsZSBDbGllbnQgc2VydmljZSBpbnN0YW5jZSBmcm9tXG4gKiAnYXBwaXVtLWlvcy1kZXZpY2UnIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1Jvb3RQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHNvdXJjZSBmb2xkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBkc3RSb290UGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyLiBUaGUgZm9sZGVyXG4gKiB3aWxsIGJlIGRlbGV0ZWQgaWYgYWxyZWFkeSBleGlzdHMuXG4gKiBAcGFyYW0ge1B1c2hGb2xkZXJPcHRpb25zfSBvcHRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1c2hGb2xkZXIgKGFmY1NlcnZpY2UsIHNyY1Jvb3RQYXRoLCBkc3RSb290UGF0aCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aW1lb3V0TXMgPSBJT19USU1FT1VUX01TLFxuICAgIGVuYWJsZVBhcmFsbGVsUHVzaCA9IGZhbHNlLFxuICB9ID0gb3B0cztcblxuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICBjb25zdCBpdGVtc1RvUHVzaCA9IGF3YWl0IGZzLmdsb2IoJyoqJywge1xuICAgIGN3ZDogc3JjUm9vdFBhdGgsXG4gICAgbm9zb3J0OiB0cnVlLFxuICAgIG1hcms6IHRydWUsXG4gIH0pO1xuICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSBzY2FubmVkIHRoZSB0cmVlIHN0cnVjdHVyZSBvZiAnJHtzcmNSb290UGF0aH0nYCk7XG4gIGNvbnN0IFtmb2xkZXJzVG9QdXNoLCBmaWxlc1RvUHVzaF0gPSBpdGVtc1RvUHVzaC5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgIGFjY1tfLmVuZHNXaXRoKHgsIHBhdGguc2VwKSA/IDAgOiAxXS5wdXNoKHgpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIFtbXSwgW11dKTtcbiAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZm9sZGVyJywgZm9sZGVyc1RvUHVzaC5sZW5ndGgsIHRydWUpfSBhbmQgYCArXG4gICAgYCR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBmaWxlc1RvUHVzaC5sZW5ndGgsIHRydWUpfSB0byBwdXNoYCk7XG4gIC8vIGNyZWF0ZSB0aGUgZm9sZGVyIHN0cnVjdHVyZSBmaXJzdFxuICB0cnkge1xuICAgIGF3YWl0IGFmY1NlcnZpY2UuZGVsZXRlRGlyZWN0b3J5KGRzdFJvb3RQYXRoKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuICBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZURpcmVjdG9yeShkc3RSb290UGF0aCk7XG4gIC8vIHRvcC1sZXZlbCBmb2xkZXJzIG11c3QgZ28gZmlyc3RcbiAgY29uc3QgZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5ID0gZm9sZGVyc1RvUHVzaFxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggLSBiLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlRm9sZGVyUGF0aCBvZiBmb2xkZXJzVG9QdXNoQnlIaWVyYXJjaHkpIHtcbiAgICAvLyBjcmVhdGVEaXJlY3RvcnkgZG9lcyBub3QgYWNjZXB0IGZvbGRlciBuYW1lcyBlbmRpbmcgd2l0aCBhIHBhdGggc2VwYXJhdG9yXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXJQYXRoID0gXy50cmltRW5kKFxuICAgICAgcGF0aC5qb2luKGRzdFJvb3RQYXRoLCByZWxhdGl2ZUZvbGRlclBhdGgpLCBwYXRoLnNlcFxuICAgICk7XG4gICAgaWYgKGFic29sdXRlRm9sZGVyUGF0aCkge1xuICAgICAgYXdhaXQgYWZjU2VydmljZS5jcmVhdGVEaXJlY3RvcnkoYWJzb2x1dGVGb2xkZXJQYXRoKTtcbiAgICB9XG4gIH1cbiAgLy8gZG8gbm90IGZvcmdldCBhYm91dCB0aGUgcm9vdCBmb2xkZXJcbiAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgY3JlYXRlZCB0aGUgcmVtb3RlIGZvbGRlciBzdHJ1Y3R1cmUgYCArXG4gICAgYCgke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZm9sZGVyc1RvUHVzaC5sZW5ndGggKyAxLCB0cnVlKX0pYCk7XG5cbiAgY29uc3QgcHVzaEZpbGUgPSBhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVTb3VyY2VQYXRoID0gcGF0aC5qb2luKHNyY1Jvb3RQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGFic29sdXRlU291cmNlUGF0aCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgIGNvbnN0IGFic29sdXRlRGVzdGluYXRpb25QYXRoID0gcGF0aC5qb2luKGRzdFJvb3RQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gYXdhaXQgYWZjU2VydmljZS5jcmVhdGVXcml0ZVN0cmVhbShhYnNvbHV0ZURlc3RpbmF0aW9uUGF0aCwge1xuICAgICAgYXV0b0Rlc3Ryb3k6IHRydWVcbiAgICB9KTtcbiAgICB3cml0ZVN0cmVhbS5vbignZmluaXNoJywgd3JpdGVTdHJlYW0uZGVzdHJveSk7XG4gICAgbGV0IHB1c2hFcnJvciA9IG51bGw7XG4gICAgY29uc3QgZmlsZVB1c2hQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBpZiAocHVzaEVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHB1c2hFcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9uU3RyZWFtRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICByZWFkU3RyZWFtLnVucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgICAgcHVzaEVycm9yID0gZTtcbiAgICAgIH07XG4gICAgICB3cml0ZVN0cmVhbS5vbignZXJyb3InLCBvblN0cmVhbUVycm9yKTtcbiAgICAgIHJlYWRTdHJlYW0ub24oJ2Vycm9yJywgb25TdHJlYW1FcnJvcik7XG4gICAgfSk7XG4gICAgcmVhZFN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICBhd2FpdCBmaWxlUHVzaFByb21pc2UudGltZW91dCh0aW1lb3V0TXMpO1xuICB9O1xuXG4gIGlmIChlbmFibGVQYXJhbGxlbFB1c2gpIHtcbiAgICBsb2cuZGVidWcoYFByb2NlZWRpbmcgdG8gcGFyYWxsZWwgZmlsZXMgcHVzaCAobWF4ICR7TUFYX0lPX0NIVU5LX1NJWkV9IHdyaXRlcnMpYCk7XG4gICAgY29uc3QgcHVzaFByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZUZpbGVQYXRoIG9mIF8uc2h1ZmZsZShmaWxlc1RvUHVzaCkpIHtcbiAgICAgIHB1c2hQcm9taXNlcy5wdXNoKEIucmVzb2x2ZShwdXNoRmlsZShyZWxhdGl2ZUZpbGVQYXRoKSkpO1xuICAgICAgLy8ga2VlcCB0aGUgcHVzaCBxdWV1ZSBmaWxsZWRcbiAgICAgIGlmIChwdXNoUHJvbWlzZXMubGVuZ3RoID49IE1BWF9JT19DSFVOS19TSVpFKSB7XG4gICAgICAgIGF3YWl0IEIuYW55KHB1c2hQcm9taXNlcyk7XG4gICAgICB9XG4gICAgICBfLnJlbW92ZShwdXNoUHJvbWlzZXMsIChwKSA9PiBwLmlzRnVsZmlsbGVkKCkpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShwdXNoUHJvbWlzZXMpKSB7XG4gICAgICAvLyBoYW5kbGUgdGhlIHJlc3Qgb2YgcHVzaCBwcm9taXNlc1xuICAgICAgYXdhaXQgQi5hbGwocHVzaFByb21pc2VzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nLmRlYnVnKGBQcm9jZWVkaW5nIHRvIHNlcmlhbCBmaWxlcyBwdXNoYCk7XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZUZpbGVQYXRoIG9mIGZpbGVzVG9QdXNoKSB7XG4gICAgICBhd2FpdCBwdXNoRmlsZShyZWxhdGl2ZUZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSBwdXNoZWQgJHt1dGlsLnBsdXJhbGl6ZSgnZm9sZGVyJywgZm9sZGVyc1RvUHVzaC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgYW5kICR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBmaWxlc1RvUHVzaC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgd2l0aGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG59XG5cblxuZXhwb3J0IHsgcHVsbEZpbGUsIHB1bGxGb2xkZXIsIHB1c2hGaWxlLCBwdXNoRm9sZGVyIH07Il0sImZpbGUiOiJsaWIvaW9zLWZzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
270
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pb3MtZnMtaGVscGVycy5qcyJdLCJuYW1lcyI6WyJJT19USU1FT1VUX01TIiwiTUFYX0lPX0NIVU5LX1NJWkUiLCJwdWxsRmlsZSIsImFmY1NlcnZpY2UiLCJyZW1vdGVQYXRoIiwic3RyZWFtIiwiY3JlYXRlUmVhZFN0cmVhbSIsImF1dG9EZXN0cm95IiwicHVsbFByb21pc2UiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidGltZW91dCIsImJ1ZmZlcnMiLCJkYXRhIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsImZvbGRlckV4aXN0cyIsImZvbGRlclBhdGgiLCJmcyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImUiLCJwdWxsRm9sZGVyIiwicmVtb3RlUm9vdFBhdGgiLCJ0bXBGb2xkZXIiLCJ0ZW1wRGlyIiwib3BlbkRpciIsImxvY2FsVG9wSXRlbSIsImNvdW50RmlsZXNTdWNjZXNzIiwiY291bnRGaWxlc0ZhaWwiLCJjb3VudEZvbGRlcnMiLCJwdWxsUHJvbWlzZXMiLCJ3YWxrRGlyIiwiaXNEaXIiLCJsb2NhbFBhdGgiLCJwYXRoIiwiam9pbiIsImRpcm5hbWUiLCJzcGxpdCIsInNlcCIsImxlbmd0aCIsInJlYWRTdHJlYW0iLCJ3cml0ZVN0cmVhbSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiYXV0b0Nsb3NlIiwib25TdHJlYW1pbmdFcnJvciIsInVucGlwZSIsImxvZyIsIndhcm4iLCJtZXNzYWdlIiwicGlwZSIsImFueSIsIl8iLCJyZW1vdmUiLCJwIiwiaXNGdWxmaWxsZWQiLCJpc0VtcHR5IiwiYWxsIiwiaW5mbyIsInV0aWwiLCJwbHVyYWxpemUiLCJ6aXAiLCJ0b0luTWVtb3J5WmlwIiwiZW5jb2RlVG9CYXNlNjQiLCJyaW1yYWYiLCJyZW1vdGVNa2RpcnAiLCJyZW1vdGVSb290IiwibGlzdERpcmVjdG9yeSIsImNyZWF0ZURpcmVjdG9yeSIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsInB1c2hFcnJvciIsInB1c2hQcm9taXNlIiwid3JpdGUiLCJmcm9tIiwiZW5kIiwicHVzaEZvbGRlciIsInNyY1Jvb3RQYXRoIiwiZHN0Um9vdFBhdGgiLCJvcHRzIiwidGltZW91dE1zIiwiZW5hYmxlUGFyYWxsZWxQdXNoIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwiaXRlbXNUb1B1c2giLCJnbG9iIiwiY3dkIiwibm9zb3J0IiwibWFyayIsImRlYnVnIiwiZm9sZGVyc1RvUHVzaCIsImZpbGVzVG9QdXNoIiwicmVkdWNlIiwiYWNjIiwieCIsImVuZHNXaXRoIiwiZGVsZXRlRGlyZWN0b3J5IiwiaWduIiwiZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5Iiwic29ydCIsImEiLCJiIiwicmVsYXRpdmVGb2xkZXJQYXRoIiwiYWJzb2x1dGVGb2xkZXJQYXRoIiwidHJpbUVuZCIsInJlbGF0aXZlUGF0aCIsImFic29sdXRlU291cmNlUGF0aCIsImFic29sdXRlRGVzdGluYXRpb25QYXRoIiwiZGVzdHJveSIsImZpbGVQdXNoUHJvbWlzZSIsIm9uU3RyZWFtRXJyb3IiLCJwdXNoUHJvbWlzZXMiLCJyZWxhdGl2ZUZpbGVQYXRoIiwic2h1ZmZsZSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxJQUFJLEVBQUosR0FBUyxJQUEvQjtBQUdBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCOztBQVVBLGVBQWVDLFFBQWYsQ0FBeUJDLFVBQXpCLEVBQXFDQyxVQUFyQyxFQUFpRDtBQUMvQyxRQUFNQyxNQUFNLEdBQUcsTUFBTUYsVUFBVSxDQUFDRyxnQkFBWCxDQUE0QkYsVUFBNUIsRUFBd0M7QUFBRUcsSUFBQUEsV0FBVyxFQUFFO0FBQWYsR0FBeEMsQ0FBckI7QUFDQSxRQUFNQyxXQUFXLEdBQUcsSUFBSUMsaUJBQUosQ0FBTSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FB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QWQ7QUFDRDtBQUNGOztBQUVEbkUsa0JBQUk0QyxLQUFKLENBQVcsdUJBQXNCaEMsb0JBQUtDLFNBQUwsQ0FBZSxRQUFmLEVBQXlCZ0MsYUFBYSxDQUFDcEQsTUFBdkMsRUFBK0MsSUFBL0MsQ0FBcUQsR0FBNUUsR0FDUCxPQUFNbUIsb0JBQUtDLFNBQUwsQ0FBZSxNQUFmLEVBQXVCaUMsV0FBVyxDQUFDckQsTUFBbkMsRUFBMkMsSUFBM0MsQ0FBaUQsR0FEaEQsR0FFUCxVQUFTMEMsS0FBSyxDQUFDa0MsV0FBTixHQUFvQkMsY0FBcEIsQ0FBbUNDLE9BQW5DLENBQTJDLENBQTNDLENBQThDLElBRjFEO0FBR0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIG1rZGlycCwgemlwLCB1dGlsLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuXG5jb25zdCBJT19USU1FT1VUX01TID0gNCAqIDYwICogMTAwMDtcbi8vIE1vYmlsZSBkZXZpY2VzIHVzZSBOQU5EIG1lbW9yeSBtb2R1bGVzIGZvciB0aGUgc3RvcmFnZSxcbi8vIGFuZCB0aGUgcGFyYWxsZWxpc20gdGhlcmUgaXMgbm90IGFzIHBlcmZvcm1hbnQgYXMgb24gcmVndWxhciBTU0RzXG5jb25zdCBNQVhfSU9fQ0hVTktfU0laRSA9IDg7XG5cbi8qKlxuICogUmV0cmlldmUgYSBmaWxlIGZyb20gYSByZWFsIGRldmljZVxuICpcbiAqIEBwYXJhbSB7QWZjU2VydmljZX0gYWZjU2VydmljZSBBcHBsZSBGaWxlIENsaWVudCBzZXJ2aWNlIGluc3RhbmNlIGZyb21cbiAqICdhcHBpdW0taW9zLWRldmljZScgbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBkZXZpY2VcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSBmaWxlIGNvbnRlbnQgYXMgYSBidWZmZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVsbEZpbGUgKGFmY1NlcnZpY2UsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3Qgc3RyZWFtID0gYXdhaXQgYWZjU2VydmljZS5jcmVhdGVSZWFkU3RyZWFtKHJlbW90ZVBhdGgsIHsgYXV0b0Rlc3Ryb3k6IHRydWUgfSk7XG4gIGNvbnN0IHB1bGxQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCByZXNvbHZlKTtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSkudGltZW91dChJT19USU1FT1VUX01TKTtcbiAgY29uc3QgYnVmZmVycyA9IFtdO1xuICBzdHJlYW0ub24oJ2RhdGEnLCAoZGF0YSkgPT4gYnVmZmVycy5wdXNoKGRhdGEpKTtcbiAgYXdhaXQgcHVsbFByb21pc2U7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIHByZXNlbmNlIG9mIGEgbG9jYWwgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb2xkZXJQYXRoIEZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgZm9sZGVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZm9sZGVyIGV4aXN0cyBhbmQgaXMgYWN0dWFsbHkgYSBmb2xkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZm9sZGVyRXhpc3RzIChmb2xkZXJQYXRoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBmcy5zdGF0KGZvbGRlclBhdGgpKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmUgYSBmb2xkZXIgZnJvbSBhIHJlYWwgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVSb290UGF0aCBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBmb2xkZXIgb24gdGhlIGRldmljZVxuICogQHJldHVybnMge0J1ZmZlcn0gVGhlIGZvbGRlciBjb250ZW50IGFzIGEgemlwcGVkIGJhc2U2NC1lbmNvZGVkIGJ1ZmZlclxuICovXG5hc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChhZmNTZXJ2aWNlLCByZW1vdGVSb290UGF0aCkge1xuICBjb25zdCB0bXBGb2xkZXIgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBsZXQgbG9jYWxUb3BJdGVtID0gbnVsbDtcbiAgICBsZXQgY291bnRGaWxlc1N1Y2Nlc3MgPSAwO1xuICAgIGxldCBjb3VudEZpbGVzRmFpbCA9IDA7XG4gICAgbGV0IGNvdW50Rm9sZGVycyA9IDA7XG4gICAgY29uc3QgcHVsbFByb21pc2VzID0gW107XG4gICAgYXdhaXQgYWZjU2VydmljZS53YWxrRGlyKHJlbW90ZVJvb3RQYXRoLCB0cnVlLCBhc3luYyAocmVtb3RlUGF0aCwgaXNEaXIpID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGguam9pbih0bXBGb2xkZXIsIHJlbW90ZVBhdGgpO1xuICAgICAgY29uc3QgZGlybmFtZSA9IGlzRGlyID8gbG9jYWxQYXRoIDogcGF0aC5kaXJuYW1lKGxvY2FsUGF0aCk7XG4gICAgICBpZiAoIWF3YWl0IGZvbGRlckV4aXN0cyhkaXJuYW1lKSkge1xuICAgICAgICBhd2FpdCBta2RpcnAoZGlybmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWxvY2FsVG9wSXRlbVxuICAgICAgICAgIHx8IGxvY2FsUGF0aC5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIDwgbG9jYWxUb3BJdGVtLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpIHtcbiAgICAgICAgbG9jYWxUb3BJdGVtID0gbG9jYWxQYXRoO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgICsrY291bnRGb2xkZXJzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBhZmNTZXJ2aWNlLmNyZWF0ZVJlYWRTdHJlYW0ocmVtb3RlUGF0aCwge2F1dG9EZXN0cm95OiB0cnVlfSk7XG4gICAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGxvY2FsUGF0aCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgICAgcHVsbFByb21pc2VzLnB1c2goXG4gICAgICAgIG5ldyBCKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgKytjb3VudEZpbGVzU3VjY2VzcztcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvblN0cmVhbWluZ0Vycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICAgICAgICAgIGxvZy53YXJuKGBDYW5ub3QgcHVsbCAnJHtyZW1vdGVQYXRofScgdG8gJyR7bG9jYWxQYXRofScuIGAgK1xuICAgICAgICAgICAgICBgVGhlIGZpbGUgd2lsbCBiZSBza2lwcGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICArK2NvdW50RmlsZXNGYWlsO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgb25TdHJlYW1pbmdFcnJvcik7XG4gICAgICAgICAgcmVhZFN0cmVhbS5vbignZXJyb3InLCBvblN0cmVhbWluZ0Vycm9yKTtcbiAgICAgICAgfSkudGltZW91dChJT19USU1FT1VUX01TKVxuICAgICAgKTtcbiAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgICBpZiAocHVsbFByb21pc2VzLmxlbmd0aCA+PSBNQVhfSU9fQ0hVTktfU0laRSkge1xuICAgICAgICBhd2FpdCBCLmFueShwdWxsUHJvbWlzZXMpO1xuICAgICAgfVxuICAgICAgXy5yZW1vdmUocHVsbFByb21pc2VzLCAocCkgPT4gcC5pc0Z1bGZpbGxlZCgpKTtcbiAgICB9KTtcbiAgICAvLyBXYWl0IGZvciB0aGUgcmVzdCBvZiBmaWxlcyB0byBiZSBwdWxsZWRcbiAgICBpZiAoIV8uaXNFbXB0eShwdWxsUHJvbWlzZXMpKSB7XG4gICAgICBhd2FpdCBCLmFsbChwdWxsUHJvbWlzZXMpO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgUHVsbGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBjb3VudEZpbGVzU3VjY2VzcywgdHJ1ZSl9IG91dCBvZiBgICtcbiAgICAgIGAke2NvdW50RmlsZXNTdWNjZXNzICsgY291bnRGaWxlc0ZhaWx9IGFuZCAke3V0aWwucGx1cmFsaXplKCdmb2xkZXInLCBjb3VudEZvbGRlcnMsIHRydWUpfSBgICtcbiAgICAgIGBmcm9tICcke3JlbW90ZVJvb3RQYXRofSdgKTtcbiAgICByZXR1cm4gYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAobG9jYWxUb3BJdGVtID8gcGF0aC5kaXJuYW1lKGxvY2FsVG9wSXRlbSkgOiB0bXBGb2xkZXIsIHtcbiAgICAgIGVuY29kZVRvQmFzZTY0OiB0cnVlLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBGb2xkZXIpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyByZW1vdGUgZm9sZGVyIHBhdGggcmVjdXJzaXZlbHkuIE5vb3AgaWYgdGhlIGdpdmVuIHBhdGhcbiAqIGFscmVhZHkgZXhpc3RzXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVSb290IFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyIHN0cnVjdHVyZVxuICogdG8gYmUgY3JlYXRlZFxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdGVNa2RpcnAgKGFmY1NlcnZpY2UsIHJlbW90ZVJvb3QpIHtcbiAgaWYgKHJlbW90ZVJvb3QgPT09ICcuJyB8fCByZW1vdGVSb290ID09PSAnLycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBhZmNTZXJ2aWNlLmxpc3REaXJlY3RvcnkocmVtb3RlUm9vdCk7XG4gICAgcmV0dXJuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgbWlzc2luZyBhbmQgd2UgZ290IGFuIG9iamVjdCBub3QgZm91bmQgZXJyb3IuXG4gICAgLy8gVGhlcmVmb3JlLCB3ZSBhcmUgZ29pbmcgdG8gdGhlIHBhcmVudFxuICAgIGF3YWl0IHJlbW90ZU1rZGlycChhZmNTZXJ2aWNlLCBwYXRoLmRpcm5hbWUocmVtb3RlUm9vdCkpO1xuICB9XG4gIGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlRGlyZWN0b3J5KHJlbW90ZVJvb3QpO1xufVxuXG4vKipcbiAqIFB1c2hlcyBhIGZpbGUgdG8gYSByZWFsIGRldmljZVxuICpcbiAqIEBwYXJhbSB7QWZjU2VydmljZX0gYWZjU2VydmljZSBBcHBsZSBGaWxlIENsaWVudCBzZXJ2aWNlIGluc3RhbmNlIGZyb21cbiAqICdhcHBpdW0taW9zLWRldmljZScgbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFRoZSByZW1vdGVcbiAqIGZvbGRlciBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjREYXRhIEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlblxuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAoYWZjU2VydmljZSwgcmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBhd2FpdCByZW1vdGVNa2RpcnAoYWZjU2VydmljZSwgcGF0aC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgY29uc3Qgc3RyZWFtID0gYXdhaXQgYWZjU2VydmljZS5jcmVhdGVXcml0ZVN0cmVhbShyZW1vdGVQYXRoLCB7YXV0b0Rlc3Ryb3k6IHRydWV9KTtcbiAgbGV0IHB1c2hFcnJvciA9IG51bGw7XG4gIGNvbnN0IHB1c2hQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN0cmVhbS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgcHVzaEVycm9yID0gZTtcbiAgICB9KTtcbiAgICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgaWYgKHB1c2hFcnJvcikge1xuICAgICAgICByZWplY3QocHVzaEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkudGltZW91dChJT19USU1FT1VUX01TKTtcbiAgc3RyZWFtLndyaXRlKEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKSk7XG4gIHN0cmVhbS5lbmQoKTtcbiAgYXdhaXQgcHVzaFByb21pc2U7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVzaEZvbGRlck9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyNDAwMDBdIFRoZSBtYXhpbXVtIHRpbWVvdXQgdG8gd2FpdCB1bnRpbCBhXG4gKiBzaW5nbGUgZmlsZSBpcyBjb3BpZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlUGFyYWxsZWxQdXNoIFtmYWxzZV0gV2hldGhlciB0byBwdXNoIGZpbGVzIGluIHBhcmFsbGVsLlxuICogVGhpcyB1c3VhbGx5IGdpdmVzIGJldHRlciBwZXJmb3JtYW5jZSwgYnV0IG1pZ2h0IHNvbWV0aW1lcyBiZSBsZXNzIHN0YWJsZS5cbiAqL1xuXG4vKipcbiAqIFB1c2hlcyBhIGZvbGRlciB0byBhIHJlYWwgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBZmNTZXJ2aWNlfSBhZmNTZXJ2aWNlIEFwcGxlIEZpbGUgQ2xpZW50IHNlcnZpY2UgaW5zdGFuY2UgZnJvbVxuICogJ2FwcGl1bS1pb3MtZGV2aWNlJyBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNSb290UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBzb3VyY2UgZm9sZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gZHN0Um9vdFBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4gVGhlIGZvbGRlclxuICogd2lsbCBiZSBkZWxldGVkIGlmIGFscmVhZHkgZXhpc3RzLlxuICogQHBhcmFtIHtQdXNoRm9sZGVyT3B0aW9uc30gb3B0c1xuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoRm9sZGVyIChhZmNTZXJ2aWNlLCBzcmNSb290UGF0aCwgZHN0Um9vdFBhdGgsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGltZW91dE1zID0gSU9fVElNRU9VVF9NUyxcbiAgICBlbmFibGVQYXJhbGxlbFB1c2ggPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgY29uc3QgaXRlbXNUb1B1c2ggPSBhd2FpdCBmcy5nbG9iKCcqKicsIHtcbiAgICBjd2Q6IHNyY1Jvb3RQYXRoLFxuICAgIG5vc29ydDogdHJ1ZSxcbiAgICBtYXJrOiB0cnVlLFxuICB9KTtcbiAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgc2Nhbm5lZCB0aGUgdHJlZSBzdHJ1Y3R1cmUgb2YgJyR7c3JjUm9vdFBhdGh9J2ApO1xuICBjb25zdCBbZm9sZGVyc1RvUHVzaCwgZmlsZXNUb1B1c2hdID0gaXRlbXNUb1B1c2gucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICBhY2NbXy5lbmRzV2l0aCh4LCBwYXRoLnNlcCkgPyAwIDogMV0ucHVzaCh4KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbW10sIFtdXSk7XG4gIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2ZvbGRlcicsIGZvbGRlcnNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gYW5kIGAgK1xuICAgIGAke3V0aWwucGx1cmFsaXplKCdmaWxlJywgZmlsZXNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gdG8gcHVzaGApO1xuICAvLyBjcmVhdGUgdGhlIGZvbGRlciBzdHJ1Y3R1cmUgZmlyc3RcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZmNTZXJ2aWNlLmRlbGV0ZURpcmVjdG9yeShkc3RSb290UGF0aCk7XG4gIH0gY2F0Y2ggKGlnbikge31cbiAgYXdhaXQgYWZjU2VydmljZS5jcmVhdGVEaXJlY3RvcnkoZHN0Um9vdFBhdGgpO1xuICAvLyB0b3AtbGV2ZWwgZm9sZGVycyBtdXN0IGdvIGZpcnN0XG4gIGNvbnN0IGZvbGRlcnNUb1B1c2hCeUhpZXJhcmNoeSA9IGZvbGRlcnNUb1B1c2hcbiAgICAuc29ydCgoYSwgYikgPT4gYS5zcGxpdChwYXRoLnNlcCkubGVuZ3RoIC0gYi5zcGxpdChwYXRoLnNlcCkubGVuZ3RoKTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZUZvbGRlclBhdGggb2YgZm9sZGVyc1RvUHVzaEJ5SGllcmFyY2h5KSB7XG4gICAgLy8gY3JlYXRlRGlyZWN0b3J5IGRvZXMgbm90IGFjY2VwdCBmb2xkZXIgbmFtZXMgZW5kaW5nIHdpdGggYSBwYXRoIHNlcGFyYXRvclxuICAgIGNvbnN0IGFic29sdXRlRm9sZGVyUGF0aCA9IF8udHJpbUVuZChcbiAgICAgIHBhdGguam9pbihkc3RSb290UGF0aCwgcmVsYXRpdmVGb2xkZXJQYXRoKSwgcGF0aC5zZXBcbiAgICApO1xuICAgIGlmIChhYnNvbHV0ZUZvbGRlclBhdGgpIHtcbiAgICAgIGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlRGlyZWN0b3J5KGFic29sdXRlRm9sZGVyUGF0aCk7XG4gICAgfVxuICB9XG4gIC8vIGRvIG5vdCBmb3JnZXQgYWJvdXQgdGhlIHJvb3QgZm9sZGVyXG4gIGxvZy5kZWJ1ZyhgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgdGhlIHJlbW90ZSBmb2xkZXIgc3RydWN0dXJlIGAgK1xuICAgIGAoJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGZvbGRlcnNUb1B1c2gubGVuZ3RoICsgMSwgdHJ1ZSl9KWApO1xuXG4gIGNvbnN0IHB1c2hGaWxlID0gYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgIGNvbnN0IGFic29sdXRlU291cmNlUGF0aCA9IHBhdGguam9pbihzcmNSb290UGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCByZWFkU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShhYnNvbHV0ZVNvdXJjZVBhdGgsIHthdXRvQ2xvc2U6IHRydWV9KTtcbiAgICBjb25zdCBhYnNvbHV0ZURlc3RpbmF0aW9uUGF0aCA9IHBhdGguam9pbihkc3RSb290UGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGF3YWl0IGFmY1NlcnZpY2UuY3JlYXRlV3JpdGVTdHJlYW0oYWJzb2x1dGVEZXN0aW5hdGlvblBhdGgsIHtcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlXG4gICAgfSk7XG4gICAgd3JpdGVTdHJlYW0ub24oJ2ZpbmlzaCcsIHdyaXRlU3RyZWFtLmRlc3Ryb3kpO1xuICAgIGxldCBwdXNoRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IGZpbGVQdXNoUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdyaXRlU3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKHB1c2hFcnJvcikge1xuICAgICAgICAgIHJlamVjdChwdXNoRXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBvblN0cmVhbUVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVhZFN0cmVhbS51bnBpcGUod3JpdGVTdHJlYW0pO1xuICAgICAgICBsb2cuZGVidWcoZSk7XG4gICAgICAgIHB1c2hFcnJvciA9IGU7XG4gICAgICB9O1xuICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgb25TdHJlYW1FcnJvcik7XG4gICAgICByZWFkU3RyZWFtLm9uKCdlcnJvcicsIG9uU3RyZWFtRXJyb3IpO1xuICAgIH0pO1xuICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgYXdhaXQgZmlsZVB1c2hQcm9taXNlLnRpbWVvdXQodGltZW91dE1zKTtcbiAgfTtcblxuICBpZiAoZW5hYmxlUGFyYWxsZWxQdXNoKSB7XG4gICAgbG9nLmRlYnVnKGBQcm9jZWVkaW5nIHRvIHBhcmFsbGVsIGZpbGVzIHB1c2ggKG1heCAke01BWF9JT19DSFVOS19TSVpFfSB3cml0ZXJzKWApO1xuICAgIGNvbnN0IHB1c2hQcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmVGaWxlUGF0aCBvZiBfLnNodWZmbGUoZmlsZXNUb1B1c2gpKSB7XG4gICAgICBwdXNoUHJvbWlzZXMucHVzaChCLnJlc29sdmUocHVzaEZpbGUocmVsYXRpdmVGaWxlUGF0aCkpKTtcbiAgICAgIC8vIGtlZXAgdGhlIHB1c2ggcXVldWUgZmlsbGVkXG4gICAgICBpZiAocHVzaFByb21pc2VzLmxlbmd0aCA+PSBNQVhfSU9fQ0hVTktfU0laRSkge1xuICAgICAgICBhd2FpdCBCLmFueShwdXNoUHJvbWlzZXMpO1xuICAgICAgfVxuICAgICAgXy5yZW1vdmUocHVzaFByb21pc2VzLCAocCkgPT4gcC5pc0Z1bGZpbGxlZCgpKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkocHVzaFByb21pc2VzKSkge1xuICAgICAgLy8gaGFuZGxlIHRoZSByZXN0IG9mIHB1c2ggcHJvbWlzZXNcbiAgICAgIGF3YWl0IEIuYWxsKHB1c2hQcm9taXNlcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgUHJvY2VlZGluZyB0byBzZXJpYWwgZmlsZXMgcHVzaGApO1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmVGaWxlUGF0aCBvZiBmaWxlc1RvUHVzaCkge1xuICAgICAgYXdhaXQgcHVzaEZpbGUocmVsYXRpdmVGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgcHVzaGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZvbGRlcicsIGZvbGRlcnNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgYGFuZCAke3V0aWwucGx1cmFsaXplKCdmaWxlJywgZmlsZXNUb1B1c2gubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgYHdpdGhpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xufVxuXG5cbmV4cG9ydCB7IHB1bGxGaWxlLCBwdWxsRm9sZGVyLCBwdXNoRmlsZSwgcHVzaEZvbGRlciB9OyJdLCJmaWxlIjoibGliL2lvcy1mcy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -29,6 +29,20 @@ async function pullFile (afcService, remotePath) {
29
29
  return Buffer.concat(buffers);
30
30
  }
31
31
 
32
+ /**
33
+ * Checks a presence of a local folder.
34
+ *
35
+ * @param {string} folderPath Full path to the local folder
36
+ * @returns {boolean} True if the folder exists and is actually a folder
37
+ */
38
+ async function folderExists (folderPath) {
39
+ try {
40
+ return (await fs.stat(folderPath)).isDirectory();
41
+ } catch (e) {
42
+ return false;
43
+ }
44
+ }
45
+
32
46
  /**
33
47
  * Retrieve a folder from a real device
34
48
  *
@@ -40,34 +54,59 @@ async function pullFile (afcService, remotePath) {
40
54
  async function pullFolder (afcService, remoteRootPath) {
41
55
  const tmpFolder = await tempDir.openDir();
42
56
  try {
57
+ let localTopItem = null;
58
+ let countFilesSuccess = 0;
59
+ let countFilesFail = 0;
60
+ let countFolders = 0;
43
61
  const pullPromises = [];
44
- await afcService.walkDir(remoteRootPath, true, async (itemPath, isDir) => {
45
- const pathOnServer = path.join(tmpFolder, itemPath);
62
+ await afcService.walkDir(remoteRootPath, true, async (remotePath, isDir) => {
63
+ const localPath = path.join(tmpFolder, remotePath);
64
+ const dirname = isDir ? localPath : path.dirname(localPath);
65
+ if (!await folderExists(dirname)) {
66
+ await mkdirp(dirname);
67
+ }
68
+ if (!localTopItem
69
+ || localPath.split(path.sep).length < localTopItem.split(path.sep).length) {
70
+ localTopItem = localPath;
71
+ }
46
72
  if (isDir) {
47
- await mkdirp(pathOnServer);
73
+ ++countFolders;
48
74
  return;
49
75
  }
50
76
 
51
- const readStream = await afcService.createReadStream(itemPath, {autoDestroy: true});
52
- const writeStream = fs.createWriteStream(pathOnServer, {autoClose: true});
53
- pullPromises.push(new B((resolve, reject) => {
54
- writeStream.on('close', resolve);
55
- const onStreamingError = (e) => {
56
- readStream.unpipe(writeStream);
57
- reject(e);
58
- };
59
- writeStream.on('error', onStreamingError);
60
- readStream.on('error', onStreamingError);
61
- }).timeout(IO_TIMEOUT_MS));
77
+ const readStream = await afcService.createReadStream(remotePath, {autoDestroy: true});
78
+ const writeStream = fs.createWriteStream(localPath, {autoClose: true});
79
+ pullPromises.push(
80
+ new B((resolve) => {
81
+ writeStream.on('close', () => {
82
+ ++countFilesSuccess;
83
+ resolve();
84
+ });
85
+ const onStreamingError = (e) => {
86
+ readStream.unpipe(writeStream);
87
+ log.warn(`Cannot pull '${remotePath}' to '${localPath}'. ` +
88
+ `The file will be skipped. Original error: ${e.message}`);
89
+ ++countFilesFail;
90
+ resolve();
91
+ };
92
+ writeStream.on('error', onStreamingError);
93
+ readStream.on('error', onStreamingError);
94
+ }).timeout(IO_TIMEOUT_MS)
95
+ );
62
96
  readStream.pipe(writeStream);
63
97
  if (pullPromises.length >= MAX_IO_CHUNK_SIZE) {
64
98
  await B.any(pullPromises);
65
99
  }
66
100
  _.remove(pullPromises, (p) => p.isFulfilled());
67
101
  });
68
- // Wait for the rest of the chunks
69
- await B.all(pullPromises);
70
- return await zip.toInMemoryZip(tmpFolder, {
102
+ // Wait for the rest of files to be pulled
103
+ if (!_.isEmpty(pullPromises)) {
104
+ await B.all(pullPromises);
105
+ }
106
+ log.info(`Pulled ${util.pluralize('file', countFilesSuccess, true)} out of ` +
107
+ `${countFilesSuccess + countFilesFail} and ${util.pluralize('folder', countFolders, true)} ` +
108
+ `from '${remoteRootPath}'`);
109
+ return await zip.toInMemoryZip(localTopItem ? path.dirname(localTopItem) : tmpFolder, {
71
110
  encodeToBase64: true,
72
111
  });
73
112
  } finally {
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "3.59.1",
11
+ "version": "3.59.2",
12
12
  "author": "appium",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {