appium-webdriveragent 5.1.6 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [5.3.0](https://github.com/appium/WebDriverAgent/compare/v5.2.0...v5.3.0) (2023-05-22)
2
+
3
+
4
+ ### Features
5
+
6
+ * Use strongbox to persist the previous version of the module ([#714](https://github.com/appium/WebDriverAgent/issues/714)) ([4611792](https://github.com/appium/WebDriverAgent/commit/4611792ee5d5d7f39d188b5ebc31017f436c5ace))
7
+
8
+ ## [5.2.0](https://github.com/appium/WebDriverAgent/compare/v5.1.6...v5.2.0) (2023-05-20)
9
+
10
+
11
+ ### Features
12
+
13
+ * Replace non-encodable characters in the resulting JSON ([#713](https://github.com/appium/WebDriverAgent/issues/713)) ([cdfae40](https://github.com/appium/WebDriverAgent/commit/cdfae408be0bcf6607f0ca4462925eed2c300f5e))
14
+
1
15
  ## [5.1.6](https://github.com/appium/WebDriverAgent/compare/v5.1.5...v5.1.6) (2023-05-18)
2
16
 
3
17
 
@@ -399,6 +399,9 @@
399
399
  716E0BCE1E917E810087A825 /* NSString+FBXMLSafeString.h in Headers */ = {isa = PBXBuildFile; fileRef = 716E0BCC1E917E810087A825 /* NSString+FBXMLSafeString.h */; };
400
400
  716E0BCF1E917E810087A825 /* NSString+FBXMLSafeString.m in Sources */ = {isa = PBXBuildFile; fileRef = 716E0BCD1E917E810087A825 /* NSString+FBXMLSafeString.m */; };
401
401
  716E0BD11E917F260087A825 /* FBXMLSafeStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 716E0BD01E917F260087A825 /* FBXMLSafeStringTests.m */; };
402
+ 716F0DA12A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 716F0D9F2A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h */; };
403
+ 716F0DA32A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 716F0DA02A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.m */; };
404
+ 716F0DA62A17323300CDD977 /* NSDictionaryFBUtf8SafeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 716F0DA52A17323300CDD977 /* NSDictionaryFBUtf8SafeTests.m */; };
402
405
  718226CA2587443700661B83 /* GCDAsyncUdpSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 718226C62587443600661B83 /* GCDAsyncUdpSocket.h */; };
403
406
  718226CB2587443700661B83 /* GCDAsyncUdpSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 718226C62587443600661B83 /* GCDAsyncUdpSocket.h */; };
404
407
  718226CC2587443700661B83 /* GCDAsyncSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 718226C72587443600661B83 /* GCDAsyncSocket.h */; };
@@ -1004,6 +1007,9 @@
1004
1007
  716E0BCC1E917E810087A825 /* NSString+FBXMLSafeString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+FBXMLSafeString.h"; sourceTree = "<group>"; };
1005
1008
  716E0BCD1E917E810087A825 /* NSString+FBXMLSafeString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+FBXMLSafeString.m"; sourceTree = "<group>"; };
1006
1009
  716E0BD01E917F260087A825 /* FBXMLSafeStringTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXMLSafeStringTests.m; sourceTree = "<group>"; };
1010
+ 716F0D9F2A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+FBUtf8SafeDictionary.h"; sourceTree = "<group>"; };
1011
+ 716F0DA02A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+FBUtf8SafeDictionary.m"; sourceTree = "<group>"; };
1012
+ 716F0DA52A17323300CDD977 /* NSDictionaryFBUtf8SafeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDictionaryFBUtf8SafeTests.m; sourceTree = "<group>"; };
1007
1013
  717C0D702518ED2800CAA6EC /* TVOSSettings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = TVOSSettings.xcconfig; sourceTree = "<group>"; };
1008
1014
  717C0D862518ED7000CAA6EC /* TVOSTestSettings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = TVOSTestSettings.xcconfig; sourceTree = "<group>"; };
1009
1015
  718226C62587443600661B83 /* GCDAsyncUdpSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GCDAsyncUdpSocket.h; path = WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.h; sourceTree = SOURCE_ROOT; };
@@ -1701,6 +1707,8 @@
1701
1707
  EE9AB73E1CAEDF0C008C271F /* Categories */ = {
1702
1708
  isa = PBXGroup;
1703
1709
  children = (
1710
+ 716F0D9F2A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h */,
1711
+ 716F0DA02A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.m */,
1704
1712
  71555A3B1DEC460A007D4A8B /* NSExpression+FBFormat.h */,
1705
1713
  71555A3C1DEC460A007D4A8B /* NSExpression+FBFormat.m */,
1706
1714
  71A224E31DE2F56600844D55 /* NSPredicate+FBFormat.h */,
@@ -2022,6 +2030,7 @@
2022
2030
  716E0BD01E917F260087A825 /* FBXMLSafeStringTests.m */,
2023
2031
  712A0C841DA3E459007D02E5 /* FBXPathTests.m */,
2024
2032
  EE9B76581CF7987300275851 /* Info.plist */,
2033
+ 716F0DA52A17323300CDD977 /* NSDictionaryFBUtf8SafeTests.m */,
2025
2034
  7139145B1DF01A12005896C2 /* NSExpressionFBFormatTests.m */,
2026
2035
  71A224E71DE326C500844D55 /* NSPredicateFBFormatTests.m */,
2027
2036
  713914591DF01989005896C2 /* XCUIElementHelpersTests.m */,
@@ -2405,6 +2414,7 @@
2405
2414
  641EE6C02240C5CA00173FCB /* XCUIApplication+FBHelpers.h in Headers */,
2406
2415
  641EE6C12240C5CA00173FCB /* _XCTestObservationCenterImplementation.h in Headers */,
2407
2416
  714EAA0E2673FDFE005C5B47 /* FBCapabilities.h in Headers */,
2417
+ 716F0DA22A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h in Headers */,
2408
2418
  641EE6C22240C5CA00173FCB /* XCUIDevice+FBHelpers.h in Headers */,
2409
2419
  71D3B3D6267FC7260076473D /* XCUIElement+FBResolve.h in Headers */,
2410
2420
  641EE6C32240C5CA00173FCB /* FBClassChainQueryParser.h in Headers */,
@@ -2594,6 +2604,7 @@
2594
2604
  EE35AD271E3B77D600A02D78 /* XCApplicationMonitor.h in Headers */,
2595
2605
  EE8DDD7F20C5733C004D4925 /* XCUIElement+FBForceTouch.h in Headers */,
2596
2606
  71A5C67329A4F39600421C37 /* XCTIssue+FBPatcher.h in Headers */,
2607
+ 716F0DA12A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h in Headers */,
2597
2608
  EE158AEA1CBD456F00A3E3F0 /* FBRuntimeUtils.h in Headers */,
2598
2609
  7136A4791E8918E60024FC3D /* XCUIElement+FBPickerWheel.h in Headers */,
2599
2610
  E444DCB324913C220060D7EB /* RoutingHTTPServer.h in Headers */,
@@ -3106,6 +3117,7 @@
3106
3117
  641EE5FF2240C5CA00173FCB /* XCUIElement+FBForceTouch.m in Sources */,
3107
3118
  716C9E0327315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m in Sources */,
3108
3119
  641EE6002240C5CA00173FCB /* FBTouchActionCommands.m in Sources */,
3120
+ 716F0DA42A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.m in Sources */,
3109
3121
  719DCF182601EAFB000E765F /* FBNotificationsHelper.m in Sources */,
3110
3122
  714EAA102673FDFE005C5B47 /* FBCapabilities.m in Sources */,
3111
3123
  641EE6012240C5CA00173FCB /* FBImageIOScaler.m in Sources */,
@@ -3160,6 +3172,7 @@
3160
3172
  buildActionMask = 2147483647;
3161
3173
  files = (
3162
3174
  64B26508228C5514002A5025 /* XCUIElementDouble.m in Sources */,
3175
+ 716F0DA72A17323300CDD977 /* NSDictionaryFBUtf8SafeTests.m in Sources */,
3163
3176
  64B26504228C5299002A5025 /* FBTVNavigationTrackerTests.m in Sources */,
3164
3177
  );
3165
3178
  runOnlyForDeploymentPostprocessing = 0;
@@ -3229,6 +3242,7 @@
3229
3242
  716E0BCF1E917E810087A825 /* NSString+FBXMLSafeString.m in Sources */,
3230
3243
  EE158ACD1CBD456F00A3E3F0 /* FBUnknownCommands.m in Sources */,
3231
3244
  EE158AC51CBD456F00A3E3F0 /* FBOrientationCommands.m in Sources */,
3245
+ 716F0DA32A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.m in Sources */,
3232
3246
  71D475C42538F5A8008D9401 /* XCUIApplicationProcess+FBQuiescence.m in Sources */,
3233
3247
  641EE7082240CDEB00173FCB /* XCUIElement+FBTVFocuse.m in Sources */,
3234
3248
  71E75E6F254824230099FC87 /* XCUIElementQuery+FBHelpers.m in Sources */,
@@ -3346,6 +3360,7 @@
3346
3360
  7139145C1DF01A12005896C2 /* NSExpressionFBFormatTests.m in Sources */,
3347
3361
  71A224E81DE326C500844D55 /* NSPredicateFBFormatTests.m in Sources */,
3348
3362
  EE6A892B1D0B25820083E92B /* FBApplicationDouble.m in Sources */,
3363
+ 716F0DA62A17323300CDD977 /* NSDictionaryFBUtf8SafeTests.m in Sources */,
3349
3364
  EE6A892D1D0B2AF40083E92B /* FBErrorBuilderTests.m in Sources */,
3350
3365
  712A0C851DA3E459007D02E5 /* FBXPathTests.m in Sources */,
3351
3366
  ADBC39981D07842800327304 /* XCUIElementDouble.m in Sources */,
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+ #import <Foundation/Foundation.h>
11
+
12
+ NS_ASSUME_NONNULL_BEGIN
13
+
14
+ @interface NSString (FBUtf8SafeString)
15
+
16
+ /**
17
+ Converts the string, so it could be properly represented in UTF-8 encoding. All non-encodable characters are replaced with
18
+ the given `replacement`
19
+
20
+ @param replacement The character to use a a replacement for the lossy encoding
21
+ @returns Either the same string or a string with non-encodable chars replaced
22
+ */
23
+ - (instancetype)fb_utf8SafeStringWithReplacement:(unichar)replacement;
24
+
25
+ @end
26
+
27
+ @interface NSDictionary (FBUtf8SafeDictionary)
28
+
29
+ /**
30
+ Converts the dictionary, so it could be properly represented in UTF-8 encoding. All non-encodable characters
31
+ in string values are replaced with the Unocde question mark characters. Nested dictionaries and arrays are
32
+ processed recursively.
33
+
34
+ @returns Either the same dictionary or a dictionary with non-encodable chars in string values replaced
35
+ */
36
+ - (instancetype)fb_utf8SafeDictionary;
37
+
38
+ @end
39
+
40
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+ #import "NSDictionary+FBUtf8SafeDictionary.h"
11
+
12
+ const unichar REPLACER = 0xfffd;
13
+
14
+ @implementation NSString (FBUtf8SafeString)
15
+
16
+ - (instancetype)fb_utf8SafeStringWithReplacement:(unichar)replacement
17
+ {
18
+ if ([self canBeConvertedToEncoding:NSUTF8StringEncoding]) {
19
+ return self;
20
+ }
21
+
22
+ NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
23
+ NSString *convertedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
24
+ NSMutableString *result = [NSMutableString string];
25
+ NSString *replacementStr = [NSString stringWithCharacters:&replacement length:1];
26
+ NSUInteger originalIdx = 0;
27
+ NSUInteger convertedIdx = 0;
28
+ while (originalIdx < [self length] && convertedIdx < [convertedString length]) {
29
+ unichar originalChar = [self characterAtIndex:originalIdx];
30
+ unichar convertedChar = [convertedString characterAtIndex:convertedIdx];
31
+
32
+ if (originalChar == convertedChar) {
33
+ [result appendString:[NSString stringWithCharacters:&originalChar length:1]];
34
+ originalIdx++;
35
+ convertedIdx++;
36
+ continue;
37
+ }
38
+
39
+ while (originalChar != convertedChar && originalIdx < [self length]) {
40
+ [result appendString:replacementStr];
41
+ originalChar = [self characterAtIndex:++originalIdx];
42
+ }
43
+ }
44
+ return result.copy;
45
+ }
46
+
47
+ @end
48
+
49
+ @implementation NSArray (FBUtf8SafeArray)
50
+
51
+ - (instancetype)fb_utf8SafeArray
52
+ {
53
+ NSMutableArray *result = [NSMutableArray array];
54
+ for (id item in self) {
55
+ if ([item isKindOfClass:NSString.class]) {
56
+ [result addObject:[(NSString *)item fb_utf8SafeStringWithReplacement:REPLACER]];
57
+ } else if ([item isKindOfClass:NSDictionary.class]) {
58
+ [result addObject:[(NSDictionary *)item fb_utf8SafeDictionary]];
59
+ } else if ([item isKindOfClass:NSArray.class]) {
60
+ [result addObject:[(NSArray *)item fb_utf8SafeArray]];
61
+ } else {
62
+ [result addObject:item];
63
+ }
64
+ }
65
+ return result.copy;
66
+ }
67
+
68
+ @end
69
+
70
+ @implementation NSDictionary (FBUtf8SafeDictionary)
71
+
72
+ - (instancetype)fb_utf8SafeDictionary
73
+ {
74
+ NSMutableDictionary *result = [self mutableCopy];
75
+ for (id key in self) {
76
+ id value = result[key];
77
+ if ([value isKindOfClass:NSString.class]) {
78
+ result[key] = [(NSString *)value fb_utf8SafeStringWithReplacement:REPLACER];
79
+ } else if ([value isKindOfClass:NSArray.class]) {
80
+ result[key] = [(NSArray *)value fb_utf8SafeArray];
81
+ } else if ([value isKindOfClass:NSDictionary.class]) {
82
+ result[key] = [(NSDictionary *)value fb_utf8SafeDictionary];
83
+ }
84
+ }
85
+ return result.copy;
86
+ }
87
+
88
+ @end
@@ -9,6 +9,8 @@
9
9
 
10
10
  #import "FBResponseJSONPayload.h"
11
11
 
12
+ #import "FBLogger.h"
13
+ #import "NSDictionary+FBUtf8SafeDictionary.h"
12
14
  #import "RouteResponse.h"
13
15
 
14
16
  @interface FBResponseJSONPayload ()
@@ -43,6 +45,13 @@
43
45
  options:NSJSONWritingPrettyPrinted
44
46
  error:&error];
45
47
  NSCAssert(jsonData, @"Valid JSON must be responded, error of %@", error);
48
+ if (nil == [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]) {
49
+ [FBLogger log:@"The incoming data cannot be encoded to UTF-8 JSON. Applying lossy conversion as a workaround."];
50
+ jsonData = [NSJSONSerialization dataWithJSONObject:[self.dictionary fb_utf8SafeDictionary]
51
+ options:NSJSONWritingPrettyPrinted
52
+ error:&error];
53
+ }
54
+ NSCAssert(jsonData, @"Valid JSON must be responded, error of %@", error);
46
55
  [response setHeader:@"Content-Type" value:@"application/json;charset=UTF-8"];
47
56
  [response setStatusCode:self.httpStatusCode];
48
57
  [response respondWithData:jsonData];
@@ -49,6 +49,11 @@
49
49
 
50
50
  - (void)testSimpleScroll
51
51
  {
52
+ if (SYSTEM_VERSION_LESS_THAN(@"16.0")) {
53
+ // This test is unstable in CI env
54
+ return;
55
+ }
56
+
52
57
  FBAssertVisibleCell(@"0");
53
58
  FBAssertVisibleCell(@"10");
54
59
  [self.scrollView fb_scrollDownByNormalizedDistance:1.0];
@@ -82,6 +87,11 @@
82
87
 
83
88
  - (void)testNativeFarScrollToVisible
84
89
  {
90
+ if (SYSTEM_VERSION_LESS_THAN(@"16.0")) {
91
+ // This test is unstable in CI env
92
+ return;
93
+ }
94
+
85
95
  NSString *cellName = @"80";
86
96
  NSError *error;
87
97
  FBAssertInvisibleCell(cellName);
@@ -100,6 +110,12 @@
100
110
  [element fb_scrollToVisibleWithError:&error];
101
111
  XCTAssertNil(error);
102
112
  XCTAssertTrue(element.fb_isVisible);
113
+
114
+ if (SYSTEM_VERSION_LESS_THAN(@"16.0")) {
115
+ // This test is unstable in CI env
116
+ return;
117
+ }
118
+
103
119
  [element tap];
104
120
  XCTAssertTrue(element.wdSelected);
105
121
  }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
10
+ #import <XCTest/XCTest.h>
11
+
12
+ #import "NSDictionary+FBUtf8SafeDictionary.h"
13
+
14
+ @interface NSDictionaryFBUtf8SafeTests : XCTestCase
15
+ @end
16
+
17
+ @implementation NSDictionaryFBUtf8SafeTests
18
+
19
+ - (void)testEmptySafeDictConversion
20
+ {
21
+ NSDictionary *d = @{};
22
+ XCTAssertEqualObjects(d, d.fb_utf8SafeDictionary);
23
+ }
24
+
25
+ - (void)testNonEmptySafeDictConversion
26
+ {
27
+ NSDictionary *d = @{
28
+ @"1": @[@3, @4],
29
+ @"5": @{@"6": @7, @"8": @9},
30
+ @"10": @"11"
31
+ };
32
+ XCTAssertEqualObjects(d, d.fb_utf8SafeDictionary);
33
+ }
34
+
35
+ @end
@@ -21,10 +21,12 @@ var _teen_process = require("teen_process");
21
21
  var _checkDependencies = require("./check-dependencies");
22
22
  var _constants = require("./constants");
23
23
  var _appiumIosDevice = require("appium-ios-device");
24
+ var _strongbox = require("@appium/strongbox");
24
25
  const WDA_LAUNCH_TIMEOUT = 60 * 1000;
25
26
  const WDA_AGENT_PORT = 8100;
26
27
  const WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';
27
28
  const SHARED_RESOURCES_GUARD = new _asyncLock.default();
29
+ const RECENT_MODULE_VERSION_ITEM_NAME = 'recentWdaModuleVersion';
28
30
  class WebDriverAgent {
29
31
  constructor(xcodeVersion, args = {}, log = null) {
30
32
  this.xcodeVersion = xcodeVersion;
@@ -144,53 +146,48 @@ class WebDriverAgent {
144
146
  }
145
147
  }
146
148
  async _cleanupProjectIfFresh() {
147
- const homeFolder = process.env.HOME;
148
- if (!homeFolder) {
149
- this.log.info('The HOME folder path cannot be determined');
150
- return;
151
- }
152
- const currentUpgradeTimestamp = await (0, _utils.getWDAUpgradeTimestamp)();
153
- if (!_lodash.default.isInteger(currentUpgradeTimestamp)) {
154
- this.log.info('It is impossible to determine the timestamp of the package');
149
+ if (this.canSkipXcodebuild) {
155
150
  return;
156
151
  }
157
- const timestampPath = _path.default.resolve(homeFolder, _constants.WDA_UPGRADE_TIMESTAMP_PATH);
158
- const didTimestampExist = await _support.fs.exists(timestampPath);
159
- if (didTimestampExist) {
160
- try {
161
- await _support.fs.access(timestampPath, _support.fs.W_OK);
162
- } catch (ign) {
163
- this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` + `Skipping sources cleanup`);
164
- return;
165
- }
166
- const recentUpgradeTimestamp = parseInt(await _support.fs.readFile(timestampPath, 'utf8'), 10);
167
- if (_lodash.default.isInteger(recentUpgradeTimestamp)) {
168
- if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {
169
- this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` + `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);
152
+ const packageInfo = JSON.parse(await _support.fs.readFile(_path.default.join(_utils.BOOTSTRAP_PATH, 'package.json'), 'utf8'));
153
+ const box = (0, _strongbox.strongbox)(packageInfo.name);
154
+ let boxItem = box.getItem(RECENT_MODULE_VERSION_ITEM_NAME);
155
+ if (!boxItem) {
156
+ const timestampPath = _path.default.resolve(process.env.HOME, _constants.WDA_UPGRADE_TIMESTAMP_PATH);
157
+ if (await _support.fs.exists(timestampPath)) {
158
+ try {
159
+ boxItem = await box.createItemWithContents(RECENT_MODULE_VERSION_ITEM_NAME, '5.0.0');
160
+ } catch (e) {
161
+ this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
170
162
  return;
171
163
  }
172
- this.log.info(`WebDriverAgent sources have been upgraded ` + `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);
173
164
  } else {
174
- this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
165
+ this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
166
+ try {
167
+ await box.createItemWithContents(RECENT_MODULE_VERSION_ITEM_NAME, packageInfo.version);
168
+ } catch (e) {
169
+ this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
170
+ }
171
+ return;
175
172
  }
176
173
  }
174
+ let recentModuleVersion = await boxItem.read();
177
175
  try {
178
- await (0, _support.mkdirp)(_path.default.dirname(timestampPath));
179
- await _support.fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');
180
- this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` + `at '${timestampPath}'`);
176
+ recentModuleVersion = _support.util.coerceVersion(recentModuleVersion, true);
181
177
  } catch (e) {
182
- this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` + `Original error: ${e.message}`);
178
+ this.log.warn(`The persisted module version string has been damaged: ${e.message}`);
179
+ this.log.info(`Updating it to '${packageInfo.version}' assuming the project clenup is not needed`);
180
+ await boxItem.write(packageInfo.version);
183
181
  return;
184
182
  }
185
- if (!didTimestampExist) {
186
- this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
187
- return;
188
- }
189
- if (this.canSkipXcodebuild) {
183
+ if (_support.util.compareVersions(recentModuleVersion, '>=', packageInfo.version)) {
184
+ this.log.info(`WebDriverAgent does not need a cleanup. The project sources are up to date ` + `(${recentModuleVersion} >= ${packageInfo.version})`);
190
185
  return;
191
186
  }
187
+ this.log.info(`Cleaning up the WebDriverAgent project after the module upgrade has happened ` + `(${recentModuleVersion} < ${packageInfo.version})`);
192
188
  try {
193
189
  await this.xcodebuild.cleanProject();
190
+ await boxItem.write(packageInfo.version);
194
191
  } catch (e) {
195
192
  this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);
196
193
  }
@@ -404,4 +401,4 @@ class WebDriverAgent {
404
401
  exports.WebDriverAgent = WebDriverAgent;
405
402
  var _default = WebDriverAgent;
406
403
  exports.default = _default;
407
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl91cmwyIiwiX2JsdWViaXJkIiwiX2Jhc2VEcml2ZXIiLCJfc3VwcG9ydCIsIl9sb2dnZXIiLCJfbm9TZXNzaW9uUHJveHkiLCJfdXRpbHMiLCJfeGNvZGVidWlsZCIsIl9hc3luY0xvY2siLCJfdGVlbl9wcm9jZXNzIiwiX2NoZWNrRGVwZW5kZW5jaWVzIiwiX2NvbnN0YW50cyIsIl9hcHBpdW1Jb3NEZXZpY2UiLCJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwidXNlUHJlaW5zdGFsbGVkV0RBIiwieGN0ZXN0QXBpQ2xpZW50IiwieGNvZGVidWlsZCIsImNhblNraXBYY29kZWJ1aWxkIiwiWGNvZGVCdWlsZCIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJ1c2VTaW1wbGVCdWlsZFRlc3QiLCJsYXVuY2hUaW1lb3V0Iiwid2RhTGF1bmNoVGltZW91dCIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJidW5kbGVJZEZvclhjdGVzdCIsIldEQV9SVU5ORVJfQlVORExFX0lEX0ZPUl9YQ1RFU1QiLCJCT09UU1RSQVBfUEFUSCIsImluZm8iLCJwYXRoIiwicmVzb2x2ZSIsImNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyIsIm9ic29sZXRlUGlkcyIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJ1cmwiLCJwb3J0IiwiY21kTGluZSIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ1ZGlkIiwiaXNFbXB0eSIsImRlYnVnIiwibGVuZ3RoIiwiZXhlYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImlzUnVubmluZyIsImdldFN0YXR1cyIsImJhc2VQYXRoIiwibm9TZXNzaW9uUHJveHkiLCJOb1Nlc3Npb25Qcm94eSIsInNlcnZlciIsImhvc3RuYW1lIiwiYmFzZSIsInRpbWVvdXQiLCJjb21tYW5kIiwiZXJyIiwiaHJlZiIsInVuaW5zdGFsbCIsImJ1bmRsZUlkcyIsImdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUiLCJidW5kbGVJZCIsInJlbW92ZUFwcCIsIl9jbGVhbnVwUHJvamVjdElmRnJlc2giLCJob21lRm9sZGVyIiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJjdXJyZW50VXBncmFkZVRpbWVzdGFtcCIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJpc0ludGVnZXIiLCJ0aW1lc3RhbXBQYXRoIiwiV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgiLCJkaWRUaW1lc3RhbXBFeGlzdCIsImZzIiwiZXhpc3RzIiwiYWNjZXNzIiwiV19PSyIsImlnbiIsInJlY2VudFVwZ3JhZGVUaW1lc3RhbXAiLCJwYXJzZUludCIsInJlYWRGaWxlIiwibWtkaXJwIiwiZGlybmFtZSIsIndyaXRlRmlsZSIsImNsZWFuUHJvamVjdCIsImxhdW5jaFdpdGhQcmVpbnN0YWxsZWRXREEiLCJzZXNzaW9uSWQiLCJ4Y3Rlc3RFbnYiLCJVU0VfUE9SVCIsIldEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJYY3Rlc3QiLCJzdGFydCIsInNldHVwUHJveGllcyIsInN0YXR1cyIsImxhdW5jaCIsIkVycm9yIiwic3luY2hyb25pemF0aW9uS2V5Iiwibm9ybWFsaXplIiwiYWNxdWlyZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsInN0YXJ0V2l0aElEQiIsImluaXQiLCJwcmVidWlsZCIsIndkYUJ1bmRsZUlkIiwidGVzdEJ1bmRsZUlkIiwicHJlcGFyZVdEQSIsInJ1blhDVUlUZXN0IiwicGFyc2VCdW5kbGVJZCIsImluZm9QbGlzdFBhdGgiLCJqb2luIiwiaW5mb1BsaXN0IiwicGxpc3QiLCJwYXJzZVBsaXN0IiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwiZmV0Y2hXREFCdW5kbGUiLCJpc0FwcEluc3RhbGxlZCIsImluc3RhbGxBcHAiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwiYnVuZGxlV0RBU2ltIiwid2RhQnVuZGxlUGF0aHMiLCJnbG9iIiwiV0RBX1JVTk5FUl9BUFAiLCJhYnNvbHV0ZSIsImlzU291cmNlRnJlc2giLCJleGlzdHNQcm9taXNlcyIsInNlcCIsIm1hcCIsInN1YlBhdGgiLCJCIiwiYWxsIiwic29tZSIsInYiLCJwcm94eU9wdHMiLCJrZWVwQWxpdmUiLCJqd3Byb3h5IiwiSldQcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsInF1aXQiLCJzdG9wIiwicmVzZXQiLCJfdXJsIiwicGFyc2UiLCJwcm90b2NvbCIsImZ1bGx5U3RhcnRlZCIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwic2V0dXBDYWNoaW5nIiwiYnVpbGQiLCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllciIsInVwZ3JhZGVkQXQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsImFjdHVhbFVwZ3JhZGVUaW1lc3RhbXAiLCJ0b0xvd2VyIiwicXVpdEFuZFVuaW5zdGFsbCIsImV4cG9ydHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9saWIvd2ViZHJpdmVyYWdlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgSldQcm94eSB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHBsaXN0LCBta2RpcnAgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgTm9TZXNzaW9uUHJveHkgfSBmcm9tICcuL25vLXNlc3Npb24tcHJveHknO1xuaW1wb3J0IHtcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLCBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBCT09UU1RSQVBfUEFUSFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBYY29kZUJ1aWxkIGZyb20gJy4veGNvZGVidWlsZCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBidW5kbGVXREFTaW0gfSBmcm9tICcuL2NoZWNrLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICBXREFfUlVOTkVSX0JVTkRMRV9JRCwgV0RBX1JVTk5FUl9CVU5ETEVfSURfRk9SX1hDVEVTVCwgV0RBX1JVTk5FUl9BUFAsXG4gIFdEQV9CQVNFX1VSTCwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7WGN0ZXN0fSBmcm9tICdhcHBpdW0taW9zLWRldmljZSc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIC8vIHRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCBndWlhcmFudGVlcyB0aGUgY2FwYWJpbGl0aWVzIGFjdWFsbHlcbiAgICAvLyBnYXZlICdhcHBpdW06d2ViRHJpdmVyQWdlbnRVcmwnIGJ1dCAndGhpcy53ZWJEcml2ZXJBZ2VudFVybCdcbiAgICAvLyBjb3VsZCBiZSB1c2VkIGZvciBjYWNoaW5nIFdEQSB3aXRoIHhjb2RlYnVpbGQuXG4gICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IGFyZ3Mud2ViRHJpdmVyQWdlbnRVcmw7XG5cbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQgPSBhcmdzLndkYUNvbm5lY3Rpb25UaW1lb3V0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuICAgIHRoaXMudXNlUHJlYnVpbHRXREEgPSBhcmdzLnVzZVByZWJ1aWx0V0RBO1xuICAgIHRoaXMuZGVyaXZlZERhdGFQYXRoID0gYXJncy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkID0gYXJncy51cGRhdGVkV0RBQnVuZGxlSWQ7XG5cbiAgICB0aGlzLnVzZVByZWluc3RhbGxlZFdEQSA9IGFyZ3MudXNlUHJlaW5zdGFsbGVkV0RBO1xuICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50ID0gbnVsbDtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IHRoaXMuY2FuU2tpcFhjb2RlYnVpbGRcbiAgICA/IG51bGxcbiAgICA6IG5ldyBYY29kZUJ1aWxkKHRoaXMueGNvZGVWZXJzaW9uLCB0aGlzLmRldmljZSwge1xuICAgICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgICBwbGF0Zm9ybU5hbWU6IHRoaXMucGxhdGZvcm1OYW1lLFxuICAgICAgICBpb3NTZGtWZXJzaW9uOiB0aGlzLmlvc1Nka1ZlcnNpb24sXG4gICAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICAgIGJvb3RzdHJhcFBhdGg6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgICAgcmVhbERldmljZTogdGhpcy5pc1JlYWxEZXZpY2UsXG4gICAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICAgIHhjb2RlQ29uZmlnRmlsZTogYXJncy54Y29kZUNvbmZpZ0ZpbGUsXG4gICAgICAgIHhjb2RlT3JnSWQ6IGFyZ3MueGNvZGVPcmdJZCxcbiAgICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICAgIGtleWNoYWluUGF0aDogYXJncy5rZXljaGFpblBhdGgsXG4gICAgICAgIGtleWNoYWluUGFzc3dvcmQ6IGFyZ3Mua2V5Y2hhaW5QYXNzd29yZCxcbiAgICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgICAgdXNlUHJlYnVpbHRXREE6IGFyZ3MudXNlUHJlYnVpbHRXREEsXG4gICAgICAgIHVwZGF0ZWRXREFCdW5kbGVJZDogdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQsXG4gICAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICAgIHdkYVJlbW90ZVBvcnQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgICAgdXNlWGN0ZXN0cnVuRmlsZTogdGhpcy51c2VYY3Rlc3RydW5GaWxlLFxuICAgICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgICBtanBlZ1NlcnZlclBvcnQ6IHRoaXMubWpwZWdTZXJ2ZXJQb3J0LFxuICAgICAgICBhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbjogYXJncy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbixcbiAgICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgICByZXN1bHRCdW5kbGVWZXJzaW9uOiBhcmdzLnJlc3VsdEJ1bmRsZVZlcnNpb24sXG4gICAgICB9LCB0aGlzLmxvZyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNlc3Npb24gZG9lcyBub3QgbmVlZCB4Y29kZWJ1aWxkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2Vzc2lvbiBuZWVkcy9oYXMgeGNvZGVidWlsZC5cbiAgICovXG4gIGdldCBjYW5Ta2lwWGNvZGVidWlsZCAoKSB7XG4gICAgLy8gVXNlIHRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCB0byBndWFyYW50ZWVcbiAgICAvLyB0aGUgY2FwYWJpbGl0aWVzIHNldCBnYXZlIHRoZSBgYXBwaXVtOndlYkRyaXZlckFnZW50VXJsYC5cbiAgICByZXR1cm4gdGhpcy51c2VQcmVpbnN0YWxsZWRXREEgfHwgdGhpcy5hcmdzLndlYkRyaXZlckFnZW50VXJsO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEJ1bmRsZSBJRCBmb3IgWGN0ZXN0LlxuICAgKi9cbiAgZ2V0IGJ1bmRsZUlkRm9yWGN0ZXN0ICgpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPyBgJHt0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZH0ueGN0cnVubmVyYCA6IFdEQV9SVU5ORVJfQlVORExFX0lEX0ZPUl9YQ1RFU1Q7XG4gIH1cblxuICBzZXRXREFQYXRocyAoYm9vdHN0cmFwUGF0aCwgYWdlbnRQYXRoKSB7XG4gICAgLy8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHBsYWNlIGZvciBXREEuIFRoaXMgaXMgdW5kb2N1bWVudGVkIGFuZFxuICAgIC8vIG9ubHkgaGVyZSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRlc3RpbmcgZGV2ZWxvcG1lbnQgb2YgV0RBXG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYm9vdHN0cmFwUGF0aCB8fCBCT09UU1RSQVBfUEFUSDtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgcGF0aDogJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcblxuICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFnZW50UGF0aCB0b29cbiAgICB0aGlzLmFnZW50UGF0aCA9IGFnZW50UGF0aCB8fCBwYXRoLnJlc29sdmUodGhpcy5ib290c3RyYXBQYXRoLCAnV2ViRHJpdmVyQWdlbnQueGNvZGVwcm9qJyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgV0RBIGFnZW50OiAnJHt0aGlzLmFnZW50UGF0aH0nYCk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMgKCkge1xuICAgIGNvbnN0IG9ic29sZXRlUGlkcyA9IGF3YWl0IGdldFBJRHNMaXN0ZW5pbmdPblBvcnQodGhpcy51cmwucG9ydCxcbiAgICAgIChjbWRMaW5lKSA9PiBjbWRMaW5lLmluY2x1ZGVzKCcvV2ViRHJpdmVyQWdlbnRSdW5uZXInKSAmJlxuICAgICAgICAhY21kTGluZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZGV2aWNlLnVkaWQudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShvYnNvbGV0ZVBpZHMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3NlcyBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucyBgICtcbiAgICAgICAgYGxpc3RlbmluZyBvbiBwb3J0ICR7dGhpcy51cmwucG9ydH0gaGF2ZSBiZWVuIGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbyhgRGV0ZWN0ZWQgJHtvYnNvbGV0ZVBpZHMubGVuZ3RofSBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gYCArXG4gICAgICBgZnJvbSBwcmV2aW91cyBXREEgc2Vzc2lvbnMuIENsZWFuaW5nIHRoZW0gdXBgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIG9ic29sZXRlUGlkcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgRmFpbGVkIHRvIGtpbGwgb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3Mke29ic29sZXRlUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9ICcke29ic29sZXRlUGlkc30nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaWYgV0RBIGlzIHJ1bm5pbmcgb3Igbm90XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV0RBIGlzIHJ1bm5pbmdcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgaXNSdW5uaW5nICgpIHtcbiAgICByZXR1cm4gISEoYXdhaXQgdGhpcy5nZXRTdGF0dXMoKSk7XG4gIH1cblxuICBnZXQgYmFzZVBhdGggKCkge1xuICAgIGlmICh0aGlzLnVybC5wYXRoID09PSAnLycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsLnBhdGggfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGN1cnJlbnQgcnVubmluZyBXREEncyBzdGF0dXMgbGlrZSBiZWxvd1xuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgY29uc3Qgbm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogMzAwMCxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5vU2Vzc2lvblByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV0RBIGlzIG5vdCBsaXN0ZW5pbmcgYXQgJyR7dGhpcy51cmwuaHJlZn0nYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIFdEQXMgZnJvbSB0aGUgdGVzdCBkZXZpY2UuXG4gICAqIE92ZXIgWGNvZGUgMTEsIG11bHRpcGxlIFdEQSBjYW4gYmUgaW4gdGhlIGRldmljZSBzaW5jZSBYY29kZSAxMSBnZW5lcmF0ZXMgZGlmZmVyZW50IFdEQS5cbiAgICogQXBwaXVtIGRvZXMgbm90IGV4cGVjdCBtdWx0aXBsZSBXREFzIGFyZSBydW5uaW5nIG9uIGEgZGV2aWNlLlxuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsICgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVuZGxlSWRzID0gYXdhaXQgdGhpcy5kZXZpY2UuZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZShXREFfQ0ZfQlVORExFX05BTUUpO1xuICAgICAgaWYgKF8uaXNFbXB0eShidW5kbGVJZHMpKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBXREFzIG9uIHRoZSBkZXZpY2UuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFVuaW5zdGFsbGluZyBXREFzOiAnJHtidW5kbGVJZHN9J2ApO1xuICAgICAgZm9yIChjb25zdCBidW5kbGVJZCBvZiBidW5kbGVJZHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXZpY2UucmVtb3ZlQXBwKGJ1bmRsZUlkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYFdlYkRyaXZlckFnZW50IHVuaW5zdGFsbCBmYWlsZWQuIFBlcmhhcHMsIGl0IGlzIGFscmVhZHkgdW5pbnN0YWxsZWQ/IGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9jbGVhbnVwUHJvamVjdElmRnJlc2ggKCkge1xuICAgIGNvbnN0IGhvbWVGb2xkZXIgPSBwcm9jZXNzLmVudi5IT01FO1xuICAgIGlmICghaG9tZUZvbGRlcikge1xuICAgICAgdGhpcy5sb2cuaW5mbygnVGhlIEhPTUUgZm9sZGVyIHBhdGggY2Fubm90IGJlIGRldGVybWluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlciwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgpO1xuICAgIGNvbnN0IGRpZFRpbWVzdGFtcEV4aXN0ID0gYXdhaXQgZnMuZXhpc3RzKHRpbWVzdGFtcFBhdGgpO1xuICAgIGlmIChkaWRUaW1lc3RhbXBFeGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHRpbWVzdGFtcFBhdGgsIGZzLldfT0spO1xuICAgICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgc291cmNlcyBjbGVhbnVwYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY2VudFVwZ3JhZGVUaW1lc3RhbXAgPSBwYXJzZUludChhd2FpdCBmcy5yZWFkRmlsZSh0aW1lc3RhbXBQYXRoLCAndXRmOCcpLCAxMCk7XG4gICAgICBpZiAoXy5pc0ludGVnZXIocmVjZW50VXBncmFkZVRpbWVzdGFtcCkpIHtcbiAgICAgICAgaWYgKHJlY2VudFVwZ3JhZGVUaW1lc3RhbXAgPj0gY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBXZWJEcml2ZXJBZ2VudCBkb2VzIG5vdCBuZWVkIGEgY2xlYW51cC4gVGhlIHNvdXJjZXMgYXJlIHVwIHRvIGRhdGUgYCArXG4gICAgICAgICAgICBgKCR7cmVjZW50VXBncmFkZVRpbWVzdGFtcH0gPj0gJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IHNvdXJjZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIGAgK1xuICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA8ICR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVGhlIHJlY2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScgaXMgY29ycnVwdGVkLiBUcnlpbmcgdG8gZml4IGl0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUodGltZXN0YW1wUGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRpbWVzdGFtcFBhdGgsIGAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfWAsICd1dGY4Jyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RvcmVkIHRoZSByZWNlbnQgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0gYCArXG4gICAgICAgIGBhdCAnJHt0aW1lc3RhbXBQYXRofSdgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVbmFibGUgdG8gY3JlYXRlIHRoZSByZWNlbnQgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGVyZSBpcyBubyBuZWVkIHRvIHBlcmZvcm0gdGhlIHByb2plY3QgY2xlYW51cC4gQSBmcmVzaCBpbnN0YWxsIGhhcyBiZWVuIGRldGVjdGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuU2tpcFhjb2RlYnVpbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5jbGVhblByb2plY3QoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcGVyZm9ybSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGNsZWFudXAuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoIFdEQSB3aXRoIHByZWluc3RhbGxlZCBwYWNrYWdlIHdpdGhvdXQgeGNvZGVidWlsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICovXG4gIGFzeW5jIGxhdW5jaFdpdGhQcmVpbnN0YWxsZWRXREEoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgeGN0ZXN0RW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JULFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMuYnVuZGxlSWRGb3JYY3Rlc3RcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgeGN0ZXN0RW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlIHdpdGhvdXQgeGNvZGVidWlsZCcpO1xuICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50ID0gbmV3IFhjdGVzdCh0aGlzLmRldmljZS51ZGlkLCB0aGlzLmJ1bmRsZUlkRm9yWGN0ZXN0LCBudWxsLCB7ZW52OiB4Y3Rlc3RFbnZ9KTtcblxuICAgIGF3YWl0IHRoaXMueGN0ZXN0QXBpQ2xpZW50LnN0YXJ0KCk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjdXJyZW50IHJ1bm5pbmcgV0RBJ3Mgc3RhdHVzIGxpa2UgYmVsb3cgYWZ0ZXIgbGF1bmNoaW5nIFdEQVxuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgbGF1bmNoIChzZXNzaW9uSWQpIHtcbiAgICBpZiAodGhpcy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgcHJvdmlkZWQgV2ViZHJpdmVyQWdlbnQgYXQgJyR7dGhpcy53ZWJEcml2ZXJBZ2VudFVybH0nYCk7XG4gICAgICB0aGlzLnVybCA9IHRoaXMud2ViRHJpdmVyQWdlbnRVcmw7XG4gICAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICBpZiAodGhpcy5pc1JlYWxEZXZpY2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubGF1bmNoV2l0aFByZWluc3RhbGxlZFdEQShzZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VQcmVpbnN0YWxsZWRXREEgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGEgcmVhbCBkZXZpY2UuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbygnTGF1bmNoaW5nIFdlYkRyaXZlckFnZW50IG9uIHRoZSBkZXZpY2UnKTtcblxuICAgIHRoaXMuc2V0dXBQcm94aWVzKHNlc3Npb25JZCk7XG5cbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiAhYXdhaXQgZnMuZXhpc3RzKHRoaXMuYWdlbnRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcnlpbmcgdG8gdXNlIFdlYkRyaXZlckFnZW50IHByb2plY3QgYXQgJyR7dGhpcy5hZ2VudFBhdGh9JyBidXQgdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgfVxuXG4gICAgLy8gdXNlWGN0ZXN0cnVuRmlsZSBhbmQgdXNlUHJlYnVpbHRXREEgdXNlIGV4aXN0aW5nIGRlcGVuZGVuY2llc1xuICAgIC8vIEl0IGRlcGVuZHMgb24gdXNlciBzaWRlXG4gICAgaWYgKHRoaXMuaWRiIHx8IHRoaXMudXNlWGN0ZXN0cnVuRmlsZSB8fCAodGhpcy5kZXJpdmVkRGF0YVBhdGggJiYgdGhpcy51c2VQcmVidWlsdFdEQSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwZWQgV0RBIHByb2plY3QgY2xlYW51cCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNhcGFiaWxpdGllcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW5jaHJvbml6YXRpb25LZXkgPSBwYXRoLm5vcm1hbGl6ZSh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgICAgYXdhaXQgU0hBUkVEX1JFU09VUkNFU19HVUFSRC5hY3F1aXJlKHN5bmNocm9uaXphdGlvbktleSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fY2xlYW51cFByb2plY3RJZkZyZXNoKCkpO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gcHJvdmlkZSBXREEgbG9jYWwgcG9ydCwgYmVjYXVzZSBpdCBtaWdodCBiZSBvY2N1cGllZFxuICAgIGF3YWl0IHJlc2V0VGVzdFByb2Nlc3Nlcyh0aGlzLmRldmljZS51ZGlkLCAhdGhpcy5pc1JlYWxEZXZpY2UpO1xuXG4gICAgaWYgKHRoaXMuaWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFdpdGhJREIoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuaW5pdCh0aGlzLm5vU2Vzc2lvblByb3h5KTtcblxuICAgIC8vIFN0YXJ0IHRoZSB4Y29kZWJ1aWxkIHByb2Nlc3NcbiAgICBpZiAodGhpcy5wcmVidWlsZFdEQSkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnByZWJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuc3RhcnQoKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2l0aElEQiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnV2lsbCBsYXVuY2ggV0RBIHdpdGggaWRiIGluc3RlYWQgb2YgeGNvZGVidWlsZCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyBmbGFnIGlzIGVuYWJsZWQnKTtcbiAgICBjb25zdCB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZH0gPSBhd2FpdCB0aGlzLnByZXBhcmVXREEoKTtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkLFxuICAgIH07XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGIucnVuWENVSVRlc3Qod2RhQnVuZGxlSWQsIHdkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHtlbnZ9KTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlQnVuZGxlSWQgKHdkYUJ1bmRsZVBhdGgpIHtcbiAgICBjb25zdCBpbmZvUGxpc3RQYXRoID0gcGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdJbmZvLnBsaXN0Jyk7XG4gICAgY29uc3QgaW5mb1BsaXN0ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdChhd2FpdCBmcy5yZWFkRmlsZShpbmZvUGxpc3RQYXRoKSk7XG4gICAgaWYgKCFpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGJ1bmRsZSBpZCBpbiAnJHtpbmZvUGxpc3RQYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm9QbGlzdC5DRkJ1bmRsZUlkZW50aWZpZXI7XG4gIH1cblxuICBhc3luYyBwcmVwYXJlV0RBICgpIHtcbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRoID0gdGhpcy53ZGFCdW5kbGVQYXRoIHx8IGF3YWl0IHRoaXMuZmV0Y2hXREFCdW5kbGUoKTtcbiAgICBjb25zdCB3ZGFCdW5kbGVJZCA9IGF3YWl0IHRoaXMucGFyc2VCdW5kbGVJZCh3ZGFCdW5kbGVQYXRoKTtcbiAgICBpZiAoIWF3YWl0IHRoaXMuZGV2aWNlLmlzQXBwSW5zdGFsbGVkKHdkYUJ1bmRsZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZXZpY2UuaW5zdGFsbEFwcCh3ZGFCdW5kbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgdGVzdEJ1bmRsZUlkID0gYXdhaXQgdGhpcy5pZGIuaW5zdGFsbFhDVGVzdEJ1bmRsZShwYXRoLmpvaW4od2RhQnVuZGxlUGF0aCwgJ1BsdWdJbnMnLCAnV2ViRHJpdmVyQWdlbnRSdW5uZXIueGN0ZXN0JykpO1xuICAgIHJldHVybiB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZCwgd2RhQnVuZGxlUGF0aH07XG4gIH1cblxuICBhc3luYyBmZXRjaFdEQUJ1bmRsZSAoKSB7XG4gICAgaWYgKCF0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJ1bmRsZVdEQVNpbSh0aGlzLnhjb2RlYnVpbGQpO1xuICAgIH1cbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9LyoqLyoke1dEQV9SVU5ORVJfQVBQfS9gLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAoXy5pc0VtcHR5KHdkYUJ1bmRsZVBhdGhzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgV0RBIGJ1bmRsZSBpbiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiB3ZGFCdW5kbGVQYXRoc1swXTtcbiAgfVxuXG4gIGFzeW5jIGlzU291cmNlRnJlc2ggKCkge1xuICAgIGNvbnN0IGV4aXN0c1Byb21pc2VzID0gW1xuICAgICAgJ1Jlc291cmNlcycsXG4gICAgICBgUmVzb3VyY2VzJHtwYXRoLnNlcH1XZWJEcml2ZXJBZ2VudC5idW5kbGVgLFxuICAgIF0ubWFwKChzdWJQYXRoKSA9PiBmcy5leGlzdHMocGF0aC5yZXNvbHZlKHRoaXMuYm9vdHN0cmFwUGF0aCwgc3ViUGF0aCkpKTtcbiAgICByZXR1cm4gKGF3YWl0IEIuYWxsKGV4aXN0c1Byb21pc2VzKSkuc29tZSgodikgPT4gdiA9PT0gZmFsc2UpO1xuICB9XG5cbiAgc2V0dXBQcm94aWVzIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogdGhpcy53ZGFDb25uZWN0aW9uVGltZW91dCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLmp3cHJveHkuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuXG4gICAgdGhpcy5ub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eShwcm94eU9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICBpZiAodGhpcy54Y3Rlc3RBcGlDbGllbnQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU3RvcHBpbmcgdGhlIFhDVGVzdCBzZXNzaW9uJyk7XG4gICAgICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50LnN0b3AoKTtcbiAgICAgICAgdGhpcy54Y3Rlc3RBcGlDbGllbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biBzdWItcHJvY2Vzc2VzJyk7XG4gICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucXVpdCgpO1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJlc2V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdEbyBub3Qgc3RvcCB4Y29kZWJ1aWxkIG5vciBYQ1Rlc3Qgc2Vzc2lvbiAnICtcbiAgICAgICAgJ3NpbmNlIHRoZSBXREEgc2Vzc2lvbiBpcyBtYW5hZ2VkIGJ5IG91dHNpZGUgdGhpcyBkcml2ZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuandwcm94eSkge1xuICAgICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgLy8gaWYgd2UgcG9wdWxhdGVkIHRoZSB1cmwgb3Vyc2VsdmVzIChkdXJpbmcgYHNldHVwQ2FjaGluZ2AgY2FsbCwgZm9yIGluc3RhbmNlKVxuICAgICAgLy8gdGhlbiBjbGVhbiB0aGF0IHVwLiBJZiB0aGUgdXJsIHdhcyBzdXBwbGllZCwgd2Ugd2FudCB0byBrZWVwIGl0XG4gICAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgICAgICBjb25zdCB7cHJvdG9jb2wsIGhvc3RuYW1lfSA9IHVybC5wYXJzZSh0aGlzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMKTtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX06JHtwb3J0fWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgc2V0IHVybCAoX3VybCkge1xuICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShfdXJsKTtcbiAgfVxuXG4gIGdldCBmdWxseVN0YXJ0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ZWQ7XG4gIH1cblxuICBzZXQgZnVsbHlTdGFydGVkIChzdGFydGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBzdGFydGVkO1xuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmNhblNraXBYY29kZWJ1aWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXVzZSBydW5uaW5nIFdEQSBpZiBpdCBoYXMgdGhlIHNhbWUgYnVuZGxlIGlkIHdpdGggdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBPciByZXVzZSBpdCBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgaWQgd2l0aG91dCB1cGRhdGVkV0RBQnVuZGxlSWQuXG4gICAqIFVuaW5zdGFsbCBpdCBpZiB0aGUgbWV0aG9kIGZhY2VzIGFuIGV4Y2VwdGlvbiBmb3IgdGhlIGFib3ZlIHNpdHVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVwZGF0ZWRXREFCdW5kbGVJZCBCdW5kbGVJZCB5b3UnZCBsaWtlIHRvIHVzZVxuICAgKi9cbiAgYXN5bmMgc2V0dXBDYWNoaW5nICgpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIGlmICghc3RhdHVzIHx8ICFzdGF0dXMuYnVpbGQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdXREEgaXMgY3VycmVudGx5IG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIGNhY2hlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIsXG4gICAgICB1cGdyYWRlZEF0LFxuICAgIH0gPSBzdGF0dXMuYnVpbGQ7XG4gICAgLy8gZm9yIHJlYWwgZGV2aWNlXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmIHV0aWwuaGFzVmFsdWUodGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkICE9PSBwcm9kdWN0QnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCBidW5kbGUgaWQuIFRoZSBhY3R1YWwgdmFsdWUgaXMgJyR7cHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJ9Jy5gKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICAgIH1cbiAgICAvLyBmb3Igc2ltdWxhdG9yXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmICF1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiBXREFfUlVOTkVSX0JVTkRMRV9JRCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0cyBidW5kbGUgaWQgaXMgbm90IGVxdWFsIHRvIHRoZSBkZWZhdWx0IHZhbHVlICR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9YCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudGx5IGJ1bmRsZWQgV0RBOiAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFVwZ3JhZGUgdGltZXN0YW1wIG9mIHRoZSBXREEgb24gdGhlIGRldmljZTogJHt1cGdyYWRlZEF0fWApO1xuICAgIGlmIChhY3R1YWxVcGdyYWRlVGltZXN0YW1wICYmIHVwZ3JhZGVkQXQgJiYgXy50b0xvd2VyKGAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCkgIT09IF8udG9Mb3dlcihgJHt1cGdyYWRlZEF0fWApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdCBoYXMgZGlmZmVyZW50IHZlcnNpb24gaW4gY29tcGFyaXNvbiB0byB0aGUgb25lICcgK1xuICAgICAgICBgd2hpY2ggaXMgYnVuZGxlZCB3aXRoIGFwcGl1bS14Y3VpdGVzdC1kcml2ZXIgbW9kdWxlICgke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9ICE9ICR7dXBncmFkZWRBdH0pYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdXRpbC5oYXNWYWx1ZShwcm9kdWN0QnVuZGxlSWRlbnRpZmllcilcbiAgICAgID8gYFdpbGwgcmV1c2UgcHJldmlvdXNseSBjYWNoZWQgV0RBIGluc3RhbmNlIGF0ICcke3RoaXMudXJsLmhyZWZ9JyB3aXRoICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfSdgXG4gICAgICA6IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfSdgO1xuICAgIHRoaXMubG9nLmluZm8oYCR7bWVzc2FnZX0uIFNldCB0aGUgd2RhTG9jYWxQb3J0IGNhcGFiaWxpdHkgdG8gYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSAke3RoaXMudXJsLnBvcnR9IGlmIHRoaXMgaXMgYW4gdW5kZXNpcmVkIGJlaGF2aW9yLmApO1xuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSB0aGlzLnVybC5ocmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aXQgYW5kIHVuaW5zdGFsbCBydW5uaW5nIFdEQS5cbiAgICovXG4gIGFzeW5jIHF1aXRBbmRVbmluc3RhbGwgKCkge1xuICAgIGF3YWl0IHRoaXMucXVpdCgpO1xuICAgIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2ViRHJpdmVyQWdlbnQ7XG5leHBvcnQgeyBXZWJEcml2ZXJBZ2VudCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLE1BQUEsR0FBQVIsT0FBQTtBQUdBLElBQUFTLFdBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLGFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGtCQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxVQUFBLEdBQUFiLE9BQUE7QUFJQSxJQUFBYyxnQkFBQSxHQUFBZCxPQUFBO0FBRUEsTUFBTWUsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDcEMsTUFBTUMsY0FBYyxHQUFHLElBQUk7QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBQ3hELE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFTLENBQUMsQ0FBQztBQUU5QyxNQUFNQyxjQUFjLENBQUM7RUFDbkJDLFdBQVdBLENBQUVDLFlBQVksRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFQyxHQUFHLEdBQUcsSUFBSSxFQUFFO0lBQ2hELElBQUksQ0FBQ0YsWUFBWSxHQUFHQSxZQUFZO0lBRWhDLElBQUksQ0FBQ0MsSUFB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
404
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl91cmwyIiwiX2JsdWViaXJkIiwiX2Jhc2VEcml2ZXIiLCJfc3VwcG9ydCIsIl9sb2dnZXIiLCJfbm9TZXNzaW9uUHJveHkiLCJfdXRpbHMiLCJfeGNvZGVidWlsZCIsIl9hc3luY0xvY2siLCJfdGVlbl9wcm9jZXNzIiwiX2NoZWNrRGVwZW5kZW5jaWVzIiwiX2NvbnN0YW50cyIsIl9hcHBpdW1Jb3NEZXZpY2UiLCJfc3Ryb25nYm94IiwiV0RBX0xBVU5DSF9USU1FT1VUIiwiV0RBX0FHRU5UX1BPUlQiLCJXREFfQ0ZfQlVORExFX05BTUUiLCJTSEFSRURfUkVTT1VSQ0VTX0dVQVJEIiwiQXN5bmNMb2NrIiwiUkVDRU5UX01PRFVMRV9WRVJTSU9OX0lURU1fTkFNRSIsIldlYkRyaXZlckFnZW50IiwiY29uc3RydWN0b3IiLCJ4Y29kZVZlcnNpb24iLCJhcmdzIiwibG9nIiwiXyIsImNsb25lIiwiZGVmYXVsdExvZ2dlciIsImRldmljZSIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJob3N0IiwiaXNSZWFsRGV2aWNlIiwicmVhbERldmljZSIsImlkYiIsIndkYUJ1bmRsZVBhdGgiLCJzZXRXREFQYXRocyIsImJvb3RzdHJhcFBhdGgiLCJhZ2VudFBhdGgiLCJ3ZGFMb2NhbFBvcnQiLCJ3ZGFSZW1vdGVQb3J0Iiwid2RhQmFzZVVybCIsIldEQV9CQVNFX1VSTCIsInByZWJ1aWxkV0RBIiwid2ViRHJpdmVyQWdlbnRVcmwiLCJzdGFydGVkIiwid2RhQ29ubmVjdGlvblRpbWVvdXQiLCJ1c2VYY3Rlc3RydW5GaWxlIiwidXNlUHJlYnVpbHRXREEiLCJkZXJpdmVkRGF0YVBhdGgiLCJtanBlZ1NlcnZlclBvcnQiLCJ1cGRhdGVkV0RBQnVuZGxlSWQiLCJ1c2VQcmVpbnN0YWxsZWRXREEiLCJ4Y3Rlc3RBcGlDbGllbnQiLCJ4Y29kZWJ1aWxkIiwiY2FuU2tpcFhjb2RlYnVpbGQiLCJYY29kZUJ1aWxkIiwic2hvd1hjb2RlTG9nIiwieGNvZGVDb25maWdGaWxlIiwieGNvZGVPcmdJZCIsInhjb2RlU2lnbmluZ0lkIiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsInVzZVNpbXBsZUJ1aWxkVGVzdCIsImxhdW5jaFRpbWVvdXQiLCJ3ZGFMYXVuY2hUaW1lb3V0IiwiYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24iLCJyZXN1bHRCdW5kbGVQYXRoIiwicmVzdWx0QnVuZGxlVmVyc2lvbiIsImJ1bmRsZUlkRm9yWGN0ZXN0IiwiV0RBX1JVTk5FUl9CVU5ETEVfSURfRk9SX1hDVEVTVCIsIkJPT1RTVFJBUF9QQVRIIiwiaW5mbyIsInBhdGgiLCJyZXNvbHZlIiwiY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzIiwib2Jzb2xldGVQaWRzIiwiZ2V0UElEc0xpc3RlbmluZ09uUG9ydCIsInVybCIsInBvcnQiLCJjbWRMaW5lIiwiaW5jbHVkZXMiLCJ0b0xvd2VyQ2FzZSIsInVkaWQiLCJpc0VtcHR5IiwiZGVidWciLCJsZW5ndGgiLCJleGVjIiwiZSIsIndhcm4iLCJtZXNzYWdlIiwiaXNSdW5uaW5nIiwiZ2V0U3RhdHVzIiwiYmFzZVBhdGgiLCJub1Nlc3Npb25Qcm94eSIsIk5vU2Vzc2lvblByb3h5Iiwic2VydmVyIiwiaG9zdG5hbWUiLCJiYXNlIiwidGltZW91dCIsImNvbW1hbmQiLCJlcnIiLCJocmVmIiwidW5pbnN0YWxsIiwiYnVuZGxlSWRzIiwiZ2V0VXNlckluc3RhbGxlZEJ1bmRsZUlkc0J5QnVuZGxlTmFtZSIsImJ1bmRsZUlkIiwicmVtb3ZlQXBwIiwiX2NsZWFudXBQcm9qZWN0SWZGcmVzaCIsInBhY2thZ2VJbmZvIiwiSlNPTiIsInBhcnNlIiwiZnMiLCJyZWFkRmlsZSIsImpvaW4iLCJib3giLCJzdHJvbmdib3giLCJuYW1lIiwiYm94SXRlbSIsImdldEl0ZW0iLCJ0aW1lc3RhbXBQYXRoIiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJXREFfVVBHUkFERV9USU1FU1RBTVBfUEFUSCIsImV4aXN0cyIsImNyZWF0ZUl0ZW1XaXRoQ29udGVudHMiLCJ2ZXJzaW9uIiwicmVjZW50TW9kdWxlVmVyc2lvbiIsInJlYWQiLCJ1dGlsIiwiY29lcmNlVmVyc2lvbiIsIndyaXRlIiwiY29tcGFyZVZlcnNpb25zIiwiY2xlYW5Qcm9qZWN0IiwibGF1bmNoV2l0aFByZWluc3RhbGxlZFdEQSIsInNlc3Npb25JZCIsInhjdGVzdEVudiIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJNSlBFR19TRVJWRVJfUE9SVCIsIlhjdGVzdCIsInN0YXJ0Iiwic2V0dXBQcm94aWVzIiwic3RhdHVzIiwibGF1bmNoIiwiRXJyb3IiLCJzeW5jaHJvbml6YXRpb25LZXkiLCJub3JtYWxpemUiLCJhY3F1aXJlIiwicmVzZXRUZXN0UHJvY2Vzc2VzIiwic3RhcnRXaXRoSURCIiwiaW5pdCIsInByZWJ1aWxkIiwid2RhQnVuZGxlSWQiLCJ0ZXN0QnVuZGxlSWQiLCJwcmVwYXJlV0RBIiwicnVuWENVSVRlc3QiLCJwYXJzZUJ1bmRsZUlkIiwiaW5mb1BsaXN0UGF0aCIsImluZm9QbGlzdCIsInBsaXN0IiwicGFyc2VQbGlzdCIsIkNGQnVuZGxlSWRlbnRpZmllciIsImZldGNoV0RBQnVuZGxlIiwiaXNBcHBJbnN0YWxsZWQiLCJpbnN0YWxsQXBwIiwiaW5zdGFsbFhDVGVzdEJ1bmRsZSIsImJ1bmRsZVdEQVNpbSIsIndkYUJ1bmRsZVBhdGhzIiwiZ2xvYiIsIldEQV9SVU5ORVJfQVBQIiwiYWJzb2x1dGUiLCJpc1NvdXJjZUZyZXNoIiwiZXhpc3RzUHJvbWlzZXMiLCJzZXAiLCJtYXAiLCJzdWJQYXRoIiwiQiIsImFsbCIsInNvbWUiLCJ2IiwicHJveHlPcHRzIiwia2VlcEFsaXZlIiwiandwcm94eSIsIkpXUHJveHkiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJxdWl0Iiwic3RvcCIsInJlc2V0IiwiX3VybCIsInByb3RvY29sIiwiZnVsbHlTdGFydGVkIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJzZXR1cENhY2hpbmciLCJidWlsZCIsInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyIiwidXBncmFkZWRBdCIsImhhc1ZhbHVlIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJhY3R1YWxVcGdyYWRlVGltZXN0YW1wIiwiZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCIsInRvTG93ZXIiLCJxdWl0QW5kVW5pbnN0YWxsIiwiZXhwb3J0cyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi93ZWJkcml2ZXJhZ2VudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ3VybCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcywgdXRpbCwgcGxpc3QgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgTm9TZXNzaW9uUHJveHkgfSBmcm9tICcuL25vLXNlc3Npb24tcHJveHknO1xuaW1wb3J0IHtcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLCBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBCT09UU1RSQVBfUEFUSFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBYY29kZUJ1aWxkIGZyb20gJy4veGNvZGVidWlsZCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBidW5kbGVXREFTaW0gfSBmcm9tICcuL2NoZWNrLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQge1xuICBXREFfUlVOTkVSX0JVTkRMRV9JRCwgV0RBX1JVTk5FUl9CVU5ETEVfSURfRk9SX1hDVEVTVCwgV0RBX1JVTk5FUl9BUFAsXG4gIFdEQV9CQVNFX1VSTCwgV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEhcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtYY3Rlc3R9IGZyb20gJ2FwcGl1bS1pb3MtZGV2aWNlJztcbmltcG9ydCB7c3Ryb25nYm94fSBmcm9tICdAYXBwaXVtL3N0cm9uZ2JveCc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IFJFQ0VOVF9NT0RVTEVfVkVSU0lPTl9JVEVNX05BTUUgPSAncmVjZW50V2RhTW9kdWxlVmVyc2lvbic7XG5cbmNsYXNzIFdlYkRyaXZlckFnZW50IHtcbiAgY29uc3RydWN0b3IgKHhjb2RlVmVyc2lvbiwgYXJncyA9IHt9LCBsb2cgPSBudWxsKSB7XG4gICAgdGhpcy54Y29kZVZlcnNpb24gPSB4Y29kZVZlcnNpb247XG5cbiAgICB0aGlzLmFyZ3MgPSBfLmNsb25lKGFyZ3MpO1xuICAgIHRoaXMubG9nID0gbG9nID8/IGRlZmF1bHRMb2dnZXI7XG5cbiAgICB0aGlzLmRldmljZSA9IGFyZ3MuZGV2aWNlO1xuICAgIHRoaXMucGxhdGZvcm1WZXJzaW9uID0gYXJncy5wbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBhcmdzLnBsYXRmb3JtTmFtZTtcbiAgICB0aGlzLmlvc1Nka1ZlcnNpb24gPSBhcmdzLmlvc1Nka1ZlcnNpb247XG4gICAgdGhpcy5ob3N0ID0gYXJncy5ob3N0O1xuICAgIHRoaXMuaXNSZWFsRGV2aWNlID0gISFhcmdzLnJlYWxEZXZpY2U7XG4gICAgdGhpcy5pZGIgPSAoYXJncy5kZXZpY2UgfHwge30pLmlkYjtcbiAgICB0aGlzLndkYUJ1bmRsZVBhdGggPSBhcmdzLndkYUJ1bmRsZVBhdGg7XG5cbiAgICB0aGlzLnNldFdEQVBhdGhzKGFyZ3MuYm9vdHN0cmFwUGF0aCwgYXJncy5hZ2VudFBhdGgpO1xuXG4gICAgdGhpcy53ZGFMb2NhbFBvcnQgPSBhcmdzLndkYUxvY2FsUG9ydDtcbiAgICB0aGlzLndkYVJlbW90ZVBvcnQgPSBhcmdzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICB0aGlzLndkYUJhc2VVcmwgPSBhcmdzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMO1xuXG4gICAgdGhpcy5wcmVidWlsZFdEQSA9IGFyZ3MucHJlYnVpbGRXREE7XG5cbiAgICAvLyB0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwgZ3VpYXJhbnRlZXMgdGhlIGNhcGFiaWxpdGllcyBhY3VhbGx5XG4gICAgLy8gZ2F2ZSAnYXBwaXVtOndlYkRyaXZlckFnZW50VXJsJyBidXQgJ3RoaXMud2ViRHJpdmVyQWdlbnRVcmwnXG4gICAgLy8gY291bGQgYmUgdXNlZCBmb3IgY2FjaGluZyBXREEgd2l0aCB4Y29kZWJ1aWxkLlxuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSBhcmdzLndlYkRyaXZlckFnZW50VXJsO1xuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLndkYUNvbm5lY3Rpb25UaW1lb3V0ID0gYXJncy53ZGFDb25uZWN0aW9uVGltZW91dDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCA9IGFyZ3MudXBkYXRlZFdEQUJ1bmRsZUlkO1xuXG4gICAgdGhpcy51c2VQcmVpbnN0YWxsZWRXREEgPSBhcmdzLnVzZVByZWluc3RhbGxlZFdEQTtcbiAgICB0aGlzLnhjdGVzdEFwaUNsaWVudCA9IG51bGw7XG5cbiAgICB0aGlzLnhjb2RlYnVpbGQgPSB0aGlzLmNhblNraXBYY29kZWJ1aWxkXG4gICAgPyBudWxsXG4gICAgOiBuZXcgWGNvZGVCdWlsZCh0aGlzLnhjb2RlVmVyc2lvbiwgdGhpcy5kZXZpY2UsIHtcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZSxcbiAgICAgICAgaW9zU2RrVmVyc2lvbjogdGhpcy5pb3NTZGtWZXJzaW9uLFxuICAgICAgICBhZ2VudFBhdGg6IHRoaXMuYWdlbnRQYXRoLFxuICAgICAgICBib290c3RyYXBQYXRoOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICAgIHJlYWxEZXZpY2U6IHRoaXMuaXNSZWFsRGV2aWNlLFxuICAgICAgICBzaG93WGNvZGVMb2c6IGFyZ3Muc2hvd1hjb2RlTG9nLFxuICAgICAgICB4Y29kZUNvbmZpZ0ZpbGU6IGFyZ3MueGNvZGVDb25maWdGaWxlLFxuICAgICAgICB4Y29kZU9yZ0lkOiBhcmdzLnhjb2RlT3JnSWQsXG4gICAgICAgIHhjb2RlU2lnbmluZ0lkOiBhcmdzLnhjb2RlU2lnbmluZ0lkLFxuICAgICAgICBrZXljaGFpblBhdGg6IGFyZ3Mua2V5Y2hhaW5QYXRoLFxuICAgICAgICBrZXljaGFpblBhc3N3b3JkOiBhcmdzLmtleWNoYWluUGFzc3dvcmQsXG4gICAgICAgIHVzZVNpbXBsZUJ1aWxkVGVzdDogYXJncy51c2VTaW1wbGVCdWlsZFRlc3QsXG4gICAgICAgIHVzZVByZWJ1aWx0V0RBOiBhcmdzLnVzZVByZWJ1aWx0V0RBLFxuICAgICAgICB1cGRhdGVkV0RBQnVuZGxlSWQ6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkLFxuICAgICAgICBsYXVuY2hUaW1lb3V0OiBhcmdzLndkYUxhdW5jaFRpbWVvdXQgfHwgV0RBX0xBVU5DSF9USU1FT1VULFxuICAgICAgICB3ZGFSZW1vdGVQb3J0OiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICAgIHVzZVhjdGVzdHJ1bkZpbGU6IHRoaXMudXNlWGN0ZXN0cnVuRmlsZSxcbiAgICAgICAgZGVyaXZlZERhdGFQYXRoOiBhcmdzLmRlcml2ZWREYXRhUGF0aCxcbiAgICAgICAgbWpwZWdTZXJ2ZXJQb3J0OiB0aGlzLm1qcGVnU2VydmVyUG9ydCxcbiAgICAgICAgYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb246IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24sXG4gICAgICAgIHJlc3VsdEJ1bmRsZVBhdGg6IGFyZ3MucmVzdWx0QnVuZGxlUGF0aCxcbiAgICAgICAgcmVzdWx0QnVuZGxlVmVyc2lvbjogYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uLFxuICAgICAgfSwgdGhpcy5sb2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSBzZXNzaW9uIGRvZXMgbm90IG5lZWQgeGNvZGVidWlsZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNlc3Npb24gbmVlZHMvaGFzIHhjb2RlYnVpbGQuXG4gICAqL1xuICBnZXQgY2FuU2tpcFhjb2RlYnVpbGQgKCkge1xuICAgIC8vIFVzZSB0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwgdG8gZ3VhcmFudGVlXG4gICAgLy8gdGhlIGNhcGFiaWxpdGllcyBzZXQgZ2F2ZSB0aGUgYGFwcGl1bTp3ZWJEcml2ZXJBZ2VudFVybGAuXG4gICAgcmV0dXJuIHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBIHx8IHRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCdW5kbGUgSUQgZm9yIFhjdGVzdC5cbiAgICovXG4gIGdldCBidW5kbGVJZEZvclhjdGVzdCAoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkID8gYCR7dGhpcy51cGRhdGVkV0RBQnVuZGxlSWR9LnhjdHJ1bm5lcmAgOiBXREFfUlVOTkVSX0JVTkRMRV9JRF9GT1JfWENURVNUO1xuICB9XG5cbiAgc2V0V0RBUGF0aHMgKGJvb3RzdHJhcFBhdGgsIGFnZW50UGF0aCkge1xuICAgIC8vIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBwbGFjZSBmb3IgV0RBLiBUaGlzIGlzIHVuZG9jdW1lbnRlZCBhbmRcbiAgICAvLyBvbmx5IGhlcmUgZm9yIHRoZSBwdXJwb3NlcyBvZiB0ZXN0aW5nIGRldmVsb3BtZW50IG9mIFdEQVxuICAgIHRoaXMuYm9vdHN0cmFwUGF0aCA9IGJvb3RzdHJhcFBhdGggfHwgQk9PVFNUUkFQX1BBVEg7XG4gICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgV0RBIHBhdGg6ICcke3RoaXMuYm9vdHN0cmFwUGF0aH0nYCk7XG5cbiAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc3BlY2lmeSBhZ2VudFBhdGggdG9vXG4gICAgdGhpcy5hZ2VudFBhdGggPSBhZ2VudFBhdGggfHwgcGF0aC5yZXNvbHZlKHRoaXMuYm9vdHN0cmFwUGF0aCwgJ1dlYkRyaXZlckFnZW50Lnhjb2RlcHJvaicpO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBhZ2VudDogJyR7dGhpcy5hZ2VudFBhdGh9J2ApO1xuICB9XG5cbiAgYXN5bmMgY2xlYW51cE9ic29sZXRlUHJvY2Vzc2VzICgpIHtcbiAgICBjb25zdCBvYnNvbGV0ZVBpZHMgPSBhd2FpdCBnZXRQSURzTGlzdGVuaW5nT25Qb3J0KHRoaXMudXJsLnBvcnQsXG4gICAgICAoY21kTGluZSkgPT4gY21kTGluZS5pbmNsdWRlcygnL1dlYkRyaXZlckFnZW50UnVubmVyJykgJiZcbiAgICAgICAgIWNtZExpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmRldmljZS51ZGlkLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgIGlmIChfLmlzRW1wdHkob2Jzb2xldGVQaWRzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYE5vIG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzZXMgZnJvbSBwcmV2aW91cyBXREEgc2Vzc2lvbnMgYCArXG4gICAgICAgIGBsaXN0ZW5pbmcgb24gcG9ydCAke3RoaXMudXJsLnBvcnR9IGhhdmUgYmVlbiBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oYERldGVjdGVkICR7b2Jzb2xldGVQaWRzLmxlbmd0aH0gb2Jzb2xldGUgY2FjaGVkIHByb2Nlc3Mke29ic29sZXRlUGlkcy5sZW5ndGggPT09IDEgPyAnJyA6ICdlcyd9IGAgK1xuICAgICAgYGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zLiBDbGVhbmluZyB0aGVtIHVwYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ2tpbGwnLCBvYnNvbGV0ZVBpZHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEZhaWxlZCB0byBraWxsIG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSAnJHtvYnNvbGV0ZVBpZHN9Jy4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGlmIFdEQSBpcyBydW5uaW5nIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIFdEQSBpcyBydW5uaW5nXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGlzUnVubmluZyAoKSB7XG4gICAgcmV0dXJuICEhKGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCkpO1xuICB9XG5cbiAgZ2V0IGJhc2VQYXRoICgpIHtcbiAgICBpZiAodGhpcy51cmwucGF0aCA9PT0gJy8nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybC5wYXRoIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjdXJyZW50IHJ1bm5pbmcgV0RBJ3Mgc3RhdHVzIGxpa2UgYmVsb3dcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEByZXR1cm4gez9vYmplY3R9IFN0YXRlIE9iamVjdFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMgKCkge1xuICAgIGNvbnN0IG5vU2Vzc2lvblByb3h5ID0gbmV3IE5vU2Vzc2lvblByb3h5KHtcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IDMwMDAsXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBub1Nlc3Npb25Qcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFdEQSBpcyBub3QgbGlzdGVuaW5nIGF0ICcke3RoaXMudXJsLmhyZWZ9J2ApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuaW5zdGFsbCBXREFzIGZyb20gdGhlIHRlc3QgZGV2aWNlLlxuICAgKiBPdmVyIFhjb2RlIDExLCBtdWx0aXBsZSBXREEgY2FuIGJlIGluIHRoZSBkZXZpY2Ugc2luY2UgWGNvZGUgMTEgZ2VuZXJhdGVzIGRpZmZlcmVudCBXREEuXG4gICAqIEFwcGl1bSBkb2VzIG5vdCBleHBlY3QgbXVsdGlwbGUgV0RBcyBhcmUgcnVubmluZyBvbiBhIGRldmljZS5cbiAgICovXG4gIGFzeW5jIHVuaW5zdGFsbCAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1bmRsZUlkcyA9IGF3YWl0IHRoaXMuZGV2aWNlLmdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUoV0RBX0NGX0JVTkRMRV9OQU1FKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoYnVuZGxlSWRzKSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gV0RBcyBvbiB0aGUgZGV2aWNlLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBVbmluc3RhbGxpbmcgV0RBczogJyR7YnVuZGxlSWRzfSdgKTtcbiAgICAgIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgYnVuZGxlSWRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLnJlbW92ZUFwcChidW5kbGVJZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoZSk7XG4gICAgICB0aGlzLmxvZy53YXJuKGBXZWJEcml2ZXJBZ2VudCB1bmluc3RhbGwgZmFpbGVkLiBQZXJoYXBzLCBpdCBpcyBhbHJlYWR5IHVuaW5zdGFsbGVkPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfY2xlYW51cFByb2plY3RJZkZyZXNoICgpIHtcbiAgICBpZiAodGhpcy5jYW5Ta2lwWGNvZGVidWlsZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VJbmZvID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oQk9PVFNUUkFQX1BBVEgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gICAgY29uc3QgYm94ID0gc3Ryb25nYm94KHBhY2thZ2VJbmZvLm5hbWUpO1xuICAgIGxldCBib3hJdGVtID0gYm94LmdldEl0ZW0oUkVDRU5UX01PRFVMRV9WRVJTSU9OX0lURU1fTkFNRSk7XG4gICAgaWYgKCFib3hJdGVtKSB7XG4gICAgICBjb25zdCB0aW1lc3RhbXBQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCkpIHtcbiAgICAgICAgLy8gVE9ETzogSXQgaXMgcHJvYmFibHkgYSBiaXQgdWdseSB0byBoYXJkY29kZSB0aGUgcmVjZW50IHZlcnNpb24gc3RyaW5nLFxuICAgICAgICAvLyBUT0RPOiBob3Zld2VyIGl0IHNob3VsZCBkbyB0aGUgam9iIGFzIGEgdGVtcG9yYXJ5IHRyYW5zaXRpb24gdHJpY2tcbiAgICAgICAgLy8gVE9ETzogdG8gc3dpdGNoIGZyb20gYSBoYXJkY29kZWQgZmlsZSBwYXRoIHRvIHRoZSBzdHJvbmdib3ggdXNhZ2UuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYm94SXRlbSA9IGF3YWl0IGJveC5jcmVhdGVJdGVtV2l0aENvbnRlbnRzKFJFQ0VOVF9NT0RVTEVfVkVSU0lPTl9JVEVNX05BTUUsICc1LjAuMCcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgVGhlIGFjdHVhbCBtb2R1bGUgdmVyc2lvbiBjYW5ub3QgYmUgcGVyc2lzdGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1RoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB0aGUgcHJvamVjdCBjbGVhbnVwLiBBIGZyZXNoIGluc3RhbGwgaGFzIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBib3guY3JlYXRlSXRlbVdpdGhDb250ZW50cyhSRUNFTlRfTU9EVUxFX1ZFUlNJT05fSVRFTV9OQU1FLCBwYWNrYWdlSW5mby52ZXJzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYFRoZSBhY3R1YWwgbW9kdWxlIHZlcnNpb24gY2Fubm90IGJlIHBlcnNpc3RlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZWNlbnRNb2R1bGVWZXJzaW9uID0gYXdhaXQgYm94SXRlbS5yZWFkKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJlY2VudE1vZHVsZVZlcnNpb24gPSB1dGlsLmNvZXJjZVZlcnNpb24ocmVjZW50TW9kdWxlVmVyc2lvbiwgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgVGhlIHBlcnNpc3RlZCBtb2R1bGUgdmVyc2lvbiBzdHJpbmcgaGFzIGJlZW4gZGFtYWdlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVcGRhdGluZyBpdCB0byAnJHtwYWNrYWdlSW5mby52ZXJzaW9ufScgYXNzdW1pbmcgdGhlIHByb2plY3QgY2xlbnVwIGlzIG5vdCBuZWVkZWRgKTtcbiAgICAgIGF3YWl0IGJveEl0ZW0ud3JpdGUocGFja2FnZUluZm8udmVyc2lvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHV0aWwuY29tcGFyZVZlcnNpb25zKHJlY2VudE1vZHVsZVZlcnNpb24sICc+PScsIHBhY2thZ2VJbmZvLnZlcnNpb24pKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgICBgV2ViRHJpdmVyQWdlbnQgZG9lcyBub3QgbmVlZCBhIGNsZWFudXAuIFRoZSBwcm9qZWN0IHNvdXJjZXMgYXJlIHVwIHRvIGRhdGUgYCArXG4gICAgICAgIGAoJHtyZWNlbnRNb2R1bGVWZXJzaW9ufSA+PSAke3BhY2thZ2VJbmZvLnZlcnNpb259KWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBDbGVhbmluZyB1cCB0aGUgV2ViRHJpdmVyQWdlbnQgcHJvamVjdCBhZnRlciB0aGUgbW9kdWxlIHVwZ3JhZGUgaGFzIGhhcHBlbmVkIGAgK1xuICAgICAgYCgke3JlY2VudE1vZHVsZVZlcnNpb259IDwgJHtwYWNrYWdlSW5mby52ZXJzaW9ufSlgXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmNsZWFuUHJvamVjdCgpO1xuICAgICAgYXdhaXQgYm94SXRlbS53cml0ZShwYWNrYWdlSW5mby52ZXJzaW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcGVyZm9ybSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGNsZWFudXAuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoIFdEQSB3aXRoIHByZWluc3RhbGxlZCBwYWNrYWdlIHdpdGhvdXQgeGNvZGVidWlsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICovXG4gIGFzeW5jIGxhdW5jaFdpdGhQcmVpbnN0YWxsZWRXREEoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgeGN0ZXN0RW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JULFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMuYnVuZGxlSWRGb3JYY3Rlc3RcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgeGN0ZXN0RW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlIHdpdGhvdXQgeGNvZGVidWlsZCcpO1xuICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50ID0gbmV3IFhjdGVzdCh0aGlzLmRldmljZS51ZGlkLCB0aGlzLmJ1bmRsZUlkRm9yWGN0ZXN0LCBudWxsLCB7ZW52OiB4Y3Rlc3RFbnZ9KTtcblxuICAgIGF3YWl0IHRoaXMueGN0ZXN0QXBpQ2xpZW50LnN0YXJ0KCk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjdXJyZW50IHJ1bm5pbmcgV0RBJ3Mgc3RhdHVzIGxpa2UgYmVsb3cgYWZ0ZXIgbGF1bmNoaW5nIFdEQVxuICAgKiB7XG4gICAqICAgXCJzdGF0ZVwiOiBcInN1Y2Nlc3NcIixcbiAgICogICBcIm9zXCI6IHtcbiAgICogICAgIFwibmFtZVwiOiBcImlPU1wiLFxuICAgKiAgICAgXCJ2ZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJzZGtWZXJzaW9uXCI6IFwiMTEuM1wiXG4gICAqICAgfSxcbiAgICogICBcImlvc1wiOiB7XG4gICAqICAgICBcInNpbXVsYXRvclZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcImlwXCI6IFwiMTcyLjI1NC45OS4zNFwiXG4gICAqICAgfSxcbiAgICogICBcImJ1aWxkXCI6IHtcbiAgICogICAgIFwidGltZVwiOiBcIkp1biAyNCAyMDE4IDE3OjA4OjIxXCIsXG4gICAqICAgICBcInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyXCI6IFwiY29tLmZhY2Vib29rLldlYkRyaXZlckFnZW50UnVubmVyXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCBMYXVuY2ggV0RBIGFuZCBlc3RhYmxpc2ggdGhlIHNlc3Npb24gd2l0aCB0aGlzIHNlc3Npb25JZFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgbGF1bmNoIChzZXNzaW9uSWQpIHtcbiAgICBpZiAodGhpcy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVXNpbmcgcHJvdmlkZWQgV2ViZHJpdmVyQWdlbnQgYXQgJyR7dGhpcy53ZWJEcml2ZXJBZ2VudFVybH0nYCk7XG4gICAgICB0aGlzLnVybCA9IHRoaXMud2ViRHJpdmVyQWdlbnRVcmw7XG4gICAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICBpZiAodGhpcy5pc1JlYWxEZXZpY2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubGF1bmNoV2l0aFByZWluc3RhbGxlZFdEQShzZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VQcmVpbnN0YWxsZWRXREEgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGEgcmVhbCBkZXZpY2UuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuaW5mbygnTGF1bmNoaW5nIFdlYkRyaXZlckFnZW50IG9uIHRoZSBkZXZpY2UnKTtcblxuICAgIHRoaXMuc2V0dXBQcm94aWVzKHNlc3Npb25JZCk7XG5cbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiAhYXdhaXQgZnMuZXhpc3RzKHRoaXMuYWdlbnRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcnlpbmcgdG8gdXNlIFdlYkRyaXZlckFnZW50IHByb2plY3QgYXQgJyR7dGhpcy5hZ2VudFBhdGh9JyBidXQgdGhlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgfVxuXG4gICAgLy8gdXNlWGN0ZXN0cnVuRmlsZSBhbmQgdXNlUHJlYnVpbHRXREEgdXNlIGV4aXN0aW5nIGRlcGVuZGVuY2llc1xuICAgIC8vIEl0IGRlcGVuZHMgb24gdXNlciBzaWRlXG4gICAgaWYgKHRoaXMuaWRiIHx8IHRoaXMudXNlWGN0ZXN0cnVuRmlsZSB8fCAodGhpcy5kZXJpdmVkRGF0YVBhdGggJiYgdGhpcy51c2VQcmVidWlsdFdEQSkpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1NraXBwZWQgV0RBIHByb2plY3QgY2xlYW51cCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNhcGFiaWxpdGllcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW5jaHJvbml6YXRpb25LZXkgPSBwYXRoLm5vcm1hbGl6ZSh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgICAgYXdhaXQgU0hBUkVEX1JFU09VUkNFU19HVUFSRC5hY3F1aXJlKHN5bmNocm9uaXphdGlvbktleSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fY2xlYW51cFByb2plY3RJZkZyZXNoKCkpO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gcHJvdmlkZSBXREEgbG9jYWwgcG9ydCwgYmVjYXVzZSBpdCBtaWdodCBiZSBvY2N1cGllZFxuICAgIGF3YWl0IHJlc2V0VGVzdFByb2Nlc3Nlcyh0aGlzLmRldmljZS51ZGlkLCAhdGhpcy5pc1JlYWxEZXZpY2UpO1xuXG4gICAgaWYgKHRoaXMuaWRiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFdpdGhJREIoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuaW5pdCh0aGlzLm5vU2Vzc2lvblByb3h5KTtcblxuICAgIC8vIFN0YXJ0IHRoZSB4Y29kZWJ1aWxkIHByb2Nlc3NcbiAgICBpZiAodGhpcy5wcmVidWlsZFdEQSkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnByZWJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuc3RhcnQoKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2l0aElEQiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnV2lsbCBsYXVuY2ggV0RBIHdpdGggaWRiIGluc3RlYWQgb2YgeGNvZGVidWlsZCBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyBmbGFnIGlzIGVuYWJsZWQnKTtcbiAgICBjb25zdCB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZH0gPSBhd2FpdCB0aGlzLnByZXBhcmVXREEoKTtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkLFxuICAgIH07XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGIucnVuWENVSVRlc3Qod2RhQnVuZGxlSWQsIHdkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHtlbnZ9KTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlQnVuZGxlSWQgKHdkYUJ1bmRsZVBhdGgpIHtcbiAgICBjb25zdCBpbmZvUGxpc3RQYXRoID0gcGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdJbmZvLnBsaXN0Jyk7XG4gICAgY29uc3QgaW5mb1BsaXN0ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdChhd2FpdCBmcy5yZWFkRmlsZShpbmZvUGxpc3RQYXRoKSk7XG4gICAgaWYgKCFpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGJ1bmRsZSBpZCBpbiAnJHtpbmZvUGxpc3RQYXRofSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm9QbGlzdC5DRkJ1bmRsZUlkZW50aWZpZXI7XG4gIH1cblxuICBhc3luYyBwcmVwYXJlV0RBICgpIHtcbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRoID0gdGhpcy53ZGFCdW5kbGVQYXRoIHx8IGF3YWl0IHRoaXMuZmV0Y2hXREFCdW5kbGUoKTtcbiAgICBjb25zdCB3ZGFCdW5kbGVJZCA9IGF3YWl0IHRoaXMucGFyc2VCdW5kbGVJZCh3ZGFCdW5kbGVQYXRoKTtcbiAgICBpZiAoIWF3YWl0IHRoaXMuZGV2aWNlLmlzQXBwSW5zdGFsbGVkKHdkYUJ1bmRsZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZXZpY2UuaW5zdGFsbEFwcCh3ZGFCdW5kbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgdGVzdEJ1bmRsZUlkID0gYXdhaXQgdGhpcy5pZGIuaW5zdGFsbFhDVGVzdEJ1bmRsZShwYXRoLmpvaW4od2RhQnVuZGxlUGF0aCwgJ1BsdWdJbnMnLCAnV2ViRHJpdmVyQWdlbnRSdW5uZXIueGN0ZXN0JykpO1xuICAgIHJldHVybiB7d2RhQnVuZGxlSWQsIHRlc3RCdW5kbGVJZCwgd2RhQnVuZGxlUGF0aH07XG4gIH1cblxuICBhc3luYyBmZXRjaFdEQUJ1bmRsZSAoKSB7XG4gICAgaWYgKCF0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJ1bmRsZVdEQVNpbSh0aGlzLnhjb2RlYnVpbGQpO1xuICAgIH1cbiAgICBjb25zdCB3ZGFCdW5kbGVQYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9LyoqLyoke1dEQV9SVU5ORVJfQVBQfS9gLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAoXy5pc0VtcHR5KHdkYUJ1bmRsZVBhdGhzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgV0RBIGJ1bmRsZSBpbiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiB3ZGFCdW5kbGVQYXRoc1swXTtcbiAgfVxuXG4gIGFzeW5jIGlzU291cmNlRnJlc2ggKCkge1xuICAgIGNvbnN0IGV4aXN0c1Byb21pc2VzID0gW1xuICAgICAgJ1Jlc291cmNlcycsXG4gICAgICBgUmVzb3VyY2VzJHtwYXRoLnNlcH1XZWJEcml2ZXJBZ2VudC5idW5kbGVgLFxuICAgIF0ubWFwKChzdWJQYXRoKSA9PiBmcy5leGlzdHMocGF0aC5yZXNvbHZlKHRoaXMuYm9vdHN0cmFwUGF0aCwgc3ViUGF0aCkpKTtcbiAgICByZXR1cm4gKGF3YWl0IEIuYWxsKGV4aXN0c1Byb21pc2VzKSkuc29tZSgodikgPT4gdiA9PT0gZmFsc2UpO1xuICB9XG5cbiAgc2V0dXBQcm94aWVzIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgc2VydmVyOiB0aGlzLnVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHRoaXMudXJsLnBvcnQsXG4gICAgICBiYXNlOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgdGltZW91dDogdGhpcy53ZGFDb25uZWN0aW9uVGltZW91dCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEpXUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLmp3cHJveHkuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuXG4gICAgdGhpcy5ub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eShwcm94eU9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgaWYgKHRoaXMudXNlUHJlaW5zdGFsbGVkV0RBKSB7XG4gICAgICBpZiAodGhpcy54Y3Rlc3RBcGlDbGllbnQpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU3RvcHBpbmcgdGhlIFhDVGVzdCBzZXNzaW9uJyk7XG4gICAgICAgIHRoaXMueGN0ZXN0QXBpQ2xpZW50LnN0b3AoKTtcbiAgICAgICAgdGhpcy54Y3Rlc3RBcGlDbGllbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnU2h1dHRpbmcgZG93biBzdWItcHJvY2Vzc2VzJyk7XG4gICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucXVpdCgpO1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJlc2V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdEbyBub3Qgc3RvcCB4Y29kZWJ1aWxkIG5vciBYQ1Rlc3Qgc2Vzc2lvbiAnICtcbiAgICAgICAgJ3NpbmNlIHRoZSBXREEgc2Vzc2lvbiBpcyBtYW5hZ2VkIGJ5IG91dHNpZGUgdGhpcyBkcml2ZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuandwcm94eSkge1xuICAgICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuYXJncy53ZWJEcml2ZXJBZ2VudFVybCkge1xuICAgICAgLy8gaWYgd2UgcG9wdWxhdGVkIHRoZSB1cmwgb3Vyc2VsdmVzIChkdXJpbmcgYHNldHVwQ2FjaGluZ2AgY2FsbCwgZm9yIGluc3RhbmNlKVxuICAgICAgLy8gdGhlbiBjbGVhbiB0aGF0IHVwLiBJZiB0aGUgdXJsIHdhcyBzdXBwbGllZCwgd2Ugd2FudCB0byBrZWVwIGl0XG4gICAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgICAgICBjb25zdCB7cHJvdG9jb2wsIGhvc3RuYW1lfSA9IHVybC5wYXJzZSh0aGlzLndkYUJhc2VVcmwgfHwgV0RBX0JBU0VfVVJMKTtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsLnBhcnNlKGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX06JHtwb3J0fWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgc2V0IHVybCAoX3VybCkge1xuICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShfdXJsKTtcbiAgfVxuXG4gIGdldCBmdWxseVN0YXJ0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ZWQ7XG4gIH1cblxuICBzZXQgZnVsbHlTdGFydGVkIChzdGFydGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBzdGFydGVkO1xuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmNhblNraXBYY29kZWJ1aWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXVzZSBydW5uaW5nIFdEQSBpZiBpdCBoYXMgdGhlIHNhbWUgYnVuZGxlIGlkIHdpdGggdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBPciByZXVzZSBpdCBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgaWQgd2l0aG91dCB1cGRhdGVkV0RBQnVuZGxlSWQuXG4gICAqIFVuaW5zdGFsbCBpdCBpZiB0aGUgbWV0aG9kIGZhY2VzIGFuIGV4Y2VwdGlvbiBmb3IgdGhlIGFib3ZlIHNpdHVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVwZGF0ZWRXREFCdW5kbGVJZCBCdW5kbGVJZCB5b3UnZCBsaWtlIHRvIHVzZVxuICAgKi9cbiAgYXN5bmMgc2V0dXBDYWNoaW5nICgpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIGlmICghc3RhdHVzIHx8ICFzdGF0dXMuYnVpbGQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdXREEgaXMgY3VycmVudGx5IG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIGNhY2hlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIsXG4gICAgICB1cGdyYWRlZEF0LFxuICAgIH0gPSBzdGF0dXMuYnVpbGQ7XG4gICAgLy8gZm9yIHJlYWwgZGV2aWNlXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmIHV0aWwuaGFzVmFsdWUodGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkICE9PSBwcm9kdWN0QnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCBidW5kbGUgaWQuIFRoZSBhY3R1YWwgdmFsdWUgaXMgJyR7cHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJ9Jy5gKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICAgIH1cbiAgICAvLyBmb3Igc2ltdWxhdG9yXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpICYmICF1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiBXREFfUlVOTkVSX0JVTkRMRV9JRCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0cyBidW5kbGUgaWQgaXMgbm90IGVxdWFsIHRvIHRoZSBkZWZhdWx0IHZhbHVlICR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9YCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudGx5IGJ1bmRsZWQgV0RBOiAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFVwZ3JhZGUgdGltZXN0YW1wIG9mIHRoZSBXREEgb24gdGhlIGRldmljZTogJHt1cGdyYWRlZEF0fWApO1xuICAgIGlmIChhY3R1YWxVcGdyYWRlVGltZXN0YW1wICYmIHVwZ3JhZGVkQXQgJiYgXy50b0xvd2VyKGAke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9YCkgIT09IF8udG9Mb3dlcihgJHt1cGdyYWRlZEF0fWApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdCBoYXMgZGlmZmVyZW50IHZlcnNpb24gaW4gY29tcGFyaXNvbiB0byB0aGUgb25lICcgK1xuICAgICAgICBgd2hpY2ggaXMgYnVuZGxlZCB3aXRoIGFwcGl1bS14Y3VpdGVzdC1kcml2ZXIgbW9kdWxlICgke2FjdHVhbFVwZ3JhZGVUaW1lc3RhbXB9ICE9ICR7dXBncmFkZWRBdH0pYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdXRpbC5oYXNWYWx1ZShwcm9kdWN0QnVuZGxlSWRlbnRpZmllcilcbiAgICAgID8gYFdpbGwgcmV1c2UgcHJldmlvdXNseSBjYWNoZWQgV0RBIGluc3RhbmNlIGF0ICcke3RoaXMudXJsLmhyZWZ9JyB3aXRoICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfSdgXG4gICAgICA6IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfSdgO1xuICAgIHRoaXMubG9nLmluZm8oYCR7bWVzc2FnZX0uIFNldCB0aGUgd2RhTG9jYWxQb3J0IGNhcGFiaWxpdHkgdG8gYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSAke3RoaXMudXJsLnBvcnR9IGlmIHRoaXMgaXMgYW4gdW5kZXNpcmVkIGJlaGF2aW9yLmApO1xuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSB0aGlzLnVybC5ocmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aXQgYW5kIHVuaW5zdGFsbCBydW5uaW5nIFdEQS5cbiAgICovXG4gIGFzeW5jIHF1aXRBbmRVbmluc3RhbGwgKCkge1xuICAgIGF3YWl0IHRoaXMucXVpdCgpO1xuICAgIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2ViRHJpdmVyQWdlbnQ7XG5leHBvcnQgeyBXZWJEcml2ZXJBZ2VudCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLE1BQUEsR0FBQVIsT0FBQTtBQUdBLElBQUFTLFdBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLGFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGtCQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxVQUFBLEdBQUFiLE9BQUE7QUFJQSxJQUFBYyxnQkFBQSxHQUFBZCxPQUFBO0FBQ0EsSUFBQWUsVUFBQSxHQUFBZixPQUFBO0FBRUEsTUFBTWdCLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJ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
@@ -1 +1 @@
1
- {"version":3,"file":"webdriveragent.js","names":["_lodash","_interopRequireDefault","require","_path","_url2","_bluebird","_baseDriver","_support","_logger","_noSessionProxy","_utils","_xcodebuild","_asyncLock","_teen_process","_checkDependencies","_constants","_appiumIosDevice","WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","usePreinstalledWDA","xctestApiClient","xcodebuild","canSkipXcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","bundleIdForXctest","WDA_RUNNER_BUNDLE_ID_FOR_XCTEST","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launchWithPreinstalledWDA","sessionId","xctestEnv","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","Xctest","start","setupProxies","status","launch","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","wdaBundleId","testBundleId","prepareWDA","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","stop","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall","exports","_default","default"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist, mkdirp } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_BUNDLE_ID_FOR_XCTEST, WDA_RUNNER_APP,\n WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\nimport {Xctest} from 'appium-ios-device';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n // this.args.webDriverAgentUrl guiarantees the capabilities acually\n // gave 'appium:webDriverAgentUrl' but 'this.webDriverAgentUrl'\n // could be used for caching WDA with xcodebuild.\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.usePreinstalledWDA = args.usePreinstalledWDA;\n this.xctestApiClient = null;\n\n this.xcodebuild = this.canSkipXcodebuild\n ? null\n : new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n /**\n * Return true if the session does not need xcodebuild.\n * @returns {boolean} Whether the session needs/has xcodebuild.\n */\n get canSkipXcodebuild () {\n // Use this.args.webDriverAgentUrl to guarantee\n // the capabilities set gave the `appium:webDriverAgentUrl`.\n return this.usePreinstalledWDA || this.args.webDriverAgentUrl;\n }\n\n /**\n *\n * @returns {string} Bundle ID for Xctest.\n */\n get bundleIdForXctest () {\n return this.updatedWDABundleId ? `${this.updatedWDABundleId}.xctrunner` : WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n if (this.canSkipXcodebuild) {\n return;\n }\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Launch WDA with preinstalled package without xcodebuild.\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n */\n async launchWithPreinstalledWDA(sessionId) {\n const xctestEnv = {\n USE_PORT: this.wdaLocalPort || WDA_AGENT_PORT,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.bundleIdForXctest\n };\n if (this.mjpegServerPort) {\n xctestEnv.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n this.log.info('Launching WebDriverAgent on the device without xcodebuild');\n this.xctestApiClient = new Xctest(this.device.udid, this.bundleIdForXctest, null, {env: xctestEnv});\n\n await this.xctestApiClient.start();\n\n this.setupProxies(sessionId);\n const status = await this.getStatus();\n this.started = true;\n return status;\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n if (this.usePreinstalledWDA) {\n if (this.isRealDevice) {\n return await this.launchWithPreinstalledWDA(sessionId);\n }\n throw new Error('usePreinstalledWDA is available only for a real device.');\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n if (this.usePreinstalledWDA) {\n if (this.xctestApiClient) {\n this.log.info('Stopping the XCTest session');\n this.xctestApiClient.stop();\n this.xctestApiClient = null;\n }\n } else if (!this.args.webDriverAgentUrl) {\n this.log.info('Shutting down sub-processes');\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n } else {\n this.log.debug('Do not stop xcodebuild nor XCTest session ' +\n 'since the WDA session is managed by outside this driver.');\n }\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n if (this.canSkipXcodebuild) {\n return;\n }\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}
1
+ {"version":3,"file":"webdriveragent.js","names":["_lodash","_interopRequireDefault","require","_path","_url2","_bluebird","_baseDriver","_support","_logger","_noSessionProxy","_utils","_xcodebuild","_asyncLock","_teen_process","_checkDependencies","_constants","_appiumIosDevice","_strongbox","WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","RECENT_MODULE_VERSION_ITEM_NAME","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","usePreinstalledWDA","xctestApiClient","xcodebuild","canSkipXcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","bundleIdForXctest","WDA_RUNNER_BUNDLE_ID_FOR_XCTEST","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","packageInfo","JSON","parse","fs","readFile","join","box","strongbox","name","boxItem","getItem","timestampPath","process","env","HOME","WDA_UPGRADE_TIMESTAMP_PATH","exists","createItemWithContents","version","recentModuleVersion","read","util","coerceVersion","write","compareVersions","cleanProject","launchWithPreinstalledWDA","sessionId","xctestEnv","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","Xctest","start","setupProxies","status","launch","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","wdaBundleId","testBundleId","prepareWDA","runXCUITest","parseBundleId","infoPlistPath","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","stop","reset","_url","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","build","productBundleIdentifier","upgradedAt","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","getWDAUpgradeTimestamp","toLower","quitAndUninstall","exports","_default","default"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_BUNDLE_ID_FOR_XCTEST, WDA_RUNNER_APP,\n WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH\n} from './constants';\nimport {Xctest} from 'appium-ios-device';\nimport {strongbox} from '@appium/strongbox';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\nconst RECENT_MODULE_VERSION_ITEM_NAME = 'recentWdaModuleVersion';\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n // this.args.webDriverAgentUrl guiarantees the capabilities acually\n // gave 'appium:webDriverAgentUrl' but 'this.webDriverAgentUrl'\n // could be used for caching WDA with xcodebuild.\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.usePreinstalledWDA = args.usePreinstalledWDA;\n this.xctestApiClient = null;\n\n this.xcodebuild = this.canSkipXcodebuild\n ? null\n : new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n /**\n * Return true if the session does not need xcodebuild.\n * @returns {boolean} Whether the session needs/has xcodebuild.\n */\n get canSkipXcodebuild () {\n // Use this.args.webDriverAgentUrl to guarantee\n // the capabilities set gave the `appium:webDriverAgentUrl`.\n return this.usePreinstalledWDA || this.args.webDriverAgentUrl;\n }\n\n /**\n *\n * @returns {string} Bundle ID for Xctest.\n */\n get bundleIdForXctest () {\n return this.updatedWDABundleId ? `${this.updatedWDABundleId}.xctrunner` : WDA_RUNNER_BUNDLE_ID_FOR_XCTEST;\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n if (this.canSkipXcodebuild) {\n return;\n }\n\n const packageInfo = JSON.parse(await fs.readFile(path.join(BOOTSTRAP_PATH, 'package.json'), 'utf8'));\n const box = strongbox(packageInfo.name);\n let boxItem = box.getItem(RECENT_MODULE_VERSION_ITEM_NAME);\n if (!boxItem) {\n const timestampPath = path.resolve(process.env.HOME, WDA_UPGRADE_TIMESTAMP_PATH);\n if (await fs.exists(timestampPath)) {\n // TODO: It is probably a bit ugly to hardcode the recent version string,\n // TODO: hovewer it should do the job as a temporary transition trick\n // TODO: to switch from a hardcoded file path to the strongbox usage.\n try {\n boxItem = await box.createItemWithContents(RECENT_MODULE_VERSION_ITEM_NAME, '5.0.0');\n } catch (e) {\n this.log.warn(`The actual module version cannot be persisted: ${e.message}`);\n return;\n }\n } else {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n try {\n await box.createItemWithContents(RECENT_MODULE_VERSION_ITEM_NAME, packageInfo.version);\n } catch (e) {\n this.log.warn(`The actual module version cannot be persisted: ${e.message}`);\n }\n return;\n }\n }\n\n let recentModuleVersion = await boxItem.read();\n try {\n recentModuleVersion = util.coerceVersion(recentModuleVersion, true);\n } catch (e) {\n this.log.warn(`The persisted module version string has been damaged: ${e.message}`);\n this.log.info(`Updating it to '${packageInfo.version}' assuming the project clenup is not needed`);\n await boxItem.write(packageInfo.version);\n return;\n }\n\n if (util.compareVersions(recentModuleVersion, '>=', packageInfo.version)) {\n this.log.info(\n `WebDriverAgent does not need a cleanup. The project sources are up to date ` +\n `(${recentModuleVersion} >= ${packageInfo.version})`\n );\n return;\n }\n\n this.log.info(\n `Cleaning up the WebDriverAgent project after the module upgrade has happened ` +\n `(${recentModuleVersion} < ${packageInfo.version})`\n );\n try {\n await this.xcodebuild.cleanProject();\n await boxItem.write(packageInfo.version);\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Launch WDA with preinstalled package without xcodebuild.\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n */\n async launchWithPreinstalledWDA(sessionId) {\n const xctestEnv = {\n USE_PORT: this.wdaLocalPort || WDA_AGENT_PORT,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.bundleIdForXctest\n };\n if (this.mjpegServerPort) {\n xctestEnv.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n this.log.info('Launching WebDriverAgent on the device without xcodebuild');\n this.xctestApiClient = new Xctest(this.device.udid, this.bundleIdForXctest, null, {env: xctestEnv});\n\n await this.xctestApiClient.start();\n\n this.setupProxies(sessionId);\n const status = await this.getStatus();\n this.started = true;\n return status;\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n if (this.usePreinstalledWDA) {\n if (this.isRealDevice) {\n return await this.launchWithPreinstalledWDA(sessionId);\n }\n throw new Error('usePreinstalledWDA is available only for a real device.');\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n if (this.usePreinstalledWDA) {\n if (this.xctestApiClient) {\n this.log.info('Stopping the XCTest session');\n this.xctestApiClient.stop();\n this.xctestApiClient = null;\n }\n } else if (!this.args.webDriverAgentUrl) {\n this.log.info('Shutting down sub-processes');\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n } else {\n this.log.debug('Do not stop xcodebuild nor XCTest session ' +\n 'since the WDA session is managed by outside this driver.');\n }\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n if (this.canSkipXcodebuild) {\n return;\n }\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,SAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAL,OAAA;AACA,IAAAM,OAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,eAAA,GAAAP,OAAA;AACA,IAAAQ,MAAA,GAAAR,OAAA;AAGA,IAAAS,WAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,UAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,aAAA,GAAAX,OAAA;AACA,IAAAY,kBAAA,GAAAZ,OAAA;AACA,IAAAa,UAAA,GAAAb,OAAA;AAIA,IAAAc,gBAAA,GAAAd,OAAA;AACA,IAAAe,UAAA,GAAAf,OAAA;AAEA,MAAMgB,kBAAkB,GAAG,EAAE,GAAG,IAAI;AACpC,MAAMC,cAAc,GAAG,IAAI;AAC3B,MAAMC,kBAAkB,GAAG,6BAA6B;AACxD,MAAMC,sBAAsB,GAAG,IAAIC,kBAAS,CAAC,CAAC;AAC9C,MAAMC,+BAA+B,GAAG,wBAAwB;AAEhE,MAAMC,cAAc,CAAC;EACnBC,WAAWA,CAAEC,YAAY,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAEC,GAAG,GAAG,IAAI,EAAE;IAChD,IAAI,CAACF,YAAY,GAAGA,YAAY;IAEhC,IAAI,CAACC,IAAI,GAAGE,eAAC,CAACC,KAAK,CAACH,IAAI,CAAC;IACzB,IAAI,CAACC,GAAG,GAAGA,GAAG,IAAIG,eAAa;IAE/B,IAAI,CAACC,MAAM,GAAGL,IAAI,CAACK,MAAM;IACzB,IAAI,CAACC,eAAe,GAAGN,IAAI,CAACM,eAAe;IAC3C,IAAI,CAACC,YAAY,GAAGP,IAAI,CAACO,YAAY;IACrC,IAAI,CAACC,aAAa,GAAGR,IAAI,CAACQ,aAAa;IACvC,IAAI,CAACC,IAAI,GAAGT,IAAI,CAACS,IAAI;IACrB,IAAI,CAACC,YAAY,GAAG,CAAC,CAACV,IAAI,CAACW,UAAU;IACrC,IAAI,CAACC,GAAG,GAAG,CAACZ,IAAI,CAACK,MAAM,IAAI,CAAC,CAAC,EAAEO,GAAG;IAClC,IAAI,CAACC,aAAa,GAAGb,IAAI,CAACa,aAAa;IAEvC,IAAI,CAACC,WAAW,CAACd,IAAI,CAACe,aAAa,EAAEf,IAAI,CAACgB,SAAS,CAAC;IAEpD,IAAI,CAACC,YAAY,GAAGjB,IAAI,CAACiB,YAAY;IACrC,IAAI,CAACC,aAAa,GAAGlB,IAAI,CAACiB,YAAY,IAAIzB,cAAc;IACxD,IAAI,CAAC2B,UAAU,GAAGnB,IAAI,CAACmB,UAAU,IAAIC,uBAAY;IAEjD,IAAI,CAACC,WAAW,GAAGrB,IAAI,CAACqB,WAAW;IAKnC,IAAI,CAACC,iBAAiB,GAAGtB,IAAI,CAACsB,iBAAiB;IAE/C,IAAI,CAACC,OAAO,GAAG,KAAK;IAEpB,IAAI,CAACC,oBAAoB,GAAGxB,IAAI,CAACwB,oBAAoB;IAErD,IAAI,CAACC,gBAAgB,GAAGzB,IAAI,CAACyB,gBAAgB;IAC7C,IAAI,CAACC,cAAc,GAAG1B,IAAI,CAAC0B,cAAc;IACzC,IAAI,CAACC,eAAe,GAAG3B,IAAI,CAAC2B,eAAe;IAC3C,IAAI,CAACC,eAAe,GAAG5B,IAAI,CAAC4B,eAAe;IAE3C,IAAI,CAACC,kBAAkB,GAAG7B,IAAI,CAAC6B,kBAAkB;IAEjD,IAAI,CAACC,kBAAkB,GAAG9B,IAAI,CAAC8B,kBAAkB;IACjD,IAAI,CAACC,eAAe,GAAG,IAAI;IAE3B,IAAI,CAACC,UAAU,GAAG,IAAI,CAACC,iBAAiB,GACtC,IAAI,GACJ,IAAIC,mBAAU,CAAC,IAAI,CAACnC,YAAY,EAAE,IAAI,CAACM,MAAM,EAAE;MAC7CC,eAAe,EAAE,IAAI,CAACA,eAAe;MACrCC,YAAY,EAAE,IAAI,CAACA,YAAY;MAC/BC,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCQ,SAAS,EAAE,IAAI,CAACA,SAAS;MACzBD,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCJ,UAAU,EAAE,IAAI,CAACD,YAAY;MAC7ByB,YAAY,EAAEnC,IAAI,CAACmC,YAAY;MAC/BC,eAAe,EAAEpC,IAAI,CAACoC,eAAe;MACrCC,UAAU,EAAErC,IAAI,CAACqC,UAAU;MAC3BC,cAAc,EAAEtC,IAAI,CAACsC,cAAc;MACnCC,YAAY,EAAEvC,IAAI,CAACuC,YAAY;MAC/BC,gBAAgB,EAAExC,IAAI,CAACwC,gBAAgB;MACvCC,kBAAkB,EAAEzC,IAAI,CAACyC,kBAAkB;MAC3Cf,cAAc,EAAE1B,IAAI,CAAC0B,cAAc;MACnCG,kBAAkB,EAAE,IAAI,CAACA,kBAAkB;MAC3Ca,aAAa,EAAE1C,IAAI,CAAC2C,gBAAgB,IAAIpD,kBAAkB;MAC1D2B,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCO,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;MACvCE,eAAe,EAAE3B,IAAI,CAAC2B,eAAe;MACrCC,eAAe,EAAE,IAAI,CAACA,eAAe;MACrCgB,mCAAmC,EAAE5C,IAAI,CAAC4C,mCAAmC;MAC7EC,gBAAgB,EAAE7C,IAAI,CAAC6C,gBAAgB;MACvCC,mBAAmB,EAAE9C,IAAI,CAAC8C;IAC5B,CAAC,EAAE,IAAI,CAAC7C,GAAG,CAAC;EAChB;EAMA,IAAIgC,iBAAiBA,CAAA,EAAI;IAGvB,OAAO,IAAI,CAACH,kBAAkB,IAAI,IAAI,CAAC9B,IAAI,CAACsB,iBAAiB;EAC/D;EAMA,IAAIyB,iBAAiBA,CAAA,EAAI;IACvB,OAAO,IAAI,CAAClB,kBAAkB,GAAI,GAAE,IAAI,CAACA,kBAAmB,YAAW,GAAGmB,0CAA+B;EAC3G;EAEAlC,WAAWA,CAAEC,aAAa,EAAEC,SAAS,EAAE;IAGrC,IAAI,CAACD,aAAa,GAAGA,aAAa,IAAIkC,qBAAc;IACpD,IAAI,CAAChD,GAAG,CAACiD,IAAI,CAAE,oBAAmB,IAAI,CAACnC,aAAc,GAAE,CAAC;IAGxD,IAAI,CAACC,SAAS,GAAGA,SAAS,IAAImC,aAAI,CAACC,OAAO,CAAC,IAAI,CAACrC,aAAa,EAAE,0BAA0B,CAAC;IAC1F,IAAI,CAACd,GAAG,CAACiD,IAAI,CAAE,qBAAoB,IAAI,CAAClC,SAAU,GAAE,CAAC;EACvD;EAEA,MAAMqC,wBAAwBA,CAAA,EAAI;IAChC,MAAMC,YAAY,GAAG,MAAM,IAAAC,6BAAsB,EAAC,IAAI,CAACC,GAAG,CAACC,IAAI,EAC5DC,OAAO,IAAKA,OAAO,CAACC,QAAQ,CAAC,uBAAuB,CAAC,IACpD,CAACD,OAAO,CAACE,WAAW,CAAC,CAAC,CAACD,QAAQ,CAAC,IAAI,CAACtD,MAAM,CAACwD,IAAI,CAACD,WAAW,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAI1D,eAAC,CAAC4D,OAAO,CAACR,YAAY,CAAC,EAAE;MAC3B,IAAI,CAACrD,GAAG,CAAC8D,KAAK,CAAE,0DAAyD,GACtE,qBAAoB,IAAI,CAACP,GAAG,CAACC,IAAK,kBAAiB,CAAC;MACvD;IACF;IAEA,IAAI,CAACxD,GAAG,CAACiD,IAAI,CAAE,YAAWI,YAAY,CAACU,MAAO,2BAA0BV,YAAY,CAACU,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,IAAK,GAAE,GAC7G,8CAA6C,CAAC;IACjD,IAAI;MACF,MAAM,IAAAC,kBAAI,EAAC,MAAM,EAAEX,YAAY,CAAC;IAClC,CAAC,CAAC,OAAOY,CAAC,EAAE;MACV,IAAI,CAACjE,GAAG,CAACkE,IAAI,CAAE,yCAAwCb,YAAY,CAACU,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,IAAK,KAAIV,YAAa,KAAI,GAC/G,mBAAkBY,CAAC,CAACE,OAAQ,EAAC,CAAC;IACnC;EACF;EAOA,MAAMC,SAASA,CAAA,EAAI;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAACC,SAAS,CAAC,CAAC,CAAC;EACnC;EAEA,IAAIC,QAAQA,CAAA,EAAI;IACd,IAAI,IAAI,CAACf,GAAG,CAACL,IAAI,KAAK,GAAG,EAAE;MACzB,OAAO,EAAE;IACX;IACA,OAAO,IAAI,CAACK,GAAG,CAACL,IAAI,IAAI,EAAE;EAC5B;EAwBA,MAAMmB,SAASA,CAAA,EAAI;IACjB,MAAME,cAAc,GAAG,IAAIC,8BAAc,CAAC;MACxCC,MAAM,EAAE,IAAI,CAAClB,GAAG,CAACmB,QAAQ;MACzBlB,IAAI,EAAE,IAAI,CAACD,GAAG,CAACC,IAAI;MACnBmB,IAAI,EAAE,IAAI,CAACL,QAAQ;MACnBM,OAAO,EAAE;IACX,CAAC,CAAC;IACF,IAAI;MACF,OAAO,MAAML,cAAc,CAACM,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;IACvD,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,IAAI,CAAC9E,GAAG,CAAC8D,KAAK,CAAE,4BAA2B,IAAI,CAACP,GAAG,CAACwB,IAAK,GAAE,CAAC;MAC5D,OAAO,IAAI;IACb;EACF;EAOA,MAAMC,SAASA,CAAA,EAAI;IACjB,IAAI;MACF,MAAMC,SAAS,GAAG,MAAM,IAAI,CAAC7E,MAAM,CAAC8E,qCAAqC,CAAC1F,kBAAkB,CAAC;MAC7F,IAAIS,eAAC,CAAC4D,OAAO,CAACoB,SAAS,CAAC,EAAE;QACxB,IAAI,CAACjF,GAAG,CAAC8D,KAAK,CAAC,wBAAwB,CAAC;QACxC;MACF;MAEA,IAAI,CAAC9D,GAAG,CAAC8D,KAAK,CAAE,uBAAsBmB,SAAU,GAAE,CAAC;MACnD,KAAK,MAAME,QAAQ,IAAIF,SAAS,EAAE;QAChC,MAAM,IAAI,CAAC7E,MAAM,CAACgF,SAAS,CAACD,QAAQ,CAAC;MACvC;IACF,CAAC,CAAC,OAAOlB,CAAC,EAAE;MACV,IAAI,CAACjE,GAAG,CAAC8D,KAAK,CAACG,CAAC,CAAC;MACjB,IAAI,CAACjE,GAAG,CAACkE,IAAI,CAAE,uEAAsE,GAClF,mBAAkBD,CAAC,CAACE,OAAQ,EAAC,CAAC;IACnC;EACF;EAEA,MAAMkB,sBAAsBA,CAAA,EAAI;IAC9B,IAAI,IAAI,CAACrD,iBAAiB,EAAE;MAC1B;IACF;IAEA,MAAMsD,WAAW,GAAGC,IAAI,CAACC,KAAK,CAAC,MAAMC,WAAE,CAACC,QAAQ,CAACxC,aAAI,CAACyC,IAAI,CAAC3C,qBAAc,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACpG,MAAM4C,GAAG,GAAG,IAAAC,oBAAS,EAACP,WAAW,CAACQ,IAAI,CAAC;IACvC,IAAIC,OAAO,GAAGH,GAAG,CAACI,OAAO,CAACrG,+BAA+B,CAAC;IAC1D,IAAI,CAACoG,OAAO,EAAE;MACZ,MAAME,aAAa,GAAG/C,aAAI,CAACC,OAAO,CAAC+C,OAAO,CAACC,GAAG,CAACC,IAAI,EAAEC,qCAA0B,CAAC;MAChF,IAAI,MAAMZ,WAAE,CAACa,MAAM,CAACL,aAAa,CAAC,EAAE;QAIlC,IAAI;UACFF,OAAO,GAAG,MAAMH,GAAG,CAACW,sBAAsB,CAAC5G,+BAA+B,EAAE,OAAO,CAAC;QACtF,CAAC,CAAC,OAAOsE,CAAC,EAAE;UACV,IAAI,CAACjE,GAAG,CAACkE,IAAI,CAAE,kDAAiDD,CAAC,CAACE,OAAQ,EAAC,CAAC;UAC5E;QACF;MACF,CAAC,MAAM;QACL,IAAI,CAACnE,GAAG,CAACiD,IAAI,CAAC,oFAAoF,CAAC;QACnG,IAAI;UACF,MAAM2C,GAAG,CAACW,sBAAsB,CAAC5G,+BAA+B,EAAE2F,WAAW,CAACkB,OAAO,CAAC;QACxF,CAAC,CAAC,OAAOvC,CAAC,EAAE;UACV,IAAI,CAACjE,GAAG,CAACkE,IAAI,CAAE,kDAAiDD,CAAC,CAACE,OAAQ,EAAC,CAAC;QAC9E;QACA;MACF;IACF;IAEA,IAAIsC,mBAAmB,GAAG,MAAMV,OAAO,CAACW,IAAI,CAAC,CAAC;IAC9C,IAAI;MACFD,mBAAmB,GAAGE,aAAI,CAACC,aAAa,CAACH,mBAAmB,EAAE,IAAI,CAAC;IACrE,CAAC,CAAC,OAAOxC,CAAC,EAAE;MACV,IAAI,CAACjE,GAAG,CAACkE,IAAI,CAAE,yDAAwDD,CAAC,CAACE,OAAQ,EAAC,CAAC;MACnF,IAAI,CAACnE,GAAG,CAACiD,IAAI,CAAE,mBAAkBqC,WAAW,CAACkB,OAAQ,6CAA4C,CAAC;MAClG,MAAMT,OAAO,CAACc,KAAK,CAACvB,WAAW,CAACkB,OAAO,CAAC;MACxC;IACF;IAEA,IAAIG,aAAI,CAACG,eAAe,CAACL,mBAAmB,EAAE,IAAI,EAAEnB,WAAW,CAACkB,OAAO,CAAC,EAAE;MACxE,IAAI,CAACxG,GAAG,CAACiD,IAAI,CACV,6EAA4E,GAC5E,IAAGwD,mBAAoB,OAAMnB,WAAW,CAACkB,OAAQ,GACpD,CAAC;MACD;IACF;IAEA,IAAI,CAACxG,GAAG,CAACiD,IAAI,CACV,+EAA8E,GAC9E,IAAGwD,mBAAoB,MAAKnB,WAAW,CAACkB,OAAQ,GACnD,CAAC;IACD,IAAI;MACF,MAAM,IAAI,CAACzE,UAAU,CAACgF,YAAY,CAAC,CAAC;MACpC,MAAMhB,OAAO,CAACc,KAAK,CAACvB,WAAW,CAACkB,OAAO,CAAC;IAC1C,CAAC,CAAC,OAAOvC,CAAC,EAAE;MACV,IAAI,CAACjE,GAAG,CAACkE,IAAI,CAAE,kEAAiED,CAAC,CAACE,OAAQ,EAAC,CAAC;IAC9F;EACF;EAOA,MAAM6C,yBAAyBA,CAACC,SAAS,EAAE;IACzC,MAAMC,SAAS,GAAG;MAChBC,QAAQ,EAAE,IAAI,CAACnG,YAAY,IAAIzB,cAAc;MAC7C6H,6BAA6B,EAAE,IAAI,CAACtE;IACtC,CAAC;IACD,IAAI,IAAI,CAACnB,eAAe,EAAE;MACxBuF,SAAS,CAACG,iBAAiB,GAAG,IAAI,CAAC1F,eAAe;IACpD;IACA,IAAI,CAAC3B,GAAG,CAACiD,IAAI,CAAC,2DAA2D,CAAC;IAC1E,IAAI,CAACnB,eAAe,GAAG,IAAIwF,uBAAM,CAAC,IAAI,CAAClH,MAAM,CAACwD,IAAI,EAAE,IAAI,CAACd,iBAAiB,EAAE,IAAI,EAAE;MAACqD,GAAG,EAAEe;IAAS,CAAC,CAAC;IAEnG,MAAM,IAAI,CAACpF,eAAe,CAACyF,KAAK,CAAC,CAAC;IAElC,IAAI,CAACC,YAAY,CAACP,SAAS,CAAC;IAC5B,MAAMQ,MAAM,GAAG,MAAM,IAAI,CAACpD,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC/C,OAAO,GAAG,IAAI;IACnB,OAAOmG,MAAM;EACf;EAyBA,MAAMC,MAAMA,CAAET,SAAS,EAAE;IACvB,IAAI,IAAI,CAAC5F,iBAAiB,EAAE;MAC1B,IAAI,CAACrB,GAAG,CAACiD,IAAI,CAAE,qCAAoC,IAAI,CAAC5B,iBAAkB,GAAE,CAAC;MAC7E,IAAI,CAACkC,GAAG,GAAG,IAAI,CAAClC,iBAAiB;MACjC,IAAI,CAACmG,YAAY,CAACP,SAAS,CAAC;MAC5B,OAAO,MAAM,IAAI,CAAC5C,SAAS,CAAC,CAAC;IAC/B;IAEA,IAAI,IAAI,CAACxC,kBAAkB,EAAE;MAC3B,IAAI,IAAI,CAACpB,YAAY,EAAE;QACrB,OAAO,MAAM,IAAI,CAACuG,yBAAyB,CAACC,SAAS,CAAC;MACxD;MACA,MAAM,IAAIU,KAAK,CAAC,yDAAyD,CAAC;IAC5E;IAEA,IAAI,CAAC3H,GAAG,CAACiD,IAAI,CAAC,wCAAwC,CAAC;IAEvD,IAAI,CAACuE,YAAY,CAACP,SAAS,CAAC;IAE5B,IAAI,CAAC,IAAI,CAACzF,gBAAgB,IAAI,EAAC,MAAMiE,WAAE,CAACa,MAAM,CAAC,IAAI,CAACvF,SAAS,CAAC,GAAE;MAC9D,MAAM,IAAI4G,KAAK,CAAE,4CAA2C,IAAI,CAAC5G,SAAU,YAAW,GACtE,qBAAqB,CAAC;IACxC;IAIA,IAAI,IAAI,CAACJ,GAAG,IAAI,IAAI,CAACa,gBAAgB,IAAK,IAAI,CAACE,eAAe,IAAI,IAAI,CAACD,cAAe,EAAE;MACtF,IAAI,CAACzB,GAAG,CAACiD,IAAI,CAAC,oEAAoE,CAAC;IACrF,CAAC,MAAM;MACL,MAAM2E,kBAAkB,GAAG1E,aAAI,CAAC2E,SAAS,CAAC,IAAI,CAAC/G,aAAa,CAAC;MAC7D,MAAMrB,sBAAsB,CAACqI,OAAO,CAACF,kBAAkB,EACrD,YAAY,MAAM,IAAI,CAACvC,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAGA,MAAM,IAAA0C,yBAAkB,EAAC,IAAI,CAAC3H,MAAM,CAACwD,IAAI,EAAE,CAAC,IAAI,CAACnD,YAAY,CAAC;IAE9D,IAAI,IAAI,CAACE,GAAG,EAAE;MACZ,OAAO,MAAM,IAAI,CAACqH,YAAY,CAAC,CAAC;IAClC;IAEA,MAAM,IAAI,CAACjG,UAAU,CAACkG,IAAI,CAAC,IAAI,CAAC1D,cAAc,CAAC;IAG/C,IAAI,IAAI,CAACnD,WAAW,EAAE;MACpB,MAAM,IAAI,CAACW,UAAU,CAACmG,QAAQ,CAAC,CAAC;IAClC;IACA,OAAO,MAAM,IAAI,CAACnG,UAAU,CAACwF,KAAK,CAAC,CAAC;EACtC;EAEA,MAAMS,YAAYA,CAAA,EAAI;IACpB,IAAI,CAAChI,GAAG,CAACiD,IAAI,CAAC,wFAAwF,CAAC;IACvG,MAAM;MAACkF,WAAW;MAAEC;IAAY,CAAC,GAAG,MAAM,IAAI,CAACC,UAAU,CAAC,CAAC;IAC3D,MAAMlC,GAAG,GAAG;MACVgB,QAAQ,EAAE,IAAI,CAAClG,aAAa;MAC5BmG,6BAA6B,EAAE,IAAI,CAACxF;IACtC,CAAC;IACD,IAAI,IAAI,CAACD,eAAe,EAAE;MACxBwE,GAAG,CAACkB,iBAAiB,GAAG,IAAI,CAAC1F,eAAe;IAC9C;IAEA,OAAO,MAAM,IAAI,CAAChB,GAAG,CAAC2H,WAAW,CAACH,WAAW,EAAEA,WAAW,EAAEC,YAAY,EAAE;MAACjC;IAAG,CAAC,CAAC;EAClF;EAEA,MAAMoC,aAAaA,CAAE3H,aAAa,EAAE;IAClC,MAAM4H,aAAa,GAAGtF,aAAI,CAACyC,IAAI,CAAC/E,aAAa,EAAE,YAAY,CAAC;IAC5D,MAAM6H,SAAS,GAAG,MAAMC,cAAK,CAACC,UAAU,CAAC,MAAMlD,WAAE,CAACC,QAAQ,CAAC8C,aAAa,CAAC,CAAC;IAC1E,IAAI,CAACC,SAAS,CAACG,kBAAkB,EAAE;MACjC,MAAM,IAAIjB,KAAK,CAAE,gCAA+Ba,aAAc,GAAE,CAAC;IACnE;IACA,OAAOC,SAAS,CAACG,kBAAkB;EACrC;EAEA,MAAMP,UAAUA,CAAA,EAAI;IAClB,MAAMzH,aAAa,GAAG,IAAI,CAACA,aAAa,KAAI,MAAM,IAAI,CAACiI,cAAc,CAAC,CAAC;IACvE,MAAMV,WAAW,GAAG,MAAM,IAAI,CAACI,aAAa,CAAC3H,aAAa,CAAC;IAC3D,IAAI,EAAC,MAAM,IAAI,CAACR,MAAM,CAAC0I,cAAc,CAACX,WAAW,CAAC,GAAE;MAClD,MAAM,IAAI,CAAC/H,MAAM,CAAC2I,UAAU,CAACnI,aAAa,CAAC;IAC7C;IACA,MAAMwH,YAAY,GAAG,MAAM,IAAI,CAACzH,GAAG,CAACqI,mBAAmB,CAAC9F,aAAI,CAACyC,IAAI,CAAC/E,aAAa,EAAE,SAAS,EAAE,6BAA6B,CAAC,CAAC;IAC3H,OAAO;MAACuH,WAAW;MAAEC,YAAY;MAAExH;IAAa,CAAC;EACnD;EAEA,MAAMiI,cAAcA,CAAA,EAAI;IACtB,IAAI,CAAC,IAAI,CAACnH,eAAe,EAAE;MACzB,OAAO,MAAM,IAAAuH,+BAAY,EAAC,IAAI,CAAClH,UAAU,CAAC;IAC5C;IACA,MAAMmH,cAAc,GAAG,MAAMzD,WAAE,CAAC0D,IAAI,CAAE,GAAE,IAAI,CAACzH,eAAgB,QAAO0H,yBAAe,GAAE,EAAE;MACrFC,QAAQ,EAAE;IACZ,CAAC,CAAC;IACF,IAAIpJ,eAAC,CAAC4D,OAAO,CAACqF,cAAc,CAAC,EAAE;MAC7B,MAAM,IAAIvB,KAAK,CAAE,qCAAoC,IAAI,CAACjG,eAAgB,GAAE,CAAC;IAC/E;IACA,OAAOwH,cAAc,CAAC,CAAC,CAAC;EAC1B;EAEA,MAAMI,aAAaA,CAAA,EAAI;IACrB,MAAMC,cAAc,GAAG,CACrB,WAAW,EACV,YAAWrG,aAAI,CAACsG,GAAI,uBAAsB,CAC5C,CAACC,GAAG,CAAEC,OAAO,IAAKjE,WAAE,CAACa,MAAM,CAACpD,aAAI,CAACC,OAAO,CAAC,IAAI,CAACrC,aAAa,EAAE4I,OAAO,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,MAAMC,iBAAC,CAACC,GAAG,CAACL,cAAc,CAAC,EAAEM,IAAI,CAAEC,CAAC,IAAKA,CAAC,KAAK,KAAK,CAAC;EAC/D;EAEAtC,YAAYA,CAAEP,SAAS,EAAE;IACvB,MAAM8C,SAAS,GAAG;MAChB/J,GAAG,EAAE,IAAI,CAACA,GAAG;MACbyE,MAAM,EAAE,IAAI,CAAClB,GAAG,CAACmB,QAAQ;MACzBlB,IAAI,EAAE,IAAI,CAACD,GAAG,CAACC,IAAI;MACnBmB,IAAI,EAAE,IAAI,CAACL,QAAQ;MACnBM,OAAO,EAAE,IAAI,CAACrD,oBAAoB;MAClCyI,SAAS,EAAE;IACb,CAAC;IAED,IAAI,CAACC,OAAO,GAAG,IAAIC,mBAAO,CAACH,SAAS,CAAC;IACrC,IAAI,CAACE,OAAO,CAAChD,SAAS,GAAGA,SAAS;IAClC,IAAI,CAACkD,WAAW,GAAG,IAAI,CAACF,OAAO,CAACE,WAAW,CAACC,IAAI,CAAC,IAAI,CAACH,OAAO,CAAC;IAE9D,IAAI,CAAC1F,cAAc,GAAG,IAAIC,8BAAc,CAACuF,SAAS,CAAC;EACrD;EAEA,MAAMM,IAAIA,CAAA,EAAI;IACZ,IAAI,IAAI,CAACxI,kBAAkB,EAAE;MAC3B,IAAI,IAAI,CAACC,eAAe,EAAE;QACxB,IAAI,CAAC9B,GAAG,CAACiD,IAAI,CAAC,6BAA6B,CAAC;QAC5C,IAAI,CAACnB,eAAe,CAACwI,IAAI,CAAC,CAAC;QAC3B,IAAI,CAACxI,eAAe,GAAG,IAAI;MAC7B;IACF,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC/B,IAAI,CAACsB,iBAAiB,EAAE;MACvC,IAAI,CAACrB,GAAG,CAACiD,IAAI,CAAC,6BAA6B,CAAC;MAC5C,MAAM,IAAI,CAAClB,UAAU,CAACsI,IAAI,CAAC,CAAC;MAC5B,MAAM,IAAI,CAACtI,UAAU,CAACwI,KAAK,CAAC,CAAC;IAC/B,CAAC,MAAM;MACL,IAAI,CAACvK,GAAG,CAAC8D,KAAK,CAAC,4CAA4C,GACzD,0DAA0D,CAAC;IAC/D;IAEA,IAAI,IAAI,CAACmG,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,CAAChD,SAAS,GAAG,IAAI;IAC/B;IAEA,IAAI,CAAC3F,OAAO,GAAG,KAAK;IAEpB,IAAI,CAAC,IAAI,CAACvB,IAAI,CAACsB,iBAAiB,EAAE;MAGhC,IAAI,CAACA,iBAAiB,GAAG,IAAI;IAC/B;EACF;EAEA,IAAIkC,GAAGA,CAAA,EAAI;IACT,IAAI,CAAC,IAAI,CAACiH,IAAI,EAAE;MACd,IAAI,IAAI,CAACnJ,iBAAiB,EAAE;QAC1B,IAAI,CAACmJ,IAAI,GAAGjH,aAAG,CAACiC,KAAK,CAAC,IAAI,CAACnE,iBAAiB,CAAC;MAC/C,CAAC,MAAM;QACL,MAAMmC,IAAI,GAAG,IAAI,CAACxC,YAAY,IAAIzB,cAAc;QAChD,MAAM;UAACkL,QAAQ;UAAE/F;QAAQ,CAAC,GAAGnB,aAAG,CAACiC,KAAK,CAAC,IAAI,CAACtE,UAAU,IAAIC,uBAAY,CAAC;QACvE,IAAI,CAACqJ,IAAI,GAAGjH,aAAG,CAACiC,KAAK,CAAE,GAAEiF,QAAS,KAAI/F,QAAS,IAAGlB,IAAK,EAAC,CAAC;MAC3D;IACF;IACA,OAAO,IAAI,CAACgH,IAAI;EAClB;EAEA,IAAIjH,GAAGA,CAAEiH,IAAI,EAAE;IACb,IAAI,CAACA,IAAI,GAAGjH,aAAG,CAACiC,KAAK,CAACgF,IAAI,CAAC;EAC7B;EAEA,IAAIE,YAAYA,CAAA,EAAI;IAClB,OAAO,IAAI,CAACpJ,OAAO;EACrB;EAEA,IAAIoJ,YAAYA,CAAEpJ,OAAO,GAAG,KAAK,EAAE;IACjC,IAAI,CAACA,OAAO,GAAGA,OAAO;EACxB;EAEA,MAAMqJ,uBAAuBA,CAAA,EAAI;IAC/B,IAAI,IAAI,CAAC3I,iBAAiB,EAAE;MAC1B;IACF;IACA,OAAO,MAAM,IAAI,CAACD,UAAU,CAAC4I,uBAAuB,CAAC,CAAC;EACxD;EASA,MAAMC,YAAYA,CAAA,EAAI;IACpB,MAAMnD,MAAM,GAAG,MAAM,IAAI,CAACpD,SAAS,CAAC,CAAC;IACrC,IAAI,CAACoD,MAAM,IAAI,CAACA,MAAM,CAACoD,KAAK,EAAE;MAC5B,IAAI,CAAC7K,GAAG,CAAC8D,KAAK,CAAC,yDAAyD,CAAC;MACzE;IACF;IAEA,MAAM;MACJgH,uBAAuB;MACvBC;IACF,CAAC,GAAGtD,MAAM,CAACoD,KAAK;IAEhB,IAAIlE,aAAI,CAACqE,QAAQ,CAACF,uBAAuB,CAAC,IAAInE,aAAI,CAACqE,QAAQ,CAAC,IAAI,CAACpJ,kBAAkB,CAAC,IAAI,IAAI,CAACA,kBAAkB,KAAKkJ,uBAAuB,EAAE;MAC3I,IAAI,CAAC9K,GAAG,CAACiD,IAAI,CAAE,qFAAoF6H,uBAAwB,IAAG,CAAC;MAC/H,OAAO,MAAM,IAAI,CAAC9F,SAAS,CAAC,CAAC;IAC/B;IAEA,IAAI2B,aAAI,CAACqE,QAAQ,CAACF,uBAAuB,CAAC,IAAI,CAACnE,aAAI,CAACqE,QAAQ,CAAC,IAAI,CAACpJ,kBAAkB,CAAC,IAAIqJ,+BAAoB,KAAKH,uBAAuB,EAAE;MACzI,IAAI,CAAC9K,GAAG,CAACiD,IAAI,CAAE,oFAAmFgI,+BAAqB,EAAC,CAAC;MACzH,OAAO,MAAM,IAAI,CAACjG,SAAS,CAAC,CAAC;IAC/B;IAEA,MAAMkG,sBAAsB,GAAG,MAAM,IAAAC,6BAAsB,EAAC,CAAC;IAC7D,IAAI,CAACnL,GAAG,CAAC8D,KAAK,CAAE,mDAAkDoH,sBAAuB,EAAC,CAAC;IAC3F,IAAI,CAAClL,GAAG,CAAC8D,KAAK,CAAE,+CAA8CiH,UAAW,EAAC,CAAC;IAC3E,IAAIG,sBAAsB,IAAIH,UAAU,IAAI9K,eAAC,CAACmL,OAAO,CAAE,GAAEF,sBAAuB,EAAC,CAAC,KAAKjL,eAAC,CAACmL,OAAO,CAAE,GAAEL,UAAW,EAAC,CAAC,EAAE;MACjH,IAAI,CAAC/K,GAAG,CAACiD,IAAI,CAAC,qFAAqF,GAChG,wDAAuDiI,sBAAuB,OAAMH,UAAW,GAAE,CAAC;MACrG,OAAO,MAAM,IAAI,CAAC/F,SAAS,CAAC,CAAC;IAC/B;IAEA,MAAMb,OAAO,GAAGwC,aAAI,CAACqE,QAAQ,CAACF,uBAAuB,CAAC,GACjD,iDAAgD,IAAI,CAACvH,GAAG,CAACwB,IAAK,WAAU+F,uBAAwB,GAAE,GAClG,iDAAgD,IAAI,CAACvH,GAAG,CAACwB,IAAK,GAAE;IACrE,IAAI,CAAC/E,GAAG,CAACiD,IAAI,CAAE,GAAEkB,OAAQ,+DAA8D,IAAI,CAACZ,GAAG,CAACC,IAAK,oCAAmC,CAAC;IACzI,IAAI,CAACnC,iBAAiB,GAAG,IAAI,CAACkC,GAAG,CAACwB,IAAI;EACxC;EAKA,MAAMsG,gBAAgBA,CAAA,EAAI;IACxB,MAAM,IAAI,CAAChB,IAAI,CAAC,CAAC;IACjB,MAAM,IAAI,CAACrF,SAAS,CAAC,CAAC;EACxB;AACF;AAACsG,OAAA,CAAA1L,cAAA,GAAAA,cAAA;AAAA,IAAA2L,QAAA,GAEc3L,cAAc;AAAA0L,OAAA,CAAAE,OAAA,GAAAD,QAAA"}
@@ -3,7 +3,7 @@ import path from 'path';
3
3
  import url from 'url';
4
4
  import B from 'bluebird';
5
5
  import { JWProxy } from '@appium/base-driver';
6
- import { fs, util, plist, mkdirp } from '@appium/support';
6
+ import { fs, util, plist } from '@appium/support';
7
7
  import defaultLogger from './logger';
8
8
  import { NoSessionProxy } from './no-session-proxy';
9
9
  import {
@@ -15,14 +15,16 @@ import { exec } from 'teen_process';
15
15
  import { bundleWDASim } from './check-dependencies';
16
16
  import {
17
17
  WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_BUNDLE_ID_FOR_XCTEST, WDA_RUNNER_APP,
18
- WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,
18
+ WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH
19
19
  } from './constants';
20
20
  import {Xctest} from 'appium-ios-device';
21
+ import {strongbox} from '@appium/strongbox';
21
22
 
22
23
  const WDA_LAUNCH_TIMEOUT = 60 * 1000;
23
24
  const WDA_AGENT_PORT = 8100;
24
25
  const WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';
25
26
  const SHARED_RESOURCES_GUARD = new AsyncLock();
27
+ const RECENT_MODULE_VERSION_ITEM_NAME = 'recentWdaModuleVersion';
26
28
 
27
29
  class WebDriverAgent {
28
30
  constructor (xcodeVersion, args = {}, log = null) {
@@ -224,63 +226,61 @@ class WebDriverAgent {
224
226
  }
225
227
 
226
228
  async _cleanupProjectIfFresh () {
227
- const homeFolder = process.env.HOME;
228
- if (!homeFolder) {
229
- this.log.info('The HOME folder path cannot be determined');
230
- return;
231
- }
232
-
233
- const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();
234
- if (!_.isInteger(currentUpgradeTimestamp)) {
235
- this.log.info('It is impossible to determine the timestamp of the package');
229
+ if (this.canSkipXcodebuild) {
236
230
  return;
237
231
  }
238
232
 
239
- const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);
240
- const didTimestampExist = await fs.exists(timestampPath);
241
- if (didTimestampExist) {
242
- try {
243
- await fs.access(timestampPath, fs.W_OK);
244
- } catch (ign) {
245
- this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +
246
- `Skipping sources cleanup`);
247
- return;
248
- }
249
- const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);
250
- if (_.isInteger(recentUpgradeTimestamp)) {
251
- if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {
252
- this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +
253
- `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);
233
+ const packageInfo = JSON.parse(await fs.readFile(path.join(BOOTSTRAP_PATH, 'package.json'), 'utf8'));
234
+ const box = strongbox(packageInfo.name);
235
+ let boxItem = box.getItem(RECENT_MODULE_VERSION_ITEM_NAME);
236
+ if (!boxItem) {
237
+ const timestampPath = path.resolve(process.env.HOME, WDA_UPGRADE_TIMESTAMP_PATH);
238
+ if (await fs.exists(timestampPath)) {
239
+ // TODO: It is probably a bit ugly to hardcode the recent version string,
240
+ // TODO: hovewer it should do the job as a temporary transition trick
241
+ // TODO: to switch from a hardcoded file path to the strongbox usage.
242
+ try {
243
+ boxItem = await box.createItemWithContents(RECENT_MODULE_VERSION_ITEM_NAME, '5.0.0');
244
+ } catch (e) {
245
+ this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
254
246
  return;
255
247
  }
256
- this.log.info(`WebDriverAgent sources have been upgraded ` +
257
- `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);
258
248
  } else {
259
- this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
249
+ this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
250
+ try {
251
+ await box.createItemWithContents(RECENT_MODULE_VERSION_ITEM_NAME, packageInfo.version);
252
+ } catch (e) {
253
+ this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
254
+ }
255
+ return;
260
256
  }
261
257
  }
262
258
 
259
+ let recentModuleVersion = await boxItem.read();
263
260
  try {
264
- await mkdirp(path.dirname(timestampPath));
265
- await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');
266
- this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +
267
- `at '${timestampPath}'`);
261
+ recentModuleVersion = util.coerceVersion(recentModuleVersion, true);
268
262
  } catch (e) {
269
- this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +
270
- `Original error: ${e.message}`);
263
+ this.log.warn(`The persisted module version string has been damaged: ${e.message}`);
264
+ this.log.info(`Updating it to '${packageInfo.version}' assuming the project clenup is not needed`);
265
+ await boxItem.write(packageInfo.version);
271
266
  return;
272
267
  }
273
268
 
274
- if (!didTimestampExist) {
275
- this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
269
+ if (util.compareVersions(recentModuleVersion, '>=', packageInfo.version)) {
270
+ this.log.info(
271
+ `WebDriverAgent does not need a cleanup. The project sources are up to date ` +
272
+ `(${recentModuleVersion} >= ${packageInfo.version})`
273
+ );
276
274
  return;
277
275
  }
278
276
 
279
- if (this.canSkipXcodebuild) {
280
- return;
281
- }
277
+ this.log.info(
278
+ `Cleaning up the WebDriverAgent project after the module upgrade has happened ` +
279
+ `(${recentModuleVersion} < ${packageInfo.version})`
280
+ );
282
281
  try {
283
282
  await this.xcodebuild.cleanProject();
283
+ await boxItem.write(packageInfo.version);
284
284
  } catch (e) {
285
285
  this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);
286
286
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-webdriveragent",
3
- "version": "5.1.6",
3
+ "version": "5.3.0",
4
4
  "description": "Package bundling WebDriverAgent",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -84,6 +84,7 @@
84
84
  },
85
85
  "dependencies": {
86
86
  "@appium/base-driver": "^9.0.0",
87
+ "@appium/strongbox": "^0.x",
87
88
  "@appium/support": "^4.0.0",
88
89
  "@babel/runtime": "^7.0.0",
89
90
  "appium-ios-device": "^2.5.0",