appium-ios-device 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/build/lib/mcinstall/index.js +76 -0
- package/build/lib/services.js +9 -1
- package/lib/mcinstall/index.js +89 -0
- package/lib/services.js +7 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,10 +3,8 @@ appium-ios-device
|
|
|
3
3
|
|
|
4
4
|
[](https://npmjs.org/package/appium-ios-device)
|
|
5
5
|
[](https://npmjs.org/package/appium-ios-device)
|
|
6
|
-
[](https://david-dm.org/appium/appium-ios-device/master)
|
|
7
|
-
[](https://david-dm.org/appium/appium-ios-device/master#info=devDependencies)
|
|
8
6
|
|
|
9
|
-
[](https://github.com/appium/appium-ios-device/actions/workflows/publish.js.yml)
|
|
10
8
|
|
|
11
9
|
Appium API for dealing with iOS devices. This is mainly a rewrite of libimobiledevice in nodejs. The APIs allow Appium to talk directly to the phone over usbmuxd
|
|
12
10
|
|
|
@@ -34,6 +32,7 @@ More information can be found at the links below:
|
|
|
34
32
|
- `services.startNotificationProxyService`
|
|
35
33
|
- `services.startHouseArrestService`
|
|
36
34
|
- `services.startInstrumentService`
|
|
35
|
+
- `services.startMCInstallService`
|
|
37
36
|
|
|
38
37
|
### Usage
|
|
39
38
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.MC_INSTALL_SERVICE_NAME = exports.MCInstallProxyService = void 0;
|
|
7
|
+
|
|
8
|
+
require("source-map-support/register");
|
|
9
|
+
|
|
10
|
+
var _baseService = require("../base-service");
|
|
11
|
+
|
|
12
|
+
var _support = require("@appium/support");
|
|
13
|
+
|
|
14
|
+
const MC_INSTALL_SERVICE_NAME = 'com.apple.mobile.MCInstall';
|
|
15
|
+
exports.MC_INSTALL_SERVICE_NAME = MC_INSTALL_SERVICE_NAME;
|
|
16
|
+
const ACKNOWLEDGED = 'Acknowledged';
|
|
17
|
+
|
|
18
|
+
function checkACK(res, name) {
|
|
19
|
+
if (res.Status !== ACKNOWLEDGED) {
|
|
20
|
+
throw new Error(`${name} error: ${JSON.stringify(res)}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return res;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
class MCInstallProxyService extends _baseService.BaseServicePlist {
|
|
27
|
+
constructor(socketClient) {
|
|
28
|
+
super(socketClient);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async getProfileList() {
|
|
32
|
+
const res = await this._plistService.sendPlistAndReceive({
|
|
33
|
+
RequestType: 'GetProfileList'
|
|
34
|
+
});
|
|
35
|
+
return checkACK(res, 'getProfileList');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async installProfile(path) {
|
|
39
|
+
const payload = await _support.fs.readFile(path);
|
|
40
|
+
const res = await this._plistService.sendPlistAndReceive({
|
|
41
|
+
'RequestType': 'InstallProfile',
|
|
42
|
+
'Payload': payload
|
|
43
|
+
});
|
|
44
|
+
return checkACK(res, 'installProfile');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async removeProfile(ident) {
|
|
48
|
+
const profiles = await this.getProfileList();
|
|
49
|
+
const meta = profiles.ProfileMetadata[ident];
|
|
50
|
+
|
|
51
|
+
if (!meta) {
|
|
52
|
+
throw new Error(`not find installed profile ident:${ident}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const data = _support.plist.createBinaryPlist({
|
|
56
|
+
'PayloadType': 'Configuration',
|
|
57
|
+
'PayloadIdentifier': ident,
|
|
58
|
+
'PayloadUUID': meta.PayloadUUID,
|
|
59
|
+
'PayloadVersion': meta.PayloadVersion
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const res = await this._plistService.sendPlistAndReceive({
|
|
63
|
+
'RequestType': 'RemoveProfile',
|
|
64
|
+
'ProfileIdentifier': data
|
|
65
|
+
});
|
|
66
|
+
return checkACK(res, 'removeProfile');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
exports.MCInstallProxyService = MCInstallProxyService;
|
|
72
|
+
var _default = MCInstallProxyService;
|
|
73
|
+
exports.default = _default;require('source-map-support').install();
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tY2luc3RhbGwvaW5kZXguanMiXSwibmFtZXMiOlsiTUNfSU5TVEFMTF9TRVJWSUNFX05BTUUiLCJBQ0tOT1dMRURHRUQiLCJjaGVja0FDSyIsInJlcyIsIm5hbWUiLCJTdGF0dXMiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQ0luc3RhbGxQcm94eVNlcnZpY2UiLCJCYXNlU2VydmljZVBsaXN0IiwiY29uc3RydWN0b3IiLCJzb2NrZXRDbGllbnQiLCJnZXRQcm9maWxlTGlzdCIsIl9wbGlzdFNlcnZpY2UiLCJzZW5kUGxpc3RBbmRSZWNlaXZlIiwiUmVxdWVzdFR5cGUiLCJpbnN0YWxsUHJvZmlsZSIsInBhdGgiLCJwYXlsb2FkIiwiZnMiLCJyZWFkRmlsZSIsInJlbW92ZVByb2ZpbGUiLCJpZGVudCIsInByb2ZpbGVzIiwibWV0YSIsIlByb2ZpbGVNZXRhZGF0YSIsImRhdGEiLCJwbGlzdCIsImNyZWF0ZUJpbmFyeVBsaXN0IiwiUGF5bG9hZFVVSUQiLCJQYXlsb2FkVmVyc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBR0EsTUFBTUEsdUJBQXVCLEdBQUcsNEJBQWhDOztBQUNBLE1BQU1DLFlBQVksR0FBRyxjQUFyQjs7QUFFQSxTQUFTQyxRQUFULENBQW1CQyxHQUFuQixFQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsTUFBSUQsR0FBRyxDQUFDRSxNQUFKLEtBQWVKLFlBQW5CLEVBQWlDO0FBQy9CLFVBQU0sSUFBSUssS0FBSixDQUFXLEdBQUVGLElBQUssV0FBVUcsSUFBSSxDQUFDQyxTQUFMLENBQWVMLEdBQWYsQ0FBb0IsRUFBaEQsQ0FBTjtBQUNEOztBQUNELFNBQU9BLEdBQVA7QUFDRDs7QUFFRCxNQUFNTSxxQkFBTixTQUFvQ0MsNkJBQXBDLENBQXFEO0FBQ25EQyxFQUFBQSxXQUFXLENBQUVDLFlBQUYsRUFBZ0I7QUFDekIsVUFBTUEsWUFBTjtBQUNEOztBQWlDbUIsUUFBZEMsY0FBYyxHQUFJO0FBQ3RCLFVBQU1WLEdBQUcsR0FBRyxNQUFNLEtBQUtXLGFBQUwsQ0FBbUJDLG1CQUFuQixDQUF1QztBQUFDQyxNQUFBQSxXQUFXLEVBQUU7QUFBZCxLQUF2QyxDQUFsQjtBQUNBLFdBQU9kLFFBQVEsQ0FBQ0MsR0FBRCxFQUFNLGdCQUFOLENBQWY7QUFDRDs7QUFRbUIsUUFBZGMsY0FBYyxDQUFFQyxJQUFGLEVBQVE7QUFDMUIsVUFBTUMsT0FBTyxHQUFHLE1BQU1DLFlBQUdDLFFBQUgsQ0FBWUgsSUFBWixDQUF0QjtBQUNBLFVBQU1mLEdBQUcsR0FBRyxNQUFNLEtBQUtXLGFBQUwsQ0FBbUJDLG1CQUFuQixDQUF1QztBQUFDLHFCQUFlLGdCQUFoQjtBQUFrQyxpQkFBV0k7QUFBN0MsS0FBdkMsQ0FBbEI7QUFDQSxXQUFPakIsUUFBUSxDQUFDQyxHQUFELEVBQU0sZ0JBQU4sQ0FBZjtBQUNEOztBQU9rQixRQUFibUIsYUFBYSxDQUFFQyxLQUFGLEVBQVM7QUFDMUIsVUFBTUMsUUFBUSxHQUFHLE1BQU0sS0FBS1gsY0FBTCxFQUF2QjtBQUNBLFVBQU1ZLElBQUksR0FBR0QsUUFBUSxDQUFDRSxlQUFULENBQXlCSCxLQUF6QixDQUFiOztBQUNBLFFBQUksQ0FBQ0UsSUFBTCxFQUFXO0FBQ1QsWUFBTSxJQUFJbkIsS0FBSixDQUFXLG9DQUFtQ2lCLEtBQU0sRUFBcEQsQ0FBTjtBQUNEOztBQUNELFVBQU1JLElBQUksR0FBR0MsZUFBTUMsaUJBQU4sQ0FBd0I7QUFBQyxxQkFBZSxlQUFoQjtBQUNDLDJCQUFxQk4sS0FEdEI7QUFFQyxxQkFBZUUsSUFBSSxDQUFDSyxXQUZyQjtBQUdDLHdCQUFrQkwsSUFBSSxDQUFDTTtBQUh4QixLQUF4QixDQUFiOztBQUlBLFVBQU01QixHQUFHLEdBQUcsTUFBTSxLQUFLVyxhQUFMLENBQW1CQyxtQkFBbkIsQ0FBdUM7QUFBQyxxQkFBZSxlQUFoQjtBQUFpQywyQkFBcUJZO0FBQXRELEtBQXZDLENBQWxCO0FBQ0EsV0FBT3pCLFFBQVEsQ0FBQ0MsR0FBRCxFQUFNLGVBQU4sQ0FBZjtBQUNEOztBQXRFa0Q7OztlQTBFdENNLHFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCYXNlU2VydmljZVBsaXN0fSBmcm9tICcuLi9iYXNlLXNlcnZpY2UnO1xuaW1wb3J0IHtmcywgcGxpc3R9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgTUNfSU5TVEFMTF9TRVJWSUNFX05BTUUgPSAnY29tLmFwcGxlLm1vYmlsZS5NQ0luc3RhbGwnO1xuY29uc3QgQUNLTk9XTEVER0VEID0gJ0Fja25vd2xlZGdlZCc7XG5cbmZ1bmN0aW9uIGNoZWNrQUNLIChyZXMsIG5hbWUpIHtcbiAgaWYgKHJlcy5TdGF0dXMgIT09IEFDS05PV0xFREdFRCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBlcnJvcjogJHtKU09OLnN0cmluZ2lmeShyZXMpfWApO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmNsYXNzIE1DSW5zdGFsbFByb3h5U2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlUGxpc3Qge1xuICBjb25zdHJ1Y3RvciAoc29ja2V0Q2xpZW50KSB7XG4gICAgc3VwZXIoc29ja2V0Q2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9maWxlTGlzdFxuICAgKiBAcHJvcGVydHkge0FycmF5fSBPcmRlcmVkSWRlbnRpZmllcnMgbGlzdCBvZiBhbGwgcHJvZmlsZSBpZGVudFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gUHJvZmlsZU1hbmlmZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBQcm9maWxlTWV0YWRhdGFcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFN0YXR1c1xuICAgKi9cblxuICAvKipcbiAgICogR2V0IGFsbCBwcm9maWxlcyBvZiBpT1MgZGV2aWNlc1xuICAgKiBAcmV0dXJucyB7UHJvZmlsZUxpc3R9XG4gICAqIGUuZy5cbiAgICoge1xuICAgKiAgIE9yZGVyZWRJZGVudGlmaWVyczogWyAnMmZhYzFjMmIzZDY4NDg0MzE4OWIyOTgxYzcxOGIwMTMyODU0YTg0N2EnIF0sXG4gICAqICAgUHJvZmlsZU1hbmlmZXN0OiB7XG4gICAqICAgICAnMmZhYzFjMmIzZDY4NDg0MzE4OWIyOTgxYzcxOGIwMTMyODU0YTg0N2EnOiB7XG4gICAqICAgICAgIERlc2NyaXB0aW9uOiAnQ2hhcmxlcyBQcm94eSBDQSAoNyBEZWMgMjAyMCwgTWFjQm9vay1Qcm8ubG9jYWwpJyxcbiAgICogICAgICAgSXNBY3RpdmU6IHRydWVcbiAgICogICAgIH1cbiAgICogICB9LFxuICAgKiAgIFByb2ZpbGVNZXRhZGF0YToge1xuICAgKiAgICAgJzJmYWMxYzJiM2Q2ODQ4NDMxODliMjk4MWM3MThiMDEzMjg1NGE4NDdhJzoge1xuICAgKiAgICAgICBQYXlsb2FkRGlzcGxheU5hbWU6ICdDaGFybGVzIFByb3h5IENBICg3IERlYyAyMDIwLCBNYWNCb29rLVByby5sb2NhbCknLFxuICAgKiAgICAgICBQYXlsb2FkUmVtb3ZhbERpc2FsbG93ZWQ6IGZhbHNlLFxuICAgKiAgICAgICBQYXlsb2FkVVVJRDogJ0IzMDAwNUNDLUJDNzMtNEU0Mi04NTQ1LThEQTZDNDRBOEE3MScsXG4gICAqICAgICAgIFBheWxvYWRWZXJzaW9uOiAxXG4gICAqICAgICB9XG4gICAqICAgfSxcbiAgICogICBTdGF0dXM6ICdBY2tub3dsZWRnZWQnXG4gICAqIH1cbiAgICovXG4gIGFzeW5jIGdldFByb2ZpbGVMaXN0ICgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9wbGlzdFNlcnZpY2Uuc2VuZFBsaXN0QW5kUmVjZWl2ZSh7UmVxdWVzdFR5cGU6ICdHZXRQcm9maWxlTGlzdCd9KTtcbiAgICByZXR1cm4gY2hlY2tBQ0socmVzLCAnZ2V0UHJvZmlsZUxpc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHByb2ZpbGUgdG8gaU9TIGRldmljZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCAgbXVzdCBiZSBhIGNlcnRpZmljYXRlIGZpbGUgLlBFTSAuQ0VSIGFuZCBtb3JlIGZvcm1hdHNcbiAgICogZS5nOiAvRG93bmxvYWRzL2NoYXJsZXMtY2VydGlmaWNhdGUucGVtXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IGUuZy4ge1N0YXR1czogJ0Fja25vd2xlZGdlZCd9XG4gICAqL1xuICBhc3luYyBpbnN0YWxsUHJvZmlsZSAocGF0aCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9wbGlzdFNlcnZpY2Uuc2VuZFBsaXN0QW5kUmVjZWl2ZSh7J1JlcXVlc3RUeXBlJzogJ0luc3RhbGxQcm9maWxlJywgJ1BheWxvYWQnOiBwYXlsb2FkfSk7XG4gICAgcmV0dXJuIGNoZWNrQUNLKHJlcywgJ2luc3RhbGxQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHByb2ZpbGUgZnJvbSBpT1MgZGV2aWNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZGVudCAgUXVlcnkgaWRlbnRpZmllciBsaXN0IHRocm91Z2ggZ2V0UHJvZmlsZUxpc3QgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IGUuZy4ge1N0YXR1czogJ0Fja25vd2xlZGdlZCd9XG4gICAqL1xuICBhc3luYyByZW1vdmVQcm9maWxlIChpZGVudCkge1xuICAgIGNvbnN0IHByb2ZpbGVzID0gYXdhaXQgdGhpcy5nZXRQcm9maWxlTGlzdCgpO1xuICAgIGNvbnN0IG1ldGEgPSBwcm9maWxlcy5Qcm9maWxlTWV0YWRhdGFbaWRlbnRdO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBub3QgZmluZCBpbnN0YWxsZWQgcHJvZmlsZSBpZGVudDoke2lkZW50fWApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gcGxpc3QuY3JlYXRlQmluYXJ5UGxpc3QoeydQYXlsb2FkVHlwZSc6ICdDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXlsb2FkSWRlbnRpZmllcic6IGlkZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BheWxvYWRVVUlEJzogbWV0YS5QYXlsb2FkVVVJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXlsb2FkVmVyc2lvbic6IG1ldGEuUGF5bG9hZFZlcnNpb259KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9wbGlzdFNlcnZpY2Uuc2VuZFBsaXN0QW5kUmVjZWl2ZSh7J1JlcXVlc3RUeXBlJzogJ1JlbW92ZVByb2ZpbGUnLCAnUHJvZmlsZUlkZW50aWZpZXInOiBkYXRhfSk7XG4gICAgcmV0dXJuIGNoZWNrQUNLKHJlcywgJ3JlbW92ZVByb2ZpbGUnKTtcbiAgfVxufVxuXG5leHBvcnQgeyBNQ0luc3RhbGxQcm94eVNlcnZpY2UsIE1DX0lOU1RBTExfU0VSVklDRV9OQU1FIH07XG5leHBvcnQgZGVmYXVsdCBNQ0luc3RhbGxQcm94eVNlcnZpY2U7XG4iXSwiZmlsZSI6ImxpYi9tY2luc3RhbGwvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
package/build/lib/services.js
CHANGED
|
@@ -10,6 +10,7 @@ exports.startCrashLogService = startCrashLogService;
|
|
|
10
10
|
exports.startHouseArrestService = startHouseArrestService;
|
|
11
11
|
exports.startInstallationProxyService = startInstallationProxyService;
|
|
12
12
|
exports.startInstrumentService = startInstrumentService;
|
|
13
|
+
exports.startMCInstallService = startMCInstallService;
|
|
13
14
|
exports.startNotificationProxyService = startNotificationProxyService;
|
|
14
15
|
exports.startSimulateLocationService = startSimulateLocationService;
|
|
15
16
|
exports.startSyslogService = startSyslogService;
|
|
@@ -35,6 +36,8 @@ var _houseArrest = require("./house-arrest");
|
|
|
35
36
|
|
|
36
37
|
var _instrument = require("./instrument");
|
|
37
38
|
|
|
39
|
+
var _mcinstall = require("./mcinstall");
|
|
40
|
+
|
|
38
41
|
var _plistService = _interopRequireDefault(require("./plist-service"));
|
|
39
42
|
|
|
40
43
|
var _semver = _interopRequireDefault(require("semver"));
|
|
@@ -120,6 +123,11 @@ async function startInstrumentService(udid, opts = {}) {
|
|
|
120
123
|
return new _instrument.InstrumentService(parseInt(osVersion.split('.')[0], 10) < INSTRUMENT_HANDSHAKE_VERSION ? await startService(udid, _instrument.INSTRUMENT_SERVICE_NAME, opts.socket, true) : await startService(udid, _instrument.INSTRUMENT_SERVICE_NAME_VERSION_14, opts.socket));
|
|
121
124
|
}
|
|
122
125
|
|
|
126
|
+
async function startMCInstallService(udid, opts = {}) {
|
|
127
|
+
const socket = await startService(udid, _mcinstall.MC_INSTALL_SERVICE_NAME, opts.socket);
|
|
128
|
+
return new _mcinstall.MCInstallProxyService(new _plistService.default(socket));
|
|
129
|
+
}
|
|
130
|
+
|
|
123
131
|
async function startService(udid, serviceName, socket, handshakeOnly = false) {
|
|
124
132
|
const lockdown = await (0, _utilities.startLockdownSession)(udid, socket);
|
|
125
133
|
|
|
@@ -137,4 +145,4 @@ async function startService(udid, serviceName, socket, handshakeOnly = false) {
|
|
|
137
145
|
}require('source-map-support').install();
|
|
138
146
|
|
|
139
147
|
|
|
140
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy5qcyJdLCJuYW1lcyI6WyJDUkFTSF9MT0dfU0VSVklDRV9OQU1FIiwiSU5TVFJVTUVOVF9IQU5EU0hBS0VfVkVSU0lPTiIsInN0YXJ0U3lzbG9nU2VydmljZSIsInVkaWQiLCJvcHRzIiwic29ja2V0Iiwic3RhcnRTZXJ2aWNlIiwiU1lTTE9HX1NFUlZJQ0VfTkFNRSIsIlN5c2xvZ1NlcnZpY2UiLCJzdGFydFNpbXVsYXRlTG9jYXRpb25TZXJ2aWNlIiwiU0lNVUxBVEVfTE9DQVRJT05fU0VSVklDRV9OQU1FIiwiU2ltdWxhdGVMb2NhdGlvblNlcnZpY2UiLCJzdGFydFdlYkluc3BlY3RvclNlcnZpY2UiLCJvc1ZlcnNpb24iLCJpc1NpbXVsYXRvciIsInZlcmJvc2UiLCJ2ZXJib3NlSGV4RHVtcCIsInNvY2tldENodW5rU2l6ZSIsIm1heEZyYW1lTGVuZ3RoIiwic2VtdmVyVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsIkVycm9yIiwiV2ViSW5zcGVjdG9yU2VydmljZSIsIm1ham9yT3NWZXJzaW9uIiwibWFqb3IiLCJzb2NrZXRDbGllbnQiLCJXRUJfSU5TUEVDVE9SX1NFUlZJQ0VfTkFNRSIsInVuZGVmaW5lZCIsInN0YXJ0SW5zdGFsbGF0aW9uUHJveHlTZXJ2aWNlIiwiSU5TVEFMTEFUSU9OX1BST1hZX1NFUlZJQ0VfTkFNRSIsIkluc3RhbGxhdGlvblByb3h5U2VydmljZSIsIlBsaXN0U2VydmljZSIsInN0YXJ0QWZjU2VydmljZSIsIkFGQ19TRVJWSUNFX05BTUUiLCJBZmNTZXJ2aWNlIiwic3RhcnRDcmFzaExvZ1NlcnZpY2UiLCJzdGFydE5vdGlmaWNhdGlvblByb3h5U2VydmljZSIsIk5PVElGSUNBVElPTl9QUk9YWV9TRVJWSUNFX05BTUUiLCJOb3RpZmljYXRpb25Qcm94eVNlcnZpY2UiLCJzdGFydEhvdXNlQXJyZXN0U2VydmljZSIsIkhPVVNFX0FSUkVTVF9TRVJWSUNFX05BTUUiLCJIb3VzZUFycmVzdFNlcnZpY2UiLCJzdGFydEluc3RydW1lbnRTZXJ2aWNlIiwiSW5zdHJ1bWVudFNlcnZpY2UiLCJwYXJzZUludCIsInNwbGl0IiwiSU5TVFJVTUVOVF9TRVJWSUNFX05BTUUiLCJJTlNUUlVNRU5UX1NFUlZJQ0VfTkFNRV9WRVJTSU9OXzE0Iiwic2VydmljZU5hbWUiLCJoYW5kc2hha2VPbmx5IiwibG9ja2Rvd24iLCJzZXJ2aWNlIiwiRW5hYmxlU2VydmljZVNTTCIsIlBvcnQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHNCQUFzQixHQUFHLGlDQUEvQjtBQUNBLE1BQU1DLDRCQUE0QixHQUFHLEVBQXJDOztBQUVBLGVBQWVDLGtCQUFmLENBQW1DQyxJQUFuQyxFQUF5Q0MsSUFBSSxHQUFHLEVBQWhELEVBQW9EO0FBQ2xELFFBQU1DLE1BQU0sR0FBRyxNQUFNQyxZQUFZLENBQUNILElBQUQsRUFBT0ksMkJBQVAsRUFBNEJILElBQUksQ0FBQ0MsTUFBakMsQ0FBakM7QUFDQSxTQUFPLElBQUlHLHFCQUFKLENBQWtCSCxNQUFsQixDQUFQO0FBQ0Q7O0FBRUQsZUFBZUksNEJBQWYsQ0FBNkNOLElBQTdDLEVBQW1EQyxJQUFJLEdBQUcsRUFBMUQsRUFBOEQ7QUFDNUQsUUFBTUMsTUFBTSxHQUFHLE1BQU1DLFlBQVksQ0FBQ0gsSUFBRCxFQUFPTyxnREFBUCxFQUF1Q04sSUFBSSxDQUFDQyxNQUE1QyxDQUFqQztBQUNBLFNBQU8sSUFBSU0seUNBQUosQ0FBNEJOLE1BQTVCLENBQVA7QUFDRDs7QUFFRCxlQUFlTyx3QkFBZixDQUF5Q1QsSUFBekMsRUFBK0NDLElBQUksR0FBRyxFQUF0RCxFQUEwRDtBQUN4RCxRQUFNUyxTQUFTLEdBQUdULElBQUksQ0FBQ1MsU0FBTCxLQUFrQixNQUFNLDZCQUFhVixJQUFiLEVBQW1CQyxJQUFJLENBQUNDLE1BQXhC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YjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU8sTUFBTSw0QkFBWS9DLElBQVosRUFBa0JpRCxPQUFPLENBQUNFLElBQTFCLEVBQWdDakQsTUFBaEMsQ0FBYjtBQUNEO0FBQ0YsR0FQRCxTQU9VO0FBQ1I4QyxJQUFBQSxRQUFRLENBQUNJLEtBQVQ7QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29ubmVjdFBvcnQsIGNvbm5lY3RQb3J0U1NMLCBzdGFydExvY2tkb3duU2Vzc2lvbiwgZ2V0T1NWZXJzaW9uIH0gZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgU3lzbG9nU2VydmljZSwgU1lTTE9HX1NFUlZJQ0VfTkFNRSB9IGZyb20gJy4vc3lzbG9nJztcbmltcG9ydCB7IFNpbXVsYXRlTG9jYXRpb25TZXJ2aWNlLCBTSU1VTEFURV9MT0NBVElPTl9TRVJWSUNFX05BTUUgfSBmcm9tICcuL3NpbXVsYXRlbG9jYXRpb24nO1xuaW1wb3J0IHsgV2ViSW5zcGVjdG9yU2VydmljZSwgV0VCX0lOU1BFQ1RPUl9TRVJWSUNFX05BTUUgfSBmcm9tICcuL3dlYmluc3BlY3Rvcic7XG5pbXBvcnQgeyBJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UsIElOU1RBTExBVElPTl9QUk9YWV9TRVJWSUNFX05BTUUgfSBmcm9tICcuL2luc3RhbGxhdGlvbi1wcm94eSc7XG5pbXBvcnQgeyBBZmNTZXJ2aWNlLCBBRkNfU0VSVklDRV9OQU1FIH0gZnJvbSAnLi9hZmMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUHJveHlTZXJ2aWNlLCBOT1RJRklDQVRJT05fUFJPWFlfU0VSVklDRV9OQU1FIH0gZnJvbSAnLi9ub3RpZmljYXRpb24tcHJveHknO1xuaW1wb3J0IHsgSG91c2VBcnJlc3RTZXJ2aWNlLCBIT1VTRV9BUlJFU1RfU0VSVklDRV9OQU1FIH0gZnJvbSAnLi9ob3VzZS1hcnJlc3QnO1xuaW1wb3J0IHsgSW5zdHJ1bWVudFNlcnZpY2UsIElOU1RSVU1FTlRfU0VSVklDRV9OQU1FX1ZFUlNJT05fMTQsIElOU1RSVU1FTlRfU0VSVklDRV9OQU1FfSBmcm9tICcuL2luc3RydW1lbnQnO1xuaW1wb3J0IFBsaXN0U2VydmljZSBmcm9tICcuL3BsaXN0LXNlcnZpY2UnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBDUkFTSF9MT0dfU0VSVklDRV9OQU1FID0gJ2NvbS5hcHBsZS5jcmFzaHJlcG9ydGNvcHltb2JpbGUnO1xuY29uc3QgSU5TVFJVTUVOVF9IQU5EU0hBS0VfVkVSU0lPTiA9IDE0O1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydFN5c2xvZ1NlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgU1lTTE9HX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IFN5c2xvZ1NlcnZpY2Uoc29ja2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTaW11bGF0ZUxvY2F0aW9uU2VydmljZSAodWRpZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHNvY2tldCA9IGF3YWl0IHN0YXJ0U2VydmljZSh1ZGlkLCBTSU1VTEFURV9MT0NBVElPTl9TRVJWSUNFX05BTUUsIG9wdHMuc29ja2V0KTtcbiAgcmV0dXJuIG5ldyBTaW11bGF0ZUxvY2F0aW9uU2VydmljZShzb2NrZXQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydFdlYkluc3BlY3RvclNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvc1ZlcnNpb24gPSBvcHRzLm9zVmVyc2lvbiB8fCBhd2FpdCBnZXRPU1ZlcnNpb24odWRpZCwgb3B0cy5zb2NrZXQpO1xuICBjb25zdCBpc1NpbXVsYXRvciA9ICEhb3B0cy5pc1NpbXVsYXRvcjtcbiAgY29uc3QgdmVyYm9zZSA9ICEhb3B0cy52ZXJib3NlO1xuICBjb25zdCB2ZXJib3NlSGV4RHVtcCA9ICEhb3B0cy52ZXJib3NlSGV4RHVtcDtcbiAgY29uc3Qgc29ja2V0Q2h1bmtTaXplID0gb3B0cy5zb2NrZXRDaHVua1NpemU7XG4gIGNvbnN0IG1heEZyYW1lTGVuZ3RoID0gb3B0cy5tYXhGcmFtZUxlbmd0aDtcbiAgY29uc3Qgc2VtdmVyVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3NWZXJzaW9uKTtcbiAgaWYgKCFzZW12ZXJWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY3JlYXRlIGEgc2VtdmVyIHZlcnNpb24gb3V0IG9mICcke29zVmVyc2lvbn0nYCk7XG4gIH1cbiAgaWYgKG9wdHMuc29ja2V0KSB7XG4gICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3JTZXJ2aWNlKHtcbiAgICAgIG1ham9yT3NWZXJzaW9uOiBzZW12ZXJWZXJzaW9uLm1ham9yLFxuICAgICAgaXNTaW11bGF0b3IsXG4gICAgICBzb2NrZXRDaHVua1NpemUsXG4gICAgICB2ZXJib3NlLFxuICAgICAgdmVyYm9zZUhleER1bXAsXG4gICAgICBzb2NrZXRDbGllbnQ6IG9wdHMuc29ja2V0LFxuICAgICAgbWF4RnJhbWVMZW5ndGgsXG4gICAgfSk7XG4gIH1cbiAgY29uc3Qgc29ja2V0ID0gYXdhaXQgc3RhcnRTZXJ2aWNlKHVkaWQsIFdFQl9JTlNQRUNUT1JfU0VSVklDRV9OQU1FLCB1bmRlZmluZWQpO1xuICByZXR1cm4gbmV3IFdlYkluc3BlY3RvclNlcnZpY2Uoe1xuICAgIG1ham9yT3NWZXJzaW9uOiBzZW12ZXJWZXJzaW9uLm1ham9yLFxuICAgIGlzU2ltdWxhdG9yLFxuICAgIHNvY2tldENodW5rU2l6ZSxcbiAgICB2ZXJib3NlLFxuICAgIHZlcmJvc2VIZXhEdW1wLFxuICAgIHNvY2tldENsaWVudDogc29ja2V0LFxuICAgIG1heEZyYW1lTGVuZ3RoLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgSU5TVEFMTEFUSU9OX1BST1hZX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEluc3RhbGxhdGlvblByb3h5U2VydmljZShuZXcgUGxpc3RTZXJ2aWNlKHNvY2tldCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydEFmY1NlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgQUZDX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEFmY1NlcnZpY2Uoc29ja2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRDcmFzaExvZ1NlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgQ1JBU0hfTE9HX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEFmY1NlcnZpY2Uoc29ja2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnROb3RpZmljYXRpb25Qcm94eVNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgTk9USUZJQ0FUSU9OX1BST1hZX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvblByb3h5U2VydmljZShzb2NrZXQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydEhvdXNlQXJyZXN0U2VydmljZSAodWRpZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHNvY2tldCA9IGF3YWl0IHN0YXJ0U2VydmljZSh1ZGlkLCBIT1VTRV9BUlJFU1RfU0VSVklDRV9OQU1FLCBvcHRzLnNvY2tldCk7XG4gIHJldHVybiBuZXcgSG91c2VBcnJlc3RTZXJ2aWNlKHNvY2tldCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0SW5zdHJ1bWVudFNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvc1ZlcnNpb24gPSBvcHRzLm9zVmVyc2lvbiB8fCBhd2FpdCBnZXRPU1ZlcnNpb24odWRpZCwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEluc3RydW1lbnRTZXJ2aWNlKFxuICBwYXJzZUludChvc1ZlcnNpb24uc3BsaXQoJy4nKVswXSwgMTApIDwgSU5TVFJVTUVOVF9IQU5EU0hBS0VfVkVSU0lPTlxuICAgID8gYXdhaXQgc3RhcnRTZXJ2aWNlKHVkaWQsIElOU1RSVU1FTlRfU0VSVklDRV9OQU1FLCBvcHRzLnNvY2tldCwgdHJ1ZSlcbiAgICA6IGF3YWl0IHN0YXJ0U2VydmljZSh1ZGlkLCBJTlNUUlVNRU5UX1NFUlZJQ0VfTkFNRV9WRVJTSU9OXzE0LCBvcHRzLnNvY2tldClcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2aWNlICh1ZGlkLCBzZXJ2aWNlTmFtZSwgc29ja2V0LCBoYW5kc2hha2VPbmx5ID0gZmFsc2UpIHtcbiAgY29uc3QgbG9ja2Rvd24gPSBhd2FpdCBzdGFydExvY2tkb3duU2Vzc2lvbih1ZGlkLCBzb2NrZXQpO1xuICB0cnkge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCBsb2NrZG93bi5zdGFydFNlcnZpY2Uoc2VydmljZU5hbWUpO1xuICAgIGlmIChzZXJ2aWNlLkVuYWJsZVNlcnZpY2VTU0wpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjb25uZWN0UG9ydFNTTCh1ZGlkLCBzZXJ2aWNlLlBvcnQsIHNvY2tldCwgaGFuZHNoYWtlT25seSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCBjb25uZWN0UG9ydCh1ZGlkLCBzZXJ2aWNlLlBvcnQsIHNvY2tldCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGxvY2tkb3duLmNsb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgc3RhcnRTeXNsb2dTZXJ2aWNlLCBzdGFydFdlYkluc3BlY3RvclNlcnZpY2UsXG4gIHN0YXJ0SW5zdGFsbGF0aW9uUHJveHlTZXJ2aWNlLCBzdGFydFNpbXVsYXRlTG9jYXRpb25TZXJ2aWNlLFxuICBzdGFydEFmY1NlcnZpY2UsIHN0YXJ0Q3Jhc2hMb2dTZXJ2aWNlLCBzdGFydE5vdGlmaWNhdGlvblByb3h5U2VydmljZSxcbiAgc3RhcnRIb3VzZUFycmVzdFNlcnZpY2UsIHN0YXJ0SW5zdHJ1bWVudFNlcnZpY2Vcbn07XG4iXSwiZmlsZSI6ImxpYi9zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
148
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy5qcyJdLCJuYW1lcyI6WyJDUkFTSF9MT0dfU0VSVklDRV9OQU1FIiwiSU5TVFJVTUVOVF9IQU5EU0hBS0VfVkVSU0lPTiIsInN0YXJ0U3lzbG9nU2VydmljZSIsInVkaWQiLCJvcHRzIiwic29ja2V0Iiwic3RhcnRTZXJ2aWNlIiwiU1lTTE9HX1NFUlZJQ0VfTkFNRSIsIlN5c2xvZ1NlcnZpY2UiLCJzdGFydFNpbXVsYXRlTG9jYXRpb25TZXJ2aWNlIiwiU0lNVUxBVEVfTE9DQVRJT05fU0VSVklDRV9OQU1FIiwiU2ltdWxhdGVMb2NhdGlvblNlcnZpY2UiLCJzdGFydFdlYkluc3BlY3RvclNlcnZpY2UiLCJvc1ZlcnNpb24iLCJpc1NpbXVsYXRvciIsInZlcmJvc2UiLCJ2ZXJib3NlSGV4RHVtcCIsInNvY2tldENodW5rU2l6ZSIsIm1heEZyYW1lTGVuZ3RoIiwic2VtdmVyVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsIkVycm9yIiwiV2ViSW5zcGVjdG9yU2VydmljZSIsIm1ham9yT3NWZXJzaW9uIiwibWFqb3IiLCJzb2NrZXRDbGllbnQiLCJXRUJfSU5TUEVDVE9SX1NFUlZJQ0VfTkFNRSIsInVuZGVmaW5lZCIsInN0YXJ0SW5zdGFsbGF0aW9uUHJveHlTZXJ2aWNlIiwiSU5TVEFMTEFUSU9OX1BST1hZX1NFUlZJQ0VfTkFNRSIsIkluc3RhbGxhdGlvblByb3h5U2VydmljZSIsIlBsaXN0U2VydmljZSIsInN0YXJ0QWZjU2VydmljZSIsIkFGQ19TRVJWSUNFX05BTUUiLCJBZmNTZXJ2aWNlIiwic3RhcnRDcmFzaExvZ1NlcnZpY2UiLCJzdGFydE5vdGlmaWNhdGlvblByb3h5U2VydmljZSIsIk5PVElGSUNBVElPTl9QUk9YWV9TRVJWSUNFX05BTUUiLCJOb3RpZmljYXRpb25Qcm94eVNlcnZpY2UiLCJzdGFydEhvdXNlQXJyZXN0U2VydmljZSIsIkhPVVNFX0FSUkVTVF9TRVJWSUNFX05BTUUiLCJIb3VzZUFycmVzdFNlcnZpY2UiLCJzdGFydEluc3RydW1lbnRTZXJ2aWNlIiwiSW5zdHJ1bWVudFNlcnZpY2UiLCJwYXJzZUludCIsInNwbGl0IiwiSU5TVFJVTUVOVF9TRVJWSUNFX05BTUUiLCJJTlNUUlVNRU5UX1NFUlZJQ0VfTkFNRV9WRVJTSU9OXzE0Iiwic3RhcnRNQ0luc3RhbGxTZXJ2aWNlIiwiTUNfSU5TVEFMTF9TRVJWSUNFX05BTUUiLCJNQ0luc3RhbGxQcm94eVNlcnZpY2UiLCJzZXJ2aWNlTmFtZSIsImhhbmRzaGFrZU9ubHkiLCJsb2NrZG93biIsInNlcnZpY2UiLCJFbmFibGVTZXJ2aWNlU1NMIiwiUG9ydCIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHNCQUFzQixHQUFHLGlDQUEvQjtBQUNBLE1BQU1DLDRCQUE0QixHQUFHLEVBQXJDOztBQUVBLGVBQWVDLGtCQUFmLENBQW1DQyxJQUFuQyxFQUF5Q0MsSUFBSSxHQUFHLEVBQWhELEVBQW9EO0FBQ2xELFFBQU1DLE1BQU0sR0FBRyxNQUFNQyxZQUFZLENBQUNILElBQUQsRUFBT0ksMkJBQVAsRUFBNEJILElBQUksQ0FBQ0MsTUFBakMsQ0FBakM7QUFDQSxTQUFPLElBQUlHLHFCQUFKLENBQWtCSCxNQUFsQixDQUFQO0FBQ0Q7O0FBRUQsZUFBZUksNEJBQWYsQ0FBNkNOLElBQTdDLEVBQW1EQyxJQUFJLEdBQUcsRUFBMUQsRUFBOEQ7QUFDNUQsUUFBTUMsTUFBTSxHQUFHLE1BQU1DLFlBQVksQ0FBQ0gsSUFBRCxFQUFPTyxnREFBUCxFQUF1Q04sSUFBSSxDQUFDQyxNQUE1QyxDQUFqQztBQUNBLFNBQU8sSUFBSU0seUNBQUosQ0FBNEJOLE1BQTVCLENBQVA7QUFDRDs7QUFFRCxlQUFlTyx3QkFBZixDQUF5Q1QsSUFBekMsRUFBK0NDLElBQUksR0FBRyxFQUF0RCxFQUEwRDtBQUN4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QyxFQUFnRC9DLE1BQWhELEVBQXdEZ0QsYUFBYSxHQUFHLEtBQXhFLEVBQStFO0FBQzdFLFFBQU1DLFFBQVEsR0FBRyxNQUFNLHFDQUFxQm5ELElBQXJCLEVBQTJCRSxNQUEzQixDQUF2Qjs7QUFDQSxNQUFJO0FBQ0YsVUFBTWtELE9BQU8sR0FBRyxNQUFNRCxRQUFRLENBQUNoRCxZQUFULENBQXNCOEMsV0FBdEIsQ0FBdEI7O0FBQ0EsUUFBSUcsT0FBTyxDQUFDQyxnQkFBWixFQUE4QjtBQUM1QixhQUFPLE1BQU0sK0JBQWVyRCxJQUFmLEVBQXFCb0QsT0FBTyxDQUFDRSxJQUE3QixFQUFtQ3BELE1BQW5DLEVBQTJDZ0QsYUFBM0MsQ0FBYjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU8sTUFBTSw0QkFBWWxELElBQVosRUFBa0JvRCxPQUFPLENBQUNFLElBQTFCLEVBQWdDcEQsTUFBaEMsQ0FBYjtBQUNEO0FBQ0YsR0FQRCxTQU9VO0FBQ1JpRCxJQUFBQSxRQUFRLENBQUNJLEtBQVQ7QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29ubmVjdFBvcnQsIGNvbm5lY3RQb3J0U1NMLCBzdGFydExvY2tkb3duU2Vzc2lvbiwgZ2V0T1NWZXJzaW9uIH0gZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgU3lzbG9nU2VydmljZSwgU1lTTE9HX1NFUlZJQ0VfTkFNRSB9IGZyb20gJy4vc3lzbG9nJztcbmltcG9ydCB7IFNpbXVsYXRlTG9jYXRpb25TZXJ2aWNlLCBTSU1VTEFURV9MT0NBVElPTl9TRVJWSUNFX05BTUUgfSBmcm9tICcuL3NpbXVsYXRlbG9jYXRpb24nO1xuaW1wb3J0IHsgV2ViSW5zcGVjdG9yU2VydmljZSwgV0VCX0lOU1BFQ1RPUl9TRVJWSUNFX05BTUUgfSBmcm9tICcuL3dlYmluc3BlY3Rvcic7XG5pbXBvcnQgeyBJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UsIElOU1RBTExBVElPTl9QUk9YWV9TRVJWSUNFX05BTUUgfSBmcm9tICcuL2luc3RhbGxhdGlvbi1wcm94eSc7XG5pbXBvcnQgeyBBZmNTZXJ2aWNlLCBBRkNfU0VSVklDRV9OQU1FIH0gZnJvbSAnLi9hZmMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUHJveHlTZXJ2aWNlLCBOT1RJRklDQVRJT05fUFJPWFlfU0VSVklDRV9OQU1FIH0gZnJvbSAnLi9ub3RpZmljYXRpb24tcHJveHknO1xuaW1wb3J0IHsgSG91c2VBcnJlc3RTZXJ2aWNlLCBIT1VTRV9BUlJFU1RfU0VSVklDRV9OQU1FIH0gZnJvbSAnLi9ob3VzZS1hcnJlc3QnO1xuaW1wb3J0IHsgSW5zdHJ1bWVudFNlcnZpY2UsIElOU1RSVU1FTlRfU0VSVklDRV9OQU1FX1ZFUlNJT05fMTQsIElOU1RSVU1FTlRfU0VSVklDRV9OQU1FfSBmcm9tICcuL2luc3RydW1lbnQnO1xuaW1wb3J0IHsgTUNJbnN0YWxsUHJveHlTZXJ2aWNlLCBNQ19JTlNUQUxMX1NFUlZJQ0VfTkFNRX0gZnJvbSAnLi9tY2luc3RhbGwnO1xuaW1wb3J0IFBsaXN0U2VydmljZSBmcm9tICcuL3BsaXN0LXNlcnZpY2UnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBDUkFTSF9MT0dfU0VSVklDRV9OQU1FID0gJ2NvbS5hcHBsZS5jcmFzaHJlcG9ydGNvcHltb2JpbGUnO1xuY29uc3QgSU5TVFJVTUVOVF9IQU5EU0hBS0VfVkVSU0lPTiA9IDE0O1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydFN5c2xvZ1NlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgU1lTTE9HX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IFN5c2xvZ1NlcnZpY2Uoc29ja2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTaW11bGF0ZUxvY2F0aW9uU2VydmljZSAodWRpZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHNvY2tldCA9IGF3YWl0IHN0YXJ0U2VydmljZSh1ZGlkLCBTSU1VTEFURV9MT0NBVElPTl9TRVJWSUNFX05BTUUsIG9wdHMuc29ja2V0KTtcbiAgcmV0dXJuIG5ldyBTaW11bGF0ZUxvY2F0aW9uU2VydmljZShzb2NrZXQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydFdlYkluc3BlY3RvclNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvc1ZlcnNpb24gPSBvcHRzLm9zVmVyc2lvbiB8fCBhd2FpdCBnZXRPU1ZlcnNpb24odWRpZCwgb3B0cy5zb2NrZXQpO1xuICBjb25zdCBpc1NpbXVsYXRvciA9ICEhb3B0cy5pc1NpbXVsYXRvcjtcbiAgY29uc3QgdmVyYm9zZSA9ICEhb3B0cy52ZXJib3NlO1xuICBjb25zdCB2ZXJib3NlSGV4RHVtcCA9ICEhb3B0cy52ZXJib3NlSGV4RHVtcDtcbiAgY29uc3Qgc29ja2V0Q2h1bmtTaXplID0gb3B0cy5zb2NrZXRDaHVua1NpemU7XG4gIGNvbnN0IG1heEZyYW1lTGVuZ3RoID0gb3B0cy5tYXhGcmFtZUxlbmd0aDtcbiAgY29uc3Qgc2VtdmVyVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3NWZXJzaW9uKTtcbiAgaWYgKCFzZW12ZXJWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY3JlYXRlIGEgc2VtdmVyIHZlcnNpb24gb3V0IG9mICcke29zVmVyc2lvbn0nYCk7XG4gIH1cbiAgaWYgKG9wdHMuc29ja2V0KSB7XG4gICAgcmV0dXJuIG5ldyBXZWJJbnNwZWN0b3JTZXJ2aWNlKHtcbiAgICAgIG1ham9yT3NWZXJzaW9uOiBzZW12ZXJWZXJzaW9uLm1ham9yLFxuICAgICAgaXNTaW11bGF0b3IsXG4gICAgICBzb2NrZXRDaHVua1NpemUsXG4gICAgICB2ZXJib3NlLFxuICAgICAgdmVyYm9zZUhleER1bXAsXG4gICAgICBzb2NrZXRDbGllbnQ6IG9wdHMuc29ja2V0LFxuICAgICAgbWF4RnJhbWVMZW5ndGgsXG4gICAgfSk7XG4gIH1cbiAgY29uc3Qgc29ja2V0ID0gYXdhaXQgc3RhcnRTZXJ2aWNlKHVkaWQsIFdFQl9JTlNQRUNUT1JfU0VSVklDRV9OQU1FLCB1bmRlZmluZWQpO1xuICByZXR1cm4gbmV3IFdlYkluc3BlY3RvclNlcnZpY2Uoe1xuICAgIG1ham9yT3NWZXJzaW9uOiBzZW12ZXJWZXJzaW9uLm1ham9yLFxuICAgIGlzU2ltdWxhdG9yLFxuICAgIHNvY2tldENodW5rU2l6ZSxcbiAgICB2ZXJib3NlLFxuICAgIHZlcmJvc2VIZXhEdW1wLFxuICAgIHNvY2tldENsaWVudDogc29ja2V0LFxuICAgIG1heEZyYW1lTGVuZ3RoLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRJbnN0YWxsYXRpb25Qcm94eVNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgSU5TVEFMTEFUSU9OX1BST1hZX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEluc3RhbGxhdGlvblByb3h5U2VydmljZShuZXcgUGxpc3RTZXJ2aWNlKHNvY2tldCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydEFmY1NlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgQUZDX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEFmY1NlcnZpY2Uoc29ja2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRDcmFzaExvZ1NlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgQ1JBU0hfTE9HX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEFmY1NlcnZpY2Uoc29ja2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnROb3RpZmljYXRpb25Qcm94eVNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBzb2NrZXQgPSBhd2FpdCBzdGFydFNlcnZpY2UodWRpZCwgTk9USUZJQ0FUSU9OX1BST1hZX1NFUlZJQ0VfTkFNRSwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvblByb3h5U2VydmljZShzb2NrZXQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydEhvdXNlQXJyZXN0U2VydmljZSAodWRpZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHNvY2tldCA9IGF3YWl0IHN0YXJ0U2VydmljZSh1ZGlkLCBIT1VTRV9BUlJFU1RfU0VSVklDRV9OQU1FLCBvcHRzLnNvY2tldCk7XG4gIHJldHVybiBuZXcgSG91c2VBcnJlc3RTZXJ2aWNlKHNvY2tldCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0SW5zdHJ1bWVudFNlcnZpY2UgKHVkaWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBvc1ZlcnNpb24gPSBvcHRzLm9zVmVyc2lvbiB8fCBhd2FpdCBnZXRPU1ZlcnNpb24odWRpZCwgb3B0cy5zb2NrZXQpO1xuICByZXR1cm4gbmV3IEluc3RydW1lbnRTZXJ2aWNlKFxuICBwYXJzZUludChvc1ZlcnNpb24uc3BsaXQoJy4nKVswXSwgMTApIDwgSU5TVFJVTUVOVF9IQU5EU0hBS0VfVkVSU0lPTlxuICAgID8gYXdhaXQgc3RhcnRTZXJ2aWNlKHVkaWQsIElOU1RSVU1FTlRfU0VSVklDRV9OQU1FLCBvcHRzLnNvY2tldCwgdHJ1ZSlcbiAgICA6IGF3YWl0IHN0YXJ0U2VydmljZSh1ZGlkLCBJTlNUUlVNRU5UX1NFUlZJQ0VfTkFNRV9WRVJTSU9OXzE0LCBvcHRzLnNvY2tldClcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNQ0luc3RhbGxTZXJ2aWNlICh1ZGlkLCBvcHRzID0ge30pIHtcbiAgY29uc3Qgc29ja2V0ID0gYXdhaXQgc3RhcnRTZXJ2aWNlKHVkaWQsIE1DX0lOU1RBTExfU0VSVklDRV9OQU1FLCBvcHRzLnNvY2tldCk7XG4gIHJldHVybiBuZXcgTUNJbnN0YWxsUHJveHlTZXJ2aWNlKG5ldyBQbGlzdFNlcnZpY2Uoc29ja2V0KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0U2VydmljZSAodWRpZCwgc2VydmljZU5hbWUsIHNvY2tldCwgaGFuZHNoYWtlT25seSA9IGZhbHNlKSB7XG4gIGNvbnN0IGxvY2tkb3duID0gYXdhaXQgc3RhcnRMb2NrZG93blNlc3Npb24odWRpZCwgc29ja2V0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgbG9ja2Rvd24uc3RhcnRTZXJ2aWNlKHNlcnZpY2VOYW1lKTtcbiAgICBpZiAoc2VydmljZS5FbmFibGVTZXJ2aWNlU1NMKSB7XG4gICAgICByZXR1cm4gYXdhaXQgY29ubmVjdFBvcnRTU0wodWRpZCwgc2VydmljZS5Qb3J0LCBzb2NrZXQsIGhhbmRzaGFrZU9ubHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgY29ubmVjdFBvcnQodWRpZCwgc2VydmljZS5Qb3J0LCBzb2NrZXQpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBsb2NrZG93bi5jbG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIHN0YXJ0U3lzbG9nU2VydmljZSwgc3RhcnRXZWJJbnNwZWN0b3JTZXJ2aWNlLFxuICBzdGFydEluc3RhbGxhdGlvblByb3h5U2VydmljZSwgc3RhcnRTaW11bGF0ZUxvY2F0aW9uU2VydmljZSxcbiAgc3RhcnRBZmNTZXJ2aWNlLCBzdGFydENyYXNoTG9nU2VydmljZSwgc3RhcnROb3RpZmljYXRpb25Qcm94eVNlcnZpY2UsXG4gIHN0YXJ0SG91c2VBcnJlc3RTZXJ2aWNlLCBzdGFydEluc3RydW1lbnRTZXJ2aWNlLCBzdGFydE1DSW5zdGFsbFNlcnZpY2Vcbn07XG4iXSwiZmlsZSI6ImxpYi9zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {BaseServicePlist} from '../base-service';
|
|
2
|
+
import {fs, plist} from '@appium/support';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const MC_INSTALL_SERVICE_NAME = 'com.apple.mobile.MCInstall';
|
|
6
|
+
const ACKNOWLEDGED = 'Acknowledged';
|
|
7
|
+
|
|
8
|
+
function checkACK (res, name) {
|
|
9
|
+
if (res.Status !== ACKNOWLEDGED) {
|
|
10
|
+
throw new Error(`${name} error: ${JSON.stringify(res)}`);
|
|
11
|
+
}
|
|
12
|
+
return res;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class MCInstallProxyService extends BaseServicePlist {
|
|
16
|
+
constructor (socketClient) {
|
|
17
|
+
super(socketClient);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @typedef {Object} ProfileList
|
|
22
|
+
* @property {Array} OrderedIdentifiers list of all profile ident
|
|
23
|
+
* @property {Object} ProfileManifest
|
|
24
|
+
* @property {Object} ProfileMetadata
|
|
25
|
+
* @property {String} Status
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get all profiles of iOS devices
|
|
30
|
+
* @returns {ProfileList}
|
|
31
|
+
* e.g.
|
|
32
|
+
* {
|
|
33
|
+
* OrderedIdentifiers: [ '2fac1c2b3d684843189b2981c718b0132854a847a' ],
|
|
34
|
+
* ProfileManifest: {
|
|
35
|
+
* '2fac1c2b3d684843189b2981c718b0132854a847a': {
|
|
36
|
+
* Description: 'Charles Proxy CA (7 Dec 2020, MacBook-Pro.local)',
|
|
37
|
+
* IsActive: true
|
|
38
|
+
* }
|
|
39
|
+
* },
|
|
40
|
+
* ProfileMetadata: {
|
|
41
|
+
* '2fac1c2b3d684843189b2981c718b0132854a847a': {
|
|
42
|
+
* PayloadDisplayName: 'Charles Proxy CA (7 Dec 2020, MacBook-Pro.local)',
|
|
43
|
+
* PayloadRemovalDisallowed: false,
|
|
44
|
+
* PayloadUUID: 'B30005CC-BC73-4E42-8545-8DA6C44A8A71',
|
|
45
|
+
* PayloadVersion: 1
|
|
46
|
+
* }
|
|
47
|
+
* },
|
|
48
|
+
* Status: 'Acknowledged'
|
|
49
|
+
* }
|
|
50
|
+
*/
|
|
51
|
+
async getProfileList () {
|
|
52
|
+
const res = await this._plistService.sendPlistAndReceive({RequestType: 'GetProfileList'});
|
|
53
|
+
return checkACK(res, 'getProfileList');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Install profile to iOS device
|
|
58
|
+
* @param {String} path must be a certificate file .PEM .CER and more formats
|
|
59
|
+
* e.g: /Downloads/charles-certificate.pem
|
|
60
|
+
* @returns {Object} e.g. {Status: 'Acknowledged'}
|
|
61
|
+
*/
|
|
62
|
+
async installProfile (path) {
|
|
63
|
+
const payload = await fs.readFile(path);
|
|
64
|
+
const res = await this._plistService.sendPlistAndReceive({'RequestType': 'InstallProfile', 'Payload': payload});
|
|
65
|
+
return checkACK(res, 'installProfile');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Remove profile from iOS device
|
|
70
|
+
* @param {String} ident Query identifier list through getProfileList method
|
|
71
|
+
* @returns {Object} e.g. {Status: 'Acknowledged'}
|
|
72
|
+
*/
|
|
73
|
+
async removeProfile (ident) {
|
|
74
|
+
const profiles = await this.getProfileList();
|
|
75
|
+
const meta = profiles.ProfileMetadata[ident];
|
|
76
|
+
if (!meta) {
|
|
77
|
+
throw new Error(`not find installed profile ident:${ident}`);
|
|
78
|
+
}
|
|
79
|
+
const data = plist.createBinaryPlist({'PayloadType': 'Configuration',
|
|
80
|
+
'PayloadIdentifier': ident,
|
|
81
|
+
'PayloadUUID': meta.PayloadUUID,
|
|
82
|
+
'PayloadVersion': meta.PayloadVersion});
|
|
83
|
+
const res = await this._plistService.sendPlistAndReceive({'RequestType': 'RemoveProfile', 'ProfileIdentifier': data});
|
|
84
|
+
return checkACK(res, 'removeProfile');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { MCInstallProxyService, MC_INSTALL_SERVICE_NAME };
|
|
89
|
+
export default MCInstallProxyService;
|
package/lib/services.js
CHANGED
|
@@ -7,6 +7,7 @@ import { AfcService, AFC_SERVICE_NAME } from './afc';
|
|
|
7
7
|
import { NotificationProxyService, NOTIFICATION_PROXY_SERVICE_NAME } from './notification-proxy';
|
|
8
8
|
import { HouseArrestService, HOUSE_ARREST_SERVICE_NAME } from './house-arrest';
|
|
9
9
|
import { InstrumentService, INSTRUMENT_SERVICE_NAME_VERSION_14, INSTRUMENT_SERVICE_NAME} from './instrument';
|
|
10
|
+
import { MCInstallProxyService, MC_INSTALL_SERVICE_NAME} from './mcinstall';
|
|
10
11
|
import PlistService from './plist-service';
|
|
11
12
|
import semver from 'semver';
|
|
12
13
|
|
|
@@ -91,6 +92,11 @@ async function startInstrumentService (udid, opts = {}) {
|
|
|
91
92
|
);
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
async function startMCInstallService (udid, opts = {}) {
|
|
96
|
+
const socket = await startService(udid, MC_INSTALL_SERVICE_NAME, opts.socket);
|
|
97
|
+
return new MCInstallProxyService(new PlistService(socket));
|
|
98
|
+
}
|
|
99
|
+
|
|
94
100
|
async function startService (udid, serviceName, socket, handshakeOnly = false) {
|
|
95
101
|
const lockdown = await startLockdownSession(udid, socket);
|
|
96
102
|
try {
|
|
@@ -109,5 +115,5 @@ export {
|
|
|
109
115
|
startSyslogService, startWebInspectorService,
|
|
110
116
|
startInstallationProxyService, startSimulateLocationService,
|
|
111
117
|
startAfcService, startCrashLogService, startNotificationProxyService,
|
|
112
|
-
startHouseArrestService, startInstrumentService
|
|
118
|
+
startHouseArrestService, startInstrumentService, startMCInstallService
|
|
113
119
|
};
|