@testgorilla/tgo-coding-test 0.0.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +49 -2
  2. package/esm2022/index.mjs +12 -0
  3. package/esm2022/lib/components/code-editor/code-editor.component.mjs +335 -0
  4. package/esm2022/lib/components/code-editor/code-editor.service.mjs +72 -0
  5. package/esm2022/lib/components/code-editor/helpers/c-helper.mjs +40 -0
  6. package/esm2022/lib/components/code-editor/helpers/code-editor-helper.base.mjs +11 -0
  7. package/esm2022/lib/components/code-editor/helpers/code-editor-helper.model.mjs +2 -0
  8. package/esm2022/lib/components/code-editor/helpers/cpp-helper.mjs +41 -0
  9. package/esm2022/lib/components/code-editor/helpers/csharp-helper.mjs +42 -0
  10. package/esm2022/lib/components/code-editor/helpers/go-helper.mjs +42 -0
  11. package/esm2022/lib/components/code-editor/helpers/index.mjs +16 -0
  12. package/esm2022/lib/components/code-editor/helpers/java-helper.mjs +42 -0
  13. package/esm2022/lib/components/code-editor/helpers/javascript-helper.mjs +26 -0
  14. package/esm2022/lib/components/code-editor/helpers/kotlin-helper.mjs +42 -0
  15. package/esm2022/lib/components/code-editor/helpers/php-helper.mjs +26 -0
  16. package/esm2022/lib/components/code-editor/helpers/python-helper.mjs +26 -0
  17. package/esm2022/lib/components/code-editor/helpers/r-helper.mjs +26 -0
  18. package/esm2022/lib/components/code-editor/helpers/ruby-helper.mjs +26 -0
  19. package/esm2022/lib/components/code-editor/helpers/scala-helper.mjs +41 -0
  20. package/esm2022/lib/components/code-editor/helpers/sql-helper.mjs +34 -0
  21. package/esm2022/lib/components/code-editor/helpers/swift-helper.mjs +40 -0
  22. package/esm2022/lib/components/code-editor/helpers/typescript-helper.mjs +41 -0
  23. package/esm2022/lib/components/code-editor/models/code-editor.model.mjs +2 -0
  24. package/esm2022/lib/components/code-editor/models/coding-snapshot.model.mjs +2 -0
  25. package/esm2022/lib/components/coding-question/coding-question.component.mjs +126 -0
  26. package/esm2022/lib/components/coding-section/coding-section.component.mjs +188 -0
  27. package/esm2022/lib/components/common/truncated-text/truncated-text.component.mjs +38 -0
  28. package/esm2022/lib/components/configurations/configurations.component.mjs +97 -0
  29. package/esm2022/lib/components/instructions/instructions.component.mjs +139 -0
  30. package/esm2022/lib/components/panel/panel.component.mjs +34 -0
  31. package/esm2022/lib/components/runnable-editor/runnable-editor.component.mjs +169 -0
  32. package/esm2022/lib/components/tests/test-cases/test-cases.component.mjs +198 -0
  33. package/esm2022/lib/components/tests/test-cases-content/test-cases-content.component.mjs +96 -0
  34. package/esm2022/lib/components/tests/test-cases-status/test-cases-status.component.mjs +21 -0
  35. package/esm2022/lib/components/tests/test-results.component.mjs +127 -0
  36. package/esm2022/lib/components/tgo-coding-test/tgo-coding-test.component.mjs +280 -0
  37. package/esm2022/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.mjs +476 -0
  38. package/esm2022/lib/config/index.mjs +2 -0
  39. package/esm2022/lib/config/tgo-coding-test.config.mjs +2 -0
  40. package/esm2022/lib/config/tgo-coding-test.provider.mjs +34 -0
  41. package/esm2022/lib/config/tgo-coding-test.token.mjs +14 -0
  42. package/esm2022/lib/models/auto-saved-data.mjs +2 -0
  43. package/esm2022/lib/models/code-event.mjs +2 -0
  44. package/esm2022/lib/models/coderunner-execution-results.mjs +2 -0
  45. package/esm2022/lib/models/configs.mjs +2 -0
  46. package/esm2022/lib/models/language-change-action.mjs +2 -0
  47. package/esm2022/lib/models/lat-languages.mjs +3 -0
  48. package/esm2022/lib/models/mixpanel-events.mjs +2 -0
  49. package/esm2022/lib/models/mode.mjs +2 -0
  50. package/esm2022/lib/models/paste-data.mjs +2 -0
  51. package/esm2022/lib/models/programming-language.mjs +2 -0
  52. package/esm2022/lib/models/test-cases.mjs +7 -0
  53. package/esm2022/lib/models/theme.mjs +2 -0
  54. package/esm2022/lib/models/translations.mjs +2 -0
  55. package/esm2022/lib/models/view-mode.mjs +8 -0
  56. package/esm2022/lib/pipes/memoize-func.pipe.mjs +39 -0
  57. package/esm2022/lib/services/candidate-coding-test-services/candidature-api.service.mjs +19 -0
  58. package/esm2022/lib/services/candidate-coding-test-services/coderunner-api.service.mjs +58 -0
  59. package/esm2022/lib/services/candidate-coding-test-services/coding-test-tour.service.mjs +89 -0
  60. package/esm2022/lib/services/candidate-coding-test-services/coding-test.service.mjs +490 -0
  61. package/esm2022/lib/services/candidate-coding-test-services/index.mjs +5 -0
  62. package/esm2022/lib/services/coding-test-config.service.mjs +51 -0
  63. package/esm2022/lib/services/configurations.service.mjs +89 -0
  64. package/esm2022/lib/services/lib-coding-test.service.mjs +106 -0
  65. package/esm2022/lib/services/storage.service.mjs +624 -0
  66. package/esm2022/lib/services/test-cases.service.mjs +30 -0
  67. package/esm2022/lib/services/theme.service.mjs +36 -0
  68. package/esm2022/lib/utils/additional-languages/erlang.mjs +103 -0
  69. package/esm2022/lib/utils/resize-element.mjs +13 -0
  70. package/esm2022/lib/utils/time-to-ms.util.mjs +11 -0
  71. package/esm2022/shared/index.mjs +5 -0
  72. package/esm2022/shared/lib/components/audio-animation/audio-animation.component.mjs +114 -0
  73. package/esm2022/shared/lib/components/audio-animation/index.mjs +2 -0
  74. package/esm2022/shared/lib/components/index.mjs +3 -0
  75. package/esm2022/shared/lib/components/vimeo-video/index.mjs +2 -0
  76. package/esm2022/shared/lib/components/vimeo-video/vimeo-video.component.mjs +101 -0
  77. package/esm2022/shared/lib/models/answer.mjs +2 -0
  78. package/esm2022/shared/lib/models/assessment.mjs +2 -0
  79. package/esm2022/shared/lib/models/environment.mjs +2 -0
  80. package/esm2022/shared/lib/models/index.mjs +9 -0
  81. package/esm2022/shared/lib/models/question-component.mjs +2 -0
  82. package/esm2022/shared/lib/models/question.mjs +2 -0
  83. package/esm2022/shared/lib/models/test.mjs +2 -0
  84. package/esm2022/shared/lib/models/translations.mjs +2 -0
  85. package/esm2022/shared/lib/models/window.mjs +2 -0
  86. package/esm2022/shared/lib/services/api/api.service.mjs +97 -0
  87. package/esm2022/shared/lib/services/api/mocked-api.service.mjs +131 -0
  88. package/esm2022/shared/lib/services/environment/environment.service.mjs +13 -0
  89. package/esm2022/shared/lib/services/index.mjs +10 -0
  90. package/esm2022/shared/lib/services/localization/languages.model.mjs +19 -0
  91. package/esm2022/shared/lib/services/localization/transloco-lazy-module-utils.mjs +27 -0
  92. package/esm2022/shared/lib/services/localization/transloco-testing.module.mjs +11 -0
  93. package/esm2022/shared/lib/services/media/media.service.mjs +129 -0
  94. package/esm2022/shared/lib/services/mixpanel/mixpanel.service.mjs +30 -0
  95. package/esm2022/shared/lib/services/theme/theme.service.mjs +24 -0
  96. package/esm2022/shared/test-mocks/assessment-test.mock.mjs +112 -0
  97. package/esm2022/shared/test-mocks/index.mjs +3 -0
  98. package/esm2022/shared/test-mocks/tgo-ui.mock.mjs +39 -0
  99. package/esm2022/testgorilla-tgo-coding-test.mjs +5 -0
  100. package/fesm2022/testgorilla-tgo-coding-test.mjs +4526 -0
  101. package/fesm2022/testgorilla-tgo-coding-test.mjs.map +1 -0
  102. package/{src/index.ts → index.d.ts} +2 -19
  103. package/lib/components/code-editor/code-editor.component.d.ts +54 -0
  104. package/lib/components/code-editor/code-editor.service.d.ts +12 -0
  105. package/lib/components/code-editor/helpers/c-helper.d.ts +11 -0
  106. package/lib/components/code-editor/helpers/code-editor-helper.base.d.ts +8 -0
  107. package/lib/components/code-editor/helpers/code-editor-helper.model.d.ts +62 -0
  108. package/lib/components/code-editor/helpers/cpp-helper.d.ts +11 -0
  109. package/lib/components/code-editor/helpers/csharp-helper.d.ts +12 -0
  110. package/lib/components/code-editor/helpers/go-helper.d.ts +12 -0
  111. package/lib/components/code-editor/helpers/java-helper.d.ts +12 -0
  112. package/lib/components/code-editor/helpers/javascript-helper.d.ts +10 -0
  113. package/lib/components/code-editor/helpers/kotlin-helper.d.ts +12 -0
  114. package/lib/components/code-editor/helpers/php-helper.d.ts +10 -0
  115. package/lib/components/code-editor/helpers/python-helper.d.ts +10 -0
  116. package/lib/components/code-editor/helpers/r-helper.d.ts +10 -0
  117. package/lib/components/code-editor/helpers/ruby-helper.d.ts +10 -0
  118. package/lib/components/code-editor/helpers/scala-helper.d.ts +12 -0
  119. package/lib/components/code-editor/helpers/sql-helper.d.ts +10 -0
  120. package/lib/components/code-editor/helpers/swift-helper.d.ts +11 -0
  121. package/lib/components/code-editor/helpers/typescript-helper.d.ts +11 -0
  122. package/lib/components/code-editor/models/code-editor.model.d.ts +8 -0
  123. package/lib/components/code-editor/models/coding-snapshot.model.d.ts +4 -0
  124. package/lib/components/coding-question/coding-question.component.d.ts +45 -0
  125. package/lib/components/coding-section/coding-section.component.d.ts +52 -0
  126. package/lib/components/common/truncated-text/truncated-text.component.d.ts +13 -0
  127. package/lib/components/configurations/configurations.component.d.ts +40 -0
  128. package/lib/components/instructions/instructions.component.d.ts +48 -0
  129. package/lib/components/panel/panel.component.d.ts +12 -0
  130. package/lib/components/runnable-editor/runnable-editor.component.d.ts +53 -0
  131. package/lib/components/tests/test-cases/test-cases.component.d.ts +46 -0
  132. package/lib/components/tests/test-cases-content/test-cases-content.component.d.ts +26 -0
  133. package/lib/components/tests/test-cases-status/test-cases-status.component.d.ts +9 -0
  134. package/lib/components/tests/test-results.component.d.ts +33 -0
  135. package/lib/components/tgo-coding-test/tgo-coding-test.component.d.ts +69 -0
  136. package/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.d.ts +101 -0
  137. package/{src/lib/config/index.ts → lib/config/index.d.ts} +0 -1
  138. package/lib/config/tgo-coding-test.config.d.ts +24 -0
  139. package/{src/lib/config/tgo-coding-test.provider.ts → lib/config/tgo-coding-test.provider.d.ts} +6 -18
  140. package/lib/config/tgo-coding-test.token.d.ts +9 -0
  141. package/lib/models/auto-saved-data.d.ts +42 -0
  142. package/lib/models/code-event.d.ts +15 -0
  143. package/lib/models/coderunner-execution-results.d.ts +51 -0
  144. package/lib/models/configs.d.ts +15 -0
  145. package/lib/models/language-change-action.d.ts +4 -0
  146. package/lib/models/lat-languages.d.ts +8 -0
  147. package/lib/models/mixpanel-events.d.ts +3 -0
  148. package/lib/models/mode.d.ts +5 -0
  149. package/lib/models/paste-data.d.ts +4 -0
  150. package/lib/models/programming-language.d.ts +8 -0
  151. package/lib/models/test-cases.d.ts +67 -0
  152. package/lib/models/theme.d.ts +4 -0
  153. package/lib/models/translations.d.ts +1 -0
  154. package/lib/models/view-mode.d.ts +6 -0
  155. package/{src/lib/pipes/memoize-func.pipe.ts → lib/pipes/memoize-func.pipe.d.ts} +6 -14
  156. package/lib/services/candidate-coding-test-services/candidature-api.service.d.ts +10 -0
  157. package/lib/services/candidate-coding-test-services/coderunner-api.service.d.ts +18 -0
  158. package/lib/services/candidate-coding-test-services/coding-test-tour.service.d.ts +22 -0
  159. package/lib/services/candidate-coding-test-services/coding-test.service.d.ts +68 -0
  160. package/{src/lib/services/candidate-coding-test-services/index.ts → lib/services/candidate-coding-test-services/index.d.ts} +1 -1
  161. package/lib/services/coding-test-config.service.d.ts +38 -0
  162. package/lib/services/configurations.service.d.ts +37 -0
  163. package/lib/services/lib-coding-test.service.d.ts +69 -0
  164. package/lib/services/storage.service.d.ts +83 -0
  165. package/lib/services/test-cases.service.d.ts +12 -0
  166. package/lib/services/theme.service.d.ts +17 -0
  167. package/lib/utils/additional-languages/erlang.d.ts +37 -0
  168. package/lib/utils/resize-element.d.ts +2 -0
  169. package/lib/utils/time-to-ms.util.d.ts +1 -0
  170. package/package.json +18 -7
  171. package/shared/index.d.ts +4 -0
  172. package/shared/lib/components/audio-animation/audio-animation.component.d.ts +27 -0
  173. package/shared/lib/components/audio-animation/index.d.ts +1 -0
  174. package/shared/lib/components/index.d.ts +2 -0
  175. package/shared/lib/components/vimeo-video/index.d.ts +1 -0
  176. package/shared/lib/components/vimeo-video/vimeo-video.component.d.ts +24 -0
  177. package/shared/lib/models/answer.d.ts +17 -0
  178. package/shared/lib/models/assessment.d.ts +80 -0
  179. package/shared/lib/models/environment.d.ts +1 -0
  180. package/shared/lib/models/index.d.ts +8 -0
  181. package/shared/lib/models/question-component.d.ts +54 -0
  182. package/shared/lib/models/question.d.ts +102 -0
  183. package/shared/lib/models/test.d.ts +81 -0
  184. package/shared/lib/models/translations.d.ts +1 -0
  185. package/shared/lib/models/window.d.ts +6 -0
  186. package/shared/lib/services/api/api.service.d.ts +25 -0
  187. package/shared/lib/services/api/mocked-api.service.d.ts +35 -0
  188. package/shared/lib/services/environment/environment.service.d.ts +6 -0
  189. package/shared/lib/services/index.d.ts +9 -0
  190. package/shared/lib/services/localization/languages.model.d.ts +15 -0
  191. package/shared/lib/services/localization/transloco-lazy-module-utils.d.ts +11 -0
  192. package/shared/lib/services/localization/transloco-testing.module.d.ts +2 -0
  193. package/shared/lib/services/media/media.service.d.ts +29 -0
  194. package/shared/lib/services/mixpanel/mixpanel.service.d.ts +10 -0
  195. package/shared/lib/services/theme/theme.service.d.ts +8 -0
  196. package/shared/test-mocks/assessment-test.mock.d.ts +21 -0
  197. package/shared/test-mocks/index.d.ts +2 -0
  198. package/shared/test-mocks/tgo-ui.mock.d.ts +21 -0
  199. package/.eslintrc.json +0 -45
  200. package/jest.config.ts +0 -21
  201. package/ng-package.json +0 -14
  202. package/project.json +0 -36
  203. package/src/lib/components/.gitkeep +0 -0
  204. package/src/lib/components/code-editor/code-editor.component.html +0 -10
  205. package/src/lib/components/code-editor/code-editor.component.scss +0 -21
  206. package/src/lib/components/code-editor/code-editor.component.spec.ts +0 -136
  207. package/src/lib/components/code-editor/code-editor.component.ts +0 -369
  208. package/src/lib/components/code-editor/code-editor.mocks.ts +0 -28
  209. package/src/lib/components/code-editor/code-editor.service.spec.ts +0 -160
  210. package/src/lib/components/code-editor/code-editor.service.ts +0 -94
  211. package/src/lib/components/code-editor/helpers/c-helper.spec.ts +0 -39
  212. package/src/lib/components/code-editor/helpers/c-helper.ts +0 -51
  213. package/src/lib/components/code-editor/helpers/code-editor-helper.base.spec.ts +0 -30
  214. package/src/lib/components/code-editor/helpers/code-editor-helper.base.ts +0 -16
  215. package/src/lib/components/code-editor/helpers/code-editor-helper.mocks.ts +0 -24
  216. package/src/lib/components/code-editor/helpers/code-editor-helper.model.ts +0 -67
  217. package/src/lib/components/code-editor/helpers/cpp-helper.spec.ts +0 -40
  218. package/src/lib/components/code-editor/helpers/cpp-helper.ts +0 -52
  219. package/src/lib/components/code-editor/helpers/csharp-helper.spec.ts +0 -42
  220. package/src/lib/components/code-editor/helpers/csharp-helper.ts +0 -55
  221. package/src/lib/components/code-editor/helpers/go-helper.spec.ts +0 -41
  222. package/src/lib/components/code-editor/helpers/go-helper.ts +0 -54
  223. package/src/lib/components/code-editor/helpers/java-helper.spec.ts +0 -41
  224. package/src/lib/components/code-editor/helpers/java-helper.ts +0 -54
  225. package/src/lib/components/code-editor/helpers/javascript-helper.spec.ts +0 -39
  226. package/src/lib/components/code-editor/helpers/javascript-helper.ts +0 -32
  227. package/src/lib/components/code-editor/helpers/kotlin-helper.spec.ts +0 -41
  228. package/src/lib/components/code-editor/helpers/kotlin-helper.ts +0 -54
  229. package/src/lib/components/code-editor/helpers/php-helper.spec.ts +0 -39
  230. package/src/lib/components/code-editor/helpers/php-helper.ts +0 -32
  231. package/src/lib/components/code-editor/helpers/python-helper.spec.ts +0 -39
  232. package/src/lib/components/code-editor/helpers/python-helper.ts +0 -32
  233. package/src/lib/components/code-editor/helpers/r-helper.spec.ts +0 -39
  234. package/src/lib/components/code-editor/helpers/r-helper.ts +0 -32
  235. package/src/lib/components/code-editor/helpers/ruby-helper.spec.ts +0 -39
  236. package/src/lib/components/code-editor/helpers/ruby-helper.ts +0 -32
  237. package/src/lib/components/code-editor/helpers/scala-helper.spec.ts +0 -41
  238. package/src/lib/components/code-editor/helpers/scala-helper.ts +0 -53
  239. package/src/lib/components/code-editor/helpers/sql-helper.spec.ts +0 -87
  240. package/src/lib/components/code-editor/helpers/sql-helper.ts +0 -44
  241. package/src/lib/components/code-editor/helpers/swift-helper.spec.ts +0 -40
  242. package/src/lib/components/code-editor/helpers/swift-helper.ts +0 -51
  243. package/src/lib/components/code-editor/helpers/typescript-helper.spec.ts +0 -40
  244. package/src/lib/components/code-editor/helpers/typescript-helper.ts +0 -52
  245. package/src/lib/components/code-editor/models/code-editor.model.ts +0 -9
  246. package/src/lib/components/code-editor/models/coding-snapshot.model.ts +0 -4
  247. package/src/lib/components/coding-question/coding-question.component.html +0 -78
  248. package/src/lib/components/coding-question/coding-question.component.scss +0 -76
  249. package/src/lib/components/coding-question/coding-question.component.spec.ts +0 -85
  250. package/src/lib/components/coding-question/coding-question.component.ts +0 -102
  251. package/src/lib/components/coding-section/coding-section.component.html +0 -82
  252. package/src/lib/components/coding-section/coding-section.component.scss +0 -64
  253. package/src/lib/components/coding-section/coding-section.component.spec.ts +0 -257
  254. package/src/lib/components/coding-section/coding-section.component.ts +0 -187
  255. package/src/lib/components/coding-test.module.ts +0 -124
  256. package/src/lib/components/common/truncated-text/truncated-text.component.html +0 -6
  257. package/src/lib/components/common/truncated-text/truncated-text.component.scss +0 -18
  258. package/src/lib/components/common/truncated-text/truncated-text.component.spec.ts +0 -84
  259. package/src/lib/components/common/truncated-text/truncated-text.component.ts +0 -37
  260. package/src/lib/components/configurations/configurations.component.html +0 -57
  261. package/src/lib/components/configurations/configurations.component.scss +0 -42
  262. package/src/lib/components/configurations/configurations.component.spec.ts +0 -186
  263. package/src/lib/components/configurations/configurations.component.ts +0 -98
  264. package/src/lib/components/instructions/instructions.component.html +0 -41
  265. package/src/lib/components/instructions/instructions.component.scss +0 -167
  266. package/src/lib/components/instructions/instructions.component.spec.ts +0 -106
  267. package/src/lib/components/instructions/instructions.component.ts +0 -138
  268. package/src/lib/components/panel/panel.component.html +0 -19
  269. package/src/lib/components/panel/panel.component.scss +0 -41
  270. package/src/lib/components/panel/panel.component.spec.ts +0 -40
  271. package/src/lib/components/panel/panel.component.ts +0 -34
  272. package/src/lib/components/runnable-editor/runnable-editor.component.html +0 -75
  273. package/src/lib/components/runnable-editor/runnable-editor.component.scss +0 -55
  274. package/src/lib/components/runnable-editor/runnable-editor.component.spec.ts +0 -124
  275. package/src/lib/components/runnable-editor/runnable-editor.component.ts +0 -155
  276. package/src/lib/components/tests/test-cases/test-cases.component.html +0 -135
  277. package/src/lib/components/tests/test-cases/test-cases.component.scss +0 -220
  278. package/src/lib/components/tests/test-cases/test-cases.component.spec.ts +0 -401
  279. package/src/lib/components/tests/test-cases/test-cases.component.ts +0 -205
  280. package/src/lib/components/tests/test-cases-content/test-cases-content.component.html +0 -94
  281. package/src/lib/components/tests/test-cases-content/test-cases-content.component.scss +0 -103
  282. package/src/lib/components/tests/test-cases-content/test-cases-content.component.spec.ts +0 -122
  283. package/src/lib/components/tests/test-cases-content/test-cases-content.component.ts +0 -102
  284. package/src/lib/components/tests/test-cases-status/test-cases-status.component.html +0 -16
  285. package/src/lib/components/tests/test-cases-status/test-cases-status.component.scss +0 -49
  286. package/src/lib/components/tests/test-cases-status/test-cases-status.component.spec.ts +0 -22
  287. package/src/lib/components/tests/test-cases-status/test-cases-status.component.ts +0 -18
  288. package/src/lib/components/tests/test-results.component.html +0 -119
  289. package/src/lib/components/tests/test-results.component.scss +0 -189
  290. package/src/lib/components/tests/test-results.component.spec.ts +0 -140
  291. package/src/lib/components/tests/test-results.component.ts +0 -98
  292. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.html +0 -96
  293. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.scss +0 -6
  294. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.spec.ts +0 -599
  295. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.ts +0 -279
  296. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.html +0 -36
  297. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.scss +0 -183
  298. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.spec.ts +0 -883
  299. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.ts +0 -575
  300. package/src/lib/config/tgo-coding-test.config.ts +0 -26
  301. package/src/lib/config/tgo-coding-test.token.ts +0 -21
  302. package/src/lib/models/.gitkeep +0 -0
  303. package/src/lib/models/auto-saved-data.ts +0 -51
  304. package/src/lib/models/code-event.ts +0 -17
  305. package/src/lib/models/coderunner-execution-results.ts +0 -58
  306. package/src/lib/models/coding-lib.mocks.ts +0 -246
  307. package/src/lib/models/configs.ts +0 -18
  308. package/src/lib/models/language-change-action.ts +0 -4
  309. package/src/lib/models/lat-languages.ts +0 -12
  310. package/src/lib/models/mixpanel-events.ts +0 -3
  311. package/src/lib/models/mode.ts +0 -5
  312. package/src/lib/models/paste-data.ts +0 -4
  313. package/src/lib/models/programming-language.ts +0 -9
  314. package/src/lib/models/test-cases.ts +0 -74
  315. package/src/lib/models/theme.ts +0 -5
  316. package/src/lib/models/translations.ts +0 -1
  317. package/src/lib/models/view-mode.ts +0 -6
  318. package/src/lib/services/.gitkeep +0 -0
  319. package/src/lib/services/candidate-coding-test-services/candidature-api.service.spec.ts +0 -40
  320. package/src/lib/services/candidate-coding-test-services/candidature-api.service.ts +0 -15
  321. package/src/lib/services/candidate-coding-test-services/coderunner-api.service.spec.ts +0 -134
  322. package/src/lib/services/candidate-coding-test-services/coderunner-api.service.ts +0 -105
  323. package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.spec.ts +0 -161
  324. package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.ts +0 -100
  325. package/src/lib/services/candidate-coding-test-services/coding-test.service.spec.ts +0 -1524
  326. package/src/lib/services/candidate-coding-test-services/coding-test.service.ts +0 -843
  327. package/src/lib/services/coding-test-config.service.ts +0 -48
  328. package/src/lib/services/configurations.service.mocks.ts +0 -77
  329. package/src/lib/services/configurations.service.spec.ts +0 -79
  330. package/src/lib/services/configurations.service.ts +0 -111
  331. package/src/lib/services/index.ts +0 -0
  332. package/src/lib/services/lib-coding-test.service.spec.ts +0 -265
  333. package/src/lib/services/lib-coding-test.service.ts +0 -157
  334. package/src/lib/services/local-storage.service.mocks.ts +0 -22
  335. package/src/lib/services/storage.service.spec.ts +0 -1120
  336. package/src/lib/services/storage.service.ts +0 -729
  337. package/src/lib/services/test-cases.service.spec.ts +0 -53
  338. package/src/lib/services/test-cases.service.ts +0 -29
  339. package/src/lib/services/theme.service.spec.ts +0 -76
  340. package/src/lib/services/theme.service.ts +0 -34
  341. package/src/lib/styles/mixins.scss +0 -86
  342. package/src/lib/styles/styles.scss +0 -112
  343. package/src/lib/styles/variables.scss +0 -105
  344. package/src/lib/utils/.gitkeep +0 -0
  345. package/src/lib/utils/additional-languages/erlang.ts +0 -115
  346. package/src/lib/utils/resize-element.ts +0 -15
  347. package/src/lib/utils/time-to-ms.util.ts +0 -10
  348. package/src/test-setup.ts +0 -1
  349. package/tsconfig.json +0 -16
  350. package/tsconfig.lib.json +0 -12
  351. package/tsconfig.lib.prod.json +0 -9
  352. package/tsconfig.spec.json +0 -13
  353. /package/{src/assets → assets}/i18n/en.json +0 -0
  354. /package/{src/lib/components/code-editor/helpers/index.ts → lib/components/code-editor/helpers/index.d.ts} +0 -0
@@ -0,0 +1,490 @@
1
+ import { Injectable, signal } from '@angular/core';
2
+ import { translate } from '@ngneat/transloco';
3
+ import { ConfirmDialogComponent, DialogService, SnackbarService, } from '@testgorilla/tgo-ui';
4
+ import { MixpanelService, } from '../../../shared/index.mjs';
5
+ import { LibCodingTestService } from '../lib-coding-test.service';
6
+ import { BehaviorSubject, Subject, filter, of, takeUntil, throwError, } from 'rxjs';
7
+ import { catchError, map, switchMap, take, tap } from 'rxjs/operators';
8
+ import { TIMEOUT_SIGNAL, } from '../../models/coderunner-execution-results';
9
+ import { ROOT_TRANSLATIONS_SCOPE } from '../../models/translations';
10
+ import { CoderunnerApiService } from './coderunner-api.service';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "./coderunner-api.service";
13
+ import * as i2 from "../lib-coding-test.service";
14
+ import * as i3 from "../../../shared/index.mjs";
15
+ import * as i4 from "@testgorilla/tgo-ui";
16
+ export class CodingTestService {
17
+ coderunnerApiService;
18
+ libCodingTestService;
19
+ mixpanel;
20
+ snackBar;
21
+ dialog;
22
+ translationContext = `${ROOT_TRANSLATIONS_SCOPE}.CODING_LIB.`;
23
+ codingTestResults = {
24
+ listResponse: [],
25
+ resume: {
26
+ ok: 0,
27
+ error: 0,
28
+ total: 0,
29
+ },
30
+ };
31
+ currentLanguage;
32
+ codingTestResutsSubj$ = new BehaviorSubject(this.codingTestResults);
33
+ codingTestResults$ = this.codingTestResutsSubj$.asObservable();
34
+ isTestResultsLoading = signal(false);
35
+ unsubscribe$ = new Subject();
36
+ sqlTestCases;
37
+ isSQLTest = false;
38
+ constructor(coderunnerApiService, libCodingTestService, mixpanel, snackBar, dialog) {
39
+ this.coderunnerApiService = coderunnerApiService;
40
+ this.libCodingTestService = libCodingTestService;
41
+ this.mixpanel = mixpanel;
42
+ this.snackBar = snackBar;
43
+ this.dialog = dialog;
44
+ }
45
+ getBaseExampleTestCase = (id, index) => ({
46
+ id: id ?? 0,
47
+ name: `Example ${index + 1}`,
48
+ preloaded: true,
49
+ });
50
+ transformToExampleLATtestCase = (testcase, index) => ({
51
+ ...this.getBaseExampleTestCase(testcase.id, index),
52
+ expectedOutput: testcase.solution ?? '',
53
+ input: testcase.input,
54
+ });
55
+ transformToExampleSQLTestCase = (testcase, index) => ({
56
+ ...this.getBaseExampleTestCase(testcase.id, index),
57
+ expectedOutput: testcase.result ?? '',
58
+ });
59
+ setSqlTestCases(sqlTestCases) {
60
+ this.sqlTestCases = sqlTestCases;
61
+ }
62
+ getSqlTestCases() {
63
+ return this.sqlTestCases;
64
+ }
65
+ handleResetCodeModal(applicationTheme, companyColor) {
66
+ const modalTranslationContext = `${ROOT_TRANSLATIONS_SCOPE}.MODALS.RESET_CODE.`;
67
+ const modalData = {
68
+ confirmButtonText: translate(`${modalTranslationContext}SUBMIT`),
69
+ title: translate(`${modalTranslationContext}TITLE`),
70
+ message: translate(`${modalTranslationContext}MESSAGE`),
71
+ color: companyColor,
72
+ };
73
+ const dialogRef = this.dialog.open(ConfirmDialogComponent, {
74
+ applicationTheme,
75
+ size: 'small',
76
+ extraData: modalData,
77
+ });
78
+ dialogRef
79
+ .afterClosed()
80
+ .pipe(filter(Boolean), take(1))
81
+ .subscribe(() => {
82
+ this.libCodingTestService.confirmReset();
83
+ });
84
+ }
85
+ listenDeleteCustomTestCases() {
86
+ return this.libCodingTestService.testCaseDeletion$.pipe(filter(({ action }) => action === "try" /* TestCaseDeletionAction.Try */));
87
+ }
88
+ handleDeleteTestCaseModal(index, applicationTheme, companyColor) {
89
+ const deleteTestCaseTranslationContext = `${ROOT_TRANSLATIONS_SCOPE}.MODALS.DELETE_TEST_CASE.`;
90
+ const modalData = {
91
+ title: translate(`${deleteTestCaseTranslationContext}TITLE`),
92
+ message: translate(`${deleteTestCaseTranslationContext}MESSAGE`),
93
+ confirmButtonText: translate(`${deleteTestCaseTranslationContext}SUBMIT`),
94
+ color: companyColor,
95
+ };
96
+ const dialogRef = this.dialog.open(ConfirmDialogComponent, {
97
+ applicationTheme,
98
+ size: 'small',
99
+ extraData: modalData,
100
+ });
101
+ dialogRef
102
+ .afterClosed()
103
+ .pipe(filter(Boolean), take(1))
104
+ .subscribe(() => {
105
+ this.libCodingTestService.confirmTestCaseDeletion(index);
106
+ });
107
+ }
108
+ handleLanguageChangeModal(questionResultId, selectedLanguage, applicationTheme = 'light', companyColor) {
109
+ const modalLangChangeTranslationContext = `${ROOT_TRANSLATIONS_SCOPE}.MODALS.LANGUAGE_CHANGE.`;
110
+ const modalData = {
111
+ confirmButtonText: translate(`${modalLangChangeTranslationContext}SUBMIT`),
112
+ title: translate(`${modalLangChangeTranslationContext}TITLE`),
113
+ message: translate(`${modalLangChangeTranslationContext}MESSAGE`),
114
+ ...(companyColor && { color: companyColor }),
115
+ };
116
+ const dialogRef = this.dialog.open(ConfirmDialogComponent, {
117
+ applicationTheme,
118
+ size: 'small',
119
+ extraData: modalData,
120
+ });
121
+ dialogRef
122
+ .afterClosed()
123
+ .pipe(take(1))
124
+ .subscribe((result) => {
125
+ if (result) {
126
+ this.libCodingTestService.confirmLanguageChange();
127
+ if (selectedLanguage) {
128
+ this.setCurrentLanguageLAT(selectedLanguage);
129
+ this.sendLanguageChangeEvent$(questionResultId);
130
+ }
131
+ }
132
+ else {
133
+ this.libCodingTestService.cancelLanguageChange();
134
+ }
135
+ });
136
+ }
137
+ setCurrentLanguageLAT(language) {
138
+ this.currentLanguage = language;
139
+ }
140
+ listenCodingTestChanges() {
141
+ return this.libCodingTestService.codeReset$.pipe(filter((val) => val === "try" /* ResetCodeAction.Try */));
142
+ }
143
+ runTest(resultId, code, isLAT = true, isSQL = false,
144
+ // todo: remove from everywhere or comment temporarily?
145
+ publicPreview = false, preview = false, id = 0, testResultId = 0, testData) {
146
+ this.preRunTests();
147
+ if (isSQL) {
148
+ this.getSQLrequest(resultId, testResultId, code, id, publicPreview, preview);
149
+ }
150
+ else if (isLAT) {
151
+ const testCases = this.libCodingTestService.getValidTestCases();
152
+ const testCasesFormatted = testCases.map((testCase) => ({
153
+ input: testCase.input,
154
+ solution: testCase.expectedOutput,
155
+ }));
156
+ this.libCodingTestService.currentLanguage$
157
+ .pipe(take(1))
158
+ .subscribe((language) => {
159
+ const runReq$ = this.getLATrequest(id, resultId, testResultId, code, testCasesFormatted, language, publicPreview, preview);
160
+ this.runLAT(runReq$, publicPreview, preview, testData || {}, testCases, code, resultId);
161
+ });
162
+ }
163
+ }
164
+ sendCopypasteEvent$(code, copiedText, questionResultId) {
165
+ const event = this.getBaseEvent({
166
+ code,
167
+ event_type: 'COPYPASTE',
168
+ extra_payload: copiedText,
169
+ question_result_id: questionResultId,
170
+ });
171
+ return this.coderunnerApiService.sendCodeEvent$(event);
172
+ }
173
+ sendAutosaveEvent$(code, questionResultId) {
174
+ const event = this.getBaseEvent({
175
+ code,
176
+ event_type: 'AUTOSAVE',
177
+ question_result_id: questionResultId,
178
+ });
179
+ return this.coderunnerApiService
180
+ .sendCodeEvent$(event)
181
+ .pipe(catchError((err) => of(err)));
182
+ }
183
+ sendLanguageChangeEvent$(questionResultId) {
184
+ const event = this.getBaseEvent({
185
+ event_type: 'SWITCH',
186
+ question_result_id: questionResultId,
187
+ });
188
+ this.coderunnerApiService.sendCodeEvent$(event).pipe(take(1)).subscribe();
189
+ }
190
+ getBaseEvent(event) {
191
+ let language = '';
192
+ if (this.isSQLTest) {
193
+ language = "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */;
194
+ }
195
+ else {
196
+ const { name, version } = this.currentLanguage;
197
+ language = `${name}-${version}`;
198
+ }
199
+ const baseEvent = {
200
+ code: '',
201
+ extra_payload: '',
202
+ attempt_id: null,
203
+ language,
204
+ };
205
+ return { ...baseEvent, ...event };
206
+ }
207
+ sendCodeEvent$(attemptId, questionResultId, code) {
208
+ const event = this.getBaseEvent({
209
+ code,
210
+ attempt_id: attemptId,
211
+ event_type: 'ATTEMPT',
212
+ question_result_id: questionResultId,
213
+ });
214
+ return this.coderunnerApiService.sendCodeEvent$(event);
215
+ }
216
+ countTestResults(executions) {
217
+ if (executions) {
218
+ return executions.reduce((acc, response) => {
219
+ if (response.evaluation.testcase) {
220
+ acc.passed++;
221
+ }
222
+ else {
223
+ acc.error++;
224
+ }
225
+ acc.total++;
226
+ return acc;
227
+ }, { passed: 0, error: 0, total: 0 });
228
+ }
229
+ return { passed: 0, error: 0, total: 0 };
230
+ }
231
+ handleTestCasesResult(testCasesResultObject) {
232
+ this.codingTestResults = testCasesResultObject;
233
+ this.publishTestResults();
234
+ this.isTestResultsLoading.set(false);
235
+ }
236
+ getSQLrequest(resultId, testResultId, code, id, publicPreview, preview) {
237
+ const testCases = this.getSqlTestCases();
238
+ let runReq$;
239
+ if (publicPreview) {
240
+ runReq$ = this.coderunnerApiService.runPublicTest$(code, testCases, "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */);
241
+ }
242
+ else if (preview) {
243
+ runReq$ = this.coderunnerApiService.runPreviewTest$(testResultId, code, testCases, "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */);
244
+ }
245
+ else {
246
+ runReq$ = this.coderunnerApiService.runNonPreviewTest$(id, resultId, code, testCases, "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */);
247
+ }
248
+ this.runSql(runReq$, testCases, resultId, !publicPreview && !preview, code);
249
+ }
250
+ runSql(runReq$, testCases, questionResultId, isActualQuestion, code) {
251
+ let attemptId = '';
252
+ runReq$
253
+ .pipe(catchError((err) => {
254
+ this.finalizeReq(err);
255
+ return throwError(() => err);
256
+ }), tap((res) => this.finalizeReq(res)), tap(({ id }) => (attemptId = id ?? '')), switchMap((responseArray) => of(responseArray.executions).pipe(map((executions) => this.countTestResults(executions)), map((countResult) => {
257
+ const sqlExecutedSuccessfullyCopy = translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.SQL_EXECUTED_SUCCESSFULLY`);
258
+ const noOutputCopies = this.getNoOutputCopies();
259
+ return {
260
+ resume: {
261
+ ok: countResult.passed,
262
+ error: countResult.error,
263
+ total: countResult.total,
264
+ },
265
+ listResponse: responseArray.executions?.map(({ run, evaluation }) => ({
266
+ actualOutput: run.stdout
267
+ ? run.stdout
268
+ : run.stderr || run.signal === TIMEOUT_SIGNAL
269
+ ? noOutputCopies['noResponse']
270
+ : noOutputCopies['noOutput'],
271
+ logs: this.getCoderunnerLogs(run, TIMEOUT_SIGNAL, noOutputCopies['timeoutError'], sqlExecutedSuccessfullyCopy),
272
+ status: evaluation.testcase ? 'passed' : 'error',
273
+ })),
274
+ };
275
+ }), tap((testCasesResultObject) => this.handleTestCasesResult(testCasesResultObject)))), switchMap(() => this.getSendCodeEventStream$(isActualQuestion, attemptId, questionResultId, code)))
276
+ .subscribe();
277
+ }
278
+ getLATrequest(id, resultId, testResultId, code, testCasesFormatted, language, publicPreview, preview) {
279
+ if (publicPreview) {
280
+ return this.coderunnerApiService.runPublicTest$(code, testCasesFormatted, `${language}-${this.libCodingTestService.getVersion()}`);
281
+ }
282
+ else if (preview) {
283
+ return this.coderunnerApiService.runPreviewTest$(testResultId, code, testCasesFormatted, `${language}-${this.libCodingTestService.getVersion()}`);
284
+ }
285
+ else {
286
+ return this.coderunnerApiService.runNonPreviewTest$(id, resultId, code, testCasesFormatted, `${language}-${this.libCodingTestService.getVersion()}`);
287
+ }
288
+ }
289
+ setIsSQLTest(isSQL) {
290
+ this.isSQLTest = isSQL;
291
+ }
292
+ runLAT(runCodeRequest$, isPublicPreviewLAT, isPractice = false, testData, testCases, code, questionResultId) {
293
+ const pistonRegex = /\/piston\/[^/ ]+(\/[^/ ]+)*/g;
294
+ const reqStartTime = performance.now();
295
+ let reqEndTime;
296
+ let attemptId = '';
297
+ runCodeRequest$
298
+ .pipe(catchError((err) => {
299
+ this.finalizeReq(err);
300
+ return throwError(() => err);
301
+ }), tap((res) => this.finalizeReq(res)), tap(() => (reqEndTime = performance.now())), tap(({ id }) => (attemptId = id ?? '')), switchMap((responseArray) => of(responseArray.executions).pipe(map((executions) => (executions ? executions : [])), map((executions) => executions.map((x) => {
302
+ if (x.run.stderr) {
303
+ x.run.stderr = x.run.stderr.replace(pistonRegex, '');
304
+ }
305
+ if (x.run.stdout) {
306
+ x.run.stdout = x.run.stdout.replace(pistonRegex, '');
307
+ }
308
+ return x;
309
+ })), map((executions) => this.countTestResults(executions)), map((countResult) => {
310
+ if (!isPublicPreviewLAT) {
311
+ const responseTime = Math.round(reqEndTime - reqStartTime);
312
+ this.trackTestcasesRun(testData, countResult, responseArray.executions || [], responseTime, testCases);
313
+ }
314
+ const noOutputCopies = this.getNoOutputCopies();
315
+ const executedSuccessfullyCopy = translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.EXECUTED_SUCCESSFULLY`);
316
+ return {
317
+ resume: {
318
+ ok: countResult.passed,
319
+ error: countResult.error,
320
+ total: countResult.total,
321
+ },
322
+ listResponse: responseArray.executions?.map(({ run, evaluation, compile, }) => ({
323
+ actualOutput: run.stdout
324
+ ? run.stdout
325
+ : run.stderr || run.signal === TIMEOUT_SIGNAL
326
+ ? noOutputCopies['noResponse']
327
+ : noOutputCopies['noOutput'],
328
+ logs: this.getCoderunnerLogs(run, TIMEOUT_SIGNAL, noOutputCopies['timeoutError'], executedSuccessfullyCopy, compile),
329
+ status: evaluation.testcase ? 'passed' : 'error',
330
+ })),
331
+ };
332
+ }), tap((testCasesResultObject) => this.handleTestCasesResult(testCasesResultObject)))), switchMap(() => this.getSendCodeEventStream$(!isPractice && !isPublicPreviewLAT, attemptId, questionResultId, code)))
333
+ .subscribe();
334
+ }
335
+ finalizeReq(err) {
336
+ this.isTestResultsLoading.set(false);
337
+ if (err.detail) {
338
+ this.snackBar.error(err.detail);
339
+ }
340
+ }
341
+ getNoOutputCopies() {
342
+ return {
343
+ noResponse: translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.NO_RESPONSE`),
344
+ noOutput: translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.NONE`),
345
+ timeoutError: translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.TIMEOUT_ERROR`),
346
+ };
347
+ }
348
+ getSendCodeEventStream$(isActualQuestion, attemptId, questionResultId, code) {
349
+ if (isActualQuestion) {
350
+ return this.sendCodeEvent$(attemptId, questionResultId, code);
351
+ }
352
+ else {
353
+ return of({});
354
+ }
355
+ }
356
+ // todo: check if we need this anymore due to MFE providers specificity
357
+ unsubscribeAll() {
358
+ this.unsubscribe$.next();
359
+ this.unsubscribe$.complete();
360
+ }
361
+ resetRunTestSummary() {
362
+ this.codingTestResults = {
363
+ listResponse: [],
364
+ resume: {
365
+ ok: 0,
366
+ error: 0,
367
+ total: 0,
368
+ },
369
+ };
370
+ this.publishTestResults();
371
+ }
372
+ trackConfigChanged(isPracticeQuestion = false) {
373
+ this.libCodingTestService.configFieldChanged$
374
+ .pipe(takeUntil(this.unsubscribe$))
375
+ .subscribe((config) => {
376
+ const { settingInstance, changedKey, newValueString } = this.getMixpanelSettingsData(isPracticeQuestion, config);
377
+ this.mixpanel.track("Changed Coderunner setting" /* MixpanelEvents.ChangedSettings */, {
378
+ coderunner_setting: changedKey,
379
+ coderunner_setting_new_value: newValueString,
380
+ coderunner_setting_instance: settingInstance,
381
+ });
382
+ });
383
+ }
384
+ getCoderunnerLogs(run, TIMEOUT_SIGNAL, timeoutErrorCopy, executedSuccessfullyCopy, compile, isSQL) {
385
+ if (isSQL) {
386
+ return run?.stderr === TIMEOUT_SIGNAL
387
+ ? run.stderr
388
+ : executedSuccessfullyCopy;
389
+ }
390
+ else if (run?.stderr) {
391
+ return run.stderr === compile?.stderr
392
+ ? run.stderr
393
+ : `${run.stderr}\n${compile?.stderr || ''}`;
394
+ }
395
+ else if (run.signal === TIMEOUT_SIGNAL) {
396
+ return timeoutErrorCopy;
397
+ }
398
+ return executedSuccessfullyCopy;
399
+ }
400
+ trackTestcasesRun(testData, countResult, testCasesExecutions, responseTime, testCases) {
401
+ const { instance, customPassed, customFailed, examplePassed, exampleFailed, customEmpty, testUuid, testName, } = this.getMixpanelTestCasesData(testData, countResult, testCasesExecutions, testCases);
402
+ this.mixpanel.track('Candidate ran tests in Coderunner', {
403
+ coding_test_uuid: testUuid,
404
+ coding_test_name: testName,
405
+ coderunner_test_instance: instance,
406
+ custom_testcases_passed: customPassed,
407
+ custom_testcases_failed: customFailed,
408
+ custom_testcases_empty: customEmpty,
409
+ example_testcases_passed: examplePassed,
410
+ example_testcases_failed: exampleFailed,
411
+ coderunner_response_time: responseTime,
412
+ });
413
+ }
414
+ preRunTests() {
415
+ this.isTestResultsLoading.set(true);
416
+ this.resetRunTestSummary();
417
+ }
418
+ getMixpanelTestCasesData(testData, { total }, testCasesExecutions, validTestCases) {
419
+ const allTestCasesCount = this.libCodingTestService.getTestCasesCount();
420
+ const customEmpty = allTestCasesCount - total || 0;
421
+ const instance = this.getMixpanelInstanceValue(!!testData.is_preview_mode);
422
+ const { uuid: testUuid } = testData;
423
+ const { name: testName } = testData.test ?? { name: '' };
424
+ const mixpanelResults = this.getGroupedTestCaseResult(testCasesExecutions, validTestCases);
425
+ return {
426
+ testUuid: testUuid?.replace(/-/g, ''),
427
+ testName,
428
+ instance,
429
+ customEmpty,
430
+ customPassed: mixpanelResults.custom.passed,
431
+ customFailed: mixpanelResults.custom.failed,
432
+ examplePassed: mixpanelResults.example.passed,
433
+ exampleFailed: mixpanelResults.example.failed,
434
+ };
435
+ }
436
+ getGroupedTestCaseResult(testCasesExecutions, validTestCases) {
437
+ const groupedResult = {
438
+ custom: {
439
+ failed: 0,
440
+ passed: 0,
441
+ },
442
+ example: {
443
+ failed: 0,
444
+ passed: 0,
445
+ },
446
+ };
447
+ testCasesExecutions.forEach(({ input: resultInput, evaluation }) => {
448
+ const localTestCase = validTestCases.find(({ input }) => resultInput === input);
449
+ const mixpanelResultBody = localTestCase?.preloaded
450
+ ? groupedResult.example
451
+ : groupedResult.custom;
452
+ if (evaluation?.testcase) {
453
+ mixpanelResultBody.passed++;
454
+ }
455
+ else {
456
+ mixpanelResultBody.failed++;
457
+ }
458
+ });
459
+ return groupedResult;
460
+ }
461
+ getMixpanelSettingsData(isPracticeQuestion, config) {
462
+ const settingInstance = this.getMixpanelInstanceValue(isPracticeQuestion);
463
+ const changedKey = Object.keys(config)[0];
464
+ const THEME_IDENTIFIER = 'theme-';
465
+ let changedValue = config[changedKey];
466
+ let newValueString;
467
+ if (typeof changedValue === 'boolean') {
468
+ newValueString = changedValue ? 'ON' : 'OFF';
469
+ }
470
+ else {
471
+ changedValue = String(changedValue);
472
+ newValueString = changedValue.includes(THEME_IDENTIFIER)
473
+ ? changedValue.replace(THEME_IDENTIFIER, '')
474
+ : changedValue;
475
+ }
476
+ return { settingInstance, changedKey, newValueString };
477
+ }
478
+ getMixpanelInstanceValue(isPracticeQuestion) {
479
+ return isPracticeQuestion ? 'practice question' : 'real test';
480
+ }
481
+ publishTestResults() {
482
+ this.codingTestResutsSubj$.next({ ...this.codingTestResults });
483
+ }
484
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodingTestService, deps: [{ token: i1.CoderunnerApiService }, { token: i2.LibCodingTestService }, { token: i3.MixpanelService }, { token: i4.SnackbarService }, { token: i4.DialogService }], target: i0.ɵɵFactoryTarget.Injectable });
485
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodingTestService });
486
+ }
487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodingTestService, decorators: [{
488
+ type: Injectable
489
+ }], ctorParameters: () => [{ type: i1.CoderunnerApiService }, { type: i2.LibCodingTestService }, { type: i3.MixpanelService }, { type: i4.SnackbarService }, { type: i4.DialogService }] });
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kaW5nLXRlc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3Rnby1jb2RpbmctdGVzdC9zcmMvbGliL3NlcnZpY2VzL2NhbmRpZGF0ZS1jb2RpbmctdGVzdC1zZXJ2aWNlcy9jb2RpbmctdGVzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixlQUFlLEdBQ2hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGVBQWUsR0FFaEIsTUFBTSw4QkFBOEIsQ0FBQztBQU90QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW1CLE1BQU0sNEJBQTRCLENBQUM7QUFFbkYsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBQ1AsTUFBTSxFQUNOLEVBQUUsRUFDRixTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RSxPQUFPLEVBS0wsY0FBYyxHQUNmLE1BQU0sMkNBQTJDLENBQUM7QUFZbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQU9oRSxNQUFNLE9BQU8saUJBQWlCO0lBdUJsQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBMUJELGtCQUFrQixHQUFHLEdBQUcsdUJBQXVCLGNBQWMsQ0FBQztJQUUvRCxpQkFBaUIsR0FBNEI7UUFDbkQsWUFBWSxFQUFF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cUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQzt3R0FoeEJVLGlCQUFpQjs0R0FBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdAbmduZWF0L3RyYW5zbG9jbyc7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvblRoZW1lLFxuICBDb25maXJtRGlhbG9nQ29tcG9uZW50LFxuICBEaWFsb2dTZXJ2aWNlLFxuICBTbmFja2JhclNlcnZpY2UsXG59IGZyb20gJ0B0ZXN0Z29yaWxsYS90Z28tdWknO1xuaW1wb3J0IHtcbiAgTWl4cGFuZWxTZXJ2aWNlLFxuICBUZXN0UmVzdWx0UmVhZCxcbn0gZnJvbSAnQHRlc3Rnb3JpbGxhL3Rnby10ZXN0LXNoYXJlZCc7XG5pbXBvcnQge1xuICBDdXN0b21UZXN0Q2FzZSxcbiAgRXhhbXBsZVRlc3RDYXNlLFxuICBUZXN0Q2FzZURlbGV0aW9uQWN0aW9uLFxuICBUZXN0Q2FzZURlbGV0aW9uRGF0YSxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3Rlc3QtY2FzZXMnO1xuaW1wb3J0IHsgTGliQ29kaW5nVGVzdFNlcnZpY2UsIFJlc2V0Q29kZUFjdGlvbiB9IGZyb20gJy4uL2xpYi1jb2RpbmctdGVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvZGVFZGl0b3JMYW5ndWFnZXMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NvZGUtZWRpdG9yL2hlbHBlcnMvY29kZS1lZGl0b3ItaGVscGVyLm1vZGVsJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgZmlsdGVyLFxuICBvZixcbiAgdGFrZVVudGlsLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb2RlRXZlbnQsIENvZGVFdmVudFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvZGUtZXZlbnQnO1xuaW1wb3J0IHtcbiAgQ29kZVJ1bm5lclRlc3RDYXNlRXhlY3V0aW9uT3V0cHV0TW9kZWwsXG4gIENvZGVydW5uZXJBdHRlbXB0TW9kZWwsXG4gIENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsLFxuICBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbCxcbiAgVElNRU9VVF9TSUdOQUwsXG59IGZyb20gJy4uLy4uL21vZGVscy9jb2RlcnVubmVyLWV4ZWN1dGlvbi1yZXN1bHRzJztcbmltcG9ydCB7IE1peHBhbmVsRXZlbnRzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21peHBhbmVsLWV2ZW50cyc7XG5pbXBvcnQge1xuICBQcm9ncmFtbWluZ0xhbmd1YWdlLFxuICBQcm9ncmFtbWluZ0xhbmd1YWdlVmVyc2lvbmVkLFxufSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvZ3JhbW1pbmctbGFuZ3VhZ2UnO1xuaW1wb3J0IHtcbiAgR3JvdXBlZFRlc3RDYXNlc1Jlc3VsdCxcbiAgTEFURm9ybWF0dGVkVGVzdENhc2VzLFxuICBTcWxUZXN0Q2FzZSxcbiAgVGVzdGNhc2UsXG59IGZyb20gJy4uLy4uL21vZGVscy90ZXN0LWNhc2VzJztcbmltcG9ydCB7IFJPT1RfVFJBTlNMQVRJT05TX1NDT1BFIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyBDb2RlcnVubmVyQXBpU2VydmljZSB9IGZyb20gJy4vY29kZXJ1bm5lci1hcGkuc2VydmljZSc7XG5cbmludGVyZmFjZSBDdXN0b21FcnJvciB7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvZGluZ1Rlc3RTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgdHJhbnNsYXRpb25Db250ZXh0ID0gYCR7Uk9PVF9UUkFOU0xBVElPTlNfU0NPUEV9LkNPRElOR19MSUIuYDtcblxuICBwcml2YXRlIGNvZGluZ1Rlc3RSZXN1bHRzOiBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbCA9IHtcbiAgICBsaXN0UmVzcG9uc2U6IFtdLFxuICAgIHJlc3VtZToge1xuICAgICAgb2s6IDAsXG4gICAgICBlcnJvcjogMCxcbiAgICAgIHRvdGFsOiAwLFxuICAgIH0sXG4gIH07XG4gIHByaXZhdGUgY3VycmVudExhbmd1YWdlITogUHJvZ3JhbW1pbmdMYW5ndWFnZTtcbiAgcHJpdmF0ZSBjb2RpbmdUZXN0UmVzdXRzU3ViaiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuY29kaW5nVGVzdFJlc3VsdHMpO1xuICBjb2RpbmdUZXN0UmVzdWx0cyQgPSB0aGlzLmNvZGluZ1Rlc3RSZXN1dHNTdWJqJC5hc09ic2VydmFibGUoKTtcblxuICBpc1Rlc3RSZXN1bHRzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgc3FsVGVzdENhc2VzITogU3FsVGVzdENhc2VbXTtcbiAgcHJpdmF0ZSBpc1NRTFRlc3QgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvZGVydW5uZXJBcGlTZXJ2aWNlOiBDb2RlcnVubmVyQXBpU2VydmljZSxcbiAgICBwcml2YXRlIGxpYkNvZGluZ1Rlc3RTZXJ2aWNlOiBMaWJDb2RpbmdUZXN0U2VydmljZSxcbiAgICBwcml2YXRlIG1peHBhbmVsOiBNaXhwYW5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogU25hY2tiYXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBEaWFsb2dTZXJ2aWNlXG4gICkge31cblxuICBwcml2YXRlIGdldEJhc2VFeGFtcGxlVGVzdENhc2UgPSAoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICBpZDogaWQgPz8gMCxcbiAgICBuYW1lOiBgRXhhbXBsZSAke2luZGV4ICsgMX1gLFxuICAgIHByZWxvYWRlZDogdHJ1ZSxcbiAgfSk7XG5cbiAgdHJhbnNmb3JtVG9FeGFtcGxlTEFUdGVzdENhc2UgPSAoXG4gICAgdGVzdGNhc2U6IFRlc3RjYXNlLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogRXhhbXBsZVRlc3RDYXNlID0+ICh7XG4gICAgLi4udGhpcy5nZXRCYXNlRXhhbXBsZVRlc3RDYXNlKHRlc3RjYXNlLmlkISwgaW5kZXgpLFxuICAgIGV4cGVjdGVkT3V0cHV0OiB0ZXN0Y2FzZS5zb2x1dGlvbiA/PyAnJyxcbiAgICBpbnB1dDogdGVzdGNhc2UuaW5wdXQsXG4gIH0pO1xuXG4gIHRyYW5zZm9ybVRvRXhhbXBsZVNRTFRlc3RDYXNlID0gKFxuICAgIHRlc3RjYXNlOiBTcWxUZXN0Q2FzZSxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IEV4YW1wbGVUZXN0Q2FzZSA9PiAoe1xuICAgIC4uLnRoaXMuZ2V0QmFzZUV4YW1wbGVUZXN0Q2FzZSh0ZXN0Y2FzZS5pZCEsIGluZGV4KSxcbiAgICBleHBlY3RlZE91dHB1dDogdGVzdGNhc2UucmVzdWx0ID8/ICcnLFxuICB9KTtcblxuICBzZXRTcWxUZXN0Q2FzZXMoc3FsVGVzdENhc2VzOiBTcWxUZXN0Q2FzZVtdKSB7XG4gICAgdGhpcy5zcWxUZXN0Q2FzZXMgPSBzcWxUZXN0Q2FzZXM7XG4gIH1cblxuICBnZXRTcWxUZXN0Q2FzZXMoKTogU3FsVGVzdENhc2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3FsVGVzdENhc2VzO1xuICB9XG5cbiAgaGFuZGxlUmVzZXRDb2RlTW9kYWwoYXBwbGljYXRpb25UaGVtZTogQXBwbGljYXRpb25UaGVtZSwgY29tcGFueUNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbFRyYW5zbGF0aW9uQ29udGV4dCA9IGAke1JPT1RfVFJBTlNMQVRJT05TX1NDT1BFfS5NT0RBTFMuUkVTRVRfQ09ERS5gO1xuICAgIGNvbnN0IG1vZGFsRGF0YSA9IHtcbiAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0cmFuc2xhdGUoYCR7bW9kYWxUcmFuc2xhdGlvbkNvbnRleHR9U1VCTUlUYCksXG4gICAgICB0aXRsZTogdHJhbnNsYXRlKGAke21vZGFsVHJhbnNsYXRpb25Db250ZXh0fVRJVExFYCksXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUoYCR7bW9kYWxUcmFuc2xhdGlvbkNvbnRleHR9TUVTU0FHRWApLFxuICAgICAgY29sb3I6IGNvbXBhbnlDb2xvcixcbiAgICB9O1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgYXBwbGljYXRpb25UaGVtZSxcbiAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICBleHRyYURhdGE6IG1vZGFsRGF0YSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZlxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKGZpbHRlcihCb29sZWFuKSwgdGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmNvbmZpcm1SZXNldCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBsaXN0ZW5EZWxldGVDdXN0b21UZXN0Q2FzZXMoKTogT2JzZXJ2YWJsZTxUZXN0Q2FzZURlbGV0aW9uRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLnRlc3RDYXNlRGVsZXRpb24kLnBpcGUoXG4gICAgICBmaWx0ZXIoKHsgYWN0aW9uIH0pID0+IGFjdGlvbiA9PT0gVGVzdENhc2VEZWxldGlvbkFjdGlvbi5UcnkpXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZURlbGV0ZVRlc3RDYXNlTW9kYWwoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBhcHBsaWNhdGlvblRoZW1lOiBBcHBsaWNhdGlvblRoZW1lLFxuICAgIGNvbXBhbnlDb2xvcjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlbGV0ZVRlc3RDYXNlVHJhbnNsYXRpb25Db250ZXh0ID0gYCR7Uk9PVF9UUkFOU0xBVElPTlNfU0NPUEV9Lk1PREFMUy5ERUxFVEVfVEVTVF9DQVNFLmA7XG4gICAgY29uc3QgbW9kYWxEYXRhID0ge1xuICAgICAgdGl0bGU6IHRyYW5zbGF0ZShgJHtkZWxldGVUZXN0Q2FzZVRyYW5zbGF0aW9uQ29udGV4dH1USVRMRWApLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlKGAke2RlbGV0ZVRlc3RDYXNlVHJhbnNsYXRpb25Db250ZXh0fU1FU1NBR0VgKSxcbiAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0cmFuc2xhdGUoYCR7ZGVsZXRlVGVzdENhc2VUcmFuc2xhdGlvbkNvbnRleHR9U1VCTUlUYCksXG4gICAgICBjb2xvcjogY29tcGFueUNvbG9yLFxuICAgIH07XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBhcHBsaWNhdGlvblRoZW1lLFxuICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgIGV4dHJhRGF0YTogbW9kYWxEYXRhLFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoZmlsdGVyKEJvb2xlYW4pLCB0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuY29uZmlybVRlc3RDYXNlRGVsZXRpb24oaW5kZXgpO1xuICAgICAgfSk7XG4gIH1cblxuICBoYW5kbGVMYW5ndWFnZUNoYW5nZU1vZGFsKFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlcixcbiAgICBzZWxlY3RlZExhbmd1YWdlPzogUHJvZ3JhbW1pbmdMYW5ndWFnZSxcbiAgICBhcHBsaWNhdGlvblRoZW1lOiBBcHBsaWNhdGlvblRoZW1lID0gJ2xpZ2h0JyxcbiAgICBjb21wYW55Q29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsTGFuZ0NoYW5nZVRyYW5zbGF0aW9uQ29udGV4dCA9IGAke1JPT1RfVFJBTlNMQVRJT05TX1NDT1BFfS5NT0RBTFMuTEFOR1VBR0VfQ0hBTkdFLmA7XG4gICAgY29uc3QgbW9kYWxEYXRhID0ge1xuICAgICAgY29uZmlybUJ1dHRvblRleHQ6IHRyYW5zbGF0ZShcbiAgICAgICAgYCR7bW9kYWxMYW5nQ2hhbmdlVHJhbnNsYXRpb25Db250ZXh0fVNVQk1JVGBcbiAgICAgICksXG4gICAgICB0aXRsZTogdHJhbnNsYXRlKGAke21vZGFsTGFuZ0NoYW5nZVRyYW5zbGF0aW9uQ29udGV4dH1USVRMRWApLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlKGAke21vZGFsTGFuZ0NoYW5nZVRyYW5zbGF0aW9uQ29udGV4dH1NRVNTQUdFYCksXG4gICAgICAuLi4oY29tcGFueUNvbG9yICYmIHsgY29sb3I6IGNvbXBhbnlDb2xvciB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBhcHBsaWNhdGlvblRoZW1lLFxuICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgIGV4dHJhRGF0YTogbW9kYWxEYXRhLFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jb25maXJtTGFuZ3VhZ2VDaGFuZ2UoKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRMYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50TGFuZ3VhZ2VMQVQoc2VsZWN0ZWRMYW5ndWFnZSk7XG4gICAgICAgICAgICB0aGlzLnNlbmRMYW5ndWFnZUNoYW5nZUV2ZW50JChxdWVzdGlvblJlc3VsdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jYW5jZWxMYW5ndWFnZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNldEN1cnJlbnRMYW5ndWFnZUxBVChsYW5ndWFnZTogUHJvZ3JhbW1pbmdMYW5ndWFnZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gIH1cblxuICBsaXN0ZW5Db2RpbmdUZXN0Q2hhbmdlcygpOiBPYnNlcnZhYmxlPFJlc2V0Q29kZUFjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmNvZGVSZXNldCQucGlwZShcbiAgICAgIGZpbHRlcigodmFsKSA9PiB2YWwgPT09IFJlc2V0Q29kZUFjdGlvbi5UcnkpXG4gICAgKTtcbiAgfVxuXG4gIHJ1blRlc3QoXG4gICAgcmVzdWx0SWQ6IG51bWJlcixcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgaXNMQVQgPSB0cnVlLFxuICAgIGlzU1FMID0gZmFsc2UsXG4gICAgLy8gdG9kbzogcmVtb3ZlIGZyb20gZXZlcnl3aGVyZSBvciBjb21tZW50IHRlbXBvcmFyaWx5P1xuICAgIHB1YmxpY1ByZXZpZXcgPSBmYWxzZSxcbiAgICBwcmV2aWV3ID0gZmFsc2UsXG4gICAgaWQgPSAwLFxuICAgIHRlc3RSZXN1bHRJZCA9IDAsXG4gICAgdGVzdERhdGE/OiBUZXN0UmVzdWx0UmVhZFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnByZVJ1blRlc3RzKCk7XG4gICAgaWYgKGlzU1FMKSB7XG4gICAgICB0aGlzLmdldFNRTHJlcXVlc3QoXG4gICAgICAgIHJlc3VsdElkLFxuICAgICAgICB0ZXN0UmVzdWx0SWQsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGlkLFxuICAgICAgICBwdWJsaWNQcmV2aWV3LFxuICAgICAgICBwcmV2aWV3XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNMQVQpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlczogKEV4YW1wbGVUZXN0Q2FzZSB8IEN1c3RvbVRlc3RDYXNlKVtdID1cbiAgICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5nZXRWYWxpZFRlc3RDYXNlcygpO1xuICAgICAgY29uc3QgdGVzdENhc2VzRm9ybWF0dGVkID0gdGVzdENhc2VzLm1hcCgodGVzdENhc2UpID0+ICh7XG4gICAgICAgIGlucHV0OiB0ZXN0Q2FzZS5pbnB1dCxcbiAgICAgICAgc29sdXRpb246IHRlc3RDYXNlLmV4cGVjdGVkT3V0cHV0LFxuICAgICAgfSkpIGFzIExBVEZvcm1hdHRlZFRlc3RDYXNlc1tdO1xuICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jdXJyZW50TGFuZ3VhZ2UkXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGxhbmd1YWdlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuUmVxJCA9IHRoaXMuZ2V0TEFUcmVxdWVzdChcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgcmVzdWx0SWQsXG4gICAgICAgICAgICB0ZXN0UmVzdWx0SWQsXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgdGVzdENhc2VzRm9ybWF0dGVkIGFzIExBVEZvcm1hdHRlZFRlc3RDYXNlc1tdLFxuICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICBwdWJsaWNQcmV2aWV3LFxuICAgICAgICAgICAgcHJldmlld1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5ydW5MQVQoXG4gICAgICAgICAgICBydW5SZXEkLFxuICAgICAgICAgICAgcHVibGljUHJldmlldyxcbiAgICAgICAgICAgIHByZXZpZXcsXG4gICAgICAgICAgICB0ZXN0RGF0YSB8fCAoe30gYXMgVGVzdFJlc3VsdFJlYWQpLFxuICAgICAgICAgICAgdGVzdENhc2VzLFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHJlc3VsdElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2VuZENvcHlwYXN0ZUV2ZW50JChcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgY29waWVkVGV4dDogc3RyaW5nLFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPENvZGVFdmVudFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZXZlbnQ6IENvZGVFdmVudCA9IHRoaXMuZ2V0QmFzZUV2ZW50KHtcbiAgICAgIGNvZGUsXG4gICAgICBldmVudF90eXBlOiAnQ09QWVBBU1RFJyxcbiAgICAgIGV4dHJhX3BheWxvYWQ6IGNvcGllZFRleHQsXG4gICAgICBxdWVzdGlvbl9yZXN1bHRfaWQ6IHF1ZXN0aW9uUmVzdWx0SWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb2RlcnVubmVyQXBpU2VydmljZS5zZW5kQ29kZUV2ZW50JChldmVudCk7XG4gIH1cblxuICBzZW5kQXV0b3NhdmVFdmVudCQoXG4gICAgY29kZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPENvZGVFdmVudFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZXZlbnQ6IENvZGVFdmVudCA9IHRoaXMuZ2V0QmFzZUV2ZW50KHtcbiAgICAgIGNvZGUsXG4gICAgICBldmVudF90eXBlOiAnQVVUT1NBVkUnLFxuICAgICAgcXVlc3Rpb25fcmVzdWx0X2lkOiBxdWVzdGlvblJlc3VsdElkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2VcbiAgICAgIC5zZW5kQ29kZUV2ZW50JChldmVudClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycikgPT4gb2YoZXJyKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kTGFuZ3VhZ2VDaGFuZ2VFdmVudCQocXVlc3Rpb25SZXN1bHRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQ6IENvZGVFdmVudCA9IHRoaXMuZ2V0QmFzZUV2ZW50KHtcbiAgICAgIGV2ZW50X3R5cGU6ICdTV0lUQ0gnLFxuICAgICAgcXVlc3Rpb25fcmVzdWx0X2lkOiBxdWVzdGlvblJlc3VsdElkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb2RlcnVubmVyQXBpU2VydmljZS5zZW5kQ29kZUV2ZW50JChldmVudCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmFzZUV2ZW50KGV2ZW50OiBQYXJ0aWFsPENvZGVFdmVudD4pOiBDb2RlRXZlbnQge1xuICAgIGxldCBsYW5ndWFnZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuaXNTUUxUZXN0KSB7XG4gICAgICBsYW5ndWFnZSA9IFByb2dyYW1taW5nTGFuZ3VhZ2VWZXJzaW9uZWQuU1FMaXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHRoaXMuY3VycmVudExhbmd1YWdlO1xuICAgICAgbGFuZ3VhZ2UgPSBgJHtuYW1lfS0ke3ZlcnNpb259YDtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlRXZlbnQ6IFBhcnRpYWw8Q29kZUV2ZW50PiA9IHtcbiAgICAgIGNvZGU6ICcnLFxuICAgICAgZXh0cmFfcGF5bG9hZDogJycsXG4gICAgICBhdHRlbXB0X2lkOiBudWxsLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgfTtcblxuICAgIHJldHVybiB7IC4uLmJhc2VFdmVudCwgLi4uZXZlbnQgfSBhcyBDb2RlRXZlbnQ7XG4gIH1cblxuICBwcml2YXRlIHNlbmRDb2RlRXZlbnQkKFxuICAgIGF0dGVtcHRJZDogc3RyaW5nLFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlcixcbiAgICBjb2RlOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxDb2RlRXZlbnRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGV2ZW50OiBDb2RlRXZlbnQgPSB0aGlzLmdldEJhc2VFdmVudCh7XG4gICAgICBjb2RlLFxuICAgICAgYXR0ZW1wdF9pZDogYXR0ZW1wdElkLFxuICAgICAgZXZlbnRfdHlwZTogJ0FUVEVNUFQnLFxuICAgICAgcXVlc3Rpb25fcmVzdWx0X2lkOiBxdWVzdGlvblJlc3VsdElkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2Uuc2VuZENvZGVFdmVudCQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudFRlc3RSZXN1bHRzKFxuICAgIGV4ZWN1dGlvbnM6IENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsW10gfCB1bmRlZmluZWRcbiAgKToge1xuICAgIHBhc3NlZDogbnVtYmVyO1xuICAgIGVycm9yOiBudW1iZXI7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKGV4ZWN1dGlvbnMpIHtcbiAgICAgIHJldHVybiBleGVjdXRpb25zLnJlZHVjZShcbiAgICAgICAgKGFjYywgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuZXZhbHVhdGlvbi50ZXN0Y2FzZSkge1xuICAgICAgICAgICAgYWNjLnBhc3NlZCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MuZXJyb3IrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgYWNjLnRvdGFsKys7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBwYXNzZWQ6IDAsIGVycm9yOiAwLCB0b3RhbDogMCB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geyBwYXNzZWQ6IDAsIGVycm9yOiAwLCB0b3RhbDogMCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXN0Q2FzZXNSZXN1bHQoXG4gICAgdGVzdENhc2VzUmVzdWx0T2JqZWN0OiBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmNvZGluZ1Rlc3RSZXN1bHRzID0gdGVzdENhc2VzUmVzdWx0T2JqZWN0O1xuICAgIHRoaXMucHVibGlzaFRlc3RSZXN1bHRzKCk7XG4gICAgdGhpcy5pc1Rlc3RSZXN1bHRzTG9hZGluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTUUxyZXF1ZXN0KFxuICAgIHJlc3VsdElkOiBudW1iZXIsXG4gICAgdGVzdFJlc3VsdElkOiBudW1iZXIsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIGlkOiBudW1iZXIsXG4gICAgcHVibGljUHJldmlldzogYm9vbGVhbixcbiAgICBwcmV2aWV3OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRlc3RDYXNlczogU3FsVGVzdENhc2VbXSA9IHRoaXMuZ2V0U3FsVGVzdENhc2VzKCk7XG4gICAgbGV0IHJ1blJlcSQ6IE9ic2VydmFibGU8Q29kZXJ1bm5lckF0dGVtcHRNb2RlbD47XG4gICAgaWYgKHB1YmxpY1ByZXZpZXcpIHtcbiAgICAgIHJ1blJlcSQgPSB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1blB1YmxpY1Rlc3QkKFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXMsXG4gICAgICAgIFByb2dyYW1taW5nTGFuZ3VhZ2VWZXJzaW9uZWQuU1FMaXRlXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocHJldmlldykge1xuICAgICAgcnVuUmVxJCA9IHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2UucnVuUHJldmlld1Rlc3QkKFxuICAgICAgICB0ZXN0UmVzdWx0SWQsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHRlc3RDYXNlcyxcbiAgICAgICAgUHJvZ3JhbW1pbmdMYW5ndWFnZVZlcnNpb25lZC5TUUxpdGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1blJlcSQgPSB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1bk5vblByZXZpZXdUZXN0JChcbiAgICAgICAgaWQsXG4gICAgICAgIHJlc3VsdElkLFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXMsXG4gICAgICAgIFByb2dyYW1taW5nTGFuZ3VhZ2VWZXJzaW9uZWQuU1FMaXRlXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJ1blNxbChydW5SZXEkLCB0ZXN0Q2FzZXMsIHJlc3VsdElkLCAhcHVibGljUHJldmlldyAmJiAhcHJldmlldywgY29kZSk7XG4gIH1cblxuICBwcml2YXRlIHJ1blNxbChcbiAgICBydW5SZXEkOiBPYnNlcnZhYmxlPENvZGVydW5uZXJBdHRlbXB0TW9kZWw+LFxuICAgIHRlc3RDYXNlczogU3FsVGVzdENhc2VbXSxcbiAgICBxdWVzdGlvblJlc3VsdElkOiBudW1iZXIsXG4gICAgaXNBY3R1YWxRdWVzdGlvbjogYm9vbGVhbixcbiAgICBjb2RlOiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGF0dGVtcHRJZCA9ICcnO1xuXG4gICAgcnVuUmVxJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZmluYWxpemVSZXEoZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKChyZXMpID0+IHRoaXMuZmluYWxpemVSZXEocmVzIGFzIEN1c3RvbUVycm9yKSksXG4gICAgICAgIHRhcCgoeyBpZCB9KSA9PiAoYXR0ZW1wdElkID0gaWQgPz8gJycpKSxcbiAgICAgICAgc3dpdGNoTWFwKChyZXNwb25zZUFycmF5OiBDb2RlcnVubmVyQXR0ZW1wdE1vZGVsKSA9PlxuICAgICAgICAgIG9mKHJlc3BvbnNlQXJyYXkuZXhlY3V0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgoZXhlY3V0aW9ucykgPT4gdGhpcy5jb3VudFRlc3RSZXN1bHRzKGV4ZWN1dGlvbnMpKSxcbiAgICAgICAgICAgIG1hcCgoY291bnRSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3FsRXhlY3V0ZWRTdWNjZXNzZnVsbHlDb3B5ID0gdHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLlNRTF9FWEVDVVRFRF9TVUNDRVNTRlVMTFlgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IG5vT3V0cHV0Q29waWVzID0gdGhpcy5nZXROb091dHB1dENvcGllcygpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcmVzdW1lOiB7XG4gICAgICAgICAgICAgICAgICBvazogY291bnRSZXN1bHQucGFzc2VkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGNvdW50UmVzdWx0LmVycm9yLFxuICAgICAgICAgICAgICAgICAgdG90YWw6IGNvdW50UmVzdWx0LnRvdGFsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGlzdFJlc3BvbnNlOiByZXNwb25zZUFycmF5LmV4ZWN1dGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgICh7IHJ1biwgZXZhbHVhdGlvbiB9OiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsT3V0cHV0OiBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgPyBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgOiBydW4uc3RkZXJyIHx8IHJ1bi5zaWduYWwgPT09IFRJTUVPVVRfU0lHTkFMXG4gICAgICAgICAgICAgICAgICAgICAgPyBub091dHB1dENvcGllc1snbm9SZXNwb25zZSddXG4gICAgICAgICAgICAgICAgICAgICAgOiBub091dHB1dENvcGllc1snbm9PdXRwdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgbG9nczogdGhpcy5nZXRDb2RlcnVubmVyTG9ncyhcbiAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9TSUdOQUwsXG4gICAgICAgICAgICAgICAgICAgICAgbm9PdXRwdXRDb3BpZXNbJ3RpbWVvdXRFcnJvciddLFxuICAgICAgICAgICAgICAgICAgICAgIHNxbEV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGV2YWx1YXRpb24udGVzdGNhc2UgPyAncGFzc2VkJyA6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0gYXMgQ29kaW5nVGVzdHNSZXN1bHRzTW9kZWw7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgodGVzdENhc2VzUmVzdWx0T2JqZWN0KSA9PlxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRlc3RDYXNlc1Jlc3VsdCh0ZXN0Q2FzZXNSZXN1bHRPYmplY3QpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICB0aGlzLmdldFNlbmRDb2RlRXZlbnRTdHJlYW0kKFxuICAgICAgICAgICAgaXNBY3R1YWxRdWVzdGlvbixcbiAgICAgICAgICAgIGF0dGVtcHRJZCxcbiAgICAgICAgICAgIHF1ZXN0aW9uUmVzdWx0SWQsXG4gICAgICAgICAgICBjb2RlXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldExBVHJlcXVlc3QoXG4gICAgaWQ6IG51bWJlcixcbiAgICByZXN1bHRJZDogbnVtYmVyLFxuICAgIHRlc3RSZXN1bHRJZDogbnVtYmVyLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICB0ZXN0Q2FzZXNGb3JtYXR0ZWQ6IExBVEZvcm1hdHRlZFRlc3RDYXNlc1tdLFxuICAgIGxhbmd1YWdlOiBDb2RlRWRpdG9yTGFuZ3VhZ2VzLFxuICAgIHB1YmxpY1ByZXZpZXc6IGJvb2xlYW4sXG4gICAgcHJldmlldzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPENvZGVydW5uZXJBdHRlbXB0TW9kZWw+IHtcbiAgICBpZiAocHVibGljUHJldmlldykge1xuICAgICAgcmV0dXJuIHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2UucnVuUHVibGljVGVzdCQoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHRlc3RDYXNlc0Zvcm1hdHRlZCxcbiAgICAgICAgYCR7bGFuZ3VhZ2V9LSR7dGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5nZXRWZXJzaW9uKCl9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHByZXZpZXcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1blByZXZpZXdUZXN0JChcbiAgICAgICAgdGVzdFJlc3VsdElkLFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXNGb3JtYXR0ZWQsXG4gICAgICAgIGAke2xhbmd1YWdlfS0ke3RoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuZ2V0VmVyc2lvbigpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1bk5vblByZXZpZXdUZXN0JChcbiAgICAgICAgaWQsXG4gICAgICAgIHJlc3VsdElkLFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXNGb3JtYXR0ZWQsXG4gICAgICAgIGAke2xhbmd1YWdlfS0ke3RoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuZ2V0VmVyc2lvbigpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0SXNTUUxUZXN0KGlzU1FMOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1NRTFRlc3QgPSBpc1NRTDtcbiAgfVxuXG4gIHByaXZhdGUgcnVuTEFUKFxuICAgIHJ1bkNvZGVSZXF1ZXN0JDogT2JzZXJ2YWJsZTxDb2RlcnVubmVyQXR0ZW1wdE1vZGVsPixcbiAgICBpc1B1YmxpY1ByZXZpZXdMQVQ6IGJvb2xlYW4sXG4gICAgaXNQcmFjdGljZSA9IGZhbHNlLFxuICAgIHRlc3REYXRhOiBUZXN0UmVzdWx0UmVhZCxcbiAgICB0ZXN0Q2FzZXM6IEV4YW1wbGVUZXN0Q2FzZVtdIHwgQ3VzdG9tVGVzdENhc2VbXSxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25SZXN1bHRJZDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBpc3RvblJlZ2V4ID0gL1xcL3Bpc3RvblxcL1teLyBdKyhcXC9bXi8gXSspKi9nO1xuICAgIGNvbnN0IHJlcVN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGxldCByZXFFbmRUaW1lOiBudW1iZXI7XG4gICAgbGV0IGF0dGVtcHRJZCA9ICcnO1xuXG4gICAgcnVuQ29kZVJlcXVlc3QkXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5maW5hbGl6ZVJlcShlcnIpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHJlcykgPT4gdGhpcy5maW5hbGl6ZVJlcShyZXMgYXMgQ3VzdG9tRXJyb3IpKSxcbiAgICAgICAgdGFwKCgpID0+IChyZXFFbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCkpKSxcbiAgICAgICAgdGFwKCh7IGlkIH0pID0+IChhdHRlbXB0SWQgPSBpZCA/PyAnJykpLFxuICAgICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlQXJyYXk6IENvZGVydW5uZXJBdHRlbXB0TW9kZWwpID0+XG4gICAgICAgICAgb2YocmVzcG9uc2VBcnJheS5leGVjdXRpb25zKS5waXBlKFxuICAgICAgICAgICAgbWFwKChleGVjdXRpb25zKSA9PiAoZXhlY3V0aW9ucyA/IGV4ZWN1dGlvbnMgOiBbXSkpLFxuICAgICAgICAgICAgbWFwKChleGVjdXRpb25zOiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbFtdKSA9PlxuICAgICAgICAgICAgICBleGVjdXRpb25zLm1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4LnJ1bi5zdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHgucnVuLnN0ZGVyciA9IHgucnVuLnN0ZGVyci5yZXBsYWNlKHBpc3RvblJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh4LnJ1bi5zdGRvdXQpIHtcbiAgICAgICAgICAgICAgICAgIHgucnVuLnN0ZG91dCA9IHgucnVuLnN0ZG91dC5yZXBsYWNlKHBpc3RvblJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcCgoZXhlY3V0aW9ucykgPT4gdGhpcy5jb3VudFRlc3RSZXN1bHRzKGV4ZWN1dGlvbnMpKSxcbiAgICAgICAgICAgIG1hcCgoY291bnRSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1B1YmxpY1ByZXZpZXdMQVQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVRpbWUgPSBNYXRoLnJvdW5kKHJlcUVuZFRpbWUgLSByZXFTdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhY2tUZXN0Y2FzZXNSdW4oXG4gICAgICAgICAgICAgICAgICB0ZXN0RGF0YSxcbiAgICAgICAgICAgICAgICAgIGNvdW50UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VBcnJheS5leGVjdXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUaW1lLFxuICAgICAgICAgICAgICAgICAgdGVzdENhc2VzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBub091dHB1dENvcGllcyA9IHRoaXMuZ2V0Tm9PdXRwdXRDb3BpZXMoKTtcbiAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWRTdWNjZXNzZnVsbHlDb3B5ID0gdHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLkVYRUNVVEVEX1NVQ0NFU1NGVUxMWWBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlc3VtZToge1xuICAgICAgICAgICAgICAgICAgb2s6IGNvdW50UmVzdWx0LnBhc3NlZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBjb3VudFJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgICAgIHRvdGFsOiBjb3VudFJlc3VsdC50b3RhbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxpc3RSZXNwb25zZTogcmVzcG9uc2VBcnJheS5leGVjdXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGUsXG4gICAgICAgICAgICAgICAgICB9OiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsT3V0cHV0OiBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgPyBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgOiBydW4uc3RkZXJyIHx8IHJ1bi5zaWduYWwgPT09IFRJTUVPVVRfU0lHTkFMXG4gICAgICAgICAgICAgICAgICAgICAgPyBub091dHB1dENvcGllc1snbm9SZXNwb25zZSddXG4gICAgICAgICAgICAgICAgICAgICAgOiBub091dHB1dENvcGllc1snbm9PdXRwdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgbG9nczogdGhpcy5nZXRDb2RlcnVubmVyTG9ncyhcbiAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9TSUdOQUwsXG4gICAgICAgICAgICAgICAgICAgICAgbm9PdXRwdXRDb3BpZXNbJ3RpbWVvdXRFcnJvciddLFxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weSxcbiAgICAgICAgICAgICAgICAgICAgICBjb21waWxlXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogZXZhbHVhdGlvbi50ZXN0Y2FzZSA/ICdwYXNzZWQnIDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSBhcyBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKCh0ZXN0Q2FzZXNSZXN1bHRPYmplY3QpID0+XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGVzdENhc2VzUmVzdWx0KHRlc3RDYXNlc1Jlc3VsdE9iamVjdClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgIHRoaXMuZ2V0U2VuZENvZGVFdmVudFN0cmVhbSQoXG4gICAgICAgICAgICAhaXNQcmFjdGljZSAmJiAhaXNQdWJsaWNQcmV2aWV3TEFULFxuICAgICAgICAgICAgYXR0ZW1wdElkLFxuICAgICAgICAgICAgcXVlc3Rpb25SZXN1bHRJZCxcbiAgICAgICAgICAgIGNvZGVcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluYWxpemVSZXEoZXJyOiBDdXN0b21FcnJvcik6IHZvaWQge1xuICAgIHRoaXMuaXNUZXN0UmVzdWx0c0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICBpZiAoZXJyLmRldGFpbCkge1xuICAgICAgdGhpcy5zbmFja0Jhci5lcnJvcihlcnIuZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5vT3V0cHV0Q29waWVzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBub1Jlc3BvbnNlOiB0cmFuc2xhdGUoXG4gICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLk5PX1JFU1BPTlNFYFxuICAgICAgKSxcbiAgICAgIG5vT3V0cHV0OiB0cmFuc2xhdGUoXG4gICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLk5PTkVgXG4gICAgICApLFxuICAgICAgdGltZW91dEVycm9yOiB0cmFuc2xhdGUoXG4gICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLlRJTUVPVVRfRVJST1JgXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFNlbmRDb2RlRXZlbnRTdHJlYW0kKFxuICAgIGlzQWN0dWFsUXVlc3Rpb246IGJvb2xlYW4sXG4gICAgYXR0ZW1wdElkOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25SZXN1bHRJZDogbnVtYmVyLFxuICAgIGNvZGU6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPENvZGVFdmVudFJlc3BvbnNlPiB7XG4gICAgaWYgKGlzQWN0dWFsUXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRDb2RlRXZlbnQkKGF0dGVtcHRJZCwgcXVlc3Rpb25SZXN1bHRJZCwgY29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih7fSBhcyBDb2RlRXZlbnRSZXNwb25zZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gdG9kbzogY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGFueW1vcmUgZHVlIHRvIE1GRSBwcm92aWRlcnMgc3BlY2lmaWNpdHlcbiAgdW5zdWJzY3JpYmVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICByZXNldFJ1blRlc3RTdW1tYXJ5KCk6IHZvaWQge1xuICAgIHRoaXMuY29kaW5nVGVzdFJlc3VsdHMgPSB7XG4gICAgICBsaXN0UmVzcG9uc2U6IFtdLFxuICAgICAgcmVzdW1lOiB7XG4gICAgICAgIG9rOiAwLFxuICAgICAgICBlcnJvcjogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnB1Ymxpc2hUZXN0UmVzdWx0cygpO1xuICB9XG5cbiAgdHJhY2tDb25maWdDaGFuZ2VkKGlzUHJhY3RpY2VRdWVzdGlvbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jb25maWdGaWVsZENoYW5nZWQkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2V0dGluZ0luc3RhbmNlLCBjaGFuZ2VkS2V5LCBuZXdWYWx1ZVN0cmluZyB9ID1cbiAgICAgICAgICB0aGlzLmdldE1peHBhbmVsU2V0dGluZ3NEYXRhKGlzUHJhY3RpY2VRdWVzdGlvbiwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLm1peHBhbmVsLnRyYWNrKE1peHBhbmVsRXZlbnRzLkNoYW5nZWRTZXR0aW5ncywge1xuICAgICAgICAgIGNvZGVydW5uZXJfc2V0dGluZzogY2hhbmdlZEtleSxcbiAgICAgICAgICBjb2RlcnVubmVyX3NldHRpbmdfbmV3X3ZhbHVlOiBuZXdWYWx1ZVN0cmluZyxcbiAgICAgICAgICBjb2RlcnVubmVyX3NldHRpbmdfaW5zdGFuY2U6IHNldHRpbmdJbnN0YW5jZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29kZXJ1bm5lckxvZ3MoXG4gICAgcnVuOiBDb2RlUnVubmVyVGVzdENhc2VFeGVjdXRpb25PdXRwdXRNb2RlbCxcbiAgICBUSU1FT1VUX1NJR05BTDogc3RyaW5nLFxuICAgIHRpbWVvdXRFcnJvckNvcHk6IHN0cmluZyxcbiAgICBleGVjdXRlZFN1Y2Nlc3NmdWxseUNvcHk6IHN0cmluZyxcbiAgICBjb21waWxlPzogQ29kZVJ1bm5lclRlc3RDYXNlRXhlY3V0aW9uT3V0cHV0TW9kZWwsXG4gICAgaXNTUUw/OiBib29sZWFuXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGlzU1FMKSB7XG4gICAgICByZXR1cm4gcnVuPy5zdGRlcnIgPT09IFRJTUVPVVRfU0lHTkFMXG4gICAgICAgID8gcnVuLnN0ZGVyclxuICAgICAgICA6IGV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weTtcbiAgICB9IGVsc2UgaWYgKHJ1bj8uc3RkZXJyKSB7XG4gICAgICByZXR1cm4gcnVuLnN0ZGVyciA9PT0gY29tcGlsZT8uc3RkZXJyXG4gICAgICAgID8gcnVuLnN0ZGVyclxuICAgICAgICA6IGAke3J1bi5zdGRlcnJ9XFxuJHtjb21waWxlPy5zdGRlcnIgfHwgJyd9YDtcbiAgICB9IGVsc2UgaWYgKHJ1bi5zaWduYWwgPT09IFRJTUVPVVRfU0lHTkFMKSB7XG4gICAgICByZXR1cm4gdGltZW91dEVycm9yQ29weTtcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhY2tUZXN0Y2FzZXNSdW4oXG4gICAgdGVzdERhdGE6IFRlc3RSZXN1bHRSZWFkLFxuICAgIGNvdW50UmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LFxuICAgIHRlc3RDYXNlc0V4ZWN1dGlvbnM6IENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsW10sXG4gICAgcmVzcG9uc2VUaW1lOiBudW1iZXIsXG4gICAgdGVzdENhc2VzOiBFeGFtcGxlVGVzdENhc2VbXSB8IEN1c3RvbVRlc3RDYXNlW11cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgaW5zdGFuY2UsXG4gICAgICBjdXN0b21QYXNzZWQsXG4gICAgICBjdXN0b21GYWlsZWQsXG4gICAgICBleGFtcGxlUGFzc2VkLFxuICAgICAgZXhhbXBsZUZhaWxlZCxcbiAgICAgIGN1c3RvbUVtcHR5LFxuICAgICAgdGVzdFV1aWQsXG4gICAgICB0ZXN0TmFtZSxcbiAgICB9ID0gdGhpcy5nZXRNaXhwYW5lbFRlc3RDYXNlc0RhdGEoXG4gICAgICB0ZXN0RGF0YSxcbiAgICAgIGNvdW50UmVzdWx0LFxuICAgICAgdGVzdENhc2VzRXhlY3V0aW9ucyxcbiAgICAgIHRlc3RDYXNlc1xuICAgICk7XG5cbiAgICB0aGlzLm1peHBhbmVsLnRyYWNrKCdDYW5kaWRhdGUgcmFuIHRlc3RzIGluIENvZGVydW5uZXInLCB7XG4gICAgICBjb2RpbmdfdGVzdF91dWlkOiB0ZXN0VXVpZCxcbiAgICAgIGNvZGluZ190ZXN0X25hbWU6IHRlc3ROYW1lLFxuICAgICAgY29kZXJ1bm5lcl90ZXN0X2luc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgIGN1c3RvbV90ZXN0Y2FzZXNfcGFzc2VkOiBjdXN0b21QYXNzZWQsXG4gICAgICBjdXN0b21fdGVzdGNhc2VzX2ZhaWxlZDogY3VzdG9tRmFpbGVkLFxuICAgICAgY3VzdG9tX3Rlc3RjYXNlc19lbXB0eTogY3VzdG9tRW1wdHksXG4gICAgICBleGFtcGxlX3Rlc3RjYXNlc19wYXNzZWQ6IGV4YW1wbGVQYXNzZWQsXG4gICAgICBleGFtcGxlX3Rlc3RjYXNlc19mYWlsZWQ6IGV4YW1wbGVGYWlsZWQsXG4gICAgICBjb2RlcnVubmVyX3Jlc3BvbnNlX3RpbWU6IHJlc3BvbnNlVGltZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlUnVuVGVzdHMoKSB7XG4gICAgdGhpcy5pc1Rlc3RSZXN1bHRzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZXNldFJ1blRlc3RTdW1tYXJ5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1peHBhbmVsVGVzdENhc2VzRGF0YShcbiAgICB0ZXN0RGF0YTogVGVzdFJlc3VsdFJlYWQsXG4gICAgeyB0b3RhbCB9OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LFxuICAgIHRlc3RDYXNlc0V4ZWN1dGlvbnM6IENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsW10sXG4gICAgdmFsaWRUZXN0Q2FzZXM6IEV4YW1wbGVUZXN0Q2FzZVtdIHwgQ3VzdG9tVGVzdENhc2VbXVxuICApIHtcbiAgICBjb25zdCBhbGxUZXN0Q2FzZXNDb3VudCA9IHRoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuZ2V0VGVzdENhc2VzQ291bnQoKTtcbiAgICBjb25zdCBjdXN0b21FbXB0eSA9IGFsbFRlc3RDYXNlc0NvdW50IC0gdG90YWwgfHwgMDtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0TWl4cGFuZWxJbnN0YW5jZVZhbHVlKCEhdGVzdERhdGEuaXNfcHJldmlld19tb2RlKTtcbiAgICBjb25zdCB7IHV1aWQ6IHRlc3RVdWlkIH0gPSB0ZXN0RGF0YTtcbiAgICBjb25zdCB7IG5hbWU6IHRlc3ROYW1lIH0gPSB0ZXN0RGF0YS50ZXN0ID8/IHsgbmFtZTogJycgfTtcbiAgICBjb25zdCBtaXhwYW5lbFJlc3VsdHMgPSB0aGlzLmdldEdyb3VwZWRUZXN0Q2FzZVJlc3VsdChcbiAgICAgIHRlc3RDYXNlc0V4ZWN1dGlvbnMsXG4gICAgICB2YWxpZFRlc3RDYXNlc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdFV1aWQ6IHRlc3RVdWlkPy5yZXBsYWNlKC8tL2csICcnKSxcbiAgICAgIHRlc3ROYW1lLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBjdXN0b21FbXB0eSxcbiAgICAgIGN1c3RvbVBhc3NlZDogbWl4cGFuZWxSZXN1bHRzLmN1c3RvbS5wYXNzZWQsXG4gICAgICBjdXN0b21GYWlsZWQ6IG1peHBhbmVsUmVzdWx0cy5jdXN0b20uZmFpbGVkLFxuICAgICAgZXhhbXBsZVBhc3NlZDogbWl4cGFuZWxSZXN1bHRzLmV4YW1wbGUucGFzc2VkLFxuICAgICAgZXhhbXBsZUZhaWxlZDogbWl4cGFuZWxSZXN1bHRzLmV4YW1wbGUuZmFpbGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEdyb3VwZWRUZXN0Q2FzZVJlc3VsdChcbiAgICB0ZXN0Q2FzZXNFeGVjdXRpb25zOiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbFtdLFxuICAgIHZhbGlkVGVzdENhc2VzOiBFeGFtcGxlVGVzdENhc2VbXSB8IEN1c3RvbVRlc3RDYXNlW11cbiAgKTogR3JvdXBlZFRlc3RDYXNlc1Jlc3VsdCB7XG4gICAgY29uc3QgZ3JvdXBlZFJlc3VsdCA9IHtcbiAgICAgIGN1c3RvbToge1xuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIHBhc3NlZDogMCxcbiAgICAgIH0sXG4gICAgICBleGFtcGxlOiB7XG4gICAgICAgIGZhaWxlZDogMCxcbiAgICAgICAgcGFzc2VkOiAwLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGVzdENhc2VzRXhlY3V0aW9ucy5mb3JFYWNoKCh7IGlucHV0OiByZXN1bHRJbnB1dCwgZXZhbHVhdGlvbiB9KSA9PiB7XG4gICAgICBjb25zdCBsb2NhbFRlc3RDYXNlID0gdmFsaWRUZXN0Q2FzZXMuZmluZChcbiAgICAgICAgKHsgaW5wdXQgfSkgPT4gcmVzdWx0SW5wdXQgPT09IGlucHV0XG4gICAgICApO1xuICAgICAgY29uc3QgbWl4cGFuZWxSZXN1bHRCb2R5ID0gbG9jYWxUZXN0Q2FzZT8ucHJlbG9hZGVkXG4gICAgICAgID8gZ3JvdXBlZFJlc3VsdC5leGFtcGxlXG4gICAgICAgIDogZ3JvdXBlZFJlc3VsdC5jdXN0b207XG5cbiAgICAgIGlmIChldmFsdWF0aW9uPy50ZXN0Y2FzZSkge1xuICAgICAgICBtaXhwYW5lbFJlc3VsdEJvZHkucGFzc2VkKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaXhwYW5lbFJlc3VsdEJvZHkuZmFpbGVkKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWl4cGFuZWxTZXR0aW5nc0RhdGEoXG4gICAgaXNQcmFjdGljZVF1ZXN0aW9uOiBib29sZWFuLFxuICAgIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyIH1cbiAgKSB7XG4gICAgY29uc3Qgc2V0dGluZ0luc3RhbmNlID0gdGhpcy5nZXRNaXhwYW5lbEluc3RhbmNlVmFsdWUoaXNQcmFjdGljZVF1ZXN0aW9uKTtcbiAgICBjb25zdCBjaGFuZ2VkS2V5ID0gT2JqZWN0LmtleXMoY29uZmlnKVswXTtcbiAgICBjb25zdCBUSEVNRV9JREVOVElGSUVSID0gJ3RoZW1lLSc7XG4gICAgbGV0IGNoYW5nZWRWYWx1ZTogYm9vbGVhbiB8IHN0cmluZyB8IG51bWJlciA9IGNvbmZpZ1tjaGFuZ2VkS2V5XTtcbiAgICBsZXQgbmV3VmFsdWVTdHJpbmc7XG5cbiAgICBpZiAodHlwZW9mIGNoYW5nZWRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBuZXdWYWx1ZVN0cmluZyA9IGNoYW5nZWRWYWx1ZSA/ICdPTicgOiAnT0ZGJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhbmdlZFZhbHVlID0gU3RyaW5nKGNoYW5nZWRWYWx1ZSk7XG4gICAgICBuZXdWYWx1ZVN0cmluZyA9IGNoYW5nZWRWYWx1ZS5pbmNsdWRlcyhUSEVNRV9JREVOVElGSUVSKVxuICAgICAgICA/IGNoYW5nZWRWYWx1ZS5yZXBsYWNlKFRIRU1FX0lERU5USUZJRVIsICcnKVxuICAgICAgICA6IGNoYW5nZWRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZXR0aW5nSW5zdGFuY2UsIGNoYW5nZWRLZXksIG5ld1ZhbHVlU3RyaW5nIH07XG4gIH1cblxuICBwcml2YXRlIGdldE1peHBhbmVsSW5zdGFuY2VWYWx1ZShpc1ByYWN0aWNlUXVlc3Rpb246IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaXNQcmFjdGljZVF1ZXN0aW9uID8gJ3ByYWN0aWNlIHF1ZXN0aW9uJyA6ICdyZWFsIHRlc3QnO1xuICB9XG5cbiAgcHJpdmF0ZSBwdWJsaXNoVGVzdFJlc3VsdHMoKSB7XG4gICAgdGhpcy5jb2RpbmdUZXN0UmVzdXRzU3ViaiQubmV4dCh7IC4uLnRoaXMuY29kaW5nVGVzdFJlc3VsdHMgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './coding-test.service';
2
+ export * from './coding-test-tour.service';
3
+ export * from './candidature-api.service';
4
+ export * from './coderunner-api.service';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90Z28tY29kaW5nLXRlc3Qvc3JjL2xpYi9zZXJ2aWNlcy9jYW5kaWRhdGUtY29kaW5nLXRlc3Qtc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29kaW5nLXRlc3Quc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvZGluZy10ZXN0LXRvdXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhbmRpZGF0dXJlLWFwaS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vY29kZXJ1bm5lci1hcGkuc2VydmljZSc7Il19