@sunbird-cb/toc 0.0.7 → 0.0.9

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 (331) hide show
  1. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -55
  2. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -126
  3. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -32
  4. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -85
  5. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -100
  6. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -48
  7. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +120 -120
  8. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +92 -92
  9. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -48
  10. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -25
  11. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -41
  12. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -89
  13. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -42
  14. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -41
  15. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -78
  16. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -45
  17. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -2
  18. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -70
  19. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -28
  20. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -187
  21. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -86
  22. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -31
  23. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +941 -941
  24. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -183
  25. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -327
  26. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -297
  27. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +248 -225
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1148 -1030
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -16
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -43
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -133
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -66
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -278
  34. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -21
  35. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -21
  36. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +847 -847
  37. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +219 -219
  38. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +209 -209
  39. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -26
  40. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -19
  41. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -23
  42. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -113
  43. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -110
  44. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -26
  45. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -19
  46. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -67
  47. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -28
  48. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -77
  49. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -2
  50. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -61
  51. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -20
  52. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -67
  53. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -139
  54. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -71
  55. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -34
  56. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -56
  57. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -25
  58. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -37
  59. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -32
  60. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -30
  61. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -38
  62. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -51
  63. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -115
  64. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -12
  65. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -51
  66. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -61
  67. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -87
  68. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -36
  69. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -62
  70. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -24
  71. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -192
  72. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -44
  73. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -99
  74. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -58
  75. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -67
  76. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -112
  77. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -2
  78. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -69
  79. package/esm2022/lib/_collection-api.mjs +57 -57
  80. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -19
  81. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -68
  82. package/esm2022/lib/_models/common.model.mjs +2 -2
  83. package/esm2022/lib/_models/error.model.mjs +2 -2
  84. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -24
  85. package/esm2022/lib/_services/rating.service.mjs +89 -89
  86. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -29
  87. package/esm2022/lib/_services/viewer-route-util.mjs +103 -103
  88. package/esm2022/lib/_services/widget-content.model.mjs +247 -247
  89. package/esm2022/lib/_services/widget-content.service.mjs +594 -594
  90. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -9
  91. package/esm2022/lib/app-toc-lib.module.mjs +499 -499
  92. package/esm2022/lib/collection.config.mjs +161 -161
  93. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -37
  94. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -1436
  95. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +475 -475
  96. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -119
  97. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -80
  98. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -249
  99. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -39
  100. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -58
  101. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2229 -2229
  102. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2907 -2905
  103. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -157
  104. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -48
  105. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -47
  106. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -766
  107. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -243
  108. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -116
  109. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -44
  110. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -1838
  111. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -236
  112. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -213
  113. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -36
  114. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +256 -256
  115. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -133
  116. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -36
  117. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -2
  118. package/esm2022/lib/models/app-toc.model.mjs +38 -38
  119. package/esm2022/lib/models/auto-complete.model.mjs +2 -2
  120. package/esm2022/lib/models/card-content.model.mjs +13 -13
  121. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -2
  122. package/esm2022/lib/models/discussion-forum.model.mjs +14 -14
  123. package/esm2022/lib/models/goal.model.mjs +2 -2
  124. package/esm2022/lib/models/meta-tag.model.mjs +8 -8
  125. package/esm2022/lib/models/playlist.model.mjs +2 -2
  126. package/esm2022/lib/models/profile-revamp.model.mjs +2 -2
  127. package/esm2022/lib/models/rating.model.mjs +2 -2
  128. package/esm2022/lib/models/user-profile.model.mjs +21 -21
  129. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -24
  130. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -24
  131. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -60
  132. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -25
  133. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -106
  134. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -25
  135. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -25
  136. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -25
  137. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -51
  138. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -16
  139. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -18
  140. package/esm2022/lib/services/access-control.service.mjs +56 -56
  141. package/esm2022/lib/services/action.service.mjs +23 -23
  142. package/esm2022/lib/services/app-toc-v2.service.mjs +313 -243
  143. package/esm2022/lib/services/app-toc.service.mjs +1613 -1387
  144. package/esm2022/lib/services/certificate.service.mjs +69 -69
  145. package/esm2022/lib/services/discuss-utils.service.mjs +58 -58
  146. package/esm2022/lib/services/editor.service.mjs +34 -34
  147. package/esm2022/lib/services/load-check.service.mjs +21 -21
  148. package/esm2022/lib/services/loader.service.mjs +33 -33
  149. package/esm2022/lib/services/mobile-apps.service.mjs +67 -67
  150. package/esm2022/lib/services/netcore.service.mjs +56 -56
  151. package/esm2022/lib/services/nps-grid.service.mjs +31 -31
  152. package/esm2022/lib/services/otp.service.mjs +43 -43
  153. package/esm2022/lib/services/profile-v2.service.mjs +43 -43
  154. package/esm2022/lib/services/reset-ratings.service.mjs +19 -19
  155. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -64
  156. package/esm2022/lib/services/timer.service.mjs +23 -23
  157. package/esm2022/lib/services/title-tag.service.mjs +71 -71
  158. package/esm2022/lib/services/user-profile.service.mjs +55 -55
  159. package/esm2022/lib/services/viewer-data.service.mjs +64 -64
  160. package/esm2022/lib/services/viewer-util.service.mjs +590 -500
  161. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -291
  162. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -119
  163. package/esm2022/public-api.mjs +71 -70
  164. package/esm2022/sunbird-cb-toc.mjs +4 -4
  165. package/fesm2022/sunbird-cb-toc.mjs +24777 -24250
  166. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  167. package/index.d.ts +5 -5
  168. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -16
  169. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -31
  170. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -15
  171. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -20
  172. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -22
  173. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -15
  174. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +22 -22
  175. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +22 -22
  176. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -9
  177. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -11
  178. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -12
  179. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -18
  180. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -14
  181. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -11
  182. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -17
  183. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -14
  184. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -199
  185. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -16
  186. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -10
  187. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -38
  188. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -19
  189. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -11
  190. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +183 -183
  191. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -41
  192. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -54
  193. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -47
  194. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -48
  195. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +171 -154
  196. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -8
  197. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -16
  198. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -40
  199. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -21
  200. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -45
  201. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -10
  202. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -10
  203. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +128 -128
  204. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +51 -51
  205. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -29
  206. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -9
  207. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -7
  208. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -7
  209. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -28
  210. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -24
  211. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -14
  212. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -9
  213. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -12
  214. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -10
  215. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -22
  216. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -8
  217. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -18
  218. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -8
  219. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -15
  220. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -35
  221. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -19
  222. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -14
  223. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -13
  224. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -11
  225. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -11
  226. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -15
  227. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -10
  228. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -16
  229. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -11
  230. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -34
  231. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -17
  232. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -15
  233. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -15
  234. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -21
  235. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -12
  236. package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -21
  237. package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -9
  238. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -47
  239. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -14
  240. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -22
  241. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -19
  242. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -15
  243. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -25
  244. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -21
  245. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -18
  246. package/lib/_collection-api.d.ts +34 -34
  247. package/lib/_constants/widget-content.constants.d.ts +7 -7
  248. package/lib/_directives/tooltip.directive.d.ts +17 -17
  249. package/lib/_models/common.model.d.ts +3 -3
  250. package/lib/_models/error.model.d.ts +5 -5
  251. package/lib/_pipes/highlight.pipe.d.ts +10 -10
  252. package/lib/_services/rating.service.d.ts +18 -18
  253. package/lib/_services/samuhik-charcha.service.d.ts +13 -13
  254. package/lib/_services/viewer-route-util.d.ts +8 -8
  255. package/lib/_services/widget-content.model.d.ts +515 -515
  256. package/lib/_services/widget-content.service.d.ts +101 -101
  257. package/lib/_shared/translate-loader.factory.d.ts +7 -7
  258. package/lib/app-toc-lib.module.d.ts +88 -88
  259. package/lib/collection.config.d.ts +159 -159
  260. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -17
  261. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -225
  262. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +78 -78
  263. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -22
  264. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -31
  265. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -47
  266. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -14
  267. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -21
  268. package/lib/components/app-toc-home/app-toc-home.component.d.ts +314 -314
  269. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +408 -408
  270. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -47
  271. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -22
  272. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -14
  273. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -149
  274. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -42
  275. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -27
  276. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -15
  277. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -195
  278. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -44
  279. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -54
  280. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -18
  281. package/lib/components/public-survey-form/public-survey-form.component.d.ts +43 -43
  282. package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -20
  283. package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -13
  284. package/lib/models/app-toc-analytics.model.d.ts +152 -152
  285. package/lib/models/app-toc.model.d.ts +84 -84
  286. package/lib/models/auto-complete.model.d.ts +27 -27
  287. package/lib/models/card-content.model.d.ts +19 -19
  288. package/lib/models/content-strip-with-tabs.model.d.ts +44 -44
  289. package/lib/models/discussion-forum.model.d.ts +40 -40
  290. package/lib/models/goal.model.d.ts +22 -22
  291. package/lib/models/meta-tag.model.d.ts +6 -6
  292. package/lib/models/playlist.model.d.ts +23 -23
  293. package/lib/models/profile-revamp.model.d.ts +14 -14
  294. package/lib/models/rating.model.d.ts +17 -17
  295. package/lib/models/user-profile.model.d.ts +37 -37
  296. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -12
  297. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -12
  298. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -16
  299. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -12
  300. package/lib/resolvers/app-toc-resolver.service.d.ts +16 -16
  301. package/lib/resolvers/config-resolver.service.d.ts +11 -11
  302. package/lib/resolvers/profile-resolver.service.d.ts +11 -11
  303. package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -11
  304. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -19
  305. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -8
  306. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -8
  307. package/lib/services/access-control.service.d.ts +29 -29
  308. package/lib/services/action.service.d.ts +9 -9
  309. package/lib/services/app-toc-v2.service.d.ts +16 -14
  310. package/lib/services/app-toc.service.d.ts +235 -177
  311. package/lib/services/certificate.service.d.ts +42 -42
  312. package/lib/services/discuss-utils.service.d.ts +33 -33
  313. package/lib/services/editor.service.d.ts +17 -17
  314. package/lib/services/load-check.service.d.ts +8 -8
  315. package/lib/services/loader.service.d.ts +16 -16
  316. package/lib/services/mobile-apps.service.d.ts +38 -38
  317. package/lib/services/netcore.service.d.ts +33 -33
  318. package/lib/services/nps-grid.service.d.ts +15 -15
  319. package/lib/services/otp.service.d.ts +20 -20
  320. package/lib/services/profile-v2.service.d.ts +20 -20
  321. package/lib/services/reset-ratings.service.d.ts +8 -8
  322. package/lib/services/resource-download-helper.service.d.ts +29 -29
  323. package/lib/services/timer.service.d.ts +9 -9
  324. package/lib/services/title-tag.service.d.ts +21 -21
  325. package/lib/services/user-profile.service.d.ts +24 -24
  326. package/lib/services/viewer-data.service.d.ts +58 -58
  327. package/lib/services/viewer-util.service.d.ts +76 -62
  328. package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -56
  329. package/lib/share-toc/share-toc.module.d.ts +32 -32
  330. package/package.json +1 -1
  331. package/public-api.d.ts +56 -55
@@ -1,297 +1,297 @@
1
- import { Component, Input } from '@angular/core';
2
- import { ConfirmationDialogComponent } from '@sunbird-cb/consumption';
3
- import * as _ from 'lodash';
4
- import { AssignmentViewerV2Component } from '../app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/router";
7
- import * as i2 from "@angular/material/legacy-snack-bar";
8
- import * as i3 from "../../../../services/app-toc.service";
9
- import * as i4 from "@sunbird-cb/utils-v2";
10
- import * as i5 from "@angular/material/dialog";
11
- import * as i6 from "@angular/material/legacy-dialog";
12
- import * as i7 from "@angular/common";
13
- import * as i8 from "@angular/material/icon";
14
- import * as i9 from "@angular/material/progress-spinner";
15
- import * as i10 from "@ngx-translate/core";
16
- export class AppTocBatchAssignmentsComponent {
17
- constructor(router, snackBar, tocSvc, configSvc, dialog, dialogLegacy, route) {
18
- this.router = router;
19
- this.snackBar = snackBar;
20
- this.tocSvc = tocSvc;
21
- this.configSvc = configSvc;
22
- this.dialog = dialog;
23
- this.dialogLegacy = dialogLegacy;
24
- this.route = route;
25
- this.assignments = [];
26
- this.allowType = ['.pdf'];
27
- this.isLoading = false;
28
- this.submissions = [];
29
- this.batchId = this.route.snapshot.queryParams.batchId ?
30
- this.route.snapshot.queryParams.batchId : '';
31
- }
32
- ngOnInit() {
33
- this.fetchAssignments();
34
- }
35
- getUserAssignmentStatus() {
36
- if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
37
- const request = {
38
- filters: {
39
- contextId: this.content.identifier,
40
- submittedBy: this.configSvc.userProfile.userId
41
- }
42
- };
43
- this.tocSvc.getAssignmentStatus(request).subscribe((response) => {
44
- this.submissions = _.get(response, 'result.response.content', []);
45
- console.log('submissions', this.submissions);
46
- this.processAssignmentsWithStatus();
47
- }, error => {
48
- console.error('Error fetching assignment status', error);
49
- });
50
- }
51
- }
52
- processAssignmentsWithStatus() {
53
- this.assignments = this.assignments.map((assignment) => ({
54
- ...assignment,
55
- expand: false,
56
- downloading: false,
57
- enableDownload: false,
58
- answerURL: this.submissions.find(sub => sub.formId === assignment.formId)?.submitUrl || '',
59
- status: this.submissions.find(sub => sub.formId === assignment.formId)?.status || 'PENDING',
60
- enableView: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED',
61
- submissionMeta: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED' ? this.submissions.find(sub => sub.formId === assignment.formId)?.submissionMeta : {}
62
- }));
63
- }
64
- fetchAssignments() {
65
- const payload = {
66
- query: '',
67
- filters: {
68
- "additionalProperties.batchId": this.batchId,
69
- },
70
- };
71
- this.tocSvc.searchAssignments(payload).subscribe((response) => {
72
- let assignments = _.get(response, 'result.response.content', []);
73
- this.assignments = assignments.map((assignment) => ({
74
- ...assignment,
75
- expand: false,
76
- downloading: false,
77
- enableView: false,
78
- enableDownload: false,
79
- answerURL: '',
80
- status: '',
81
- submissionMeta: {}
82
- }));
83
- this.getUserAssignmentStatus();
84
- }, error => {
85
- console.error('Error fetching assignments', error);
86
- });
87
- }
88
- handleViewFeedback(assignment) {
89
- assignment.expand = true;
90
- }
91
- downloadFile(assignment) {
92
- assignment.downloading = true;
93
- assignment.enableDownload = true;
94
- this.selectedAssignment = assignment;
95
- this.downloadFileWithFetch(assignment);
96
- }
97
- downloadFileDirectly(assignment) {
98
- if (assignment.additionalProperties.assignmentUrl) {
99
- window.open(assignment.additionalProperties.assignmentUrl, '_blank');
100
- assignment.downloading = false;
101
- }
102
- }
103
- async downloadFileWithFetch(assignment) {
104
- if (!assignment.additionalProperties.assignmentUrl)
105
- return;
106
- try {
107
- const response = await fetch(assignment.additionalProperties.assignmentUrl);
108
- if (!response.ok) {
109
- throw new Error('Network response was not ok');
110
- }
111
- const blob = await response.blob();
112
- const url = window.URL.createObjectURL(blob);
113
- const link = document.createElement('a');
114
- link.href = url;
115
- link.download = this.extractFilenameFromUrl(assignment.additionalProperties.assignmentUrl) || `${assignment.title}.pdf`;
116
- document.body.appendChild(link);
117
- link.click();
118
- document.body.removeChild(link);
119
- window.URL.revokeObjectURL(url);
120
- assignment.downloading = false;
121
- }
122
- catch (error) {
123
- console.error('Download failed:', error);
124
- this.downloadFileDirectly(assignment);
125
- }
126
- }
127
- triggerFileUpload(assignment) {
128
- this.selectedAssignment = assignment;
129
- if (assignment.answerURL) {
130
- this.submitAssignment(assignment);
131
- }
132
- else {
133
- const fileInput = document.getElementById('sResourceFile');
134
- if (fileInput) {
135
- fileInput.click();
136
- }
137
- }
138
- }
139
- submitAssignment(assessment) {
140
- console.log('Submit assignment clicked', assessment);
141
- const dialgoData = {
142
- description: 'You have already uploaded an assignment. Choose an option below to either keep your current submission or upload a new file.',
143
- type: 'warning',
144
- buttonsPositionClass: 'justify-center items-center',
145
- buttons: [
146
- {
147
- classes: 'btn-out-line',
148
- text: 'Re-upload',
149
- response: 0
150
- },
151
- {
152
- classes: 'succes-button',
153
- text: 'Keep Submission',
154
- response: 1
155
- }
156
- ]
157
- };
158
- const dialogRef = this.dialogLegacy.open(ConfirmationDialogComponent, {
159
- data: dialgoData,
160
- disableClose: false,
161
- width: '400px',
162
- maxWidth: '90vw'
163
- });
164
- dialogRef.afterClosed().subscribe((result) => {
165
- if (result === 1) {
166
- //this.viewAssignments(assessment.answerURL)
167
- this.previewAssignments(assessment.answerURL);
168
- }
169
- else if (result === 0) {
170
- const fileInput = document.getElementById('sResourceFile');
171
- if (fileInput) {
172
- fileInput.click();
173
- }
174
- }
175
- });
176
- }
177
- fileInputEmit(fileInput) {
178
- if (!fileInput || fileInput.length === 0) {
179
- return;
180
- }
181
- const file = fileInput[0];
182
- if (this.checkFileType(file)) {
183
- this.upload(file);
184
- }
185
- }
186
- async upload(file) {
187
- this.resourceFileAdded = file;
188
- this.isLoading = true;
189
- try {
190
- const uploadRes = await this.tocSvc.uploadAssignmentAnswer(this.content.identifier, this.batchId, this.selectedAssignment.formId, file).toPromise();
191
- if (uploadRes && uploadRes.responseCode === 'OK') {
192
- this.openSnackbar('File uploaded successfully');
193
- this.previewAssignments(uploadRes.result.url);
194
- }
195
- else {
196
- this.isLoading = false;
197
- this.openSnackbar('File upload failed. Please try again.');
198
- }
199
- }
200
- catch (error) {
201
- this.isLoading = false;
202
- console.error('Upload API error:', error);
203
- this.openSnackbar('File upload failed. Please try again.');
204
- }
205
- }
206
- previewAssignments(result) {
207
- this.isLoading = false;
208
- this.callingViewAssignments(result);
209
- }
210
- callingViewAssignments(url) {
211
- const dialogRef = this.dialog.open(AssignmentViewerV2Component, {
212
- width: '40%',
213
- disableClose: true,
214
- panelClass: 'dialog_sidenav',
215
- data: {
216
- assessment: this.selectedAssignment,
217
- url: url,
218
- contentId: this.content.identifier,
219
- batchId: this.batchId,
220
- }
221
- });
222
- dialogRef.afterClosed().subscribe(result => {
223
- setTimeout(() => {
224
- this.fetchAssignments();
225
- }, 1000);
226
- console.log(result);
227
- });
228
- }
229
- checkFileType(file) {
230
- let flag = false;
231
- if (file && file.size) {
232
- const fileInMB = Math.floor(file.size / (1024 * 1024));
233
- if (fileInMB > 5) {
234
- this.openSnackbar('File size exceeds 5 MB limit. Please upload a smaller file.');
235
- return false;
236
- }
237
- }
238
- if (file && this.allowType && this.allowType.length > 0) {
239
- this.allowType.forEach((ele) => {
240
- if (file.name.toLowerCase().endsWith(ele)) {
241
- flag = true;
242
- }
243
- });
244
- }
245
- if (!flag) {
246
- this.openSnackbar('Invalid file type uploaded. Please upload supporting format only.');
247
- }
248
- this.fileExtention = file.name.toLowerCase().substring(file.name.lastIndexOf('.'));
249
- if (file) {
250
- if (['.pdf'].includes(this.fileExtention)) {
251
- flag = true;
252
- }
253
- else {
254
- flag = false;
255
- }
256
- if (!flag) {
257
- this.openSnackbar('Invalid file type uploaded. Please upload PDF format only.');
258
- }
259
- }
260
- return flag;
261
- }
262
- getMarks(submissionMeta) {
263
- if (submissionMeta?.marksGiven != null && submissionMeta?.maximumMarks != null) {
264
- return `${submissionMeta.marksGiven}` + '/' + `${submissionMeta.maximumMarks}`;
265
- }
266
- else if (submissionMeta?.marksGiven != null) {
267
- return `${submissionMeta.marksGiven}`;
268
- }
269
- else {
270
- return 'N/A';
271
- }
272
- }
273
- openSnackbar(primaryMsg, duration = 5000) {
274
- this.snackBar.open(primaryMsg, 'X', {
275
- duration,
276
- });
277
- }
278
- extractFilenameFromUrl(url) {
279
- try {
280
- const urlParts = url.split('/');
281
- const filename = urlParts[urlParts.length - 1];
282
- return filename.includes('.') ? filename : '';
283
- }
284
- catch (error) {
285
- return '';
286
- }
287
- }
288
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, deps: [{ token: i1.Router }, { token: i2.MatLegacySnackBar }, { token: i3.AppTocService }, { token: i4.ConfigurationsService }, { token: i5.MatDialog }, { token: i6.MatLegacyDialog }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
289
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocBatchAssignmentsComponent, selector: "ws-widget-app-batch-assignments", inputs: { content: "content" }, ngImport: i0, template: "<div class=\"guide-container\">\n <div class=\"flex flex row\">\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\n </div>\n </div>\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\n <div class=\"guide-card\">\n <div class=\"content flex gap-4 justify-between flex-middle\">\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\n </span>\n <span *ngIf=\"!assignment.downloading\">\n {{ 'userAssignments.download' | translate }}\n </span>\n </button>\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\"\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\n Upload\n </button> -->\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\n (change)=\"fileInputEmit(resourceFile.files)\">\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\n }}</button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\n </ng-container>\n\n </div>\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\n (click)=\"assignment.expand = !assignment.expand\">\n close\n </mat-icon>\n </div>\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\n <div class=\"font-bold font-style\">\n <div>\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\n </div>\n </div>\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\n <div class=\"font-style\">\n {{assignment?.submissionMeta?.instructorFeedback}}\n </div>\n </div>\n\n </div>\n </ng-container>\n</div>\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\n</div>\n\n\n<!-- No teachers resources message -->\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\n {{ 'userAssignments.noAssignments' | translate }}\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
290
- }
291
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, decorators: [{
292
- type: Component,
293
- args: [{ selector: 'ws-widget-app-batch-assignments', template: "<div class=\"guide-container\">\n <div class=\"flex flex row\">\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\n </div>\n </div>\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\n <div class=\"guide-card\">\n <div class=\"content flex gap-4 justify-between flex-middle\">\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\n </span>\n <span *ngIf=\"!assignment.downloading\">\n {{ 'userAssignments.download' | translate }}\n </span>\n </button>\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\"\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\n Upload\n </button> -->\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\n (change)=\"fileInputEmit(resourceFile.files)\">\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\n }}</button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\n </ng-container>\n\n </div>\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\n (click)=\"assignment.expand = !assignment.expand\">\n close\n </mat-icon>\n </div>\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\n <div class=\"font-bold font-style\">\n <div>\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\n </div>\n </div>\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\n <div class=\"font-style\">\n {{assignment?.submissionMeta?.instructorFeedback}}\n </div>\n </div>\n\n </div>\n </ng-container>\n</div>\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\n</div>\n\n\n<!-- No teachers resources message -->\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\n {{ 'userAssignments.noAssignments' | translate }}\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"] }]
294
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.MatLegacySnackBar }, { type: i3.AppTocService }, { type: i4.ConfigurationsService }, { type: i5.MatDialog }, { type: i6.MatLegacyDialog }, { type: i1.ActivatedRoute }]; }, propDecorators: { content: [{
295
- type: Input
296
- }] } });
297
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzL2FwcC10b2MtYmF0Y2gtYXNzaWdubWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBTXhELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXJFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFBOzs7Ozs7Ozs7Ozs7QUFRbEgsTUFBTSxPQUFPLCtCQUErQjtJQWExQyxZQUFtQixNQUFjLEVBQ3ZCLFFBQTJCLEVBQzVCLE1BQXFCLEVBQ3JCLFNBQWdDLEVBQy9CLE1BQWlCLEVBQ2pCLFlBQTZCLEVBQzdCLEtBQXFCO1FBTlosV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLFVBQUssR0FB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WUFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQzlDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7U0FDOUM7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFBO1NBQ1Y7SUFDSCxDQUFDOytHQXhTVSwrQkFBK0I7bUdBQS9CLCtCQUErQix1R0NqQjVDLDJ2SUFnRk07OzRGRC9ETywrQkFBK0I7a0JBTjNDLFNBQVM7K0JBQ0UsaUNBQWlDO2dSQU9sQyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZydcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwLXRvYy1hc3NpZ25tZW50LXZpZXdlclYyL2FwcC10b2MtYXNzaWdubWVudC12aWV3ZXJWMi5jb21wb25lbnQnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtYmF0Y2gtYXNzaWdubWVudHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtYmF0Y2gtYXNzaWdubWVudHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NCYXRjaEFzc2lnbm1lbnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBjb250ZW50OiBhbnlcbiAgYXNzaWdubWVudHM6IGFueVtdID0gW11cbiAgYWxsb3dUeXBlOiBzdHJpbmdbXSA9IFsnLnBkZiddXG4gIGZpbGVFeHRlbnRpb246IGFueVxuICByZXNvdXJjZUZpbGVBZGRlZDogYW55XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gIHNlbGVjdGVkQXNzaWdubWVudDogYW55XG4gIGJhdGNoSWQ6IGFueVxuICBzdWJtaXNzaW9uczogYW55W10gPSBbXVxuXG5cbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdExlZ2FjeVNuYWNrQmFyLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHVibGljIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBkaWFsb2dMZWdhY3k6IE1hdExlZ2FjeURpYWxvZyxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgKSB7XG4gICAgdGhpcy5iYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZldGNoQXNzaWdubWVudHMoKVxuICB9XG5cbiAgZ2V0VXNlckFzc2lnbm1lbnRTdGF0dXMoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCkge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGNvbnRleHRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3VibWl0dGVkQnk6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvY1N2Yy5nZXRBc3NpZ25tZW50U3RhdHVzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pc3Npb25zID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucmVzcG9uc2UuY29udGVudCcsIFtdKVxuICAgICAgICBjb25zb2xlLmxvZygnc3VibWlzc2lvbnMnLCB0aGlzLnN1Ym1pc3Npb25zKVxuICAgICAgICB0aGlzLnByb2Nlc3NBc3NpZ25tZW50c1dpdGhTdGF0dXMoKVxuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBhc3NpZ25tZW50IHN0YXR1cycsIGVycm9yKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQXNzaWdubWVudHNXaXRoU3RhdHVzKCkge1xuICAgIHRoaXMuYXNzaWdubWVudHMgPSB0aGlzLmFzc2lnbm1lbnRzLm1hcCgoYXNzaWdubWVudDogYW55KSA9PiAoe1xuICAgICAgLi4uYXNzaWdubWVudCxcbiAgICAgIGV4cGFuZDogZmFsc2UsXG4gICAgICBkb3dubG9hZGluZzogZmFsc2UsXG4gICAgICBlbmFibGVEb3dubG9hZDogZmFsc2UsXG4gICAgICBhbnN3ZXJVUkw6IHRoaXMuc3VibWlzc2lvbnMuZmluZChzdWIgPT4gc3ViLmZvcm1JZCA9PT0gYXNzaWdubWVudC5mb3JtSWQpPy5zdWJtaXRVcmwgfHwgJycsXG4gICAgICBzdGF0dXM6IHRoaXMuc3VibWlzc2lvbnMuZmluZChzdWIgPT4gc3ViLmZvcm1JZCA9PT0gYXNzaWdubWVudC5mb3JtSWQpPy5zdGF0dXMgfHwgJ1BFTkRJTkcnLFxuICAgICAgZW5hYmxlVmlldzogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCcsXG4gICAgICBzdWJtaXNzaW9uTWV0YTogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCcgPyB0aGlzLnN1Ym1pc3Npb25zLmZpbmQoc3ViID0+IHN1Yi5mb3JtSWQgPT09IGFzc2lnbm1lbnQuZm9ybUlkKT8uc3VibWlzc2lvbk1ldGEgOiB7fVxuICAgIH0pKVxuICB9XG4gIGZldGNoQXNzaWdubWVudHMoKSB7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgcXVlcnk6ICcnLFxuICAgICAgZmlsdGVyczoge1xuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzLmJhdGNoSWRcIjogdGhpcy5iYXRjaElkLFxuICAgICAgfSxcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuc2VhcmNoQXNzaWdubWVudHMocGF5bG9hZCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICBsZXQgYXNzaWdubWVudHMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JywgW10pXG4gICAgICB0aGlzLmFzc2lnbm1lbnRzID0gYXNzaWdubWVudHMubWFwKChhc3NpZ25tZW50OiBhbnkpID0+ICh7XG4gICAgICAgIC4uLmFzc2lnbm1lbnQsXG4gICAgICAgIGV4cGFuZDogZmFsc2UsXG4gICAgICAgIGRvd25sb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlVmlldzogZmFsc2UsXG4gICAgICAgIGVuYWJsZURvd25sb2FkOiBmYWxzZSxcbiAgICAgICAgYW5zd2VyVVJMOiAnJyxcbiAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgc3VibWlzc2lvbk1ldGE6IHt9XG4gICAgICB9KSlcbiAgICAgIHRoaXMuZ2V0VXNlckFzc2lnbm1lbnRTdGF0dXMoKVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGFzc2lnbm1lbnRzJywgZXJyb3IpXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZVZpZXdGZWVkYmFjayhhc3NpZ25tZW50OiBhbnkpIHtcbiAgICBhc3NpZ25tZW50LmV4cGFuZCA9IHRydWVcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShhc3NpZ25tZW50OiBhbnkpIHtcbiAgICBhc3NpZ25tZW50LmRvd25sb2FkaW5nID0gdHJ1ZVxuICAgIGFzc2lnbm1lbnQuZW5hYmxlRG93bmxvYWQgPSB0cnVlXG4gICAgdGhpcy5zZWxlY3RlZEFzc2lnbm1lbnQgPSBhc3NpZ25tZW50XG4gICAgdGhpcy5kb3dubG9hZEZpbGVXaXRoRmV0Y2goYXNzaWdubWVudClcbiAgfVxuXG4gIGRvd25sb2FkRmlsZURpcmVjdGx5KGFzc2lnbm1lbnQ6IGFueSkge1xuICAgIGlmIChhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybCwgJ19ibGFuaycpXG4gICAgICBhc3NpZ25tZW50LmRvd25sb2FkaW5nID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBhc3luYyBkb3dubG9hZEZpbGVXaXRoRmV0Y2goYXNzaWdubWVudDogYW55KSB7XG4gICAgaWYgKCFhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHJldHVyblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2snKVxuICAgICAgfVxuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKVxuICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgIGxpbmsuaHJlZiA9IHVybFxuICAgICAgbGluay5kb3dubG9hZCA9IHRoaXMuZXh0cmFjdEZpbGVuYW1lRnJvbVVybChhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHx8IGAke2Fzc2lnbm1lbnQudGl0bGV9LnBkZmBcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICAgIGxpbmsuY2xpY2soKVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgYXNzaWdubWVudC5kb3dubG9hZGluZyA9IGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rvd25sb2FkIGZhaWxlZDonLCBlcnJvcilcbiAgICAgIHRoaXMuZG93bmxvYWRGaWxlRGlyZWN0bHkoYXNzaWdubWVudClcbiAgICB9XG4gIH1cblxuXG4gIHRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50ID0gYXNzaWdubWVudFxuICAgIGlmIChhc3NpZ25tZW50LmFuc3dlclVSTCkge1xuICAgICAgdGhpcy5zdWJtaXRBc3NpZ25tZW50KGFzc2lnbm1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzUmVzb3VyY2VGaWxlJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmIChmaWxlSW5wdXQpIHtcbiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBzdWJtaXRBc3NpZ25tZW50KGFzc2Vzc21lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdTdWJtaXQgYXNzaWdubWVudCBjbGlja2VkJywgYXNzZXNzbWVudClcbiAgICBjb25zdCBkaWFsZ29EYXRhID0ge1xuICAgICAgZGVzY3JpcHRpb246ICdZb3UgaGF2ZSBhbHJlYWR5IHVwbG9hZGVkIGFuIGFzc2lnbm1lbnQuIENob29zZSBhbiBvcHRpb24gYmVsb3cgdG8gZWl0aGVyIGtlZXAgeW91ciBjdXJyZW50IHN1Ym1pc3Npb24gb3IgdXBsb2FkIGEgbmV3IGZpbGUuJyxcbiAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgIGJ1dHRvbnNQb3NpdGlvbkNsYXNzOiAnanVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyJyxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6ICdidG4tb3V0LWxpbmUnLFxuICAgICAgICAgIHRleHQ6ICdSZS11cGxvYWQnLFxuICAgICAgICAgIHJlc3BvbnNlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiAnc3VjY2VzLWJ1dHRvbicsXG4gICAgICAgICAgdGV4dDogJ0tlZXAgU3VibWlzc2lvbicsXG4gICAgICAgICAgcmVzcG9uc2U6IDFcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ0xlZ2FjeS5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogZGlhbGdvRGF0YSxcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dydcbiAgICB9KVxuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gMSkge1xuICAgICAgICAvL3RoaXMudmlld0Fzc2lnbm1lbnRzKGFzc2Vzc21lbnQuYW5zd2VyVVJMKVxuICAgICAgICB0aGlzLnByZXZpZXdBc3NpZ25tZW50cyhhc3Nlc3NtZW50LmFuc3dlclVSTClcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzUmVzb3VyY2VGaWxlJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgaWYgKGZpbGVJbnB1dCkge1xuICAgICAgICAgIGZpbGVJbnB1dC5jbGljaygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZmlsZUlucHV0RW1pdChmaWxlSW5wdXQ6IEZpbGVMaXN0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghZmlsZUlucHV0IHx8IGZpbGVJbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmaWxlID0gZmlsZUlucHV0WzBdXG4gICAgaWYgKHRoaXMuY2hlY2tGaWxlVHlwZShmaWxlKSkge1xuICAgICAgdGhpcy51cGxvYWQoZmlsZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGxvYWQoZmlsZTogYW55KSB7XG4gICAgdGhpcy5yZXNvdXJjZUZpbGVBZGRlZCA9IGZpbGVcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGxvYWRSZXM6IGFueSA9IGF3YWl0IHRoaXMudG9jU3ZjLnVwbG9hZEFzc2lnbm1lbnRBbnN3ZXIoXG4gICAgICAgIHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmJhdGNoSWQsXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50LmZvcm1JZCxcbiAgICAgICAgZmlsZVxuICAgICAgKS50b1Byb21pc2UoKVxuXG4gICAgICBpZiAodXBsb2FkUmVzICYmIHVwbG9hZFJlcy5yZXNwb25zZUNvZGUgPT09ICdPSycpIHtcbiAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0ZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5JylcbiAgICAgICAgdGhpcy5wcmV2aWV3QXNzaWdubWVudHModXBsb2FkUmVzLnJlc3VsdC51cmwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZCBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICBjb25zb2xlLmVycm9yKCdVcGxvYWQgQVBJIGVycm9yOicsIGVycm9yKVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0ZpbGUgdXBsb2FkIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKVxuICAgIH1cbiAgfVxuXG4gIHByZXZpZXdBc3NpZ25tZW50cyhyZXN1bHQ6IGFueSkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICB0aGlzLmNhbGxpbmdWaWV3QXNzaWdubWVudHMocmVzdWx0KVxuICB9XG5cbiAgY2FsbGluZ1ZpZXdBc3NpZ25tZW50cyh1cmw6IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwJScsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBwYW5lbENsYXNzOiAnZGlhbG9nX3NpZGVuYXYnLFxuICAgICAgZGF0YToge1xuICAgICAgICBhc3Nlc3NtZW50OiB0aGlzLnNlbGVjdGVkQXNzaWdubWVudCxcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuYmF0Y2hJZCxcbiAgICAgIH1cbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmV0Y2hBc3NpZ25tZW50cygpXG4gICAgICB9LCAxMDAwKVxuICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgIH0pXG4gIH1cblxuXG4gIGNoZWNrRmlsZVR5cGUoZmlsZTogRmlsZSkge1xuICAgIGxldCBmbGFnID0gZmFsc2VcbiAgICBpZiAoZmlsZSAmJiBmaWxlLnNpemUpIHtcbiAgICAgIGNvbnN0IGZpbGVJbk1CID0gTWF0aC5mbG9vcihmaWxlLnNpemUgLyAoMTAyNCAqIDEwMjQpKVxuICAgICAgaWYgKGZpbGVJbk1CID4gNSkge1xuICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignRmlsZSBzaXplIGV4Y2VlZHMgNSBNQiBsaW1pdC4gUGxlYXNlIHVwbG9hZCBhIHNtYWxsZXIgZmlsZS4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbGUgJiYgdGhpcy5hbGxvd1R5cGUgJiYgdGhpcy5hbGxvd1R5cGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hbGxvd1R5cGUuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGVsZSkpIHtcbiAgICAgICAgICBmbGFnID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdJbnZhbGlkIGZpbGUgdHlwZSB1cGxvYWRlZC4gUGxlYXNlIHVwbG9hZCBzdXBwb3J0aW5nIGZvcm1hdCBvbmx5LicpXG4gICAgfVxuICAgIHRoaXMuZmlsZUV4dGVudGlvbiA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZyhmaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSlcbiAgICBpZiAoZmlsZSkge1xuICAgICAgaWYgKFsnLnBkZiddLmluY2x1ZGVzKHRoaXMuZmlsZUV4dGVudGlvbikpIHtcbiAgICAgICAgZmxhZyA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYWcgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdJbnZhbGlkIGZpbGUgdHlwZSB1cGxvYWRlZC4gUGxlYXNlIHVwbG9hZCBQREYgZm9ybWF0IG9ubHkuJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZsYWdcbiAgfVxuXG4gIGdldE1hcmtzKHN1Ym1pc3Npb25NZXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChzdWJtaXNzaW9uTWV0YT8ubWFya3NHaXZlbiAhPSBudWxsICYmIHN1Ym1pc3Npb25NZXRhPy5tYXhpbXVtTWFya3MgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGAke3N1Ym1pc3Npb25NZXRhLm1hcmtzR2l2ZW59YCArICcvJyArIGAke3N1Ym1pc3Npb25NZXRhLm1heGltdW1NYXJrc31gXG4gICAgfSBlbHNlIGlmIChzdWJtaXNzaW9uTWV0YT8ubWFya3NHaXZlbiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gYCR7c3VibWlzc2lvbk1ldGEubWFya3NHaXZlbn1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnTi9BJ1xuICAgIH1cbiAgfVxuXG4gIG9wZW5TbmFja2JhcihwcmltYXJ5TXNnOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIgPSA1MDAwKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKHByaW1hcnlNc2csICdYJywge1xuICAgICAgZHVyYXRpb24sXG4gICAgfSlcbiAgfVxuICBleHRyYWN0RmlsZW5hbWVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsUGFydHMgPSB1cmwuc3BsaXQoJy8nKVxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB1cmxQYXJ0c1t1cmxQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgcmV0dXJuIGZpbGVuYW1lLmluY2x1ZGVzKCcuJykgPyBmaWxlbmFtZSA6ICcnXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImd1aWRlLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4IHJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJhbm5lciBpbmZvLWJhbm5lci13YXJuaW5nIGZsZXggZmxleC1yb3cgaXRtLWNlbnRlclwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uIG1hcmdpbi1yaWdodC1zIGFzc2lnbm1lbnQtbm90ZS1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cImFzc2lnbm1lbnQtbm90ZVwiPiB7eyAndXNlckFzc2lnbm1lbnRzLm5vdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXNzaWdubWVudCBvZiBhc3NpZ25tZW50czsgaW5kZXggYXMgaVwiPlxuICAgIDxkaXYgY2xhc3M9XCJndWlkZS1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudCBmbGV4IGdhcC00IGp1c3RpZnktYmV0d2VlbiBmbGV4LW1pZGRsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm90ZS10aXRsZVwiPnt7aSArIDF9fS4ge3thc3NpZ25tZW50LnRpdGxlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbWlkZGxlIGdhcC0zXCIgKm5nSWY9XCIhYXNzaWdubWVudC5leHBhbmRcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJkb3dubG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkRmlsZShhc3NpZ25tZW50KVwiIFtkaXNhYmxlZF09XCJhc3NpZ25tZW50LmRvd25sb2FkaW5nXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFzc2lnbm1lbnQuZG93bmxvYWRpbmdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cIm1yLTJcIiBbc3R5bGUuY29sb3JdPVwiJ3doaXRlJ1wiIHN0cm9rZVdpZHRoPVwiMlwiPjwvbWF0LXNwaW5uZXI+RG93bmxvYWRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFzc2lnbm1lbnQuZG93bmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy5kb3dubG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdEUkFGVCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInVwbG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoYXNzaWdubWVudClcIj5cbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy51cGxvYWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgIT09ICdEUkFGVCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInVwbG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoYXNzaWdubWVudClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdTVUJNSVRURUQnIHx8IGFzc2lnbm1lbnQuc3RhdHVzID09PSAnRVZBTFVBVEVEJyB8fCAhYXNzaWdubWVudC5lbmFibGVEb3dubG9hZFwiPlxuICAgICAgICAgICAgICB7eyAndXNlckFzc2lnbm1lbnRzLnVwbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0gPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidXBsb2FkLWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoYXNzaWdubWVudClcIiBbZGlzYWJsZWRdPVwiIWFzc2lnbm1lbnQuZW5hYmxlRG93bmxvYWRcIj5cbiAgICAgICAgICAgIFVwbG9hZFxuICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICA8aW5wdXQgI3Jlc291cmNlRmlsZSB0eXBlPVwiZmlsZVwiIG5hbWU9XCJzUmVzb3VyY2VGaWxlXCIgaWQ9XCJzUmVzb3VyY2VGaWxlXCIgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlSW5wdXRFbWl0KHJlc291cmNlRmlsZS5maWxlcylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdTVUJNSVRURUQnXCI+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJ2aWV3LWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudClcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPnt7ICd1c2VyQXNzaWdubWVudHMudmlld0ZlZWRiYWNrJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25tZW50LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInZpZXctYnRuIGN1cnNvci1wb2ludGVyIGZsZXggYWxpZ24tY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVZpZXdGZWVkYmFjayhhc3NpZ25tZW50KVwiPnt7ICd1c2VyQXNzaWdubWVudHMudmlld0ZlZWRiYWNrJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjLWljb25cIiAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kXCJcbiAgICAgICAgICAoY2xpY2spPVwiYXNzaWdubWVudC5leHBhbmQgPSAhYXNzaWdubWVudC5leHBhbmRcIj5cbiAgICAgICAgICBjbG9zZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gZmxleC1jb2wgbXQtNCBmZWVkYmFjay1jb250YWluZXJcIlxuICAgICAgICAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kICYmIGFzc2lnbm1lbnQ/LnN1Ym1pc3Npb25NZXRhPy5tYXJrc0dpdmVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGQgZm9udC1zdHlsZVwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7eyAndXNlckFzc2lnbm1lbnRzLm1hcmtzT2J0YWluZWQnIHwgdHJhbnNsYXRlIH19IC0ge3tnZXRNYXJrcyhhc3NpZ25tZW50Py5zdWJtaXNzaW9uTWV0YSl9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBmb250LXN0eWxlXCI+e3sgJ3VzZXJBc3NpZ25tZW50cy5pbnN0cnVjdG9yRmVlZGJhY2snIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXN0eWxlXCI+XG4gICAgICAgICAge3thc3NpZ25tZW50Py5zdWJtaXNzaW9uTWV0YT8uaW5zdHJ1Y3RvckZlZWRiYWNrfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTQgbG9hZGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiM1wiIFtkaWFtZXRlcl09XCI1MFwiIFtzdHlsZS5zdHJva2VdPVwiJyMxQjRDQTEnXCIgY2xhc3M9XCJibHVlLXNwaW5uZXJcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+XG5cblxuPCEtLSBObyB0ZWFjaGVycyByZXNvdXJjZXMgbWVzc2FnZSAtLT5cbjxkaXYgKm5nSWY9XCJhc3NpZ25tZW50cz8ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXNvdXJjZXMtbWVzc2FnZSBtdC00XCI+XG4gIHt7ICd1c2VyQXNzaWdubWVudHMubm9Bc3NpZ25tZW50cycgfCB0cmFuc2xhdGUgfX1cbjwvZGl2PiJdfQ==
1
+ import { Component, Input } from '@angular/core';
2
+ import { ConfirmationDialogComponent } from '@sunbird-cb/consumption';
3
+ import * as _ from 'lodash';
4
+ import { AssignmentViewerV2Component } from '../app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/router";
7
+ import * as i2 from "@angular/material/legacy-snack-bar";
8
+ import * as i3 from "../../../../services/app-toc.service";
9
+ import * as i4 from "@sunbird-cb/utils-v2";
10
+ import * as i5 from "@angular/material/dialog";
11
+ import * as i6 from "@angular/material/legacy-dialog";
12
+ import * as i7 from "@angular/common";
13
+ import * as i8 from "@angular/material/icon";
14
+ import * as i9 from "@angular/material/progress-spinner";
15
+ import * as i10 from "@ngx-translate/core";
16
+ export class AppTocBatchAssignmentsComponent {
17
+ constructor(router, snackBar, tocSvc, configSvc, dialog, dialogLegacy, route) {
18
+ this.router = router;
19
+ this.snackBar = snackBar;
20
+ this.tocSvc = tocSvc;
21
+ this.configSvc = configSvc;
22
+ this.dialog = dialog;
23
+ this.dialogLegacy = dialogLegacy;
24
+ this.route = route;
25
+ this.assignments = [];
26
+ this.allowType = ['.pdf'];
27
+ this.isLoading = false;
28
+ this.submissions = [];
29
+ this.batchId = this.route.snapshot.queryParams.batchId ?
30
+ this.route.snapshot.queryParams.batchId : '';
31
+ }
32
+ ngOnInit() {
33
+ this.fetchAssignments();
34
+ }
35
+ getUserAssignmentStatus() {
36
+ if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
37
+ const request = {
38
+ filters: {
39
+ contextId: this.content.identifier,
40
+ submittedBy: this.configSvc.userProfile.userId
41
+ }
42
+ };
43
+ this.tocSvc.getAssignmentStatus(request).subscribe((response) => {
44
+ this.submissions = _.get(response, 'result.response.content', []);
45
+ console.log('submissions', this.submissions);
46
+ this.processAssignmentsWithStatus();
47
+ }, error => {
48
+ console.error('Error fetching assignment status', error);
49
+ });
50
+ }
51
+ }
52
+ processAssignmentsWithStatus() {
53
+ this.assignments = this.assignments.map((assignment) => ({
54
+ ...assignment,
55
+ expand: false,
56
+ downloading: false,
57
+ enableDownload: false,
58
+ answerURL: this.submissions.find(sub => sub.formId === assignment.formId)?.submitUrl || '',
59
+ status: this.submissions.find(sub => sub.formId === assignment.formId)?.status || 'PENDING',
60
+ enableView: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED',
61
+ submissionMeta: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED' ? this.submissions.find(sub => sub.formId === assignment.formId)?.submissionMeta : {}
62
+ }));
63
+ }
64
+ fetchAssignments() {
65
+ const payload = {
66
+ query: '',
67
+ filters: {
68
+ "additionalProperties.batchId": this.batchId,
69
+ },
70
+ };
71
+ this.tocSvc.searchAssignments(payload).subscribe((response) => {
72
+ let assignments = _.get(response, 'result.response.content', []);
73
+ this.assignments = assignments.map((assignment) => ({
74
+ ...assignment,
75
+ expand: false,
76
+ downloading: false,
77
+ enableView: false,
78
+ enableDownload: false,
79
+ answerURL: '',
80
+ status: '',
81
+ submissionMeta: {}
82
+ }));
83
+ this.getUserAssignmentStatus();
84
+ }, error => {
85
+ console.error('Error fetching assignments', error);
86
+ });
87
+ }
88
+ handleViewFeedback(assignment) {
89
+ assignment.expand = true;
90
+ }
91
+ downloadFile(assignment) {
92
+ assignment.downloading = true;
93
+ assignment.enableDownload = true;
94
+ this.selectedAssignment = assignment;
95
+ this.downloadFileWithFetch(assignment);
96
+ }
97
+ downloadFileDirectly(assignment) {
98
+ if (assignment.additionalProperties.assignmentUrl) {
99
+ window.open(assignment.additionalProperties.assignmentUrl, '_blank');
100
+ assignment.downloading = false;
101
+ }
102
+ }
103
+ async downloadFileWithFetch(assignment) {
104
+ if (!assignment.additionalProperties.assignmentUrl)
105
+ return;
106
+ try {
107
+ const response = await fetch(assignment.additionalProperties.assignmentUrl);
108
+ if (!response.ok) {
109
+ throw new Error('Network response was not ok');
110
+ }
111
+ const blob = await response.blob();
112
+ const url = window.URL.createObjectURL(blob);
113
+ const link = document.createElement('a');
114
+ link.href = url;
115
+ link.download = this.extractFilenameFromUrl(assignment.additionalProperties.assignmentUrl) || `${assignment.title}.pdf`;
116
+ document.body.appendChild(link);
117
+ link.click();
118
+ document.body.removeChild(link);
119
+ window.URL.revokeObjectURL(url);
120
+ assignment.downloading = false;
121
+ }
122
+ catch (error) {
123
+ console.error('Download failed:', error);
124
+ this.downloadFileDirectly(assignment);
125
+ }
126
+ }
127
+ triggerFileUpload(assignment) {
128
+ this.selectedAssignment = assignment;
129
+ if (assignment.answerURL) {
130
+ this.submitAssignment(assignment);
131
+ }
132
+ else {
133
+ const fileInput = document.getElementById('sResourceFile');
134
+ if (fileInput) {
135
+ fileInput.click();
136
+ }
137
+ }
138
+ }
139
+ submitAssignment(assessment) {
140
+ console.log('Submit assignment clicked', assessment);
141
+ const dialgoData = {
142
+ description: 'You have already uploaded an assignment. Choose an option below to either keep your current submission or upload a new file.',
143
+ type: 'warning',
144
+ buttonsPositionClass: 'justify-center items-center',
145
+ buttons: [
146
+ {
147
+ classes: 'btn-out-line',
148
+ text: 'Re-upload',
149
+ response: 0
150
+ },
151
+ {
152
+ classes: 'succes-button',
153
+ text: 'Keep Submission',
154
+ response: 1
155
+ }
156
+ ]
157
+ };
158
+ const dialogRef = this.dialogLegacy.open(ConfirmationDialogComponent, {
159
+ data: dialgoData,
160
+ disableClose: false,
161
+ width: '400px',
162
+ maxWidth: '90vw'
163
+ });
164
+ dialogRef.afterClosed().subscribe((result) => {
165
+ if (result === 1) {
166
+ //this.viewAssignments(assessment.answerURL)
167
+ this.previewAssignments(assessment.answerURL);
168
+ }
169
+ else if (result === 0) {
170
+ const fileInput = document.getElementById('sResourceFile');
171
+ if (fileInput) {
172
+ fileInput.click();
173
+ }
174
+ }
175
+ });
176
+ }
177
+ fileInputEmit(fileInput) {
178
+ if (!fileInput || fileInput.length === 0) {
179
+ return;
180
+ }
181
+ const file = fileInput[0];
182
+ if (this.checkFileType(file)) {
183
+ this.upload(file);
184
+ }
185
+ }
186
+ async upload(file) {
187
+ this.resourceFileAdded = file;
188
+ this.isLoading = true;
189
+ try {
190
+ const uploadRes = await this.tocSvc.uploadAssignmentAnswer(this.content.identifier, this.batchId, this.selectedAssignment.formId, file).toPromise();
191
+ if (uploadRes && uploadRes.responseCode === 'OK') {
192
+ this.openSnackbar('File uploaded successfully');
193
+ this.previewAssignments(uploadRes.result.url);
194
+ }
195
+ else {
196
+ this.isLoading = false;
197
+ this.openSnackbar('File upload failed. Please try again.');
198
+ }
199
+ }
200
+ catch (error) {
201
+ this.isLoading = false;
202
+ console.error('Upload API error:', error);
203
+ this.openSnackbar('File upload failed. Please try again.');
204
+ }
205
+ }
206
+ previewAssignments(result) {
207
+ this.isLoading = false;
208
+ this.callingViewAssignments(result);
209
+ }
210
+ callingViewAssignments(url) {
211
+ const dialogRef = this.dialog.open(AssignmentViewerV2Component, {
212
+ width: '40%',
213
+ disableClose: true,
214
+ panelClass: 'dialog_sidenav',
215
+ data: {
216
+ assessment: this.selectedAssignment,
217
+ url: url,
218
+ contentId: this.content.identifier,
219
+ batchId: this.batchId,
220
+ }
221
+ });
222
+ dialogRef.afterClosed().subscribe(result => {
223
+ setTimeout(() => {
224
+ this.fetchAssignments();
225
+ }, 1000);
226
+ console.log(result);
227
+ });
228
+ }
229
+ checkFileType(file) {
230
+ let flag = false;
231
+ if (file && file.size) {
232
+ const fileInMB = Math.floor(file.size / (1024 * 1024));
233
+ if (fileInMB > 5) {
234
+ this.openSnackbar('File size exceeds 5 MB limit. Please upload a smaller file.');
235
+ return false;
236
+ }
237
+ }
238
+ if (file && this.allowType && this.allowType.length > 0) {
239
+ this.allowType.forEach((ele) => {
240
+ if (file.name.toLowerCase().endsWith(ele)) {
241
+ flag = true;
242
+ }
243
+ });
244
+ }
245
+ if (!flag) {
246
+ this.openSnackbar('Invalid file type uploaded. Please upload supporting format only.');
247
+ }
248
+ this.fileExtention = file.name.toLowerCase().substring(file.name.lastIndexOf('.'));
249
+ if (file) {
250
+ if (['.pdf'].includes(this.fileExtention)) {
251
+ flag = true;
252
+ }
253
+ else {
254
+ flag = false;
255
+ }
256
+ if (!flag) {
257
+ this.openSnackbar('Invalid file type uploaded. Please upload PDF format only.');
258
+ }
259
+ }
260
+ return flag;
261
+ }
262
+ getMarks(submissionMeta) {
263
+ if (submissionMeta?.marksGiven != null && submissionMeta?.maximumMarks != null) {
264
+ return `${submissionMeta.marksGiven}` + '/' + `${submissionMeta.maximumMarks}`;
265
+ }
266
+ else if (submissionMeta?.marksGiven != null) {
267
+ return `${submissionMeta.marksGiven}`;
268
+ }
269
+ else {
270
+ return 'N/A';
271
+ }
272
+ }
273
+ openSnackbar(primaryMsg, duration = 5000) {
274
+ this.snackBar.open(primaryMsg, 'X', {
275
+ duration,
276
+ });
277
+ }
278
+ extractFilenameFromUrl(url) {
279
+ try {
280
+ const urlParts = url.split('/');
281
+ const filename = urlParts[urlParts.length - 1];
282
+ return filename.includes('.') ? filename : '';
283
+ }
284
+ catch (error) {
285
+ return '';
286
+ }
287
+ }
288
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, deps: [{ token: i1.Router }, { token: i2.MatLegacySnackBar }, { token: i3.AppTocService }, { token: i4.ConfigurationsService }, { token: i5.MatDialog }, { token: i6.MatLegacyDialog }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
289
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocBatchAssignmentsComponent, selector: "ws-widget-app-batch-assignments", inputs: { content: "content" }, ngImport: i0, template: "<div class=\"guide-container\">\r\n <div class=\"flex flex row\">\r\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\r\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\r\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\r\n <div class=\"guide-card\">\r\n <div class=\"content flex gap-4 justify-between flex-middle\">\r\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\r\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\r\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\r\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\r\n </span>\r\n <span *ngIf=\"!assignment.downloading\">\r\n {{ 'userAssignments.download' | translate }}\r\n </span>\r\n </button>\r\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\"\r\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\r\n Upload\r\n </button> -->\r\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\r\n (change)=\"fileInputEmit(resourceFile.files)\">\r\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\r\n }}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\r\n </ng-container>\r\n\r\n </div>\r\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\r\n (click)=\"assignment.expand = !assignment.expand\">\r\n close\r\n </mat-icon>\r\n </div>\r\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\r\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\r\n <div class=\"font-bold font-style\">\r\n <div>\r\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\r\n </div>\r\n </div>\r\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\r\n <div class=\"font-style\">\r\n {{assignment?.submissionMeta?.instructorFeedback}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n</div>\r\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\r\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\r\n</div>\r\n\r\n\r\n<!-- No teachers resources message -->\r\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\r\n {{ 'userAssignments.noAssignments' | translate }}\r\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
290
+ }
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, decorators: [{
292
+ type: Component,
293
+ args: [{ selector: 'ws-widget-app-batch-assignments', template: "<div class=\"guide-container\">\r\n <div class=\"flex flex row\">\r\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\r\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\r\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\r\n <div class=\"guide-card\">\r\n <div class=\"content flex gap-4 justify-between flex-middle\">\r\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\r\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\r\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\r\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\r\n </span>\r\n <span *ngIf=\"!assignment.downloading\">\r\n {{ 'userAssignments.download' | translate }}\r\n </span>\r\n </button>\r\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\"\r\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\r\n Upload\r\n </button> -->\r\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\r\n (change)=\"fileInputEmit(resourceFile.files)\">\r\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\r\n }}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\r\n </ng-container>\r\n\r\n </div>\r\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\r\n (click)=\"assignment.expand = !assignment.expand\">\r\n close\r\n </mat-icon>\r\n </div>\r\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\r\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\r\n <div class=\"font-bold font-style\">\r\n <div>\r\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\r\n </div>\r\n </div>\r\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\r\n <div class=\"font-style\">\r\n {{assignment?.submissionMeta?.instructorFeedback}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n</div>\r\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\r\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\r\n</div>\r\n\r\n\r\n<!-- No teachers resources message -->\r\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\r\n {{ 'userAssignments.noAssignments' | translate }}\r\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"] }]
294
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.MatLegacySnackBar }, { type: i3.AppTocService }, { type: i4.ConfigurationsService }, { type: i5.MatDialog }, { type: i6.MatLegacyDialog }, { type: i1.ActivatedRoute }]; }, propDecorators: { content: [{
295
+ type: Input
296
+ }] } });
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzL2FwcC10b2MtYmF0Y2gtYXNzaWdubWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBTXhELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXJFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFBOzs7Ozs7Ozs7Ozs7QUFRbEgsTUFBTSxPQUFPLCtCQUErQjtJQWExQyxZQUFtQixNQUFjLEVBQ3ZCLFFBQTJCLEVBQzVCLE1BQXFCLEVBQ3JCLFNBQWdDLEVBQy9CLE1BQWlCLEVBQ2pCLFlBQTZCLEVBQzdCLEtBQXFCO1FBTlosV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLFVBQUssR0FB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WUFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQzlDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7U0FDOUM7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFBO1NBQ1Y7SUFDSCxDQUFDOytHQXhTVSwrQkFBK0I7bUdBQS9CLCtCQUErQix1R0NqQjVDLDI1SUFnRk07OzRGRC9ETywrQkFBK0I7a0JBTjNDLFNBQVM7K0JBQ0UsaUNBQWlDO2dSQU9sQyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnXHJcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcidcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXHJcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xyXG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwLXRvYy1hc3NpZ25tZW50LXZpZXdlclYyL2FwcC10b2MtYXNzaWdubWVudC12aWV3ZXJWMi5jb21wb25lbnQnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtYmF0Y2gtYXNzaWdubWVudHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQXBwVG9jQmF0Y2hBc3NpZ25tZW50c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IGFueVxyXG4gIGFzc2lnbm1lbnRzOiBhbnlbXSA9IFtdXHJcbiAgYWxsb3dUeXBlOiBzdHJpbmdbXSA9IFsnLnBkZiddXHJcbiAgZmlsZUV4dGVudGlvbjogYW55XHJcbiAgcmVzb3VyY2VGaWxlQWRkZWQ6IGFueVxyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlXHJcbiAgc2VsZWN0ZWRBc3NpZ25tZW50OiBhbnlcclxuICBiYXRjaElkOiBhbnlcclxuICBzdWJtaXNzaW9uczogYW55W10gPSBbXVxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0TGVnYWN5U25hY2tCYXIsXHJcbiAgICBwdWJsaWMgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgZGlhbG9nTGVnYWN5OiBNYXRMZWdhY3lEaWFsb2csXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICApIHtcclxuICAgIHRoaXMuYmF0Y2hJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA/XHJcbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZmV0Y2hBc3NpZ25tZW50cygpXHJcbiAgfVxyXG5cclxuICBnZXRVc2VyQXNzaWdubWVudFN0YXR1cygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQpIHtcclxuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICBjb250ZXh0SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgICAgc3VibWl0dGVkQnk6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRvY1N2Yy5nZXRBc3NpZ25tZW50U3RhdHVzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3VibWlzc2lvbnMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JywgW10pXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3N1Ym1pc3Npb25zJywgdGhpcy5zdWJtaXNzaW9ucylcclxuICAgICAgICB0aGlzLnByb2Nlc3NBc3NpZ25tZW50c1dpdGhTdGF0dXMoKVxyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYXNzaWdubWVudCBzdGF0dXMnLCBlcnJvcilcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2Nlc3NBc3NpZ25tZW50c1dpdGhTdGF0dXMoKSB7XHJcbiAgICB0aGlzLmFzc2lnbm1lbnRzID0gdGhpcy5hc3NpZ25tZW50cy5tYXAoKGFzc2lnbm1lbnQ6IGFueSkgPT4gKHtcclxuICAgICAgLi4uYXNzaWdubWVudCxcclxuICAgICAgZXhwYW5kOiBmYWxzZSxcclxuICAgICAgZG93bmxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICBlbmFibGVEb3dubG9hZDogZmFsc2UsXHJcbiAgICAgIGFuc3dlclVSTDogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN1Ym1pdFVybCB8fCAnJyxcclxuICAgICAgc3RhdHVzOiB0aGlzLnN1Ym1pc3Npb25zLmZpbmQoc3ViID0+IHN1Yi5mb3JtSWQgPT09IGFzc2lnbm1lbnQuZm9ybUlkKT8uc3RhdHVzIHx8ICdQRU5ESU5HJyxcclxuICAgICAgZW5hYmxlVmlldzogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCcsXHJcbiAgICAgIHN1Ym1pc3Npb25NZXRhOiB0aGlzLnN1Ym1pc3Npb25zLmZpbmQoc3ViID0+IHN1Yi5mb3JtSWQgPT09IGFzc2lnbm1lbnQuZm9ybUlkKT8uc3RhdHVzID09PSAnRVZBTFVBVEVEJyA/IHRoaXMuc3VibWlzc2lvbnMuZmluZChzdWIgPT4gc3ViLmZvcm1JZCA9PT0gYXNzaWdubWVudC5mb3JtSWQpPy5zdWJtaXNzaW9uTWV0YSA6IHt9XHJcbiAgICB9KSlcclxuICB9XHJcbiAgZmV0Y2hBc3NpZ25tZW50cygpIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcXVlcnk6ICcnLFxyXG4gICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllcy5iYXRjaElkXCI6IHRoaXMuYmF0Y2hJZCxcclxuICAgICAgfSxcclxuICAgIH1cclxuICAgIHRoaXMudG9jU3ZjLnNlYXJjaEFzc2lnbm1lbnRzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgYXNzaWdubWVudHMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JywgW10pXHJcbiAgICAgIHRoaXMuYXNzaWdubWVudHMgPSBhc3NpZ25tZW50cy5tYXAoKGFzc2lnbm1lbnQ6IGFueSkgPT4gKHtcclxuICAgICAgICAuLi5hc3NpZ25tZW50LFxyXG4gICAgICAgIGV4cGFuZDogZmFsc2UsXHJcbiAgICAgICAgZG93bmxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZVZpZXc6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZURvd25sb2FkOiBmYWxzZSxcclxuICAgICAgICBhbnN3ZXJVUkw6ICcnLFxyXG4gICAgICAgIHN0YXR1czogJycsXHJcbiAgICAgICAgc3VibWlzc2lvbk1ldGE6IHt9XHJcbiAgICAgIH0pKVxyXG4gICAgICB0aGlzLmdldFVzZXJBc3NpZ25tZW50U3RhdHVzKClcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYXNzaWdubWVudHMnLCBlcnJvcilcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudDogYW55KSB7XHJcbiAgICBhc3NpZ25tZW50LmV4cGFuZCA9IHRydWVcclxuICB9XHJcblxyXG4gIGRvd25sb2FkRmlsZShhc3NpZ25tZW50OiBhbnkpIHtcclxuICAgIGFzc2lnbm1lbnQuZG93bmxvYWRpbmcgPSB0cnVlXHJcbiAgICBhc3NpZ25tZW50LmVuYWJsZURvd25sb2FkID0gdHJ1ZVxyXG4gICAgdGhpcy5zZWxlY3RlZEFzc2lnbm1lbnQgPSBhc3NpZ25tZW50XHJcbiAgICB0aGlzLmRvd25sb2FkRmlsZVdpdGhGZXRjaChhc3NpZ25tZW50KVxyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRGaWxlRGlyZWN0bHkoYXNzaWdubWVudDogYW55KSB7XHJcbiAgICBpZiAoYXNzaWdubWVudC5hZGRpdGlvbmFsUHJvcGVydGllcy5hc3NpZ25tZW50VXJsKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybCwgJ19ibGFuaycpXHJcbiAgICAgIGFzc2lnbm1lbnQuZG93bmxvYWRpbmcgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZG93bmxvYWRGaWxlV2l0aEZldGNoKGFzc2lnbm1lbnQ6IGFueSkge1xyXG4gICAgaWYgKCFhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHJldHVyblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpXHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvaycpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKVxyXG4gICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgIGxpbmsuaHJlZiA9IHVybFxyXG4gICAgICBsaW5rLmRvd25sb2FkID0gdGhpcy5leHRyYWN0RmlsZW5hbWVGcm9tVXJsKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybCkgfHwgYCR7YXNzaWdubWVudC50aXRsZX0ucGRmYFxyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspXHJcbiAgICAgIGxpbmsuY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspXHJcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybClcclxuICAgICAgYXNzaWdubWVudC5kb3dubG9hZGluZyA9IGZhbHNlXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdEb3dubG9hZCBmYWlsZWQ6JywgZXJyb3IpXHJcbiAgICAgIHRoaXMuZG93bmxvYWRGaWxlRGlyZWN0bHkoYXNzaWdubWVudClcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICB0cmlnZ2VyRmlsZVVwbG9hZChhc3NpZ25tZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50ID0gYXNzaWdubWVudFxyXG4gICAgaWYgKGFzc2lnbm1lbnQuYW5zd2VyVVJMKSB7XHJcbiAgICAgIHRoaXMuc3VibWl0QXNzaWdubWVudChhc3NpZ25tZW50KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NSZXNvdXJjZUZpbGUnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpZiAoZmlsZUlucHV0KSB7XHJcbiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzdWJtaXRBc3NpZ25tZW50KGFzc2Vzc21lbnQ6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coJ1N1Ym1pdCBhc3NpZ25tZW50IGNsaWNrZWQnLCBhc3Nlc3NtZW50KVxyXG4gICAgY29uc3QgZGlhbGdvRGF0YSA9IHtcclxuICAgICAgZGVzY3JpcHRpb246ICdZb3UgaGF2ZSBhbHJlYWR5IHVwbG9hZGVkIGFuIGFzc2lnbm1lbnQuIENob29zZSBhbiBvcHRpb24gYmVsb3cgdG8gZWl0aGVyIGtlZXAgeW91ciBjdXJyZW50IHN1Ym1pc3Npb24gb3IgdXBsb2FkIGEgbmV3IGZpbGUuJyxcclxuICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICBidXR0b25zUG9zaXRpb25DbGFzczogJ2p1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlcicsXHJcbiAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjbGFzc2VzOiAnYnRuLW91dC1saW5lJyxcclxuICAgICAgICAgIHRleHQ6ICdSZS11cGxvYWQnLFxyXG4gICAgICAgICAgcmVzcG9uc2U6IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNsYXNzZXM6ICdzdWNjZXMtYnV0dG9uJyxcclxuICAgICAgICAgIHRleHQ6ICdLZWVwIFN1Ym1pc3Npb24nLFxyXG4gICAgICAgICAgcmVzcG9uc2U6IDFcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nTGVnYWN5Lm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IGRpYWxnb0RhdGEsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAnNDAwcHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzkwdncnXHJcbiAgICB9KVxyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gMSkge1xyXG4gICAgICAgIC8vdGhpcy52aWV3QXNzaWdubWVudHMoYXNzZXNzbWVudC5hbnN3ZXJVUkwpXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3QXNzaWdubWVudHMoYXNzZXNzbWVudC5hbnN3ZXJVUkwpXHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NSZXNvdXJjZUZpbGUnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlmIChmaWxlSW5wdXQpIHtcclxuICAgICAgICAgIGZpbGVJbnB1dC5jbGljaygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmlsZUlucHV0RW1pdChmaWxlSW5wdXQ6IEZpbGVMaXN0IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKCFmaWxlSW5wdXQgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGZpbGUgPSBmaWxlSW5wdXRbMF1cclxuICAgIGlmICh0aGlzLmNoZWNrRmlsZVR5cGUoZmlsZSkpIHtcclxuICAgICAgdGhpcy51cGxvYWQoZmlsZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZChmaWxlOiBhbnkpIHtcclxuICAgIHRoaXMucmVzb3VyY2VGaWxlQWRkZWQgPSBmaWxlXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cGxvYWRSZXM6IGFueSA9IGF3YWl0IHRoaXMudG9jU3ZjLnVwbG9hZEFzc2lnbm1lbnRBbnN3ZXIoXHJcbiAgICAgICAgdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXHJcbiAgICAgICAgdGhpcy5iYXRjaElkLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50LmZvcm1JZCxcclxuICAgICAgICBmaWxlXHJcbiAgICAgICkudG9Qcm9taXNlKClcclxuXHJcbiAgICAgIGlmICh1cGxvYWRSZXMgJiYgdXBsb2FkUmVzLnJlc3BvbnNlQ29kZSA9PT0gJ09LJykge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseScpXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3QXNzaWdubWVudHModXBsb2FkUmVzLnJlc3VsdC51cmwpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZCBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwbG9hZCBBUEkgZXJyb3I6JywgZXJyb3IpXHJcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZCBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByZXZpZXdBc3NpZ25tZW50cyhyZXN1bHQ6IGFueSkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5jYWxsaW5nVmlld0Fzc2lnbm1lbnRzKHJlc3VsdClcclxuICB9XHJcblxyXG4gIGNhbGxpbmdWaWV3QXNzaWdubWVudHModXJsOiBhbnkpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50LCB7XHJcbiAgICAgIHdpZHRoOiAnNDAlJyxcclxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICBwYW5lbENsYXNzOiAnZGlhbG9nX3NpZGVuYXYnLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgYXNzZXNzbWVudDogdGhpcy5zZWxlY3RlZEFzc2lnbm1lbnQsXHJcbiAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgY29udGVudElkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcclxuICAgICAgICBiYXRjaElkOiB0aGlzLmJhdGNoSWQsXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mZXRjaEFzc2lnbm1lbnRzKClcclxuICAgICAgfSwgMTAwMClcclxuICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBjaGVja0ZpbGVUeXBlKGZpbGU6IEZpbGUpIHtcclxuICAgIGxldCBmbGFnID0gZmFsc2VcclxuICAgIGlmIChmaWxlICYmIGZpbGUuc2l6ZSkge1xyXG4gICAgICBjb25zdCBmaWxlSW5NQiA9IE1hdGguZmxvb3IoZmlsZS5zaXplIC8gKDEwMjQgKiAxMDI0KSlcclxuICAgICAgaWYgKGZpbGVJbk1CID4gNSkge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHNpemUgZXhjZWVkcyA1IE1CIGxpbWl0LiBQbGVhc2UgdXBsb2FkIGEgc21hbGxlciBmaWxlLicpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmaWxlICYmIHRoaXMuYWxsb3dUeXBlICYmIHRoaXMuYWxsb3dUeXBlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5hbGxvd1R5cGUuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZWxlKSkge1xyXG4gICAgICAgICAgZmxhZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAoIWZsYWcpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0ludmFsaWQgZmlsZSB0eXBlIHVwbG9hZGVkLiBQbGVhc2UgdXBsb2FkIHN1cHBvcnRpbmcgZm9ybWF0IG9ubHkuJylcclxuICAgIH1cclxuICAgIHRoaXMuZmlsZUV4dGVudGlvbiA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZyhmaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSlcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGlmIChbJy5wZGYnXS5pbmNsdWRlcyh0aGlzLmZpbGVFeHRlbnRpb24pKSB7XHJcbiAgICAgICAgZmxhZyA9IHRydWVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmbGFnID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWZsYWcpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignSW52YWxpZCBmaWxlIHR5cGUgdXBsb2FkZWQuIFBsZWFzZSB1cGxvYWQgUERGIGZvcm1hdCBvbmx5LicpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmbGFnXHJcbiAgfVxyXG5cclxuICBnZXRNYXJrcyhzdWJtaXNzaW9uTWV0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmIChzdWJtaXNzaW9uTWV0YT8ubWFya3NHaXZlbiAhPSBudWxsICYmIHN1Ym1pc3Npb25NZXRhPy5tYXhpbXVtTWFya3MgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gYCR7c3VibWlzc2lvbk1ldGEubWFya3NHaXZlbn1gICsgJy8nICsgYCR7c3VibWlzc2lvbk1ldGEubWF4aW11bU1hcmtzfWBcclxuICAgIH0gZWxzZSBpZiAoc3VibWlzc2lvbk1ldGE/Lm1hcmtzR2l2ZW4gIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gYCR7c3VibWlzc2lvbk1ldGEubWFya3NHaXZlbn1gXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ04vQSdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5TbmFja2JhcihwcmltYXJ5TXNnOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIgPSA1MDAwKSB7XHJcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocHJpbWFyeU1zZywgJ1gnLCB7XHJcbiAgICAgIGR1cmF0aW9uLFxyXG4gICAgfSlcclxuICB9XHJcbiAgZXh0cmFjdEZpbGVuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdCgnLycpXHJcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdXJsUGFydHNbdXJsUGFydHMubGVuZ3RoIC0gMV1cclxuICAgICAgcmV0dXJuIGZpbGVuYW1lLmluY2x1ZGVzKCcuJykgPyBmaWxlbmFtZSA6ICcnXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImd1aWRlLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXggcm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5mby1iYW5uZXIgaW5mby1iYW5uZXItd2FybmluZyBmbGV4IGZsZXgtcm93IGl0bS1jZW50ZXJcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uIG1hcmdpbi1yaWdodC1zIGFzc2lnbm1lbnQtbm90ZS1pY29uXCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYXNzaWdubWVudC1ub3RlXCI+IHt7ICd1c2VyQXNzaWdubWVudHMubm90ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhc3NpZ25tZW50IG9mIGFzc2lnbm1lbnRzOyBpbmRleCBhcyBpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ3VpZGUtY2FyZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudCBmbGV4IGdhcC00IGp1c3RpZnktYmV0d2VlbiBmbGV4LW1pZGRsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlLXRpdGxlXCI+e3tpICsgMX19LiB7e2Fzc2lnbm1lbnQudGl0bGV9fSA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSBnYXAtM1wiICpuZ0lmPVwiIWFzc2lnbm1lbnQuZXhwYW5kXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJkb3dubG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGFzc2lnbm1lbnQpXCIgW2Rpc2FibGVkXT1cImFzc2lnbm1lbnQuZG93bmxvYWRpbmdcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJhc3NpZ25tZW50LmRvd25sb2FkaW5nXCIgY2xhc3M9XCJ3aGl0ZS1zcGlubmVyXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cIm1yLTJcIiBbc3R5bGUuY29sb3JdPVwiJ3doaXRlJ1wiIHN0cm9rZVdpZHRoPVwiMlwiPjwvbWF0LXNwaW5uZXI+RG93bmxvYWRcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFhc3NpZ25tZW50LmRvd25sb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy5kb3dubG9hZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdEUkFGVCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidXBsb2FkLWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQpXCI+XHJcbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy51cGxvYWQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgIT09ICdEUkFGVCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidXBsb2FkLWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdTVUJNSVRURUQnIHx8IGFzc2lnbm1lbnQuc3RhdHVzID09PSAnRVZBTFVBVEVEJyB8fCAhYXNzaWdubWVudC5lbmFibGVEb3dubG9hZFwiPlxyXG4gICAgICAgICAgICAgIHt7ICd1c2VyQXNzaWdubWVudHMudXBsb2FkJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJ1cGxvYWQtYnRuIGN1cnNvci1wb2ludGVyIGZsZXggYWxpZ24tY2VudGVyIGp1c3RpZnktY2VudGVyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQpXCIgW2Rpc2FibGVkXT1cIiFhc3NpZ25tZW50LmVuYWJsZURvd25sb2FkXCI+XHJcbiAgICAgICAgICAgIFVwbG9hZFxyXG4gICAgICAgICAgPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgPGlucHV0ICNyZXNvdXJjZUZpbGUgdHlwZT1cImZpbGVcIiBuYW1lPVwic1Jlc291cmNlRmlsZVwiIGlkPVwic1Jlc291cmNlRmlsZVwiIGNsYXNzPVwiaGlkZGVuXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlSW5wdXRFbWl0KHJlc291cmNlRmlsZS5maWxlcylcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25tZW50LnN0YXR1cyA9PT0gJ1NVQk1JVFRFRCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidmlldy1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudClcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPnt7ICd1c2VyQXNzaWdubWVudHMudmlld0ZlZWRiYWNrJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgIH19PC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25tZW50LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidmlldy1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudClcIj57eyAndXNlckFzc2lnbm1lbnRzLnZpZXdGZWVkYmFjaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjLWljb25cIiAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kXCJcclxuICAgICAgICAgIChjbGljayk9XCJhc3NpZ25tZW50LmV4cGFuZCA9ICFhc3NpZ25tZW50LmV4cGFuZFwiPlxyXG4gICAgICAgICAgY2xvc2VcclxuICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGZsZXgtY29sIG10LTQgZmVlZGJhY2stY29udGFpbmVyXCJcclxuICAgICAgICAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kICYmIGFzc2lnbm1lbnQ/LnN1Ym1pc3Npb25NZXRhPy5tYXJrc0dpdmVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBmb250LXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICB7eyAndXNlckFzc2lnbm1lbnRzLm1hcmtzT2J0YWluZWQnIHwgdHJhbnNsYXRlIH19IC0ge3tnZXRNYXJrcyhhc3NpZ25tZW50Py5zdWJtaXNzaW9uTWV0YSl9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBmb250LXN0eWxlXCI+e3sgJ3VzZXJBc3NpZ25tZW50cy5pbnN0cnVjdG9yRmVlZGJhY2snIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc3R5bGVcIj5cclxuICAgICAgICAgIHt7YXNzaWdubWVudD8uc3VibWlzc2lvbk1ldGE/Lmluc3RydWN0b3JGZWVkYmFja319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTQgbG9hZGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICA8bWF0LXNwaW5uZXIgc3Ryb2tlV2lkdGg9XCIzXCIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0eWxlLnN0cm9rZV09XCInIzFCNENBMSdcIiBjbGFzcz1cImJsdWUtc3Bpbm5lclwiPjwvbWF0LXNwaW5uZXI+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gTm8gdGVhY2hlcnMgcmVzb3VyY2VzIG1lc3NhZ2UgLS0+XHJcbjxkaXYgKm5nSWY9XCJhc3NpZ25tZW50cz8ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXNvdXJjZXMtbWVzc2FnZSBtdC00XCI+XHJcbiAge3sgJ3VzZXJBc3NpZ25tZW50cy5ub0Fzc2lnbm1lbnRzJyB8IHRyYW5zbGF0ZSB9fVxyXG48L2Rpdj4iXX0=