appium-webdriveragent 4.10.3 → 4.10.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.
@@ -10,8 +10,8 @@ var _lodash = _interopRequireDefault(require("lodash"));
10
10
  var _path = _interopRequireDefault(require("path"));
11
11
  var _url2 = _interopRequireDefault(require("url"));
12
12
  var _bluebird = _interopRequireDefault(require("bluebird"));
13
- var _driver = require("appium/driver");
14
- var _support = require("appium/support");
13
+ var _baseDriver = require("@appium/base-driver");
14
+ var _support = require("@appium/support");
15
15
  var _logger = _interopRequireDefault(require("./logger"));
16
16
  var _noSessionProxy = require("./no-session-proxy");
17
17
  var _utils = require("./utils");
@@ -282,7 +282,7 @@ class WebDriverAgent {
282
282
  timeout: this.wdaConnectionTimeout,
283
283
  keepAlive: true
284
284
  };
285
- this.jwproxy = new _driver.JWProxy(proxyOpts);
285
+ this.jwproxy = new _baseDriver.JWProxy(proxyOpts);
286
286
  this.jwproxy.sessionId = sessionId;
287
287
  this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);
288
288
  this.noSessionProxy = new _noSessionProxy.NoSessionProxy(proxyOpts);
@@ -365,4 +365,4 @@ class WebDriverAgent {
365
365
  exports.WebDriverAgent = WebDriverAgent;
366
366
  var _default = WebDriverAgent;
367
367
  exports.default = _default;
368
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwieGNvZGVidWlsZCIsIlhjb2RlQnVpbGQiLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwibGF1bmNoVGltZW91dCIsIndkYUxhdW5jaFRpbWVvdXQiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiQk9PVFNUUkFQX1BBVEgiLCJpbmZvIiwicGF0aCIsInJlc29sdmUiLCJjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMiLCJvYnNvbGV0ZVBpZHMiLCJnZXRQSURzTGlzdGVuaW5nT25Qb3J0IiwidXJsIiwicG9ydCIsImNtZExpbmUiLCJpbmNsdWRlcyIsInRvTG93ZXJDYXNlIiwidWRpZCIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsImV4ZWMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJpc1J1bm5pbmciLCJnZXRTdGF0dXMiLCJiYXNlUGF0aCIsIm5vU2Vzc2lvblByb3h5IiwiTm9TZXNzaW9uUHJveHkiLCJzZXJ2ZXIiLCJob3N0bmFtZSIsImJhc2UiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImVyciIsImhyZWYiLCJ1bmluc3RhbGwiLCJidW5kbGVJZHMiLCJnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIiwiYnVuZGxlSWQiLCJyZW1vdmVBcHAiLCJfY2xlYW51cFByb2plY3RJZkZyZXNoIiwiaG9tZUZvbGRlciIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwiY3VycmVudFVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsIldEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIIiwiZGlkVGltZXN0YW1wRXhpc3QiLCJmcyIsImV4aXN0cyIsImFjY2VzcyIsIldfT0siLCJpZ24iLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIm1rZGlycCIsImRpcm5hbWUiLCJ3cml0ZUZpbGUiLCJjbGVhblByb2plY3QiLCJsYXVuY2giLCJzZXNzaW9uSWQiLCJzZXR1cFByb3hpZXMiLCJFcnJvciIsInN5bmNocm9uaXphdGlvbktleSIsIm5vcm1hbGl6ZSIsImFjcXVpcmUiLCJyZXNldFRlc3RQcm9jZXNzZXMiLCJzdGFydFdpdGhJREIiLCJpbml0IiwicHJlYnVpbGQiLCJzdGFydCIsIndkYUJ1bmRsZUlkIiwidGVzdEJ1bmRsZUlkIiwicHJlcGFyZVdEQSIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJNSlBFR19TRVJWRVJfUE9SVCIsInJ1blhDVUlUZXN0IiwicGFyc2VCdW5kbGVJZCIsImluZm9QbGlzdFBhdGgiLCJqb2luIiwiaW5mb1BsaXN0IiwicGxpc3QiLCJwYXJzZVBsaXN0IiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwiZmV0Y2hXREFCdW5kbGUiLCJpc0FwcEluc3RhbGxlZCIsImluc3RhbGxBcHAiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwiYnVuZGxlV0RBU2ltIiwid2RhQnVuZGxlUGF0aHMiLCJnbG9iIiwiV0RBX1JVTk5FUl9BUFAiLCJhYnNvbHV0ZSIsImlzU291cmNlRnJlc2giLCJleGlzdHNQcm9taXNlcyIsInNlcCIsIm1hcCIsInN1YlBhdGgiLCJCIiwiYWxsIiwic29tZSIsInYiLCJwcm94eU9wdHMiLCJrZWVwQWxpdmUiLCJqd3Byb3h5IiwiSldQcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsInF1aXQiLCJyZXNldCIsIl91cmwiLCJwYXJzZSIsInByb3RvY29sIiwiZnVsbHlTdGFydGVkIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJzZXR1cENhY2hpbmciLCJzdGF0dXMiLCJidWlsZCIsInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyIiwidXBncmFkZWRBdCIsInV0aWwiLCJoYXNWYWx1ZSIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiYWN0dWFsVXBncmFkZVRpbWVzdGFtcCIsInRvTG93ZXIiLCJxdWl0QW5kVW5pbnN0YWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgTm9TZXNzaW9uUHJveHkgfSBmcm9tICcuL25vLXNlc3Npb24tcHJveHknO1xuaW1wb3J0IHtcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLCBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBCT09UU1RSQVBfUEFUSFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBYY29kZUJ1aWxkIGZyb20gJy4veGNvZGVidWlsZCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBidW5kbGVXREFTaW0gfSBmcm9tICcuL2NoZWNrLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICBXREFfUlVOTkVSX0JVTkRMRV9JRCwgV0RBX1JVTk5FUl9BUFAsIFdEQV9CQVNFX1VSTCwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgV0RBX0xBVU5DSF9USU1FT1VUID0gNjAgKiAxMDAwO1xuY29uc3QgV0RBX0FHRU5UX1BPUlQgPSA4MTAwO1xuY29uc3QgV0RBX0NGX0JVTkRMRV9OQU1FID0gJ1dlYkRyaXZlckFnZW50UnVubmVyLVJ1bm5lcic7XG5jb25zdCBTSEFSRURfUkVTT1VSQ0VTX0dVQVJEID0gbmV3IEFzeW5jTG9jaygpO1xuXG5jbGFzcyBXZWJEcml2ZXJBZ2VudCB7XG4gIGNvbnN0cnVjdG9yICh4Y29kZVZlcnNpb24sIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5hcmdzID0gXy5jbG9uZShhcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZyA/PyBkZWZhdWx0TG9nZ2VyO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBhcmdzLmRldmljZTtcbiAgICB0aGlzLnBsYXRmb3JtVmVyc2lvbiA9IGFyZ3MucGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMucGxhdGZvcm1OYW1lID0gYXJncy5wbGF0Zm9ybU5hbWU7XG4gICAgdGhpcy5pb3NTZGtWZXJzaW9uID0gYXJncy5pb3NTZGtWZXJzaW9uO1xuICAgIHRoaXMuaG9zdCA9IGFyZ3MuaG9zdDtcbiAgICB0aGlzLmlzUmVhbERldmljZSA9ICEhYXJncy5yZWFsRGV2aWNlO1xuICAgIHRoaXMuaWRiID0gKGFyZ3MuZGV2aWNlIHx8IHt9KS5pZGI7XG4gICAgdGhpcy53ZGFCdW5kbGVQYXRoID0gYXJncy53ZGFCdW5kbGVQYXRoO1xuXG4gICAgdGhpcy5zZXRXREFQYXRocyhhcmdzLmJvb3RzdHJhcFBhdGgsIGFyZ3MuYWdlbnRQYXRoKTtcblxuICAgIHRoaXMud2RhTG9jYWxQb3J0ID0gYXJncy53ZGFMb2NhbFBvcnQ7XG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFMb2NhbFBvcnQgfHwgV0RBX0FHRU5UX1BPUlQ7XG4gICAgdGhpcy53ZGFCYXNlVXJsID0gYXJncy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTDtcblxuICAgIHRoaXMucHJlYnVpbGRXREEgPSBhcmdzLnByZWJ1aWxkV0RBO1xuXG4gICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IGFyZ3Mud2ViRHJpdmVyQWdlbnRVcmw7XG5cbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQgPSBhcmdzLndkYUNvbm5lY3Rpb25UaW1lb3V0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuICAgIHRoaXMudXNlUHJlYnVpbHRXREEgPSBhcmdzLnVzZVByZWJ1aWx0V0RBO1xuICAgIHRoaXMuZGVyaXZlZERhdGFQYXRoID0gYXJncy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkID0gYXJncy51cGRhdGVkV0RBQnVuZGxlSWQ7XG5cbiAgICB0aGlzLnhjb2RlYnVpbGQgPSBuZXcgWGNvZGVCdWlsZCh0aGlzLnhjb2RlVmVyc2lvbiwgdGhpcy5kZXZpY2UsIHtcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogdGhpcy5wbGF0Zm9ybVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybU5hbWU6IHRoaXMucGxhdGZvcm1OYW1lLFxuICAgICAgaW9zU2RrVmVyc2lvbjogdGhpcy5pb3NTZGtWZXJzaW9uLFxuICAgICAgYWdlbnRQYXRoOiB0aGlzLmFnZW50UGF0aCxcbiAgICAgIGJvb3RzdHJhcFBhdGg6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgIHJlYWxEZXZpY2U6IHRoaXMuaXNSZWFsRGV2aWNlLFxuICAgICAgc2hvd1hjb2RlTG9nOiBhcmdzLnNob3dYY29kZUxvZyxcbiAgICAgIHhjb2RlQ29uZmlnRmlsZTogYXJncy54Y29kZUNvbmZpZ0ZpbGUsXG4gICAgICB4Y29kZU9yZ0lkOiBhcmdzLnhjb2RlT3JnSWQsXG4gICAgICB4Y29kZVNpZ25pbmdJZDogYXJncy54Y29kZVNpZ25pbmdJZCxcbiAgICAgIGtleWNoYWluUGF0aDogYXJncy5rZXljaGFpblBhdGgsXG4gICAgICBrZXljaGFpblBhc3N3b3JkOiBhcmdzLmtleWNoYWluUGFzc3dvcmQsXG4gICAgICB1c2VTaW1wbGVCdWlsZFRlc3Q6IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0LFxuICAgICAgdXNlUHJlYnVpbHRXREE6IGFyZ3MudXNlUHJlYnVpbHRXREEsXG4gICAgICB1cGRhdGVkV0RBQnVuZGxlSWQ6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkLFxuICAgICAgbGF1bmNoVGltZW91dDogYXJncy53ZGFMYXVuY2hUaW1lb3V0IHx8IFdEQV9MQVVOQ0hfVElNRU9VVCxcbiAgICAgIHdkYVJlbW90ZVBvcnQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIHVzZVhjdGVzdHJ1bkZpbGU6IHRoaXMudXNlWGN0ZXN0cnVuRmlsZSxcbiAgICAgIGRlcml2ZWREYXRhUGF0aDogYXJncy5kZXJpdmVkRGF0YVBhdGgsXG4gICAgICBtanBlZ1NlcnZlclBvcnQ6IHRoaXMubWpwZWdTZXJ2ZXJQb3J0LFxuICAgICAgYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb246IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24sXG4gICAgICByZXN1bHRCdW5kbGVQYXRoOiBhcmdzLnJlc3VsdEJ1bmRsZVBhdGgsXG4gICAgICByZXN1bHRCdW5kbGVWZXJzaW9uOiBhcmdzLnJlc3VsdEJ1bmRsZVZlcnNpb24sXG4gICAgfSwgdGhpcy5sb2cpO1xuICB9XG5cbiAgc2V0V0RBUGF0aHMgKGJvb3RzdHJhcFBhdGgsIGFnZW50UGF0aCkge1xuICAgIC8vIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBwbGFjZSBmb3IgV0RBLiBUaGlzIGlzIHVuZG9jdW1lbnRlZCBhbmRcbiAgICAvLyBvbmx5IGhlcmUgZm9yIHRoZSBwdXJwb3NlcyBvZiB0ZXN0aW5nIGRldmVsb3BtZW50IG9mIFdEQVxuICAgIHRoaXMuYm9vdHN0cmFwUGF0aCA9IGJvb3RzdHJhcFBhdGggfHwgQk9PVFNUUkFQX1BBVEg7XG4gICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgV0RBIHBhdGg6ICcke3RoaXMuYm9vdHN0cmFwUGF0aH0nYCk7XG5cbiAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc3BlY2lmeSBhZ2VudFBhdGggdG9vXG4gICAgdGhpcy5hZ2VudFBhdGggPSBhZ2VudFBhdGggfHwgcGF0aC5yZXNvbHZlKHRoaXMuYm9vdHN0cmFwUGF0aCwgJ1dlYkRyaXZlckFnZW50Lnhjb2RlcHJvaicpO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBhZ2VudDogJyR7dGhpcy5hZ2VudFBhdGh9J2ApO1xuICB9XG5cbiAgYXN5bmMgY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzICgpIHtcbiAgICBjb25zdCBvYnNvbGV0ZVBpZHMgPSBhd2FpdCBnZXRQSURzTGlzdGVuaW5nT25Qb3J0KHRoaXMudXJsLnBvcnQsXG4gICAgICAoY21kTGluZSkgPT4gY21kTGluZS5pbmNsdWRlcygnL1dlYkRyaXZlckFnZW50UnVubmVyJykgJiZcbiAgICAgICAgIWNtZExpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmRldmljZS51ZGlkLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgIGlmIChfLmlzRW1wdHkob2Jzb2xldGVQaWRzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYE5vIG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzZXMgZnJvbSBwcmV2aW91cyBXREEgc2Vzc2lvbnMgYCArXG4gICAgICAgIGBsaXN0ZW5pbmcgb24gcG9ydCAke3RoaXMudXJsLnBvcnR9IGhhdmUgYmVlbiBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oYERldGVjdGVkICR7b2Jzb2xldGVQaWRzLmxlbmd0aH0gb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3Mke29ic29sZXRlUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9IGAgK1xuICAgICAgYGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zLiBDbGVhbmluZyB0aGVtIHVwYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ2tpbGwnLCBvYnNvbGV0ZVBpZHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEZhaWxlZCB0byBraWxsIG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSAnJHtvYnNvbGV0ZVBpZHN9Jy4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGlmIFdEQSBpcyBydW5uaW5nIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIFdEQSBpcyBydW5uaW5nXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGlzUnVubmluZyAoKSB7XG4gICAgcmV0dXJuICEhKGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCkpO1xuICB9XG5cbiAgZ2V0IGJhc2VQYXRoICgpIHtcbiAgICBpZiAodGhpcy51cmwucGF0aCA9PT0gJy8nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybC5wYXRoIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjdXJyZW50IHJ1bm5pbmcgV0RBJ3Mgc3RhdHVzIGxpa2UgYmVsb3dcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEByZXR1cm4gez9vYmplY3R9IFN0YXRlIE9iamVjdFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMgKCkge1xuICAgIGNvbnN0IG5vU2Vzc2lvblByb3h5ID0gbmV3IE5vU2Vzc2lvblByb3h5KHtcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IDMwMDAsXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBub1Nlc3Npb25Qcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFdEQSBpcyBub3QgbGlzdGVuaW5nIGF0ICcke3RoaXMudXJsLmhyZWZ9J2ApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuaW5zdGFsbCBXREFzIGZyb20gdGhlIHRlc3QgZGV2aWNlLlxuICAgKiBPdmVyIFhjb2RlIDExLCBtdWx0aXBsZSBXREEgY2FuIGJlIGluIHRoZSBkZXZpY2Ugc2luY2UgWGNvZGUgMTEgZ2VuZXJhdGVzIGRpZmZlcmVudCBXREEuXG4gICAqIEFwcGl1bSBkb2VzIG5vdCBleHBlY3QgbXVsdGlwbGUgV0RBcyBhcmUgcnVubmluZyBvbiBhIGRldmljZS5cbiAgICovXG4gIGFzeW5jIHVuaW5zdGFsbCAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1bmRsZUlkcyA9IGF3YWl0IHRoaXMuZGV2aWNlLmdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUoV0RBX0NGX0JVTkRMRV9OQU1FKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoYnVuZGxlSWRzKSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gV0RBcyBvbiB0aGUgZGV2aWNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBVbmluc3RhbGxpbmcgV0RBczogJyR7YnVuZGxlSWRzfSdgKTtcbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgYnVuZGxlSWRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLnJlbW92ZUFwcChidW5kbGVJZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB0aGlzLmxvZy53YXJuKGBXZWJEcml2ZXJBZ2VudCB1bmluc3RhbGwgZmFpbGVkLiBQZXJoYXBzLCBpdCBpcyBhbHJlYWR5IHVuaW5zdGFsbGVkPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfY2xlYW51cFByb2plY3RJZkZyZXNoICgpIHtcbiAgICBjb25zdCBob21lRm9sZGVyID0gcHJvY2Vzcy5lbnYuSE9NRTtcbiAgICBpZiAoIWhvbWVGb2xkZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1RoZSBIT01FIGZvbGRlciBwYXRoIGNhbm5vdCBiZSBkZXRlcm1pbmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFVwZ3JhZGVUaW1lc3RhbXAgPSBhd2FpdCBnZXRXREFVcGdyYWRlVGltZXN0YW1wKCk7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ0l0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHBhY2thZ2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lc3RhbXBQYXRoID0gcGF0aC5yZXNvbHZlKGhvbWVGb2xkZXIsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIKTtcbiAgICBjb25zdCBkaWRUaW1lc3RhbXBFeGlzdCA9IGF3YWl0IGZzLmV4aXN0cyh0aW1lc3RhbXBQYXRoKTtcbiAgICBpZiAoZGlkVGltZXN0YW1wRXhpc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aW1lc3RhbXBQYXRoLCBmcy5XX09LKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScgaXMgbm90IHdyaXRlYWJsZS4gYCArXG4gICAgICAgICAgYFNraXBwaW5nIHNvdXJjZXMgY2xlYW51cGApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZWNlbnRVcGdyYWRlVGltZXN0YW1wID0gcGFyc2VJbnQoYXdhaXQgZnMucmVhZEZpbGUodGltZXN0YW1wUGF0aCwgJ3V0ZjgnKSwgMTApO1xuICAgICAgaWYgKF8uaXNJbnRlZ2VyKHJlY2VudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICAgIGlmIChyZWNlbnRVcGdyYWRlVGltZXN0YW1wID49IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wKSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgZG9lcyBub3QgbmVlZCBhIGNsZWFudXAuIFRoZSBzb3VyY2VzIGFyZSB1cCB0byBkYXRlIGAgK1xuICAgICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9ID49ICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9KWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCBzb3VyY2VzIGhhdmUgYmVlbiB1cGdyYWRlZCBgICtcbiAgICAgICAgICBgKCR7cmVjZW50VXBncmFkZVRpbWVzdGFtcH0gPCAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFRoZSByZWNlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIGNvcnJ1cHRlZC4gVHJ5aW5nIHRvIGZpeCBpdGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBta2RpcnAocGF0aC5kaXJuYW1lKHRpbWVzdGFtcFBhdGgpKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0aW1lc3RhbXBQYXRoLCBgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH1gLCAndXRmOCcpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFN0b3JlZCB0aGUgcmVjZW50IFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9IGAgK1xuICAgICAgICBgYXQgJyR7dGltZXN0YW1wUGF0aH0nYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVW5hYmxlIHRvIGNyZWF0ZSB0aGUgcmVjZW50IFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9Jy4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkaWRUaW1lc3RhbXBFeGlzdCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnVGhlcmUgaXMgbm8gbmVlZCB0byBwZXJmb3JtIHRoZSBwcm9qZWN0IGNsZWFudXAuIEEgZnJlc2ggaW5zdGFsbCBoYXMgYmVlbiBkZXRlY3RlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuY2xlYW5Qcm9qZWN0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBlcmZvcm0gV2ViRHJpdmVyQWdlbnQgcHJvamVjdCBjbGVhbnVwLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjdXJyZW50IHJ1bm5pbmcgV0RBJ3Mgc3RhdHVzIGxpa2UgYmVsb3cgYWZ0ZXIgbGF1bmNoaW5nIFdEQVxuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgbGF1bmNoIChzZXNzaW9uSWQpIHtcbiAgICBpZiAodGhpcy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgcHJvdmlkZWQgV2ViZHJpdmVyQWdlbnQgYXQgJyR7dGhpcy53ZWJEcml2ZXJBZ2VudFVybH0nYCk7XG4gICAgICB0aGlzLnVybCA9IHRoaXMud2ViRHJpdmVyQWdlbnRVcmw7XG4gICAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbygnTGF1bmNoaW5nIFdlYkRyaXZlckFnZW50IG9uIHRoZSBkZXZpY2UnKTtcblxuICAgIHRoaXMuc2V0dXBQcm94aWVzKHNlc3Npb25JZCk7XG5cbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiAhYXdhaXQgZnMuZXhpc3RzKHRoaXMuYWdlbnRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcnlpbmcgdG8gdXNlIFdlYkRyaXZlckFnZW50IHByb2plY3QgYXQgJyR7dGhpcy5hZ2VudFBhdGh9JyBidXQgdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgfVxuXG4gICAgLy8gdXNlWGN0ZXN0cnVuRmlsZSBhbmQgdXNlUHJlYnVpbHRXREEgdXNlIGV4aXN0aW5nIGRlcGVuZGVuY2llc1xuICAgIC8vIEl0IGRlcGVuZHMgb24gdXNlciBzaWRlXG4gICAgaWYgKHRoaXMuaWRiIHx8IHRoaXMudXNlWGN0ZXN0cnVuRmlsZSB8fCAodGhpcy5kZXJpdmVkRGF0YVBhdGggJiYgdGhpcy51c2VQcmVidWlsdFdEQSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwZWQgV0RBIHByb2plY3QgY2xlYW51cCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNhcGFiaWxpdGllcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW5jaHJvbml6YXRpb25LZXkgPSBwYXRoLm5vcm1hbGl6ZSh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgICAgYXdhaXQgU0hBUkVEX1JFU09VUkNFU19HVUFSRC5hY3F1aXJlKHN5bmNocm9uaXphdGlvbktleSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fY2xlYW51cFByb2plY3RJZkZyZXNoKCkpO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gcHJvdmlkZSBXREEgbG9jYWwgcG9ydCwgYmVjYXVzZSBpdCBtaWdodCBiZSBvY2N1cGllZFxuICAgIGF3YWl0IHJlc2V0VGVzdFByb2Nlc3Nlcyh0aGlzLmRldmljZS51ZGlkLCAhdGhpcy5pc1JlYWxEZXZpY2UpO1xuXG4gICAgaWYgKHRoaXMuaWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFdpdGhJREIoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuaW5pdCh0aGlzLm5vU2Vzc2lvblByb3h5KTtcblxuICAgIC8vIFN0YXJ0IHRoZSB4Y29kZWJ1aWxkIHByb2Nlc3NcbiAgICBpZiAodGhpcy5wcmVidWlsZFdEQSkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnByZWJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuc3RhcnQoKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2l0aElEQiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnV2lsbCBsYXVuY2ggV0RBIHdpdGggaWRiIGluc3RlYWQgb2YgeGNvZGVidWlsZCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyBmbGFnIGlzIGVuYWJsZWQnKTtcbiAgICBjb25zdCB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZH0gPSBhd2FpdCB0aGlzLnByZXBhcmVXREEoKTtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkLFxuICAgIH07XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGIucnVuWENVSVRlc3Qod2RhQnVuZGxlSWQsIHdkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHtlbnZ9KTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlQnVuZGxlSWQgKHdkYUJ1bmRsZVBhdGgpIHtcbiAgICBjb25zdCBpbmZvUGxpc3RQYXRoID0gcGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdJbmZvLnBsaXN0Jyk7XG4gICAgY29uc3QgaW5mb1BsaXN0ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdChhd2FpdCBmcy5yZWFkRmlsZShpbmZvUGxpc3RQYXRoKSk7XG4gICAgaWYgKCFpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGJ1bmRsZSBpZCBpbiAnJHtpbmZvUGxpc3RQYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm9QbGlzdC5DRkJ1bmRsZUlkZW50aWZpZXI7XG4gIH1cblxuICBhc3luYyBwcmVwYXJlV0RBICgpIHtcbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRoID0gdGhpcy53ZGFCdW5kbGVQYXRoIHx8IGF3YWl0IHRoaXMuZmV0Y2hXREFCdW5kbGUoKTtcbiAgICBjb25zdCB3ZGFCdW5kbGVJZCA9IGF3YWl0IHRoaXMucGFyc2VCdW5kbGVJZCh3ZGFCdW5kbGVQYXRoKTtcbiAgICBpZiAoIWF3YWl0IHRoaXMuZGV2aWNlLmlzQXBwSW5zdGFsbGVkKHdkYUJ1bmRsZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZXZpY2UuaW5zdGFsbEFwcCh3ZGFCdW5kbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgdGVzdEJ1bmRsZUlkID0gYXdhaXQgdGhpcy5pZGIuaW5zdGFsbFhDVGVzdEJ1bmRsZShwYXRoLmpvaW4od2RhQnVuZGxlUGF0aCwgJ1BsdWdJbnMnLCAnV2ViRHJpdmVyQWdlbnRSdW5uZXIueGN0ZXN0JykpO1xuICAgIHJldHVybiB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZCwgd2RhQnVuZGxlUGF0aH07XG4gIH1cblxuICBhc3luYyBmZXRjaFdEQUJ1bmRsZSAoKSB7XG4gICAgaWYgKCF0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJ1bmRsZVdEQVNpbSh0aGlzLnhjb2RlYnVpbGQpO1xuICAgIH1cbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9LyoqLyoke1dEQV9SVU5ORVJfQVBQfS9gLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAoXy5pc0VtcHR5KHdkYUJ1bmRsZVBhdGhzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgV0RBIGJ1bmRsZSBpbiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiB3ZGFCdW5kbGVQYXRoc1swXTtcbiAgfVxuXG4gIGFzeW5jIGlzU291cmNlRnJlc2ggKCkge1xuICAgIGNvbnN0IGV4aXN0c1Byb21pc2VzID0gW1xuICAgICAgJ1Jlc291cmNlcycsXG4gICAgICBgUmVzb3VyY2VzJHtwYXRoLnNlcH1XZWJEcml2ZXJBZ2VudC5idW5kbGVgLFxuICAgIF0ubWFwKChzdWJQYXRoKSA9PiBmcy5leGlzdHMocGF0aC5yZXNvbHZlKHRoaXMuYm9vdHN0cmFwUGF0aCwgc3ViUGF0aCkpKTtcbiAgICByZXR1cm4gKGF3YWl0IEIuYWxsKGV4aXN0c1Byb21pc2VzKSkuc29tZSgodikgPT4gdiA9PT0gZmFsc2UpO1xuICB9XG5cbiAgc2V0dXBQcm94aWVzIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogdGhpcy53ZGFDb25uZWN0aW9uVGltZW91dCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLmp3cHJveHkuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuXG4gICAgdGhpcy5ub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eShwcm94eU9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biBzdWItcHJvY2Vzc2VzJyk7XG5cbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucXVpdCgpO1xuICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5yZXNldCgpO1xuXG4gICAgaWYgKHRoaXMuandwcm94eSkge1xuICAgICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgLy8gaWYgd2UgcG9wdWxhdGVkIHRoZSB1cmwgb3Vyc2VsdmVzIChkdXJpbmcgYHNldHVwQ2FjaGluZ2AgY2FsbCwgZm9yIGluc3RhbmNlKVxuICAgICAgLy8gdGhlbiBjbGVhbiB0aGF0IHVwLiBJZiB0aGUgdXJsIHdhcyBzdXBwbGllZCwgd2Ugd2FudCB0byBrZWVwIGl0XG4gICAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgICAgICBjb25zdCB7cHJvdG9jb2wsIGhvc3RuYW1lfSA9IHVybC5wYXJzZSh0aGlzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMKTtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX06JHtwb3J0fWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgc2V0IHVybCAoX3VybCkge1xuICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShfdXJsKTtcbiAgfVxuXG4gIGdldCBmdWxseVN0YXJ0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ZWQ7XG4gIH1cblxuICBzZXQgZnVsbHlTdGFydGVkIChzdGFydGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBzdGFydGVkO1xuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXVzZSBydW5uaW5nIFdEQSBpZiBpdCBoYXMgdGhlIHNhbWUgYnVuZGxlIGlkIHdpdGggdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBPciByZXVzZSBpdCBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgaWQgd2l0aG91dCB1cGRhdGVkV0RBQnVuZGxlSWQuXG4gICAqIFVuaW5zdGFsbCBpdCBpZiB0aGUgbWV0aG9kIGZhY2VzIGFuIGV4Y2VwdGlvbiBmb3IgdGhlIGFib3ZlIHNpdHVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVwZGF0ZWRXREFCdW5kbGVJZCBCdW5kbGVJZCB5b3UnZCBsaWtlIHRvIHVzZVxuICAgKi9cbiAgYXN5bmMgc2V0dXBDYWNoaW5nICgpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIGlmICghc3RhdHVzIHx8ICFzdGF0dXMuYnVpbGQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdXREEgaXMgY3VycmVudGx5IG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIGNhY2hlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIsXG4gICAgICB1cGdyYWRlZEF0LFxuICAgIH0gPSBzdGF0dXMuYnVpbGQ7XG4gICAgLy8gZm9yIHJlYWwgZGV2aWNlXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmIHV0aWwuaGFzVmFsdWUodGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkICE9PSBwcm9kdWN0QnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCBidW5kbGUgaWQuIFRoZSBhY3R1YWwgdmFsdWUgaXMgJyR7cHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJ9Jy5gKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICAgIH1cbiAgICAvLyBmb3Igc2ltdWxhdG9yXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmICF1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiBXREFfUlVOTkVSX0JVTkRMRV9JRCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0cyBidW5kbGUgaWQgaXMgbm90IGVxdWFsIHRvIHRoZSBkZWZhdWx0IHZhbHVlICR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9YCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudGx5IGJ1bmRsZWQgV0RBOiAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFVwZ3JhZGUgdGltZXN0YW1wIG9mIHRoZSBXREEgb24gdGhlIGRldmljZTogJHt1cGdyYWRlZEF0fWApO1xuICAgIGlmIChhY3R1YWxVcGdyYWRlVGltZXN0YW1wICYmIHVwZ3JhZGVkQXQgJiYgXy50b0xvd2VyKGAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCkgIT09IF8udG9Mb3dlcihgJHt1cGdyYWRlZEF0fWApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdCBoYXMgZGlmZmVyZW50IHZlcnNpb24gaW4gY29tcGFyaXNvbiB0byB0aGUgb25lICcgK1xuICAgICAgICBgd2hpY2ggaXMgYnVuZGxlZCB3aXRoIGFwcGl1bS14Y3VpdGVzdC1kcml2ZXIgbW9kdWxlICgke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9ICE9ICR7dXBncmFkZWRBdH0pYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdXRpbC5oYXNWYWx1ZShwcm9kdWN0QnVuZGxlSWRlbnRpZmllcilcbiAgICAgID8gYFdpbGwgcmV1c2UgcHJldmlvdXNseSBjYWNoZWQgV0RBIGluc3RhbmNlIGF0ICcke3RoaXMudXJsLmhyZWZ9JyB3aXRoICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfSdgXG4gICAgICA6IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfSdgO1xuICAgIHRoaXMubG9nLmluZm8oYCR7bWVzc2FnZX0uIFNldCB0aGUgd2RhTG9jYWxQb3J0IGNhcGFiaWxpdHkgdG8gYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSAke3RoaXMudXJsLnBvcnR9IGlmIHRoaXMgaXMgYW4gdW5kZXNpcmVkIGJlaGF2aW9yLmApO1xuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSB0aGlzLnVybC5ocmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aXQgYW5kIHVuaW5zdGFsbCBydW5uaW5nIFdEQS5cbiAgICovXG4gIGFzeW5jIHF1aXRBbmRVbmluc3RhbGwgKCkge1xuICAgIGF3YWl0IHRoaXMucXVpdCgpO1xuICAgIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2ViRHJpdmVyQWdlbnQ7XG5leHBvcnQgeyBXZWJEcml2ZXJBZ2VudCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQSxNQUFNQSxrQkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUNwQyxNQUFNQyxjQUFjLEdBQUcsSUFBSTtBQUMzQixNQUFNQyxrQkFBa0IsR0FBRyw2QkFBNkI7QUFDeEQsTUFBTUMsc0JBQXNCLEdBQUcsSUFBSUMsa0JBQVMsRUFBRTtBQUU5QyxNQUFNQyxjQUFjLENBQUM7RUFDbkJDLFdBQVcsQ0FBRUMsWUFBWSxFQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUVDLEdBQUcsR0FB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
368
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwieGNvZGVidWlsZCIsIlhjb2RlQnVpbGQiLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwibGF1bmNoVGltZW91dCIsIndkYUxhdW5jaFRpbWVvdXQiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiQk9PVFNUUkFQX1BBVEgiLCJpbmZvIiwicGF0aCIsInJlc29sdmUiLCJjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMiLCJvYnNvbGV0ZVBpZHMiLCJnZXRQSURzTGlzdGVuaW5nT25Qb3J0IiwidXJsIiwicG9ydCIsImNtZExpbmUiLCJpbmNsdWRlcyIsInRvTG93ZXJDYXNlIiwidWRpZCIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsImV4ZWMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJpc1J1bm5pbmciLCJnZXRTdGF0dXMiLCJiYXNlUGF0aCIsIm5vU2Vzc2lvblByb3h5IiwiTm9TZXNzaW9uUHJveHkiLCJzZXJ2ZXIiLCJob3N0bmFtZSIsImJhc2UiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImVyciIsImhyZWYiLCJ1bmluc3RhbGwiLCJidW5kbGVJZHMiLCJnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIiwiYnVuZGxlSWQiLCJyZW1vdmVBcHAiLCJfY2xlYW51cFByb2plY3RJZkZyZXNoIiwiaG9tZUZvbGRlciIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwiY3VycmVudFVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsIldEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIIiwiZGlkVGltZXN0YW1wRXhpc3QiLCJmcyIsImV4aXN0cyIsImFjY2VzcyIsIldfT0siLCJpZ24iLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIm1rZGlycCIsImRpcm5hbWUiLCJ3cml0ZUZpbGUiLCJjbGVhblByb2plY3QiLCJsYXVuY2giLCJzZXNzaW9uSWQiLCJzZXR1cFByb3hpZXMiLCJFcnJvciIsInN5bmNocm9uaXphdGlvbktleSIsIm5vcm1hbGl6ZSIsImFjcXVpcmUiLCJyZXNldFRlc3RQcm9jZXNzZXMiLCJzdGFydFdpdGhJREIiLCJpbml0IiwicHJlYnVpbGQiLCJzdGFydCIsIndkYUJ1bmRsZUlkIiwidGVzdEJ1bmRsZUlkIiwicHJlcGFyZVdEQSIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJNSlBFR19TRVJWRVJfUE9SVCIsInJ1blhDVUlUZXN0IiwicGFyc2VCdW5kbGVJZCIsImluZm9QbGlzdFBhdGgiLCJqb2luIiwiaW5mb1BsaXN0IiwicGxpc3QiLCJwYXJzZVBsaXN0IiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwiZmV0Y2hXREFCdW5kbGUiLCJpc0FwcEluc3RhbGxlZCIsImluc3RhbGxBcHAiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwiYnVuZGxlV0RBU2ltIiwid2RhQnVuZGxlUGF0aHMiLCJnbG9iIiwiV0RBX1JVTk5FUl9BUFAiLCJhYnNvbHV0ZSIsImlzU291cmNlRnJlc2giLCJleGlzdHNQcm9taXNlcyIsInNlcCIsIm1hcCIsInN1YlBhdGgiLCJCIiwiYWxsIiwic29tZSIsInYiLCJwcm94eU9wdHMiLCJrZWVwQWxpdmUiLCJqd3Byb3h5IiwiSldQcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsInF1aXQiLCJyZXNldCIsIl91cmwiLCJwYXJzZSIsInByb3RvY29sIiwiZnVsbHlTdGFydGVkIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJzZXR1cENhY2hpbmciLCJzdGF0dXMiLCJidWlsZCIsInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyIiwidXBncmFkZWRBdCIsInV0aWwiLCJoYXNWYWx1ZSIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiYWN0dWFsVXBncmFkZVRpbWVzdGFtcCIsInRvTG93ZXIiLCJxdWl0QW5kVW5pbnN0YWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE5vU2Vzc2lvblByb3h5IH0gZnJvbSAnLi9uby1zZXNzaW9uLXByb3h5JztcbmltcG9ydCB7XG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcywgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgQk9PVFNUUkFQX1BBVEhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYnVuZGxlV0RBU2ltIH0gZnJvbSAnLi9jaGVjay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFdEQV9SVU5ORVJfQVBQLCBXREFfQkFTRV9VUkwsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRILFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSBhcmdzLndlYkRyaXZlckFnZW50VXJsO1xuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLndkYUNvbm5lY3Rpb25UaW1lb3V0ID0gYXJncy53ZGFDb25uZWN0aW9uVGltZW91dDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCA9IGFyZ3MudXBkYXRlZFdEQUJ1bmRsZUlkO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQodGhpcy54Y29kZVZlcnNpb24sIHRoaXMuZGV2aWNlLCB7XG4gICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZSxcbiAgICAgIGlvc1Nka1ZlcnNpb246IHRoaXMuaW9zU2RrVmVyc2lvbixcbiAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICBib290c3RyYXBQYXRoOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICByZWFsRGV2aWNlOiB0aGlzLmlzUmVhbERldmljZSxcbiAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICB4Y29kZUNvbmZpZ0ZpbGU6IGFyZ3MueGNvZGVDb25maWdGaWxlLFxuICAgICAgeGNvZGVPcmdJZDogYXJncy54Y29kZU9yZ0lkLFxuICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICBrZXljaGFpblBhdGg6IGFyZ3Mua2V5Y2hhaW5QYXRoLFxuICAgICAga2V5Y2hhaW5QYXNzd29yZDogYXJncy5rZXljaGFpblBhc3N3b3JkLFxuICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgIHVzZVByZWJ1aWx0V0RBOiBhcmdzLnVzZVByZWJ1aWx0V0RBLFxuICAgICAgdXBkYXRlZFdEQUJ1bmRsZUlkOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICB3ZGFSZW1vdGVQb3J0OiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICB1c2VYY3Rlc3RydW5GaWxlOiB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUsXG4gICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgbWpwZWdTZXJ2ZXJQb3J0OiB0aGlzLm1qcGVnU2VydmVyUG9ydCxcbiAgICAgIGFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uOiBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uLFxuICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgcmVzdWx0QnVuZGxlVmVyc2lvbjogYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uLFxuICAgIH0sIHRoaXMubG9nKTtcbiAgfVxuXG4gIHNldFdEQVBhdGhzIChib290c3RyYXBQYXRoLCBhZ2VudFBhdGgpIHtcbiAgICAvLyBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcGxhY2UgZm9yIFdEQS4gVGhpcyBpcyB1bmRvY3VtZW50ZWQgYW5kXG4gICAgLy8gb25seSBoZXJlIGZvciB0aGUgcHVycG9zZXMgb2YgdGVzdGluZyBkZXZlbG9wbWVudCBvZiBXREFcbiAgICB0aGlzLmJvb3RzdHJhcFBhdGggPSBib290c3RyYXBQYXRoIHx8IEJPT1RTVFJBUF9QQVRIO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBwYXRoOiAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYWdlbnRQYXRoIHRvb1xuICAgIHRoaXMuYWdlbnRQYXRoID0gYWdlbnRQYXRoIHx8IHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsICdXZWJEcml2ZXJBZ2VudC54Y29kZXByb2onKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgYWdlbnQ6ICcke3RoaXMuYWdlbnRQYXRofSdgKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gICAgY29uc3Qgb2Jzb2xldGVQaWRzID0gYXdhaXQgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCh0aGlzLnVybC5wb3J0LFxuICAgICAgKGNtZExpbmUpID0+IGNtZExpbmUuaW5jbHVkZXMoJy9XZWJEcml2ZXJBZ2VudFJ1bm5lcicpICYmXG4gICAgICAgICFjbWRMaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5kZXZpY2UudWRpZC50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAoXy5pc0VtcHR5KG9ic29sZXRlUGlkcykpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBjYWNoZWQgcHJvY2Vzc2VzIGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zIGAgK1xuICAgICAgICBgbGlzdGVuaW5nIG9uIHBvcnQgJHt0aGlzLnVybC5wb3J0fSBoYXZlIGJlZW4gZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBEZXRlY3RlZCAke29ic29sZXRlUGlkcy5sZW5ndGh9IG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSBgICtcbiAgICAgIGBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucy4gQ2xlYW5pbmcgdGhlbSB1cGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgb2Jzb2xldGVQaWRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8ga2lsbCBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gJyR7b2Jzb2xldGVQaWRzfScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpZiBXREEgaXMgcnVubmluZyBvciBub3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXREEgaXMgcnVubmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmdldFN0YXR1cygpKTtcbiAgfVxuXG4gIGdldCBiYXNlUGF0aCAoKSB7XG4gICAgaWYgKHRoaXMudXJsLnBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmwucGF0aCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93XG4gICAqIHtcbiAgICogICBcInN0YXRlXCI6IFwic3VjY2Vzc1wiLFxuICAgKiAgIFwib3NcIjoge1xuICAgKiAgICAgXCJuYW1lXCI6IFwiaU9TXCIsXG4gICAqICAgICBcInZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcInNka1ZlcnNpb25cIjogXCIxMS4zXCJcbiAgICogICB9LFxuICAgKiAgIFwiaW9zXCI6IHtcbiAgICogICAgIFwic2ltdWxhdG9yVmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwiaXBcIjogXCIxNzIuMjU0Ljk5LjM0XCJcbiAgICogICB9LFxuICAgKiAgIFwiYnVpbGRcIjoge1xuICAgKiAgICAgXCJ0aW1lXCI6IFwiSnVuIDI0IDIwMTggMTc6MDg6MjFcIixcbiAgICogICAgIFwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJcIjogXCJjb20uZmFjZWJvb2suV2ViRHJpdmVyQWdlbnRSdW5uZXJcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICBjb25zdCBub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMudXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdGhpcy51cmwucG9ydCxcbiAgICAgIGJhc2U6IHRoaXMuYmFzZVBhdGgsXG4gICAgICB0aW1lb3V0OiAzMDAwLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBXREEgaXMgbm90IGxpc3RlbmluZyBhdCAnJHt0aGlzLnVybC5ocmVmfSdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgV0RBcyBmcm9tIHRoZSB0ZXN0IGRldmljZS5cbiAgICogT3ZlciBYY29kZSAxMSwgbXVsdGlwbGUgV0RBIGNhbiBiZSBpbiB0aGUgZGV2aWNlIHNpbmNlIFhjb2RlIDExIGdlbmVyYXRlcyBkaWZmZXJlbnQgV0RBLlxuICAgKiBBcHBpdW0gZG9lcyBub3QgZXhwZWN0IG11bHRpcGxlIFdEQXMgYXJlIHJ1bm5pbmcgb24gYSBkZXZpY2UuXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGVJZHMgPSBhd2FpdCB0aGlzLmRldmljZS5nZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lKFdEQV9DRl9CVU5ETEVfTkFNRSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGJ1bmRsZUlkcykpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIFdEQXMgb24gdGhlIGRldmljZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVW5pbnN0YWxsaW5nIFdEQXM6ICcke2J1bmRsZUlkc30nYCk7XG4gICAgICBmb3IgKGNvbnN0IGJ1bmRsZUlkIG9mIGJ1bmRsZUlkcykge1xuICAgICAgICBhd2FpdCB0aGlzLmRldmljZS5yZW1vdmVBcHAoYnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cud2FybihgV2ViRHJpdmVyQWdlbnQgdW5pbnN0YWxsIGZhaWxlZC4gUGVyaGFwcywgaXQgaXMgYWxyZWFkeSB1bmluc3RhbGxlZD8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2NsZWFudXBQcm9qZWN0SWZGcmVzaCAoKSB7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdJdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBwYWNrYWdlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wUGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyLCBXREFfVVBHUkFERV9USU1FU1RBTVBfUEFUSCk7XG4gICAgY29uc3QgZGlkVGltZXN0YW1wRXhpc3QgPSBhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCk7XG4gICAgaWYgKGRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGltZXN0YW1wUGF0aCwgZnMuV19PSyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBzb3VyY2VzIGNsZWFudXBgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IGRvZXMgbm90IG5lZWQgYSBjbGVhbnVwLiBUaGUgc291cmNlcyBhcmUgdXAgdG8gZGF0ZSBgICtcbiAgICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA+PSAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSlgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBUaGUgcmVjZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBjb3JydXB0ZWQuIFRyeWluZyB0byBmaXggaXRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZSh0aW1lc3RhbXBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGltZXN0YW1wUGF0aCwgYCR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9YCwgJ3V0ZjgnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTdG9yZWQgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSBgICtcbiAgICAgICAgYGF0ICcke3RpbWVzdGFtcFBhdGh9J2ApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGlkVGltZXN0YW1wRXhpc3QpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1RoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB0aGUgcHJvamVjdCBjbGVhbnVwLiBBIGZyZXNoIGluc3RhbGwgaGFzIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmNsZWFuUHJvamVjdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwZXJmb3JtIFdlYkRyaXZlckFnZW50IHByb2plY3QgY2xlYW51cC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93IGFmdGVyIGxhdW5jaGluZyBXREFcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGxhdW5jaCAoc2Vzc2lvbklkKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIHByb3ZpZGVkIFdlYmRyaXZlckFnZW50IGF0ICcke3RoaXMud2ViRHJpdmVyQWdlbnRVcmx9J2ApO1xuICAgICAgdGhpcy51cmwgPSB0aGlzLndlYkRyaXZlckFnZW50VXJsO1xuICAgICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlJyk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmFnZW50UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGF0ICcke3RoaXMuYWdlbnRQYXRofScgYnV0IHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIC8vIHVzZVhjdGVzdHJ1bkZpbGUgYW5kIHVzZVByZWJ1aWx0V0RBIHVzZSBleGlzdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyBJdCBkZXBlbmRzIG9uIHVzZXIgc2lkZVxuICAgIGlmICh0aGlzLmlkYiB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgfHwgKHRoaXMuZGVyaXZlZERhdGFQYXRoICYmIHRoaXMudXNlUHJlYnVpbHRXREEpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGVkIFdEQSBwcm9qZWN0IGNsZWFudXAgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3luY2hyb25pemF0aW9uS2V5ID0gcGF0aC5ub3JtYWxpemUodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICAgIGF3YWl0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQuYWNxdWlyZShzeW5jaHJvbml6YXRpb25LZXksXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NsZWFudXBQcm9qZWN0SWZGcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgV0RBIGxvY2FsIHBvcnQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgb2NjdXBpZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModGhpcy5kZXZpY2UudWRpZCwgIXRoaXMuaXNSZWFsRGV2aWNlKTtcblxuICAgIGlmICh0aGlzLmlkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRXaXRoSURCKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmluaXQodGhpcy5ub1Nlc3Npb25Qcm94eSk7XG5cbiAgICAvLyBTdGFydCB0aGUgeGNvZGVidWlsZCBwcm9jZXNzXG4gICAgaWYgKHRoaXMucHJlYnVpbGRXREEpIHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5wcmVidWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydFdpdGhJREIgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1dpbGwgbGF1bmNoIFdEQSB3aXRoIGlkYiBpbnN0ZWFkIG9mIHhjb2RlYnVpbGQgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZyBpcyBlbmFibGVkJyk7XG4gICAgY29uc3Qge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWR9ID0gYXdhaXQgdGhpcy5wcmVwYXJlV0RBKCk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRiLnJ1blhDVUlUZXN0KHdkYUJ1bmRsZUlkLCB3ZGFCdW5kbGVJZCwgdGVzdEJ1bmRsZUlkLCB7ZW52fSk7XG4gIH1cblxuICBhc3luYyBwYXJzZUJ1bmRsZUlkICh3ZGFCdW5kbGVQYXRoKSB7XG4gICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGguam9pbih3ZGFCdW5kbGVQYXRoLCAnSW5mby5wbGlzdCcpO1xuICAgIGNvbnN0IGluZm9QbGlzdCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3QoYXdhaXQgZnMucmVhZEZpbGUoaW5mb1BsaXN0UGF0aCkpO1xuICAgIGlmICghaW5mb1BsaXN0LkNGQnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBidW5kbGUgaWQgaW4gJyR7aW5mb1BsaXN0UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdEQSAoKSB7XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHRoaXMud2RhQnVuZGxlUGF0aCB8fCBhd2FpdCB0aGlzLmZldGNoV0RBQnVuZGxlKCk7XG4gICAgY29uc3Qgd2RhQnVuZGxlSWQgPSBhd2FpdCB0aGlzLnBhcnNlQnVuZGxlSWQod2RhQnVuZGxlUGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmRldmljZS5pc0FwcEluc3RhbGxlZCh3ZGFCdW5kbGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLmluc3RhbGxBcHAod2RhQnVuZGxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRlc3RCdW5kbGVJZCA9IGF3YWl0IHRoaXMuaWRiLmluc3RhbGxYQ1Rlc3RCdW5kbGUocGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdQbHVnSW5zJywgJ1dlYkRyaXZlckFnZW50UnVubmVyLnhjdGVzdCcpKTtcbiAgICByZXR1cm4ge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHdkYUJ1bmRsZVBhdGh9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXREFCdW5kbGUgKCkge1xuICAgIGlmICghdGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBhd2FpdCBidW5kbGVXREFTaW0odGhpcy54Y29kZWJ1aWxkKTtcbiAgICB9XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZGVyaXZlZERhdGFQYXRofS8qKi8qJHtXREFfUlVOTkVSX0FQUH0vYCwge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKF8uaXNFbXB0eSh3ZGFCdW5kbGVQYXRocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIFdEQSBidW5kbGUgaW4gJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aHNbMF07XG4gIH1cblxuICBhc3luYyBpc1NvdXJjZUZyZXNoICgpIHtcbiAgICBjb25zdCBleGlzdHNQcm9taXNlcyA9IFtcbiAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgYFJlc291cmNlcyR7cGF0aC5zZXB9V2ViRHJpdmVyQWdlbnQuYnVuZGxlYCxcbiAgICBdLm1hcCgoc3ViUGF0aCkgPT4gZnMuZXhpc3RzKHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsIHN1YlBhdGgpKSk7XG4gICAgcmV0dXJuIChhd2FpdCBCLmFsbChleGlzdHNQcm9taXNlcykpLnNvbWUoKHYpID0+IHYgPT09IGZhbHNlKTtcbiAgfVxuXG4gIHNldHVwUHJveGllcyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuandwcm94eSA9IG5ldyBKV1Byb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcblxuICAgIHRoaXMubm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkocHJveHlPcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1NodXR0aW5nIGRvd24gc3ViLXByb2Nlc3NlcycpO1xuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLmp3cHJveHkpIHtcbiAgICAgIHRoaXMuandwcm94eS5zZXNzaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIC8vIGlmIHdlIHBvcHVsYXRlZCB0aGUgdXJsIG91cnNlbHZlcyAoZHVyaW5nIGBzZXR1cENhY2hpbmdgIGNhbGwsIGZvciBpbnN0YW5jZSlcbiAgICAgIC8vIHRoZW4gY2xlYW4gdGhhdCB1cC4gSWYgdGhlIHVybCB3YXMgc3VwcGxpZWQsIHdlIHdhbnQgdG8ga2VlcCBpdFxuICAgICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIGlmICh0aGlzLndlYkRyaXZlckFnZW50VXJsKSB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZSh0aGlzLndlYkRyaXZlckFnZW50VXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICAgICAgY29uc3Qge3Byb3RvY29sLCBob3N0bmFtZX0gPSB1cmwucGFyc2UodGhpcy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHNldCB1cmwgKF91cmwpIHtcbiAgICB0aGlzLl91cmwgPSB1cmwucGFyc2UoX3VybCk7XG4gIH1cblxuICBnZXQgZnVsbHlTdGFydGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG5cbiAgc2V0IGZ1bGx5U3RhcnRlZCAoc3RhcnRlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRGVyaXZlZERhdGFQYXRoICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgcnVubmluZyBXREEgaWYgaXQgaGFzIHRoZSBzYW1lIGJ1bmRsZSBpZCB3aXRoIHVwZGF0ZWRXREFCdW5kbGVJZC5cbiAgICogT3IgcmV1c2UgaXQgaWYgaXQgaGFzIHRoZSBkZWZhdWx0IGlkIHdpdGhvdXQgdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBVbmluc3RhbGwgaXQgaWYgdGhlIG1ldGhvZCBmYWNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBhYm92ZSBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVkV0RBQnVuZGxlSWQgQnVuZGxlSWQgeW91J2QgbGlrZSB0byB1c2VcbiAgICovXG4gIGFzeW5jIHNldHVwQ2FjaGluZyAoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cyB8fCAhc3RhdHVzLmJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnV0RBIGlzIGN1cnJlbnRseSBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBjYWNoZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyLFxuICAgICAgdXBncmFkZWRBdCxcbiAgICB9ID0gc3RhdHVzLmJ1aWxkO1xuICAgIC8vIGZvciByZWFsIGRldmljZVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiB1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgYnVuZGxlIGlkLiBUaGUgYWN0dWFsIHZhbHVlIGlzICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfScuYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG4gICAgLy8gZm9yIHNpbXVsYXRvclxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiAhdXRpbC5oYXNWYWx1ZSh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkgJiYgV0RBX1JVTk5FUl9CVU5ETEVfSUQgIT09IHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdHMgYnVuZGxlIGlkIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAke1dEQV9SVU5ORVJfQlVORExFX0lEfWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVXBncmFkZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnRseSBidW5kbGVkIFdEQTogJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgV0RBIG9uIHRoZSBkZXZpY2U6ICR7dXBncmFkZWRBdH1gKTtcbiAgICBpZiAoYWN0dWFsVXBncmFkZVRpbWVzdGFtcCAmJiB1cGdyYWRlZEF0ICYmIF8udG9Mb3dlcihgJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApICE9PSBfLnRvTG93ZXIoYCR7dXBncmFkZWRBdH1gKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIGluIGNvbXBhcmlzb24gdG8gdGhlIG9uZSAnICtcbiAgICAgICAgYHdoaWNoIGlzIGJ1bmRsZWQgd2l0aCBhcHBpdW0teGN1aXRlc3QtZHJpdmVyIG1vZHVsZSAoJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfSAhPSAke3VwZ3JhZGVkQXR9KWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpXG4gICAgICA/IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfScgd2l0aCAnJHtwcm9kdWN0QnVuZGxlSWRlbnRpZmllcn0nYFxuICAgICAgOiBgV2lsbCByZXVzZSBwcmV2aW91c2x5IGNhY2hlZCBXREEgaW5zdGFuY2UgYXQgJyR7dGhpcy51cmwuaHJlZn0nYDtcbiAgICB0aGlzLmxvZy5pbmZvKGAke21lc3NhZ2V9LiBTZXQgdGhlIHdkYUxvY2FsUG9ydCBjYXBhYmlsaXR5IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gJHt0aGlzLnVybC5wb3J0fSBpZiB0aGlzIGlzIGFuIHVuZGVzaXJlZCBiZWhhdmlvci5gKTtcbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gdGhpcy51cmwuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWl0IGFuZCB1bmluc3RhbGwgcnVubmluZyBXREEuXG4gICAqL1xuICBhc3luYyBxdWl0QW5kVW5pbnN0YWxsICgpIHtcbiAgICBhd2FpdCB0aGlzLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkRyaXZlckFnZW50O1xuZXhwb3J0IHsgV2ViRHJpdmVyQWdlbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUEsTUFBTUEsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDcEMsTUFBTUMsY0FBYyxHQUFHLElBQUk7QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBQ3hELE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFTLEVBQUU7QUFFOUMsTUFBTUMsY0FBYyxDQUFDO0VBQ25CQyxXQUFXLENBQUVDLFlBQVksRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFQyxH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
@@ -1 +1 @@
1
- {"version":3,"file":"webdriveragent.js","names":["WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","xcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launch","sessionId","setupProxies","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","start","wdaBundleId","testBundleId","prepareWDA","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","status","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from 'appium/driver';\nimport { fs, util, plist, mkdirp } from 'appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_APP, WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.xcodebuild = new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n this.log.info('Shutting down sub-processes');\n\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}
1
+ {"version":3,"file":"webdriveragent.js","names":["WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","xcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launch","sessionId","setupProxies","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","start","wdaBundleId","testBundleId","prepareWDA","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","status","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist, mkdirp } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_APP, WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.xcodebuild = new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n this.log.info('Shutting down sub-processes');\n\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}