oxygen-cli 1.22.0 → 1.99.0-alpha.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.
Files changed (232) hide show
  1. package/CHANGELOG.md +0 -50
  2. package/build/core/OxygenCore.js +56 -145
  3. package/build/errors/OxygenError.js +5 -15
  4. package/build/errors/helper.js +45 -49
  5. package/build/index.js +14 -6
  6. package/build/lib/cli-util.js +19 -19
  7. package/build/lib/cli.js +4 -2
  8. package/build/lib/parallel-launcher.js +333 -0
  9. package/build/lib/param-manager.js +66 -47
  10. package/build/lib/util.js +38 -9
  11. package/build/ox_modules/index.js +1 -97
  12. package/build/ox_modules/module-assert.js +19 -9
  13. package/build/ox_modules/module-dns.js +220 -0
  14. package/build/ox_modules/module-http.js +39 -51
  15. package/build/ox_modules/module-shell.js +19 -75
  16. package/build/ox_modules/module-utils.js +1 -108
  17. package/build/ox_modules/utils.js +1 -357
  18. package/build/reporter/FileReporterBase.js +5 -5
  19. package/build/reporter/ReportAggregator.js +127 -4
  20. package/build/runners/WorkerProcess.js +15 -28
  21. package/build/runners/index.js +2 -6
  22. package/build/runners/oxygen/OxygenWorker.js +8 -8
  23. package/build/runners/oxygen/index.js +17 -18
  24. package/build/runners/oxygen/worker.js +10 -8
  25. package/package.json +12 -46
  26. package/build/lib/img-merge.js +0 -163
  27. package/build/ox_modules/module-db.js +0 -146
  28. package/build/ox_modules/module-email.js +0 -212
  29. package/build/ox_modules/module-eyes.js +0 -189
  30. package/build/ox_modules/module-mailinator.js +0 -207
  31. package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
  32. package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
  33. package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
  34. package/build/ox_modules/module-mob/commands/assertText.js +0 -45
  35. package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
  36. package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
  37. package/build/ox_modules/module-mob/commands/back.js +0 -27
  38. package/build/ox_modules/module-mob/commands/clear.js +0 -40
  39. package/build/ox_modules/module-mob/commands/click.js +0 -35
  40. package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
  41. package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
  42. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
  43. package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
  44. package/build/ox_modules/module-mob/commands/debug.js +0 -26
  45. package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
  46. package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
  47. package/build/ox_modules/module-mob/commands/execute.js +0 -32
  48. package/build/ox_modules/module-mob/commands/findElement.js +0 -36
  49. package/build/ox_modules/module-mob/commands/findElements.js +0 -39
  50. package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
  51. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
  52. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
  53. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
  54. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
  55. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
  56. package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
  57. package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
  58. package/build/ox_modules/module-mob/commands/getSource.js +0 -26
  59. package/build/ox_modules/module-mob/commands/getText.js +0 -36
  60. package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
  61. package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
  62. package/build/ox_modules/module-mob/commands/getValue.js +0 -50
  63. package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
  64. package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
  65. package/build/ox_modules/module-mob/commands/index.js +0 -594
  66. package/build/ox_modules/module-mob/commands/installApp.js +0 -28
  67. package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
  68. package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
  69. package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
  70. package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
  71. package/build/ox_modules/module-mob/commands/isExist.js +0 -36
  72. package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
  73. package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
  74. package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
  75. package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
  76. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
  77. package/build/ox_modules/module-mob/commands/open.js +0 -43
  78. package/build/ox_modules/module-mob/commands/pause.js +0 -27
  79. package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
  80. package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
  81. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
  82. package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
  83. package/build/ox_modules/module-mob/commands/select.js +0 -54
  84. package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
  85. package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
  86. package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
  87. package/build/ox_modules/module-mob/commands/setContext.js +0 -28
  88. package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
  89. package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
  90. package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
  91. package/build/ox_modules/module-mob/commands/shake.js +0 -27
  92. package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
  93. package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
  94. package/build/ox_modules/module-mob/commands/swipe.js +0 -58
  95. package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
  96. package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
  97. package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
  98. package/build/ox_modules/module-mob/commands/tap.js +0 -34
  99. package/build/ox_modules/module-mob/commands/type.js +0 -67
  100. package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
  101. package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
  102. package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
  103. package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
  104. package/build/ox_modules/module-mob.js +0 -699
  105. package/build/ox_modules/module-pdf.js +0 -328
  106. package/build/ox_modules/module-proxy.js +0 -324
  107. package/build/ox_modules/module-serial.js +0 -187
  108. package/build/ox_modules/module-soap.js +0 -260
  109. package/build/ox_modules/module-twilio.js +0 -192
  110. package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
  111. package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
  112. package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
  113. package/build/ox_modules/module-web/commands/assertExist.js +0 -28
  114. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
  115. package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
  116. package/build/ox_modules/module-web/commands/assertText.js +0 -45
  117. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
  118. package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
  119. package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
  120. package/build/ox_modules/module-web/commands/assertValue.js +0 -44
  121. package/build/ox_modules/module-web/commands/back.js +0 -27
  122. package/build/ox_modules/module-web/commands/clear.js +0 -41
  123. package/build/ox_modules/module-web/commands/click.js +0 -112
  124. package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
  125. package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
  126. package/build/ox_modules/module-web/commands/debug.js +0 -25
  127. package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
  128. package/build/ox_modules/module-web/commands/deselect.js +0 -34
  129. package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
  130. package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
  131. package/build/ox_modules/module-web/commands/execute.js +0 -36
  132. package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
  133. package/build/ox_modules/module-web/commands/findElement.js +0 -35
  134. package/build/ox_modules/module-web/commands/findElements.js +0 -38
  135. package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
  136. package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
  137. package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
  138. package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
  139. package/build/ox_modules/module-web/commands/getCookies.js +0 -23
  140. package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
  141. package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
  142. package/build/ox_modules/module-web/commands/getHTML.js +0 -30
  143. package/build/ox_modules/module-web/commands/getSource.js +0 -26
  144. package/build/ox_modules/module-web/commands/getText.js +0 -36
  145. package/build/ox_modules/module-web/commands/getTitle.js +0 -22
  146. package/build/ox_modules/module-web/commands/getUrl.js +0 -26
  147. package/build/ox_modules/module-web/commands/getValue.js +0 -43
  148. package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
  149. package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
  150. package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
  151. package/build/ox_modules/module-web/commands/index.js +0 -634
  152. package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
  153. package/build/ox_modules/module-web/commands/isChecked.js +0 -30
  154. package/build/ox_modules/module-web/commands/isExist.js +0 -36
  155. package/build/ox_modules/module-web/commands/isSelected.js +0 -35
  156. package/build/ox_modules/module-web/commands/isVisible.js +0 -36
  157. package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
  158. package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
  159. package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
  160. package/build/ox_modules/module-web/commands/newWindow.js +0 -27
  161. package/build/ox_modules/module-web/commands/open.js +0 -42
  162. package/build/ox_modules/module-web/commands/pause.js +0 -26
  163. package/build/ox_modules/module-web/commands/point.js +0 -37
  164. package/build/ox_modules/module-web/commands/pointJS.js +0 -56
  165. package/build/ox_modules/module-web/commands/refresh.js +0 -26
  166. package/build/ox_modules/module-web/commands/rightClick.js +0 -61
  167. package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
  168. package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
  169. package/build/ox_modules/module-web/commands/select.js +0 -55
  170. package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
  171. package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
  172. package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
  173. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
  174. package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
  175. package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
  176. package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
  177. package/build/ox_modules/module-web/commands/type.js +0 -52
  178. package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
  179. package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
  180. package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
  181. package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
  182. package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
  183. package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
  184. package/build/ox_modules/module-web/commands/waitForText.js +0 -45
  185. package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
  186. package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
  187. package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
  188. package/build/ox_modules/module-web.js +0 -909
  189. package/build/ox_modules/module-win/commands/assertText.js +0 -41
  190. package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
  191. package/build/ox_modules/module-win/commands/assertValue.js +0 -62
  192. package/build/ox_modules/module-win/commands/back.js +0 -21
  193. package/build/ox_modules/module-win/commands/clear.js +0 -34
  194. package/build/ox_modules/module-win/commands/click.js +0 -25
  195. package/build/ox_modules/module-win/commands/clickLong.js +0 -30
  196. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
  197. package/build/ox_modules/module-win/commands/findElement.js +0 -31
  198. package/build/ox_modules/module-win/commands/findElements.js +0 -31
  199. package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
  200. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
  201. package/build/ox_modules/module-win/commands/getLocation.js +0 -26
  202. package/build/ox_modules/module-win/commands/getSource.js +0 -22
  203. package/build/ox_modules/module-win/commands/getText.js +0 -32
  204. package/build/ox_modules/module-win/commands/getValue.js +0 -46
  205. package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
  206. package/build/ox_modules/module-win/commands/index.js +0 -298
  207. package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
  208. package/build/ox_modules/module-win/commands/isChecked.js +0 -26
  209. package/build/ox_modules/module-win/commands/isClickable.js +0 -26
  210. package/build/ox_modules/module-win/commands/isExist.js +0 -32
  211. package/build/ox_modules/module-win/commands/isSelected.js +0 -26
  212. package/build/ox_modules/module-win/commands/isVisible.js +0 -32
  213. package/build/ox_modules/module-win/commands/open.js +0 -24
  214. package/build/ox_modules/module-win/commands/pause.js +0 -23
  215. package/build/ox_modules/module-win/commands/rightClick.js +0 -30
  216. package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
  217. package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
  218. package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
  219. package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
  220. package/build/ox_modules/module-win/commands/tap.js +0 -29
  221. package/build/ox_modules/module-win/commands/type.js +0 -38
  222. package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
  223. package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
  224. package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
  225. package/build/ox_modules/module-win.js +0 -367
  226. package/build/ox_services/service-devtools/submodule-network.js +0 -338
  227. package/build/ox_services/service-devtools.js +0 -83
  228. package/build/runners/cucumber/CucumberEventListener.js +0 -181
  229. package/build/runners/cucumber/CucumberReporter.js +0 -277
  230. package/build/runners/cucumber/CucumberWorker.js +0 -337
  231. package/build/runners/cucumber/index.js +0 -159
  232. package/build/runners/cucumber/worker.js +0 -184
@@ -1,184 +0,0 @@
1
- "use strict";
2
-
3
- require("source-map-support/register");
4
-
5
- var _CucumberWorker = _interopRequireDefault(require("./CucumberWorker"));
6
-
7
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
9
- const oxutil = require('../../lib/util');
10
-
11
- const errorHelper = require('../../errors/helper');
12
-
13
- const {
14
- LEVELS,
15
- DEFAULT_LOGGER_ISSUER,
16
- ISSUERS
17
- } = require('../../lib/logger');
18
-
19
- global.browser = {};
20
- const logger = {
21
- info: function (message, src = DEFAULT_LOGGER_ISSUER) {
22
- const ts = oxutil.getTimeStamp();
23
- processSend({
24
- time: ts,
25
- event: 'log',
26
- level: LEVELS.INFO,
27
- msg: stringify(message),
28
- src
29
- });
30
- },
31
- debug: function (message, src = DEFAULT_LOGGER_ISSUER) {
32
- const ts = oxutil.getTimeStamp();
33
- processSend({
34
- time: ts,
35
- event: 'log',
36
- level: LEVELS.DEBUG,
37
- msg: stringify(message),
38
- src
39
- });
40
- },
41
- error: function (message, src = DEFAULT_LOGGER_ISSUER, err = null) {
42
- const ts = oxutil.getTimeStamp();
43
- processSend({
44
- time: ts,
45
- event: 'log',
46
- level: LEVELS.ERROR,
47
- msg: stringify(message),
48
- src,
49
- err: err
50
- });
51
- },
52
- warn: function (message, src = DEFAULT_LOGGER_ISSUER) {
53
- const ts = oxutil.getTimeStamp();
54
- processSend({
55
- time: ts,
56
- event: 'log',
57
- level: LEVELS.WARN,
58
- msg: stringify(message),
59
- src
60
- });
61
- }
62
- };
63
- const reporter = {
64
- onSuiteStart: function (...args) {
65
- emitReporterEvent('onSuiteStart', args);
66
- },
67
- onSuiteEnd: function (...args) {
68
- emitReporterEvent('onSuiteEnd', args);
69
- },
70
- onCaseStart: function (...args) {
71
- emitReporterEvent('onCaseStart', args);
72
- },
73
- onCaseEnd: function (...args) {
74
- emitReporterEvent('onCaseEnd', args);
75
- },
76
- onStepStart: function (...args) {
77
- emitReporterEvent('onStepStart', args);
78
- },
79
- onStepEnd: function (...args) {
80
- emitReporterEvent('onStepEnd', args);
81
- },
82
- onRunnerEnd: function (...args) {
83
- emitReporterEvent('onRunnerEnd', args);
84
- },
85
- onLogEntry: function (...args) {
86
- emitReporterEvent('onLogEntry', args);
87
- }
88
- };
89
-
90
- function stringify(obj) {
91
- return typeof obj === 'string' || obj instanceof String ? obj : JSON.stringify(obj, null, 2);
92
- }
93
-
94
- let _worker = new _CucumberWorker.default(reporter);
95
-
96
- oxutil.hookLogs(logger);
97
- process.on('uncaughtException', async (err, origin) => {
98
- logger.error(err.message, ISSUERS.USER);
99
- processSend({
100
- event: 'workerError',
101
- errMessage: err.message
102
- });
103
- });
104
- process.on('SIGINT', async function () {
105
- console.log('SIGINT received');
106
- await dispose('CANCELED');
107
- process.exit(0);
108
- });
109
- process.on('message', async function (msg) {
110
- if (!msg.type) {
111
- return;
112
- }
113
-
114
- if (msg.type === 'invoke' && msg.method) {
115
- const {
116
- callId,
117
- method,
118
- args
119
- } = msg;
120
- const {
121
- retval,
122
- error
123
- } = await invoke(method, args);
124
- processSend({
125
- event: 'invoke:result',
126
- method: method,
127
- callId: callId,
128
- error: error,
129
- retval: retval
130
- });
131
- } else if (msg.type === 'exit') {
132
- dispose(msg.status || null);
133
- }
134
- });
135
-
136
- function processSend(msg) {
137
- try {
138
- process.send({
139
- time: oxutil.getTimeStamp(),
140
- ...msg
141
- });
142
- } catch (e) {}
143
- }
144
-
145
- function emitReporterEvent(method, args) {
146
- processSend({
147
- event: 'reporter',
148
- method: method,
149
- args: args
150
- });
151
- }
152
-
153
- async function dispose(status = null) {
154
- if (_worker) {
155
- try {
156
- await _worker.dispose(status);
157
- } catch (e) {}
158
- }
159
- }
160
-
161
- async function invoke(method, args) {
162
- let retval, error;
163
-
164
- if (_worker && _worker[method] && typeof _worker[method] === 'function') {
165
- try {
166
- retval = await _worker[method].apply(_worker, args || []);
167
- } catch (e) {
168
- console.log(`Failed to invoke "${method}" method:`, e);
169
- error = e;
170
- }
171
- } else {
172
- error = new Error(`Method "${method}" does not exist`);
173
- }
174
-
175
- if (error) {
176
- error = errorHelper.getFailureFromError(error);
177
- }
178
-
179
- return {
180
- retval,
181
- error
182
- };
183
- }
184
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL2N1Y3VtYmVyL3dvcmtlci5qcyJdLCJuYW1lcyI6WyJveHV0aWwiLCJyZXF1aXJlIiwiZXJyb3JIZWxwZXIiLCJMRVZFTFMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJJU1NVRVJTIiwiZ2xvYmFsIiwiYnJvd3NlciIsImxvZ2dlciIsImluZm8iLCJtZXNzYWdlIiwic3JjIiwidHMiLCJnZXRUaW1lU3RhbXAiLCJwcm9jZXNzU2VuZCIsInRpbWUiLCJldmVudCIsImxldmVsIiwiSU5GTyIsIm1zZyIsInN0cmluZ2lmeSIsImRlYnVnIiwiREVCVUciLCJlcnJvciIsImVyciIsIkVSUk9SIiwid2FybiIsIldBUk4iLCJyZXBvcnRlciIsIm9uU3VpdGVTdGFydCIsImFyZ3MiLCJlbWl0UmVwb3J0ZXJFdmVudCIsIm9uU3VpdGVFbmQiLCJvbkNhc2VTdGFydCIsIm9uQ2FzZUVuZCIsIm9uU3RlcFN0YXJ0Iiwib25TdGVwRW5kIiwib25SdW5uZXJFbmQiLCJvbkxvZ0VudHJ5Iiwib2JqIiwiU3RyaW5nIiwiSlNPTiIsIl93b3JrZXIiLCJDdWN1bWJlcldvcmtlciIsImhvb2tMb2dzIiwicHJvY2VzcyIsIm9uIiwib3JpZ2luIiwiVVNFUiIsImVyck1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZGlzcG9zZSIsImV4aXQiLCJ0eXBlIiwibWV0aG9kIiwiY2FsbElkIiwicmV0dmFsIiwiaW52b2tlIiwic3RhdHVzIiwic2VuZCIsImUiLCJhcHBseSIsIkVycm9yIiwiZ2V0RmFpbHVyZUZyb21FcnJvciJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBOzs7O0FBSEEsTUFBTUEsTUFBTSxHQUFHQyxPQUFPLENBQUMsZ0JBQUQsQ0FBdEI7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHRCxPQUFPLENBQUMscUJBQUQsQ0FBM0I7O0FBQ0EsTUFBTTtBQUFFRSxFQUFBQSxNQUFGO0FBQVVDLEVBQUFBLHFCQUFWO0FBQWlDQyxFQUFBQTtBQUFqQyxJ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LE1BQU8sV0FBeEMsRUFBb0RNLENBQXBEO0FBQ0F0QyxNQUFBQSxLQUFLLEdBQUdzQyxDQUFSO0FBQ0g7QUFDSixHQVJELE1BU0s7QUFDRHRDLElBQUFBLEtBQUssR0FBRyxJQUFJd0MsS0FBSixDQUFXLFdBQVVSLE1BQU8sa0JBQTVCLENBQVI7QUFDSDs7QUFFRCxNQUFJaEMsS0FBSixFQUFXO0FBQ1BBLElBQUFBLEtBQUssR0FBR3JCLFdBQVcsQ0FBQzhELG1CQUFaLENBQWdDekMsS0FBaEMsQ0FBUjtBQUNIOztBQUNELFNBQU87QUFBRWtDLElBQUFBLE1BQUY7QUFBVWxDLElBQUFBO0FBQVYsR0FBUDtBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgb3h1dGlsID0gcmVxdWlyZSgnLi4vLi4vbGliL3V0aWwnKTtcclxuY29uc3QgZXJyb3JIZWxwZXIgPSByZXF1aXJlKCcuLi8uLi9lcnJvcnMvaGVscGVyJyk7XHJcbmNvbnN0IHsgTEVWRUxTLCBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIElTU1VFUlMgfSA9IHJlcXVpcmUoJy4uLy4uL2xpYi9sb2dnZXInKTtcclxuaW1wb3J0IEN1Y3VtYmVyV29ya2VyICBmcm9tICcuL0N1Y3VtYmVyV29ya2VyJztcclxuXHJcbi8vIG1vY2t1cCBnbG9iYmFsLmJyb3dzZXIgb2JqZWN0IGZvciBpbnRlcm5hbCBXRElPIGZ1bmN0aW9ucyB0byB3b3JrIHByb3Blcmx5XHJcbmdsb2JhbC5icm93c2VyID0ge307XHJcblxyXG5jb25zdCBsb2dnZXIgPSB7XHJcbiAgICBpbmZvOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuSU5GTywgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYyB9KTtcclxuICAgIH0sXHJcbiAgICBkZWJ1ZzogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLkRFQlVHLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIGVyciA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuRVJST1IsIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMsIGVycjogZXJyIH0pO1xyXG4gICAgfSxcclxuICAgIHdhcm46IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5XQVJOLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgcmVwb3J0ZXIgPSB7XHJcbiAgICBvblN1aXRlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdWl0ZVN0YXJ0JywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdWl0ZUVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN1aXRlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25DYXNlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkNhc2VFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdGVwU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN0ZXBFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25SdW5uZXJFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25SdW5uZXJFbmQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkxvZ0VudHJ5OiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uTG9nRW50cnknLCBhcmdzKTtcclxuICAgIH1cclxufTtcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcclxuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgb2JqIGluc3RhbmNlb2YgU3RyaW5nID8gb2JqIDogSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKSk7XHJcbn1cclxuXHJcbi8vIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBsb2dnZXJcclxuLy9wcm9jZXNzLnN0ZG91dC53cml0ZSA9IGxvZ2dlci5kZWJ1ZztcclxuLy9wcm9jZXNzLnN0ZGVyci53cml0ZSA9IGxvZ2dlci5lcnJvcjtcclxuXHJcbmxldCBfd29ya2VyID0gbmV3IEN1Y3VtYmVyV29ya2VyKHJlcG9ydGVyKTtcclxuXHJcbm94dXRpbC5ob29rTG9ncyhsb2dnZXIpO1xyXG5cclxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBhc3luYyhlcnIsIG9yaWdpbikgPT4ge1xyXG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLCBJU1NVRVJTLlVTRVIpO1xyXG4gICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgIGV2ZW50OiAnd29ya2VyRXJyb3InLFxyXG4gICAgICAgIGVyck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxucHJvY2Vzcy5vbignU0lHSU5UJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zb2xlLmxvZygnU0lHSU5UIHJlY2VpdmVkJyk7XHJcbiAgICBhd2FpdCBkaXNwb3NlKCdDQU5DRUxFRCcpO1xyXG4gICAgcHJvY2Vzcy5leGl0KDApO1xyXG59KTtcclxuXHJcbnByb2Nlc3Mub24oJ21lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAobXNnKSB7XHJcbiAgICBpZiAoIW1zZy50eXBlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG1zZy50eXBlID09PSAnaW52b2tlJyAmJiBtc2cubWV0aG9kKSB7XHJcbiAgICAgICAgY29uc3QgeyBjYWxsSWQsIG1ldGhvZCwgYXJncyB9ID0gbXNnO1xyXG4gICAgICAgIGNvbnN0IHsgcmV0dmFsLCBlcnJvciB9ID0gYXdhaXQgaW52b2tlKG1ldGhvZCwgYXJncyk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ2ludm9rZTpyZXN1bHQnLFxyXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGVycm9yOiBlcnJvcixcclxuICAgICAgICAgICAgcmV0dmFsOiByZXR2YWxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG1zZy50eXBlID09PSAnZXhpdCcpIHtcclxuICAgICAgICBkaXNwb3NlKG1zZy5zdGF0dXMgfHwgbnVsbCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1NlbmQobXNnKSB7XHJcbiAgICAvLyB3cmFwIHByb2Nlc3Muc2VuZCB3aXRoIHRyeS9jYXRjaCBhcyBzb21ldGltZXMgd2UgbWlnaHQgY2FsbCBwcm9jZXNzLnNlbmQgXHJcbiAgICAvLyB3aGVuIHBhcmVudCBwcm9jZXNzIGlzIGFscmVhZHkgZGlzY29ubmVjdGVkICh3aGVuIHVzZSBraWxscyB0aGUgbWFpbiBwcm9jZXNzKVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBhZGQgdXRjIHRpbWVzdGFtcFxyXG4gICAgICAgIHByb2Nlc3Muc2VuZCh7IHRpbWU6IG94dXRpbC5nZXRUaW1lU3RhbXAoKSwgLi4ubXNnIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBpZ25vcmVcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZW1pdFJlcG9ydGVyRXZlbnQobWV0aG9kLCBhcmdzKSB7XHJcbiAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgZXZlbnQ6ICdyZXBvcnRlcicsXHJcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgICAgYXJnczogYXJnc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2Uoc3RhdHVzPSBudWxsKSB7XHJcbiAgICBpZiAoX3dvcmtlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IF93b3JrZXIuZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZ3MpIHtcclxuICAgIGxldCByZXR2YWwsIGVycm9yO1xyXG4gICAgaWYgKF93b3JrZXIgJiYgX3dvcmtlclttZXRob2RdICYmIHR5cGVvZiBfd29ya2VyW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR2YWwgPSBhd2FpdCBfd29ya2VyW21ldGhvZF0uYXBwbHkoX3dvcmtlciwgYXJncyB8fCBbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gaW52b2tlIFwiJHttZXRob2R9XCIgbWV0aG9kOmAsIGUpO1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYE1ldGhvZCBcIiR7bWV0aG9kfVwiIGRvZXMgbm90IGV4aXN0YCk7XHJcbiAgICB9XHJcbiAgICAvLyBjb252ZXJ0IEpTIGVycm9yIHRvIE94eWdlbiBGYWlsdXJlIG9iamVjdFxyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHJldHZhbCwgZXJyb3IgfTtcclxufSJdfQ==