@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,278 +1,278 @@
1
- import { Component, Input } from '@angular/core';
2
- import { VIEWER_ROUTE_FROM_MIME } from '../../../../_services/viewer-route-util';
3
- import { NsContent, WsEvents } from '@sunbird-cb/utils-v2';
4
- import * as fileSaver from 'file-saver';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/router";
7
- import * as i2 from "@sunbird-cb/utils-v2";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "@angular/material/icon";
10
- import * as i5 from "@angular/material/progress-spinner";
11
- import * as i6 from "@ngx-translate/core";
12
- export class AppTocTeachersNotesComponent {
13
- constructor(router, eventSvc) {
14
- this.router = router;
15
- this.eventSvc = eventSvc;
16
- this.primaryCategory = NsContent.EPrimaryCategory;
17
- this.downloadInProgress = {};
18
- this.isDownloadingAll = false;
19
- this.forPreview = false;
20
- this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
21
- }
22
- ngOnInit() { }
23
- raiseDownloadAllTelemetry(subType) {
24
- const event = {
25
- eventType: WsEvents.WsEventType.Telemetry,
26
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
27
- data: {
28
- edata: {
29
- type: "click",
30
- id: this.notesDisplayType == 'Reference Resource' ? "teachers-note" : "reference-note",
31
- pageid: `/app/toc/${this.content?.identifier}`,
32
- subType: subType,
33
- },
34
- object: {
35
- id: this.content?.identifier,
36
- type: this.content?.courseCategory,
37
- },
38
- state: WsEvents.EnumTelemetrySubType.Interact,
39
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
40
- mode: 'view',
41
- },
42
- pageContext: {
43
- pageId: `/app/toc/${this.content?.identifier}`,
44
- module: this.notesDisplayType == 'Reference Resource' ? 'Amrit Gyaan Kosh' : 'Learn'
45
- },
46
- from: '',
47
- to: 'Telemetry',
48
- };
49
- this.eventSvc.dispatchChatbotEvent(event);
50
- }
51
- downloadPDF(contentData) {
52
- if (!contentData?.artifactUrl) {
53
- console.error('No artifact URL provided');
54
- return;
55
- }
56
- this.downloadInProgress[contentData.identifier] = true;
57
- this.downloadFile(contentData.artifactUrl, contentData.name || 'download', contentData.identifier);
58
- this.raiseDownloadAllTelemetry('download');
59
- }
60
- previewContent(contentData) {
61
- this.router.navigate([`/app/amrit-gyaan-kosh/player/${VIEWER_ROUTE_FROM_MIME(contentData.mimeType)}/${contentData.identifier}`], {
62
- queryParams: {
63
- primaryCategory: this.primaryCategory.RESOURCE,
64
- playerPreview: true,
65
- collectionId: this.content.identifier,
66
- },
67
- });
68
- }
69
- downloadAllContent() {
70
- if (!this.content?.referenceNodes?.length) {
71
- return;
72
- }
73
- const teacherResources = this.content.referenceNodes.filter((ele) => ele?.resourceCategory === this.notesDisplayType && ele.artifactUrl);
74
- if (teacherResources.length === 0) {
75
- return;
76
- }
77
- this.isDownloadingAll = true;
78
- let completedCount = 0;
79
- teacherResources.forEach((ele) => {
80
- this.downloadInProgress[ele.identifier] = true;
81
- this.downloadFile(ele.artifactUrl, ele.name || 'download', ele.identifier)
82
- .finally(() => {
83
- completedCount++;
84
- if (completedCount === teacherResources.length) {
85
- this.isDownloadingAll = false;
86
- }
87
- });
88
- });
89
- this.raiseDownloadAllTelemetry('download-all');
90
- }
91
- /**
92
- * Check if any download is currently in progress
93
- */
94
- hasActiveDownloads() {
95
- return this.isDownloadingAll || Object.values(this.downloadInProgress).some(status => status);
96
- }
97
- /**
98
- * Check if content has any teacher resources
99
- */
100
- hasTeacherResources() {
101
- return this.content?.referenceNodes?.some((node) => node?.resourceCategory === this.notesDisplayType) || false;
102
- }
103
- /**
104
- * Download file using multiple methods to ensure compatibility across browsers
105
- * @returns Promise that resolves when download completes or fails
106
- */
107
- downloadFile(url, fileName, identifier) {
108
- // Add file extension if missing
109
- const fileExtension = this.getFileExtension(url);
110
- if (fileExtension && !fileName.toLowerCase().endsWith(fileExtension.toLowerCase())) {
111
- fileName = `${fileName}.${fileExtension}`;
112
- }
113
- // Return a promise to track completion
114
- return new Promise((resolve) => {
115
- // Use fetch API instead of HttpClient for better control over the download
116
- this.downloadInProgress[identifier] = true;
117
- fetch(url, {
118
- method: 'GET',
119
- mode: 'cors',
120
- })
121
- .then(response => {
122
- if (!response.ok) {
123
- throw new Error('Network response was not ok');
124
- }
125
- return response.blob();
126
- })
127
- .then(blob => {
128
- // Create a new blob with the correct MIME type if needed
129
- const contentType = this.getMimeTypeFromUrl(url);
130
- const newBlob = new Blob([blob], { type: contentType });
131
- // Try to save the blob
132
- this.saveBlob(newBlob, fileName);
133
- resolve();
134
- })
135
- .catch(error => {
136
- console.error('Fetch download failed:', error);
137
- // Fallback to XHR which sometimes handles CORS better
138
- this.downloadWithXHR(url, fileName).finally(resolve);
139
- })
140
- .finally(() => {
141
- this.downloadInProgress[identifier] = false;
142
- });
143
- });
144
- }
145
- /**
146
- * Attempt download using XMLHttpRequest as a fallback
147
- */
148
- downloadWithXHR(url, fileName) {
149
- return new Promise((resolve) => {
150
- const xhr = new XMLHttpRequest();
151
- xhr.open('GET', url, true);
152
- xhr.responseType = 'blob';
153
- xhr.onload = () => {
154
- if (xhr.status === 200) {
155
- const contentType = xhr.getResponseHeader('Content-Type') || this.getMimeTypeFromUrl(url);
156
- const blob = new Blob([xhr.response], { type: contentType });
157
- this.saveBlob(blob, fileName);
158
- resolve();
159
- }
160
- else {
161
- console.error('XHR download failed, trying direct iframe method');
162
- this.tryDirectDownload(url, fileName);
163
- resolve();
164
- }
165
- };
166
- xhr.onerror = () => {
167
- console.error('XHR download failed, trying direct iframe method');
168
- this.tryDirectDownload(url, fileName);
169
- resolve();
170
- };
171
- xhr.send();
172
- });
173
- }
174
- getFileExtension(url) {
175
- if (!url)
176
- return '';
177
- const urlParts = url.split('.');
178
- if (urlParts.length > 1) {
179
- return urlParts[urlParts.length - 1].split(/[?#]/)[0].toLowerCase();
180
- }
181
- return '';
182
- }
183
- getMimeTypeFromUrl(url) {
184
- const extension = this.getFileExtension(url);
185
- switch (extension) {
186
- case 'pdf':
187
- return 'application/pdf';
188
- case 'mp4':
189
- return 'video/mp4';
190
- case 'doc':
191
- case 'docx':
192
- return 'application/msword';
193
- case 'xls':
194
- case 'xlsx':
195
- return 'application/vnd.ms-excel';
196
- case 'ppt':
197
- case 'pptx':
198
- return 'application/vnd.ms-powerpoint';
199
- case 'jpg':
200
- case 'jpeg':
201
- return 'image/jpeg';
202
- case 'png':
203
- return 'image/png';
204
- default:
205
- return 'application/octet-stream'; // Default binary mime type
206
- }
207
- }
208
- saveBlob(blob, fileName) {
209
- try {
210
- // For modern browsers using FileSaver
211
- fileSaver.saveAs(blob, fileName);
212
- }
213
- catch (e) {
214
- console.error('FileSaver failed, trying manual download', e);
215
- // Manual download fallback
216
- const url = window.URL.createObjectURL(blob);
217
- const a = document.createElement('a');
218
- a.style.display = 'none';
219
- a.href = url;
220
- a.download = fileName;
221
- document.body.appendChild(a);
222
- a.click();
223
- window.URL.revokeObjectURL(url);
224
- document.body.removeChild(a);
225
- }
226
- }
227
- tryDirectDownload(url, fileName) {
228
- // Use iframe for potentially bypassing CORS issues
229
- const iframe = document.createElement('iframe');
230
- iframe.style.display = 'none';
231
- document.body.appendChild(iframe);
232
- try {
233
- // Construct a download URL
234
- const downloadUrl = url + (url.indexOf('?') === -1 ? '?' : '&') + 'download=true';
235
- // Create a link inside the iframe and click it
236
- const doc = iframe.contentDocument || iframe.contentWindow?.document;
237
- if (doc) {
238
- const a = doc.createElement('a');
239
- a.href = downloadUrl;
240
- a.download = fileName;
241
- a.style.display = 'none';
242
- doc.body.appendChild(a);
243
- a.click();
244
- doc.body.removeChild(a);
245
- }
246
- }
247
- catch (e) {
248
- console.error('Iframe download approach failed:', e);
249
- // Last resort - try download attribute on anchor tag
250
- const a = document.createElement('a');
251
- a.href = url;
252
- a.download = fileName;
253
- a.target = '_self'; // Important: use _self instead of _blank
254
- document.body.appendChild(a);
255
- a.click();
256
- document.body.removeChild(a);
257
- }
258
- finally {
259
- // Clean up the iframe
260
- setTimeout(() => {
261
- if (document.body.contains(iframe)) {
262
- document.body.removeChild(iframe);
263
- }
264
- }, 1000);
265
- }
266
- }
267
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocTeachersNotesComponent, deps: [{ token: i1.Router }, { token: i2.EventService }], target: i0.ɵɵFactoryTarget.Component }); }
268
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocTeachersNotesComponent, selector: "ws-widget-app-toc-teachers-notes", inputs: { content: "content", notesDisplayType: "notesDisplayType" }, ngImport: i0, template: "<div class=\"flex justify-between items-center\">\n <div class=\"teachers-note-header\">{{ 'apptocsinglepage.teachersNoteHeading' | translate }}</div>\n <div>\n <button [disabled]=\"hasActiveDownloads()\" (click)=\"downloadAllContent()\" class=\"download-all flex items-center\">\n <span *ngIf=\"!isDownloadingAll\">{{ 'apptocsinglepage.downaloadAllPdfs' | translate }}</span>\n <span *ngIf=\"isDownloadingAll\" class=\"flex items-center\">\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\n Downloading\n </span>\n </button>\n </div>\n</div>\n\n<div class=\"guide-container\" *ngIf=\"content?.referenceNodes\">\n <ng-container *ngFor=\"let note of content?.referenceNodes\">\n <div class=\"guide-card flex gap-4 justify-between\" *ngIf=\"note?.resourceCategory === notesDisplayType\">\n <div class=\"flex flex-col justify-center\">\n <div class=\"note-title\">{{note?.name}}</div>\n <!-- To remove view option in case of public preview of toc -->\n <ng-container *ngIf=\"!forPreview\">\n <div class=\"flex gap-2 pt-2\">\n <mat-icon class=\"material-symbols-outlined\">\n visibility\n </mat-icon>\n\n <a (click)=\"previewContent(note)\">\n <span class=\"view-pdf\">{{ 'apptocsinglepage.viewPDF' | translate }}</span>\n </a>\n </div>\n </ng-container>\n </div>\n <div>\n <div class=\"download-ind\">\n <a (click)=\"downloadPDF(note)\" class=\"download-link flex items-center\">\n <span *ngIf=\"!downloadInProgress[note.identifier]\">{{ 'apptocsinglepage.downloadPdf' | translate }}</span>\n <span *ngIf=\"downloadInProgress[note.identifier]\" class=\"flex items-center\">\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\n Downloading\n </span>\n </a>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- No teachers resources message -->\n<div *ngIf=\"!hasTeacherResources()\" class=\"no-resources-message mt-4\">\n {{ 'apptocsinglepage.noTeachersResources' | translate }}\n</div>", styles: [".teachers-note-header{font-family:Lato;font-size:14px;font-weight:400;line-height:16.8px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.download-all{padding:0 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;background:transparent;border:none}.guide-container .view-pdf{font-size:14px;cursor:pointer;opacity:.8;color:#000}.guide-container .note-title{font-family:Lato;font-size:16px;font-weight:700;line-height:24px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1}.guide-container .guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.guide-container .download-ind{padding:12px 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;border-radius:40px;border-color:1px solid #c3c3c3}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.download-link{display:inline-flex;align-items:center}.no-resources-message{color:#666;font-style:italic;padding:1rem 0}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
269
- }
270
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocTeachersNotesComponent, decorators: [{
271
- type: Component,
272
- args: [{ selector: 'ws-widget-app-toc-teachers-notes', template: "<div class=\"flex justify-between items-center\">\n <div class=\"teachers-note-header\">{{ 'apptocsinglepage.teachersNoteHeading' | translate }}</div>\n <div>\n <button [disabled]=\"hasActiveDownloads()\" (click)=\"downloadAllContent()\" class=\"download-all flex items-center\">\n <span *ngIf=\"!isDownloadingAll\">{{ 'apptocsinglepage.downaloadAllPdfs' | translate }}</span>\n <span *ngIf=\"isDownloadingAll\" class=\"flex items-center\">\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\n Downloading\n </span>\n </button>\n </div>\n</div>\n\n<div class=\"guide-container\" *ngIf=\"content?.referenceNodes\">\n <ng-container *ngFor=\"let note of content?.referenceNodes\">\n <div class=\"guide-card flex gap-4 justify-between\" *ngIf=\"note?.resourceCategory === notesDisplayType\">\n <div class=\"flex flex-col justify-center\">\n <div class=\"note-title\">{{note?.name}}</div>\n <!-- To remove view option in case of public preview of toc -->\n <ng-container *ngIf=\"!forPreview\">\n <div class=\"flex gap-2 pt-2\">\n <mat-icon class=\"material-symbols-outlined\">\n visibility\n </mat-icon>\n\n <a (click)=\"previewContent(note)\">\n <span class=\"view-pdf\">{{ 'apptocsinglepage.viewPDF' | translate }}</span>\n </a>\n </div>\n </ng-container>\n </div>\n <div>\n <div class=\"download-ind\">\n <a (click)=\"downloadPDF(note)\" class=\"download-link flex items-center\">\n <span *ngIf=\"!downloadInProgress[note.identifier]\">{{ 'apptocsinglepage.downloadPdf' | translate }}</span>\n <span *ngIf=\"downloadInProgress[note.identifier]\" class=\"flex items-center\">\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\n Downloading\n </span>\n </a>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- No teachers resources message -->\n<div *ngIf=\"!hasTeacherResources()\" class=\"no-resources-message mt-4\">\n {{ 'apptocsinglepage.noTeachersResources' | translate }}\n</div>", styles: [".teachers-note-header{font-family:Lato;font-size:14px;font-weight:400;line-height:16.8px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.download-all{padding:0 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;background:transparent;border:none}.guide-container .view-pdf{font-size:14px;cursor:pointer;opacity:.8;color:#000}.guide-container .note-title{font-family:Lato;font-size:16px;font-weight:700;line-height:24px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1}.guide-container .guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.guide-container .download-ind{padding:12px 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;border-radius:40px;border-color:1px solid #c3c3c3}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.download-link{display:inline-flex;align-items:center}.no-resources-message{color:#666;font-style:italic;padding:1rem 0}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}\n"] }]
273
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.EventService }]; }, propDecorators: { content: [{
274
- type: Input
275
- }], notesDisplayType: [{
276
- type: Input
277
- }] } });
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLXRlYWNoZXJzLW5vdGVzL2FwcC10b2MtdGVhY2hlcnMtbm90ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy9hcHAtdG9jLXRlYWNoZXJzLW5vdGVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBRXhELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3hFLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFBOzs7Ozs7OztBQVF2QyxNQUFNLE9BQU8sNEJBQTRCO0lBU3ZDLFlBQW1CLE1BQWMsRUFDeEIsUUFBc0I7UUFEWixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQWM7UUFOL0Isb0JBQWUsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUE7UUFDNUMsdUJBQWtCLEdBQStCLEVBQUUsQ0FBQTtRQUNuRCxxQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQTtRQUtoQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFV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QUUsQ0FBQyxDQUFDLENBQUE7WUFFcEQscURBQXFEO1lBQ3JELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDckMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUE7WUFDWixDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtZQUNyQixDQUFDLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQSxDQUFDLHlDQUF5QztZQUM1RCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDVCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUM3QjtnQkFBUztZQUNSLHNCQUFzQjtZQUN0QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2lCQUNsQztZQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNUO0lBQ0gsQ0FBQzsrR0E5UlUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsOElDWnpDLDZvRUFpRE07OzRGRHJDTyw0QkFBNEI7a0JBTnhDLFNBQVM7K0JBQ0Usa0NBQWtDO3dIQU9uQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IFZJRVdFUl9ST1VURV9GUk9NX01JTUUgfSBmcm9tICcuLi8uLi8uLi8uLi9fc2VydmljZXMvdmlld2VyLXJvdXRlLXV0aWwnXG5pbXBvcnQgeyBFdmVudFNlcnZpY2UsIE5zQ29udGVudCwgV3NFdmVudHMgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcbmltcG9ydCAqIGFzIGZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtYXBwLXRvYy10ZWFjaGVycy1ub3RlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLXRlYWNoZXJzLW5vdGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIEFwcFRvY1RlYWNoZXJzTm90ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGNvbnRlbnQhOiBOc0NvbnRlbnQuSUNvbnRlbnRcbiAgQElucHV0KCkgbm90ZXNEaXNwbGF5VHlwZSE6IHN0cmluZ1xuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBkb3dubG9hZEluUHJvZ3Jlc3M6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cbiAgaXNEb3dubG9hZGluZ0FsbCA9IGZhbHNlXG4gIGZvclByZXZpZXcgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgZXZlbnRTdmM6IEV2ZW50U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxuICB9XG5cbiAgbmdPbkluaXQoKSB7IH1cblxuICByYWlzZURvd25sb2FkQWxsVGVsZW1ldHJ5KHN1YlR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiBcImNsaWNrXCIsXG4gICAgICAgICAgaWQ6IHRoaXMubm90ZXNEaXNwbGF5VHlwZSA9PSAnUmVmZXJlbmNlIFJlc291cmNlJyA/IFwidGVhY2hlcnMtbm90ZVwiIDogXCJyZWZlcmVuY2Utbm90ZVwiLFxuICAgICAgICAgIHBhZ2VpZDogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfWAsXG4gICAgICAgICAgc3ViVHlwZTogc3ViVHlwZSxcbiAgICAgICAgfSxcbiAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgaWQ6IHRoaXMuY29udGVudD8uaWRlbnRpZmllcixcbiAgICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5LFxuICAgICAgICB9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuSW50ZXJhY3QsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7XG4gICAgICAgIHBhZ2VJZDogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfWAsXG4gICAgICAgIG1vZHVsZTogdGhpcy5ub3Rlc0Rpc3BsYXlUeXBlID09ICdSZWZlcmVuY2UgUmVzb3VyY2UnID8gJ0Ftcml0IEd5YWFuIEtvc2gnIDogJ0xlYXJuJ1xuICAgICAgfSxcbiAgICAgIGZyb206ICcnLFxuICAgICAgdG86ICdUZWxlbWV0cnknLFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxuICB9XG5cbiAgZG93bmxvYWRQREYoY29udGVudERhdGE6IGFueSkge1xuICAgIGlmICghY29udGVudERhdGE/LmFydGlmYWN0VXJsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBhcnRpZmFjdCBVUkwgcHJvdmlkZWQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5kb3dubG9hZEluUHJvZ3Jlc3NbY29udGVudERhdGEuaWRlbnRpZmllcl0gPSB0cnVlXG4gICAgdGhpcy5kb3dubG9hZEZpbGUoY29udGVudERhdGEuYXJ0aWZhY3RVcmwsIGNvbnRlbnREYXRhLm5hbWUgfHwgJ2Rvd25sb2FkJywgY29udGVudERhdGEuaWRlbnRpZmllcilcbiAgICB0aGlzLnJhaXNlRG93bmxvYWRBbGxUZWxlbWV0cnkoJ2Rvd25sb2FkJylcbiAgfVxuXG4gIHByZXZpZXdDb250ZW50KGNvbnRlbnREYXRhOiBhbnkpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC9hcHAvYW1yaXQtZ3lhYW4ta29zaC9wbGF5ZXIvJHtWSUVXRVJfUk9VVEVfRlJPTV9NSU1FKGNvbnRlbnREYXRhLm1pbWVUeXBlKX0vJHtjb250ZW50RGF0YS5pZGVudGlmaWVyfWBdLCB7XG4gICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IHRoaXMucHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFLFxuICAgICAgICBwbGF5ZXJQcmV2aWV3OiB0cnVlLFxuICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgZG93bmxvYWRBbGxDb250ZW50KCkge1xuICAgIGlmICghdGhpcy5jb250ZW50Py5yZWZlcmVuY2VOb2Rlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0ZWFjaGVyUmVzb3VyY2VzID0gdGhpcy5jb250ZW50LnJlZmVyZW5jZU5vZGVzLmZpbHRlcihcbiAgICAgIChlbGU6IGFueSkgPT4gZWxlPy5yZXNvdXJjZUNhdGVnb3J5ID09PSB0aGlzLm5vdGVzRGlzcGxheVR5cGUgJiYgZWxlLmFydGlmYWN0VXJsXG4gICAgKVxuXG4gICAgaWYgKHRlYWNoZXJSZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmlzRG93bmxvYWRpbmdBbGwgPSB0cnVlXG4gICAgbGV0IGNvbXBsZXRlZENvdW50ID0gMFxuXG4gICAgdGVhY2hlclJlc291cmNlcy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgdGhpcy5kb3dubG9hZEluUHJvZ3Jlc3NbZWxlLmlkZW50aWZpZXJdID0gdHJ1ZVxuICAgICAgdGhpcy5kb3dubG9hZEZpbGUoZWxlLmFydGlmYWN0VXJsLCBlbGUubmFtZSB8fCAnZG93bmxvYWQnLCBlbGUuaWRlbnRpZmllcilcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGNvbXBsZXRlZENvdW50KytcbiAgICAgICAgICBpZiAoY29tcGxldGVkQ291bnQgPT09IHRlYWNoZXJSZXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmlzRG93bmxvYWRpbmdBbGwgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMucmFpc2VEb3dubG9hZEFsbFRlbGVtZXRyeSgnZG93bmxvYWQtYWxsJylcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbnkgZG93bmxvYWQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzXG4gICAqL1xuICBoYXNBY3RpdmVEb3dubG9hZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEb3dubG9hZGluZ0FsbCB8fCBPYmplY3QudmFsdWVzKHRoaXMuZG93bmxvYWRJblByb2dyZXNzKS5zb21lKHN0YXR1cyA9PiBzdGF0dXMpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29udGVudCBoYXMgYW55IHRlYWNoZXIgcmVzb3VyY2VzXG4gICAqL1xuICBoYXNUZWFjaGVyUmVzb3VyY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQ/LnJlZmVyZW5jZU5vZGVzPy5zb21lKChub2RlOiBhbnkpID0+IG5vZGU/LnJlc291cmNlQ2F0ZWdvcnkgPT09IHRoaXMubm90ZXNEaXNwbGF5VHlwZSkgfHwgZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBmaWxlIHVzaW5nIG11bHRpcGxlIG1ldGhvZHMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIGJyb3dzZXJzXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGRvd25sb2FkIGNvbXBsZXRlcyBvciBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBkb3dubG9hZEZpbGUodXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFkZCBmaWxlIGV4dGVuc2lvbiBpZiBtaXNzaW5nXG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbih1cmwpXG4gICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgZmlsZU5hbWUgPSBgJHtmaWxlTmFtZX0uJHtmaWxlRXh0ZW5zaW9ufWBcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBwcm9taXNlIHRvIHRyYWNrIGNvbXBsZXRpb25cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIFVzZSBmZXRjaCBBUEkgaW5zdGVhZCBvZiBIdHRwQ2xpZW50IGZvciBiZXR0ZXIgY29udHJvbCBvdmVyIHRoZSBkb3dubG9hZFxuICAgICAgdGhpcy5kb3dubG9hZEluUHJvZ3Jlc3NbaWRlbnRpZmllcl0gPSB0cnVlXG5cbiAgICAgIGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICB9KVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2snKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGJsb2IgPT4ge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBibG9iIHdpdGggdGhlIGNvcnJlY3QgTUlNRSB0eXBlIGlmIG5lZWRlZFxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5nZXRNaW1lVHlwZUZyb21VcmwodXJsKVxuICAgICAgICAgIGNvbnN0IG5ld0Jsb2IgPSBuZXcgQmxvYihbYmxvYl0sIHsgdHlwZTogY29udGVudFR5cGUgfSlcblxuICAgICAgICAgIC8vIFRyeSB0byBzYXZlIHRoZSBibG9iXG4gICAgICAgICAgdGhpcy5zYXZlQmxvYihuZXdCbG9iLCBmaWxlTmFtZSlcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGZXRjaCBkb3dubG9hZCBmYWlsZWQ6JywgZXJyb3IpXG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBYSFIgd2hpY2ggc29tZXRpbWVzIGhhbmRsZXMgQ09SUyBiZXR0ZXJcbiAgICAgICAgICB0aGlzLmRvd25sb2FkV2l0aFhIUih1cmwsIGZpbGVOYW1lKS5maW5hbGx5KHJlc29sdmUpXG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRvd25sb2FkSW5Qcm9ncmVzc1tpZGVudGlmaWVyXSA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IGRvd25sb2FkIHVzaW5nIFhNTEh0dHBSZXF1ZXN0IGFzIGEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgZG93bmxvYWRXaXRoWEhSKHVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSlcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcblxuICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKSB8fCB0aGlzLmdldE1pbWVUeXBlRnJvbVVybCh1cmwpXG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt4aHIucmVzcG9uc2VdLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pXG4gICAgICAgICAgdGhpcy5zYXZlQmxvYihibG9iLCBmaWxlTmFtZSlcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdYSFIgZG93bmxvYWQgZmFpbGVkLCB0cnlpbmcgZGlyZWN0IGlmcmFtZSBtZXRob2QnKVxuICAgICAgICAgIHRoaXMudHJ5RGlyZWN0RG93bmxvYWQodXJsLCBmaWxlTmFtZSlcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignWEhSIGRvd25sb2FkIGZhaWxlZCwgdHJ5aW5nIGRpcmVjdCBpZnJhbWUgbWV0aG9kJylcbiAgICAgICAgdGhpcy50cnlEaXJlY3REb3dubG9hZCh1cmwsIGZpbGVOYW1lKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cblxuICAgICAgeGhyLnNlbmQoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGdldEZpbGVFeHRlbnNpb24odXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSByZXR1cm4gJydcblxuICAgIGNvbnN0IHVybFBhcnRzID0gdXJsLnNwbGl0KCcuJylcbiAgICBpZiAodXJsUGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHVybFBhcnRzW3VybFBhcnRzLmxlbmd0aCAtIDFdLnNwbGl0KC9bPyNdLylbMF0udG9Mb3dlckNhc2UoKVxuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWltZVR5cGVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSB0aGlzLmdldEZpbGVFeHRlbnNpb24odXJsKVxuXG4gICAgc3dpdGNoIChleHRlbnNpb24pIHtcbiAgICAgIGNhc2UgJ3BkZic6XG4gICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vcGRmJ1xuICAgICAgY2FzZSAnbXA0JzpcbiAgICAgICAgcmV0dXJuICd2aWRlby9tcDQnXG4gICAgICBjYXNlICdkb2MnOlxuICAgICAgY2FzZSAnZG9jeCc6XG4gICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vbXN3b3JkJ1xuICAgICAgY2FzZSAneGxzJzpcbiAgICAgIGNhc2UgJ3hsc3gnOlxuICAgICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCdcbiAgICAgIGNhc2UgJ3BwdCc6XG4gICAgICBjYXNlICdwcHR4JzpcbiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCdcbiAgICAgIGNhc2UgJ2pwZyc6XG4gICAgICBjYXNlICdqcGVnJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9qcGVnJ1xuICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9wbmcnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgLy8gRGVmYXVsdCBiaW5hcnkgbWltZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYihibG9iOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZvciBtb2Rlcm4gYnJvd3NlcnMgdXNpbmcgRmlsZVNhdmVyXG4gICAgICBmaWxlU2F2ZXIuc2F2ZUFzKGJsb2IsIGZpbGVOYW1lKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZpbGVTYXZlciBmYWlsZWQsIHRyeWluZyBtYW51YWwgZG93bmxvYWQnLCBlKVxuXG4gICAgICAvLyBNYW51YWwgZG93bmxvYWQgZmFsbGJhY2tcbiAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICBhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGEuaHJlZiA9IHVybFxuICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICBhLmNsaWNrKClcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybClcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyeURpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVXNlIGlmcmFtZSBmb3IgcG90ZW50aWFsbHkgYnlwYXNzaW5nIENPUlMgaXNzdWVzXG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJylcbiAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN0cnVjdCBhIGRvd25sb2FkIFVSTFxuICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB1cmwgKyAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ2Rvd25sb2FkPXRydWUnXG5cbiAgICAgIC8vIENyZWF0ZSBhIGxpbmsgaW5zaWRlIHRoZSBpZnJhbWUgYW5kIGNsaWNrIGl0XG4gICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93Py5kb2N1bWVudFxuICAgICAgaWYgKGRvYykge1xuICAgICAgICBjb25zdCBhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBkb3dubG9hZFVybFxuICAgICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWVcbiAgICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICAgIGEuY2xpY2soKVxuICAgICAgICBkb2MuYm9keS5yZW1vdmVDaGlsZChhKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0lmcmFtZSBkb3dubG9hZCBhcHByb2FjaCBmYWlsZWQ6JywgZSlcblxuICAgICAgLy8gTGFzdCByZXNvcnQgLSB0cnkgZG93bmxvYWQgYXR0cmlidXRlIG9uIGFuY2hvciB0YWdcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgIGEuaHJlZiA9IHVybFxuICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lXG4gICAgICBhLnRhcmdldCA9ICdfc2VsZicgLy8gSW1wb3J0YW50OiB1c2UgX3NlbGYgaW5zdGVhZCBvZiBfYmxhbmtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSlcbiAgICAgIGEuY2xpY2soKVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhbiB1cCB0aGUgaWZyYW1lXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY29udGFpbnMoaWZyYW1lKSkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKVxuICAgICAgICB9XG4gICAgICB9LCAxMDAwKVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlclwiPlxuICA8ZGl2IGNsYXNzPVwidGVhY2hlcnMtbm90ZS1oZWFkZXJcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS50ZWFjaGVyc05vdGVIZWFkaW5nJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImhhc0FjdGl2ZURvd25sb2FkcygpXCIgKGNsaWNrKT1cImRvd25sb2FkQWxsQ29udGVudCgpXCIgY2xhc3M9XCJkb3dubG9hZC1hbGwgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWlzRG93bmxvYWRpbmdBbGxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5kb3duYWxvYWRBbGxQZGZzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaXNEb3dubG9hZGluZ0FsbFwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cIm1yLTJcIj48L21hdC1zcGlubmVyPlxuICAgICAgICBEb3dubG9hZGluZ1xuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZ3VpZGUtY29udGFpbmVyXCIgKm5nSWY9XCJjb250ZW50Py5yZWZlcmVuY2VOb2Rlc1wiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBub3RlIG9mIGNvbnRlbnQ/LnJlZmVyZW5jZU5vZGVzXCI+XG4gICAgPGRpdiBjbGFzcz1cImd1aWRlLWNhcmQgZmxleCBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIm5vdGU/LnJlc291cmNlQ2F0ZWdvcnkgPT09IG5vdGVzRGlzcGxheVR5cGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlLXRpdGxlXCI+e3tub3RlPy5uYW1lfX08L2Rpdj5cbiAgICAgICAgPCEtLSBUbyByZW1vdmUgdmlldyBvcHRpb24gaW4gY2FzZSBvZiBwdWJsaWMgcHJldmlldyBvZiB0b2MgIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBwdC0yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XG4gICAgICAgICAgICAgIHZpc2liaWxpdHlcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICAgIDxhIChjbGljayk9XCJwcmV2aWV3Q29udGVudChub3RlKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctcGRmXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld1BERicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaW5kXCI+XG4gICAgICAgICAgPGEgKGNsaWNrKT1cImRvd25sb2FkUERGKG5vdGUpXCIgY2xhc3M9XCJkb3dubG9hZC1saW5rIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFkb3dubG9hZEluUHJvZ3Jlc3Nbbm90ZS5pZGVudGlmaWVyXVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRvd25sb2FkUGRmJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZG93bmxvYWRJblByb2dyZXNzW25vdGUuaWRlbnRpZmllcl1cIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE2XCIgY2xhc3M9XCJtci0yXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgRG93bmxvYWRpbmdcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjwhLS0gTm8gdGVhY2hlcnMgcmVzb3VyY2VzIG1lc3NhZ2UgLS0+XG48ZGl2ICpuZ0lmPVwiIWhhc1RlYWNoZXJSZXNvdXJjZXMoKVwiIGNsYXNzPVwibm8tcmVzb3VyY2VzLW1lc3NhZ2UgbXQtNFwiPlxuICB7eyAnYXBwdG9jc2luZ2xlcGFnZS5ub1RlYWNoZXJzUmVzb3VyY2VzJyB8IHRyYW5zbGF0ZSB9fVxuPC9kaXY+Il19
1
+ import { Component, Input } from '@angular/core';
2
+ import { VIEWER_ROUTE_FROM_MIME } from '../../../../_services/viewer-route-util';
3
+ import { NsContent, WsEvents } from '@sunbird-cb/utils-v2';
4
+ import * as fileSaver from 'file-saver';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/router";
7
+ import * as i2 from "@sunbird-cb/utils-v2";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/material/icon";
10
+ import * as i5 from "@angular/material/progress-spinner";
11
+ import * as i6 from "@ngx-translate/core";
12
+ export class AppTocTeachersNotesComponent {
13
+ constructor(router, eventSvc) {
14
+ this.router = router;
15
+ this.eventSvc = eventSvc;
16
+ this.primaryCategory = NsContent.EPrimaryCategory;
17
+ this.downloadInProgress = {};
18
+ this.isDownloadingAll = false;
19
+ this.forPreview = false;
20
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
21
+ }
22
+ ngOnInit() { }
23
+ raiseDownloadAllTelemetry(subType) {
24
+ const event = {
25
+ eventType: WsEvents.WsEventType.Telemetry,
26
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
27
+ data: {
28
+ edata: {
29
+ type: "click",
30
+ id: this.notesDisplayType == 'Reference Resource' ? "teachers-note" : "reference-note",
31
+ pageid: `/app/toc/${this.content?.identifier}`,
32
+ subType: subType,
33
+ },
34
+ object: {
35
+ id: this.content?.identifier,
36
+ type: this.content?.courseCategory,
37
+ },
38
+ state: WsEvents.EnumTelemetrySubType.Interact,
39
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
40
+ mode: 'view',
41
+ },
42
+ pageContext: {
43
+ pageId: `/app/toc/${this.content?.identifier}`,
44
+ module: this.notesDisplayType == 'Reference Resource' ? 'Amrit Gyaan Kosh' : 'Learn'
45
+ },
46
+ from: '',
47
+ to: 'Telemetry',
48
+ };
49
+ this.eventSvc.dispatchChatbotEvent(event);
50
+ }
51
+ downloadPDF(contentData) {
52
+ if (!contentData?.artifactUrl) {
53
+ console.error('No artifact URL provided');
54
+ return;
55
+ }
56
+ this.downloadInProgress[contentData.identifier] = true;
57
+ this.downloadFile(contentData.artifactUrl, contentData.name || 'download', contentData.identifier);
58
+ this.raiseDownloadAllTelemetry('download');
59
+ }
60
+ previewContent(contentData) {
61
+ this.router.navigate([`/app/amrit-gyaan-kosh/player/${VIEWER_ROUTE_FROM_MIME(contentData.mimeType)}/${contentData.identifier}`], {
62
+ queryParams: {
63
+ primaryCategory: this.primaryCategory.RESOURCE,
64
+ playerPreview: true,
65
+ collectionId: this.content.identifier,
66
+ },
67
+ });
68
+ }
69
+ downloadAllContent() {
70
+ if (!this.content?.referenceNodes?.length) {
71
+ return;
72
+ }
73
+ const teacherResources = this.content.referenceNodes.filter((ele) => ele?.resourceCategory === this.notesDisplayType && ele.artifactUrl);
74
+ if (teacherResources.length === 0) {
75
+ return;
76
+ }
77
+ this.isDownloadingAll = true;
78
+ let completedCount = 0;
79
+ teacherResources.forEach((ele) => {
80
+ this.downloadInProgress[ele.identifier] = true;
81
+ this.downloadFile(ele.artifactUrl, ele.name || 'download', ele.identifier)
82
+ .finally(() => {
83
+ completedCount++;
84
+ if (completedCount === teacherResources.length) {
85
+ this.isDownloadingAll = false;
86
+ }
87
+ });
88
+ });
89
+ this.raiseDownloadAllTelemetry('download-all');
90
+ }
91
+ /**
92
+ * Check if any download is currently in progress
93
+ */
94
+ hasActiveDownloads() {
95
+ return this.isDownloadingAll || Object.values(this.downloadInProgress).some(status => status);
96
+ }
97
+ /**
98
+ * Check if content has any teacher resources
99
+ */
100
+ hasTeacherResources() {
101
+ return this.content?.referenceNodes?.some((node) => node?.resourceCategory === this.notesDisplayType) || false;
102
+ }
103
+ /**
104
+ * Download file using multiple methods to ensure compatibility across browsers
105
+ * @returns Promise that resolves when download completes or fails
106
+ */
107
+ downloadFile(url, fileName, identifier) {
108
+ // Add file extension if missing
109
+ const fileExtension = this.getFileExtension(url);
110
+ if (fileExtension && !fileName.toLowerCase().endsWith(fileExtension.toLowerCase())) {
111
+ fileName = `${fileName}.${fileExtension}`;
112
+ }
113
+ // Return a promise to track completion
114
+ return new Promise((resolve) => {
115
+ // Use fetch API instead of HttpClient for better control over the download
116
+ this.downloadInProgress[identifier] = true;
117
+ fetch(url, {
118
+ method: 'GET',
119
+ mode: 'cors',
120
+ })
121
+ .then(response => {
122
+ if (!response.ok) {
123
+ throw new Error('Network response was not ok');
124
+ }
125
+ return response.blob();
126
+ })
127
+ .then(blob => {
128
+ // Create a new blob with the correct MIME type if needed
129
+ const contentType = this.getMimeTypeFromUrl(url);
130
+ const newBlob = new Blob([blob], { type: contentType });
131
+ // Try to save the blob
132
+ this.saveBlob(newBlob, fileName);
133
+ resolve();
134
+ })
135
+ .catch(error => {
136
+ console.error('Fetch download failed:', error);
137
+ // Fallback to XHR which sometimes handles CORS better
138
+ this.downloadWithXHR(url, fileName).finally(resolve);
139
+ })
140
+ .finally(() => {
141
+ this.downloadInProgress[identifier] = false;
142
+ });
143
+ });
144
+ }
145
+ /**
146
+ * Attempt download using XMLHttpRequest as a fallback
147
+ */
148
+ downloadWithXHR(url, fileName) {
149
+ return new Promise((resolve) => {
150
+ const xhr = new XMLHttpRequest();
151
+ xhr.open('GET', url, true);
152
+ xhr.responseType = 'blob';
153
+ xhr.onload = () => {
154
+ if (xhr.status === 200) {
155
+ const contentType = xhr.getResponseHeader('Content-Type') || this.getMimeTypeFromUrl(url);
156
+ const blob = new Blob([xhr.response], { type: contentType });
157
+ this.saveBlob(blob, fileName);
158
+ resolve();
159
+ }
160
+ else {
161
+ console.error('XHR download failed, trying direct iframe method');
162
+ this.tryDirectDownload(url, fileName);
163
+ resolve();
164
+ }
165
+ };
166
+ xhr.onerror = () => {
167
+ console.error('XHR download failed, trying direct iframe method');
168
+ this.tryDirectDownload(url, fileName);
169
+ resolve();
170
+ };
171
+ xhr.send();
172
+ });
173
+ }
174
+ getFileExtension(url) {
175
+ if (!url)
176
+ return '';
177
+ const urlParts = url.split('.');
178
+ if (urlParts.length > 1) {
179
+ return urlParts[urlParts.length - 1].split(/[?#]/)[0].toLowerCase();
180
+ }
181
+ return '';
182
+ }
183
+ getMimeTypeFromUrl(url) {
184
+ const extension = this.getFileExtension(url);
185
+ switch (extension) {
186
+ case 'pdf':
187
+ return 'application/pdf';
188
+ case 'mp4':
189
+ return 'video/mp4';
190
+ case 'doc':
191
+ case 'docx':
192
+ return 'application/msword';
193
+ case 'xls':
194
+ case 'xlsx':
195
+ return 'application/vnd.ms-excel';
196
+ case 'ppt':
197
+ case 'pptx':
198
+ return 'application/vnd.ms-powerpoint';
199
+ case 'jpg':
200
+ case 'jpeg':
201
+ return 'image/jpeg';
202
+ case 'png':
203
+ return 'image/png';
204
+ default:
205
+ return 'application/octet-stream'; // Default binary mime type
206
+ }
207
+ }
208
+ saveBlob(blob, fileName) {
209
+ try {
210
+ // For modern browsers using FileSaver
211
+ fileSaver.saveAs(blob, fileName);
212
+ }
213
+ catch (e) {
214
+ console.error('FileSaver failed, trying manual download', e);
215
+ // Manual download fallback
216
+ const url = window.URL.createObjectURL(blob);
217
+ const a = document.createElement('a');
218
+ a.style.display = 'none';
219
+ a.href = url;
220
+ a.download = fileName;
221
+ document.body.appendChild(a);
222
+ a.click();
223
+ window.URL.revokeObjectURL(url);
224
+ document.body.removeChild(a);
225
+ }
226
+ }
227
+ tryDirectDownload(url, fileName) {
228
+ // Use iframe for potentially bypassing CORS issues
229
+ const iframe = document.createElement('iframe');
230
+ iframe.style.display = 'none';
231
+ document.body.appendChild(iframe);
232
+ try {
233
+ // Construct a download URL
234
+ const downloadUrl = url + (url.indexOf('?') === -1 ? '?' : '&') + 'download=true';
235
+ // Create a link inside the iframe and click it
236
+ const doc = iframe.contentDocument || iframe.contentWindow?.document;
237
+ if (doc) {
238
+ const a = doc.createElement('a');
239
+ a.href = downloadUrl;
240
+ a.download = fileName;
241
+ a.style.display = 'none';
242
+ doc.body.appendChild(a);
243
+ a.click();
244
+ doc.body.removeChild(a);
245
+ }
246
+ }
247
+ catch (e) {
248
+ console.error('Iframe download approach failed:', e);
249
+ // Last resort - try download attribute on anchor tag
250
+ const a = document.createElement('a');
251
+ a.href = url;
252
+ a.download = fileName;
253
+ a.target = '_self'; // Important: use _self instead of _blank
254
+ document.body.appendChild(a);
255
+ a.click();
256
+ document.body.removeChild(a);
257
+ }
258
+ finally {
259
+ // Clean up the iframe
260
+ setTimeout(() => {
261
+ if (document.body.contains(iframe)) {
262
+ document.body.removeChild(iframe);
263
+ }
264
+ }, 1000);
265
+ }
266
+ }
267
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocTeachersNotesComponent, deps: [{ token: i1.Router }, { token: i2.EventService }], target: i0.ɵɵFactoryTarget.Component }); }
268
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocTeachersNotesComponent, selector: "ws-widget-app-toc-teachers-notes", inputs: { content: "content", notesDisplayType: "notesDisplayType" }, ngImport: i0, template: "<div class=\"flex justify-between items-center\">\r\n <div class=\"teachers-note-header\">{{ 'apptocsinglepage.teachersNoteHeading' | translate }}</div>\r\n <div>\r\n <button [disabled]=\"hasActiveDownloads()\" (click)=\"downloadAllContent()\" class=\"download-all flex items-center\">\r\n <span *ngIf=\"!isDownloadingAll\">{{ 'apptocsinglepage.downaloadAllPdfs' | translate }}</span>\r\n <span *ngIf=\"isDownloadingAll\" class=\"flex items-center\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\r\n Downloading\r\n </span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"guide-container\" *ngIf=\"content?.referenceNodes\">\r\n <ng-container *ngFor=\"let note of content?.referenceNodes\">\r\n <div class=\"guide-card flex gap-4 justify-between\" *ngIf=\"note?.resourceCategory === notesDisplayType\">\r\n <div class=\"flex flex-col justify-center\">\r\n <div class=\"note-title\">{{note?.name}}</div>\r\n <!-- To remove view option in case of public preview of toc -->\r\n <ng-container *ngIf=\"!forPreview\">\r\n <div class=\"flex gap-2 pt-2\">\r\n <mat-icon class=\"material-symbols-outlined\">\r\n visibility\r\n </mat-icon>\r\n\r\n <a (click)=\"previewContent(note)\">\r\n <span class=\"view-pdf\">{{ 'apptocsinglepage.viewPDF' | translate }}</span>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div>\r\n <div class=\"download-ind\">\r\n <a (click)=\"downloadPDF(note)\" class=\"download-link flex items-center\">\r\n <span *ngIf=\"!downloadInProgress[note.identifier]\">{{ 'apptocsinglepage.downloadPdf' | translate }}</span>\r\n <span *ngIf=\"downloadInProgress[note.identifier]\" class=\"flex items-center\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\r\n Downloading\r\n </span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n<!-- No teachers resources message -->\r\n<div *ngIf=\"!hasTeacherResources()\" class=\"no-resources-message mt-4\">\r\n {{ 'apptocsinglepage.noTeachersResources' | translate }}\r\n</div>", styles: [".teachers-note-header{font-family:Lato;font-size:14px;font-weight:400;line-height:16.8px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.download-all{padding:0 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;background:transparent;border:none}.guide-container .view-pdf{font-size:14px;cursor:pointer;opacity:.8;color:#000}.guide-container .note-title{font-family:Lato;font-size:16px;font-weight:700;line-height:24px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1}.guide-container .guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.guide-container .download-ind{padding:12px 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;border-radius:40px;border-color:1px solid #c3c3c3}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.download-link{display:inline-flex;align-items:center}.no-resources-message{color:#666;font-style:italic;padding:1rem 0}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
269
+ }
270
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocTeachersNotesComponent, decorators: [{
271
+ type: Component,
272
+ args: [{ selector: 'ws-widget-app-toc-teachers-notes', template: "<div class=\"flex justify-between items-center\">\r\n <div class=\"teachers-note-header\">{{ 'apptocsinglepage.teachersNoteHeading' | translate }}</div>\r\n <div>\r\n <button [disabled]=\"hasActiveDownloads()\" (click)=\"downloadAllContent()\" class=\"download-all flex items-center\">\r\n <span *ngIf=\"!isDownloadingAll\">{{ 'apptocsinglepage.downaloadAllPdfs' | translate }}</span>\r\n <span *ngIf=\"isDownloadingAll\" class=\"flex items-center\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\r\n Downloading\r\n </span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"guide-container\" *ngIf=\"content?.referenceNodes\">\r\n <ng-container *ngFor=\"let note of content?.referenceNodes\">\r\n <div class=\"guide-card flex gap-4 justify-between\" *ngIf=\"note?.resourceCategory === notesDisplayType\">\r\n <div class=\"flex flex-col justify-center\">\r\n <div class=\"note-title\">{{note?.name}}</div>\r\n <!-- To remove view option in case of public preview of toc -->\r\n <ng-container *ngIf=\"!forPreview\">\r\n <div class=\"flex gap-2 pt-2\">\r\n <mat-icon class=\"material-symbols-outlined\">\r\n visibility\r\n </mat-icon>\r\n\r\n <a (click)=\"previewContent(note)\">\r\n <span class=\"view-pdf\">{{ 'apptocsinglepage.viewPDF' | translate }}</span>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div>\r\n <div class=\"download-ind\">\r\n <a (click)=\"downloadPDF(note)\" class=\"download-link flex items-center\">\r\n <span *ngIf=\"!downloadInProgress[note.identifier]\">{{ 'apptocsinglepage.downloadPdf' | translate }}</span>\r\n <span *ngIf=\"downloadInProgress[note.identifier]\" class=\"flex items-center\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\"></mat-spinner>\r\n Downloading\r\n </span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n<!-- No teachers resources message -->\r\n<div *ngIf=\"!hasTeacherResources()\" class=\"no-resources-message mt-4\">\r\n {{ 'apptocsinglepage.noTeachersResources' | translate }}\r\n</div>", styles: [".teachers-note-header{font-family:Lato;font-size:14px;font-weight:400;line-height:16.8px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.download-all{padding:0 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;background:transparent;border:none}.guide-container .view-pdf{font-size:14px;cursor:pointer;opacity:.8;color:#000}.guide-container .note-title{font-family:Lato;font-size:16px;font-weight:700;line-height:24px;text-align:left;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1}.guide-container .guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.guide-container .download-ind{padding:12px 16px;font-family:Lato;font-size:14px;font-weight:700;line-height:16.8px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:#1b4ca1;cursor:pointer;border-radius:40px;border-color:1px solid #c3c3c3}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.download-link{display:inline-flex;align-items:center}.no-resources-message{color:#666;font-style:italic;padding:1rem 0}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}\n"] }]
273
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.EventService }]; }, propDecorators: { content: [{
274
+ type: Input
275
+ }], notesDisplayType: [{
276
+ type: Input
277
+ }] } });
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLXRlYWNoZXJzLW5vdGVzL2FwcC10b2MtdGVhY2hlcnMtbm90ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy9hcHAtdG9jLXRlYWNoZXJzLW5vdGVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBRXhELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3hFLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFBOzs7Ozs7OztBQVF2QyxNQUFNLE9BQU8sNEJBQTRCO0lBU3ZDLFlBQW1CLE1BQWMsRUFDeEIsUUFBc0I7UUFEWixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQWM7UUFOL0Isb0JBQWUsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUE7UUFDNUMsdUJBQWtCLEdBQStCLEVBQUUsQ0FBQTtRQUNuRCxxQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQTtRQUtoQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFV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QUUsQ0FBQyxDQUFDLENBQUE7WUFFcEQscURBQXFEO1lBQ3JELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDckMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUE7WUFDWixDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtZQUNyQixDQUFDLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQSxDQUFDLHlDQUF5QztZQUM1RCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDVCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUM3QjtnQkFBUztZQUNSLHNCQUFzQjtZQUN0QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2lCQUNsQztZQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNUO0lBQ0gsQ0FBQzsrR0E5UlUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsOElDWnpDLCt1RUFpRE07OzRGRHJDTyw0QkFBNEI7a0JBTnhDLFNBQVM7K0JBQ0Usa0NBQWtDO3dIQU9uQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xyXG5pbXBvcnQgeyBWSUVXRVJfUk9VVEVfRlJPTV9NSU1FIH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3ZpZXdlci1yb3V0ZS11dGlsJ1xyXG5pbXBvcnQgeyBFdmVudFNlcnZpY2UsIE5zQ29udGVudCwgV3NFdmVudHMgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcclxuaW1wb3J0ICogYXMgZmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtdG9jLXRlYWNoZXJzLW5vdGVzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy10ZWFjaGVycy1ub3Rlcy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFwcFRvY1RlYWNoZXJzTm90ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50ITogTnNDb250ZW50LklDb250ZW50XHJcbiAgQElucHV0KCkgbm90ZXNEaXNwbGF5VHlwZSE6IHN0cmluZ1xyXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XHJcbiAgZG93bmxvYWRJblByb2dyZXNzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XHJcbiAgaXNEb3dubG9hZGluZ0FsbCA9IGZhbHNlXHJcbiAgZm9yUHJldmlldyA9IGZhbHNlXHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHB1YmxpYyBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5mb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7IH1cclxuXHJcbiAgcmFpc2VEb3dubG9hZEFsbFRlbGVtZXRyeShzdWJUeXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcclxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBlZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogXCJjbGlja1wiLFxyXG4gICAgICAgICAgaWQ6IHRoaXMubm90ZXNEaXNwbGF5VHlwZSA9PSAnUmVmZXJlbmNlIFJlc291cmNlJyA/IFwidGVhY2hlcnMtbm90ZVwiIDogXCJyZWZlcmVuY2Utbm90ZVwiLFxyXG4gICAgICAgICAgcGFnZWlkOiBgL2FwcC90b2MvJHt0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXJ9YCxcclxuICAgICAgICAgIHN1YlR5cGU6IHN1YlR5cGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgIGlkOiB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIsXHJcbiAgICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0LFxyXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcclxuICAgICAgICBtb2RlOiAndmlldycsXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2VDb250ZXh0OiB7XHJcbiAgICAgICAgcGFnZUlkOiBgL2FwcC90b2MvJHt0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXJ9YCxcclxuICAgICAgICBtb2R1bGU6IHRoaXMubm90ZXNEaXNwbGF5VHlwZSA9PSAnUmVmZXJlbmNlIFJlc291cmNlJyA/ICdBbXJpdCBHeWFhbiBLb3NoJyA6ICdMZWFybidcclxuICAgICAgfSxcclxuICAgICAgZnJvbTogJycsXHJcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcclxuICAgIH1cclxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXHJcbiAgfVxyXG5cclxuICBkb3dubG9hZFBERihjb250ZW50RGF0YTogYW55KSB7XHJcbiAgICBpZiAoIWNvbnRlbnREYXRhPy5hcnRpZmFjdFVybCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdObyBhcnRpZmFjdCBVUkwgcHJvdmlkZWQnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRvd25sb2FkSW5Qcm9ncmVzc1tjb250ZW50RGF0YS5pZGVudGlmaWVyXSA9IHRydWVcclxuICAgIHRoaXMuZG93bmxvYWRGaWxlKGNvbnRlbnREYXRhLmFydGlmYWN0VXJsLCBjb250ZW50RGF0YS5uYW1lIHx8ICdkb3dubG9hZCcsIGNvbnRlbnREYXRhLmlkZW50aWZpZXIpXHJcbiAgICB0aGlzLnJhaXNlRG93bmxvYWRBbGxUZWxlbWV0cnkoJ2Rvd25sb2FkJylcclxuICB9XHJcblxyXG4gIHByZXZpZXdDb250ZW50KGNvbnRlbnREYXRhOiBhbnkpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgL2FwcC9hbXJpdC1neWFhbi1rb3NoL3BsYXllci8ke1ZJRVdFUl9ST1VURV9GUk9NX01JTUUoY29udGVudERhdGEubWltZVR5cGUpfS8ke2NvbnRlbnREYXRhLmlkZW50aWZpZXJ9YF0sIHtcclxuICAgICAgcXVlcnlQYXJhbXM6IHtcclxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IHRoaXMucHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFLFxyXG4gICAgICAgIHBsYXllclByZXZpZXc6IHRydWUsXHJcbiAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcclxuICAgICAgfSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEFsbENvbnRlbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29udGVudD8ucmVmZXJlbmNlTm9kZXM/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0ZWFjaGVyUmVzb3VyY2VzID0gdGhpcy5jb250ZW50LnJlZmVyZW5jZU5vZGVzLmZpbHRlcihcclxuICAgICAgKGVsZTogYW55KSA9PiBlbGU/LnJlc291cmNlQ2F0ZWdvcnkgPT09IHRoaXMubm90ZXNEaXNwbGF5VHlwZSAmJiBlbGUuYXJ0aWZhY3RVcmxcclxuICAgIClcclxuXHJcbiAgICBpZiAodGVhY2hlclJlc291cmNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0Rvd25sb2FkaW5nQWxsID0gdHJ1ZVxyXG4gICAgbGV0IGNvbXBsZXRlZENvdW50ID0gMFxyXG5cclxuICAgIHRlYWNoZXJSZXNvdXJjZXMuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5kb3dubG9hZEluUHJvZ3Jlc3NbZWxlLmlkZW50aWZpZXJdID0gdHJ1ZVxyXG4gICAgICB0aGlzLmRvd25sb2FkRmlsZShlbGUuYXJ0aWZhY3RVcmwsIGVsZS5uYW1lIHx8ICdkb3dubG9hZCcsIGVsZS5pZGVudGlmaWVyKVxyXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIGNvbXBsZXRlZENvdW50KytcclxuICAgICAgICAgIGlmIChjb21wbGV0ZWRDb3VudCA9PT0gdGVhY2hlclJlc291cmNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0Rvd25sb2FkaW5nQWxsID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfSlcclxuICAgIHRoaXMucmFpc2VEb3dubG9hZEFsbFRlbGVtZXRyeSgnZG93bmxvYWQtYWxsJylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGFueSBkb3dubG9hZCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3NcclxuICAgKi9cclxuICBoYXNBY3RpdmVEb3dubG9hZHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0Rvd25sb2FkaW5nQWxsIHx8IE9iamVjdC52YWx1ZXModGhpcy5kb3dubG9hZEluUHJvZ3Jlc3MpLnNvbWUoc3RhdHVzID0+IHN0YXR1cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgaGFzIGFueSB0ZWFjaGVyIHJlc291cmNlc1xyXG4gICAqL1xyXG4gIGhhc1RlYWNoZXJSZXNvdXJjZXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZW50Py5yZWZlcmVuY2VOb2Rlcz8uc29tZSgobm9kZTogYW55KSA9PiBub2RlPy5yZXNvdXJjZUNhdGVnb3J5ID09PSB0aGlzLm5vdGVzRGlzcGxheVR5cGUpIHx8IGZhbHNlXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb3dubG9hZCBmaWxlIHVzaW5nIG11bHRpcGxlIG1ldGhvZHMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIGJyb3dzZXJzXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZG93bmxvYWQgY29tcGxldGVzIG9yIGZhaWxzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkb3dubG9hZEZpbGUodXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gQWRkIGZpbGUgZXh0ZW5zaW9uIGlmIG1pc3NpbmdcclxuICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSB0aGlzLmdldEZpbGVFeHRlbnNpb24odXJsKVxyXG4gICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICBmaWxlTmFtZSA9IGAke2ZpbGVOYW1lfS4ke2ZpbGVFeHRlbnNpb259YFxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiBhIHByb21pc2UgdG8gdHJhY2sgY29tcGxldGlvblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIC8vIFVzZSBmZXRjaCBBUEkgaW5zdGVhZCBvZiBIdHRwQ2xpZW50IGZvciBiZXR0ZXIgY29udHJvbCBvdmVyIHRoZSBkb3dubG9hZFxyXG4gICAgICB0aGlzLmRvd25sb2FkSW5Qcm9ncmVzc1tpZGVudGlmaWVyXSA9IHRydWVcclxuXHJcbiAgICAgIGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgbW9kZTogJ2NvcnMnLFxyXG4gICAgICB9KVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2snKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRoZW4oYmxvYiA9PiB7XHJcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYmxvYiB3aXRoIHRoZSBjb3JyZWN0IE1JTUUgdHlwZSBpZiBuZWVkZWRcclxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5nZXRNaW1lVHlwZUZyb21VcmwodXJsKVxyXG4gICAgICAgICAgY29uc3QgbmV3QmxvYiA9IG5ldyBCbG9iKFtibG9iXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KVxyXG5cclxuICAgICAgICAgIC8vIFRyeSB0byBzYXZlIHRoZSBibG9iXHJcbiAgICAgICAgICB0aGlzLnNhdmVCbG9iKG5ld0Jsb2IsIGZpbGVOYW1lKVxyXG4gICAgICAgICAgcmVzb2x2ZSgpXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmV0Y2ggZG93bmxvYWQgZmFpbGVkOicsIGVycm9yKVxyXG5cclxuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIFhIUiB3aGljaCBzb21ldGltZXMgaGFuZGxlcyBDT1JTIGJldHRlclxyXG4gICAgICAgICAgdGhpcy5kb3dubG9hZFdpdGhYSFIodXJsLCBmaWxlTmFtZSkuZmluYWxseShyZXNvbHZlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kb3dubG9hZEluUHJvZ3Jlc3NbaWRlbnRpZmllcl0gPSBmYWxzZVxyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR0ZW1wdCBkb3dubG9hZCB1c2luZyBYTUxIdHRwUmVxdWVzdCBhcyBhIGZhbGxiYWNrXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkb3dubG9hZFdpdGhYSFIodXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxyXG4gICAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKVxyXG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InXHJcblxyXG4gICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKSB8fCB0aGlzLmdldE1pbWVUeXBlRnJvbVVybCh1cmwpXHJcbiAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3hoci5yZXNwb25zZV0sIHsgdHlwZTogY29udGVudFR5cGUgfSlcclxuICAgICAgICAgIHRoaXMuc2F2ZUJsb2IoYmxvYiwgZmlsZU5hbWUpXHJcbiAgICAgICAgICByZXNvbHZlKClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignWEhSIGRvd25sb2FkIGZhaWxlZCwgdHJ5aW5nIGRpcmVjdCBpZnJhbWUgbWV0aG9kJylcclxuICAgICAgICAgIHRoaXMudHJ5RGlyZWN0RG93bmxvYWQodXJsLCBmaWxlTmFtZSlcclxuICAgICAgICAgIHJlc29sdmUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignWEhSIGRvd25sb2FkIGZhaWxlZCwgdHJ5aW5nIGRpcmVjdCBpZnJhbWUgbWV0aG9kJylcclxuICAgICAgICB0aGlzLnRyeURpcmVjdERvd25sb2FkKHVybCwgZmlsZU5hbWUpXHJcbiAgICAgICAgcmVzb2x2ZSgpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHhoci5zZW5kKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbGVFeHRlbnNpb24odXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF1cmwpIHJldHVybiAnJ1xyXG5cclxuICAgIGNvbnN0IHVybFBhcnRzID0gdXJsLnNwbGl0KCcuJylcclxuICAgIGlmICh1cmxQYXJ0cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHJldHVybiB1cmxQYXJ0c1t1cmxQYXJ0cy5sZW5ndGggLSAxXS5zcGxpdCgvWz8jXS8pWzBdLnRvTG93ZXJDYXNlKClcclxuICAgIH1cclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNaW1lVHlwZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKHVybClcclxuXHJcbiAgICBzd2l0Y2ggKGV4dGVuc2lvbikge1xyXG4gICAgICBjYXNlICdwZGYnOlxyXG4gICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vcGRmJ1xyXG4gICAgICBjYXNlICdtcDQnOlxyXG4gICAgICAgIHJldHVybiAndmlkZW8vbXA0J1xyXG4gICAgICBjYXNlICdkb2MnOlxyXG4gICAgICBjYXNlICdkb2N4JzpcclxuICAgICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL21zd29yZCdcclxuICAgICAgY2FzZSAneGxzJzpcclxuICAgICAgY2FzZSAneGxzeCc6XHJcbiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXHJcbiAgICAgIGNhc2UgJ3BwdCc6XHJcbiAgICAgIGNhc2UgJ3BwdHgnOlxyXG4gICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnXHJcbiAgICAgIGNhc2UgJ2pwZyc6XHJcbiAgICAgIGNhc2UgJ2pwZWcnOlxyXG4gICAgICAgIHJldHVybiAnaW1hZ2UvanBlZydcclxuICAgICAgY2FzZSAncG5nJzpcclxuICAgICAgICByZXR1cm4gJ2ltYWdlL3BuZydcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgLy8gRGVmYXVsdCBiaW5hcnkgbWltZSB0eXBlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVCbG9iKGJsb2I6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEZvciBtb2Rlcm4gYnJvd3NlcnMgdXNpbmcgRmlsZVNhdmVyXHJcbiAgICAgIGZpbGVTYXZlci5zYXZlQXMoYmxvYiwgZmlsZU5hbWUpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZpbGVTYXZlciBmYWlsZWQsIHRyeWluZyBtYW51YWwgZG93bmxvYWQnLCBlKVxyXG5cclxuICAgICAgLy8gTWFudWFsIGRvd25sb2FkIGZhbGxiYWNrXHJcbiAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXHJcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgIGEuaHJlZiA9IHVybFxyXG4gICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWVcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKVxyXG4gICAgICBhLmNsaWNrKClcclxuICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeURpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBVc2UgaWZyYW1lIGZvciBwb3RlbnRpYWxseSBieXBhc3NpbmcgQ09SUyBpc3N1ZXNcclxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpXHJcbiAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ29uc3RydWN0IGEgZG93bmxvYWQgVVJMXHJcbiAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdXJsICsgKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArICdkb3dubG9hZD10cnVlJ1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIGEgbGluayBpbnNpZGUgdGhlIGlmcmFtZSBhbmQgY2xpY2sgaXRcclxuICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdz8uZG9jdW1lbnRcclxuICAgICAgaWYgKGRvYykge1xyXG4gICAgICAgIGNvbnN0IGEgPSBkb2MuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgICAgYS5ocmVmID0gZG93bmxvYWRVcmxcclxuICAgICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWVcclxuICAgICAgICBhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgICBkb2MuYm9keS5hcHBlbmRDaGlsZChhKVxyXG4gICAgICAgIGEuY2xpY2soKVxyXG4gICAgICAgIGRvYy5ib2R5LnJlbW92ZUNoaWxkKGEpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignSWZyYW1lIGRvd25sb2FkIGFwcHJvYWNoIGZhaWxlZDonLCBlKVxyXG5cclxuICAgICAgLy8gTGFzdCByZXNvcnQgLSB0cnkgZG93bmxvYWQgYXR0cmlidXRlIG9uIGFuY2hvciB0YWdcclxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxyXG4gICAgICBhLmhyZWYgPSB1cmxcclxuICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lXHJcbiAgICAgIGEudGFyZ2V0ID0gJ19zZWxmJyAvLyBJbXBvcnRhbnQ6IHVzZSBfc2VsZiBpbnN0ZWFkIG9mIF9ibGFua1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpXHJcbiAgICAgIGEuY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpXHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAvLyBDbGVhbiB1cCB0aGUgaWZyYW1lXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGlmcmFtZSkpIHtcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMClcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0ZWFjaGVycy1ub3RlLWhlYWRlclwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnRlYWNoZXJzTm90ZUhlYWRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgPGRpdj5cclxuICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImhhc0FjdGl2ZURvd25sb2FkcygpXCIgKGNsaWNrKT1cImRvd25sb2FkQWxsQ29udGVudCgpXCIgY2xhc3M9XCJkb3dubG9hZC1hbGwgZmxleCBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIhaXNEb3dubG9hZGluZ0FsbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRvd25hbG9hZEFsbFBkZnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImlzRG93bmxvYWRpbmdBbGxcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cIm1yLTJcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgIERvd25sb2FkaW5nXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJndWlkZS1jb250YWluZXJcIiAqbmdJZj1cImNvbnRlbnQ/LnJlZmVyZW5jZU5vZGVzXCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbm90ZSBvZiBjb250ZW50Py5yZWZlcmVuY2VOb2Rlc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImd1aWRlLWNhcmQgZmxleCBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIm5vdGU/LnJlc291cmNlQ2F0ZWdvcnkgPT09IG5vdGVzRGlzcGxheVR5cGVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibm90ZS10aXRsZVwiPnt7bm90ZT8ubmFtZX19PC9kaXY+XHJcbiAgICAgICAgPCEtLSBUbyByZW1vdmUgdmlldyBvcHRpb24gaW4gY2FzZSBvZiBwdWJsaWMgcHJldmlldyBvZiB0b2MgIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlld1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIgcHQtMlwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XHJcbiAgICAgICAgICAgICAgdmlzaWJpbGl0eVxyXG4gICAgICAgICAgICA8L21hdC1pY29uPlxyXG5cclxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInByZXZpZXdDb250ZW50KG5vdGUpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LXBkZlwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdQREYnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLWluZFwiPlxyXG4gICAgICAgICAgPGEgKGNsaWNrKT1cImRvd25sb2FkUERGKG5vdGUpXCIgY2xhc3M9XCJkb3dubG9hZC1saW5rIGZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWRvd25sb2FkSW5Qcm9ncmVzc1tub3RlLmlkZW50aWZpZXJdXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuZG93bmxvYWRQZGYnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRvd25sb2FkSW5Qcm9ncmVzc1tub3RlLmlkZW50aWZpZXJdXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE2XCIgY2xhc3M9XCJtci0yXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICAgICAgICBEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBObyB0ZWFjaGVycyByZXNvdXJjZXMgbWVzc2FnZSAtLT5cclxuPGRpdiAqbmdJZj1cIiFoYXNUZWFjaGVyUmVzb3VyY2VzKClcIiBjbGFzcz1cIm5vLXJlc291cmNlcy1tZXNzYWdlIG10LTRcIj5cclxuICB7eyAnYXBwdG9jc2luZ2xlcGFnZS5ub1RlYWNoZXJzUmVzb3VyY2VzJyB8IHRyYW5zbGF0ZSB9fVxyXG48L2Rpdj4iXX0=