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 CHANGED
@@ -3,10 +3,8 @@ appium-ios-device
3
3
 
4
4
  [![NPM version](http://img.shields.io/npm/v/appium-ios-device.svg)](https://npmjs.org/package/appium-ios-device)
5
5
  [![Downloads](http://img.shields.io/npm/dm/appium-ios-device.svg)](https://npmjs.org/package/appium-ios-device)
6
- [![Dependency Status](https://david-dm.org/appium/appium-ios-device/master.svg)](https://david-dm.org/appium/appium-ios-device/master)
7
- [![devDependency Status](https://david-dm.org/appium/appium-ios-device/master/dev-status.svg)](https://david-dm.org/appium/appium-ios-device/master#info=devDependencies)
8
6
 
9
- [![Build Status](https://api.travis-ci.org/appium/appium-ios-device.png?branch=master)](https://travis-ci.org/appium/appium-ios-device)
7
+ [![Release](https://github.com/appium/appium-ios-device/actions/workflows/publish.js.yml/badge.svg)](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==
@@ -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
  };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "keywords": [
5
5
  "appium"
6
6
  ],
7
- "version": "2.2.0",
7
+ "version": "2.3.0",
8
8
  "author": "appium",
9
9
  "license": "Apache-2.0",
10
10
  "repository": {