@rabbitio/ui-kit 1.0.0-beta.9 → 1.0.0-beta.91

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 (369) hide show
  1. package/.gitlab-ci.yml +29 -0
  2. package/.husky/commit-msg +19 -0
  3. package/.husky/pre-push +1 -0
  4. package/CHANGELOG.md +0 -0
  5. package/README.md +27 -18
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +16765 -0
  9. package/coverage/coverage-final.json +116 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +1001 -0
  12. package/coverage/prettify.css +1 -0
  13. package/coverage/prettify.js +2 -0
  14. package/coverage/rabbit-ui-kit/index.html +116 -0
  15. package/coverage/rabbit-ui-kit/index.js.html +88 -0
  16. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js.html +148 -0
  17. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/index.html +146 -0
  18. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js.html +169 -0
  19. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js.html +199 -0
  20. package/coverage/rabbit-ui-kit/src/common-apis/adapters/axiosAdapter.js.html +190 -0
  21. package/coverage/rabbit-ui-kit/src/common-apis/adapters/index.html +131 -0
  22. package/coverage/rabbit-ui-kit/src/common-apis/adapters/qrUtils.js.html +139 -0
  23. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/apiGroups.js.html +250 -0
  24. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/emailAPI.js.html +133 -0
  25. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/index.html +146 -0
  26. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/ipAddressProviders.js.html +352 -0
  27. package/coverage/rabbit-ui-kit/src/common-apis/globalConstants.jsx.html +94 -0
  28. package/coverage/rabbit-ui-kit/src/common-apis/index.html +116 -0
  29. package/coverage/rabbit-ui-kit/src/common-apis/models/blockchain.js.html +115 -0
  30. package/coverage/rabbit-ui-kit/src/common-apis/models/coin.js.html +829 -0
  31. package/coverage/rabbit-ui-kit/src/common-apis/models/index.html +146 -0
  32. package/coverage/rabbit-ui-kit/src/common-apis/models/protocol.js.html +100 -0
  33. package/coverage/rabbit-ui-kit/src/common-apis/services/fiatCurrenciesService.js.html +544 -0
  34. package/coverage/rabbit-ui-kit/src/common-apis/services/index.html +116 -0
  35. package/coverage/rabbit-ui-kit/src/common-apis/utils/amountUtils.js.html +1162 -0
  36. package/coverage/rabbit-ui-kit/src/common-apis/utils/cache.js.html +811 -0
  37. package/coverage/rabbit-ui-kit/src/common-apis/utils/errorUtils.js.html +211 -0
  38. package/coverage/rabbit-ui-kit/src/common-apis/utils/index.html +191 -0
  39. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/index.html +131 -0
  40. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/logger.js.html +208 -0
  41. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/logsStorage.js.html +268 -0
  42. package/coverage/rabbit-ui-kit/src/common-apis/utils/postponeExecution.js.html +118 -0
  43. package/coverage/rabbit-ui-kit/src/common-apis/utils/rabbitTicker.js.html +157 -0
  44. package/coverage/rabbit-ui-kit/src/common-apis/utils/safeStringify.js.html +235 -0
  45. package/coverage/rabbit-ui-kit/src/index.html +116 -0
  46. package/coverage/rabbit-ui-kit/src/index.js.html +376 -0
  47. package/coverage/rabbit-ui-kit/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +1570 -0
  48. package/coverage/rabbit-ui-kit/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +526 -0
  49. package/coverage/rabbit-ui-kit/src/robust-api-caller/cancelProcessing.js.html +172 -0
  50. package/coverage/rabbit-ui-kit/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +310 -0
  51. package/coverage/rabbit-ui-kit/src/robust-api-caller/externalApiProvider.js.html +553 -0
  52. package/coverage/rabbit-ui-kit/src/robust-api-caller/externalServicesStatsCollector.js.html +319 -0
  53. package/coverage/rabbit-ui-kit/src/robust-api-caller/index.html +206 -0
  54. package/coverage/rabbit-ui-kit/src/robust-api-caller/robustExternalAPICallerService.js.html +997 -0
  55. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/exolixSwapProvider.js.html +1825 -0
  56. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/index.html +161 -0
  57. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1618 -0
  58. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +1819 -0
  59. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1861 -0
  60. package/coverage/rabbit-ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +319 -0
  61. package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwap.js.html +514 -0
  62. package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +529 -0
  63. package/coverage/rabbit-ui-kit/src/swaps-lib/models/index.html +176 -0
  64. package/coverage/rabbit-ui-kit/src/swaps-lib/models/partner.js.html +166 -0
  65. package/coverage/rabbit-ui-kit/src/swaps-lib/models/swapProviderCoinInfo.js.html +331 -0
  66. package/coverage/rabbit-ui-kit/src/swaps-lib/services/index.html +116 -0
  67. package/coverage/rabbit-ui-kit/src/swaps-lib/services/publicSwapService.js.html +1555 -0
  68. package/coverage/rabbit-ui-kit/src/swaps-lib/utils/index.html +116 -0
  69. package/coverage/rabbit-ui-kit/src/swaps-lib/utils/swapUtils.js.html +670 -0
  70. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +124 -0
  71. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +127 -0
  72. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +127 -0
  73. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +106 -0
  74. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +439 -0
  75. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +202 -0
  76. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/index.html +281 -0
  77. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +133 -0
  78. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/messageIcon.jsx.html +346 -0
  79. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +247 -0
  80. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +163 -0
  81. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx.html +268 -0
  82. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +151 -0
  83. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +256 -0
  84. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetIcon/index.html +116 -0
  85. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +289 -0
  86. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetSelection/index.html +116 -0
  87. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +187 -0
  88. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/BackgroundTitle/index.html +116 -0
  89. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +238 -0
  90. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/InformationMessage/index.html +116 -0
  91. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Input/Input.jsx.html +634 -0
  92. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Input/index.html +116 -0
  93. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +196 -0
  94. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/LoadingDots/index.html +116 -0
  95. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +277 -0
  96. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/NoticeIcon/index.html +116 -0
  97. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +217 -0
  98. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/QrCode/index.html +116 -0
  99. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +175 -0
  100. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/RateSelector/index.html +116 -0
  101. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +217 -0
  102. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/SupportChat/index.html +116 -0
  103. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +529 -0
  104. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Textarea/index.html +116 -0
  105. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +508 -0
  106. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TitleBox/index.html +116 -0
  107. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +316 -0
  108. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Tooltip/index.html +116 -0
  109. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +313 -0
  110. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/index.html +116 -0
  111. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Validation/Validation.jsx.html +202 -0
  112. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Validation/index.html +116 -0
  113. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +712 -0
  114. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Button/index.html +116 -0
  115. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +259 -0
  116. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Close/index.html +116 -0
  117. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +421 -0
  118. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/index.html +116 -0
  119. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +415 -0
  120. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +116 -0
  121. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +1429 -0
  122. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/AmountInput/index.html +116 -0
  123. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +1474 -0
  124. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/CoinPicker/index.html +116 -0
  125. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx.html +211 -0
  126. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/ColoredNotice/index.html +116 -0
  127. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +190 -0
  128. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LineWithIconLink/index.html +116 -0
  129. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx.html +307 -0
  130. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LogoCarousel/index.html +116 -0
  131. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx.html +496 -0
  132. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/index.html +116 -0
  133. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +181 -0
  134. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +116 -0
  135. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +283 -0
  136. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +116 -0
  137. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +1567 -0
  138. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +481 -0
  139. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +116 -0
  140. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1747 -0
  141. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +116 -0
  142. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/index.html +116 -0
  143. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +4207 -0
  144. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/SwapForm/index.html +116 -0
  145. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx.html +559 -0
  146. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/index.html +116 -0
  147. package/coverage/rabbit-ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +316 -0
  148. package/coverage/rabbit-ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +116 -0
  149. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/index.html +146 -0
  150. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useCallHandlingErrors.js.html +151 -0
  151. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useIsHydrated.js.html +121 -0
  152. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useReferredState.js.html +157 -0
  153. package/coverage/rabbit-ui-kit/src/ui-kit/utils/index.html +161 -0
  154. package/coverage/rabbit-ui-kit/src/ui-kit/utils/inputValueProviders.js.html +235 -0
  155. package/coverage/rabbit-ui-kit/src/ui-kit/utils/textUtils.js.html +139 -0
  156. package/coverage/rabbit-ui-kit/src/ui-kit/utils/uiUtils.js.html +121 -0
  157. package/coverage/rabbit-ui-kit/src/ui-kit/utils/urlQueryUtils.js.html +271 -0
  158. package/coverage/rabbit-ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +202 -0
  159. package/coverage/rabbit-ui-kit/stories/atoms/LinesOfText.stories.jsx.html +283 -0
  160. package/coverage/rabbit-ui-kit/stories/atoms/LoadingDots.stories.jsx.html +226 -0
  161. package/coverage/rabbit-ui-kit/stories/atoms/QrCode.stories.jsx.html +175 -0
  162. package/coverage/rabbit-ui-kit/stories/atoms/RateSelector.stories.jsx.html +136 -0
  163. package/coverage/rabbit-ui-kit/stories/atoms/Validation.stories.jsx.html +178 -0
  164. package/coverage/rabbit-ui-kit/stories/atoms/buttons/Button.stories.jsx.html +883 -0
  165. package/coverage/rabbit-ui-kit/stories/atoms/buttons/Close.stories.jsx.html +211 -0
  166. package/coverage/rabbit-ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +301 -0
  167. package/coverage/rabbit-ui-kit/stories/atoms/buttons/index.html +146 -0
  168. package/coverage/rabbit-ui-kit/stories/atoms/index.html +191 -0
  169. package/coverage/rabbit-ui-kit/stories/molecules/AmountInput.stories.jsx.html +289 -0
  170. package/coverage/rabbit-ui-kit/stories/molecules/CoinPicker.stories.jsx.html +322 -0
  171. package/coverage/rabbit-ui-kit/stories/molecules/ColoredNotice.stories.jsx.html +178 -0
  172. package/coverage/rabbit-ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +154 -0
  173. package/coverage/rabbit-ui-kit/stories/molecules/LogoCarousel.stories.jsx.html +235 -0
  174. package/coverage/rabbit-ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +160 -0
  175. package/coverage/rabbit-ui-kit/stories/molecules/index.html +191 -0
  176. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +523 -0
  177. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +328 -0
  178. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/index.html +116 -0
  179. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +337 -0
  180. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/index.html +116 -0
  181. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/index.html +116 -0
  182. package/coverage/rabbit-ui-kit/stories/organisms/WaitlistSubscription.stories.jsx.html +151 -0
  183. package/coverage/rabbit-ui-kit/stories/organisms/index.html +116 -0
  184. package/coverage/rabbit-ui-kit/stories/stubs/coins.jsx.html +6880 -0
  185. package/coverage/rabbit-ui-kit/stories/stubs/exampleContent.jsx.html +145 -0
  186. package/coverage/rabbit-ui-kit/stories/stubs/index.html +131 -0
  187. package/coverage/rabbit-ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +190 -0
  188. package/coverage/rabbit-ui-kit/stories/templates/index.html +116 -0
  189. package/coverage/sort-arrow-sprite.png +0 -0
  190. package/coverage/sorter.js +196 -0
  191. package/dist/global.css +197 -0
  192. package/dist/global.css.map +1 -0
  193. package/dist/index.cjs +12451 -25
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.css +2339 -8491
  196. package/dist/index.css.map +1 -1
  197. package/dist/index.modern.js +9597 -26
  198. package/dist/index.modern.js.map +1 -1
  199. package/dist/index.module.js +12357 -27
  200. package/dist/index.module.js.map +1 -1
  201. package/dist/index.umd.js +12442 -29
  202. package/dist/index.umd.js.map +1 -1
  203. package/package.json +35 -9
  204. package/raw +1000 -0
  205. package/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js +21 -0
  206. package/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js +28 -0
  207. package/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js +38 -0
  208. package/src/common-apis/adapters/axiosAdapter.js +35 -0
  209. package/src/common-apis/adapters/qrUtils.js +18 -0
  210. package/src/common-apis/external-apis/apiGroups.js +55 -0
  211. package/src/common-apis/external-apis/emailAPI.js +16 -0
  212. package/src/common-apis/external-apis/ipAddressProviders.js +89 -0
  213. package/src/common-apis/globalConstants.jsx +3 -0
  214. package/src/common-apis/models/blockchain.js +10 -0
  215. package/src/common-apis/models/coin.js +248 -0
  216. package/src/common-apis/models/protocol.js +5 -0
  217. package/src/{common → common-apis/services}/fiatCurrenciesService.js +4 -12
  218. package/src/common-apis/tests/integration/external-apis/ipAddressProviders/getClientIpAddress.test.js +12 -0
  219. package/src/common-apis/tests/units/utils/amountUtils/composeRateText.test.js +152 -0
  220. package/src/{common → common-apis/utils}/amountUtils.js +72 -136
  221. package/src/common-apis/utils/cache.js +242 -0
  222. package/src/{common → common-apis/utils}/errorUtils.js +15 -0
  223. package/src/common-apis/utils/logging/logger.js +41 -0
  224. package/src/common-apis/utils/logging/logsStorage.js +61 -0
  225. package/src/common-apis/utils/postponeExecution.js +11 -0
  226. package/src/common-apis/utils/rabbitTicker.js +24 -0
  227. package/src/common-apis/utils/safeStringify.js +50 -0
  228. package/src/index.js +96 -9
  229. package/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js +495 -0
  230. package/src/robust-api-caller/cachedRobustExternalApiCallerService.js +147 -0
  231. package/src/robust-api-caller/cancelProcessing.js +29 -0
  232. package/src/robust-api-caller/concurrentCalculationsMetadataHolder.js +75 -0
  233. package/src/robust-api-caller/externalApiProvider.js +156 -0
  234. package/src/robust-api-caller/externalServicesStatsCollector.js +78 -0
  235. package/src/robust-api-caller/robustExternalAPICallerService.js +304 -0
  236. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/_performCallAttempt.test.js +533 -0
  237. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/callExternalAPI.test.js +532 -0
  238. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/constructor.test.js +19 -0
  239. package/src/swaps-lib/external-apis/exolixSwapProvider.js +580 -0
  240. package/src/swaps-lib/external-apis/letsExchangeSwapProvider.js +511 -0
  241. package/src/swaps-lib/external-apis/swapProvider.js +578 -0
  242. package/src/swaps-lib/external-apis/swapspaceSwapProvider.js +592 -0
  243. package/src/swaps-lib/models/baseSwapCreationInfo.js +78 -0
  244. package/src/swaps-lib/models/existingSwap.js +143 -0
  245. package/src/swaps-lib/models/existingSwapWithFiatData.js +148 -0
  246. package/src/swaps-lib/models/partner.js +27 -0
  247. package/src/swaps-lib/models/swapProviderCoinInfo.js +82 -0
  248. package/src/swaps-lib/services/publicSwapService.js +490 -0
  249. package/src/swaps-lib/test/external-apis/exolixSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +34 -0
  250. package/src/swaps-lib/test/external-apis/exolixSwapProvider/createSwap.test.js +1043 -0
  251. package/src/swaps-lib/test/external-apis/exolixSwapProvider/getSwapInfo.test.js +611 -0
  252. package/src/swaps-lib/test/external-apis/swapProvider/getAllSupportedCurrencies.test.js +63 -0
  253. package/src/swaps-lib/test/external-apis/swapProvider/getDepositCurrencies.test.js +73 -0
  254. package/src/swaps-lib/test/external-apis/swapProvider/getWithdrawalCurrencies.test.js +102 -0
  255. package/src/swaps-lib/test/external-apis/swapProvider/removeProtocolNameFromCoinName.test.js +152 -0
  256. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +536 -0
  257. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/createSwap.test.js +1214 -0
  258. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getSwapInfo.test.js +1707 -0
  259. package/src/swaps-lib/test/utils/swapUtils/safeHandleRequestsLimitExceeding.test.js +80 -0
  260. package/src/swaps-lib/utils/swapUtils.js +195 -0
  261. package/{styles → src/ui-kit/assets/styles}/_functions.scss +5 -0
  262. package/{styles → src/ui-kit/assets/styles}/_mixins.scss +2 -2
  263. package/{styles → src/ui-kit/assets/styles}/_placeholder.scss +3 -3
  264. package/{styles → src/ui-kit/assets/styles}/_variables.scss +17 -15
  265. package/src/ui-kit/assets/styles/fonts/NunitoSans-Bold.ttf +0 -0
  266. package/src/ui-kit/assets/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  267. package/src/ui-kit/assets/styles/fonts/NunitoSans-Light.ttf +0 -0
  268. package/src/ui-kit/assets/styles/fonts/NunitoSans-Regular.ttf +0 -0
  269. package/src/ui-kit/assets/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  270. package/src/ui-kit/assets/styles/global.scss +171 -0
  271. package/src/ui-kit/assets/styles/index.scss +10 -0
  272. package/src/ui-kit/assets/wrappedImages/arrowIcon.jsx +13 -0
  273. package/src/ui-kit/assets/wrappedImages/arrowTosca.jsx +14 -0
  274. package/src/ui-kit/assets/wrappedImages/arrowWhite.jsx +14 -0
  275. package/src/ui-kit/assets/wrappedImages/darkRectangle.jsx +7 -0
  276. package/src/ui-kit/assets/wrappedImages/determinedError.jsx +118 -0
  277. package/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx +39 -0
  278. package/src/ui-kit/assets/wrappedImages/infoIcon.jsx +16 -0
  279. package/src/ui-kit/assets/wrappedImages/messageIcon.jsx +87 -0
  280. package/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx +54 -0
  281. package/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx +26 -0
  282. package/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx +61 -0
  283. package/src/ui-kit/assets/wrappedImages/walletIcon.jsx +22 -0
  284. package/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx +57 -0
  285. package/src/{components → ui-kit/components}/atoms/AssetIcon/asset-icon.module.scss +1 -1
  286. package/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx +68 -0
  287. package/src/ui-kit/components/atoms/AssetSelection/asset-selection.module.scss +56 -0
  288. package/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx +34 -0
  289. package/src/ui-kit/components/atoms/BackgroundTitle/background-title.module.scss +52 -0
  290. package/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx +51 -0
  291. package/src/ui-kit/components/atoms/InformationMessage/information-message.module.scss +38 -0
  292. package/src/ui-kit/components/atoms/Input/Input.jsx +183 -0
  293. package/src/ui-kit/components/atoms/Input/input.module.scss +107 -0
  294. package/src/{components → ui-kit/components}/atoms/LoadingDots/LoadingDots.jsx +8 -28
  295. package/src/{components → ui-kit/components}/atoms/LoadingDots/LoadingDots.module.scss +3 -2
  296. package/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx +64 -0
  297. package/src/ui-kit/components/atoms/NoticeIcon/notice-icon.module.scss +14 -0
  298. package/src/ui-kit/components/atoms/QrCode/QrCode.jsx +44 -0
  299. package/src/ui-kit/components/atoms/QrCode/qr-code.module.scss +15 -0
  300. package/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx +30 -0
  301. package/src/ui-kit/components/atoms/RateSelector/rate-selector.module.scss +47 -0
  302. package/src/{components → ui-kit/components}/atoms/SupportChat/SupportChat.jsx +5 -1
  303. package/src/ui-kit/components/atoms/Textarea/Textarea.jsx +148 -0
  304. package/src/ui-kit/components/atoms/Textarea/textarea.module.scss +71 -0
  305. package/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx +141 -0
  306. package/src/ui-kit/components/atoms/TitleBox/title-box.module.scss +32 -0
  307. package/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx +77 -0
  308. package/src/ui-kit/components/atoms/Tooltip/tooltip.module.scss +237 -0
  309. package/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx +76 -0
  310. package/src/ui-kit/components/atoms/TwoLinesOfText/lines-of-text.module.scss +65 -0
  311. package/src/ui-kit/components/atoms/Validation/Validation.jsx +39 -0
  312. package/src/ui-kit/components/atoms/Validation/validation.module.scss +19 -0
  313. package/src/{components → ui-kit/components}/atoms/buttons/Button/Button.jsx +24 -50
  314. package/src/{components → ui-kit/components}/atoms/buttons/Button/Button.module.scss +1 -1
  315. package/src/ui-kit/components/atoms/buttons/Close/Close.jsx +58 -0
  316. package/src/ui-kit/components/atoms/buttons/Close/close.module.scss +75 -0
  317. package/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx +112 -0
  318. package/src/ui-kit/components/atoms/buttons/LinkButton/link-button.module.scss +49 -0
  319. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx +110 -0
  320. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/radio-button-with-text.module.scss +86 -0
  321. package/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx +448 -0
  322. package/src/ui-kit/components/molecules/AmountInput/amount-input.module.scss +233 -0
  323. package/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx +463 -0
  324. package/src/ui-kit/components/molecules/CoinPicker/coin-picker.module.scss +207 -0
  325. package/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx +42 -0
  326. package/src/ui-kit/components/molecules/ColoredNotice/colored-notice.module.scss +20 -0
  327. package/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx +35 -0
  328. package/src/ui-kit/components/molecules/LineWithIconLink/line-with-icon-link.module.scss +25 -0
  329. package/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx +74 -0
  330. package/src/ui-kit/components/molecules/LogoCarousel/logo-carousel.module.scss +106 -0
  331. package/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx +137 -0
  332. package/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx +32 -0
  333. package/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx +66 -0
  334. package/src/ui-kit/components/organisms/Dialog/Dialog.jsx +494 -0
  335. package/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx +132 -0
  336. package/src/ui-kit/components/organisms/Dialog/DialogButtons/dialog-buttons.module.scss +25 -0
  337. package/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx +554 -0
  338. package/src/ui-kit/components/organisms/Dialog/DialogStep/dialog-step.module.scss +381 -0
  339. package/src/ui-kit/components/organisms/Dialog/dialog.module.scss +226 -0
  340. package/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx +1374 -0
  341. package/src/ui-kit/components/organisms/SwapForm/swap-form.module.scss +134 -0
  342. package/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx +158 -0
  343. package/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx +77 -0
  344. package/src/ui-kit/hooks/useCallHandlingErrors.js +22 -0
  345. package/src/ui-kit/hooks/useIsHydrated.js +12 -0
  346. package/src/ui-kit/hooks/useReferredState.js +24 -0
  347. package/src/ui-kit/tests/utils/inputValueProviders/provideFormatOfFloatValueByInputString.test.js +146 -0
  348. package/src/ui-kit/tests/utils/urlQueryUtils/getQueryParameterValues.test.js +65 -0
  349. package/src/ui-kit/tests/utils/urlQueryUtils/saveQueryParameterAndValues.test.js +104 -0
  350. package/src/ui-kit/utils/inputValueProviders.js +50 -0
  351. package/src/ui-kit/utils/textUtils.js +18 -0
  352. package/src/ui-kit/utils/uiUtils.js +12 -0
  353. package/src/ui-kit/utils/urlQueryUtils.js +62 -0
  354. package/stories/font.scss +40 -0
  355. package/stories/stubs/coins.jsx +2266 -0
  356. package/stories/stubs/exampleContent.jsx +20 -0
  357. package/src/components/atoms/AssetIcon/AssetIcon.jsx +0 -55
  358. package/styles/_global-classes.scss +0 -433
  359. package/styles/fonts/NunitoSans-Bold.ttf +0 -0
  360. package/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  361. package/styles/fonts/NunitoSans-Light.ttf +0 -0
  362. package/styles/fonts/NunitoSans-Regular.ttf +0 -0
  363. package/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  364. package/styles/global-styles-index.scss +0 -74
  365. package/styles/index.scss +0 -33
  366. /package/{styles → src/ui-kit/assets/styles}/colors/_light-colors.scss +0 -0
  367. /package/{styles → src/ui-kit/assets/styles}/colors/_solid-colors.scss +0 -0
  368. /package/{styles → src/ui-kit/assets/styles}/size/_margin-size.scss +0 -0
  369. /package/{styles → src/ui-kit/assets/styles}/size/_padding-size.scss +0 -0
@@ -0,0 +1,1555 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for rabbit-ui-kit/src/swaps-lib/services/publicSwapService.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">rabbit-ui-kit/src/swaps-lib/services</a> publicSwapService.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/490</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/490</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-no">&nbsp;</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-no">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-no">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-no">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-no">&nbsp;</span>
575
+ <span class="cline-any cline-no">&nbsp;</span>
576
+ <span class="cline-any cline-no">&nbsp;</span>
577
+ <span class="cline-any cline-no">&nbsp;</span>
578
+ <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-no">&nbsp;</span>
582
+ <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-no">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-no">&nbsp;</span>
587
+ <span class="cline-any cline-no">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-no">&nbsp;</span>
592
+ <span class="cline-any cline-no">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-no">&nbsp;</span>
595
+ <span class="cline-any cline-no">&nbsp;</span>
596
+ <span class="cline-any cline-no">&nbsp;</span>
597
+ <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-no">&nbsp;</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-no">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
+ <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-no">&nbsp;</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
613
+ <span class="cline-any cline-no">&nbsp;</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-no">&nbsp;</span>
617
+ <span class="cline-any cline-no">&nbsp;</span>
618
+ <span class="cline-any cline-no">&nbsp;</span>
619
+ <span class="cline-any cline-no">&nbsp;</span>
620
+ <span class="cline-any cline-no">&nbsp;</span>
621
+ <span class="cline-any cline-no">&nbsp;</span>
622
+ <span class="cline-any cline-no">&nbsp;</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-no">&nbsp;</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
+ <span class="cline-any cline-no">&nbsp;</span>
628
+ <span class="cline-any cline-no">&nbsp;</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-no">&nbsp;</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-no">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
637
+ <span class="cline-any cline-no">&nbsp;</span>
638
+ <span class="cline-any cline-no">&nbsp;</span>
639
+ <span class="cline-any cline-no">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-no">&nbsp;</span>
649
+ <span class="cline-any cline-no">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-no">&nbsp;</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-no">&nbsp;</span>
669
+ <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-no">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-no">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-no">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-no">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-no">&nbsp;</span>
696
+ <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
813
+ <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-no">&nbsp;</span>
821
+ <span class="cline-any cline-no">&nbsp;</span>
822
+ <span class="cline-any cline-no">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-no">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-no">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-no">&nbsp;</span>
836
+ <span class="cline-any cline-no">&nbsp;</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-no">&nbsp;</span>
847
+ <span class="cline-any cline-no">&nbsp;</span>
848
+ <span class="cline-any cline-no">&nbsp;</span>
849
+ <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-no">&nbsp;</span>
851
+ <span class="cline-any cline-no">&nbsp;</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-no">&nbsp;</span>
854
+ <span class="cline-any cline-no">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
860
+ <span class="cline-any cline-no">&nbsp;</span>
861
+ <span class="cline-any cline-no">&nbsp;</span>
862
+ <span class="cline-any cline-no">&nbsp;</span>
863
+ <span class="cline-any cline-no">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-no">&nbsp;</span>
870
+ <span class="cline-any cline-no">&nbsp;</span>
871
+ <span class="cline-any cline-no">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-no">&nbsp;</span>
874
+ <span class="cline-any cline-no">&nbsp;</span>
875
+ <span class="cline-any cline-no">&nbsp;</span>
876
+ <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-no">&nbsp;</span>
878
+ <span class="cline-any cline-no">&nbsp;</span>
879
+ <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-no">&nbsp;</span>
881
+ <span class="cline-any cline-no">&nbsp;</span>
882
+ <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-no">&nbsp;</span>
884
+ <span class="cline-any cline-no">&nbsp;</span>
885
+ <span class="cline-any cline-no">&nbsp;</span>
886
+ <span class="cline-any cline-no">&nbsp;</span>
887
+ <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-no">&nbsp;</span>
899
+ <span class="cline-any cline-no">&nbsp;</span>
900
+ <span class="cline-any cline-no">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-no">&nbsp;</span>
904
+ <span class="cline-any cline-no">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-no">&nbsp;</span>
910
+ <span class="cline-any cline-no">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-no">&nbsp;</span>
985
+ <span class="cline-any cline-no">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-no">&nbsp;</span>
1032
+ <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-no">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import { BigNumber } from "bignumber.js";</span></span></span>
1047
+ <span class="cstat-no" title="statement not covered" ></span>
1048
+ <span class="cstat-no" title="statement not covered" >import { FiatCurrenciesService } from "../../common-apis/services/fiatCurrenciesService.js";</span>
1049
+ <span class="cstat-no" title="statement not covered" >import { improveAndRethrow } from "../../common-apis/utils/errorUtils.js";</span>
1050
+ <span class="cstat-no" title="statement not covered" >import { safeStringify } from "../../common-apis/utils/safeStringify.js";</span>
1051
+ <span class="cstat-no" title="statement not covered" >import { Logger } from "../../common-apis/utils/logging/logger.js";</span>
1052
+ <span class="cstat-no" title="statement not covered" >import { Coin } from "../../common-apis/models/coin.js";</span>
1053
+ <span class="cstat-no" title="statement not covered" >import { AmountUtils } from "../../common-apis/utils/amountUtils.js";</span>
1054
+ <span class="cstat-no" title="statement not covered" >import { BaseSwapCreationInfo } from "../models/baseSwapCreationInfo.js";</span>
1055
+ <span class="cstat-no" title="statement not covered" >import { SwapUtils } from "../utils/swapUtils.js";</span>
1056
+ <span class="cstat-no" title="statement not covered" >import { SwapspaceSwapProvider } from "../external-apis/swapspaceSwapProvider.js";</span>
1057
+ <span class="cstat-no" title="statement not covered" >import { SwapProvider } from "../external-apis/swapProvider.js";</span>
1058
+ <span class="cstat-no" title="statement not covered" >import { LetsExchangeSwapProvider } from "../external-apis/letsExchangeSwapProvider.js";</span>
1059
+ <span class="cstat-no" title="statement not covered" >import { GoogleAnalyticsAdapter } from "../../common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js";</span>
1060
+ <span class="cstat-no" title="statement not covered" ></span>
1061
+ <span class="cstat-no" title="statement not covered" >export class PublicSwapService {</span>
1062
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAP_CREATED_ANALYTICS_EVENT = "public_swap_created_event";</span>
1063
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAP_SUCCEED_ANALYTICS_EVENT = "public_swap_succeed_event";</span>
1064
+ <span class="cstat-no" title="statement not covered" ></span>
1065
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAPS_COMMON_ERRORS = {</span>
1066
+ <span class="cstat-no" title="statement not covered" > REQUESTS_LIMIT_EXCEEDED: "requestsLimitExceeded",</span>
1067
+ <span class="cstat-no" title="statement not covered" > };</span>
1068
+ <span class="cstat-no" title="statement not covered" ></span>
1069
+ <span class="cstat-no" title="statement not covered" > static PUBLIC_SWAP_DETAILS_FAIL_REASONS = {</span>
1070
+ <span class="cstat-no" title="statement not covered" > AMOUNT_LESS_THAN_MIN_SWAPPABLE: "amountLessThanMinSwappable",</span>
1071
+ <span class="cstat-no" title="statement not covered" > AMOUNT_HIGHER_THAN_MAX_SWAPPABLE: "amountHigherThanMaxSwappable",</span>
1072
+ <span class="cstat-no" title="statement not covered" > PAIR_NOT_SUPPORTED: "pairNotSupported",</span>
1073
+ <span class="cstat-no" title="statement not covered" > NO_FIXED_BUT_HAVE_FLOATING_PUBLIC_SWAP_OPTION: "noFixedButHaveFloatingPublicSwapOption",</span>
1074
+ <span class="cstat-no" title="statement not covered" > NO_FLOATING_BUT_HAVE_FIXED_PUBLIC_SWAP_OPTION: "noFloatingButHaveFixedPublicSwapOption",</span>
1075
+ <span class="cstat-no" title="statement not covered" > };</span>
1076
+ <span class="cstat-no" title="statement not covered" ></span>
1077
+ <span class="cstat-no" title="statement not covered" > static _fiatDecimalsCount = FiatCurrenciesService.getCurrencyDecimalCountByCode("USD");</span>
1078
+ <span class="cstat-no" title="statement not covered" ></span>
1079
+ <span class="cstat-no" title="statement not covered" > /**</span>
1080
+ <span class="cstat-no" title="statement not covered" > * TODO: [feature, critical] implement more adequate providers list&amp;initiation logic. task_id=6a6b0fbbee8a413690c49b1e4ee289cb</span>
1081
+ <span class="cstat-no" title="statement not covered" > *</span>
1082
+ <span class="cstat-no" title="statement not covered" > * @param apiKeysProxyUrl {string|null}</span>
1083
+ <span class="cstat-no" title="statement not covered" > * @param cache {Cache}</span>
1084
+ <span class="cstat-no" title="statement not covered" > * @param providers {SwapProvider[]|null}</span>
1085
+ <span class="cstat-no" title="statement not covered" > */</span>
1086
+ <span class="cstat-no" title="statement not covered" > constructor(apiKeysProxyUrl, cache, providers = null) {</span>
1087
+ <span class="cstat-no" title="statement not covered" > if (apiKeysProxyUrl) {</span>
1088
+ <span class="cstat-no" title="statement not covered" > this._swapProvider = new SwapspaceSwapProvider(apiKeysProxyUrl, cache, () =&gt; null, false);</span>
1089
+ <span class="cstat-no" title="statement not covered" > this._fixedSwapProvider = new LetsExchangeSwapProvider(apiKeysProxyUrl, cache, () =&gt; null, false);</span>
1090
+ <span class="cstat-no" title="statement not covered" > } else if (providers?.length) {</span>
1091
+ <span class="cstat-no" title="statement not covered" > this._swapProvider = providers.find(p =&gt; p.id === "swapspace");</span>
1092
+ <span class="cstat-no" title="statement not covered" > this._fixedSwapProvider = providers.find(p =&gt; p.id === "letsexchange");</span>
1093
+ <span class="cstat-no" title="statement not covered" > }</span>
1094
+ <span class="cstat-no" title="statement not covered" > }</span>
1095
+ <span class="cstat-no" title="statement not covered" ></span>
1096
+ <span class="cstat-no" title="statement not covered" > async initialize() {</span>
1097
+ <span class="cstat-no" title="statement not covered" > try {</span>
1098
+ <span class="cstat-no" title="statement not covered" > await Promise.all([this._swapProvider.initialize(), this._fixedSwapProvider.initialize()]);</span>
1099
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1100
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, "PublicSwapService.initialize");</span>
1101
+ <span class="cstat-no" title="statement not covered" > }</span>
1102
+ <span class="cstat-no" title="statement not covered" > }</span>
1103
+ <span class="cstat-no" title="statement not covered" ></span>
1104
+ <span class="cstat-no" title="statement not covered" > /**</span>
1105
+ <span class="cstat-no" title="statement not covered" > * Retrieves swap details that can be used to create swap.</span>
1106
+ <span class="cstat-no" title="statement not covered" > *</span>
1107
+ <span class="cstat-no" title="statement not covered" > * @param provider {SwapProvider}</span>
1108
+ <span class="cstat-no" title="statement not covered" > * @param fromCoinOrTicker {Coin|string}</span>
1109
+ <span class="cstat-no" title="statement not covered" > * @param toCoinOrTicker {Coin|string}</span>
1110
+ <span class="cstat-no" title="statement not covered" > * @param amountCoins {string}</span>
1111
+ <span class="cstat-no" title="statement not covered" > * @param [fixed=false] {boolean|null} null means fixed or float doesn't matter</span>
1112
+ <span class="cstat-no" title="statement not covered" > * @param [coinUsdtRate=null] {number|null} rate of amount coin to USDT</span>
1113
+ <span class="cstat-no" title="statement not covered" > * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount.</span>
1114
+ <span class="cstat-no" title="statement not covered" > * False means the amount is the sending amount.</span>
1115
+ <span class="cstat-no" title="statement not covered" > * @param bannedPartners {string[]} array of banned swap partners (providers) ids (rabbit ids)</span>
1116
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1117
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1118
+ <span class="cstat-no" title="statement not covered" > * reason: string,</span>
1119
+ <span class="cstat-no" title="statement not covered" > * min: (string|null),</span>
1120
+ <span class="cstat-no" title="statement not covered" > * max: (string|null),</span>
1121
+ <span class="cstat-no" title="statement not covered" > * rate: (string|undefined),</span>
1122
+ <span class="cstat-no" title="statement not covered" > * fiatMin: (number|null),</span>
1123
+ <span class="cstat-no" title="statement not covered" > * fiatMax: (number|null)</span>
1124
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1125
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1126
+ <span class="cstat-no" title="statement not covered" > * swapCreationInfo: BaseSwapCreationInfo</span>
1127
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1128
+ <span class="cstat-no" title="statement not covered" > */</span>
1129
+ <span class="cstat-no" title="statement not covered" > async getPublicSwapDetails(</span>
1130
+ <span class="cstat-no" title="statement not covered" > provider,</span>
1131
+ <span class="cstat-no" title="statement not covered" > fromCoinOrTicker,</span>
1132
+ <span class="cstat-no" title="statement not covered" > toCoinOrTicker,</span>
1133
+ <span class="cstat-no" title="statement not covered" > amountCoins,</span>
1134
+ <span class="cstat-no" title="statement not covered" > fixed = false,</span>
1135
+ <span class="cstat-no" title="statement not covered" > coinUsdtRate = null,</span>
1136
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive = false,</span>
1137
+ <span class="cstat-no" title="statement not covered" > bannedPartners = []</span>
1138
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1139
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "getPublicSwapDetails";</span>
1140
+ <span class="cstat-no" title="statement not covered" > try {</span>
1141
+ <span class="cstat-no" title="statement not covered" > if (amountIsToReceive &amp;&amp; !fixed) {</span>
1142
+ <span class="cstat-no" title="statement not covered" > throw new Error("Estimating allowed only for fixed rate.");</span>
1143
+ <span class="cstat-no" title="statement not covered" > }</span>
1144
+ <span class="cstat-no" title="statement not covered" ></span>
1145
+ <span class="cstat-no" title="statement not covered" > let fromCoin = fromCoinOrTicker;</span>
1146
+ <span class="cstat-no" title="statement not covered" > if (typeof fromCoin === "string") {</span>
1147
+ <span class="cstat-no" title="statement not covered" > fromCoin = this.getCoinByTickerIfPresent(fromCoin);</span>
1148
+ <span class="cstat-no" title="statement not covered" > }</span>
1149
+ <span class="cstat-no" title="statement not covered" > let toCoin = toCoinOrTicker;</span>
1150
+ <span class="cstat-no" title="statement not covered" > if (typeof toCoin === "string") {</span>
1151
+ <span class="cstat-no" title="statement not covered" > toCoin = this.getCoinByTickerIfPresent(toCoin);</span>
1152
+ <span class="cstat-no" title="statement not covered" > }</span>
1153
+ <span class="cstat-no" title="statement not covered" > const isPartnerBanned = !!bannedPartners.find(banned =&gt; banned === provider.id);</span>
1154
+ <span class="cstat-no" title="statement not covered" > if (!fromCoin || !toCoin || isPartnerBanned) {</span>
1155
+ <span class="cstat-no" title="statement not covered" > return {</span>
1156
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1157
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.PAIR_NOT_SUPPORTED,</span>
1158
+ <span class="cstat-no" title="statement not covered" > min: null,</span>
1159
+ <span class="cstat-no" title="statement not covered" > max: null,</span>
1160
+ <span class="cstat-no" title="statement not covered" > fiatMin: null,</span>
1161
+ <span class="cstat-no" title="statement not covered" > fiatMax: null,</span>
1162
+ <span class="cstat-no" title="statement not covered" > rate: undefined,</span>
1163
+ <span class="cstat-no" title="statement not covered" > };</span>
1164
+ <span class="cstat-no" title="statement not covered" > }</span>
1165
+ <span class="cstat-no" title="statement not covered" ></span>
1166
+ <span class="cstat-no" title="statement not covered" > const details = await provider.getSwapInfo(</span>
1167
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1168
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1169
+ <span class="cstat-no" title="statement not covered" > amountCoins,</span>
1170
+ <span class="cstat-no" title="statement not covered" > fixed,</span>
1171
+ <span class="cstat-no" title="statement not covered" > coinUsdtRate,</span>
1172
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive,</span>
1173
+ <span class="cstat-no" title="statement not covered" > bannedPartners</span>
1174
+ <span class="cstat-no" title="statement not covered" > );</span>
1175
+ <span class="cstat-no" title="statement not covered" ></span>
1176
+ <span class="cstat-no" title="statement not covered" > // eslint-disable-next-line no-console</span>
1177
+ <span class="cstat-no" title="statement not covered" > console.log("getSwapInfo raw result: ", details, loggerSource);</span>
1178
+ <span class="cstat-no" title="statement not covered" ></span>
1179
+ <span class="cstat-no" title="statement not covered" > const min =</span>
1180
+ <span class="cstat-no" title="statement not covered" > details.smallestMin != null &amp;&amp; BigNumber(details.smallestMin).gt("0") ? details.smallestMin : null;</span>
1181
+ <span class="cstat-no" title="statement not covered" > const max =</span>
1182
+ <span class="cstat-no" title="statement not covered" > details.greatestMax != null &amp;&amp; BigNumber(details.greatestMax).gt("0") ? details.greatestMax : null;</span>
1183
+ <span class="cstat-no" title="statement not covered" > let fiatMin = null,</span>
1184
+ <span class="cstat-no" title="statement not covered" > fiatMax = null;</span>
1185
+ <span class="cstat-no" title="statement not covered" > if (coinUsdtRate != null) {</span>
1186
+ <span class="cstat-no" title="statement not covered" > if (min != null) {</span>
1187
+ <span class="cstat-no" title="statement not covered" > fiatMin = BigNumber(min).times(coinUsdtRate).toFixed(PublicSwapService._fiatDecimalsCount);</span>
1188
+ <span class="cstat-no" title="statement not covered" > }</span>
1189
+ <span class="cstat-no" title="statement not covered" > if (max != null) {</span>
1190
+ <span class="cstat-no" title="statement not covered" > fiatMax = BigNumber(max).times(coinUsdtRate).toFixed(PublicSwapService._fiatDecimalsCount);</span>
1191
+ <span class="cstat-no" title="statement not covered" > }</span>
1192
+ <span class="cstat-no" title="statement not covered" > }</span>
1193
+ <span class="cstat-no" title="statement not covered" ></span>
1194
+ <span class="cstat-no" title="statement not covered" > const composeFailResult = reason =&gt; ({</span>
1195
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1196
+ <span class="cstat-no" title="statement not covered" > reason: reason,</span>
1197
+ <span class="cstat-no" title="statement not covered" > min: min ?? null,</span>
1198
+ <span class="cstat-no" title="statement not covered" > fiatMin: fiatMin,</span>
1199
+ <span class="cstat-no" title="statement not covered" > max: max ?? null,</span>
1200
+ <span class="cstat-no" title="statement not covered" > fiatMax: fiatMax,</span>
1201
+ <span class="cstat-no" title="statement not covered" > rate: details.rate ?? null,</span>
1202
+ <span class="cstat-no" title="statement not covered" > });</span>
1203
+ <span class="cstat-no" title="statement not covered" ></span>
1204
+ <span class="cstat-no" title="statement not covered" > if (!details.result) {</span>
1205
+ <span class="cstat-no" title="statement not covered" > if (details?.reason === SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED) {</span>
1206
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.PAIR_NOT_SUPPORTED);</span>
1207
+ <span class="cstat-no" title="statement not covered" > } else if (details?.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1208
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1209
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);</span>
1210
+ <span class="cstat-no" title="statement not covered" > } else if (details?.reason === SwapProvider.NO_SWAPS_REASONS.NO_FLOATING_BUT_HAVE_FIXED) {</span>
1211
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1212
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.NO_FLOATING_BUT_HAVE_FIXED_PUBLIC_SWAP_OPTION</span>
1213
+ <span class="cstat-no" title="statement not covered" > );</span>
1214
+ <span class="cstat-no" title="statement not covered" > } else if (details?.reason === SwapProvider.NO_SWAPS_REASONS.NO_FIXED_BUT_HAVE_FLOATING) {</span>
1215
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1216
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.NO_FIXED_BUT_HAVE_FLOATING_PUBLIC_SWAP_OPTION</span>
1217
+ <span class="cstat-no" title="statement not covered" > );</span>
1218
+ <span class="cstat-no" title="statement not covered" > }</span>
1219
+ <span class="cstat-no" title="statement not covered" > }</span>
1220
+ <span class="cstat-no" title="statement not covered" ></span>
1221
+ <span class="cstat-no" title="statement not covered" > const amountBigNumber = BigNumber(amountCoins);</span>
1222
+ <span class="cstat-no" title="statement not covered" > if (typeof min === "string" &amp;&amp; amountBigNumber.lt(min)) {</span>
1223
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1224
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.AMOUNT_LESS_THAN_MIN_SWAPPABLE</span>
1225
+ <span class="cstat-no" title="statement not covered" > );</span>
1226
+ <span class="cstat-no" title="statement not covered" > } else if (typeof max === "string" &amp;&amp; amountBigNumber.gt(max)) {</span>
1227
+ <span class="cstat-no" title="statement not covered" > return composeFailResult(</span>
1228
+ <span class="cstat-no" title="statement not covered" > PublicSwapService.PUBLIC_SWAP_DETAILS_FAIL_REASONS.AMOUNT_HIGHER_THAN_MAX_SWAPPABLE</span>
1229
+ <span class="cstat-no" title="statement not covered" > );</span>
1230
+ <span class="cstat-no" title="statement not covered" > }</span>
1231
+ <span class="cstat-no" title="statement not covered" ></span>
1232
+ <span class="cstat-no" title="statement not covered" > const fromAmountCoins = amountIsToReceive</span>
1233
+ <span class="cstat-no" title="statement not covered" > ? AmountUtils.trim(amountBigNumber.div(details.rate), fromCoin.digits)</span>
1234
+ <span class="cstat-no" title="statement not covered" > : amountCoins;</span>
1235
+ <span class="cstat-no" title="statement not covered" > const toAmountCoins = amountIsToReceive</span>
1236
+ <span class="cstat-no" title="statement not covered" > ? amountCoins</span>
1237
+ <span class="cstat-no" title="statement not covered" > : AmountUtils.trim(amountBigNumber.times(details.rate), toCoin.digits);</span>
1238
+ <span class="cstat-no" title="statement not covered" > const result = {</span>
1239
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1240
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo: new BaseSwapCreationInfo(</span>
1241
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1242
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1243
+ <span class="cstat-no" title="statement not covered" > fromAmountCoins,</span>
1244
+ <span class="cstat-no" title="statement not covered" > toAmountCoins,</span>
1245
+ <span class="cstat-no" title="statement not covered" > details.rate,</span>
1246
+ <span class="cstat-no" title="statement not covered" > details.rawSwapData,</span>
1247
+ <span class="cstat-no" title="statement not covered" > min,</span>
1248
+ <span class="cstat-no" title="statement not covered" > fiatMin,</span>
1249
+ <span class="cstat-no" title="statement not covered" > max,</span>
1250
+ <span class="cstat-no" title="statement not covered" > fiatMax,</span>
1251
+ <span class="cstat-no" title="statement not covered" > details.durationMinutesRange,</span>
1252
+ <span class="cstat-no" title="statement not covered" > details.fixed,</span>
1253
+ <span class="cstat-no" title="statement not covered" > provider.id,</span>
1254
+ <span class="cstat-no" title="statement not covered" > details.isRefundAddressRequired</span>
1255
+ <span class="cstat-no" title="statement not covered" > ),</span>
1256
+ <span class="cstat-no" title="statement not covered" > };</span>
1257
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1258
+ <span class="cstat-no" title="statement not covered" > `Result: ${safeStringify({</span>
1259
+ <span class="cstat-no" title="statement not covered" > result: result.result,</span>
1260
+ <span class="cstat-no" title="statement not covered" > swapCreationInfo: {</span>
1261
+ <span class="cstat-no" title="statement not covered" > ...result.swapCreationInfo,</span>
1262
+ <span class="cstat-no" title="statement not covered" > fromCoin: result?.swapCreationInfo?.fromCoin?.ticker,</span>
1263
+ <span class="cstat-no" title="statement not covered" > toCoin: result?.swapCreationInfo?.toCoin?.ticker,</span>
1264
+ <span class="cstat-no" title="statement not covered" > },</span>
1265
+ <span class="cstat-no" title="statement not covered" > })}`,</span>
1266
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1267
+ <span class="cstat-no" title="statement not covered" > );</span>
1268
+ <span class="cstat-no" title="statement not covered" ></span>
1269
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1270
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1271
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1272
+ <span class="cstat-no" title="statement not covered" > }</span>
1273
+ <span class="cstat-no" title="statement not covered" > }</span>
1274
+ <span class="cstat-no" title="statement not covered" ></span>
1275
+ <span class="cstat-no" title="statement not covered" > /**</span>
1276
+ <span class="cstat-no" title="statement not covered" > * Creates swap by given params.</span>
1277
+ <span class="cstat-no" title="statement not covered" > *</span>
1278
+ <span class="cstat-no" title="statement not covered" > * @param provider {SwapProvider}</span>
1279
+ <span class="cstat-no" title="statement not covered" > * @param fromCoinTicker {string}</span>
1280
+ <span class="cstat-no" title="statement not covered" > * @param toCoinTicker {string}</span>
1281
+ <span class="cstat-no" title="statement not covered" > * @param amount {string}</span>
1282
+ <span class="cstat-no" title="statement not covered" > * @param proprietarySwapEstimationData {Object|null}</span>
1283
+ <span class="cstat-no" title="statement not covered" > * @param toAddress {string}</span>
1284
+ <span class="cstat-no" title="statement not covered" > * @param refundAddress {string}</span>
1285
+ <span class="cstat-no" title="statement not covered" > * @param clientIp {string}</span>
1286
+ <span class="cstat-no" title="statement not covered" > * @param [toCurrencyExtraId] {string}</span>
1287
+ <span class="cstat-no" title="statement not covered" > * @param [refundExtraId] {string}</span>
1288
+ <span class="cstat-no" title="statement not covered" > * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount.</span>
1289
+ <span class="cstat-no" title="statement not covered" > * False means the amount is the sending amount.</span>
1290
+ <span class="cstat-no" title="statement not covered" > * @param isFixed {boolean}</span>
1291
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;{</span>
1292
+ <span class="cstat-no" title="statement not covered" > * result: true,</span>
1293
+ <span class="cstat-no" title="statement not covered" > * fiatCurrencyCode: string,</span>
1294
+ <span class="cstat-no" title="statement not covered" > * toCoinTicker: string,</span>
1295
+ <span class="cstat-no" title="statement not covered" > * fromAmountFiat: (number|null),</span>
1296
+ <span class="cstat-no" title="statement not covered" > * address: string,</span>
1297
+ <span class="cstat-no" title="statement not covered" > * durationMinutesRange: string,</span>
1298
+ <span class="cstat-no" title="statement not covered" > * fromAmount: string,</span>
1299
+ <span class="cstat-no" title="statement not covered" > * toAmount: string,</span>
1300
+ <span class="cstat-no" title="statement not covered" > * toAmountFiat: (number|null),</span>
1301
+ <span class="cstat-no" title="statement not covered" > * fiatCurrencyDecimals: number,</span>
1302
+ <span class="cstat-no" title="statement not covered" > * fromCoinTicker: string,</span>
1303
+ <span class="cstat-no" title="statement not covered" > * rate: string,</span>
1304
+ <span class="cstat-no" title="statement not covered" > * swapId: string,</span>
1305
+ <span class="cstat-no" title="statement not covered" > * fromCurrencyExtraId: string,</span>
1306
+ <span class="cstat-no" title="statement not covered" > * fixed: boolean</span>
1307
+ <span class="cstat-no" title="statement not covered" > * }|{</span>
1308
+ <span class="cstat-no" title="statement not covered" > * result: false,</span>
1309
+ <span class="cstat-no" title="statement not covered" > * reason: string</span>
1310
+ <span class="cstat-no" title="statement not covered" > * }&gt;}</span>
1311
+ <span class="cstat-no" title="statement not covered" > */</span>
1312
+ <span class="cstat-no" title="statement not covered" > async createPublicSwap(</span>
1313
+ <span class="cstat-no" title="statement not covered" > provider,</span>
1314
+ <span class="cstat-no" title="statement not covered" > fromCoinTicker,</span>
1315
+ <span class="cstat-no" title="statement not covered" > toCoinTicker,</span>
1316
+ <span class="cstat-no" title="statement not covered" > amount,</span>
1317
+ <span class="cstat-no" title="statement not covered" > proprietarySwapEstimationData,</span>
1318
+ <span class="cstat-no" title="statement not covered" > toAddress,</span>
1319
+ <span class="cstat-no" title="statement not covered" > refundAddress,</span>
1320
+ <span class="cstat-no" title="statement not covered" > clientIp,</span>
1321
+ <span class="cstat-no" title="statement not covered" > toCurrencyExtraId,</span>
1322
+ <span class="cstat-no" title="statement not covered" > refundExtraId,</span>
1323
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive = false,</span>
1324
+ <span class="cstat-no" title="statement not covered" > isFixed = false</span>
1325
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1326
+ <span class="cstat-no" title="statement not covered" > const loggerSource = "createPublicSwap";</span>
1327
+ <span class="cstat-no" title="statement not covered" > try {</span>
1328
+ <span class="cstat-no" title="statement not covered" > if (</span>
1329
+ <span class="cstat-no" title="statement not covered" > !(provider instanceof SwapProvider) ||</span>
1330
+ <span class="cstat-no" title="statement not covered" > typeof fromCoinTicker !== "string" ||</span>
1331
+ <span class="cstat-no" title="statement not covered" > typeof toCoinTicker !== "string" ||</span>
1332
+ <span class="cstat-no" title="statement not covered" > typeof amount !== "string" ||</span>
1333
+ <span class="cstat-no" title="statement not covered" > typeof toAddress !== "string"</span>
1334
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1335
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Wrong input: ${provider} ${fromCoinTicker} ${toCoinTicker} ${amount} ${isFixed}`);</span>
1336
+ <span class="cstat-no" title="statement not covered" > }</span>
1337
+ <span class="cstat-no" title="statement not covered" ></span>
1338
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1339
+ <span class="cstat-no" title="statement not covered" > `Start: ${provider.id} ${amount} ${fromCoinTicker} -&gt; ${toCoinTicker}. raw data: ${proprietarySwapEstimationData}`,</span>
1340
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1341
+ <span class="cstat-no" title="statement not covered" > );</span>
1342
+ <span class="cstat-no" title="statement not covered" ></span>
1343
+ <span class="cstat-no" title="statement not covered" > const [fromCoin, toCoin] = [fromCoinTicker, toCoinTicker].map(t =&gt; this.getCoinByTickerIfPresent(t));</span>
1344
+ <span class="cstat-no" title="statement not covered" > const result = await provider.createSwap(</span>
1345
+ <span class="cstat-no" title="statement not covered" > fromCoin,</span>
1346
+ <span class="cstat-no" title="statement not covered" > toCoin,</span>
1347
+ <span class="cstat-no" title="statement not covered" > amount,</span>
1348
+ <span class="cstat-no" title="statement not covered" > toAddress,</span>
1349
+ <span class="cstat-no" title="statement not covered" > refundAddress,</span>
1350
+ <span class="cstat-no" title="statement not covered" > proprietarySwapEstimationData,</span>
1351
+ <span class="cstat-no" title="statement not covered" > clientIp,</span>
1352
+ <span class="cstat-no" title="statement not covered" > isFixed,</span>
1353
+ <span class="cstat-no" title="statement not covered" > toCurrencyExtraId,</span>
1354
+ <span class="cstat-no" title="statement not covered" > refundExtraId,</span>
1355
+ <span class="cstat-no" title="statement not covered" > amountIsToReceive</span>
1356
+ <span class="cstat-no" title="statement not covered" > );</span>
1357
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1358
+ <span class="cstat-no" title="statement not covered" > `Created:${safeStringify({ ...result, fromCoin: fromCoinTicker, toCoin: toCoinTicker })}`,</span>
1359
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1360
+ <span class="cstat-no" title="statement not covered" > );</span>
1361
+ <span class="cstat-no" title="statement not covered" > if (!result?.result) {</span>
1362
+ <span class="cstat-no" title="statement not covered" > if (result?.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {</span>
1363
+ <span class="cstat-no" title="statement not covered" > SwapUtils.safeHandleRequestsLimitExceeding();</span>
1364
+ <span class="cstat-no" title="statement not covered" > return {</span>
1365
+ <span class="cstat-no" title="statement not covered" > result: false,</span>
1366
+ <span class="cstat-no" title="statement not covered" > reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,</span>
1367
+ <span class="cstat-no" title="statement not covered" > };</span>
1368
+ <span class="cstat-no" title="statement not covered" > }</span>
1369
+ <span class="cstat-no" title="statement not covered" > if (result?.reason === SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL) {</span>
1370
+ <span class="cstat-no" title="statement not covered" > // TODO: [feature, high] implement retrying if one partner fail and we have another partners task_id=a07e367e488f4a4899613ac9056fa359</span>
1371
+ <span class="cstat-no" title="statement not covered" > // return {</span>
1372
+ <span class="cstat-no" title="statement not covered" > // result: false,</span>
1373
+ <span class="cstat-no" title="statement not covered" > // reason: PublicSwapService.SWAP_CREATION_FAIL_REASONS.RETRIABLE_FAIL,</span>
1374
+ <span class="cstat-no" title="statement not covered" > // };</span>
1375
+ <span class="cstat-no" title="statement not covered" > }</span>
1376
+ <span class="cstat-no" title="statement not covered" > }</span>
1377
+ <span class="cstat-no" title="statement not covered" > if (result.result &amp;&amp; result?.swapId) {</span>
1378
+ <span class="cstat-no" title="statement not covered" > let fromAmountFiat = null,</span>
1379
+ <span class="cstat-no" title="statement not covered" > toAmountFiat = null;</span>
1380
+ <span class="cstat-no" title="statement not covered" > try {</span>
1381
+ <span class="cstat-no" title="statement not covered" > const fromCoinUsdtRate = (await provider.getCoinToUSDTRate(fromCoinTicker))?.rate ?? null;</span>
1382
+ <span class="cstat-no" title="statement not covered" > const toCoinUsdtRate = (await provider.getCoinToUSDTRate(toCoinTicker))?.rate ?? null;</span>
1383
+ <span class="cstat-no" title="statement not covered" > if (fromCoinUsdtRate != null &amp;&amp; result.fromAmount != null) {</span>
1384
+ <span class="cstat-no" title="statement not covered" > fromAmountFiat = BigNumber(result.fromAmount)</span>
1385
+ <span class="cstat-no" title="statement not covered" > .times(fromCoinUsdtRate)</span>
1386
+ <span class="cstat-no" title="statement not covered" > .toFixed(PublicSwapService._fiatDecimalsCount);</span>
1387
+ <span class="cstat-no" title="statement not covered" > }</span>
1388
+ <span class="cstat-no" title="statement not covered" > if (toCoinUsdtRate != null &amp;&amp; result.toAmount != null) {</span>
1389
+ <span class="cstat-no" title="statement not covered" > toAmountFiat = BigNumber(result.toAmount)</span>
1390
+ <span class="cstat-no" title="statement not covered" > .times(toCoinUsdtRate)</span>
1391
+ <span class="cstat-no" title="statement not covered" > .toFixed(PublicSwapService._fiatDecimalsCount);</span>
1392
+ <span class="cstat-no" title="statement not covered" > }</span>
1393
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1394
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, loggerSource, "Failed to calculate fiat amounts for result");</span>
1395
+ <span class="cstat-no" title="statement not covered" > }</span>
1396
+ <span class="cstat-no" title="statement not covered" ></span>
1397
+ <span class="cstat-no" title="statement not covered" > await GoogleAnalyticsAdapter.sendEvent(PublicSwapService.PUBLIC_SWAP_CREATED_ANALYTICS_EVENT, {</span>
1398
+ <span class="cstat-no" title="statement not covered" > coin_amount: result.fromAmount,</span>
1399
+ <span class="cstat-no" title="statement not covered" > usd_amount: fromAmountFiat,</span>
1400
+ <span class="cstat-no" title="statement not covered" > fromCoin: fromCoinTicker,</span>
1401
+ <span class="cstat-no" title="statement not covered" > toCoin: toCoinTicker,</span>
1402
+ <span class="cstat-no" title="statement not covered" > });</span>
1403
+ <span class="cstat-no" title="statement not covered" ></span>
1404
+ <span class="cstat-no" title="statement not covered" > const toReturn = {</span>
1405
+ <span class="cstat-no" title="statement not covered" > result: true,</span>
1406
+ <span class="cstat-no" title="statement not covered" > swapId: result.swapId,</span>
1407
+ <span class="cstat-no" title="statement not covered" > fromCoinTicker: fromCoinTicker,</span>
1408
+ <span class="cstat-no" title="statement not covered" > toCoinTicker: toCoinTicker,</span>
1409
+ <span class="cstat-no" title="statement not covered" > fromAmount: result.fromAmount,</span>
1410
+ <span class="cstat-no" title="statement not covered" > toAmount: result.toAmount,</span>
1411
+ <span class="cstat-no" title="statement not covered" > fromAmountFiat: fromAmountFiat,</span>
1412
+ <span class="cstat-no" title="statement not covered" > toAmountFiat: toAmountFiat,</span>
1413
+ <span class="cstat-no" title="statement not covered" > fiatCurrencyCode: "USD",</span>
1414
+ <span class="cstat-no" title="statement not covered" > fiatCurrencyDecimals: PublicSwapService._fiatDecimalsCount,</span>
1415
+ <span class="cstat-no" title="statement not covered" > rate: result.rate,</span>
1416
+ <span class="cstat-no" title="statement not covered" > durationMinutesRange: null, // TODO: [feature, high] add duration. task_id=3f3d73d7cf44454282222901409149b5</span>
1417
+ <span class="cstat-no" title="statement not covered" > address: result.fromAddress, // CRITICAL: this is the address to send coins to swaps provider</span>
1418
+ <span class="cstat-no" title="statement not covered" > fromCurrencyExtraId: result.fromCurrencyExtraId ?? "", // CRITICAL: this is the extra ID for address to send coins to swaps provider</span>
1419
+ <span class="cstat-no" title="statement not covered" > fixed: result.fixed,</span>
1420
+ <span class="cstat-no" title="statement not covered" > };</span>
1421
+ <span class="cstat-no" title="statement not covered" ></span>
1422
+ <span class="cstat-no" title="statement not covered" > this._savePublicSwapIdLocally(result.swapId);</span>
1423
+ <span class="cstat-no" title="statement not covered" ></span>
1424
+ <span class="cstat-no" title="statement not covered" > Logger.log(</span>
1425
+ <span class="cstat-no" title="statement not covered" > `Returning: ${safeStringify({</span>
1426
+ <span class="cstat-no" title="statement not covered" > ...toReturn,</span>
1427
+ <span class="cstat-no" title="statement not covered" > fromCoin: fromCoinTicker,</span>
1428
+ <span class="cstat-no" title="statement not covered" > toCoin: toCoinTicker,</span>
1429
+ <span class="cstat-no" title="statement not covered" > })}`,</span>
1430
+ <span class="cstat-no" title="statement not covered" > loggerSource</span>
1431
+ <span class="cstat-no" title="statement not covered" > );</span>
1432
+ <span class="cstat-no" title="statement not covered" > return toReturn;</span>
1433
+ <span class="cstat-no" title="statement not covered" > }</span>
1434
+ <span class="cstat-no" title="statement not covered" ></span>
1435
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Unexpected result from provider ${safeStringify(result)}`);</span>
1436
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1437
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, loggerSource);</span>
1438
+ <span class="cstat-no" title="statement not covered" > }</span>
1439
+ <span class="cstat-no" title="statement not covered" > }</span>
1440
+ <span class="cstat-no" title="statement not covered" ></span>
1441
+ <span class="cstat-no" title="statement not covered" > // TODO: [feature, moderate] move to client. task_id=de4b1ddc652b4a27a472341609fcb6e4</span>
1442
+ <span class="cstat-no" title="statement not covered" > // /**</span>
1443
+ <span class="cstat-no" title="statement not covered" > // * Retrieves the whole available swaps history by ids saved locally.</span>
1444
+ <span class="cstat-no" title="statement not covered" > // *</span>
1445
+ <span class="cstat-no" title="statement not covered" > // * @return {Promise&lt;{</span>
1446
+ <span class="cstat-no" title="statement not covered" > // * result: true,</span>
1447
+ <span class="cstat-no" title="statement not covered" > // * swaps: ExistingSwapWithFiatData[]</span>
1448
+ <span class="cstat-no" title="statement not covered" > // * }|{</span>
1449
+ <span class="cstat-no" title="statement not covered" > // * result: false,</span>
1450
+ <span class="cstat-no" title="statement not covered" > // * reason: string</span>
1451
+ <span class="cstat-no" title="statement not covered" > // * }&gt;}</span>
1452
+ <span class="cstat-no" title="statement not covered" > // */</span>
1453
+ <span class="cstat-no" title="statement not covered" > // async getPublicSwapsHistory() {</span>
1454
+ <span class="cstat-no" title="statement not covered" > // try {</span>
1455
+ <span class="cstat-no" title="statement not covered" > // const swapIds = this._getPublicSwapIdsSavedLocally();</span>
1456
+ <span class="cstat-no" title="statement not covered" > // if (swapIds.length) {</span>
1457
+ <span class="cstat-no" title="statement not covered" > // return await this.getPublicExistingSwapDetailsAndStatus(swapIds);</span>
1458
+ <span class="cstat-no" title="statement not covered" > // }</span>
1459
+ <span class="cstat-no" title="statement not covered" > // return { result: true, swaps: [] };</span>
1460
+ <span class="cstat-no" title="statement not covered" > // } catch (e) {</span>
1461
+ <span class="cstat-no" title="statement not covered" > // improveAndRethrow(e, "getPublicSwapsHistory");</span>
1462
+ <span class="cstat-no" title="statement not covered" > // }</span>
1463
+ <span class="cstat-no" title="statement not covered" > // }</span>
1464
+ <span class="cstat-no" title="statement not covered" ></span>
1465
+ <span class="cstat-no" title="statement not covered" > /**</span>
1466
+ <span class="cstat-no" title="statement not covered" > * @param swapId {string}</span>
1467
+ <span class="cstat-no" title="statement not covered" > * @private</span>
1468
+ <span class="cstat-no" title="statement not covered" > */</span>
1469
+ <span class="cstat-no" title="statement not covered" > _savePublicSwapIdLocally(swapId) {</span>
1470
+ <span class="cstat-no" title="statement not covered" > if (typeof window !== "undefined") {</span>
1471
+ <span class="cstat-no" title="statement not covered" > try {</span>
1472
+ <span class="cstat-no" title="statement not covered" > const saved = localStorage.getItem("publicSwapIds");</span>
1473
+ <span class="cstat-no" title="statement not covered" > const ids = typeof saved === "string" &amp;&amp; saved.length &gt; 0 ? saved.split(",") : [];</span>
1474
+ <span class="cstat-no" title="statement not covered" > ids.push(swapId);</span>
1475
+ <span class="cstat-no" title="statement not covered" > localStorage.setItem("publicSwapIds", ids.join(","));</span>
1476
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1477
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "_savePublicSwapIdLocally");</span>
1478
+ <span class="cstat-no" title="statement not covered" > }</span>
1479
+ <span class="cstat-no" title="statement not covered" > }</span>
1480
+ <span class="cstat-no" title="statement not covered" > }</span>
1481
+ <span class="cstat-no" title="statement not covered" ></span>
1482
+ <span class="cstat-no" title="statement not covered" > /**</span>
1483
+ <span class="cstat-no" title="statement not covered" > * @private</span>
1484
+ <span class="cstat-no" title="statement not covered" > * @return {string[]}</span>
1485
+ <span class="cstat-no" title="statement not covered" > */</span>
1486
+ <span class="cstat-no" title="statement not covered" > _getPublicSwapIdsSavedLocally() {</span>
1487
+ <span class="cstat-no" title="statement not covered" > if (typeof window !== "undefined") {</span>
1488
+ <span class="cstat-no" title="statement not covered" > try {</span>
1489
+ <span class="cstat-no" title="statement not covered" > const saved = localStorage.getItem("publicSwapIds");</span>
1490
+ <span class="cstat-no" title="statement not covered" > return typeof saved === "string" &amp;&amp; saved.length &gt; 0 ? saved.split(",") : [];</span>
1491
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1492
+ <span class="cstat-no" title="statement not covered" > improveAndRethrow(e, "_getPublicSwapIdsSavedLocally");</span>
1493
+ <span class="cstat-no" title="statement not covered" > }</span>
1494
+ <span class="cstat-no" title="statement not covered" > }</span>
1495
+ <span class="cstat-no" title="statement not covered" > }</span>
1496
+ <span class="cstat-no" title="statement not covered" ></span>
1497
+ <span class="cstat-no" title="statement not covered" > /**</span>
1498
+ <span class="cstat-no" title="statement not covered" > * @param ticker {string}</span>
1499
+ <span class="cstat-no" title="statement not covered" > * @return {Coin|null}</span>
1500
+ <span class="cstat-no" title="statement not covered" > */</span>
1501
+ <span class="cstat-no" title="statement not covered" > getCoinByTickerIfPresent(ticker) {</span>
1502
+ <span class="cstat-no" title="statement not covered" > return (</span>
1503
+ <span class="cstat-no" title="statement not covered" > this._swapProvider.getCoinByTickerIfPresent(ticker) ??</span>
1504
+ <span class="cstat-no" title="statement not covered" > this._fixedSwapProvider.getCoinByTickerIfPresent(ticker)</span>
1505
+ <span class="cstat-no" title="statement not covered" > );</span>
1506
+ <span class="cstat-no" title="statement not covered" > }</span>
1507
+ <span class="cstat-no" title="statement not covered" ></span>
1508
+ <span class="cstat-no" title="statement not covered" > /**</span>
1509
+ <span class="cstat-no" title="statement not covered" > * Retrieves flat partners list across all supported providers (including aggregators).</span>
1510
+ <span class="cstat-no" title="statement not covered" > *</span>
1511
+ <span class="cstat-no" title="statement not covered" > * @param providers {SwapProvider[]}</span>
1512
+ <span class="cstat-no" title="statement not covered" > * @return {Promise&lt;Partner[]&gt;}</span>
1513
+ <span class="cstat-no" title="statement not covered" > */</span>
1514
+ <span class="cstat-no" title="statement not covered" > async getPartnersList(providers) {</span>
1515
+ <span class="cstat-no" title="statement not covered" > try {</span>
1516
+ <span class="cstat-no" title="statement not covered" > let allPartners = providers.map(provider =&gt; provider.getPartnersList());</span>
1517
+ <span class="cstat-no" title="statement not covered" > allPartners = await Promise.all(allPartners);</span>
1518
+ <span class="cstat-no" title="statement not covered" > allPartners = allPartners.flat().flat();</span>
1519
+ <span class="cstat-no" title="statement not covered" > return allPartners.reduce((prev, cur) =&gt; {</span>
1520
+ <span class="cstat-no" title="statement not covered" > const alreadyAdded = prev.find(partner =&gt; partner.name.toLowerCase() === cur.name.toLowerCase());</span>
1521
+ <span class="cstat-no" title="statement not covered" > if (!alreadyAdded) {</span>
1522
+ <span class="cstat-no" title="statement not covered" > prev.push(cur);</span>
1523
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1524
+ <span class="cstat-no" title="statement not covered" > // Attempting to fill missing data if there are the same partner from different providers</span>
1525
+ <span class="cstat-no" title="statement not covered" > alreadyAdded.logoUrl = cur.logoUrl ?? alreadyAdded.logoUrl;</span>
1526
+ <span class="cstat-no" title="statement not covered" > alreadyAdded.kycLevel = cur.kycLevel ?? alreadyAdded.kycLevel;</span>
1527
+ <span class="cstat-no" title="statement not covered" > }</span>
1528
+ <span class="cstat-no" title="statement not covered" > return prev;</span>
1529
+ <span class="cstat-no" title="statement not covered" > }, []);</span>
1530
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1531
+ <span class="cstat-no" title="statement not covered" > Logger.logError(e, "getPartnersList");</span>
1532
+ <span class="cstat-no" title="statement not covered" > }</span>
1533
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1534
+ <span class="cstat-no" title="statement not covered" > }</span>
1535
+ <span class="cstat-no" title="statement not covered" >}</span>
1536
+ &nbsp;</pre></td></tr></table></pre>
1537
+
1538
+ <div class='push'></div><!-- for sticky footer -->
1539
+ </div><!-- /wrapper -->
1540
+ <div class='footer quiet pad2 space-top1 center small'>
1541
+ Code coverage generated by
1542
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1543
+ at 2024-10-05T17:36:33.349Z
1544
+ </div>
1545
+ <script src="../../../../prettify.js"></script>
1546
+ <script>
1547
+ window.onload = function () {
1548
+ prettyPrint();
1549
+ };
1550
+ </script>
1551
+ <script src="../../../../sorter.js"></script>
1552
+ <script src="../../../../block-navigation.js"></script>
1553
+ </body>
1554
+ </html>
1555
+