appium-webdriveragent 3.13.4 → 3.16.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/WebDriverAgent.xcodeproj/project.pbxproj +38 -2
- package/WebDriverAgent.xcodeproj/project.xcworkspace/xcuserdata/elf.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/WebDriverAgent.xcodeproj/xcuserdata/elf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +16 -0
- package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.h +9 -6
- package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +4 -6
- package/WebDriverAgentLib/Categories/XCUIApplication+FBUIInterruptions.h +23 -0
- package/WebDriverAgentLib/Categories/XCUIApplication+FBUIInterruptions.m +32 -0
- package/WebDriverAgentLib/Commands/FBCustomCommands.m +10 -2
- package/WebDriverAgentLib/Commands/FBDebugCommands.m +6 -3
- package/WebDriverAgentLib/Utilities/FBConfiguration.h +5 -0
- package/WebDriverAgentLib/Utilities/FBConfiguration.m +6 -0
- package/WebDriverAgentLib/Utilities/FBReflectionUtils.h +24 -0
- package/WebDriverAgentLib/Utilities/FBReflectionUtils.m +32 -0
- package/WebDriverAgentLib/Utilities/FBXCAXClientProxy.m +5 -23
- package/WebDriverAgentLib/Utilities/FBXMLGenerationOptions.h +46 -0
- package/WebDriverAgentLib/Utilities/FBXMLGenerationOptions.m +26 -0
- package/WebDriverAgentLib/Utilities/FBXPath.h +4 -3
- package/WebDriverAgentLib/Utilities/FBXPath.m +65 -28
- package/WebDriverAgentRunner/UITestingUITests.m +1 -0
- package/WebDriverAgentRunner-Runner.app.zip +0 -0
- package/WebDriverAgentTests/IntegrationTests/FBAlertTests.m +1 -0
- package/WebDriverAgentTests/IntegrationTests/FBSafariAlertTests.m +12 -9
- package/WebDriverAgentTests/IntegrationTests/FBXPathIntegrationTests.m +16 -2
- package/WebDriverAgentTests/UnitTests/FBXPathTests.m +28 -15
- package/build/lib/utils.js +2 -2
- package/lib/utils.js +2 -1
- package/package.json +2 -2
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
archiveVersion = 1;
|
|
4
4
|
classes = {
|
|
5
5
|
};
|
|
6
|
-
objectVersion =
|
|
6
|
+
objectVersion = 52;
|
|
7
7
|
objects = {
|
|
8
8
|
|
|
9
9
|
/* Begin PBXBuildFile section */
|
|
@@ -347,6 +347,10 @@
|
|
|
347
347
|
71414EDA2670A1EE003A8C5D /* LRUCacheNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 71414ED32670A1ED003A8C5D /* LRUCacheNode.m */; };
|
|
348
348
|
71414EDB2670A1EE003A8C5D /* LRUCacheNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 71414ED32670A1ED003A8C5D /* LRUCacheNode.m */; };
|
|
349
349
|
714801D11FA9D9FA00DC5997 /* FBSDKVersionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 714801D01FA9D9FA00DC5997 /* FBSDKVersionTests.m */; };
|
|
350
|
+
714D88CC2733FB970074A925 /* FBXMLGenerationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 714D88CA2733FB970074A925 /* FBXMLGenerationOptions.h */; };
|
|
351
|
+
714D88CD2733FB970074A925 /* FBXMLGenerationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 714D88CA2733FB970074A925 /* FBXMLGenerationOptions.h */; };
|
|
352
|
+
714D88CE2733FB970074A925 /* FBXMLGenerationOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 714D88CB2733FB970074A925 /* FBXMLGenerationOptions.m */; };
|
|
353
|
+
714D88CF2733FB970074A925 /* FBXMLGenerationOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 714D88CB2733FB970074A925 /* FBXMLGenerationOptions.m */; };
|
|
350
354
|
714EAA0D2673FDFE005C5B47 /* FBCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 714EAA0B2673FDFE005C5B47 /* FBCapabilities.h */; };
|
|
351
355
|
714EAA0E2673FDFE005C5B47 /* FBCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 714EAA0B2673FDFE005C5B47 /* FBCapabilities.h */; };
|
|
352
356
|
714EAA0F2673FDFE005C5B47 /* FBCapabilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 714EAA0C2673FDFE005C5B47 /* FBCapabilities.m */; };
|
|
@@ -386,6 +390,14 @@
|
|
|
386
390
|
71649ECE2518C19C0087F212 /* IOSTestSettings.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 71649EC82518C19C0087F212 /* IOSTestSettings.xcconfig */; };
|
|
387
391
|
716C9346224D540C004B8542 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 716C9345224D540C004B8542 /* libxml2.tbd */; };
|
|
388
392
|
716C9347224D540C004B8542 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 716C9345224D540C004B8542 /* libxml2.tbd */; };
|
|
393
|
+
716C9DFA27315D21005AD475 /* FBReflectionUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 716C9DF827315D21005AD475 /* FBReflectionUtils.h */; };
|
|
394
|
+
716C9DFB27315D21005AD475 /* FBReflectionUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 716C9DF827315D21005AD475 /* FBReflectionUtils.h */; };
|
|
395
|
+
716C9DFC27315D21005AD475 /* FBReflectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 716C9DF927315D21005AD475 /* FBReflectionUtils.m */; };
|
|
396
|
+
716C9DFD27315D21005AD475 /* FBReflectionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 716C9DF927315D21005AD475 /* FBReflectionUtils.m */; };
|
|
397
|
+
716C9E0027315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 716C9DFE27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h */; };
|
|
398
|
+
716C9E0127315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 716C9DFE27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h */; };
|
|
399
|
+
716C9E0227315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 716C9DFF27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m */; };
|
|
400
|
+
716C9E0327315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 716C9DFF27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m */; };
|
|
389
401
|
716E0BCE1E917E810087A825 /* NSString+FBXMLSafeString.h in Headers */ = {isa = PBXBuildFile; fileRef = 716E0BCC1E917E810087A825 /* NSString+FBXMLSafeString.h */; };
|
|
390
402
|
716E0BCF1E917E810087A825 /* NSString+FBXMLSafeString.m in Sources */ = {isa = PBXBuildFile; fileRef = 716E0BCD1E917E810087A825 /* NSString+FBXMLSafeString.m */; };
|
|
391
403
|
716E0BD11E917F260087A825 /* FBXMLSafeStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 716E0BD01E917F260087A825 /* FBXMLSafeStringTests.m */; };
|
|
@@ -966,6 +978,8 @@
|
|
|
966
978
|
71414ED32670A1ED003A8C5D /* LRUCacheNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LRUCacheNode.m; sourceTree = "<group>"; };
|
|
967
979
|
714801D01FA9D9FA00DC5997 /* FBSDKVersionTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBSDKVersionTests.m; sourceTree = "<group>"; };
|
|
968
980
|
714CA3C61DC23186000F12C9 /* FBXPathIntegrationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXPathIntegrationTests.m; sourceTree = "<group>"; };
|
|
981
|
+
714D88CA2733FB970074A925 /* FBXMLGenerationOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBXMLGenerationOptions.h; sourceTree = "<group>"; };
|
|
982
|
+
714D88CB2733FB970074A925 /* FBXMLGenerationOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBXMLGenerationOptions.m; sourceTree = "<group>"; };
|
|
969
983
|
714EAA0B2673FDFE005C5B47 /* FBCapabilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBCapabilities.h; sourceTree = "<group>"; };
|
|
970
984
|
714EAA0C2673FDFE005C5B47 /* FBCapabilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBCapabilities.m; sourceTree = "<group>"; };
|
|
971
985
|
7150348521A6DAD600A0F4BA /* FBImageUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBImageUtils.h; sourceTree = "<group>"; };
|
|
@@ -992,6 +1006,10 @@
|
|
|
992
1006
|
716C9343224D53DF004B8542 /* libAccessibility.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libAccessibility.tbd; path = usr/lib/libAccessibility.tbd; sourceTree = SDKROOT; };
|
|
993
1007
|
716C9344224D53FC004B8542 /* XCTAutomationSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTAutomationSupport.framework; path = Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework; sourceTree = DEVELOPER_DIR; };
|
|
994
1008
|
716C9345224D540C004B8542 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; };
|
|
1009
|
+
716C9DF827315D21005AD475 /* FBReflectionUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBReflectionUtils.h; sourceTree = "<group>"; };
|
|
1010
|
+
716C9DF927315D21005AD475 /* FBReflectionUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBReflectionUtils.m; sourceTree = "<group>"; };
|
|
1011
|
+
716C9DFE27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIApplication+FBUIInterruptions.h"; sourceTree = "<group>"; };
|
|
1012
|
+
716C9DFF27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIApplication+FBUIInterruptions.m"; sourceTree = "<group>"; };
|
|
995
1013
|
716E0BCC1E917E810087A825 /* NSString+FBXMLSafeString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+FBXMLSafeString.h"; sourceTree = "<group>"; };
|
|
996
1014
|
716E0BCD1E917E810087A825 /* NSString+FBXMLSafeString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+FBXMLSafeString.m"; sourceTree = "<group>"; };
|
|
997
1015
|
716E0BD01E917F260087A825 /* FBXMLSafeStringTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXMLSafeStringTests.m; sourceTree = "<group>"; };
|
|
@@ -1725,6 +1743,8 @@
|
|
|
1725
1743
|
AD6C269B1CF2494200F8B5FF /* XCUIApplication+FBHelpers.m */,
|
|
1726
1744
|
71C8E54F25399A6B008572C1 /* XCUIApplication+FBQuiescence.h */,
|
|
1727
1745
|
71C8E55025399A6B008572C1 /* XCUIApplication+FBQuiescence.m */,
|
|
1746
|
+
716C9DFE27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h */,
|
|
1747
|
+
716C9DFF27315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m */,
|
|
1728
1748
|
71D475C02538F5A8008D9401 /* XCUIApplicationProcess+FBQuiescence.h */,
|
|
1729
1749
|
71D475C12538F5A8008D9401 /* XCUIApplicationProcess+FBQuiescence.m */,
|
|
1730
1750
|
EEC9EED420064FAA00BC0D5B /* XCUICoordinate+FBFix.h */,
|
|
@@ -1899,6 +1919,8 @@
|
|
|
1899
1919
|
EEEC7C911F21F27A0053426C /* FBPredicate.m */,
|
|
1900
1920
|
71B155DD23080CA600646AFB /* FBProtocolHelpers.h */,
|
|
1901
1921
|
71B155DE23080CA600646AFB /* FBProtocolHelpers.m */,
|
|
1922
|
+
716C9DF827315D21005AD475 /* FBReflectionUtils.h */,
|
|
1923
|
+
716C9DF927315D21005AD475 /* FBReflectionUtils.m */,
|
|
1902
1924
|
EEE9B4701CD02B88009D2030 /* FBRunLoopSpinner.h */,
|
|
1903
1925
|
EEE9B4711CD02B88009D2030 /* FBRunLoopSpinner.m */,
|
|
1904
1926
|
EE9AB7911CAEDF0C008C271F /* FBRuntimeUtils.h */,
|
|
@@ -1926,6 +1948,8 @@
|
|
|
1926
1948
|
EE7E271B1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.m */,
|
|
1927
1949
|
EE35AD791E3B80C000A02D78 /* FBXCTestDaemonsProxy.h */,
|
|
1928
1950
|
EE35AD7A1E3B80C000A02D78 /* FBXCTestDaemonsProxy.m */,
|
|
1951
|
+
714D88CA2733FB970074A925 /* FBXMLGenerationOptions.h */,
|
|
1952
|
+
714D88CB2733FB970074A925 /* FBXMLGenerationOptions.m */,
|
|
1929
1953
|
712A0C861DA3E55D007D02E5 /* FBXPath-Private.h */,
|
|
1930
1954
|
711084421DA3AA7500F913D6 /* FBXPath.h */,
|
|
1931
1955
|
711084431DA3AA7500F913D6 /* FBXPath.m */,
|
|
@@ -2247,6 +2271,7 @@
|
|
|
2247
2271
|
641EE6352240C5CA00173FCB /* XCUIElement+FBUtilities.h in Headers */,
|
|
2248
2272
|
641EE6362240C5CA00173FCB /* XCUIElement+FBScrolling.h in Headers */,
|
|
2249
2273
|
1357E297233D05240054BDB8 /* XCUIHitPointResult.h in Headers */,
|
|
2274
|
+
716C9DFB27315D21005AD475 /* FBReflectionUtils.h in Headers */,
|
|
2250
2275
|
641EE6372240C5CA00173FCB /* XCSourceCodeTreeNode.h in Headers */,
|
|
2251
2276
|
641EE6382240C5CA00173FCB /* XCPointerEventPath.h in Headers */,
|
|
2252
2277
|
641EE6392240C5CA00173FCB /* FBRouteRequest.h in Headers */,
|
|
@@ -2260,6 +2285,7 @@
|
|
|
2260
2285
|
641EE63E2240C5CA00173FCB /* _XCTestImplementation.h in Headers */,
|
|
2261
2286
|
641EE63F2240C5CA00173FCB /* FBTouchActionCommands.h in Headers */,
|
|
2262
2287
|
641EE6402240C5CA00173FCB /* FBTouchIDCommands.h in Headers */,
|
|
2288
|
+
714D88CD2733FB970074A925 /* FBXMLGenerationOptions.h in Headers */,
|
|
2263
2289
|
641EE6412240C5CA00173FCB /* XCUIApplication.h in Headers */,
|
|
2264
2290
|
641EE6422240C5CA00173FCB /* FBCustomCommands.h in Headers */,
|
|
2265
2291
|
641EE6432240C5CA00173FCB /* _XCTestCaseInterruptionException.h in Headers */,
|
|
@@ -2312,6 +2338,7 @@
|
|
|
2312
2338
|
641EE66C2240C5CA00173FCB /* UIPinchGestureRecognizer-RecordingAdditions.h in Headers */,
|
|
2313
2339
|
641EE66D2240C5CA00173FCB /* XCTestManager_TestsInterface-Protocol.h in Headers */,
|
|
2314
2340
|
641EE66E2240C5CA00173FCB /* XCUIApplication+FBAlert.h in Headers */,
|
|
2341
|
+
716C9E0127315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h in Headers */,
|
|
2315
2342
|
7182275C258744C300661B83 /* HTTPServer.h in Headers */,
|
|
2316
2343
|
641EE66F2240C5CA00173FCB /* XCDeviceEvent.h in Headers */,
|
|
2317
2344
|
641EE6702240C5CA00173FCB /* FBMathUtils.h in Headers */,
|
|
@@ -2485,6 +2512,7 @@
|
|
|
2485
2512
|
71F5BE4F252F14EB00EE9EBA /* FBExceptions.h in Headers */,
|
|
2486
2513
|
648C10AB22AAAD9C00B81B9A /* UIKeyboardImpl.h in Headers */,
|
|
2487
2514
|
EE35AD401E3B77D600A02D78 /* XCTest.h in Headers */,
|
|
2515
|
+
716C9E0027315EFF005AD475 /* XCUIApplication+FBUIInterruptions.h in Headers */,
|
|
2488
2516
|
719CD8F82126C78F00C7D0C2 /* FBAlertsMonitor.h in Headers */,
|
|
2489
2517
|
EE35AD241E3B77D600A02D78 /* XCAccessibilityElement.h in Headers */,
|
|
2490
2518
|
EE158AE41CBD456F00A3E3F0 /* FBSession.h in Headers */,
|
|
@@ -2646,6 +2674,7 @@
|
|
|
2646
2674
|
EE35AD261E3B77D600A02D78 /* XCApplicationMonitor_iOS.h in Headers */,
|
|
2647
2675
|
EE3A18661CDE734B00DE4205 /* FBKeyboard.h in Headers */,
|
|
2648
2676
|
AD6C269C1CF2494200F8B5FF /* XCUIApplication+FBHelpers.h in Headers */,
|
|
2677
|
+
714D88CC2733FB970074A925 /* FBXMLGenerationOptions.h in Headers */,
|
|
2649
2678
|
EE35AD101E3B77D600A02D78 /* _XCTestObservationCenterImplementation.h in Headers */,
|
|
2650
2679
|
AD6C26981CF2481700F8B5FF /* XCUIDevice+FBHelpers.h in Headers */,
|
|
2651
2680
|
71A7EAF91E224648001DA4F2 /* FBClassChainQueryParser.h in Headers */,
|
|
@@ -2688,6 +2717,7 @@
|
|
|
2688
2717
|
EE35AD151E3B77D600A02D78 /* CDStructures.h in Headers */,
|
|
2689
2718
|
71E75E6D254824230099FC87 /* XCUIElementQuery+FBHelpers.h in Headers */,
|
|
2690
2719
|
EE35AD311E3B77D600A02D78 /* XCKeyboardLayout.h in Headers */,
|
|
2720
|
+
716C9DFA27315D21005AD475 /* FBReflectionUtils.h in Headers */,
|
|
2691
2721
|
E444DCB624913C220060D7EB /* RouteRequest.h in Headers */,
|
|
2692
2722
|
71F5BE23252E576C00EE9EBA /* XCUIElement+FBSwiping.h in Headers */,
|
|
2693
2723
|
718226CC2587443700661B83 /* GCDAsyncSocket.h in Headers */,
|
|
@@ -2930,7 +2960,7 @@
|
|
|
2930
2960
|
};
|
|
2931
2961
|
};
|
|
2932
2962
|
buildConfigurationList = 91F9DAE41B99DBC2001349B2 /* Build configuration list for PBXProject "WebDriverAgent" */;
|
|
2933
|
-
compatibilityVersion = "Xcode
|
|
2963
|
+
compatibilityVersion = "Xcode 11.0";
|
|
2934
2964
|
developmentRegion = English;
|
|
2935
2965
|
hasScannedForEncodings = 0;
|
|
2936
2966
|
knownRegions = (
|
|
@@ -3082,6 +3112,7 @@
|
|
|
3082
3112
|
641EE5DC2240C5CA00173FCB /* XCUIApplication+FBAlert.m in Sources */,
|
|
3083
3113
|
641EE5DD2240C5CA00173FCB /* FBAppiumActionsSynthesizer.m in Sources */,
|
|
3084
3114
|
641EE70F2240CE4800173FCB /* FBTVNavigationTracker.m in Sources */,
|
|
3115
|
+
714D88CF2733FB970074A925 /* FBXMLGenerationOptions.m in Sources */,
|
|
3085
3116
|
641EE5DE2240C5CA00173FCB /* XCUIApplication+FBTouchAction.m in Sources */,
|
|
3086
3117
|
641EE5DF2240C5CA00173FCB /* FBWebServer.m in Sources */,
|
|
3087
3118
|
641EE5E02240C5CA00173FCB /* FBTCPSocket.m in Sources */,
|
|
@@ -3120,6 +3151,7 @@
|
|
|
3120
3151
|
641EE5FD2240C5CA00173FCB /* FBBaseActionsSynthesizer.m in Sources */,
|
|
3121
3152
|
641EE5FE2240C5CA00173FCB /* XCUIElement+FBWebDriverAttributes.m in Sources */,
|
|
3122
3153
|
641EE5FF2240C5CA00173FCB /* XCUIElement+FBForceTouch.m in Sources */,
|
|
3154
|
+
716C9E0327315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m in Sources */,
|
|
3123
3155
|
641EE6002240C5CA00173FCB /* FBTouchActionCommands.m in Sources */,
|
|
3124
3156
|
719DCF182601EAFB000E765F /* FBNotificationsHelper.m in Sources */,
|
|
3125
3157
|
714EAA102673FDFE005C5B47 /* FBCapabilities.m in Sources */,
|
|
@@ -3154,6 +3186,7 @@
|
|
|
3154
3186
|
641EE61B2240C5CA00173FCB /* FBPasteboard.m in Sources */,
|
|
3155
3187
|
641EE61C2240C5CA00173FCB /* FBAlert.m in Sources */,
|
|
3156
3188
|
718F49CB23087B040045FE8B /* FBCommandStatus.m in Sources */,
|
|
3189
|
+
716C9DFD27315D21005AD475 /* FBReflectionUtils.m in Sources */,
|
|
3157
3190
|
641EE61D2240C5CA00173FCB /* FBElementCommands.m in Sources */,
|
|
3158
3191
|
641EE61E2240C5CA00173FCB /* FBExceptionHandler.m in Sources */,
|
|
3159
3192
|
641EE61F2240C5CA00173FCB /* FBXCodeCompatibility.m in Sources */,
|
|
@@ -3231,6 +3264,7 @@
|
|
|
3231
3264
|
EE7E271F1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.m in Sources */,
|
|
3232
3265
|
7155D704211DCEF400166C20 /* FBMjpegServer.m in Sources */,
|
|
3233
3266
|
EEDFE1221D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.m in Sources */,
|
|
3267
|
+
714D88CE2733FB970074A925 /* FBXMLGenerationOptions.m in Sources */,
|
|
3234
3268
|
E444DCB424913C220060D7EB /* RoutingHTTPServer.m in Sources */,
|
|
3235
3269
|
7140974E1FAE20EE008FB2C5 /* FBBaseActionsSynthesizer.m in Sources */,
|
|
3236
3270
|
EEE3764A1D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m in Sources */,
|
|
@@ -3253,6 +3287,7 @@
|
|
|
3253
3287
|
EE9B76A91CF7A43900275851 /* FBLogger.m in Sources */,
|
|
3254
3288
|
EE158ABB1CBD456F00A3E3F0 /* FBCustomCommands.m in Sources */,
|
|
3255
3289
|
AD6C26991CF2481700F8B5FF /* XCUIDevice+FBHelpers.m in Sources */,
|
|
3290
|
+
716C9E0227315EFF005AD475 /* XCUIApplication+FBUIInterruptions.m in Sources */,
|
|
3256
3291
|
EE6B64FE1D0F86EF00E85F5D /* XCTestPrivateSymbols.m in Sources */,
|
|
3257
3292
|
AD76723E1D6B7CC000610457 /* XCUIElement+FBTyping.m in Sources */,
|
|
3258
3293
|
EE158AAF1CBD456F00A3E3F0 /* XCUIElement+FBAccessibility.m in Sources */,
|
|
@@ -3265,6 +3300,7 @@
|
|
|
3265
3300
|
E444DCB224913C220060D7EB /* RoutingConnection.m in Sources */,
|
|
3266
3301
|
EE158AC11CBD456F00A3E3F0 /* FBFindElementCommands.m in Sources */,
|
|
3267
3302
|
EE7E271D1D06C69F001BEC7B /* FBDebugLogDelegateDecorator.m in Sources */,
|
|
3303
|
+
716C9DFC27315D21005AD475 /* FBReflectionUtils.m in Sources */,
|
|
3268
3304
|
71C8E55325399A6B008572C1 /* XCUIApplication+FBQuiescence.m in Sources */,
|
|
3269
3305
|
71414EDA2670A1EE003A8C5D /* LRUCacheNode.m in Sources */,
|
|
3270
3306
|
EE158AB91CBD456F00A3E3F0 /* FBAlertViewCommands.m in Sources */,
|
|
Binary file
|
package/WebDriverAgent.xcodeproj/xcuserdata/elf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
CHANGED
|
@@ -71,5 +71,21 @@
|
|
|
71
71
|
</Locations>
|
|
72
72
|
</BreakpointContent>
|
|
73
73
|
</BreakpointProxy>
|
|
74
|
+
<BreakpointProxy
|
|
75
|
+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
|
76
|
+
<BreakpointContent
|
|
77
|
+
uuid = "D3009B57-42BC-4905-99BC-70232544FAFB"
|
|
78
|
+
shouldBeEnabled = "Yes"
|
|
79
|
+
ignoreCount = "0"
|
|
80
|
+
continueAfterRunningActions = "No"
|
|
81
|
+
filePath = "WebDriverAgentTests/IntegrationTests/FBAlertTests.m"
|
|
82
|
+
startingColumnNumber = "5"
|
|
83
|
+
endingColumnNumber = "64"
|
|
84
|
+
startingLineNumber = "32"
|
|
85
|
+
endingLineNumber = "32"
|
|
86
|
+
landmarkName = "-setUp"
|
|
87
|
+
landmarkType = "7">
|
|
88
|
+
</BreakpointContent>
|
|
89
|
+
</BreakpointProxy>
|
|
74
90
|
</Breakpoints>
|
|
75
91
|
</Bucket>
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
@class XCElementSnapshot;
|
|
13
13
|
@class XCAccessibilityElement;
|
|
14
|
+
@class FBXMLGenerationOptions;
|
|
14
15
|
|
|
15
16
|
NS_ASSUME_NONNULL_BEGIN
|
|
16
17
|
|
|
@@ -45,18 +46,20 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
45
46
|
- (NSDictionary *)fb_accessibilityTree;
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
|
-
Return application elements tree in form of xml string
|
|
49
|
+
Return application elements tree in a form of xml string
|
|
50
|
+
with default options.
|
|
51
|
+
|
|
52
|
+
@return nil if there was a failure while retriveing the page source.
|
|
49
53
|
*/
|
|
50
54
|
- (nullable NSString *)fb_xmlRepresentation;
|
|
51
55
|
|
|
52
56
|
/**
|
|
53
|
-
Return application elements tree in form of xml string
|
|
57
|
+
Return application elements tree in a form of xml string
|
|
54
58
|
|
|
55
|
-
@param
|
|
56
|
-
|
|
57
|
-
@returns The XML representation of the current element as a string
|
|
59
|
+
@param options Optional values that affect the resulting XML generation process.
|
|
60
|
+
@return nil if there was a failure while retriveing the page source.
|
|
58
61
|
*/
|
|
59
|
-
- (NSString *)
|
|
62
|
+
- (nullable NSString *)fb_xmlRepresentationWithOptions:(nullable FBXMLGenerationOptions *)options;
|
|
60
63
|
|
|
61
64
|
/**
|
|
62
65
|
Return application elements tree in form of internal XCTest debugDescription string
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
#import "FBXPath.h"
|
|
21
21
|
#import "FBXCTestDaemonsProxy.h"
|
|
22
22
|
#import "FBXCAXClientProxy.h"
|
|
23
|
+
#import "FBXMLGenerationOptions.h"
|
|
23
24
|
#import "XCAccessibilityElement.h"
|
|
24
25
|
#import "XCElementSnapshot+FBHelpers.h"
|
|
25
26
|
#import "XCUIDevice+FBHelpers.h"
|
|
@@ -180,15 +181,12 @@ static NSString* const FBUnknownBundleId = @"unknown";
|
|
|
180
181
|
|
|
181
182
|
- (NSString *)fb_xmlRepresentation
|
|
182
183
|
{
|
|
183
|
-
return [
|
|
184
|
+
return [self fb_xmlRepresentationWithOptions:nil];
|
|
184
185
|
}
|
|
185
186
|
|
|
186
|
-
- (NSString *)
|
|
187
|
+
- (NSString *)fb_xmlRepresentationWithOptions:(FBXMLGenerationOptions *)options
|
|
187
188
|
{
|
|
188
|
-
|
|
189
|
-
#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion"
|
|
190
|
-
return [FBXPath xmlStringWithRootElement:self excludingAttributes:excludedAttributes];
|
|
191
|
-
#pragma clang diagnostic pop
|
|
189
|
+
return [FBXPath xmlStringWithRootElement:self options:options];
|
|
192
190
|
}
|
|
193
191
|
|
|
194
192
|
- (NSString *)fb_descriptionRepresentation
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
13
|
+
|
|
14
|
+
@interface XCUIApplication (FBUIInterruptions)
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Disables automatic UI interruptions handling for all applications.
|
|
18
|
+
*/
|
|
19
|
+
+ (void)fb_disableUIInterruptionsHandling;
|
|
20
|
+
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,32 @@
|
|
|
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 "XCUIApplication+FBUIInterruptions.h"
|
|
11
|
+
|
|
12
|
+
#import "FBReflectionUtils.h"
|
|
13
|
+
#import "XCUIApplication.h"
|
|
14
|
+
|
|
15
|
+
@implementation XCUIApplication (FBUIInterruptions)
|
|
16
|
+
|
|
17
|
+
- (BOOL)fb_doesNotHandleUIInterruptions
|
|
18
|
+
{
|
|
19
|
+
return YES;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
+ (void)fb_disableUIInterruptionsHandling
|
|
23
|
+
{
|
|
24
|
+
static dispatch_once_t onceToken;
|
|
25
|
+
dispatch_once(&onceToken, ^{
|
|
26
|
+
FBReplaceMethod([self class],
|
|
27
|
+
@selector(doesNotHandleUIInterruptions),
|
|
28
|
+
@selector(fb_doesNotHandleUIInterruptions));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@end
|
|
@@ -380,7 +380,8 @@
|
|
|
380
380
|
// https://developer.apple.com/documentation/foundation/nslocale/1414388-autoupdatingcurrentlocale
|
|
381
381
|
NSString *currentLocale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
|
|
382
382
|
|
|
383
|
-
|
|
383
|
+
NSMutableDictionary *deviceInfo = [NSMutableDictionary dictionaryWithDictionary:
|
|
384
|
+
@{
|
|
384
385
|
@"currentLocale": currentLocale,
|
|
385
386
|
@"timeZone": self.timeZone,
|
|
386
387
|
@"name": UIDevice.currentDevice.name,
|
|
@@ -394,7 +395,14 @@
|
|
|
394
395
|
#else
|
|
395
396
|
@"isSimulator": @(NO),
|
|
396
397
|
#endif
|
|
397
|
-
}
|
|
398
|
+
}];
|
|
399
|
+
|
|
400
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0")) {
|
|
401
|
+
// https://developer.apple.com/documentation/foundation/nsprocessinfothermalstate
|
|
402
|
+
deviceInfo[@"thermalState"] = @(NSProcessInfo.processInfo.thermalState);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return FBResponseWithObject(deviceInfo);
|
|
398
406
|
}
|
|
399
407
|
|
|
400
408
|
/**
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
#import "FBApplication.h"
|
|
13
13
|
#import "FBRouteRequest.h"
|
|
14
14
|
#import "FBSession.h"
|
|
15
|
+
#import "FBXMLGenerationOptions.h"
|
|
15
16
|
#import "XCUIApplication+FBHelpers.h"
|
|
16
17
|
#import "XCUIElement+FBUtilities.h"
|
|
17
18
|
#import "FBXPath.h"
|
|
@@ -43,14 +44,16 @@ static NSString *const SOURCE_FORMAT_DESCRIPTION = @"description";
|
|
|
43
44
|
// This method might be called without session
|
|
44
45
|
FBApplication *application = request.session.activeApplication ?: FBApplication.fb_activeApplication;
|
|
45
46
|
NSString *sourceType = request.parameters[@"format"] ?: SOURCE_FORMAT_XML;
|
|
47
|
+
NSString *sourceScope = request.parameters[@"scope"];
|
|
46
48
|
id result;
|
|
47
49
|
if ([sourceType caseInsensitiveCompare:SOURCE_FORMAT_XML] == NSOrderedSame) {
|
|
48
50
|
NSArray<NSString *> *excludedAttributes = nil == request.parameters[@"excluded_attributes"]
|
|
49
51
|
? nil
|
|
50
52
|
: [request.parameters[@"excluded_attributes"] componentsSeparatedByString:@","];
|
|
51
|
-
result =
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
result = [application fb_xmlRepresentationWithOptions:
|
|
54
|
+
[[[FBXMLGenerationOptions new]
|
|
55
|
+
withExcludedAttributes:excludedAttributes]
|
|
56
|
+
withScope:sourceScope]];
|
|
54
57
|
} else if ([sourceType caseInsensitiveCompare:SOURCE_FORMAT_JSON] == NSOrderedSame) {
|
|
55
58
|
result = application.fb_tree;
|
|
56
59
|
} else if ([sourceType caseInsensitiveCompare:SOURCE_FORMAT_DESCRIPTION] == NSOrderedSame) {
|
|
@@ -118,6 +118,11 @@ extern NSString *const FBSnapshotMaxDepthKey;
|
|
|
118
118
|
*/
|
|
119
119
|
+ (BOOL)verboseLoggingEnabled;
|
|
120
120
|
|
|
121
|
+
/**
|
|
122
|
+
Disables automatic handling of XCTest UI interruptions.
|
|
123
|
+
*/
|
|
124
|
+
+ (void)disableApplicationUIInterruptionsHandling;
|
|
125
|
+
|
|
121
126
|
/**
|
|
122
127
|
* Configure keyboards preference to make test running stable
|
|
123
128
|
*/
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
#import "XCTestPrivateSymbols.h"
|
|
18
18
|
#import "XCElementSnapshot.h"
|
|
19
19
|
#import "XCTestConfiguration.h"
|
|
20
|
+
#import "XCUIApplication+FBUIInterruptions.h"
|
|
20
21
|
|
|
21
22
|
static NSUInteger const DefaultStartingPort = 8100;
|
|
22
23
|
static NSUInteger const DefaultMjpegServerPort = 9100;
|
|
@@ -74,6 +75,11 @@ static UIInterfaceOrientation FBScreenshotOrientation = UIInterfaceOrientationUn
|
|
|
74
75
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"XCTDisableRemoteQueryEvaluation"];
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
+ (void)disableApplicationUIInterruptionsHandling
|
|
79
|
+
{
|
|
80
|
+
[XCUIApplication fb_disableUIInterruptionsHandling];
|
|
81
|
+
}
|
|
82
|
+
|
|
77
83
|
+ (void)enableXcTestDebugLogs
|
|
78
84
|
{
|
|
79
85
|
((XCTestConfiguration *)XCTestConfiguration.activeTestConfiguration).emitOSLogs = YES;
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* Swizzles the implemntation of originalSelector with the swizzledSelector for the given class.
|
|
16
|
+
* Both methods must belong to this class.
|
|
17
|
+
*
|
|
18
|
+
* @param cls The class where to swizzle
|
|
19
|
+
* @param originalSelector original method selector
|
|
20
|
+
* @paramswizzledSelector swizzled method selector
|
|
21
|
+
*/
|
|
22
|
+
void FBReplaceMethod(Class cls, SEL originalSelector, SEL swizzledSelector);
|
|
23
|
+
|
|
24
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,32 @@
|
|
|
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 "FBReflectionUtils.h"
|
|
11
|
+
|
|
12
|
+
#import <objc/runtime.h>
|
|
13
|
+
|
|
14
|
+
void FBReplaceMethod(Class class, SEL originalSelector, SEL swizzledSelector) {
|
|
15
|
+
Method originalMethod = class_getInstanceMethod(class, originalSelector);
|
|
16
|
+
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
|
|
17
|
+
|
|
18
|
+
BOOL didAddMethod =
|
|
19
|
+
class_addMethod(class,
|
|
20
|
+
originalSelector,
|
|
21
|
+
method_getImplementation(swizzledMethod),
|
|
22
|
+
method_getTypeEncoding(swizzledMethod));
|
|
23
|
+
|
|
24
|
+
if (didAddMethod) {
|
|
25
|
+
class_replaceMethod(class,
|
|
26
|
+
swizzledSelector,
|
|
27
|
+
method_getImplementation(originalMethod),
|
|
28
|
+
method_getTypeEncoding(originalMethod));
|
|
29
|
+
} else {
|
|
30
|
+
method_exchangeImplementations(originalMethod, swizzledMethod);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -13,9 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
#import "FBConfiguration.h"
|
|
15
15
|
#import "FBLogger.h"
|
|
16
|
+
#import "FBMacros.h"
|
|
17
|
+
#import "FBReflectionUtils.h"
|
|
16
18
|
#import "XCAXClient_iOS.h"
|
|
17
19
|
#import "XCUIDevice.h"
|
|
18
|
-
#import "FBMacros.h"
|
|
19
20
|
|
|
20
21
|
static id FBAXClient = nil;
|
|
21
22
|
|
|
@@ -35,28 +36,9 @@ static id FBAXClient = nil;
|
|
|
35
36
|
{
|
|
36
37
|
static dispatch_once_t onceToken;
|
|
37
38
|
dispatch_once(&onceToken, ^{
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
SEL swizzledSelector = @selector(fb_getParametersForElementSnapshot);
|
|
42
|
-
|
|
43
|
-
Method originalMethod = class_getInstanceMethod(class, originalSelector);
|
|
44
|
-
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
|
|
45
|
-
|
|
46
|
-
BOOL didAddMethod =
|
|
47
|
-
class_addMethod(class,
|
|
48
|
-
originalSelector,
|
|
49
|
-
method_getImplementation(swizzledMethod),
|
|
50
|
-
method_getTypeEncoding(swizzledMethod));
|
|
51
|
-
|
|
52
|
-
if (didAddMethod) {
|
|
53
|
-
class_replaceMethod(class,
|
|
54
|
-
swizzledSelector,
|
|
55
|
-
method_getImplementation(originalMethod),
|
|
56
|
-
method_getTypeEncoding(originalMethod));
|
|
57
|
-
} else {
|
|
58
|
-
method_exchangeImplementations(originalMethod, swizzledMethod);
|
|
59
|
-
}
|
|
39
|
+
SEL originalParametersSelector = @selector(defaultParameters);
|
|
40
|
+
SEL swizzledParametersSelector = @selector(fb_getParametersForElementSnapshot);
|
|
41
|
+
FBReplaceMethod([self class], originalParametersSelector, swizzledParametersSelector);
|
|
60
42
|
});
|
|
61
43
|
}
|
|
62
44
|
|
|
@@ -0,0 +1,46 @@
|
|
|
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 FBXMLGenerationOptions : NSObject
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
XML buidling scope. Passing nil means the XML should be built in the default scope,
|
|
18
|
+
i.e no changes to the original tree structore. If the scope is provided then the resulting
|
|
19
|
+
XML tree will be put under the root, which name is equal to the given scope value.
|
|
20
|
+
*/
|
|
21
|
+
@property (nonatomic, nullable) NSString *scope;
|
|
22
|
+
/**
|
|
23
|
+
The list of attribute names to exclude from the resulting document.
|
|
24
|
+
Passing nil means all the available attributes should be included
|
|
25
|
+
*/
|
|
26
|
+
@property (nonatomic, nullable) NSArray<NSString *> *excludedAttributes;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
Allows to provide XML scope.
|
|
30
|
+
|
|
31
|
+
@param scope See the property description above
|
|
32
|
+
@return self instance for chaining
|
|
33
|
+
*/
|
|
34
|
+
- (FBXMLGenerationOptions *)withScope:(nullable NSString *)scope;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
Allows to provide a list of excluded XML attributes.
|
|
38
|
+
|
|
39
|
+
@param excludedAttributes See the property description above
|
|
40
|
+
@return self instance for chaining
|
|
41
|
+
*/
|
|
42
|
+
- (FBXMLGenerationOptions *)withExcludedAttributes:(nullable NSArray<NSString *> *)excludedAttributes;
|
|
43
|
+
|
|
44
|
+
@end
|
|
45
|
+
|
|
46
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,26 @@
|
|
|
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 "FBXMLGenerationOptions.h"
|
|
11
|
+
|
|
12
|
+
@implementation FBXMLGenerationOptions
|
|
13
|
+
|
|
14
|
+
- (FBXMLGenerationOptions *)withScope:(NSString *)scope
|
|
15
|
+
{
|
|
16
|
+
self.scope = scope;
|
|
17
|
+
return self;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
- (FBXMLGenerationOptions *)withExcludedAttributes:(NSArray<NSString *> *)excludedAttributes
|
|
21
|
+
{
|
|
22
|
+
self.excludedAttributes = excludedAttributes;
|
|
23
|
+
return self;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@end
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
#pragma clang diagnostic pop
|
|
28
28
|
#endif
|
|
29
29
|
|
|
30
|
+
@class FBXMLGenerationOptions;
|
|
31
|
+
|
|
30
32
|
NS_ASSUME_NONNULL_BEGIN
|
|
31
33
|
|
|
32
34
|
@interface FBXPath : NSObject
|
|
@@ -47,12 +49,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
47
49
|
representation, which is used for XPath search
|
|
48
50
|
|
|
49
51
|
@param root the root element
|
|
50
|
-
@param
|
|
51
|
-
Passing nil means all the available attributes should be included
|
|
52
|
+
@param options Optional values that affect the resulting XML creation process
|
|
52
53
|
@return valid XML document as string or nil in case of failure
|
|
53
54
|
*/
|
|
54
55
|
+ (nullable NSString *)xmlStringWithRootElement:(id<FBElement>)root
|
|
55
|
-
|
|
56
|
+
options:(nullable FBXMLGenerationOptions *)options;
|
|
56
57
|
|
|
57
58
|
@end
|
|
58
59
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
#import "FBConfiguration.h"
|
|
13
13
|
#import "FBExceptions.h"
|
|
14
14
|
#import "FBLogger.h"
|
|
15
|
+
#import "FBXMLGenerationOptions.h"
|
|
15
16
|
#import "NSString+FBXMLSafeString.h"
|
|
16
17
|
#import "XCElementSnapshot+FBHelpers.h"
|
|
17
18
|
#import "XCUIElement.h"
|
|
@@ -117,15 +118,45 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
+ (nullable NSString *)xmlStringWithRootElement:(id<FBElement>)root
|
|
120
|
-
|
|
121
|
+
options:(nullable FBXMLGenerationOptions *)options
|
|
121
122
|
{
|
|
122
123
|
xmlDocPtr doc;
|
|
123
124
|
xmlTextWriterPtr writer = xmlNewTextWriterDoc(&doc, 0);
|
|
124
|
-
int rc =
|
|
125
|
+
int rc = xmlTextWriterStartDocument(writer, NULL, _UTF8Encoding, NULL);
|
|
126
|
+
if (rc < 0) {
|
|
127
|
+
[FBLogger logFmt:@"Failed to invoke libxml2>xmlTextWriterStartDocument. Error code: %d", rc];
|
|
128
|
+
} else {
|
|
129
|
+
BOOL hasScope = nil != options.scope && [options.scope length] > 0;
|
|
130
|
+
if (hasScope) {
|
|
131
|
+
rc = xmlTextWriterStartElement(writer,
|
|
132
|
+
(xmlChar *)[[self safeXmlStringWithString:options.scope] UTF8String]);
|
|
133
|
+
if (rc < 0) {
|
|
134
|
+
[FBLogger logFmt:@"Failed to invoke libxml2>xmlTextWriterStartElement for the tag value '%@'. Error code: %d", options.scope, rc];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (rc >= 0) {
|
|
139
|
+
rc = [self xmlRepresentationWithRootElement:root
|
|
125
140
|
writer:writer
|
|
126
141
|
elementStore:nil
|
|
127
142
|
query:nil
|
|
128
|
-
excludingAttributes:excludedAttributes];
|
|
143
|
+
excludingAttributes:options.excludedAttributes];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (rc >= 0 && hasScope) {
|
|
147
|
+
rc = xmlTextWriterEndElement(writer);
|
|
148
|
+
if (rc < 0) {
|
|
149
|
+
[FBLogger logFmt:@"Failed to invoke libxml2>xmlTextWriterEndElement. Error code: %d", rc];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (rc >= 0) {
|
|
154
|
+
rc = xmlTextWriterEndDocument(writer);
|
|
155
|
+
if (rc < 0) {
|
|
156
|
+
[FBLogger logFmt:@"Failed to invoke libxml2>xmlXPathNewContext. Error code: %d", rc];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
129
160
|
if (rc < 0) {
|
|
130
161
|
xmlFreeTextWriter(writer);
|
|
131
162
|
xmlFreeDoc(doc);
|
|
@@ -141,7 +172,8 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
141
172
|
return result;
|
|
142
173
|
}
|
|
143
174
|
|
|
144
|
-
+ (NSArray<XCElementSnapshot *> *)matchesWithRootElement:(id<FBElement>)root
|
|
175
|
+
+ (NSArray<XCElementSnapshot *> *)matchesWithRootElement:(id<FBElement>)root
|
|
176
|
+
forQuery:(NSString *)xpathQuery
|
|
145
177
|
{
|
|
146
178
|
xmlDocPtr doc;
|
|
147
179
|
|
|
@@ -151,11 +183,22 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
151
183
|
return [self throwException:FBXPathQueryEvaluationException forQuery:xpathQuery];
|
|
152
184
|
}
|
|
153
185
|
NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
|
|
154
|
-
int rc =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
186
|
+
int rc = xmlTextWriterStartDocument(writer, NULL, _UTF8Encoding, NULL);
|
|
187
|
+
if (rc < 0) {
|
|
188
|
+
[FBLogger logFmt:@"Failed to invoke libxml2>xmlTextWriterStartDocument. Error code: %d", rc];
|
|
189
|
+
} else {
|
|
190
|
+
rc = [self xmlRepresentationWithRootElement:root
|
|
191
|
+
writer:writer
|
|
192
|
+
elementStore:elementStore
|
|
193
|
+
query:xpathQuery
|
|
194
|
+
excludingAttributes:nil];
|
|
195
|
+
if (rc >= 0) {
|
|
196
|
+
rc = xmlTextWriterEndDocument(writer);
|
|
197
|
+
if (rc < 0) {
|
|
198
|
+
[FBLogger logFmt:@"Failed to invoke libxml2>xmlTextWriterEndDocument. Error code: %d", rc];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
159
202
|
if (rc < 0) {
|
|
160
203
|
xmlFreeTextWriter(writer);
|
|
161
204
|
xmlFreeDoc(doc);
|
|
@@ -169,7 +212,8 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
169
212
|
return [self throwException:FBInvalidXPathException forQuery:xpathQuery];
|
|
170
213
|
}
|
|
171
214
|
|
|
172
|
-
NSArray *matchingSnapshots = [self collectMatchingSnapshots:queryResult->nodesetval
|
|
215
|
+
NSArray *matchingSnapshots = [self collectMatchingSnapshots:queryResult->nodesetval
|
|
216
|
+
elementStore:elementStore];
|
|
173
217
|
xmlXPathFreeObject(queryResult);
|
|
174
218
|
xmlFreeTextWriter(writer);
|
|
175
219
|
xmlFreeDoc(doc);
|
|
@@ -179,7 +223,8 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
179
223
|
return matchingSnapshots;
|
|
180
224
|
}
|
|
181
225
|
|
|
182
|
-
+ (NSArray *)collectMatchingSnapshots:(xmlNodeSetPtr)nodeSet
|
|
226
|
+
+ (NSArray *)collectMatchingSnapshots:(xmlNodeSetPtr)nodeSet
|
|
227
|
+
elementStore:(NSMutableDictionary *)elementStore
|
|
183
228
|
{
|
|
184
229
|
if (xmlXPathNodeSetIsEmpty(nodeSet)) {
|
|
185
230
|
return @[];
|
|
@@ -243,26 +288,15 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
243
288
|
}
|
|
244
289
|
[FBLogger logFmt:@"The following attributes were requested to be included into the XML: %@", includedAttributes];
|
|
245
290
|
|
|
246
|
-
int rc =
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
rc = [self writeXmlWithRootElement:root
|
|
253
|
-
indexPath:(elementStore != nil ? topNodeIndexPath : nil)
|
|
254
|
-
elementStore:elementStore
|
|
255
|
-
includedAttributes:includedAttributes.copy
|
|
256
|
-
writer:writer];
|
|
291
|
+
int rc = [self writeXmlWithRootElement:root
|
|
292
|
+
indexPath:(elementStore != nil ? topNodeIndexPath : nil)
|
|
293
|
+
elementStore:elementStore
|
|
294
|
+
includedAttributes:includedAttributes.copy
|
|
295
|
+
writer:writer];
|
|
257
296
|
if (rc < 0) {
|
|
258
297
|
[FBLogger log:@"Failed to generate XML presentation of a screen element"];
|
|
259
298
|
return rc;
|
|
260
299
|
}
|
|
261
|
-
rc = xmlTextWriterEndDocument(writer);
|
|
262
|
-
if (rc < 0) {
|
|
263
|
-
[FBLogger logFmt:@"Failed to invoke libxml2>xmlXPathNewContext. Error code: %d", rc];
|
|
264
|
-
return rc;
|
|
265
|
-
}
|
|
266
300
|
return 0;
|
|
267
301
|
}
|
|
268
302
|
|
|
@@ -290,7 +324,10 @@ static NSString *const topNodeIndexPath = @"top";
|
|
|
290
324
|
return [str fb_xmlSafeStringWithReplacement:@""];
|
|
291
325
|
}
|
|
292
326
|
|
|
293
|
-
+ (int)recordElementAttributes:(xmlTextWriterPtr)writer
|
|
327
|
+
+ (int)recordElementAttributes:(xmlTextWriterPtr)writer
|
|
328
|
+
forElement:(XCElementSnapshot *)element
|
|
329
|
+
indexPath:(nullable NSString *)indexPath
|
|
330
|
+
includedAttributes:(nullable NSSet<Class> *)includedAttributes
|
|
294
331
|
{
|
|
295
332
|
for (Class attributeCls in FBElementAttribute.supportedAttributes) {
|
|
296
333
|
// include all supported attributes by default unless enumerated explicitly
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
[FBDebugLogDelegateDecorator decorateXCTestLogger];
|
|
26
26
|
[FBConfiguration disableRemoteQueryEvaluation];
|
|
27
27
|
[FBConfiguration configureDefaultKeyboardPreferences];
|
|
28
|
+
[FBConfiguration disableApplicationUIInterruptionsHandling];
|
|
28
29
|
if (NSProcessInfo.processInfo.environment[@"ENABLE_AUTOMATIC_SCREENSHOTS"]) {
|
|
29
30
|
[FBConfiguration enableScreenshots];
|
|
30
31
|
} else {
|
|
Binary file
|
|
@@ -48,26 +48,29 @@ static NSString *const SAFARI_BUNDLE_ID = @"com.apple.mobilesafari";
|
|
|
48
48
|
|
|
49
49
|
- (void)disabled_testCanHandleSafariInputPrompt
|
|
50
50
|
{
|
|
51
|
-
XCUIElement *urlInput = [[self.safariApp
|
|
51
|
+
XCUIElement *urlInput = [[self.safariApp
|
|
52
|
+
descendantsMatchingType:XCUIElementTypeTextField]
|
|
53
|
+
matchingPredicate:[
|
|
54
|
+
NSPredicate predicateWithFormat:@"label == 'Address' or label == 'URL'"
|
|
55
|
+
]].firstMatch;
|
|
52
56
|
if (!urlInput.exists) {
|
|
53
|
-
[[[self.safariApp descendantsMatchingType:XCUIElementTypeButton]
|
|
57
|
+
[[[self.safariApp descendantsMatchingType:XCUIElementTypeButton] matchingPredicate:[
|
|
58
|
+
NSPredicate predicateWithFormat:@"label == 'Address' or label == 'URL'"]].firstMatch tap];
|
|
54
59
|
}
|
|
55
|
-
XCTAssertTrue([urlInput fb_typeText:@"https://www.
|
|
60
|
+
XCTAssertTrue([urlInput fb_typeText:@"https://www.w3schools.com/js/tryit.asp?filename=tryjs_alert"
|
|
56
61
|
shouldClear:YES
|
|
57
62
|
error:nil]);
|
|
58
63
|
[[[self.safariApp descendantsMatchingType:XCUIElementTypeButton] matchingIdentifier:@"Go"].firstMatch tap];
|
|
59
64
|
XCUIElement *clickMeButton = [[self.safariApp descendantsMatchingType:XCUIElementTypeButton]
|
|
60
|
-
matchingPredicate:[NSPredicate predicateWithFormat:@"label == '
|
|
65
|
+
matchingPredicate:[NSPredicate predicateWithFormat:@"label == 'Try it'"]].firstMatch;
|
|
61
66
|
XCTAssertTrue([clickMeButton waitForExistenceWithTimeout:15.0]);
|
|
62
67
|
[clickMeButton tap];
|
|
63
68
|
FBAlert *alert = [FBAlert alertWithApplication:self.safariApp];
|
|
64
|
-
FBAssertWaitTillBecomesTrue([alert.text isEqualToString:@"
|
|
69
|
+
FBAssertWaitTillBecomesTrue([alert.text isEqualToString:@"I am an alert box!"]);
|
|
65
70
|
NSArray *buttonLabels = alert.buttonLabels;
|
|
66
|
-
XCTAssertEqualObjects(buttonLabels.firstObject, @"
|
|
67
|
-
XCTAssertNotNil([self.safariApp fb_descendantsMatchingXPathQuery:@"//XCUIElementTypeButton[@label='
|
|
71
|
+
XCTAssertEqualObjects(buttonLabels.firstObject, @"Close");
|
|
72
|
+
XCTAssertNotNil([self.safariApp fb_descendantsMatchingXPathQuery:@"//XCUIElementTypeButton[@label='Close']"
|
|
68
73
|
shouldReturnAfterFirstMatch:YES].firstObject);
|
|
69
|
-
XCTAssertEqualObjects(buttonLabels.lastObject, @"OK");
|
|
70
|
-
XCTAssertTrue([alert typeText:@"yolo" error:nil]);
|
|
71
74
|
XCTAssertTrue([alert acceptWithError:nil]);
|
|
72
75
|
}
|
|
73
76
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
#import "FBTestMacros.h"
|
|
14
14
|
#import "FBXPath.h"
|
|
15
15
|
#import "FBXCodeCompatibility.h"
|
|
16
|
+
#import "FBXMLGenerationOptions.h"
|
|
16
17
|
#import "XCUIElement.h"
|
|
17
18
|
#import "XCUIElement+FBFind.h"
|
|
18
19
|
#import "XCUIElement+FBUtilities.h"
|
|
@@ -52,16 +53,29 @@
|
|
|
52
53
|
- (void)testSingleDescendantXMLRepresentation
|
|
53
54
|
{
|
|
54
55
|
XCElementSnapshot *snapshot = self.destinationSnapshot;
|
|
55
|
-
NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot
|
|
56
|
+
NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot options:nil];
|
|
56
57
|
XCTAssertNotNil(xmlStr);
|
|
57
58
|
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\"/>\n", snapshot.wdType, snapshot.wdType, snapshot.wdName, snapshot.wdLabel, snapshot.wdEnabled ? @"true" : @"false", snapshot.wdVisible ? @"true" : @"false", snapshot.wdAccessible ? @"true" : @"false", [snapshot.wdRect[@"x"] stringValue], [snapshot.wdRect[@"y"] stringValue], [snapshot.wdRect[@"width"] stringValue], [snapshot.wdRect[@"height"] stringValue], snapshot.wdIndex];
|
|
58
59
|
XCTAssertEqualObjects(xmlStr, expectedXml);
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
- (void)testSingleDescendantXMLRepresentationWithScope
|
|
63
|
+
{
|
|
64
|
+
XCElementSnapshot *snapshot = self.destinationSnapshot;
|
|
65
|
+
NSString *scope = @"AppiumAUT";
|
|
66
|
+
FBXMLGenerationOptions *options = [[FBXMLGenerationOptions new] withScope:scope];
|
|
67
|
+
NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot options:options];
|
|
68
|
+
XCTAssertNotNil(xmlStr);
|
|
69
|
+
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@>\n <%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\"/>\n</%@>\n", scope, snapshot.wdType, snapshot.wdType, snapshot.wdName, snapshot.wdLabel, snapshot.wdEnabled ? @"true" : @"false", snapshot.wdVisible ? @"true" : @"false", snapshot.wdAccessible ? @"true" : @"false", [snapshot.wdRect[@"x"] stringValue], [snapshot.wdRect[@"y"] stringValue], [snapshot.wdRect[@"width"] stringValue], [snapshot.wdRect[@"height"] stringValue], snapshot.wdIndex, scope];
|
|
70
|
+
XCTAssertEqualObjects(xmlStr, expectedXml);
|
|
71
|
+
}
|
|
72
|
+
|
|
61
73
|
- (void)testSingleDescendantXMLRepresentationWithoutAttributes
|
|
62
74
|
{
|
|
63
75
|
XCElementSnapshot *snapshot = self.destinationSnapshot;
|
|
64
|
-
|
|
76
|
+
FBXMLGenerationOptions *options = [[FBXMLGenerationOptions new]
|
|
77
|
+
withExcludedAttributes:@[@"visible", @"enabled", @"index", @"blabla"]];
|
|
78
|
+
NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot options:options];
|
|
65
79
|
XCTAssertNotNil(xmlStr);
|
|
66
80
|
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\"/>\n", snapshot.wdType, snapshot.wdType, snapshot.wdName, snapshot.wdLabel, snapshot.wdAccessible ? @"true" : @"false", [snapshot.wdRect[@"x"] stringValue], [snapshot.wdRect[@"y"] stringValue], [snapshot.wdRect[@"width"] stringValue], [snapshot.wdRect[@"height"] stringValue]];
|
|
67
81
|
XCTAssertEqualObjects(xmlStr, expectedXml);
|
|
@@ -28,18 +28,24 @@
|
|
|
28
28
|
NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
|
|
29
29
|
int buffersize;
|
|
30
30
|
xmlChar *xmlbuff;
|
|
31
|
-
int rc =
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
|
|
32
|
+
if (rc >= 0) {
|
|
33
|
+
rc = [FBXPath xmlRepresentationWithRootElement:(XCElementSnapshot *)element
|
|
34
|
+
writer:writer
|
|
35
|
+
elementStore:elementStore
|
|
36
|
+
query:query
|
|
37
|
+
excludingAttributes:excludedAttributes];
|
|
38
|
+
if (rc >= 0) {
|
|
39
|
+
rc = xmlTextWriterEndDocument(writer);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (rc >= 0) {
|
|
37
43
|
xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
|
|
38
44
|
}
|
|
39
45
|
xmlFreeTextWriter(writer);
|
|
40
46
|
xmlFreeDoc(doc);
|
|
41
47
|
|
|
42
|
-
|
|
48
|
+
XCTAssertTrue(rc >= 0);
|
|
43
49
|
XCTAssertEqual(1, [elementStore count]);
|
|
44
50
|
|
|
45
51
|
NSString *result = [NSString stringWithCString:(const char *)xmlbuff encoding:NSUTF8StringEncoding];
|
|
@@ -72,12 +78,13 @@
|
|
|
72
78
|
- (void)testXPathPresentationBasedOnQueryMatchingAllAttributes
|
|
73
79
|
{
|
|
74
80
|
XCUIElementDouble *element = [XCUIElementDouble new];
|
|
81
|
+
element.wdValue = @"йоло<>&\"";
|
|
75
82
|
NSString *resultXml = [self xmlStringWithElement:element
|
|
76
83
|
xpathQuery:[NSString stringWithFormat:@"//%@[@*]", element.wdType]
|
|
77
84
|
excludingAttributes:@[@"visible"]];
|
|
78
85
|
NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" private_indexPath=\"top\"/>\n",
|
|
79
|
-
element.wdType, element.wdType,
|
|
80
|
-
XCTAssertTrue([resultXml isEqualToString:
|
|
86
|
+
element.wdType, element.wdType, @"йоло<>&"", element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdAccessible ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex];
|
|
87
|
+
XCTAssertTrue([resultXml isEqualToString:expectedXml]);
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
- (void)testXPathPresentationBasedOnQueryMatchingSomeAttributes
|
|
@@ -99,15 +106,21 @@
|
|
|
99
106
|
NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
|
|
100
107
|
XCUIElementDouble *root = [XCUIElementDouble new];
|
|
101
108
|
NSString *query = [NSString stringWithFormat:@"//%@", root.wdType];
|
|
102
|
-
int rc =
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
|
|
110
|
+
if (rc >= 0) {
|
|
111
|
+
rc = [FBXPath xmlRepresentationWithRootElement:(XCElementSnapshot *)root
|
|
112
|
+
writer:writer
|
|
113
|
+
elementStore:elementStore
|
|
114
|
+
query:query
|
|
115
|
+
excludingAttributes:nil];
|
|
116
|
+
if (rc >= 0) {
|
|
117
|
+
rc = xmlTextWriterEndDocument(writer);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
107
120
|
if (rc < 0) {
|
|
108
121
|
xmlFreeTextWriter(writer);
|
|
109
122
|
xmlFreeDoc(doc);
|
|
110
|
-
|
|
123
|
+
XCTFail(@"Unable to create the source XML document");
|
|
111
124
|
}
|
|
112
125
|
|
|
113
126
|
xmlXPathObjectPtr queryResult = [FBXPath evaluate:query document:doc];
|
package/build/lib/utils.js
CHANGED
|
@@ -176,7 +176,7 @@ function getAdditionalRunContent(platformName, wdaRemotePort) {
|
|
|
176
176
|
return {
|
|
177
177
|
[runner]: {
|
|
178
178
|
EnvironmentVariables: {
|
|
179
|
-
USE_PORT: wdaRemotePort
|
|
179
|
+
USE_PORT: `${wdaRemotePort}`
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
};
|
|
@@ -314,4 +314,4 @@ async function getPIDsListeningOnPort(port, filteringFunc = null) {
|
|
|
314
314
|
}require('source-map-support').install();
|
|
315
315
|
|
|
316
316
|
|
|
317
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJST09UX0RJUiIsInBhdGgiLCJiYXNlbmFtZSIsIl9fZGlybmFtZSIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiTk9fUFJFQ09NUElMRSIsIlBST0pFQ1RfRklMRSIsImdldFBJRHNVc2luZ1BhdHRlcm4iLCJwYXR0ZXJuIiwiYXJncyIsInN0ZG91dCIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiXyIsImlzSW50ZWdlciIsImVyciIsImxvZyIsImRlYnVnIiwiam9pbiIsImNvZGUiLCJraWxsQXBwVXNpbmdQYXR0ZXJuIiwicGdyZXBQYXR0ZXJuIiwic2lnbmFscyIsInNpZ25hbCIsIm1hdGNoZWRQaWRzIiwiaXNFbXB0eSIsIm1lc3NhZ2UiLCJsYXN0IiwicGlkQ2hlY2tQcm9taXNlcyIsInBpZCIsInRoZW4iLCJjYXRjaCIsIkIiLCJhbGwiLCJldmVyeSIsIndhaXRNcyIsImludGVydmFsTXMiLCJpZ24iLCJpc1R2T1MiLCJwbGF0Zm9ybU5hbWUiLCJ0b0xvd2VyIiwiUExBVEZPUk1fTkFNRV9UVk9TIiwicmVwbGFjZUluRmlsZSIsImZpbGUiLCJmaW5kIiwicmVwbGFjZSIsImNvbnRlbnRzIiwiZnMiLCJyZWFkRmlsZSIsIm5ld0NvbnRlbnRzIiwid3JpdGVGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJhZ2VudFBhdGgiLCJuZXdCdW5kbGVJZCIsInByb2plY3RGaWxlUGF0aCIsImNvcHlGaWxlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJ3YXJuIiwicmVzZXRQcm9qZWN0RmlsZSIsImV4aXN0cyIsIm12Iiwic2V0UmVhbERldmljZVNlY3VyaXR5Iiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsImdlbmVyYXRlWGNvZGVDb25maWdGaWxlIiwib3JnSWQiLCJzaWduaW5nSWQiLCJ4Y2NvbmZpZ1BhdGgiLCJ0ZW1wRGlyIiwic2V0WGN0ZXN0cnVuRmlsZSIsImRldmljZUluZm8iLCJzZGtWZXJzaW9uIiwiYm9vdHN0cmFwUGF0aCIsIndkYVJlbW90ZVBvcnQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsImdldFhjdGVzdHJ1bkZpbGVQYXRoIiwieGN0ZXN0UnVuQ29udGVudCIsInBsaXN0IiwicGFyc2VQbGlzdEZpbGUiLCJ1cGRhdGVXREFQb3J0IiwiZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQiLCJuZXdYY3Rlc3RSdW5Db250ZW50IiwibWVyZ2UiLCJ1cGRhdGVQbGlzdEZpbGUiLCJydW5uZXIiLCJFbnZpcm9ubWVudFZhcmlhYmxlcyIsIlVTRV9QT1JUIiwic2RrQmFzZWQiLCJ1ZGlkIiwicGxhdGZvcm1CYXNlZCIsInBsYXRmb3JtVmVyc2lvbiIsImZpbGVQYXRoIiwidmVyc2lvbiIsImluZm8iLCJvcmlnaW5hbFhjdGVzdHJ1bkZpbGUiLCJnZXRYY3Rlc3RydW5GaWxlTmFtZSIsImVycm9yQW5kVGhyb3ciLCJpc1JlYWxEZXZpY2UiLCJraWxsUHJvY2VzcyIsIm5hbWUiLCJwcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluY2x1ZGVzIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJwYWNrYWdlTWFuaWZlc3QiLCJtdGltZSIsInN0YXQiLCJnZXRUaW1lIiwicmVzZXRUZXN0UHJvY2Vzc2VzIiwiaXNTaW11bGF0b3IiLCJwcm9jZXNzUGF0dGVybnMiLCJwdXNoIiwiZ2V0UElEc0xpc3RlbmluZ09uUG9ydCIsInBvcnQiLCJmaWx0ZXJpbmdGdW5jIiwicmVzdWx0IiwidHJpbSIsImUiLCJzdGRlcnIiLCJpc0Z1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHQyxjQUFLQyxR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M0csSUFBRixLQUFXLENBQWYsRUFBa0I7QUFFaEIsZUFBTyxLQUFQO0FBQ0Q7O0FBQ0QsWUFBTTJHLENBQU47QUFDRDs7QUFDRCxXQUFPLE1BQU1ILGFBQWEsQ0FBQ3BILE1BQUQsQ0FBMUI7QUFDRCxHQVpZLENBQWI7QUFhRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZzLCB0ZW1wRGlyLCBwbGlzdCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCwgUExBVEZPUk1fTkFNRV9UVk9TIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgUk9PVF9ESVIgPSBwYXRoLmJhc2VuYW1lKF9fZGlybmFtZSkgPT09ICdsaWInXG4gID8gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgcHJvY2Vzcy5lbnYuTk9fUFJFQ09NUElMRSA/ICcuLicgOiAnLi4vLi4nKVxuICA6IF9fZGlybmFtZTtcbmNvbnN0IFBST0pFQ1RfRklMRSA9ICdwcm9qZWN0LnBieHByb2onO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzVXNpbmdQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1pZicsIC8vIGNhc2UgaW5zZW5zaXRpdmUsIGZ1bGwgY21kbGluZSBtYXRjaFxuICAgIHBhdHRlcm4sXG4gIF07XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwZ3JlcCcsIGFyZ3MpO1xuICAgIHJldHVybiBzdGRvdXQuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTApKVxuICAgICAgLmZpbHRlcihfLmlzSW50ZWdlcilcbiAgICAgIC5tYXAoKHgpID0+IGAke3h9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgJ3BncmVwICR7YXJncy5qb2luKCcgJyl9JyBkaWRuJ3QgZGV0ZWN0IGFueSBtYXRjaGluZyBwcm9jZXNzZXMuIFJldHVybiBjb2RlOiAke2Vyci5jb2RlfWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsQXBwVXNpbmdQYXR0ZXJuIChwZ3JlcFBhdHRlcm4pIHtcbiAgY29uc3Qgc2lnbmFscyA9IFsyLCAxNSwgOV07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICBjb25zdCBtYXRjaGVkUGlkcyA9IGF3YWl0IGdldFBJRHNVc2luZ1BhdHRlcm4ocGdyZXBQYXR0ZXJuKTtcbiAgICBpZiAoXy5pc0VtcHR5KG1hdGNoZWRQaWRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gW2AtJHtzaWduYWx9YCwgLi4ubWF0Y2hlZFBpZHNdO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZGVidWcoYGtpbGwgJHthcmdzLmpvaW4oJyAnKX0gLT4gJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHNpZ25hbCA9PT0gXy5sYXN0KHNpZ25hbHMpKSB7XG4gICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgYWZ0ZXIgU0lHS0lMTFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBpZENoZWNrUHJvbWlzZXMgPSBtYXRjaGVkUGlkc1xuICAgICAgICAgIC5tYXAoKHBpZCkgPT4gZXhlYygna2lsbCcsIFsnLTAnLCBwaWRdKVxuICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgc3RpbGwgYWxpdmVcbiAgICAgICAgICAgIC50aGVuKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgZGVhZFxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHRydWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBCLmFsbChwaWRDaGVja1Byb21pc2VzKSlcbiAgICAgICAgICAuZXZlcnkoKHgpID0+IHggPT09IHRydWUpO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IDEwMDAsXG4gICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgLy8gdHJ5IHRoZSBuZXh0IHNpZ25hbFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybU5hbWUgaXMgdHZPU1xuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGxhdG9ybVxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybU5hbWUgaXMgdHZPU1xuICovXG5mdW5jdGlvbiBpc1R2T1MgKHBsYXRmb3JtTmFtZSkge1xuICByZXR1cm4gXy50b0xvd2VyKHBsYXRmb3JtTmFtZSkgPT09IF8udG9Mb3dlcihQTEFURk9STV9OQU1FX1RWT1MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlSW5GaWxlIChmaWxlLCBmaW5kLCByZXBsYWNlKSB7XG4gIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG5cbiAgbGV0IG5ld0NvbnRlbnRzID0gY29udGVudHMucmVwbGFjZShmaW5kLCByZXBsYWNlKTtcbiAgaWYgKG5ld0NvbnRlbnRzICE9PSBjb250ZW50cykge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCBuZXdDb250ZW50cywgJ3V0ZjgnKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB3aXRoIG5ld0J1bmRsZUlkLlxuICogVGhpcyBtZXRob2QgYXNzdW1lcyBwcm9qZWN0IGZpbGUgaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWdlbnRQYXRoIC0gUGF0aCB0byB0aGUgLnhjb2RlcHJvaiBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmV3QnVuZGxlSWQgdGhlIG5ldyBidW5kbGUgSUQgdXNlZCB0byB1cGRhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByb2plY3RGaWxlIChhZ2VudFBhdGgsIG5ld0J1bmRsZUlkKSB7XG4gIGxldCBwcm9qZWN0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoYWdlbnRQYXRoLCBQUk9KRUNUX0ZJTEUpO1xuICB0cnkge1xuICAgIC8vIEFzc3VtaW5nIHByb2plY3RGaWxlUGF0aCBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZSwgY3JlYXRlIC5vbGQgZnJvbSBwcm9qZWN0RmlsZVBhdGhcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShwcm9qZWN0RmlsZVBhdGgsIGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCk7XG4gICAgYXdhaXQgcmVwbGFjZUluRmlsZShwcm9qZWN0RmlsZVBhdGgsIG5ldyBSZWdFeHAoXy5lc2NhcGVSZWdFeHAoV0RBX1JVTk5FUl9CVU5ETEVfSUQpLCAnZycpLCBuZXdCdW5kbGVJZCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSB1cGRhdGVkICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYnVuZGxlIGlkICcke25ld0J1bmRsZUlkfSdgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGBFcnJvciB1cGRhdGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byB1cGRhdGUgcHJvamVjdCBmaWxlICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYCArXG4gICAgICBgYnVuZGxlIGlkICcke25ld0J1bmRsZUlkfScuIFdlYkRyaXZlckFnZW50IG1heSBub3Qgc3RhcnRgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0IFdlYkRyaXZlckFnZW50UnVubmVyIHByb2plY3QgYnVuZGxlIElEIHRvIGNvcnJlY3Qgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWdlbnRQYXRoIC0gUGF0aCB0byB0aGUgLnhjb2RlcHJvaiBkaXJlY3RvcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0UHJvamVjdEZpbGUgKGFnZW50UGF0aCkge1xuICBjb25zdCBwcm9qZWN0RmlsZVBhdGggPSBwYXRoLmpvaW4oYWdlbnRQYXRoLCBQUk9KRUNUX0ZJTEUpO1xuICB0cnkge1xuICAgIC8vIHJlc3RvcmUgcHJvamVjdEZpbGVQYXRoIGZyb20gLm9sZCBmaWxlXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYCR7cHJvamVjdEZpbGVQYXRofS5vbGRgKSkge1xuICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHJlc2V0XG4gICAgfVxuICAgIGF3YWl0IGZzLm12KGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCwgcHJvamVjdEZpbGVQYXRoKTtcbiAgICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNldCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtXREFfUlVOTkVSX0JVTkRMRV9JRH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgcmVzZXR0aW5nIHByb2plY3QgZmlsZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtXREFfUlVOTkVSX0JVTkRMRV9JRH0nLiBXZWJEcml2ZXJBZ2VudCBoYXMgYmVlbiBgICtcbiAgICAgIGBtb2RpZmllZCBhbmQgbm90IHJldHVybmVkIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWFsRGV2aWNlU2VjdXJpdHkgKGtleWNoYWluUGF0aCwga2V5Y2hhaW5QYXNzd29yZCkge1xuICBsb2cuZGVidWcoJ1NldHRpbmcgc2VjdXJpdHkgZm9yIGlPUyBkZXZpY2UnKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJy12JywgJ2xpc3Qta2V5Y2hhaW5zJywgJy1zJywga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICd1bmxvY2sta2V5Y2hhaW4nLCAnLXAnLCBrZXljaGFpblBhc3N3b3JkLCBrZXljaGFpblBhdGhdKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJ3NldC1rZXljaGFpbi1zZXR0aW5ncycsICctdCcsICczNjAwJywgJy1sJywga2V5Y2hhaW5QYXRoXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlIChvcmdJZCwgc2lnbmluZ0lkKSB7XG4gIGxvZy5kZWJ1ZyhgR2VuZXJhdGluZyB4Y29kZSBjb25maWcgZmlsZSBmb3Igb3JnSWQgJyR7b3JnSWR9JyBhbmQgc2lnbmluZ0lkIGAgK1xuICAgICAgICAgICAgYCcke3NpZ25pbmdJZH0nYCk7XG4gIGNvbnN0IGNvbnRlbnRzID0gYERFVkVMT1BNRU5UX1RFQU0gPSAke29yZ0lkfVxuQ09ERV9TSUdOX0lERU5USVRZID0gJHtzaWduaW5nSWR9XG5gO1xuICBjb25zdCB4Y2NvbmZpZ1BhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoJ2FwcGl1bS10ZW1wLnhjY29uZmlnJyk7XG4gIGxvZy5kZWJ1ZyhgV3JpdGluZyB4Y29kZSBjb25maWcgZmlsZSB0byAke3hjY29uZmlnUGF0aH1gKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHhjY29uZmlnUGF0aCwgY29udGVudHMsICd1dGY4Jyk7XG4gIHJldHVybiB4Y2NvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNSZWFsRGV2aWNlIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgcmVhbCBkZXZpY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1ZGlkIC0gVGhlIGRldmljZSBVRElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3JtVmVyc2lvbiAtIFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIE9TLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBwbGF0Zm9ybSBuYW1lIG9mIGlPUywgdHZPU1xuKi9cbi8qKlxuICogQ3JlYXRlcyB4Y3Rlc3RydW4gZmlsZSBwZXIgZGV2aWNlICYgcGxhdGZvcm0gdmVyc2lvbi5cbiAqIFdlIGV4cGVjdHMgdG8gaGF2ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIGFuZCBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVzaW11bGF0b3Ike3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS14ODZfNjQueGN0ZXN0cnVuIGZvciBzaW11bGF0b3IgbG9jYXRlZCBAYm9vdHN0cmFwUGF0aFxuICogTmV3ZXIgWGNvZGUgKFhjb2RlIDEwLjAgYXQgbGVhc3QpIGdlbmVyYXRlIHhjdGVzdHJ1biBmaWxlIGZvbGxvd2luZyBzZGtWZXJzaW9uLlxuICogZS5nLiBYY29kZSB3aGljaCBoYXMgaU9TIFNESyBWZXJzaW9uIDEyLjIgZ2VuZXJhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yLjIteDg2XzY0LnhjdGVzdHJ1blxuICogICAgICBldmVuIGlmIHRoZSBjYXAgaGFzIHBsYXRmb3JtIHZlcnNpb24gMTEuNFxuICpcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHdkYVJlbW90ZVBvcnQgLSBUaGUgcmVtb3RlIHBvcnQgV0RBIGlzIGxpc3RlbmluZyBvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyB4Y3Rlc3RydW5GaWxlUGF0aCBmb3IgZ2l2ZW4gZGV2aWNlXG4gKiBAdGhyb3dzIGlmIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZW9zJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0tYXJtNjQueGN0ZXN0cnVuIGZvciByZWFsIGRldmljZVxuICogb3IgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGlzIG5vdCBmb3VuZCBAYm9vdHN0cmFwUGF0aCxcbiAqIHRoZW4gaXQgd2lsbCB0aHJvdyBmaWxlIG5vdCBmb3VuZCBleGNlcHRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0WGN0ZXN0cnVuRmlsZSAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCwgd2RhUmVtb3RlUG9ydCkge1xuICBjb25zdCB4Y3Rlc3RydW5GaWxlUGF0aCA9IGF3YWl0IGdldFhjdGVzdHJ1bkZpbGVQYXRoKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgpO1xuICBjb25zdCB4Y3Rlc3RSdW5Db250ZW50ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUoeGN0ZXN0cnVuRmlsZVBhdGgpO1xuICBjb25zdCB1cGRhdGVXREFQb3J0ID0gZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQoZGV2aWNlSW5mby5wbGF0Zm9ybU5hbWUsIHdkYVJlbW90ZVBvcnQpO1xuICBjb25zdCBuZXdYY3Rlc3RSdW5Db250ZW50ID0gXy5tZXJnZSh4Y3Rlc3RSdW5Db250ZW50LCB1cGRhdGVXREFQb3J0KTtcbiAgYXdhaXQgcGxpc3QudXBkYXRlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoLCBuZXdYY3Rlc3RSdW5Db250ZW50LCB0cnVlKTtcblxuICByZXR1cm4geGN0ZXN0cnVuRmlsZVBhdGg7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBXREEgb2JqZWN0IHdoaWNoIGFwcGVuZHMgZXhpc3RpbmcgeGN0ZXN0IHJ1bm5lciBjb250ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEByZXR1cm4ge29iamVjdH0gcmV0dXJucyBhIHJ1bm5lciBvYmplY3Qgd2hpY2ggaGFzIFVTRV9QT1JUXG4gKi9cbmZ1bmN0aW9uIGdldEFkZGl0aW9uYWxSdW5Db250ZW50IChwbGF0Zm9ybU5hbWUsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgcnVubmVyID0gYFdlYkRyaXZlckFnZW50UnVubmVyJHtpc1R2T1MocGxhdGZvcm1OYW1lKSA/ICdfdHZPUycgOiAnJ31gO1xuXG4gIHJldHVybiB7XG4gICAgW3J1bm5lcl06IHtcbiAgICAgIEVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgIFVTRV9QT1JUOiB3ZGFSZW1vdGVQb3J0XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcGF0aCBvZiB4Y3Rlc3RydW4gaWYgaXQgZXhpc3RzXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtWZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb3RzdHJhcFBhdGggLSBUaGUgZm9sZGVyIHBhdGggY29udGFpbmluZyB4Y3Rlc3RydW4gZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0WGN0ZXN0cnVuRmlsZVBhdGggKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgpIHtcbiAgLy8gRmlyc3QgdHJ5IHRoZSBTREsgcGF0aCwgZm9yIFhjb2RlIDEwIChhdCBsZWFzdClcbiAgY29uc3Qgc2RrQmFzZWQgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGAke2RldmljZUluZm8udWRpZH1fJHtzZGtWZXJzaW9ufS54Y3Rlc3RydW5gKSxcbiAgICBzZGtWZXJzaW9uLFxuICBdO1xuICAvLyBOZXh0IHRyeSBQbGF0Zm9ybSBwYXRoLCBmb3IgZWFybGllciBYY29kZSB2ZXJzaW9uc1xuICBjb25zdCBwbGF0Zm9ybUJhc2VkID0gW1xuICAgIHBhdGgucmVzb2x2ZShib290c3RyYXBQYXRoLCBgJHtkZXZpY2VJbmZvLnVkaWR9XyR7ZGV2aWNlSW5mby5wbGF0Zm9ybVZlcnNpb259LnhjdGVzdHJ1bmApLFxuICAgIGRldmljZUluZm8ucGxhdGZvcm1WZXJzaW9uLFxuICBdO1xuXG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCB2ZXJzaW9uXSBvZiBbc2RrQmFzZWQsIHBsYXRmb3JtQmFzZWRdKSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgIGxvZy5pbmZvKGBVc2luZyAnJHtmaWxlUGF0aH0nIGFzIHhjdGVzdHJ1biBmaWxlYCk7XG4gICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSA9IHBhdGgucmVzb2x2ZShib290c3RyYXBQYXRoLCBnZXRYY3Rlc3RydW5GaWxlTmFtZShkZXZpY2VJbmZvLCB2ZXJzaW9uKSk7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhvcmlnaW5hbFhjdGVzdHJ1bkZpbGUpKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIGZpcnN0IHRpbWUgcnVuIGZvciBnaXZlbiBkZXZpY2UsIHRoZW4gZmlyc3QgZ2VuZXJhdGUgeGN0ZXN0cnVuIGZpbGUgZm9yIGRldmljZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhIHhjdGVzdHJ1biBmaWxlICoqcGVyIGRldmljZSoqIGJlY2F1c2Ugd2UgY2FudCBub3QgaGF2ZSBzYW1lIHdkYSBwb3J0IGZvciBhbGwgZGV2aWNlcy5cbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSwgZmlsZVBhdGgpO1xuICAgICAgbG9nLmluZm8oYFVzaW5nICcke2ZpbGVQYXRofScgYXMgeGN0ZXN0cnVuIGZpbGUgY29waWVkIGJ5ICcke29yaWdpbmFsWGN0ZXN0cnVuRmlsZX0nYCk7XG4gICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgfVxuICB9XG5cbiAgbG9nLmVycm9yQW5kVGhyb3coYElmIHlvdSBhcmUgdXNpbmcgJ3VzZVhjdGVzdHJ1bkZpbGUnIGNhcGFiaWxpdHkgdGhlbiB5b3UgYCArXG4gICAgYG5lZWQgdG8gaGF2ZSBhIHhjdGVzdHJ1biBmaWxlIChleHBlY3RlZDogYCArXG4gICAgYCcke3BhdGgucmVzb2x2ZShib290c3RyYXBQYXRoLCBnZXRYY3Rlc3RydW5GaWxlTmFtZShkZXZpY2VJbmZvLCBzZGtWZXJzaW9uKSl9JylgKTtcbn1cblxuXG4vKipcbiAqIFJldHVybiB0aGUgbmFtZSBvZiB4Y3Rlc3RydW4gZmlsZVxuICogQHBhcmFtIHtEZXZpY2VJbmZvfSBkZXZpY2VJbmZvXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyB4Y3Rlc3RydW5GaWxlUGF0aCBmb3IgZ2l2ZW4gZGV2aWNlXG4gKi9cbmZ1bmN0aW9uIGdldFhjdGVzdHJ1bkZpbGVOYW1lIChkZXZpY2VJbmZvLCB2ZXJzaW9uKSB7XG4gIHJldHVybiBpc1R2T1MoZGV2aWNlSW5mby5wbGF0Zm9ybU5hbWUpXG4gICAgPyBgV2ViRHJpdmVyQWdlbnRSdW5uZXJfdHZPU19hcHBsZXR2JHtkZXZpY2VJbmZvLmlzUmVhbERldmljZSA/IGBvcyR7dmVyc2lvbn0tYXJtNjRgIDogYHNpbXVsYXRvciR7dmVyc2lvbn0teDg2XzY0YH0ueGN0ZXN0cnVuYFxuICAgIDogYFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZSR7ZGV2aWNlSW5mby5pc1JlYWxEZXZpY2UgPyBgb3Mke3ZlcnNpb259LWFybTY0YCA6IGBzaW11bGF0b3Ike3ZlcnNpb259LXg4Nl82NGB9LnhjdGVzdHJ1bmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzIChuYW1lLCBwcm9jKSB7XG4gIGlmICghcHJvYyB8fCAhcHJvYy5pc1J1bm5pbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuaW5mbyhgU2h1dHRpbmcgZG93biAnJHtuYW1lfScgcHJvY2VzcyAocGlkICcke3Byb2MucHJvYy5waWR9JylgKTtcblxuICBsb2cuaW5mbyhgU2VuZGluZyAnU0lHVEVSTScuLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwcm9jLnN0b3AoJ1NJR1RFUk0nLCAxMDAwKTtcbiAgICByZXR1cm47XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghZXJyLm1lc3NhZ2UuaW5jbHVkZXMoYFByb2Nlc3MgZGlkbid0IGVuZCBhZnRlcmApKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgJHtuYW1lfSBwcm9jZXNzIGRpZCBub3QgZW5kIGluIGEgdGltZWx5IGZhc2hpb246ICcke2Vyci5tZXNzYWdlfScuYCk7XG4gIH1cblxuICBsb2cuaW5mbyhgU2VuZGluZyAnU0lHS0lMTCcuLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwcm9jLnN0b3AoJ1NJR0tJTEwnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCdub3QgY3VycmVudGx5IHJ1bm5pbmcnKSkge1xuICAgICAgLy8gdGhlIHByb2Nlc3MgZW5kZWQgYnV0IGZvciBzb21lIHJlYXNvbiB3ZSB3ZXJlIG5vdCBpbmZvcm1lZFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBpbnRlZ2VyLlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gaW50ZWdlciBudW1iZXIgaW4gcmFuZ2UgW2xvdywgaGlnaHQpLiBgbG93YGAgaXMgaW5jbHVzaXZlIGFuZCBgaGlnaGAgaXMgZXhjbHVzaXZlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnQgKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cpICsgbG93KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgV0RBIHVwZ3JhZGUgdGltZXN0YW1wXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gVGhlIFVOSVggdGltZXN0YW1wIG9mIHRoZSBwYWNrYWdlIG1hbmlmZXN0LiBUaGUgbWFuaWZlc3Qgb25seSBnZXRzIG1vZGlmaWVkIG9uXG4gKiBwYWNrYWdlIHVwZ3JhZGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAgKCkge1xuICBjb25zdCBwYWNrYWdlTWFuaWZlc3QgPSBwYXRoLnJlc29sdmUoUk9PVF9ESVIsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGFja2FnZU1hbmlmZXN0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHttdGltZX0gPSBhd2FpdCBmcy5zdGF0KHBhY2thZ2VNYW5pZmVzdCk7XG4gIHJldHVybiBtdGltZS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogS2lsbHMgcnVubmluZyBYQ1Rlc3QgcHJvY2Vzc2VzIGZvciB0aGUgcGFydGljdWxhciBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU2ltdWxhdG9yIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgU2ltdWxhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0VGVzdFByb2Nlc3NlcyAodWRpZCwgaXNTaW11bGF0b3IpIHtcbiAgY29uc3QgcHJvY2Vzc1BhdHRlcm5zID0gW2B4Y29kZWJ1aWxkLioke3VkaWR9YF07XG4gIGlmIChpc1NpbXVsYXRvcikge1xuICAgIHByb2Nlc3NQYXR0ZXJucy5wdXNoKGAke3VkaWR9LipYQ1RSdW5uZXJgKTtcbiAgICAvLyBUaGUgcGF0dGVybiB0byBmaW5kIGluIGNhc2UgaWRiIHdhcyB1c2VkXG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYHhjdGVzdC4qJHt1ZGlkfWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgS2lsbGluZyBydW5uaW5nIHByb2Nlc3NlcyAnJHtwcm9jZXNzUGF0dGVybnMuam9pbignLCAnKX0nIGZvciB0aGUgZGV2aWNlICR7dWRpZH0uLi5gKTtcbiAgYXdhaXQgQi5hbGwocHJvY2Vzc1BhdHRlcm5zLm1hcChraWxsQXBwVXNpbmdQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBJRHMgb2YgcHJvY2Vzc2VzIGxpc3RlbmluZyBvbiB0aGUgcGFydGljdWxhciBzeXN0ZW0gcG9ydC5cbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlXG4gKiBwcm9jZXNzIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBvcnQgLSBUaGUgcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZmlsdGVyaW5nRnVuYyAtIE9wdGlvbmFsIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXMgY29tbWFuZCBsaW5lIHN0cmluZyBvZiB0aGUgcGFydGljdWxhciBwcm9jZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBnaXZlbiBwb3J0LCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUvZXhjbHVkZSB0aGUgY29ycmVzcG9uZGluZyBQSURcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0aW5nIGFycmF5LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IC0gdGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIGlkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0xpc3RlbmluZ09uUG9ydCAocG9ydCwgZmlsdGVyaW5nRnVuYyA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIE1hYyBPUyBYIEVsIENhcGl0YW5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWBdKTtcbiAgICByZXN1bHQucHVzaCguLi4oc3Rkb3V0LnRyaW0oKS5zcGxpdCgvXFxuKy8pKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAvLyBjb2RlIDEgbWVhbnMgbm8gcHJvY2Vzc2VzLiBPdGhlciBlcnJvcnMgbmVlZCByZXBvcnRpbmdcbiAgICAgIGxvZy5kZWJ1ZyhgRXJyb3IgZ2V0dGluZyBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHBvcnQgJyR7cG9ydH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghXy5pc0Z1bmN0aW9uKGZpbHRlcmluZ0Z1bmMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gYXdhaXQgQi5maWx0ZXIocmVzdWx0LCBhc3luYyAocGlkKSA9PiB7XG4gICAgbGV0IHN0ZG91dDtcbiAgICB0cnkge1xuICAgICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncHMnLCBbJy1wJywgcGlkLCAnLW8nLCAnY29tbWFuZCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gMSkge1xuICAgICAgICAvLyBUaGUgcHJvY2VzcyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLCB0aGVyZSdzIG5vdGhpbmcgdG8gZmlsdGVyXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmaWx0ZXJpbmdGdW5jKHN0ZG91dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgeyB1cGRhdGVQcm9qZWN0RmlsZSwgcmVzZXRQcm9qZWN0RmlsZSwgc2V0UmVhbERldmljZVNlY3VyaXR5LFxuICBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUsIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlLFxuICBzZXRYY3Rlc3RydW5GaWxlLCBnZXRYY3Rlc3RydW5GaWxlUGF0aCwga2lsbFByb2Nlc3MsIHJhbmRvbUludCxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLFxuICBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBraWxsQXBwVXNpbmdQYXR0ZXJuLCBpc1R2T1MsXG59O1xuIl0sImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
317
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJST09UX0RJUiIsInBhdGgiLCJiYXNlbmFtZSIsIl9fZGlybmFtZSIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiTk9fUFJFQ09NUElMRSIsIlBST0pFQ1RfRklMRSIsImdldFBJRHNVc2luZ1BhdHRlcm4iLCJwYXR0ZXJuIiwiYXJncyIsInN0ZG91dCIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiXyIsImlzSW50ZWdlciIsImVyciIsImxvZyIsImRlYnVnIiwiam9pbiIsImNvZGUiLCJraWxsQXBwVXNpbmdQYXR0ZXJuIiwicGdyZXBQYXR0ZXJuIiwic2lnbmFscyIsInNpZ25hbCIsIm1hdGNoZWRQaWRzIiwiaXNFbXB0eSIsIm1lc3NhZ2UiLCJsYXN0IiwicGlkQ2hlY2tQcm9taXNlcyIsInBpZCIsInRoZW4iLCJjYXRjaCIsIkIiLCJhbGwiLCJldmVyeSIsIndhaXRNcyIsImludGVydmFsTXMiLCJpZ24iLCJpc1R2T1MiLCJwbGF0Zm9ybU5hbWUiLCJ0b0xvd2VyIiwiUExBVEZPUk1fTkFNRV9UVk9TIiwicmVwbGFjZUluRmlsZSIsImZpbGUiLCJmaW5kIiwicmVwbGFjZSIsImNvbnRlbnRzIiwiZnMiLCJyZWFkRmlsZSIsIm5ld0NvbnRlbnRzIiwid3JpdGVGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJhZ2VudFBhdGgiLCJuZXdCdW5kbGVJZCIsInByb2plY3RGaWxlUGF0aCIsImNvcHlGaWxlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJ3YXJuIiwicmVzZXRQcm9qZWN0RmlsZSIsImV4aXN0cyIsIm12Iiwic2V0UmVhbERldmljZVNlY3VyaXR5Iiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsImdlbmVyYXRlWGNvZGVDb25maWdGaWxlIiwib3JnSWQiLCJzaWduaW5nSWQiLCJ4Y2NvbmZpZ1BhdGgiLCJ0ZW1wRGlyIiwic2V0WGN0ZXN0cnVuRmlsZSIsImRldmljZUluZm8iLCJzZGtWZXJzaW9uIiwiYm9vdHN0cmFwUGF0aCIsIndkYVJlbW90ZVBvcnQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsImdldFhjdGVzdHJ1bkZpbGVQYXRoIiwieGN0ZXN0UnVuQ29udGVudCIsInBsaXN0IiwicGFyc2VQbGlzdEZpbGUiLCJ1cGRhdGVXREFQb3J0IiwiZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQiLCJuZXdYY3Rlc3RSdW5Db250ZW50IiwibWVyZ2UiLCJ1cGRhdGVQbGlzdEZpbGUiLCJydW5uZXIiLCJFbnZpcm9ubWVudFZhcmlhYmxlcyIsIlVTRV9QT1JUIiwic2RrQmFzZWQiLCJ1ZGlkIiwicGxhdGZvcm1CYXNlZCIsInBsYXRmb3JtVmVyc2lvbiIsImZpbGVQYXRoIiwidmVyc2lvbiIsImluZm8iLCJvcmlnaW5hbFhjdGVzdHJ1bkZpbGUiLCJnZXRYY3Rlc3RydW5GaWxlTmFtZSIsImVycm9yQW5kVGhyb3ciLCJpc1JlYWxEZXZpY2UiLCJraWxsUHJvY2VzcyIsIm5hbWUiLCJwcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluY2x1ZGVzIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJwYWNrYWdlTWFuaWZlc3QiLCJtdGltZSIsInN0YXQiLCJnZXRUaW1lIiwicmVzZXRUZXN0UHJvY2Vzc2VzIiwiaXNTaW11bGF0b3IiLCJwcm9jZXNzUGF0dGVybnMiLCJwdXNoIiwiZ2V0UElEc0xpc3RlbmluZ09uUG9ydCIsInBvcnQiLCJmaWx0ZXJpbmdGdW5jIiwicmVzdWx0IiwidHJpbSIsImUiLCJzdGRlcnIiLCJpc0Z1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHQyxjQUFLQyxR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LENBQUMsQ0FBQzNHLElBQUYsS0FBVyxDQUFmLEVBQWtCO0FBRWhCLGVBQU8sS0FBUDtBQUNEOztBQUNELFlBQU0yRyxDQUFOO0FBQ0Q7O0FBQ0QsV0FBTyxNQUFNSCxhQUFhLENBQUNwSCxNQUFELENBQTFCO0FBQ0QsR0FaWSxDQUFiO0FBYUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciwgcGxpc3QgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFBMQVRGT1JNX05BTUVfVFZPUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IFJPT1RfRElSID0gcGF0aC5iYXNlbmFtZShfX2Rpcm5hbWUpID09PSAnbGliJ1xuICA/IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIHByb2Nlc3MuZW52Lk5PX1BSRUNPTVBJTEUgPyAnLi4nIDogJy4uLy4uJylcbiAgOiBfX2Rpcm5hbWU7XG5jb25zdCBQUk9KRUNUX0ZJTEUgPSAncHJvamVjdC5wYnhwcm9qJztcblxuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc1VzaW5nUGF0dGVybiAocGF0dGVybikge1xuICBjb25zdCBhcmdzID0gW1xuICAgICctaWYnLCAvLyBjYXNlIGluc2Vuc2l0aXZlLCBmdWxsIGNtZGxpbmUgbWF0Y2hcbiAgICBwYXR0ZXJuLFxuICBdO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncGdyZXAnLCBhcmdzKTtcbiAgICByZXR1cm4gc3Rkb3V0LnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgIC5maWx0ZXIoXy5pc0ludGVnZXIpXG4gICAgICAubWFwKCh4KSA9PiBgJHt4fWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYCdwZ3JlcCAke2FyZ3Muam9pbignICcpfScgZGlkbid0IGRldGVjdCBhbnkgbWF0Y2hpbmcgcHJvY2Vzc2VzLiBSZXR1cm4gY29kZTogJHtlcnIuY29kZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbEFwcFVzaW5nUGF0dGVybiAocGdyZXBQYXR0ZXJuKSB7XG4gIGNvbnN0IHNpZ25hbHMgPSBbMiwgMTUsIDldO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlZFBpZHMgPSBhd2FpdCBnZXRQSURzVXNpbmdQYXR0ZXJuKHBncmVwUGF0dGVybik7XG4gICAgaWYgKF8uaXNFbXB0eShtYXRjaGVkUGlkcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IFtgLSR7c2lnbmFsfWAsIC4uLm1hdGNoZWRQaWRzXTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKGBraWxsICR7YXJncy5qb2luKCcgJyl9IC0+ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChzaWduYWwgPT09IF8ubGFzdChzaWduYWxzKSkge1xuICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGFmdGVyIFNJR0tJTExcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwaWRDaGVja1Byb21pc2VzID0gbWF0Y2hlZFBpZHNcbiAgICAgICAgICAubWFwKChwaWQpID0+IGV4ZWMoJ2tpbGwnLCBbJy0wJywgcGlkXSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgICAudGhlbigoKSA9PiBmYWxzZSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIGRlYWRcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0cnVlKVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgQi5hbGwocGlkQ2hlY2tQcm9taXNlcykpXG4gICAgICAgICAgLmV2ZXJ5KCh4KSA9PiB4ID09PSB0cnVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiAxMDAwLFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIHRyeSB0aGUgbmV4dCBzaWduYWxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhlIHBsYXRvcm1cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqL1xuZnVuY3Rpb24gaXNUdk9TIChwbGF0Zm9ybU5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihwbGF0Zm9ybU5hbWUpID09PSBfLnRvTG93ZXIoUExBVEZPUk1fTkFNRV9UVk9TKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUluRmlsZSAoZmlsZSwgZmluZCwgcmVwbGFjZSkge1xuICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlLCAndXRmOCcpO1xuXG4gIGxldCBuZXdDb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoZmluZCwgcmVwbGFjZSk7XG4gIGlmIChuZXdDb250ZW50cyAhPT0gY29udGVudHMpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZSwgbmV3Q29udGVudHMsICd1dGY4Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXIgcHJvamVjdCBidW5kbGUgSUQgd2l0aCBuZXdCdW5kbGVJZC5cbiAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgcHJvamVjdCBmaWxlIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICogQHBhcmFtIHtzdHJpbmd9IG5ld0J1bmRsZUlkIHRoZSBuZXcgYnVuZGxlIElEIHVzZWQgdG8gdXBkYXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RmlsZSAoYWdlbnRQYXRoLCBuZXdCdW5kbGVJZCkge1xuICBsZXQgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyBBc3N1bWluZyBwcm9qZWN0RmlsZVBhdGggaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUsIGNyZWF0ZSAub2xkIGZyb20gcHJvamVjdEZpbGVQYXRoXG4gICAgYXdhaXQgZnMuY29weUZpbGUocHJvamVjdEZpbGVQYXRoLCBgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGApO1xuICAgIGF3YWl0IHJlcGxhY2VJbkZpbGUocHJvamVjdEZpbGVQYXRoLCBuZXcgUmVnRXhwKF8uZXNjYXBlUmVnRXhwKFdEQV9SVU5ORVJfQlVORExFX0lEKSwgJ2cnKSwgbmV3QnVuZGxlSWQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgdXBkYXRlZCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgdXBkYXRpbmcgcHJvamVjdCBmaWxlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gdXBkYXRlIHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nLiBXZWJEcml2ZXJBZ2VudCBtYXkgbm90IHN0YXJ0YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB0byBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNldFByb2plY3RGaWxlIChhZ2VudFBhdGgpIHtcbiAgY29uc3QgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5qb2luKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyByZXN0b3JlIHByb2plY3RGaWxlUGF0aCBmcm9tIC5vbGQgZmlsZVxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCkpIHtcbiAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byByZXNldFxuICAgIH1cbiAgICBhd2FpdCBmcy5tdihgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGAsIHByb2plY3RGaWxlUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzZXQgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9J2ApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYEVycm9yIHJlc2V0dGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNldCBwcm9qZWN0IGZpbGUgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBgICtcbiAgICAgIGBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9Jy4gV2ViRHJpdmVyQWdlbnQgaGFzIGJlZW4gYCArXG4gICAgICBgbW9kaWZpZWQgYW5kIG5vdCByZXR1cm5lZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUuYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0UmVhbERldmljZVNlY3VyaXR5IChrZXljaGFpblBhdGgsIGtleWNoYWluUGFzc3dvcmQpIHtcbiAgbG9nLmRlYnVnKCdTZXR0aW5nIHNlY3VyaXR5IGZvciBpT1MgZGV2aWNlJyk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICdsaXN0LWtleWNoYWlucycsICctcycsIGtleWNoYWluUGF0aF0pO1xuICBhd2FpdCBleGVjKCdzZWN1cml0eScsIFsnLXYnLCAndW5sb2NrLWtleWNoYWluJywgJy1wJywga2V5Y2hhaW5QYXNzd29yZCwga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWydzZXQta2V5Y2hhaW4tc2V0dGluZ3MnLCAnLXQnLCAnMzYwMCcsICctbCcsIGtleWNoYWluUGF0aF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSAob3JnSWQsIHNpZ25pbmdJZCkge1xuICBsb2cuZGVidWcoYEdlbmVyYXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgZm9yIG9yZ0lkICcke29yZ0lkfScgYW5kIHNpZ25pbmdJZCBgICtcbiAgICAgICAgICAgIGAnJHtzaWduaW5nSWR9J2ApO1xuICBjb25zdCBjb250ZW50cyA9IGBERVZFTE9QTUVOVF9URUFNID0gJHtvcmdJZH1cbkNPREVfU0lHTl9JREVOVElUWSA9ICR7c2lnbmluZ0lkfVxuYDtcbiAgY29uc3QgeGNjb25maWdQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKCdhcHBpdW0tdGVtcC54Y2NvbmZpZycpO1xuICBsb2cuZGVidWcoYFdyaXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgdG8gJHt4Y2NvbmZpZ1BhdGh9YCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZSh4Y2NvbmZpZ1BhdGgsIGNvbnRlbnRzLCAndXRmOCcpO1xuICByZXR1cm4geGNjb25maWdQYXRoO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlzUmVhbERldmljZSAtIEVxdWFscyB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyBhIHJlYWwgZGV2aWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybVZlcnNpb24gLSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBvZiBPUy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgLSBUaGUgcGxhdGZvcm0gbmFtZSBvZiBpT1MsIHR2T1NcbiovXG4vKipcbiAqIENyZWF0ZXMgeGN0ZXN0cnVuIGZpbGUgcGVyIGRldmljZSAmIHBsYXRmb3JtIHZlcnNpb24uXG4gKiBXZSBleHBlY3RzIHRvIGhhdmUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lb3Mke3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS1hcm02NC54Y3Rlc3RydW4gZm9yIHJlYWwgZGV2aWNlXG4gKiBhbmQgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGxvY2F0ZWQgQGJvb3RzdHJhcFBhdGhcbiAqIE5ld2VyIFhjb2RlIChYY29kZSAxMC4wIGF0IGxlYXN0KSBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb2xsb3dpbmcgc2RrVmVyc2lvbi5cbiAqIGUuZy4gWGNvZGUgd2hpY2ggaGFzIGlPUyBTREsgVmVyc2lvbiAxMi4yIGdlbmVyYXRlIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvci4yLXg4Nl82NC54Y3Rlc3RydW5cbiAqICAgICAgZXZlbiBpZiB0aGUgY2FwIGhhcyBwbGF0Zm9ybSB2ZXJzaW9uIDExLjRcbiAqXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtWZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb3RzdHJhcFBhdGggLSBUaGUgZm9sZGVyIHBhdGggY29udGFpbmluZyB4Y3Rlc3RydW4gZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZGFSZW1vdGVQb3J0IC0gVGhlIHJlbW90ZSBwb3J0IFdEQSBpcyBsaXN0ZW5pbmcgb24uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgeGN0ZXN0cnVuRmlsZVBhdGggZm9yIGdpdmVuIGRldmljZVxuICogQHRocm93cyBpZiBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIG9yIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvciR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LXg4Nl82NC54Y3Rlc3RydW4gZm9yIHNpbXVsYXRvciBpcyBub3QgZm91bmQgQGJvb3RzdHJhcFBhdGgsXG4gKiB0aGVuIGl0IHdpbGwgdGhyb3cgZmlsZSBub3QgZm91bmQgZXhjZXB0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldFhjdGVzdHJ1bkZpbGUgKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgeGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBnZXRYY3Rlc3RydW5GaWxlUGF0aChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoKTtcbiAgY29uc3QgeGN0ZXN0UnVuQ29udGVudCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoKTtcbiAgY29uc3QgdXBkYXRlV0RBUG9ydCA9IGdldEFkZGl0aW9uYWxSdW5Db250ZW50KGRldmljZUluZm8ucGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KTtcbiAgY29uc3QgbmV3WGN0ZXN0UnVuQ29udGVudCA9IF8ubWVyZ2UoeGN0ZXN0UnVuQ29udGVudCwgdXBkYXRlV0RBUG9ydCk7XG4gIGF3YWl0IHBsaXN0LnVwZGF0ZVBsaXN0RmlsZSh4Y3Rlc3RydW5GaWxlUGF0aCwgbmV3WGN0ZXN0UnVuQ29udGVudCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIHhjdGVzdHJ1bkZpbGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgV0RBIG9iamVjdCB3aGljaCBhcHBlbmRzIGV4aXN0aW5nIHhjdGVzdCBydW5uZXIgY29udGVudFxuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcmV0dXJuIHtvYmplY3R9IHJldHVybnMgYSBydW5uZXIgb2JqZWN0IHdoaWNoIGhhcyBVU0VfUE9SVFxuICovXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCAocGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KSB7XG4gIGNvbnN0IHJ1bm5lciA9IGBXZWJEcml2ZXJBZ2VudFJ1bm5lciR7aXNUdk9TKHBsYXRmb3JtTmFtZSkgPyAnX3R2T1MnIDogJyd9YDtcblxuICByZXR1cm4ge1xuICAgIFtydW5uZXJdOiB7XG4gICAgICBFbnZpcm9ubWVudFZhcmlhYmxlczoge1xuICAgICAgICAvLyBVU0VfUE9SVCBtdXN0IGJlICdzdHJpbmcnXG4gICAgICAgIFVTRV9QT1JUOiBgJHt3ZGFSZW1vdGVQb3J0fWBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYXRoIG9mIHhjdGVzdHJ1biBpZiBpdCBleGlzdHNcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlUGF0aCAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCkge1xuICAvLyBGaXJzdCB0cnkgdGhlIFNESyBwYXRoLCBmb3IgWGNvZGUgMTAgKGF0IGxlYXN0KVxuICBjb25zdCBzZGtCYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke3Nka1ZlcnNpb259LnhjdGVzdHJ1bmApLFxuICAgIHNka1ZlcnNpb24sXG4gIF07XG4gIC8vIE5leHQgdHJ5IFBsYXRmb3JtIHBhdGgsIGZvciBlYXJsaWVyIFhjb2RlIHZlcnNpb25zXG4gIGNvbnN0IHBsYXRmb3JtQmFzZWQgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGAke2RldmljZUluZm8udWRpZH1fJHtkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgZGV2aWNlSW5mby5wbGF0Zm9ybVZlcnNpb24sXG4gIF07XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHZlcnNpb25dIG9mIFtzZGtCYXNlZCwgcGxhdGZvcm1CYXNlZF0pIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYFVzaW5nICcke2ZpbGVQYXRofScgYXMgeGN0ZXN0cnVuIGZpbGVgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxYY3Rlc3RydW5GaWxlID0gcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHZlcnNpb24pKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSkpIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgZmlyc3QgdGltZSBydW4gZm9yIGdpdmVuIGRldmljZSwgdGhlbiBmaXJzdCBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb3IgZGV2aWNlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKipwZXIgZGV2aWNlKiogYmVjYXVzZSB3ZSBjYW50IG5vdCBoYXZlIHNhbWUgd2RhIHBvcnQgZm9yIGFsbCBkZXZpY2VzLlxuICAgICAgYXdhaXQgZnMuY29weUZpbGUob3JpZ2luYWxYY3Rlc3RydW5GaWxlLCBmaWxlUGF0aCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZSBjb3BpZWQgYnkgJyR7b3JpZ2luYWxYY3Rlc3RydW5GaWxlfSdgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gIH1cblxuICBsb2cuZXJyb3JBbmRUaHJvdyhgSWYgeW91IGFyZSB1c2luZyAndXNlWGN0ZXN0cnVuRmlsZScgY2FwYWJpbGl0eSB0aGVuIHlvdSBgICtcbiAgICBgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKGV4cGVjdGVkOiBgICtcbiAgICBgJyR7cGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHNka1ZlcnNpb24pKX0nKWApO1xufVxuXG5cbi8qKlxuICogUmV0dXJuIHRoZSBuYW1lIG9mIHhjdGVzdHJ1biBmaWxlXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHhjdGVzdHJ1bkZpbGVQYXRoIGZvciBnaXZlbiBkZXZpY2VcbiAqL1xuZnVuY3Rpb24gZ2V0WGN0ZXN0cnVuRmlsZU5hbWUgKGRldmljZUluZm8sIHZlcnNpb24pIHtcbiAgcmV0dXJuIGlzVHZPUyhkZXZpY2VJbmZvLnBsYXRmb3JtTmFtZSlcbiAgICA/IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl90dk9TX2FwcGxldHYke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gXG4gICAgOiBgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lJHtkZXZpY2VJbmZvLmlzUmVhbERldmljZSA/IGBvcyR7dmVyc2lvbn0tYXJtNjRgIDogYHNpbXVsYXRvciR7dmVyc2lvbn0teDg2XzY0YH0ueGN0ZXN0cnVuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3MgKG5hbWUsIHByb2MpIHtcbiAgaWYgKCFwcm9jIHx8ICFwcm9jLmlzUnVubmluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICcke25hbWV9JyBwcm9jZXNzIChwaWQgJyR7cHJvYy5wcm9jLnBpZH0nKWApO1xuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdURVJNJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHVEVSTScsIDEwMDApO1xuICAgIHJldHVybjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcyhgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyYCkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGAke25hbWV9IHByb2Nlc3MgZGlkIG5vdCBlbmQgaW4gYSB0aW1lbHkgZmFzaGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy5gKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdLSUxMJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBjdXJyZW50bHkgcnVubmluZycpKSB7XG4gICAgICAvLyB0aGUgcHJvY2VzcyBlbmRlZCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgbm90IGluZm9ybWVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIG51bWJlciBpbiByYW5nZSBbbG93LCBoaWdodCkuIGBsb3dgYCBpcyBpbmNsdXNpdmUgYW5kIGBoaWdoYCBpcyBleGNsdXNpdmUuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludCAobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykgKyBsb3cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBXREEgdXBncmFkZSB0aW1lc3RhbXBcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgVU5JWCB0aW1lc3RhbXAgb2YgdGhlIHBhY2thZ2UgbWFuaWZlc3QuIFRoZSBtYW5pZmVzdCBvbmx5IGdldHMgbW9kaWZpZWQgb25cbiAqIHBhY2thZ2UgdXBncmFkZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShST09UX0RJUiwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhwYWNrYWdlTWFuaWZlc3QpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge210aW1lfSA9IGF3YWl0IGZzLnN0YXQocGFja2FnZU1hbmlmZXN0KTtcbiAgcmV0dXJuIG10aW1lLmdldFRpbWUoKTtcbn1cblxuLyoqXG4gKiBLaWxscyBydW5uaW5nIFhDVGVzdCBwcm9jZXNzZXMgZm9yIHRoZSBwYXJ0aWN1bGFyIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTaW11bGF0b3IgLSBFcXVhbHMgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgYSBTaW11bGF0b3JcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZXRUZXN0UHJvY2Vzc2VzICh1ZGlkLCBpc1NpbXVsYXRvcikge1xuICBjb25zdCBwcm9jZXNzUGF0dGVybnMgPSBbYHhjb2RlYnVpbGQuKiR7dWRpZH1gXTtcbiAgaWYgKGlzU2ltdWxhdG9yKSB7XG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYCR7dWRpZH0uKlhDVFJ1bm5lcmApO1xuICAgIC8vIFRoZSBwYXR0ZXJuIHRvIGZpbmQgaW4gY2FzZSBpZGIgd2FzIHVzZWRcbiAgICBwcm9jZXNzUGF0dGVybnMucHVzaChgeGN0ZXN0Lioke3VkaWR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBLaWxsaW5nIHJ1bm5pbmcgcHJvY2Vzc2VzICcke3Byb2Nlc3NQYXR0ZXJucy5qb2luKCcsICcpfScgZm9yIHRoZSBkZXZpY2UgJHt1ZGlkfS4uLmApO1xuICBhd2FpdCBCLmFsbChwcm9jZXNzUGF0dGVybnMubWFwKGtpbGxBcHBVc2luZ1BhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIElEcyBvZiBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBwb3J0LlxuICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBseSBhZGRpdGlvbmFsIGZpbHRlcmluZyBiYXNlZCBvbiB0aGVcbiAqIHByb2Nlc3MgY29tbWFuZCBsaW5lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcG9ydCAtIFRoZSBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBmaWx0ZXJpbmdGdW5jIC0gT3B0aW9uYWwgbGFtYmRhIGZ1bmN0aW9uLCB3aGljaFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcyBjb21tYW5kIGxpbmUgc3RyaW5nIG9mIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGdpdmVuIHBvcnQsIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gaW5jbHVkZS9leGNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIFBJRFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSByZXN1bHRpbmcgYXJyYXkuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gLSB0aGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgaWRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzTGlzdGVuaW5nT25Qb3J0IChwb3J0LCBmaWx0ZXJpbmdGdW5jID0gbnVsbCkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIG9ubHkgd29ya3Mgc2luY2UgTWFjIE9TIFggRWwgQ2FwaXRhblxuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YF0pO1xuICAgIHJlc3VsdC5wdXNoKC4uLihzdGRvdXQudHJpbSgpLnNwbGl0KC9cXG4rLykpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgIC8vIGNvZGUgMSBtZWFucyBubyBwcm9jZXNzZXMuIE90aGVyIGVycm9ycyBuZWVkIHJlcG9ydGluZ1xuICAgICAgbG9nLmRlYnVnKGBFcnJvciBnZXR0aW5nIHByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gcG9ydCAnJHtwb3J0fSc6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFfLmlzRnVuY3Rpb24oZmlsdGVyaW5nRnVuYykpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiBhd2FpdCBCLmZpbHRlcihyZXN1bHQsIGFzeW5jIChwaWQpID0+IHtcbiAgICBsZXQgc3Rkb3V0O1xuICAgIHRyeSB7XG4gICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwcycsIFsnLXAnLCBwaWQsICctbycsICdjb21tYW5kJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSAxKSB7XG4gICAgICAgIC8vIFRoZSBwcm9jZXNzIGRvZXMgbm90IGV4aXN0IGFueW1vcmUsIHRoZXJlJ3Mgbm90aGluZyB0byBmaWx0ZXJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZpbHRlcmluZ0Z1bmMoc3Rkb3V0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBzZXRSZWFsRGV2aWNlU2VjdXJpdHksXG4gIGdldEFkZGl0aW9uYWxSdW5Db250ZW50LCBnZXRYY3Rlc3RydW5GaWxlTmFtZSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsXG4gIHNldFhjdGVzdHJ1bkZpbGUsIGdldFhjdGVzdHJ1bkZpbGVQYXRoLCBraWxsUHJvY2VzcywgcmFuZG9tSW50LFxuICBnZXRXREFVcGdyYWRlVGltZXN0YW1wLCByZXNldFRlc3RQcm9jZXNzZXMsXG4gIGdldFBJRHNMaXN0ZW5pbmdPblBvcnQsIGtpbGxBcHBVc2luZ1BhdHRlcm4sIGlzVHZPUyxcbn07XG4iXSwiZmlsZSI6ImxpYi91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
package/lib/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-webdriveragent",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.16.0",
|
|
4
4
|
"description": "Package bundling WebDriverAgent",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"ios-uicatalog": "^3.5.0",
|
|
55
55
|
"mocha": "^9.0.0",
|
|
56
56
|
"pre-commit": "^1.2.2",
|
|
57
|
-
"sinon": "^
|
|
57
|
+
"sinon": "^12.0.0",
|
|
58
58
|
"wd": "^1.11.4"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|