appium-android-driver 5.4.2 → 5.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +4 -78
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/package.json +2 -2
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = exports.commands = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _driver = require("appium/driver");
|
|
15
|
-
|
|
16
11
|
const NO_VALUE_ARG_TYPE = 'sn';
|
|
17
12
|
const SUPPORTED_EXTRA_TYPES = ['s', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn', 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal'];
|
|
18
13
|
const API_LEVEL_ANDROID_8 = 26;
|
|
19
14
|
const commands = {};
|
|
20
15
|
exports.commands = commands;
|
|
21
|
-
|
|
22
16
|
function parseIntentSpec(opts = {}) {
|
|
23
17
|
const {
|
|
24
18
|
intent,
|
|
@@ -32,27 +26,21 @@ function parseIntentSpec(opts = {}) {
|
|
|
32
26
|
flags
|
|
33
27
|
} = opts;
|
|
34
28
|
const resultArgs = [];
|
|
35
|
-
|
|
36
29
|
if (intent) {
|
|
37
30
|
resultArgs.push(intent);
|
|
38
31
|
}
|
|
39
|
-
|
|
40
32
|
if (action) {
|
|
41
33
|
resultArgs.push('-a', action);
|
|
42
34
|
}
|
|
43
|
-
|
|
44
35
|
if (uri) {
|
|
45
36
|
resultArgs.push('-d', uri);
|
|
46
37
|
}
|
|
47
|
-
|
|
48
38
|
if (mimeType) {
|
|
49
39
|
resultArgs.push('-t', mimeType);
|
|
50
40
|
}
|
|
51
|
-
|
|
52
41
|
if (!_lodash.default.isNil(identifier)) {
|
|
53
42
|
resultArgs.push('-i', identifier);
|
|
54
43
|
}
|
|
55
|
-
|
|
56
44
|
if (categories) {
|
|
57
45
|
if (_lodash.default.isArray(categories)) {
|
|
58
46
|
resultArgs.push(..._lodash.default.flatMap(categories.map(cName => ['-c', cName])));
|
|
@@ -60,35 +48,27 @@ function parseIntentSpec(opts = {}) {
|
|
|
60
48
|
resultArgs.push('-c', categories);
|
|
61
49
|
}
|
|
62
50
|
}
|
|
63
|
-
|
|
64
51
|
if (component) {
|
|
65
52
|
resultArgs.push('-n', component);
|
|
66
53
|
}
|
|
67
|
-
|
|
68
54
|
if (opts.package) {
|
|
69
55
|
resultArgs.push('-p', opts.package);
|
|
70
56
|
}
|
|
71
|
-
|
|
72
57
|
if (extras) {
|
|
73
58
|
if (!_lodash.default.isArray(extras)) {
|
|
74
59
|
throw new _driver.errors.InvalidArgumentError(`'extras' must be an array`);
|
|
75
60
|
}
|
|
76
|
-
|
|
77
61
|
for (const item of extras) {
|
|
78
62
|
if (!_lodash.default.isArray(item)) {
|
|
79
63
|
throw new _driver.errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);
|
|
80
64
|
}
|
|
81
|
-
|
|
82
65
|
const [type, key, value] = item;
|
|
83
|
-
|
|
84
66
|
if (!_lodash.default.includes(SUPPORTED_EXTRA_TYPES, type)) {
|
|
85
67
|
throw new _driver.errors.InvalidArgumentError(`Extra argument type '${type}' is not known. ` + `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`);
|
|
86
68
|
}
|
|
87
|
-
|
|
88
69
|
if (_lodash.default.isEmpty(key) || _lodash.default.isString(key) && _lodash.default.trim(key) === '') {
|
|
89
70
|
throw new _driver.errors.InvalidArgumentError(`Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`);
|
|
90
71
|
}
|
|
91
|
-
|
|
92
72
|
if (type === NO_VALUE_ARG_TYPE) {
|
|
93
73
|
resultArgs.push(`--e${type}`, key);
|
|
94
74
|
} else if (_lodash.default.isUndefined(value)) {
|
|
@@ -98,11 +78,9 @@ function parseIntentSpec(opts = {}) {
|
|
|
98
78
|
}
|
|
99
79
|
}
|
|
100
80
|
}
|
|
101
|
-
|
|
102
81
|
if (flags) {
|
|
103
82
|
resultArgs.push('-f', flags);
|
|
104
83
|
}
|
|
105
|
-
|
|
106
84
|
return resultArgs;
|
|
107
85
|
}
|
|
108
86
|
|
|
@@ -116,31 +94,24 @@ commands.mobileStartActivity = async function mobileStartActivity(opts = {}) {
|
|
|
116
94
|
display
|
|
117
95
|
} = opts;
|
|
118
96
|
const cmd = ['am', (await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8 ? 'start' : 'start-activity'];
|
|
119
|
-
|
|
120
97
|
if (!_lodash.default.isNil(user)) {
|
|
121
98
|
cmd.push('--user', user);
|
|
122
99
|
}
|
|
123
|
-
|
|
124
100
|
if (wait) {
|
|
125
101
|
cmd.push('-W');
|
|
126
102
|
}
|
|
127
|
-
|
|
128
103
|
if (stop) {
|
|
129
104
|
cmd.push('-S');
|
|
130
105
|
}
|
|
131
|
-
|
|
132
106
|
if (!_lodash.default.isNil(windowingMode)) {
|
|
133
107
|
cmd.push('--windowingMode', windowingMode);
|
|
134
108
|
}
|
|
135
|
-
|
|
136
109
|
if (!_lodash.default.isNil(activityType)) {
|
|
137
110
|
cmd.push('--activityType', activityType);
|
|
138
111
|
}
|
|
139
|
-
|
|
140
112
|
if (!_lodash.default.isNil(display)) {
|
|
141
113
|
cmd.push('--display', display);
|
|
142
114
|
}
|
|
143
|
-
|
|
144
115
|
cmd.push(...parseIntentSpec(opts));
|
|
145
116
|
return await this.adb.shell(cmd);
|
|
146
117
|
};
|
|
@@ -152,19 +123,15 @@ commands.mobileBroadcast = async function mobileBroadcast(opts = {}) {
|
|
|
152
123
|
allowBackgroundActivityStarts
|
|
153
124
|
} = opts;
|
|
154
125
|
const cmd = ['am', 'broadcast'];
|
|
155
|
-
|
|
156
126
|
if (!_lodash.default.isNil(user)) {
|
|
157
127
|
cmd.push('--user', user);
|
|
158
128
|
}
|
|
159
|
-
|
|
160
129
|
if (receiverPermission) {
|
|
161
130
|
cmd.push('--receiver-permission', receiverPermission);
|
|
162
131
|
}
|
|
163
|
-
|
|
164
132
|
if (allowBackgroundActivityStarts) {
|
|
165
133
|
cmd.push('--allow-background-activity-starts');
|
|
166
134
|
}
|
|
167
|
-
|
|
168
135
|
cmd.push(...parseIntentSpec(opts));
|
|
169
136
|
return await this.adb.shell(cmd);
|
|
170
137
|
};
|
|
@@ -175,17 +142,14 @@ commands.mobileStartService = async function mobileStartService(opts = {}) {
|
|
|
175
142
|
foreground
|
|
176
143
|
} = opts;
|
|
177
144
|
const cmd = ['am'];
|
|
178
|
-
|
|
179
145
|
if ((await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8) {
|
|
180
146
|
cmd.push('startservice');
|
|
181
147
|
} else {
|
|
182
148
|
cmd.push(foreground ? 'start-foreground-service' : 'start-service');
|
|
183
149
|
}
|
|
184
|
-
|
|
185
150
|
if (!_lodash.default.isNil(user)) {
|
|
186
151
|
cmd.push('--user', user);
|
|
187
152
|
}
|
|
188
|
-
|
|
189
153
|
cmd.push(...parseIntentSpec(opts));
|
|
190
154
|
return await this.adb.shell(cmd);
|
|
191
155
|
};
|
|
@@ -195,15 +159,12 @@ commands.mobileStopService = async function mobileStopService(opts = {}) {
|
|
|
195
159
|
user
|
|
196
160
|
} = opts;
|
|
197
161
|
const cmd = ['am', (await this.adb.getApiLevel()) < API_LEVEL_ANDROID_8 ? 'stopservice' : 'stop-service'];
|
|
198
|
-
|
|
199
162
|
if (!_lodash.default.isNil(user)) {
|
|
200
163
|
cmd.push('--user', user);
|
|
201
164
|
}
|
|
202
|
-
|
|
203
165
|
cmd.push(...parseIntentSpec(opts));
|
|
204
166
|
return await this.adb.shell(cmd);
|
|
205
167
|
};
|
|
206
|
-
|
|
207
168
|
var _default = commands;
|
|
208
169
|
exports.default = _default;
|
|
209
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT19WQUxVRV9BUkdfVFlQRSIsIlNVUFBPUlRFRF9FWFRSQV9UWVBFUyIsIkFQSV9MRVZFTF9BTkRST0lEXzgiLCJjb21tYW5kcyIsInBhcnNlSW50ZW50U3BlYyIsIm9wdHMiLCJpbnRlbnQiLCJhY3Rpb24iLCJ1cmkiLCJtaW1lVHlwZSIsImlkZW50aWZpZXIiLCJjYXRlZ29yaWVzIiwiY29tcG9uZW50IiwiZXh0cmFzIiwiZmxhZ3MiLCJyZXN1bHRBcmdzIiwicHVzaCIsIl8iLCJpc05pbCIsImlzQXJyYXkiLCJmbGF0TWFwIiwibWFwIiwiY05hbWUiLCJwYWNrYWdlIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJpdGVtIiwidHlwZSIsImtleSIsInZhbHVlIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwiaXNTdHJpbmciLCJ0cmltIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzVW5kZWZpbmVkIiwibW9iaWxlU3RhcnRBY3Rpdml0eSIsInVzZXIiLCJ3YWl0Iiwic3RvcCIsIndpbmRvd2luZ01vZGUiLCJhY3Rpdml0eVR5cGUiLCJkaXNwbGF5IiwiY21kIiwiYWRiIiwiZ2V0QXBpTGV2ZWwiLCJzaGVsbCIsIm1vYmlsZUJyb2FkY2FzdCIsInJlY2VpdmVyUGVybWlzc2lvbiIsImFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzIiwibW9iaWxlU3RhcnRTZXJ2aWNlIiwiZm9yZWdyb3VuZCIsIm1vYmlsZVN0b3BTZXJ2aWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ludGVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IE5PX1ZBTFVFX0FSR19UWVBFID0gJ3NuJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRSQV9UWVBFUyA9IFtcbiAgJ3MnLCBOT19WQUxVRV9BUkdfVFlQRSwgJ3onLCAnaScsICdsJywgJ2YnLCAndScsICdjbicsXG4gICdpYScsICdpYWwnLCAnbGEnLCAnbGFsJywgJ2ZhJywgJ2ZhbCcsICdzYScsICdzYWwnLFxuXTtcbmNvbnN0IEFQSV9MRVZFTF9BTkRST0lEXzggPSAyNjtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuZnVuY3Rpb24gcGFyc2VJbnRlbnRTcGVjIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGludGVudCxcbiAgICBhY3Rpb24sXG4gICAgdXJpLFxuICAgIG1pbWVUeXBlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgY2F0ZWdvcmllcyxcbiAgICBjb21wb25lbnQsXG4gICAgZXh0cmFzLFxuICAgIGZsYWdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QXJncyA9IFtdO1xuICBpZiAoaW50ZW50KSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKGludGVudCk7XG4gIH1cbiAgaWYgKGFjdGlvbikge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmICh1cmkpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1kJywgdXJpKTtcbiAgfVxuICBpZiAobWltZVR5cGUpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy10JywgbWltZVR5cGUpO1xuICB9XG4gIGlmICghXy5pc05pbChpZGVudGlmaWVyKSkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWknLCBpZGVudGlmaWVyKTtcbiAgfVxuICBpZiAoY2F0ZWdvcmllcykge1xuICAgIGlmIChfLmlzQXJyYXkoY2F0ZWdvcmllcykpIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCguLi4oXy5mbGF0TWFwKGNhdGVnb3JpZXMubWFwKChjTmFtZSkgPT4gWyctYycsIGNOYW1lXSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCgnLWMnLCBjYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLW4nLCBjb21wb25lbnQpO1xuICB9XG4gIGlmIChvcHRzLnBhY2thZ2UpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1wJywgb3B0cy5wYWNrYWdlKTtcbiAgfVxuICBpZiAoZXh0cmFzKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkoZXh0cmFzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2V4dHJhcycgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShpdGVtKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBFeHRyYSBhcmd1bWVudCAnJHtpdGVtfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgY29uc3QgW3R5cGUsIGtleSwgdmFsdWVdID0gaXRlbTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhTVVBQT1JURURfRVhUUkFfVFlQRVMsIHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBrbm93bi4gYCArXG4gICAgICAgICAgYFN1cHBvcnRlZCBpbnRlbnQgYXJndW1lbnQgdHlwZXMgYXJlOiAke1NVUFBPUlRFRF9FWFRSQV9UWVBFU31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0VtcHR5KGtleSkgfHwgKF8uaXNTdHJpbmcoa2V5KSAmJiBfLnRyaW0oa2V5KSA9PT0gJycpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50J3Mga2V5IGluICcke0pTT04uc3RyaW5naWZ5KGl0ZW0pfScgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBpZGVudGlmaWVyYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IE5PX1ZBTFVFX0FSR19UWVBFKSB7XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChgLS1lJHt0eXBlfWAsIGtleSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludGVudCBhcmd1bWVudCB0eXBlICcke3R5cGV9JyBpbiAnJHtKU09OLnN0cmluZ2lmeShpdGVtKX0nIHJlcXVpcmVzIGEgYCArXG4gICAgICAgICAgYHZhbGlkIHZhbHVlIHRvIGJlIHByb3ZpZGVkYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0QXJncy5wdXNoKGAtLWUke3R5cGV9YCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmbGFncykge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdEFyZ3M7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRBY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXQgW2ZhbHNlXSAtIFNldCBpdCB0byBgdHJ1ZWAgaWYgeW91IHdhbnQgdG8gYmxvY2sgdGhlIG1ldGhvZCBjYWxsXG4gKiB1bnRpbCB0aGUgYWN0aXZpdHkgbWFuYWdlcidzIHByb2Nlc3MgcmV0dXJucyB0aGUgY29udHJvbCB0byB0aGUgc3lzdGVtLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gc3RvcCBbZmFsc2VdIC0gU2V0IGl0IHRvIGB0cnVlYCB0byBmb3JjZSBzdG9wIHRoZSB0YXJnZXRcbiAqIGFwcCBiZWZvcmUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSB3aW5kb3dpbmdNb2RlIC0gVGhlIHdpbmRvd2luZyBtb2RlIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIHdpbmRvd2luZyBtb2RlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggYFdJTkRPV0lOR19NT0RFX2ApLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gYWN0aXZpdHlUeXBlIC0gVGhlIGFjdGl2aXR5IHR5cGUgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSBhcy5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIGFjdGl2aXR5IHR5cGVzIChjb25zdGFudHMgc3RhcnRpbmcgd2l0aCBgQUNUSVZJVFlfVFlQRV9gKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGRpc3BsYXkgLSBUaGUgZGlzcGxheSBpZGVudGlmaWVyIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYWNrYWdlIC0gUGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVyaSAtIFVuaWZpZWQgcmVzb3VyY2UgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW1lVHlwZSAtIE1pbWUgdHlwZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZGVudGlmaWVyIC0gT3B0aW9uYWwgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfEFycmF5PHN0cmluZz59IGNhdGVnb3JpZXMgLSBPbmUgb3IgbW9yZSBjYXRlZ29yeSBuYW1lc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb21wb25lbnQgLSBDb21wb25lbnQgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmd8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuIE11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIGFzIGFycmF5IG9mIGFycmF5cywgd2hlcmUgZWFjaCBzdWJhcnJheSBpdGVtIGNvbnRhaW5zIHR3byBvciB0aHJlZSBzdHJpbmcgaXRlbXM6XG4gKiB2YWx1ZSB0eXBlLCBrZXkgbmFtZSBhbmQgdGhlIHZhbHVlIGl0c2VsZi5cbiAqIFN1cHBvcnRlZCB2YWx1ZSB0eXBlcyBhcmU6XG4gKiAtIHM6IHN0cmluZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHN0cmluZ1xuICogLSBzbjogbnVsbC4gVmFsdWUgaXMgaWdub3JlZCBmb3IgdGhpcyB0eXBlXG4gKiAtIHo6IGJvb2xlYW4uIFZhbHVlIG11c3QgYmUgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgXG4gKiAtIGk6IGludGVnZXIuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCA0LWJ5dGUgaW50ZWdlciBudW1iZXJcbiAqIC0gbDogbG9uZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIDgtYnl0ZSBsb25nIG51bWJlclxuICogLSBmOiBmbG9hdDogVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGZsb2F0IG51bWJlclxuICogLSB1OiB1cmkuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgc3RyaW5nXG4gKiAtIGNuOiBjb21wb25lbnQgbmFtZS4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIHN0cmluZ1xuICogLSBpYTogSW50ZWdlcltdLiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBpbnRlZ2Vyc1xuICogLSBpYWw6IExpc3Q8SW50ZWdlcj4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzXG4gKiAtIGxhOiBMb25nW10uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBsYWw6IExpc3Q8TG9uZz4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBmYTogRmxvYXRbXS4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgZmxvYXQgbnVtYmVyc1xuICogLSBmYWw6IExpc3Q8RmxvYXQ+LiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBmbG9hdCBudW1iZXJzXG4gKiAtIHNhOiBTdHJpbmdbXS4gVmFsdWUgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncy4gVG8gZW1iZWQgYSBjb21tYSBpbnRvIGEgc3RyaW5nLFxuICogZXNjYXBlIGl0IHVzaW5nIFwiXFwsXCJcbiAqIC0gc2FsOiBMaXN0PFN0cmluZz4uIFZhbHVlIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkIHN0cmluZ3MuIFRvIGVtYmVkIGEgY29tbWEgaW50byBhIHN0cmluZyxcbiAqIGVzY2FwZSBpdCB1c2luZyBcIlxcLFwiXG4gKiBGb3IgZXhhbXBsZTogW1sncycsICd2YXJOYW1lMScsICdNeSBTdHJpbmcxJ10sIFsncycsICd2YXJOYW1lMicsICdNeSBTdHJpbmcyJ10sIFsnaWEnLCAnYXJyTmFtZScsICcxLDIsMyw0J11dXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZsYWdzIC0gSW50ZW50IHN0YXJ0dXAtc3BlY2lmaWMgZmxhZ3MgYXMgYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQuaHRtbFxuICogZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmbGFnIHZhbHVlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggRkxBR19BQ1RJVklUWV8pLlxuICogRmxhZyB2YWx1ZXMgY291bGQgYmUgbWVyZ2VkIHVzaW5nIHRoZSBsb2dpY2FsICdvcicgb3BlcmF0aW9uLlxuICogRm9yIGV4YW1wbGUsIDB4MTAyMDAwMDAgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHR3byBmbGFnczpcbiAqIDB4MTAwMDAwMDAgYEZMQUdfQUNUSVZJVFlfTkVXX1RBU0tgIHwgMHgwMDIwMDAwMCBgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRGBcbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyB0aGUgZ2l2ZW4gYWN0aXZpdHkgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBY3Rpdml0eU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydEFjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgd2FpdCxcbiAgICBzdG9wLFxuICAgIHdpbmRvd2luZ01vZGUsXG4gICAgYWN0aXZpdHlUeXBlLFxuICAgIGRpc3BsYXksXG4gIH0gPSBvcHRzO1xuICBjb25zdCBjbWQgPSBbXG4gICAgJ2FtJywgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICBdO1xuICBpZiAoIV8uaXNOaWwodXNlcikpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgaWYgKHdhaXQpIHtcbiAgICBjbWQucHVzaCgnLVcnKTtcbiAgfVxuICBpZiAoc3RvcCkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmICghXy5pc05pbCh3aW5kb3dpbmdNb2RlKSkge1xuICAgIGNtZC5wdXNoKCctLXdpbmRvd2luZ01vZGUnLCB3aW5kb3dpbmdNb2RlKTtcbiAgfVxuICBpZiAoIV8uaXNOaWwoYWN0aXZpdHlUeXBlKSkge1xuICAgIGNtZC5wdXNoKCctLWFjdGl2aXR5VHlwZScsIGFjdGl2aXR5VHlwZSk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKGRpc3BsYXkpKSB7XG4gICAgY21kLnB1c2goJy0tZGlzcGxheScsIGRpc3BsYXkpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEJyb2FkY2FzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydhbGwnXSAtIFRoZSB1c2VyIElEIGZvciB3aGljaCB0aGUgYnJvYWRjYXN0IGlzIHNlbnQuXG4gKiBUaGUgYGN1cnJlbnRgIGFsaWFzIGFzc3VtZXMgdGhlIGN1cnJlbnQgdXNlciBJRC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmVjZWl2ZXJQZXJtaXNzaW9uIC0gUmVxdWlyZSByZWNlaXZlciB0byBob2xkIHRoZSBnaXZlbiBwZXJtaXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYWxsb3dCYWNrZ3JvdW5kQWN0aXZpdHlTdGFydHMgW2ZhbHNlXSAtIFdoZXRoZXIgdGhlIHJlY2VpdmVyIG1heVxuICogc3RhcnQgYWN0aXZpdGllcyBldmVuIGlmIGluIHRoZSBiYWNrZ3JvdW5kLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0bywgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cblxuLyoqXG4gKiBTZW5kIGEgYnJvYWRjYXN0IGludGVudC5cbiAqXG4gKiBAcGFyYW0ge0Jyb2FkY2FzdE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUJyb2FkY2FzdCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHJlY2VpdmVyUGVybWlzc2lvbixcbiAgICBhbGxvd0JhY2tncm91bmRBY3Rpdml0eVN0YXJ0cyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nLCAnYnJvYWRjYXN0J107XG4gIGlmICghXy5pc05pbCh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAocmVjZWl2ZXJQZXJtaXNzaW9uKSB7XG4gICAgY21kLnB1c2goJy0tcmVjZWl2ZXItcGVybWlzc2lvbicsIHJlY2VpdmVyUGVybWlzc2lvbik7XG4gIH1cbiAgaWYgKGFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzKSB7XG4gICAgY21kLnB1c2goJy0tYWxsb3ctYmFja2dyb3VuZC1hY3Rpdml0eS1zdGFydHMnKTtcbiAgfVxuICBjbWQucHVzaCguLi4ocGFyc2VJbnRlbnRTcGVjKG9wdHMpKSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBmb3JlZ3JvdW5kIFtmYWxzZV0gLSBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdXIgc2VydmljZSBtdXN0IGJlXG4gKiBzdGFydGVkIGFzIGZvcmVncm91bmQgc2VydmljZS4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgQVBJIGxldmVsIG9mIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3QgaXMgYmVsb3cgMjYgKEFuZHJvaWQgOCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RhcnRzIHRoZSBnaXZlbiBzZXJ2aWNlIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0YXJ0U2VydmljZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIHNlcnZpY2VcbiAqIG9yIHJlcXVpcmVkIG9wdGlvbnMgYXJlIG1pc3NpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTZXJ2aWNlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgZm9yZWdyb3VuZCxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nXTtcbiAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSB7XG4gICAgY21kLnB1c2goJ3N0YXJ0c2VydmljZScpO1xuICB9IGVsc2Uge1xuICAgIGNtZC5wdXNoKGZvcmVncm91bmQgPyAnc3RhcnQtZm9yZWdyb3VuZC1zZXJ2aWNlJyA6ICdzdGFydC1zZXJ2aWNlJyk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BTZXJ2aWNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdG9wLCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1cmkgLSBVbmlmaWVkIHJlc291cmNlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWltZVR5cGUgLSBNaW1lIHR5cGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWRlbnRpZmllciAtIE9wdGlvbmFsIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xBcnJheTxzdHJpbmc+fSBjYXRlZ29yaWVzIC0gT25lIG9yIG1vcmUgY2F0ZWdvcnkgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29tcG9uZW50IC0gQ29tcG9uZW50IG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFja2FnZSAtIFBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxzdHJpbmc+Pn0gZXh0cmFzIC0gT3B0aW9uYWwgaW50ZW50IGFyZ3VtZW50cy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBmbGFncyAtIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RvcHMgdGhlIGdpdmVuIHNlcnZpY2UgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RvcFNlcnZpY2VPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0b3BwaW5nIHRoZSBzZXJ2aWNlXG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNlcnZpY2UgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFtcbiAgICAnYW0nLFxuICAgIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgQVBJX0xFVkVMX0FORFJPSURfOCkgPyAnc3RvcHNlcnZpY2UnIDogJ3N0b3Atc2VydmljZSdcbiAgXTtcbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxJQUExQjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLENBQzVCLEdBRDRCLEVBQ3ZCRCxpQkFEdUIsRUFD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
|
|
170
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT19WQUxVRV9BUkdfVFlQRSIsIlNVUFBPUlRFRF9FWFRSQV9UWVBFUyIsIkFQSV9MRVZFTF9BTkRST0lEXzgiLCJjb21tYW5kcyIsInBhcnNlSW50ZW50U3BlYyIsIm9wdHMiLCJpbnRlbnQiLCJhY3Rpb24iLCJ1cmkiLCJtaW1lVHlwZSIsImlkZW50aWZpZXIiLCJjYXRlZ29yaWVzIiwiY29tcG9uZW50IiwiZXh0cmFzIiwiZmxhZ3MiLCJyZXN1bHRBcmdzIiwicHVzaCIsIl8iLCJpc05pbCIsImlzQXJyYXkiLCJmbGF0TWFwIiwibWFwIiwiY05hbWUiLCJwYWNrYWdlIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJpdGVtIiwidHlwZSIsImtleSIsInZhbHVlIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwiaXNTdHJpbmciLCJ0cmltIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzVW5kZWZpbmVkIiwibW9iaWxlU3RhcnRBY3Rpdml0eSIsInVzZXIiLCJ3YWl0Iiwic3RvcCIsIndpbmRvd2luZ01vZGUiLCJhY3Rpdml0eVR5cGUiLCJkaXNwbGF5IiwiY21kIiwiYWRiIiwiZ2V0QXBpTGV2ZWwiLCJzaGVsbCIsIm1vYmlsZUJyb2FkY2FzdCIsInJlY2VpdmVyUGVybWlzc2lvbiIsImFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzIiwibW9iaWxlU3RhcnRTZXJ2aWNlIiwiZm9yZWdyb3VuZCIsIm1vYmlsZVN0b3BTZXJ2aWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ludGVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IE5PX1ZBTFVFX0FSR19UWVBFID0gJ3NuJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRSQV9UWVBFUyA9IFtcbiAgJ3MnLCBOT19WQUxVRV9BUkdfVFlQRSwgJ3onLCAnaScsICdsJywgJ2YnLCAndScsICdjbicsXG4gICdpYScsICdpYWwnLCAnbGEnLCAnbGFsJywgJ2ZhJywgJ2ZhbCcsICdzYScsICdzYWwnLFxuXTtcbmNvbnN0IEFQSV9MRVZFTF9BTkRST0lEXzggPSAyNjtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuZnVuY3Rpb24gcGFyc2VJbnRlbnRTcGVjIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGludGVudCxcbiAgICBhY3Rpb24sXG4gICAgdXJpLFxuICAgIG1pbWVUeXBlLFxuICAgIGlkZW50aWZpZXIsXG4gICAgY2F0ZWdvcmllcyxcbiAgICBjb21wb25lbnQsXG4gICAgZXh0cmFzLFxuICAgIGZsYWdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QXJncyA9IFtdO1xuICBpZiAoaW50ZW50KSB7XG4gICAgcmVzdWx0QXJncy5wdXNoKGludGVudCk7XG4gIH1cbiAgaWYgKGFjdGlvbikge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmICh1cmkpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1kJywgdXJpKTtcbiAgfVxuICBpZiAobWltZVR5cGUpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy10JywgbWltZVR5cGUpO1xuICB9XG4gIGlmICghXy5pc05pbChpZGVudGlmaWVyKSkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWknLCBpZGVudGlmaWVyKTtcbiAgfVxuICBpZiAoY2F0ZWdvcmllcykge1xuICAgIGlmIChfLmlzQXJyYXkoY2F0ZWdvcmllcykpIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCguLi4oXy5mbGF0TWFwKGNhdGVnb3JpZXMubWFwKChjTmFtZSkgPT4gWyctYycsIGNOYW1lXSkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdEFyZ3MucHVzaCgnLWMnLCBjYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLW4nLCBjb21wb25lbnQpO1xuICB9XG4gIGlmIChvcHRzLnBhY2thZ2UpIHtcbiAgICByZXN1bHRBcmdzLnB1c2goJy1wJywgb3B0cy5wYWNrYWdlKTtcbiAgfVxuICBpZiAoZXh0cmFzKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkoZXh0cmFzKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2V4dHJhcycgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShpdGVtKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBFeHRyYSBhcmd1bWVudCAnJHtpdGVtfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgY29uc3QgW3R5cGUsIGtleSwgdmFsdWVdID0gaXRlbTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhTVVBQT1JURURfRVhUUkFfVFlQRVMsIHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBrbm93bi4gYCArXG4gICAgICAgICAgYFN1cHBvcnRlZCBpbnRlbnQgYXJndW1lbnQgdHlwZXMgYXJlOiAke1NVUFBPUlRFRF9FWFRSQV9UWVBFU31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0VtcHR5KGtleSkgfHwgKF8uaXNTdHJpbmcoa2V5KSAmJiBfLnRyaW0oa2V5KSA9PT0gJycpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEV4dHJhIGFyZ3VtZW50J3Mga2V5IGluICcke0pTT04uc3RyaW5naWZ5KGl0ZW0pfScgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBpZGVudGlmaWVyYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IE5PX1ZBTFVFX0FSR19UWVBFKSB7XG4gICAgICAgIHJlc3VsdEFyZ3MucHVzaChgLS1lJHt0eXBlfWAsIGtleSk7XG4gICAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEludGVudCBhcmd1bWVudCB0eXBlICcke3R5cGV9JyBpbiAnJHtKU09OLnN0cmluZ2lmeShpdGVtKX0nIHJlcXVpcmVzIGEgYCArXG4gICAgICAgICAgYHZhbGlkIHZhbHVlIHRvIGJlIHByb3ZpZGVkYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0QXJncy5wdXNoKGAtLWUke3R5cGV9YCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmbGFncykge1xuICAgIHJlc3VsdEFyZ3MucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdEFyZ3M7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRBY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydjdXJyZW50J10gLSBUaGUgdXNlciBJRCBmb3Igd2hpY2ggdGhlIHNlcnZpY2UgaXMgc3RhcnRlZC5cbiAqIFRoZSBgY3VycmVudGAgdXNlciBpZCBpcyB1c2VkIGJ5IGRlZmF1bHRcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXQgW2ZhbHNlXSAtIFNldCBpdCB0byBgdHJ1ZWAgaWYgeW91IHdhbnQgdG8gYmxvY2sgdGhlIG1ldGhvZCBjYWxsXG4gKiB1bnRpbCB0aGUgYWN0aXZpdHkgbWFuYWdlcidzIHByb2Nlc3MgcmV0dXJucyB0aGUgY29udHJvbCB0byB0aGUgc3lzdGVtLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gc3RvcCBbZmFsc2VdIC0gU2V0IGl0IHRvIGB0cnVlYCB0byBmb3JjZSBzdG9wIHRoZSB0YXJnZXRcbiAqIGFwcCBiZWZvcmUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSB3aW5kb3dpbmdNb2RlIC0gVGhlIHdpbmRvd2luZyBtb2RlIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIHdpbmRvd2luZyBtb2RlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggYFdJTkRPV0lOR19NT0RFX2ApLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gYWN0aXZpdHlUeXBlIC0gVGhlIGFjdGl2aXR5IHR5cGUgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSBhcy5cbiAqIENoZWNrIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHBvc3NpYmxlIGFjdGl2aXR5IHR5cGVzIChjb25zdGFudHMgc3RhcnRpbmcgd2l0aCBgQUNUSVZJVFlfVFlQRV9gKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGRpc3BsYXkgLSBUaGUgZGlzcGxheSBpZGVudGlmaWVyIHRvIGxhdW5jaCB0aGUgYWN0aXZpdHkgaW50by5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGFjdGl2aXR5IGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYWNrYWdlIC0gUGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVyaSAtIFVuaWZpZWQgcmVzb3VyY2UgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW1lVHlwZSAtIE1pbWUgdHlwZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZGVudGlmaWVyIC0gT3B0aW9uYWwgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/c3RyaW5nfEFycmF5PHN0cmluZz59IGNhdGVnb3JpZXMgLSBPbmUgb3IgbW9yZSBjYXRlZ29yeSBuYW1lc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb21wb25lbnQgLSBDb21wb25lbnQgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmd8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuIE11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIGFzIGFycmF5IG9mIGFycmF5cywgd2hlcmUgZWFjaCBzdWJhcnJheSBpdGVtIGNvbnRhaW5zIHR3byBvciB0aHJlZSBzdHJpbmcgaXRlbXM6XG4gKiB2YWx1ZSB0eXBlLCBrZXkgbmFtZSBhbmQgdGhlIHZhbHVlIGl0c2VsZi5cbiAqIFN1cHBvcnRlZCB2YWx1ZSB0eXBlcyBhcmU6XG4gKiAtIHM6IHN0cmluZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIHN0cmluZ1xuICogLSBzbjogbnVsbC4gVmFsdWUgaXMgaWdub3JlZCBmb3IgdGhpcyB0eXBlXG4gKiAtIHo6IGJvb2xlYW4uIFZhbHVlIG11c3QgYmUgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgXG4gKiAtIGk6IGludGVnZXIuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCA0LWJ5dGUgaW50ZWdlciBudW1iZXJcbiAqIC0gbDogbG9uZy4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIDgtYnl0ZSBsb25nIG51bWJlclxuICogLSBmOiBmbG9hdDogVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGZsb2F0IG51bWJlclxuICogLSB1OiB1cmkuIFZhbHVlIG11c3QgYmUgYSB2YWxpZCB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgc3RyaW5nXG4gKiAtIGNuOiBjb21wb25lbnQgbmFtZS4gVmFsdWUgbXVzdCBiZSBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIHN0cmluZ1xuICogLSBpYTogSW50ZWdlcltdLiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBpbnRlZ2Vyc1xuICogLSBpYWw6IExpc3Q8SW50ZWdlcj4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzXG4gKiAtIGxhOiBMb25nW10uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBsYWw6IExpc3Q8TG9uZz4uIFZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2YgY29tbWEtc2VwYXJhdGVkIGxvbmcgbnVtYmVyc1xuICogLSBmYTogRmxvYXRbXS4gVmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjb21tYS1zZXBhcmF0ZWQgZmxvYXQgbnVtYmVyc1xuICogLSBmYWw6IExpc3Q8RmxvYXQ+LiBWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCBmbG9hdCBudW1iZXJzXG4gKiAtIHNhOiBTdHJpbmdbXS4gVmFsdWUgbXVzdCBiZSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncy4gVG8gZW1iZWQgYSBjb21tYSBpbnRvIGEgc3RyaW5nLFxuICogZXNjYXBlIGl0IHVzaW5nIFwiXFwsXCJcbiAqIC0gc2FsOiBMaXN0PFN0cmluZz4uIFZhbHVlIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkIHN0cmluZ3MuIFRvIGVtYmVkIGEgY29tbWEgaW50byBhIHN0cmluZyxcbiAqIGVzY2FwZSBpdCB1c2luZyBcIlxcLFwiXG4gKiBGb3IgZXhhbXBsZTogW1sncycsICd2YXJOYW1lMScsICdNeSBTdHJpbmcxJ10sIFsncycsICd2YXJOYW1lMicsICdNeSBTdHJpbmcyJ10sIFsnaWEnLCAnYXJyTmFtZScsICcxLDIsMyw0J11dXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGZsYWdzIC0gSW50ZW50IHN0YXJ0dXAtc3BlY2lmaWMgZmxhZ3MgYXMgYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQuaHRtbFxuICogZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmbGFnIHZhbHVlcyAoY29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggRkxBR19BQ1RJVklUWV8pLlxuICogRmxhZyB2YWx1ZXMgY291bGQgYmUgbWVyZ2VkIHVzaW5nIHRoZSBsb2dpY2FsICdvcicgb3BlcmF0aW9uLlxuICogRm9yIGV4YW1wbGUsIDB4MTAyMDAwMDAgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHR3byBmbGFnczpcbiAqIDB4MTAwMDAwMDAgYEZMQUdfQUNUSVZJVFlfTkVXX1RBU0tgIHwgMHgwMDIwMDAwMCBgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRGBcbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyB0aGUgZ2l2ZW4gYWN0aXZpdHkgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RhcnRBY3Rpdml0eU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydEFjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgd2FpdCxcbiAgICBzdG9wLFxuICAgIHdpbmRvd2luZ01vZGUsXG4gICAgYWN0aXZpdHlUeXBlLFxuICAgIGRpc3BsYXksXG4gIH0gPSBvcHRzO1xuICBjb25zdCBjbWQgPSBbXG4gICAgJ2FtJywgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICBdO1xuICBpZiAoIV8uaXNOaWwodXNlcikpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgaWYgKHdhaXQpIHtcbiAgICBjbWQucHVzaCgnLVcnKTtcbiAgfVxuICBpZiAoc3RvcCkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmICghXy5pc05pbCh3aW5kb3dpbmdNb2RlKSkge1xuICAgIGNtZC5wdXNoKCctLXdpbmRvd2luZ01vZGUnLCB3aW5kb3dpbmdNb2RlKTtcbiAgfVxuICBpZiAoIV8uaXNOaWwoYWN0aXZpdHlUeXBlKSkge1xuICAgIGNtZC5wdXNoKCctLWFjdGl2aXR5VHlwZScsIGFjdGl2aXR5VHlwZSk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKGRpc3BsYXkpKSB7XG4gICAgY21kLnB1c2goJy0tZGlzcGxheScsIGRpc3BsYXkpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEJyb2FkY2FzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHVzZXIgWydhbGwnXSAtIFRoZSB1c2VyIElEIGZvciB3aGljaCB0aGUgYnJvYWRjYXN0IGlzIHNlbnQuXG4gKiBUaGUgYGN1cnJlbnRgIGFsaWFzIGFzc3VtZXMgdGhlIGN1cnJlbnQgdXNlciBJRC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmVjZWl2ZXJQZXJtaXNzaW9uIC0gUmVxdWlyZSByZWNlaXZlciB0byBob2xkIHRoZSBnaXZlbiBwZXJtaXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYWxsb3dCYWNrZ3JvdW5kQWN0aXZpdHlTdGFydHMgW2ZhbHNlXSAtIFdoZXRoZXIgdGhlIHJlY2VpdmVyIG1heVxuICogc3RhcnQgYWN0aXZpdGllcyBldmVuIGlmIGluIHRoZSBiYWNrZ3JvdW5kLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0bywgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cblxuLyoqXG4gKiBTZW5kIGEgYnJvYWRjYXN0IGludGVudC5cbiAqXG4gKiBAcGFyYW0ge0Jyb2FkY2FzdE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIGFjdGl2aXR5XG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUJyb2FkY2FzdCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHJlY2VpdmVyUGVybWlzc2lvbixcbiAgICBhbGxvd0JhY2tncm91bmRBY3Rpdml0eVN0YXJ0cyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nLCAnYnJvYWRjYXN0J107XG4gIGlmICghXy5pc05pbCh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAocmVjZWl2ZXJQZXJtaXNzaW9uKSB7XG4gICAgY21kLnB1c2goJy0tcmVjZWl2ZXItcGVybWlzc2lvbicsIHJlY2VpdmVyUGVybWlzc2lvbik7XG4gIH1cbiAgaWYgKGFsbG93QmFja2dyb3VuZEFjdGl2aXR5U3RhcnRzKSB7XG4gICAgY21kLnB1c2goJy0tYWxsb3ctYmFja2dyb3VuZC1hY3Rpdml0eS1zdGFydHMnKTtcbiAgfVxuICBjbWQucHVzaCguLi4ocGFyc2VJbnRlbnRTcGVjKG9wdHMpKSk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNlcnZpY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBmb3JlZ3JvdW5kIFtmYWxzZV0gLSBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdXIgc2VydmljZSBtdXN0IGJlXG4gKiBzdGFydGVkIGFzIGZvcmVncm91bmQgc2VydmljZS4gVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgQVBJIGxldmVsIG9mIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3QgaXMgYmVsb3cgMjYgKEFuZHJvaWQgOCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdGFydCwgZm9yIGV4YW1wbGVcbiAqIGBjb20uc29tZS5wYWNrYWdlLm5hbWUvLllvdXJTZXJ2aWNlU3ViQ2xhc3NOYW1lYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJpIC0gVW5pZmllZCByZXNvdXJjZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbWVUeXBlIC0gTWltZSB0eXBlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkZW50aWZpZXIgLSBPcHRpb25hbCBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gY2F0ZWdvcmllcyAtIE9uZSBvciBtb3JlIGNhdGVnb3J5IG5hbWVzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbXBvbmVudCAtIENvbXBvbmVudCBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhY2thZ2UgLSBQYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGV4dHJhcyAtIE9wdGlvbmFsIGludGVudCBhcmd1bWVudHMuXG4gKiBTZWUgYWJvdmUgZm9yIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmxhZ3MgLSBJbnRlbnQgc3RhcnR1cC1zcGVjaWZpYyBmbGFncyBhcyBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RhcnRzIHRoZSBnaXZlbiBzZXJ2aWNlIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0YXJ0U2VydmljZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc3RhcnRpbmcgdGhlIHNlcnZpY2VcbiAqIG9yIHJlcXVpcmVkIG9wdGlvbnMgYXJlIG1pc3NpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTZXJ2aWNlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgZm9yZWdyb3VuZCxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nXTtcbiAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCBBUElfTEVWRUxfQU5EUk9JRF84KSB7XG4gICAgY21kLnB1c2goJ3N0YXJ0c2VydmljZScpO1xuICB9IGVsc2Uge1xuICAgIGNtZC5wdXNoKGZvcmVncm91bmQgPyAnc3RhcnQtZm9yZWdyb3VuZC1zZXJ2aWNlJyA6ICdzdGFydC1zZXJ2aWNlJyk7XG4gIH1cbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BTZXJ2aWNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSB1c2VyIFsnY3VycmVudCddIC0gVGhlIHVzZXIgSUQgZm9yIHdoaWNoIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuXG4gKiBUaGUgYGN1cnJlbnRgIHVzZXIgaWQgaXMgdXNlZCBieSBkZWZhdWx0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGludGVudCB0byBzdG9wLCBmb3IgZXhhbXBsZVxuICogYGNvbS5zb21lLnBhY2thZ2UubmFtZS8uWW91clNlcnZpY2VTdWJDbGFzc05hbWVgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1cmkgLSBVbmlmaWVkIHJlc291cmNlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWltZVR5cGUgLSBNaW1lIHR5cGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWRlbnRpZmllciAtIE9wdGlvbmFsIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xBcnJheTxzdHJpbmc+fSBjYXRlZ29yaWVzIC0gT25lIG9yIG1vcmUgY2F0ZWdvcnkgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29tcG9uZW50IC0gQ29tcG9uZW50IG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFja2FnZSAtIFBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxzdHJpbmc+Pn0gZXh0cmFzIC0gT3B0aW9uYWwgaW50ZW50IGFyZ3VtZW50cy5cbiAqIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBmbGFncyAtIFNlZSBhYm92ZSBmb3IgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogU3RvcHMgdGhlIGdpdmVuIHNlcnZpY2UgaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RvcFNlcnZpY2VPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHN0b3BwaW5nIHRoZSBzZXJ2aWNlXG4gKiBvciByZXF1aXJlZCBvcHRpb25zIGFyZSBtaXNzaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNlcnZpY2UgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNtZCA9IFtcbiAgICAnYW0nLFxuICAgIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgQVBJX0xFVkVMX0FORFJPSURfOCkgPyAnc3RvcHNlcnZpY2UnIDogJ3N0b3Atc2VydmljZSdcbiAgXTtcbiAgaWYgKCFfLmlzTmlsKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGNtZC5wdXNoKC4uLihwYXJzZUludGVudFNwZWMob3B0cykpKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsSUFBSTtBQUM5QixNQUFNQyxxQkFBcUIsR0FBRyxDQUM1QixHQUFHLEVBQUVELGlCQUFpQixFQUFFLEdBQUcs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.js","names":["NO_VALUE_ARG_TYPE","SUPPORTED_EXTRA_TYPES","API_LEVEL_ANDROID_8","commands","parseIntentSpec","opts","intent","action","uri","mimeType","identifier","categories","component","extras","flags","resultArgs","push","_","isNil","isArray","flatMap","map","cName","package","errors","InvalidArgumentError","item","type","key","value","includes","isEmpty","isString","trim","JSON","stringify","isUndefined","mobileStartActivity","user","wait","stop","windowingMode","activityType","display","cmd","adb","getApiLevel","shell","mobileBroadcast","receiverPermission","allowBackgroundActivityStarts","mobileStartService","foreground","mobileStopService"],"sources":["../../../lib/commands/intent.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst NO_VALUE_ARG_TYPE = 'sn';\nconst SUPPORTED_EXTRA_TYPES = [\n 's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',\n 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',\n];\nconst API_LEVEL_ANDROID_8 = 26;\n\nconst commands = {};\n\nfunction parseIntentSpec (opts = {}) {\n const {\n intent,\n action,\n uri,\n mimeType,\n identifier,\n categories,\n component,\n extras,\n flags,\n } = opts;\n const resultArgs = [];\n if (intent) {\n resultArgs.push(intent);\n }\n if (action) {\n resultArgs.push('-a', action);\n }\n if (uri) {\n resultArgs.push('-d', uri);\n }\n if (mimeType) {\n resultArgs.push('-t', mimeType);\n }\n if (!_.isNil(identifier)) {\n resultArgs.push('-i', identifier);\n }\n if (categories) {\n if (_.isArray(categories)) {\n resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));\n } else {\n resultArgs.push('-c', categories);\n }\n }\n if (component) {\n resultArgs.push('-n', component);\n }\n if (opts.package) {\n resultArgs.push('-p', opts.package);\n }\n if (extras) {\n if (!_.isArray(extras)) {\n throw new errors.InvalidArgumentError(`'extras' must be an array`);\n }\n for (const item of extras) {\n if (!_.isArray(item)) {\n throw new errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);\n }\n const [type, key, value] = item;\n if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {\n throw new errors.InvalidArgumentError(\n `Extra argument type '${type}' is not known. ` +\n `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`\n );\n }\n if (_.isEmpty(key) || (_.isString(key) && _.trim(key) === '')) {\n throw new errors.InvalidArgumentError(\n `Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`\n );\n }\n if (type === NO_VALUE_ARG_TYPE) {\n resultArgs.push(`--e${type}`, key);\n } else if (_.isUndefined(value)) {\n throw new errors.InvalidArgumentError(\n `Intent argument type '${type}' in '${JSON.stringify(item)}' requires a ` +\n `valid value to be provided`\n );\n } else {\n resultArgs.push(`--e${type}`, key, value);\n }\n }\n }\n if (flags) {\n resultArgs.push('-f', flags);\n }\n return resultArgs;\n}\n\n/**\n * @typedef {Object} StartActivityOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} wait [false] - Set it to `true` if you want to block the method call\n * until the activity manager's process returns the control to the system.\n * @property {?boolean} stop [false] - Set it to `true` to force stop the target\n * app before starting the activity\n * @property {?number|string} windowingMode - The windowing mode to launch the activity into.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).\n * @property {?number|string} activityType - The activity type to launch the activity as.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).\n * @property {?number|string} display - The display identifier to launch the activity into.\n * @property {?string} intent - The name of the activity intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`\n * @property {?string} action - Action name\n * @property {?string} package - Package name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented\n * as array of arrays, where each subarray item contains two or three string items:\n * value type, key name and the value itself.\n * Supported value types are:\n * - s: string. Value must be a valid string\n * - sn: null. Value is ignored for this type\n * - z: boolean. Value must be either `true` or `false`\n * - i: integer. Value must be a valid 4-byte integer number\n * - l: long. Value must be a valid 8-byte long number\n * - f: float: Value must be a valid float number\n * - u: uri. Value must be a valid uniform resource identifier string\n * - cn: component name. Value must be a valid component name string\n * - ia: Integer[]. Value must be a string of comma-separated integers\n * - ial: List<Integer>. Value must be a string of comma-separated integers\n * - la: Long[]. Value must be a string of comma-separated long numbers\n * - lal: List<Long>. Value must be a string of comma-separated long numbers\n * - fa: Float[]. Value must be a string of comma-separated float numbers\n * - fal: List<Float>. Value must be a string of comma-separated float numbers\n * - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * For example: [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See https://developer.android.com/reference/android/content/Intent.html\n * for the list of available flag values (constants starting with FLAG_ACTIVITY_).\n * Flag values could be merged using the logical 'or' operation.\n * For example, 0x10200000 is the combination of two flags:\n * 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`\n */\n\n/**\n * Starts the given activity intent.\n *\n * @param {StartActivityOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileStartActivity = async function mobileStartActivity (opts = {}) {\n const {\n user,\n wait,\n stop,\n windowingMode,\n activityType,\n display,\n } = opts;\n const cmd = [\n 'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (wait) {\n cmd.push('-W');\n }\n if (stop) {\n cmd.push('-S');\n }\n if (!_.isNil(windowingMode)) {\n cmd.push('--windowingMode', windowingMode);\n }\n if (!_.isNil(activityType)) {\n cmd.push('--activityType', activityType);\n }\n if (!_.isNil(display)) {\n cmd.push('--display', display);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} BroadcastOptions\n * @property {?string|number} user ['all'] - The user ID for which the broadcast is sent.\n * The `current` alias assumes the current user ID.\n * @property {?string} receiverPermission - Require receiver to hold the given permission.\n * @property {?boolean} allowBackgroundActivityStarts [false] - Whether the receiver may\n * start activities even if in the background.\n * @property {?string} intent - The name of the intent to broadcast to, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n\n/**\n * Send a broadcast intent.\n *\n * @param {BroadcastOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileBroadcast = async function mobileBroadcast (opts = {}) {\n const {\n user,\n receiverPermission,\n allowBackgroundActivityStarts,\n } = opts;\n const cmd = ['am', 'broadcast'];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (receiverPermission) {\n cmd.push('--receiver-permission', receiverPermission);\n }\n if (allowBackgroundActivityStarts) {\n cmd.push('--allow-background-activity-starts');\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StartServiceOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} foreground [false] - Set it to `true` if your service must be\n * started as foreground service. This option is ignored if the API level of the\n * device under test is below 26 (Android 8).\n * @property {?string} intent - The name of the service intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n/**\n * Starts the given service intent.\n *\n * @param {StartServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the service\n * or required options are missing\n */\ncommands.mobileStartService = async function mobileStartService (opts = {}) {\n const {\n user,\n foreground,\n } = opts;\n const cmd = ['am'];\n if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {\n cmd.push('startservice');\n } else {\n cmd.push(foreground ? 'start-foreground-service' : 'start-service');\n }\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StopServiceOptions\n * @property {string|number} user ['current'] - The user ID for which the service is running.\n * The `current` user id is used by default\n * @property {?string} intent - The name of the service intent to stop, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - See above for the detailed description.\n */\n\n/**\n * Stops the given service intent.\n *\n * @param {StopServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while stopping the service\n * or required options are missing\n */\ncommands.mobileStopService = async function mobileStopService (opts = {}) {\n const {\n user,\n } = opts;\n const cmd = [\n 'am',\n (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"intent.js","names":["NO_VALUE_ARG_TYPE","SUPPORTED_EXTRA_TYPES","API_LEVEL_ANDROID_8","commands","parseIntentSpec","opts","intent","action","uri","mimeType","identifier","categories","component","extras","flags","resultArgs","push","_","isNil","isArray","flatMap","map","cName","package","errors","InvalidArgumentError","item","type","key","value","includes","isEmpty","isString","trim","JSON","stringify","isUndefined","mobileStartActivity","user","wait","stop","windowingMode","activityType","display","cmd","adb","getApiLevel","shell","mobileBroadcast","receiverPermission","allowBackgroundActivityStarts","mobileStartService","foreground","mobileStopService"],"sources":["../../../lib/commands/intent.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst NO_VALUE_ARG_TYPE = 'sn';\nconst SUPPORTED_EXTRA_TYPES = [\n 's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',\n 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',\n];\nconst API_LEVEL_ANDROID_8 = 26;\n\nconst commands = {};\n\nfunction parseIntentSpec (opts = {}) {\n const {\n intent,\n action,\n uri,\n mimeType,\n identifier,\n categories,\n component,\n extras,\n flags,\n } = opts;\n const resultArgs = [];\n if (intent) {\n resultArgs.push(intent);\n }\n if (action) {\n resultArgs.push('-a', action);\n }\n if (uri) {\n resultArgs.push('-d', uri);\n }\n if (mimeType) {\n resultArgs.push('-t', mimeType);\n }\n if (!_.isNil(identifier)) {\n resultArgs.push('-i', identifier);\n }\n if (categories) {\n if (_.isArray(categories)) {\n resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));\n } else {\n resultArgs.push('-c', categories);\n }\n }\n if (component) {\n resultArgs.push('-n', component);\n }\n if (opts.package) {\n resultArgs.push('-p', opts.package);\n }\n if (extras) {\n if (!_.isArray(extras)) {\n throw new errors.InvalidArgumentError(`'extras' must be an array`);\n }\n for (const item of extras) {\n if (!_.isArray(item)) {\n throw new errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);\n }\n const [type, key, value] = item;\n if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {\n throw new errors.InvalidArgumentError(\n `Extra argument type '${type}' is not known. ` +\n `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`\n );\n }\n if (_.isEmpty(key) || (_.isString(key) && _.trim(key) === '')) {\n throw new errors.InvalidArgumentError(\n `Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`\n );\n }\n if (type === NO_VALUE_ARG_TYPE) {\n resultArgs.push(`--e${type}`, key);\n } else if (_.isUndefined(value)) {\n throw new errors.InvalidArgumentError(\n `Intent argument type '${type}' in '${JSON.stringify(item)}' requires a ` +\n `valid value to be provided`\n );\n } else {\n resultArgs.push(`--e${type}`, key, value);\n }\n }\n }\n if (flags) {\n resultArgs.push('-f', flags);\n }\n return resultArgs;\n}\n\n/**\n * @typedef {Object} StartActivityOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} wait [false] - Set it to `true` if you want to block the method call\n * until the activity manager's process returns the control to the system.\n * @property {?boolean} stop [false] - Set it to `true` to force stop the target\n * app before starting the activity\n * @property {?number|string} windowingMode - The windowing mode to launch the activity into.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).\n * @property {?number|string} activityType - The activity type to launch the activity as.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).\n * @property {?number|string} display - The display identifier to launch the activity into.\n * @property {?string} intent - The name of the activity intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`\n * @property {?string} action - Action name\n * @property {?string} package - Package name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented\n * as array of arrays, where each subarray item contains two or three string items:\n * value type, key name and the value itself.\n * Supported value types are:\n * - s: string. Value must be a valid string\n * - sn: null. Value is ignored for this type\n * - z: boolean. Value must be either `true` or `false`\n * - i: integer. Value must be a valid 4-byte integer number\n * - l: long. Value must be a valid 8-byte long number\n * - f: float: Value must be a valid float number\n * - u: uri. Value must be a valid uniform resource identifier string\n * - cn: component name. Value must be a valid component name string\n * - ia: Integer[]. Value must be a string of comma-separated integers\n * - ial: List<Integer>. Value must be a string of comma-separated integers\n * - la: Long[]. Value must be a string of comma-separated long numbers\n * - lal: List<Long>. Value must be a string of comma-separated long numbers\n * - fa: Float[]. Value must be a string of comma-separated float numbers\n * - fal: List<Float>. Value must be a string of comma-separated float numbers\n * - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * For example: [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See https://developer.android.com/reference/android/content/Intent.html\n * for the list of available flag values (constants starting with FLAG_ACTIVITY_).\n * Flag values could be merged using the logical 'or' operation.\n * For example, 0x10200000 is the combination of two flags:\n * 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`\n */\n\n/**\n * Starts the given activity intent.\n *\n * @param {StartActivityOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileStartActivity = async function mobileStartActivity (opts = {}) {\n const {\n user,\n wait,\n stop,\n windowingMode,\n activityType,\n display,\n } = opts;\n const cmd = [\n 'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (wait) {\n cmd.push('-W');\n }\n if (stop) {\n cmd.push('-S');\n }\n if (!_.isNil(windowingMode)) {\n cmd.push('--windowingMode', windowingMode);\n }\n if (!_.isNil(activityType)) {\n cmd.push('--activityType', activityType);\n }\n if (!_.isNil(display)) {\n cmd.push('--display', display);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} BroadcastOptions\n * @property {?string|number} user ['all'] - The user ID for which the broadcast is sent.\n * The `current` alias assumes the current user ID.\n * @property {?string} receiverPermission - Require receiver to hold the given permission.\n * @property {?boolean} allowBackgroundActivityStarts [false] - Whether the receiver may\n * start activities even if in the background.\n * @property {?string} intent - The name of the intent to broadcast to, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n\n/**\n * Send a broadcast intent.\n *\n * @param {BroadcastOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileBroadcast = async function mobileBroadcast (opts = {}) {\n const {\n user,\n receiverPermission,\n allowBackgroundActivityStarts,\n } = opts;\n const cmd = ['am', 'broadcast'];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (receiverPermission) {\n cmd.push('--receiver-permission', receiverPermission);\n }\n if (allowBackgroundActivityStarts) {\n cmd.push('--allow-background-activity-starts');\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StartServiceOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} foreground [false] - Set it to `true` if your service must be\n * started as foreground service. This option is ignored if the API level of the\n * device under test is below 26 (Android 8).\n * @property {?string} intent - The name of the service intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n/**\n * Starts the given service intent.\n *\n * @param {StartServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the service\n * or required options are missing\n */\ncommands.mobileStartService = async function mobileStartService (opts = {}) {\n const {\n user,\n foreground,\n } = opts;\n const cmd = ['am'];\n if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {\n cmd.push('startservice');\n } else {\n cmd.push(foreground ? 'start-foreground-service' : 'start-service');\n }\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StopServiceOptions\n * @property {string|number} user ['current'] - The user ID for which the service is running.\n * The `current` user id is used by default\n * @property {?string} intent - The name of the service intent to stop, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - See above for the detailed description.\n */\n\n/**\n * Stops the given service intent.\n *\n * @param {StopServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while stopping the service\n * or required options are missing\n */\ncommands.mobileStopService = async function mobileStopService (opts = {}) {\n const {\n user,\n } = opts;\n const cmd = [\n 'am',\n (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.helpers = exports.default = exports.commands = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _logger = _interopRequireDefault(require("../logger"));
|
|
13
|
-
|
|
14
10
|
var _os = _interopRequireDefault(require("os"));
|
|
15
|
-
|
|
16
11
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
-
|
|
18
12
|
var _ws = _interopRequireDefault(require("ws"));
|
|
19
|
-
|
|
20
13
|
var _driver = require("appium/driver");
|
|
21
|
-
|
|
22
14
|
const GET_SERVER_LOGS_FEATURE = 'get_server_logs';
|
|
23
15
|
let commands = {},
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
helpers = {},
|
|
17
|
+
extensions = {};
|
|
26
18
|
exports.helpers = helpers;
|
|
27
19
|
exports.commands = commands;
|
|
28
|
-
|
|
29
20
|
const WEBSOCKET_ENDPOINT = sessionId => `${_driver.DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;
|
|
30
21
|
|
|
31
22
|
function toLogRecord(timestamp, level, message) {
|
|
@@ -35,7 +26,6 @@ function toLogRecord(timestamp, level, message) {
|
|
|
35
26
|
message
|
|
36
27
|
};
|
|
37
28
|
}
|
|
38
|
-
|
|
39
29
|
extensions.supportedLogTypes = {
|
|
40
30
|
logcat: {
|
|
41
31
|
description: 'Logs for Android applications on real device and emulators via ADB',
|
|
@@ -61,29 +51,22 @@ extensions.supportedLogTypes = {
|
|
|
61
51
|
|
|
62
52
|
commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
|
|
63
53
|
const pathname = WEBSOCKET_ENDPOINT(this.sessionId);
|
|
64
|
-
|
|
65
54
|
if (!_lodash.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) {
|
|
66
55
|
_logger.default.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);
|
|
67
|
-
|
|
68
56
|
return;
|
|
69
57
|
}
|
|
70
|
-
|
|
71
58
|
_logger.default.info(`Assigning logcat broadcasting web socket server to ${pathname}`);
|
|
72
|
-
|
|
73
59
|
const wss = new _ws.default.Server({
|
|
74
60
|
noServer: true
|
|
75
61
|
});
|
|
76
62
|
wss.on('connection', (ws, req) => {
|
|
77
63
|
if (req) {
|
|
78
64
|
var _req$connection;
|
|
79
|
-
|
|
80
65
|
const remoteIp = _lodash.default.isEmpty(req.headers['x-forwarded-for']) ? (_req$connection = req.connection) === null || _req$connection === void 0 ? void 0 : _req$connection.remoteAddress : req.headers['x-forwarded-for'];
|
|
81
|
-
|
|
82
66
|
_logger.default.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);
|
|
83
67
|
} else {
|
|
84
68
|
_logger.default.debug('Established a new logcat listener web socket connection');
|
|
85
69
|
}
|
|
86
|
-
|
|
87
70
|
if (_lodash.default.isEmpty(this._logcatWebsocketListener)) {
|
|
88
71
|
this._logcatWebsocketListener = logRecord => {
|
|
89
72
|
if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === _ws.default.OPEN) {
|
|
@@ -91,27 +74,21 @@ commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
|
|
|
91
74
|
}
|
|
92
75
|
};
|
|
93
76
|
}
|
|
94
|
-
|
|
95
77
|
this.adb.setLogcatListener(this._logcatWebsocketListener);
|
|
96
78
|
ws.on('close', (code, reason) => {
|
|
97
79
|
if (!_lodash.default.isEmpty(this._logcatWebsocketListener)) {
|
|
98
80
|
try {
|
|
99
81
|
this.adb.removeLogcatListener(this._logcatWebsocketListener);
|
|
100
82
|
} catch (ign) {}
|
|
101
|
-
|
|
102
83
|
this._logcatWebsocketListener = null;
|
|
103
84
|
}
|
|
104
|
-
|
|
105
85
|
let closeMsg = 'Logcat listener web socket is closed.';
|
|
106
|
-
|
|
107
86
|
if (!_lodash.default.isEmpty(code)) {
|
|
108
87
|
closeMsg += ` Code: ${code}.`;
|
|
109
88
|
}
|
|
110
|
-
|
|
111
89
|
if (!_lodash.default.isEmpty(reason)) {
|
|
112
90
|
closeMsg += ` Reason: ${reason.toString()}.`;
|
|
113
91
|
}
|
|
114
|
-
|
|
115
92
|
_logger.default.debug(closeMsg);
|
|
116
93
|
});
|
|
117
94
|
});
|
|
@@ -120,38 +97,29 @@ commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
|
|
|
120
97
|
|
|
121
98
|
commands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast() {
|
|
122
99
|
const pathname = WEBSOCKET_ENDPOINT(this.sessionId);
|
|
123
|
-
|
|
124
100
|
if (_lodash.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) {
|
|
125
101
|
return;
|
|
126
102
|
}
|
|
127
|
-
|
|
128
103
|
_logger.default.debug('Stopping the logcat broadcasting web socket server');
|
|
129
|
-
|
|
130
104
|
await this.server.removeWebSocketHandler(pathname);
|
|
131
105
|
};
|
|
132
|
-
|
|
133
106
|
commands.getLogTypes = async function getLogTypes() {
|
|
134
107
|
const nativeLogTypes = await _driver.BaseDriver.prototype.getLogTypes.call(this);
|
|
135
|
-
|
|
136
108
|
if (this.isWebContext()) {
|
|
137
109
|
const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');
|
|
138
110
|
return [...nativeLogTypes, ...webLogTypes];
|
|
139
111
|
}
|
|
140
|
-
|
|
141
112
|
return nativeLogTypes;
|
|
142
113
|
};
|
|
143
|
-
|
|
144
114
|
commands.getLog = async function getLog(logType) {
|
|
145
115
|
if (this.isWebContext() && !_lodash.default.keys(this.supportedLogTypes).includes(logType)) {
|
|
146
116
|
return await this.chromedriver.jwproxy.command('/log', 'POST', {
|
|
147
117
|
type: logType
|
|
148
118
|
});
|
|
149
119
|
}
|
|
150
|
-
|
|
151
120
|
return await _driver.BaseDriver.prototype.getLog.call(this, logType);
|
|
152
121
|
};
|
|
153
|
-
|
|
154
122
|
Object.assign(extensions, commands, helpers);
|
|
155
123
|
var _default = extensions;
|
|
156
124
|
exports.default = _default;
|
|
157
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJ3c3MiLCJXZWJTb2NrZXQiLCJTZXJ2ZXIiLCJub1NlcnZlciIsIm9uIiwid3MiLCJyZXEiLCJyZW1vdGVJcCIsImhlYWRlcnMiLCJjb25uZWN0aW9uIiwicmVtb3RlQWRkcmVzcyIsIl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciIsImxvZ1JlY29yZCIsInJlYWR5U3RhdGUiLCJPUEVOIiwic2VuZCIsInNldExvZ2NhdExpc3RlbmVyIiwiY29kZSIsInJlYXNvbiIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwiaWduIiwiY2xvc2VNc2ciLCJ0b1N0cmluZyIsImFkZFdlYlNvY2tldEhhbmRsZXIiLCJtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJnZXRMb2dUeXBlcyIsIm5hdGl2ZUxvZ1R5cGVzIiwiQmFzZURyaXZlciIsInByb3RvdHlwZSIsImNhbGwiLCJpc1dlYkNvbnRleHQiLCJ3ZWJMb2dUeXBlcyIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJjb21tYW5kIiwiZ2V0TG9nIiwibG9nVHlwZSIsImtleXMiLCJpbmNsdWRlcyIsInR5cGUiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbG9nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgeyBERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCwgQmFzZURyaXZlciB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSA9ICdnZXRfc2VydmVyX2xvZ3MnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IFdFQlNPQ0tFVF9FTkRQT0lOVCA9IChzZXNzaW9uSWQpID0+IGAke0RFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYfS9zZXNzaW9uLyR7c2Vzc2lvbklkfS9hcHBpdW0vZGV2aWNlL2xvZ2NhdGA7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZWxlbml1bUhRL3NlbGVuaXVtL2Jsb2IvMGQ0MjU2NzZiM2M5ZGYyNjFkZDY0MTkxN2Y4NjdkNGQ1Y2U3Nzc0ZC9qYXZhL2NsaWVudC9zcmMvb3JnL29wZW5xYS9zZWxlbml1bS9sb2dnaW5nL0xvZ0VudHJ5LmphdmFcbmZ1bmN0aW9uIHRvTG9nUmVjb3JkICh0aW1lc3RhbXAsIGxldmVsLCBtZXNzYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdGltZXN0YW1wLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2UsXG4gIH07XG59XG5cbmV4dGVuc2lvbnMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7XG4gIGxvZ2NhdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnTG9ncyBmb3IgQW5kcm9pZCBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2UgYW5kIGVtdWxhdG9ycyB2aWEgQURCJyxcbiAgICBnZXR0ZXI6IGFzeW5jIChzZWxmKSA9PiBhd2FpdCBzZWxmLmFkYi5nZXRMb2djYXRMb2dzKCksXG4gIH0sXG4gIGJ1Z3JlcG9ydDoge1xuICAgIGRlc2NyaXB0aW9uOiBgJ2FkYiBidWdyZXBvcnQnIG91dHB1dCBmb3IgYWR2YW5jZWQgaXNzdWVzIGRpYWdub3N0aWNgLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNlbGYuYWRiLmJ1Z3JlcG9ydCgpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBvdXRwdXQuc3BsaXQob3MuRU9MKVxuICAgICAgICAubWFwKCh4KSA9PiB0b0xvZ1JlY29yZCh0aW1lc3RhbXAsICdBTEwnLCB4KSk7XG4gICAgfSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcHBpdW0gc2VydmVyIGxvZ3MnLFxuICAgIGdldHRlcjogKHNlbGYpID0+IHtcbiAgICAgIHNlbGYuZW5zdXJlRmVhdHVyZUVuYWJsZWQoR0VUX1NFUlZFUl9MT0dTX0ZFQVRVUkUpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBsb2cudW53cmFwKCkucmVjb3JkXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FMTCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNFbXB0eSh4LnByZWZpeCkgPyB4Lm1lc3NhZ2UgOiBgWyR7eC5wcmVmaXh9XSAke3gubWVzc2FnZX1gKVxuICAgICAgICApO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFN0YXJ0cyBBbmRyb2lkIGxvZ2NhdCBicm9hZGNhc3Qgd2Vic29ja2V0IG9uIHRoZSBzYW1lIGhvc3QgYW5kIHBvcnRcbiAqIHdoZXJlIEFwcGl1bSBzZXJ2ZXIgaXMgcnVubmluZyBhdCBgL3dzL3Nlc3Npb24vOnNlc3Npb25JZDovYXBwaXVtL2xvZ2NhdGAgZW5kcG9pbnQuIFRoZSBtZXRob2RcbiAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB3ZWIgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLlxuICpcbiAqIEVhY2ggY29ubmVjdGVkIHdlYnNvY2tldCBsaXN0ZW5lciB3aWxsIHJlY2VpdmUgbG9nY2F0IGxvZyBsaW5lc1xuICogYXMgc29vbiBhcyB0aGV5IGFyZSB2aXNpYmxlIHRvIEFwcGl1bS5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ICgpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBXRUJTT0NLRVRfRU5EUE9JTlQodGhpcy5zZXNzaW9uSWQpO1xuICBpZiAoIV8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciBpcyBhbHJlYWR5IGxpc3RlbmluZyBhdCAke3BhdGhuYW1lfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBc3NpZ25pbmcgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciB0byAke3BhdGhuYW1lfWApO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9ibG9iL21hc3Rlci9kb2Mvd3MubWRcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldC5TZXJ2ZXIoe1xuICAgIG5vU2VydmVyOiB0cnVlLFxuICB9KTtcbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHdzLCByZXEpID0+IHtcbiAgICBpZiAocmVxKSB7XG4gICAgICBjb25zdCByZW1vdGVJcCA9IF8uaXNFbXB0eShyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ10pXG4gICAgICAgID8gcmVxLmNvbm5lY3Rpb24/LnJlbW90ZUFkZHJlc3NcbiAgICAgICAgOiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ107XG4gICAgICBsb2cuZGVidWcoYEVzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gZnJvbSAke3JlbW90ZUlwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoJ0VzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgdGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIgPSAobG9nUmVjb3JkKSA9PiB7XG4gICAgICAgIGlmICh3cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICB3cy5zZW5kKGxvZ1JlY29yZC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5hZGIuc2V0TG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5hZGIucmVtb3ZlTG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IGNsb3NlTXNnID0gJ0xvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGlzIGNsb3NlZC4nO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoY29kZSkpIHtcbiAgICAgICAgY2xvc2VNc2cgKz0gYCBDb2RlOiAke2NvZGV9LmA7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZWFzb24pKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgUmVhc29uOiAke3JlYXNvbi50b1N0cmluZygpfS5gO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGNsb3NlTXNnKTtcbiAgICB9KTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMuc2VydmVyLmFkZFdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUsIHdzcyk7XG59O1xuXG4vKipcbiAqIFN0b3BzIHRoZSBwcmV2aW91c2x5IHN0YXJ0ZWQgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZXNvY2tldCBzZXJ2ZXIuXG4gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiBubyBzZXJ2ZXIgaXMgcnVubmluZy5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCAoKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gV0VCU09DS0VUX0VORFBPSU5UKHRoaXMuc2Vzc2lvbklkKTtcbiAgaWYgKF8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdTdG9wcGluZyB0aGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlcicpO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLGlCQUFoQztBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLE9BQU8sR0FBRyxFQUE3QjtBQUFBLElBQWlDQyxVQUFVLEdBQUcsRUFBOUM7Ozs7QUFFQSxNQUFN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
|
|
125
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJ3c3MiLCJXZWJTb2NrZXQiLCJTZXJ2ZXIiLCJub1NlcnZlciIsIm9uIiwid3MiLCJyZXEiLCJyZW1vdGVJcCIsImhlYWRlcnMiLCJjb25uZWN0aW9uIiwicmVtb3RlQWRkcmVzcyIsIl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciIsImxvZ1JlY29yZCIsInJlYWR5U3RhdGUiLCJPUEVOIiwic2VuZCIsInNldExvZ2NhdExpc3RlbmVyIiwiY29kZSIsInJlYXNvbiIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwiaWduIiwiY2xvc2VNc2ciLCJ0b1N0cmluZyIsImFkZFdlYlNvY2tldEhhbmRsZXIiLCJtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJnZXRMb2dUeXBlcyIsIm5hdGl2ZUxvZ1R5cGVzIiwiQmFzZURyaXZlciIsInByb3RvdHlwZSIsImNhbGwiLCJpc1dlYkNvbnRleHQiLCJ3ZWJMb2dUeXBlcyIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJjb21tYW5kIiwiZ2V0TG9nIiwibG9nVHlwZSIsImtleXMiLCJpbmNsdWRlcyIsInR5cGUiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbG9nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgeyBERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCwgQmFzZURyaXZlciB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSA9ICdnZXRfc2VydmVyX2xvZ3MnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IFdFQlNPQ0tFVF9FTkRQT0lOVCA9IChzZXNzaW9uSWQpID0+IGAke0RFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYfS9zZXNzaW9uLyR7c2Vzc2lvbklkfS9hcHBpdW0vZGV2aWNlL2xvZ2NhdGA7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZWxlbml1bUhRL3NlbGVuaXVtL2Jsb2IvMGQ0MjU2NzZiM2M5ZGYyNjFkZDY0MTkxN2Y4NjdkNGQ1Y2U3Nzc0ZC9qYXZhL2NsaWVudC9zcmMvb3JnL29wZW5xYS9zZWxlbml1bS9sb2dnaW5nL0xvZ0VudHJ5LmphdmFcbmZ1bmN0aW9uIHRvTG9nUmVjb3JkICh0aW1lc3RhbXAsIGxldmVsLCBtZXNzYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdGltZXN0YW1wLFxuICAgIGxldmVsLFxuICAgIG1lc3NhZ2UsXG4gIH07XG59XG5cbmV4dGVuc2lvbnMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7XG4gIGxvZ2NhdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnTG9ncyBmb3IgQW5kcm9pZCBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2UgYW5kIGVtdWxhdG9ycyB2aWEgQURCJyxcbiAgICBnZXR0ZXI6IGFzeW5jIChzZWxmKSA9PiBhd2FpdCBzZWxmLmFkYi5nZXRMb2djYXRMb2dzKCksXG4gIH0sXG4gIGJ1Z3JlcG9ydDoge1xuICAgIGRlc2NyaXB0aW9uOiBgJ2FkYiBidWdyZXBvcnQnIG91dHB1dCBmb3IgYWR2YW5jZWQgaXNzdWVzIGRpYWdub3N0aWNgLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNlbGYuYWRiLmJ1Z3JlcG9ydCgpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBvdXRwdXQuc3BsaXQob3MuRU9MKVxuICAgICAgICAubWFwKCh4KSA9PiB0b0xvZ1JlY29yZCh0aW1lc3RhbXAsICdBTEwnLCB4KSk7XG4gICAgfSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcHBpdW0gc2VydmVyIGxvZ3MnLFxuICAgIGdldHRlcjogKHNlbGYpID0+IHtcbiAgICAgIHNlbGYuZW5zdXJlRmVhdHVyZUVuYWJsZWQoR0VUX1NFUlZFUl9MT0dTX0ZFQVRVUkUpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBsb2cudW53cmFwKCkucmVjb3JkXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FMTCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNFbXB0eSh4LnByZWZpeCkgPyB4Lm1lc3NhZ2UgOiBgWyR7eC5wcmVmaXh9XSAke3gubWVzc2FnZX1gKVxuICAgICAgICApO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFN0YXJ0cyBBbmRyb2lkIGxvZ2NhdCBicm9hZGNhc3Qgd2Vic29ja2V0IG9uIHRoZSBzYW1lIGhvc3QgYW5kIHBvcnRcbiAqIHdoZXJlIEFwcGl1bSBzZXJ2ZXIgaXMgcnVubmluZyBhdCBgL3dzL3Nlc3Npb24vOnNlc3Npb25JZDovYXBwaXVtL2xvZ2NhdGAgZW5kcG9pbnQuIFRoZSBtZXRob2RcbiAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB3ZWIgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLlxuICpcbiAqIEVhY2ggY29ubmVjdGVkIHdlYnNvY2tldCBsaXN0ZW5lciB3aWxsIHJlY2VpdmUgbG9nY2F0IGxvZyBsaW5lc1xuICogYXMgc29vbiBhcyB0aGV5IGFyZSB2aXNpYmxlIHRvIEFwcGl1bS5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0ICgpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBXRUJTT0NLRVRfRU5EUE9JTlQodGhpcy5zZXNzaW9uSWQpO1xuICBpZiAoIV8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciBpcyBhbHJlYWR5IGxpc3RlbmluZyBhdCAke3BhdGhuYW1lfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBc3NpZ25pbmcgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlciB0byAke3BhdGhuYW1lfWApO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9ibG9iL21hc3Rlci9kb2Mvd3MubWRcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldC5TZXJ2ZXIoe1xuICAgIG5vU2VydmVyOiB0cnVlLFxuICB9KTtcbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHdzLCByZXEpID0+IHtcbiAgICBpZiAocmVxKSB7XG4gICAgICBjb25zdCByZW1vdGVJcCA9IF8uaXNFbXB0eShyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ10pXG4gICAgICAgID8gcmVxLmNvbm5lY3Rpb24/LnJlbW90ZUFkZHJlc3NcbiAgICAgICAgOiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ107XG4gICAgICBsb2cuZGVidWcoYEVzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gZnJvbSAke3JlbW90ZUlwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoJ0VzdGFibGlzaGVkIGEgbmV3IGxvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGNvbm5lY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgdGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIgPSAobG9nUmVjb3JkKSA9PiB7XG4gICAgICAgIGlmICh3cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICB3cy5zZW5kKGxvZ1JlY29yZC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5hZGIuc2V0TG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5hZGIucmVtb3ZlTG9nY2F0TGlzdGVuZXIodGhpcy5fbG9nY2F0V2Vic29ja2V0TGlzdGVuZXIpO1xuICAgICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IGNsb3NlTXNnID0gJ0xvZ2NhdCBsaXN0ZW5lciB3ZWIgc29ja2V0IGlzIGNsb3NlZC4nO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoY29kZSkpIHtcbiAgICAgICAgY2xvc2VNc2cgKz0gYCBDb2RlOiAke2NvZGV9LmA7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZWFzb24pKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgUmVhc29uOiAke3JlYXNvbi50b1N0cmluZygpfS5gO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGNsb3NlTXNnKTtcbiAgICB9KTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMuc2VydmVyLmFkZFdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUsIHdzcyk7XG59O1xuXG4vKipcbiAqIFN0b3BzIHRoZSBwcmV2aW91c2x5IHN0YXJ0ZWQgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZXNvY2tldCBzZXJ2ZXIuXG4gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiBubyBzZXJ2ZXIgaXMgcnVubmluZy5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCAoKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gV0VCU09DS0VUX0VORFBPSU5UKHRoaXMuc2Vzc2lvbklkKTtcbiAgaWYgKF8uaXNFbXB0eShhd2FpdCB0aGlzLnNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhwYXRobmFtZSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdTdG9wcGluZyB0aGUgbG9nY2F0IGJyb2FkY2FzdGluZyB3ZWIgc29ja2V0IHNlcnZlcicpO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSx1QkFBdUIsR0FBRyxpQkFBaUI7QUFFakQsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpELE1B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
|