oxygen-cli 1.40.2 → 1.42.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 (285) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/build/core/OxygenCore.js +41 -274
  3. package/build/core/OxygenEvents.js +2 -12
  4. package/build/core/OxygenModule.js +1 -16
  5. package/build/core/OxygenService.js +1 -12
  6. package/build/core/OxygenSubModule.js +1 -10
  7. package/build/core/WebDriverModule.js +2 -32
  8. package/build/core/utils.js +2 -21
  9. package/build/errors/HookError.js +2 -8
  10. package/build/errors/ModuleError.js +2 -8
  11. package/build/errors/ModuleUnavailableError.js +1 -3
  12. package/build/errors/OxygenError.js +3 -36
  13. package/build/errors/ScriptNotFound.js +2 -8
  14. package/build/errors/helper.js +51 -82
  15. package/build/index.js +8 -22
  16. package/build/lib/cli-util.js +39 -105
  17. package/build/lib/cli.js +3 -30
  18. package/build/lib/debugger.js +2 -145
  19. package/build/lib/img-merge.js +2 -16
  20. package/build/lib/launcher.js +3 -31
  21. package/build/lib/moduleRequire.js +1 -4
  22. package/build/lib/parallel-launcher.js +44 -84
  23. package/build/lib/param-manager.js +2 -29
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/text-to-image.js +5 -26
  28. package/build/lib/util.js +4 -75
  29. package/build/model/case-result.js +1 -2
  30. package/build/model/failure.js +1 -2
  31. package/build/model/status.js +1 -2
  32. package/build/model/step-result.js +1 -2
  33. package/build/model/suite-result.js +1 -2
  34. package/build/model/test-result.js +1 -2
  35. package/build/model/testcase.js +1 -2
  36. package/build/model/testsuite.js +1 -2
  37. package/build/ox_modules/index.js +21 -34
  38. package/build/ox_modules/module-assert.js +9 -28
  39. package/build/ox_modules/module-date.js +3 -8
  40. package/build/ox_modules/module-db.js +8 -29
  41. package/build/ox_modules/module-email.js +14 -45
  42. package/build/ox_modules/module-eyes.js +6 -47
  43. package/build/ox_modules/module-http/ntlm-util.js +3 -7
  44. package/build/ox_modules/module-http/ntlm.js +9 -78
  45. package/build/ox_modules/module-http.js +69 -172
  46. package/build/ox_modules/module-log.js +10 -23
  47. package/build/ox_modules/module-mailinator.js +11 -33
  48. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
  49. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
  50. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
  51. package/build/ox_modules/module-mob/commands/assertText.js +1 -4
  52. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
  53. package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
  54. package/build/ox_modules/module-mob/commands/back.js +1 -3
  55. package/build/ox_modules/module-mob/commands/clear.js +1 -5
  56. package/build/ox_modules/module-mob/commands/click.js +3 -5
  57. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
  58. package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
  59. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
  60. package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
  61. package/build/ox_modules/module-mob/commands/debug.js +2 -3
  62. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
  63. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
  64. package/build/ox_modules/module-mob/commands/execute.js +1 -3
  65. package/build/ox_modules/module-mob/commands/findElement.js +1 -4
  66. package/build/ox_modules/module-mob/commands/findElements.js +1 -5
  67. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
  68. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
  69. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
  70. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
  71. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
  72. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
  73. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
  74. package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
  75. package/build/ox_modules/module-mob/commands/getSource.js +1 -3
  76. package/build/ox_modules/module-mob/commands/getText.js +1 -5
  77. package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
  78. package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
  79. package/build/ox_modules/module-mob/commands/getValue.js +5 -10
  80. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
  81. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
  82. package/build/ox_modules/module-mob/commands/index.js +1 -148
  83. package/build/ox_modules/module-mob/commands/installApp.js +1 -3
  84. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
  85. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
  87. package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isExist.js +1 -4
  89. package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
  90. package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
  91. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
  92. package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
  93. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
  94. package/build/ox_modules/module-mob/commands/open.js +1 -4
  95. package/build/ox_modules/module-mob/commands/pause.js +1 -3
  96. package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
  97. package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
  98. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
  99. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
  100. package/build/ox_modules/module-mob/commands/select.js +1 -5
  101. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
  102. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
  103. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
  104. package/build/ox_modules/module-mob/commands/setContext.js +1 -3
  105. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
  106. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
  107. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
  108. package/build/ox_modules/module-mob/commands/shake.js +1 -3
  109. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
  110. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
  111. package/build/ox_modules/module-mob/commands/swipe.js +1 -3
  112. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
  113. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
  114. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
  115. package/build/ox_modules/module-mob/commands/tap.js +1 -3
  116. package/build/ox_modules/module-mob/commands/type.js +3 -8
  117. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
  118. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
  119. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
  120. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
  121. package/build/ox_modules/module-mob.js +74 -216
  122. package/build/ox_modules/module-mongo.js +265 -0
  123. package/build/ox_modules/module-pdf.js +24 -65
  124. package/build/ox_modules/module-proxy.js +9 -69
  125. package/build/ox_modules/module-serial.js +8 -33
  126. package/build/ox_modules/module-shell.js +10 -30
  127. package/build/ox_modules/module-soap.js +17 -52
  128. package/build/ox_modules/module-twilio.js +11 -54
  129. package/build/ox_modules/module-utils.js +22 -58
  130. package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
  131. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
  133. package/build/ox_modules/module-web/commands/assertExist.js +1 -3
  134. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
  135. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
  136. package/build/ox_modules/module-web/commands/assertText.js +1 -4
  137. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
  138. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
  139. package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
  140. package/build/ox_modules/module-web/commands/assertValue.js +1 -4
  141. package/build/ox_modules/module-web/commands/back.js +1 -3
  142. package/build/ox_modules/module-web/commands/clear.js +1 -6
  143. package/build/ox_modules/module-web/commands/click.js +4 -15
  144. package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
  145. package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
  146. package/build/ox_modules/module-web/commands/debug.js +2 -3
  147. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
  148. package/build/ox_modules/module-web/commands/deselect.js +1 -3
  149. package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
  150. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
  151. package/build/ox_modules/module-web/commands/execute.js +1 -3
  152. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
  153. package/build/ox_modules/module-web/commands/findElement.js +1 -4
  154. package/build/ox_modules/module-web/commands/findElements.js +1 -5
  155. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
  156. package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
  157. package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
  158. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
  159. package/build/ox_modules/module-web/commands/getCookies.js +1 -3
  160. package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
  161. package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
  162. package/build/ox_modules/module-web/commands/getHTML.js +1 -3
  163. package/build/ox_modules/module-web/commands/getSource.js +1 -3
  164. package/build/ox_modules/module-web/commands/getText.js +1 -5
  165. package/build/ox_modules/module-web/commands/getTitle.js +1 -3
  166. package/build/ox_modules/module-web/commands/getUrl.js +1 -3
  167. package/build/ox_modules/module-web/commands/getValue.js +1 -6
  168. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
  169. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
  170. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
  171. package/build/ox_modules/module-web/commands/index.js +1 -184
  172. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
  173. package/build/ox_modules/module-web/commands/isChecked.js +1 -3
  174. package/build/ox_modules/module-web/commands/isExist.js +1 -4
  175. package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
  176. package/build/ox_modules/module-web/commands/isSelected.js +1 -3
  177. package/build/ox_modules/module-web/commands/isVisible.js +1 -4
  178. package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
  179. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
  180. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
  181. package/build/ox_modules/module-web/commands/mock.js +1 -3
  182. package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
  183. package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
  184. package/build/ox_modules/module-web/commands/newWindow.js +1 -3
  185. package/build/ox_modules/module-web/commands/open.js +1 -5
  186. package/build/ox_modules/module-web/commands/pause.js +1 -3
  187. package/build/ox_modules/module-web/commands/point.js +1 -3
  188. package/build/ox_modules/module-web/commands/pointJS.js +2 -9
  189. package/build/ox_modules/module-web/commands/refresh.js +1 -3
  190. package/build/ox_modules/module-web/commands/rightClick.js +3 -9
  191. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
  192. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
  193. package/build/ox_modules/module-web/commands/select.js +1 -6
  194. package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
  195. package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
  196. package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
  197. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
  198. package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
  199. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
  200. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
  201. package/build/ox_modules/module-web/commands/type.js +1 -6
  202. package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
  203. package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
  204. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
  205. package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
  206. package/build/ox_modules/module-web/commands/verifyText.js +1 -4
  207. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
  208. package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
  209. package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
  210. package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
  211. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
  212. package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
  213. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
  214. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
  215. package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
  216. package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
  217. package/build/ox_modules/module-web/commands/waitForText.js +1 -4
  218. package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
  219. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
  220. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
  221. package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
  222. package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
  223. package/build/ox_modules/module-web.js +112 -232
  224. package/build/ox_modules/module-win/commands/assertText.js +1 -4
  225. package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
  226. package/build/ox_modules/module-win/commands/assertValue.js +9 -17
  227. package/build/ox_modules/module-win/commands/back.js +1 -3
  228. package/build/ox_modules/module-win/commands/clear.js +1 -5
  229. package/build/ox_modules/module-win/commands/click.js +1 -3
  230. package/build/ox_modules/module-win/commands/clickLong.js +1 -3
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
  232. package/build/ox_modules/module-win/commands/findElement.js +1 -4
  233. package/build/ox_modules/module-win/commands/findElements.js +1 -5
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
  236. package/build/ox_modules/module-win/commands/getLocation.js +1 -3
  237. package/build/ox_modules/module-win/commands/getSource.js +1 -3
  238. package/build/ox_modules/module-win/commands/getText.js +1 -5
  239. package/build/ox_modules/module-win/commands/getValue.js +5 -10
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
  241. package/build/ox_modules/module-win/commands/index.js +1 -74
  242. package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
  243. package/build/ox_modules/module-win/commands/isChecked.js +1 -3
  244. package/build/ox_modules/module-win/commands/isClickable.js +1 -3
  245. package/build/ox_modules/module-win/commands/isExist.js +1 -4
  246. package/build/ox_modules/module-win/commands/isSelected.js +1 -3
  247. package/build/ox_modules/module-win/commands/isVisible.js +1 -4
  248. package/build/ox_modules/module-win/commands/open.js +1 -3
  249. package/build/ox_modules/module-win/commands/pause.js +1 -3
  250. package/build/ox_modules/module-win/commands/rightClick.js +1 -3
  251. package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
  252. package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
  253. package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
  255. package/build/ox_modules/module-win/commands/tap.js +1 -3
  256. package/build/ox_modules/module-win/commands/type.js +1 -5
  257. package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
  260. package/build/ox_modules/module-win.js +54 -95
  261. package/build/ox_modules/utils.js +91 -79
  262. package/build/ox_reporters/reporter-excel.js +2 -59
  263. package/build/ox_reporters/reporter-html.js +2 -29
  264. package/build/ox_reporters/reporter-json.js +2 -15
  265. package/build/ox_reporters/reporter-junit.js +2 -25
  266. package/build/ox_reporters/reporter-pdf.js +2 -20
  267. package/build/ox_reporters/reporter-rp.js +2 -91
  268. package/build/ox_reporters/reporter-xml.js +2 -18
  269. package/build/ox_services/service-devtools/submodule-network.js +4 -86
  270. package/build/ox_services/service-devtools.js +2 -24
  271. package/build/reporter/FileReporterBase.js +6 -45
  272. package/build/reporter/ReportAggregator.js +14 -120
  273. package/build/reporter/ReporterBase.js +1 -6
  274. package/build/reporter/WebSocketReporter.js +1 -39
  275. package/build/runners/WorkerProcess.js +2 -107
  276. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  277. package/build/runners/cucumber/CucumberReporter.js +2 -57
  278. package/build/runners/cucumber/CucumberWorker.js +3 -69
  279. package/build/runners/cucumber/index.js +2 -31
  280. package/build/runners/cucumber/worker.js +2 -19
  281. package/build/runners/index.js +4 -11
  282. package/build/runners/oxygen/OxygenWorker.js +3 -61
  283. package/build/runners/oxygen/index.js +18 -179
  284. package/build/runners/oxygen/worker.js +3 -27
  285. package/package.json +5 -1
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ require("source-map-support/register");
8
+ var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
9
+ var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
10
+ var _helper = _interopRequireDefault(require("../errors/helper"));
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ /*
13
+ * Copyright (C) 2015-current CloudBeat Limited
14
+ *
15
+ * This program is free software: you can redistribute it and/or modify
16
+ * it under the terms of the GNU General Public License as published by
17
+ * the Free Software Foundation, either version 3 of the License, or
18
+ * (at your option) any later version.
19
+ */
20
+ const {
21
+ MongoClient
22
+ } = require('mongodb');
23
+ const MODULE_NAME = 'mongo';
24
+
25
+ /**
26
+ * @name shell
27
+ * @description Provides methods for working with operating system shell.
28
+ */
29
+ class MongoDbModule extends _OxygenModule.default {
30
+ constructor(options, context, rs, logger, modules, services) {
31
+ super(options, context, rs, logger, modules, services);
32
+ this._alwaysInitialized = false;
33
+ this._isInitialized = false;
34
+ this.client;
35
+ this.db;
36
+ this.collection;
37
+ }
38
+ /**
39
+ * @summary Initializes MongoDB session.
40
+ * @function init
41
+ * @param {string} hostOrUrl - Host name or full URL of the target MongoDB server.
42
+ * @param {string} dbName - Database name. You can change it later using "setDatabase" method.
43
+ * @param {string} [username] - Optional username for authentication.
44
+ * @param {string} [password] - Optional password for authentication.
45
+ * @param {string} [authSource=admin] - Optional authentication source. Default value is "admin".
46
+ * @param {number} [port=27017] - Optional MongoDB server port. Default value is 27017.
47
+ */
48
+ async init(hostOrUrl, dbName, username, password, authSource = 'admin', port = 27017) {
49
+ if (!hostOrUrl || typeof hostOrUrl !== 'string') {
50
+ throw new Error('MongoDB host name or full URL is not specified!');
51
+ } else if (!dbName) {
52
+ throw new Error('MongoDB database name is not specified!');
53
+ }
54
+ const isFullUrl = /^mongodb(\+srv)?:\/\//i.test(hostOrUrl);
55
+ const uri = isFullUrl ? hostOrUrl : (() => {
56
+ if (username) {
57
+ const encUsername = encodeURIComponent(username);
58
+ const encPassword = password ? encodeURIComponent(password) : undefined;
59
+ return `mongodb://${encUsername}:${encPassword || ''}@${hostOrUrl}:${port}/${dbName}?authSource=${authSource}`;
60
+ }
61
+ return `mongodb://${hostOrUrl}:${port}/${dbName}?authSource=${authSource}`;
62
+ })();
63
+ this.client = new MongoClient(uri, {
64
+ useNewUrlParser: true,
65
+ useUnifiedTopology: true
66
+ });
67
+ try {
68
+ await this.client.connect();
69
+ this.db = this.client.db(dbName);
70
+ this._isInitialized = true;
71
+ } catch (e) {
72
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
73
+ }
74
+ }
75
+
76
+ /**
77
+ * @summary Sets the current database to perform further actions.
78
+ * @function setDatabase
79
+ * @param {string} dbName - Database name.
80
+ */
81
+ setDatabase(dbName) {
82
+ this.db = this.client.db(dbName);
83
+ }
84
+
85
+ /**
86
+ * @summary Sets the current collection to perform further actions.
87
+ * @function setCollection
88
+ * @param {string} collectionName - Collection name.
89
+ */
90
+ setCollection(collectionName) {
91
+ if (!this.db) {
92
+ return false;
93
+ }
94
+ this.collection = this.db.collection(collectionName);
95
+ return true;
96
+ }
97
+
98
+ /**
99
+ * @summary Finds documents in the current collection.
100
+ * @function find
101
+ * @param {object} filter - The filter predicate.
102
+ * @param {object} options - Optional settings for the command.
103
+ * @return {object} A list of documents.
104
+ */
105
+ async find(filter, options) {
106
+ if (!this.collection) {
107
+ return undefined;
108
+ }
109
+ try {
110
+ return await this.collection.find(filter, options).toArray();
111
+ } catch (e) {
112
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
113
+ }
114
+ }
115
+
116
+ /**
117
+ * @summary Gets the number of documents matching the filter.
118
+ * @function countDocuments
119
+ * @param {object} filter - The filter for the count.
120
+ * @param {object} options - Optional settings for the command.
121
+ * @return {number} Number of documents matching the filter.
122
+ */
123
+ async countDocuments(filter, options) {
124
+ if (!this.collection) {
125
+ return undefined;
126
+ }
127
+ try {
128
+ return await this.collection.countDocuments(filter, options);
129
+ } catch (e) {
130
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
131
+ }
132
+ }
133
+
134
+ /**
135
+ * @summary Inserts a single document into a collection.
136
+ * @function insertOne
137
+ * @param {object} doc - The document to insert.
138
+ * @param {object} options - Optional settings for the command.
139
+ */
140
+ async insertOne(doc, options) {
141
+ if (!this.collection) {
142
+ return undefined;
143
+ }
144
+ try {
145
+ return await this.collection.insertOne(doc, options);
146
+ } catch (e) {
147
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
148
+ }
149
+ }
150
+
151
+ /**
152
+ * @summary Inserts an array of documents into a collection.
153
+ * @function insertMany
154
+ * @param {object} docs - The documents to insert.
155
+ * @param {object} options - Optional settings for the command.
156
+ */
157
+ async insertMany(docs, options) {
158
+ if (!this.collection) {
159
+ return undefined;
160
+ }
161
+ try {
162
+ return await this.collection.insertMany(docs, options);
163
+ } catch (e) {
164
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
165
+ }
166
+ }
167
+
168
+ /**
169
+ * @summary Update a single document in a collection.
170
+ * @function updateOne
171
+ * @param {object} filter - The filter used to select the document to replace.
172
+ * @param {UpdateFilter<TSchema>|Document[]} update - The modifications to apply.
173
+ * @param {object} options - Optional settings for the command.
174
+ */
175
+ async updateOne(filter, update) {
176
+ if (!this.collection) {
177
+ return undefined;
178
+ }
179
+ try {
180
+ return await this.collection.updateOne(filter, update);
181
+ } catch (e) {
182
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
183
+ }
184
+ }
185
+
186
+ /**
187
+ * @summary Update multiple documents in a collection.
188
+ * @function updateMany
189
+ * @param {object} filter - The filter used to select the document to update.
190
+ * @param {UpdateFilter<TSchema>|Document[]} update - The modifications to apply.
191
+ * @param {object} options - Optional settings for the command.
192
+ */
193
+ async updateMany(filter, update, options) {
194
+ if (!this.collection) {
195
+ return undefined;
196
+ }
197
+ try {
198
+ return await this.collection.updateMany(filter, update, options);
199
+ } catch (e) {
200
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * @summary Replace a document in a collection with another document.
206
+ * @function replaceOne
207
+ * @param {object} filter - The filter used to select the document to replace.
208
+ * @param {object} doc - The Document that replaces the matching document.
209
+ * @param {object} options - Optional settings for the command.
210
+ */
211
+ async replaceOne(filter, doc) {
212
+ if (!this.collection) {
213
+ return undefined;
214
+ }
215
+ try {
216
+ return await this.collection.replaceOne(filter, doc);
217
+ } catch (e) {
218
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
219
+ }
220
+ }
221
+
222
+ /**
223
+ * @summary Delete a document from a collection.
224
+ * @function deleteOne
225
+ * @param {object} filter - The filter used to select the document to remove.
226
+ * @param {object} options - Optional settings for the command.
227
+ */
228
+ async deleteOne(filter) {
229
+ if (!this.collection) {
230
+ return undefined;
231
+ }
232
+ try {
233
+ return await this.collection.deleteOne(filter);
234
+ } catch (e) {
235
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
236
+ }
237
+ }
238
+ /**
239
+ * @summary Delete multiple documents from a collection.
240
+ * @function deleteMany
241
+ * @param {object} filter - The filter used to select the documents to remove.
242
+ * @param {object} options - Optional settings for the command.
243
+ */
244
+ async deleteMany(filter) {
245
+ if (!this.collection) {
246
+ return undefined;
247
+ }
248
+ try {
249
+ return await this.collection.deleteMany(filter);
250
+ } catch (e) {
251
+ throw new _OxygenError.default(_helper.default.errorCode.MONGODB_ERROR, e.message, null, true, e);
252
+ }
253
+ }
254
+
255
+ /**
256
+ * @summary Gets module name
257
+ * @function name
258
+ * @return {String} Constant value "shell".
259
+ */
260
+ get name() {
261
+ return MODULE_NAME;
262
+ }
263
+ }
264
+ exports.default = MongoDbModule;
265
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfT3h5Z2VuTW9kdWxlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfT3h5Z2VuRXJyb3IiLCJfaGVscGVyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTW9uZ29DbGllbnQiLCJNT0RVTEVfTkFNRSIsIk1vbmdvRGJNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfaXNJbml0aWFsaXplZCIsImNsaWVudCIsImRiIiwiY29sbGVjdGlvbiIsImluaXQiLCJob3N0T3JVcmwiLCJkYk5hbWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiYXV0aFNvdXJjZSIsInBvcnQiLCJFcnJvciIsImlzRnVsbFVybCIsInRlc3QiLCJ1cmkiLCJlbmNVc2VybmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImVuY1Bhc3N3b3JkIiwidW5kZWZpbmVkIiwidXNlTmV3VXJsUGFyc2VyIiwidXNlVW5pZmllZFRvcG9sb2d5IiwiY29ubmVjdCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT05HT0RCX0VSUk9SIiwibWVzc2FnZSIsInNldERhdGFiYXNlIiwic2V0Q29sbGVjdGlvbiIsImNvbGxlY3Rpb25OYW1lIiwiZmluZCIsImZpbHRlciIsInRvQXJyYXkiLCJjb3VudERvY3VtZW50cyIsImluc2VydE9uZSIsImRvYyIsImluc2VydE1hbnkiLCJkb2NzIiwidXBkYXRlT25lIiwidXBkYXRlIiwidXBkYXRlTWFueSIsInJlcGxhY2VPbmUiLCJkZWxldGVPbmUiLCJkZWxldGVNYW55IiwibmFtZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvb3hfbW9kdWxlcy9tb2R1bGUtbW9uZ28uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LWN1cnJlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcbmNvbnN0IHsgTW9uZ29DbGllbnQgfSA9IHJlcXVpcmUoJ21vbmdvZGInKTtcclxuaW1wb3J0IE94eWdlbk1vZHVsZSBmcm9tICcuLi9jb3JlL094eWdlbk1vZHVsZSc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdtb25nbyc7XHJcblxyXG4vKipcclxuICogQG5hbWUgc2hlbGxcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBvcGVyYXRpbmcgc3lzdGVtIHNoZWxsLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9uZ29EYk1vZHVsZSBleHRlbmRzIE94eWdlbk1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLl9hbHdheXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNsaWVudDtcclxuICAgICAgICB0aGlzLmRiO1xyXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgTW9uZ29EQiBzZXNzaW9uLlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0T3JVcmwgLSBIb3N0IG5hbWUgb3IgZnVsbCBVUkwgb2YgdGhlIHRhcmdldCBNb25nb0RCIHNlcnZlci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYk5hbWUgLSBEYXRhYmFzZSBuYW1lLiBZb3UgY2FuIGNoYW5nZSBpdCBsYXRlciB1c2luZyBcInNldERhdGFiYXNlXCIgbWV0aG9kLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt1c2VybmFtZV0gLSBPcHRpb25hbCB1c2VybmFtZSBmb3IgYXV0aGVudGljYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3N3b3JkXSAtIE9wdGlvbmFsIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYXV0aFNvdXJjZT1hZG1pbl0gLSBPcHRpb25hbCBhdXRoZW50aWNhdGlvbiBzb3VyY2UuIERlZmF1bHQgdmFsdWUgaXMgXCJhZG1pblwiLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTI3MDE3XSAtIE9wdGlvbmFsIE1vbmdvREIgc2VydmVyIHBvcnQuIERlZmF1bHQgdmFsdWUgaXMgMjcwMTcuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQoXHJcbiAgICAgICAgaG9zdE9yVXJsLFxyXG4gICAgICAgIGRiTmFtZSxcclxuICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICBwYXNzd29yZCxcclxuICAgICAgICBhdXRoU291cmNlID0gJ2FkbWluJyxcclxuICAgICAgICBwb3J0ID0gMjcwMTcsXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoIWhvc3RPclVybCB8fCB0eXBlb2YgaG9zdE9yVXJsICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vbmdvREIgaG9zdCBuYW1lIG9yIGZ1bGwgVVJMIGlzIG5vdCBzcGVjaWZpZWQhJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFkYk5hbWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb25nb0RCIGRhdGFiYXNlIG5hbWUgaXMgbm90IHNwZWNpZmllZCEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNGdWxsVXJsID0gL15tb25nb2RiKFxcK3Nydik/OlxcL1xcLy9pLnRlc3QoaG9zdE9yVXJsKTtcclxuICAgICAgICBjb25zdCB1cmkgPSBpc0Z1bGxVcmxcclxuICAgICAgICAgICAgPyBob3N0T3JVcmxcclxuICAgICAgICAgICAgOiAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jVXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlcm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY1Bhc3N3b3JkID0gcGFzc3dvcmQgPyBlbmNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgbW9uZ29kYjovLyR7ZW5jVXNlcm5hbWV9OiR7ZW5jUGFzc3dvcmQgfHwgJyd9QCR7aG9zdE9yVXJsfToke3BvcnR9LyR7ZGJOYW1lfT9hdXRoU291cmNlPSR7YXV0aFNvdXJjZX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBtb25nb2RiOi8vJHtob3N0T3JVcmx9OiR7cG9ydH0vJHtkYk5hbWV9P2F1dGhTb3VyY2U9JHthdXRoU291cmNlfWA7XHJcbiAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgdGhpcy5jbGllbnQgPSBuZXcgTW9uZ29DbGllbnQodXJpLCB7IHVzZU5ld1VybFBhcnNlcjogdHJ1ZSwgdXNlVW5pZmllZFRvcG9sb2d5OiB0cnVlIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgdGhpcy5kYiA9IHRoaXMuY2xpZW50LmRiKGRiTmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PTkdPREJfRVJST1IsIGUubWVzc2FnZSwgbnVsbCwgdHJ1ZSwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB0aGUgY3VycmVudCBkYXRhYmFzZSB0byBwZXJmb3JtIGZ1cnRoZXIgYWN0aW9ucy5cclxuICAgICAqIEBmdW5jdGlvbiBzZXREYXRhYmFzZSBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYk5hbWUgLSBEYXRhYmFzZSBuYW1lLlxyXG4gICAgICovXHJcbiAgICBzZXREYXRhYmFzZShkYk5hbWUpIHtcclxuICAgICAgICB0aGlzLmRiID0gdGhpcy5jbGllbnQuZGIoZGJOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiB0byBwZXJmb3JtIGZ1cnRoZXIgYWN0aW9ucy5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRDb2xsZWN0aW9uIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25OYW1lIC0gQ29sbGVjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsZWN0aW9uKGNvbGxlY3Rpb25OYW1lKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gdGhpcy5kYi5jb2xsZWN0aW9uKGNvbGxlY3Rpb25OYW1lKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEZpbmRzIGRvY3VtZW50cyBpbiB0aGUgY3VycmVudCBjb2xsZWN0aW9uLlxyXG4gICAgICogQGZ1bmN0aW9uIGZpbmQgXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gVGhlIGZpbHRlciBwcmVkaWNhdGUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIGZvciB0aGUgY29tbWFuZC5cclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gQSBsaXN0IG9mIGRvY3VtZW50cy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZmluZChmaWx0ZXIsIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmZpbmQoZmlsdGVyLCBvcHRpb25zKS50b0FycmF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9OR09EQl9FUlJPUiwgZS5tZXNzYWdlLCBudWxsLCB0cnVlLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIG1hdGNoaW5nIHRoZSBmaWx0ZXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gY291bnREb2N1bWVudHMgXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gVGhlIGZpbHRlciBmb3IgdGhlIGNvdW50LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmQuXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IE51bWJlciBvZiBkb2N1bWVudHMgbWF0Y2hpbmcgdGhlIGZpbHRlci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgY291bnREb2N1bWVudHMoZmlsdGVyLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5jb3VudERvY3VtZW50cyhmaWx0ZXIsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PTkdPREJfRVJST1IsIGUubWVzc2FnZSwgbnVsbCwgdHJ1ZSwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgSW5zZXJ0cyBhIHNpbmdsZSBkb2N1bWVudCBpbnRvIGEgY29sbGVjdGlvbi5cclxuICAgICAqIEBmdW5jdGlvbiBpbnNlcnRPbmUgXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZG9jIC0gVGhlIGRvY3VtZW50IHRvIGluc2VydC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbnNlcnRPbmUoZG9jLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5pbnNlcnRPbmUoZG9jLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEluc2VydHMgYW4gYXJyYXkgb2YgZG9jdW1lbnRzIGludG8gYSBjb2xsZWN0aW9uLlxyXG4gICAgICogQGZ1bmN0aW9uIGluc2VydE1hbnkgXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZG9jcyAtIFRoZSBkb2N1bWVudHMgdG8gaW5zZXJ0LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluc2VydE1hbnkoZG9jcywgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uaW5zZXJ0TWFueShkb2NzLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHNpbmdsZSBkb2N1bWVudCBpbiBhIGNvbGxlY3Rpb24uXHJcbiAgICAgKiBAZnVuY3Rpb24gdXBkYXRlT25lIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGZpbHRlciAtIFRoZSBmaWx0ZXIgdXNlZCB0byBzZWxlY3QgdGhlIGRvY3VtZW50IHRvIHJlcGxhY2UuXHJcbiAgICAgKiBAcGFyYW0ge1VwZGF0ZUZpbHRlcjxUU2NoZW1hPnxEb2N1bWVudFtdfSB1cGRhdGUgLSBUaGUgbW9kaWZpY2F0aW9ucyB0byBhcHBseS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB1cGRhdGVPbmUoZmlsdGVyLCB1cGRhdGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZShmaWx0ZXIsIHVwZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9OR09EQl9FUlJPUiwgZS5tZXNzYWdlLCBudWxsLCB0cnVlLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgbXVsdGlwbGUgZG9jdW1lbnRzIGluIGEgY29sbGVjdGlvbi5cclxuICAgICAqIEBmdW5jdGlvbiB1cGRhdGVNYW55IFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGZpbHRlciAtIFRoZSBmaWx0ZXIgdXNlZCB0byBzZWxlY3QgdGhlIGRvY3VtZW50IHRvIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7VXBkYXRlRmlsdGVyPFRTY2hlbWE+fERvY3VtZW50W119IHVwZGF0ZSAtIFRoZSBtb2RpZmljYXRpb25zIHRvIGFwcGx5LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHVwZGF0ZU1hbnkoZmlsdGVyLCB1cGRhdGUsIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU1hbnkoZmlsdGVyLCB1cGRhdGUsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PTkdPREJfRVJST1IsIGUubWVzc2FnZSwgbnVsbCwgdHJ1ZSwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmVwbGFjZSBhIGRvY3VtZW50IGluIGEgY29sbGVjdGlvbiB3aXRoIGFub3RoZXIgZG9jdW1lbnQuXHJcbiAgICAgKiBAZnVuY3Rpb24gcmVwbGFjZU9uZSBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHRoZSBkb2N1bWVudCB0byByZXBsYWNlLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRvYyAtIFRoZSBEb2N1bWVudCB0aGF0IHJlcGxhY2VzIHRoZSBtYXRjaGluZyBkb2N1bWVudC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSBjb21tYW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyByZXBsYWNlT25lKGZpbHRlciwgZG9jKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5yZXBsYWNlT25lKGZpbHRlciwgZG9jKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT05HT0RCX0VSUk9SLCBlLm1lc3NhZ2UsIG51bGwsIHRydWUsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhIGRvY3VtZW50IGZyb20gYSBjb2xsZWN0aW9uLlxyXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZU9uZSBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHRoZSBkb2N1bWVudCB0byByZW1vdmUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIGZvciB0aGUgY29tbWFuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGVsZXRlT25lKGZpbHRlcikge1xyXG4gICAgICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uZGVsZXRlT25lKGZpbHRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9OR09EQl9FUlJPUiwgZS5tZXNzYWdlLCBudWxsLCB0cnVlLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSBhIGNvbGxlY3Rpb24uXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlTWFueSBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHVzZWQgdG8gc2VsZWN0IHRoZSBkb2N1bWVudHMgdG8gcmVtb3ZlLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZU1hbnkoZmlsdGVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGVNYW55KGZpbHRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9OR09EQl9FUlJPUiwgZS5tZXNzYWdlLCBudWxsLCB0cnVlLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcInNoZWxsXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVNBLElBQUFBLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUF5QyxTQUFBRCx1QkFBQUksQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQVh6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtFQUFFRztBQUFZLENBQUMsR0FBR04sT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUsxQyxNQUFNTyxXQUFXLEdBQUcsT0FBTzs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDZSxNQUFNQyxhQUFhLFNBQVNDLHFCQUFZLENBQUM7RUFDcERDLFdBQVdBLENBQUNDLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxFQUFFLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxRQUFRLEVBQUU7SUFDekQsS0FBSyxDQUFDTCxPQUFPLEVBQUVDLE9BQU8sRUFBRUMsRUFBRSxFQUFFQyxNQUFNLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxDQUFDO0lBQ3RELElBQUksQ0FBQ0Msa0JBQWtCLEdBQUcsS0FBSztJQUMvQixJQUFJLENBQUNDLGNBQWMsR0FBRyxLQUFLO0lBQzNCLElBQUksQ0FBQ0MsTUFBTTtJQUNYLElBQUksQ0FBQ0MsRUFBRTtJQUNQLElBQUksQ0FBQ0MsVUFBVTtFQUNuQjtFQUNBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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