@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,766 +1,766 @@
1
- import { Component, Input, Inject, Optional } from '@angular/core';
2
- import { WsEvents } from '@sunbird-cb/utils-v2';
3
- import { NsContent } from '../../_services/widget-content.model';
4
- import { Subject } from 'rxjs';
5
- import { share, debounceTime, switchMap, takeUntil } from 'rxjs/operators';
6
- import { NsCohorts } from '../../models/app-toc.model';
7
- import { CreateBatchDialogComponent } from '../create-batch-dialog/create-batch-dialog.component';
8
- // import { IdiscussionConfig } from '@project-sunbird/discussions-ui-v8'
9
- // tslint:disable-next-line
10
- import _ from 'lodash';
11
- import { UntypedFormGroup, UntypedFormControl } from '@angular/forms';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/router";
14
- import * as i2 from "../../services/app-toc.service";
15
- import * as i3 from "@angular/platform-browser";
16
- import * as i4 from "../../services/access-control.service";
17
- import * as i5 from "@sunbird-cb/utils-v2";
18
- import * as i6 from "../../services/title-tag.service";
19
- import * as i7 from "@angular/material/legacy-dialog";
20
- import * as i8 from "../../services/mobile-apps.service";
21
- import * as i9 from "../../_collection/_common/connection-hover-card/connection-hover.servive";
22
- import * as i10 from "../../_services/rating.service";
23
- import * as i11 from "@ngx-translate/core";
24
- import * as i12 from "@angular/common";
25
- import * as i13 from "@angular/forms";
26
- import * as i14 from "@angular/material/icon";
27
- import * as i15 from "@angular/material/legacy-form-field";
28
- import * as i16 from "@angular/material/legacy-input";
29
- import * as i17 from "@angular/material/legacy-card";
30
- import * as i18 from "@angular/material/legacy-tabs";
31
- import * as i19 from "@angular/material/legacy-progress-spinner";
32
- import * as i20 from "@angular/material/legacy-select";
33
- import * as i21 from "@angular/material/legacy-core";
34
- import * as i22 from "../../_collection/_common/avatar-photo/avatar-photo.component";
35
- import * as i23 from "../../_collection/_common/connection-name/connection-name.component";
36
- import * as i24 from "../../_collection/card-rating-comment/card-rating-comment.component";
37
- import * as i25 from "ngx-infinite-scroll";
38
- import * as i26 from "../app-toc-sessions/app-toc-sessions.component";
39
- export class AppTocSinglePageComponent {
40
- constructor(router, route, tocSharedSvc, domSanitizer, authAccessControlSvc,
41
- // private dialog: MatDialog,
42
- logger, titleTagService, createBatchDialog, mobileAppsSvc, configSvc, connectionHoverService, eventSvc, ratingSvc, translate, langtranslations, environment) {
43
- this.router = router;
44
- this.route = route;
45
- this.tocSharedSvc = tocSharedSvc;
46
- this.domSanitizer = domSanitizer;
47
- this.authAccessControlSvc = authAccessControlSvc;
48
- this.logger = logger;
49
- this.titleTagService = titleTagService;
50
- this.createBatchDialog = createBatchDialog;
51
- this.mobileAppsSvc = mobileAppsSvc;
52
- this.configSvc = configSvc;
53
- this.connectionHoverService = connectionHoverService;
54
- this.eventSvc = eventSvc;
55
- this.ratingSvc = ratingSvc;
56
- this.translate = translate;
57
- this.langtranslations = langtranslations;
58
- this.environment = environment;
59
- this.contentTypes = NsContent.EContentTypes;
60
- this.primaryCategory = NsContent.EPrimaryCategory;
61
- this.showMoreGlance = false;
62
- this.askAuthorEnabled = true;
63
- this.trainingLHubEnabled = false;
64
- this.body = null;
65
- this.viewMoreRelatedTopics = false;
66
- this.hasTocStructure = false;
67
- this.tocStructure = null;
68
- this.contentParents = {};
69
- this.objKeys = Object.keys;
70
- this.activeFragment = this.route.fragment.pipe(share());
71
- this.content = null;
72
- this.routeSubscription = null;
73
- this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
74
- this.resumeData = null;
75
- this.batchData = null;
76
- this.tocConfig = null;
77
- this.routeQuerySubscription = null;
78
- this.isNotEditor = true;
79
- this.cohortResults = {};
80
- this.cohortTypesEnum = NsCohorts.ECohortTypes;
81
- this.discussionConfig = {};
82
- this.batchDataLoaded = false;
83
- this.unsubscribe = new Subject();
84
- // TODO: TO be removed important
85
- this.progress = 50;
86
- this.ratingReviews = [];
87
- this.ratingViewCount = 3;
88
- this.ratingViewCountDefault = 3;
89
- this.lookupLimit = 3;
90
- this.sortReviewValues = ['topReviews', 'latestReviews'];
91
- this.previousFilter = this.sortReviewValues[0];
92
- this.reviewPage = 1;
93
- this.reviewDefaultLimit = 2;
94
- this.disableLoadMore = false;
95
- this.displayLoader = false;
96
- this.tabSelectedIndex = 0;
97
- this.updateReviewsSubscription = null;
98
- this.lookupLoading = true;
99
- // configSvc: any
100
- this.compentencyKey = '';
101
- if (localStorage.getItem('websiteLanguage')) {
102
- this.translate.setDefaultLang('en');
103
- let lang = JSON.stringify(localStorage.getItem('websiteLanguage'));
104
- lang = lang.replace(/\"/g, '');
105
- this.translate.use(lang);
106
- }
107
- if (this.configSvc.restrictedFeatures) {
108
- this.askAuthorEnabled = !this.configSvc.restrictedFeatures.has('askAuthor');
109
- this.trainingLHubEnabled = !this.configSvc.restrictedFeatures.has('trainingLHub');
110
- }
111
- // if (this.route && this.route.parent) {
112
- // this.configSvc = this.route.parent.snapshot.data.profileData
113
- // }
114
- // this.route.data.subscribe(data => {
115
- // this.askAuthorEnabled = !data.restrictedData.data.has('askAuthor')
116
- // this.trainingLHubEnabled = !data.restrictedData.data.has('trainingLHub')
117
- // })
118
- this.discussionConfig = {
119
- // menuOptions: [{ route: 'categories', enable: true }],
120
- userName: (this.configSvc.nodebbUserProfile && this.configSvc.nodebbUserProfile.username) || '',
121
- };
122
- }
123
- ngOnInit() {
124
- this.compentencyKey = this.environment?.compentencyVersionKey || '';
125
- this.batchSubscription = this.tocSharedSvc.getSelectedBatch.subscribe(batchData => {
126
- this.selectedBatchData = batchData;
127
- });
128
- this.searchForm = new UntypedFormGroup({
129
- sortByControl: new UntypedFormControl(this.sortReviewValues[0]),
130
- searchKey: new UntypedFormControl(''),
131
- });
132
- // if (this.route && this.route.parent) {
133
- // this.routeSubscription = this.route.parent.data.subscribe((data: Data) => {
134
- // this.initData(data)
135
- // this.tocConfig = data.pageData.data
136
- // })
137
- // }
138
- if (this.initialrouteData) {
139
- this.initData(this.initialrouteData);
140
- this.tocConfig = this.initialrouteData.pageData.data;
141
- }
142
- if (this.configSvc && this.configSvc.userProfile && this.configSvc.userProfile.userId) {
143
- this.loggedInUserId = this.configSvc.userProfile.userId;
144
- }
145
- // check if the user has role editor,
146
- if (this.configSvc && this.configSvc.userRoles &&
147
- this.configSvc.userRoles.has('editor')) {
148
- // if editor, create batch button will be shown
149
- this.isNotEditor = false;
150
- }
151
- this.searchForm.valueChanges
152
- .pipe(debounceTime(500), switchMap(async (formValue) => {
153
- // tslint:disable-next-line: no-console
154
- // console.log('formValue :: ', formValue)
155
- if (this.previousFilter !== formValue.sortByControl) {
156
- this.previousFilter = formValue.sortByControl;
157
- this.sortReviews(formValue.sortByControl);
158
- }
159
- }), takeUntil(this.unsubscribe)).subscribe();
160
- this.updateReviewsSubscription = this.tocSharedSvc.updateReviewsObservable.subscribe((value) => {
161
- if (value) {
162
- this.updateReviews();
163
- }
164
- });
165
- }
166
- ngOnChanges() {
167
- if (this.batchData) {
168
- // setting tab to focus on "CONTENT tab" if already user is enrolled
169
- this.tabSelectedIndex = 1;
170
- }
171
- }
172
- detailUrl(data) {
173
- // let locationOrigin = environment.sitePath ? `https://${environment.sitePath}` : location.origin
174
- let locationOrigin = location.origin;
175
- if (this.configSvc.activeLocale && this.configSvc.activeLocale.path) {
176
- locationOrigin += `/${this.configSvc.activeLocale.path}`;
177
- }
178
- switch (data.primaryCategory) {
179
- case NsContent.EPrimaryCategory.CHANNEL:
180
- return `${locationOrigin}${data.artifactUrl}`;
181
- case NsContent.EPrimaryCategory.KNOWLEDGE_BOARD:
182
- return `${locationOrigin}/app/knowledge-board/${data.identifier}`;
183
- case NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT:
184
- return `${locationOrigin}/app/toc/${data.identifier}/overview?primaryCategory=${data.primaryCategory}`;
185
- default:
186
- return `${locationOrigin}/app/toc/${data.identifier}/overview?primaryCategory=${data.primaryCategory}`;
187
- }
188
- }
189
- ngOnDestroy() {
190
- if (this.routeSubscription) {
191
- this.routeSubscription.unsubscribe();
192
- }
193
- if (this.routeQuerySubscription) {
194
- this.routeQuerySubscription.unsubscribe();
195
- }
196
- if (this.updateReviewsSubscription) {
197
- this.updateReviewsSubscription.unsubscribe();
198
- }
199
- if (this.batchSubscription) {
200
- this.batchSubscription.unsubscribe();
201
- }
202
- }
203
- get showSubtitleOnBanner() {
204
- return this.tocSharedSvc.subtitleOnBanners;
205
- }
206
- get showDescription() {
207
- if (this.content && !this.content.body) {
208
- return true;
209
- }
210
- return this.tocSharedSvc.showDescription;
211
- }
212
- get isResource() {
213
- if (this.content) {
214
- const isResource = this.content.primaryCategory === NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT ||
215
- this.content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE || !this.content.children.length;
216
- if (isResource) {
217
- this.mobileAppsSvc.sendViewerData(this.content);
218
- }
219
- return isResource;
220
- }
221
- return false;
222
- }
223
- setSocialMediaMetaTags(data) {
224
- this.titleTagService.setSocialMediaTags(this.detailUrl(data), data.name, data.description, data.appIcon);
225
- }
226
- initData(data) {
227
- const initData = this.tocSharedSvc.initData(data);
228
- this.content = initData.content;
229
- if (this.content && this.content.identifier) {
230
- this.fetchRatingSummary();
231
- }
232
- if (this.content && this.content[this.compentencyKey]) {
233
- this.content[this.compentencyKey] = this.content[this.compentencyKey];
234
- this.competencies = this.content[this.compentencyKey] || [];
235
- }
236
- this.discussionConfig.contextIdArr = (this.content) ? [this.content.identifier] : [];
237
- if (this.content) {
238
- this.discussionConfig.categoryObj = {
239
- category: {
240
- name: this.content.name,
241
- pid: '',
242
- description: this.content.description,
243
- context: [
244
- {
245
- type: 'course',
246
- identifier: this.content.identifier,
247
- },
248
- ],
249
- },
250
- };
251
- }
252
- this.discussionConfig.contextType = 'course';
253
- this.setSocialMediaMetaTags(this.content);
254
- this.body = this.domSanitizer.bypassSecurityTrustHtml(this.content && this.content.body
255
- ? this.forPreview
256
- ? this.authAccessControlSvc.proxyToAuthoringUrl(this.content.body)
257
- : this.content.body
258
- : '');
259
- this.contentParents = {};
260
- this.resetAndFetchTocStructure();
261
- // this.getTrainingCount()
262
- // this.getContentParent()
263
- // if (this.content && this.content.identifier) {
264
- // this.fetchCohorts(this.cohortTypesEnum.ACTIVE_USERS, this.content.identifier)
265
- // this.fetchCohorts(this.cohortTypesEnum.AUTHORS, this.content.identifier)
266
- // }
267
- }
268
- sanitize(data) {
269
- return this.domSanitizer.bypassSecurityTrustHtml(data);
270
- }
271
- getContentParent() {
272
- if (this.content) {
273
- const contentParentReq = {
274
- fields: ['contentType', 'name'],
275
- };
276
- this.tocSharedSvc
277
- .fetchContentParent(this.content.identifier, contentParentReq, this.forPreview)
278
- .subscribe(res => {
279
- this.parseContentParent(res);
280
- }, _err => {
281
- this.contentParents = {};
282
- });
283
- }
284
- }
285
- getCompetencies(competencies) {
286
- const competenciesArray = JSON.parse(competencies);
287
- const competencyStringArray = [];
288
- competenciesArray.map((c) => {
289
- // if (i < (competenciesArray.length -1)) {
290
- // competencyString.push(`${c.name}, `)
291
- // } else {
292
- // competencyString.push(c.name)
293
- // }
294
- competencyStringArray.push(c.name);
295
- });
296
- return competencyStringArray;
297
- }
298
- parseContentParent(content) {
299
- content.collections.forEach(collection => {
300
- if (!this.contentParents.hasOwnProperty(collection.contentType)) {
301
- this.contentParents[collection.contentType] = [];
302
- }
303
- this.contentParents[collection.contentType].push(collection);
304
- this.parseContentParent(collection);
305
- });
306
- }
307
- resetAndFetchTocStructure() {
308
- this.tocStructure = {
309
- assessment: 0,
310
- finalTest: 0,
311
- course: 0,
312
- handsOn: 0,
313
- interactiveVideo: 0,
314
- learningModule: 0,
315
- other: 0,
316
- pdf: 0,
317
- survey: 0,
318
- podcast: 0,
319
- practiceTest: 0,
320
- quiz: 0,
321
- video: 0,
322
- webModule: 0,
323
- webPage: 0,
324
- youtube: 0,
325
- interactivecontent: 0,
326
- offlineSession: 0,
327
- };
328
- if (this.content) {
329
- this.hasTocStructure = false;
330
- this.tocStructure.learningModule = this.content.primaryCategory === this.primaryCategory.MODULE ? -1 : 0;
331
- this.tocStructure.course = this.content.primaryCategory === this.primaryCategory.COURSE ? -1 : 0;
332
- this.tocStructure = this.tocSharedSvc.getTocStructure(this.content, this.tocStructure);
333
- for (const progType in this.tocStructure) {
334
- if (this.tocStructure[progType] > 0) {
335
- this.hasTocStructure = true;
336
- break;
337
- }
338
- }
339
- }
340
- }
341
- // For Learning Hub trainings
342
- // private getTrainingCount() {
343
- // if (
344
- // this.trainingLHubEnabled &&
345
- // this.content &&
346
- // this.trainingSvc.isValidTrainingContent(this.content) &&
347
- // !this.forPreview
348
- // ) {
349
- // this.trainingLHubCount$ = this.trainingApi
350
- // .getTrainingCount(this.content.identifier)
351
- // .pipe(retry(2))
352
- // }
353
- // }
354
- // openQueryMailDialog(content: any, data: any) {
355
- // const emailArray = []
356
- // emailArray.push(data.email)
357
- // const dialogdata = {
358
- // content,
359
- // user: data,
360
- // emails: emailArray,
361
- // }
362
- // dialogdata.user.isAuthor = true
363
- // this.dialog.open<BtnMailUserDialogComponent, IBtnMailUser>(
364
- // BtnMailUserDialogComponent,
365
- // {
366
- // // width: '50vw',
367
- // minWidth: '40vw',
368
- // maxWidth: '80vw',
369
- // data: dialogdata,
370
- // }
371
- // )
372
- // }
373
- openDialog(content) {
374
- const dialogRef = this.createBatchDialog.open(CreateBatchDialogComponent, {
375
- // height: '400px',
376
- width: '600px',
377
- data: { content },
378
- });
379
- // dialogRef.componentInstance.xyz = this.configSvc
380
- dialogRef.afterClosed().subscribe((_result) => {
381
- if (!this.batchId) {
382
- this.tocSharedSvc.updateBatchData();
383
- }
384
- });
385
- }
386
- parseJsonData(s) {
387
- try {
388
- const parsedString = JSON.parse(s);
389
- return parsedString;
390
- }
391
- catch {
392
- return [];
393
- }
394
- }
395
- // cohorts & learners
396
- get enablePeopleSearch() {
397
- if (this.configSvc.restrictedFeatures) {
398
- return !this.configSvc.restrictedFeatures.has('peopleSearch');
399
- }
400
- return false;
401
- }
402
- goToUserProfile(user) {
403
- if (this.enablePeopleSearch) {
404
- this.router.navigate(['/app/person-profile', user.wid]);
405
- // this.router.navigate(['/app/person-profile'], { queryParams: { emailId: user.email } })
406
- }
407
- }
408
- getUserFullName(user) {
409
- // this.getHoverUser(user: any)
410
- if (user && user.first_name && user.last_name) {
411
- return `${user.first_name.trim()} ${user.last_name.trim()}`;
412
- }
413
- return '';
414
- }
415
- getHoverUser(user) {
416
- const userId = user.wid;
417
- this.connectionHoverService.fetchProfile(userId).subscribe((res) => {
418
- if (res.profileDetails !== null) {
419
- this.howerUser = res.profileDetails;
420
- }
421
- else {
422
- this.howerUser = res || {};
423
- }
424
- return this.howerUser;
425
- });
426
- }
427
- fetchCohorts(cohortType, contentID) {
428
- if (!this.cohortResults[cohortType] && !this.forPreview) {
429
- this.tocSharedSvc.fetchContentCohorts(cohortType, contentID).subscribe((data) => {
430
- this.cohortResults[cohortType] = {
431
- contents: _.map(data, d => {
432
- return {
433
- first_name: _.get(d, 'first_name'),
434
- last_name: _.get(d, 'last_name'),
435
- department: _.get(d, 'department'),
436
- designation: _.get(d, 'designation'),
437
- email: _.get(d, 'email'),
438
- desc: _.get(d, 'desc'),
439
- uid: _.get(d, 'user_id'),
440
- last_ts: _.get(d, 'last_ts'),
441
- phone_No: _.get(d, 'phone_No'),
442
- city: _.get(d, 'city'),
443
- userLocation: _.get(d, 'userLocation'),
444
- };
445
- }) || [],
446
- hasError: false,
447
- };
448
- }, () => {
449
- this.cohortResults[cohortType] = {
450
- contents: [],
451
- hasError: true,
452
- };
453
- });
454
- }
455
- else if (this.cohortResults[cohortType] && !this.forPreview) {
456
- return;
457
- }
458
- else {
459
- this.cohortResults[cohortType] = {
460
- contents: [],
461
- hasError: false,
462
- };
463
- }
464
- }
465
- fetchRatingSummary() {
466
- this.displayLoader = true;
467
- if (!this.forPreview && this.content && this.content.identifier && this.content.primaryCategory) {
468
- this.ratingSvc.getRatingSummary(this.content.identifier, this.content.primaryCategory).subscribe((res) => {
469
- this.displayLoader = false;
470
- if (res && res.result && res.result.response) {
471
- this.ratingSummary = res.result.response;
472
- }
473
- // TODO: To be removed
474
- // this.hardcodeData()
475
- this.ratingSummaryProcessed = this.processRatingSummary();
476
- }, (err) => {
477
- this.displayLoader = false;
478
- this.logger.error('USER RATING FETCH ERROR >', err);
479
- // TODO: To be removed
480
- // this.hardcodeData()
481
- // this.ratingSummaryProcessed = this.processRatingSummary()
482
- });
483
- }
484
- }
485
- getAuthorReply(identifier, primaryCategory, userIds) {
486
- const request = {
487
- request: {
488
- activityId: identifier,
489
- activityType: primaryCategory,
490
- userId: userIds,
491
- },
492
- };
493
- return this.ratingSvc.getRatingReply(request).subscribe((res) => {
494
- this.displayLoader = false;
495
- if (res && res.result && res.result.content) {
496
- const reatingAuthReplay = res.result.content;
497
- _.forEach(reatingAuthReplay, value => {
498
- if (this.authReplies[value.userId]) {
499
- this.authReplies[value.userId]['comment'] = value.comment;
500
- this.authReplies[value.userId]['userId'] = value.userId;
501
- }
502
- });
503
- }
504
- return this.authReplies;
505
- // TODO: To be removed
506
- // this.hardcodeData()
507
- // this.ratingSummaryProcessed = this.processRatingSummary()
508
- }, (err) => {
509
- this.displayLoader = false;
510
- this.logger.error('USER RATING FETCH ERROR >', err);
511
- // TODO: To be removed
512
- // this.hardcodeData()
513
- // this.ratingSummaryProcessed = this.processRatingSummary()
514
- });
515
- }
516
- get checkForFacilitators() {
517
- const facilitators = [];
518
- if (this.selectedBatchData &&
519
- this.selectedBatchData.content[0] &&
520
- this.selectedBatchData.content[0].batchAttributes &&
521
- this.selectedBatchData.content[0].batchAttributes.sessionDetails_v2 &&
522
- this.selectedBatchData.content[0].batchAttributes.sessionDetails_v2.length) {
523
- this.selectedBatchData.content[0].batchAttributes.sessionDetails_v2.map((sessionDetails) => {
524
- sessionDetails.facilatorDetails.map((facilitator) => [
525
- facilitators.push(facilitator),
526
- ]);
527
- });
528
- }
529
- return facilitators;
530
- }
531
- fetchRatingLookup() {
532
- this.displayLoader = true;
533
- if (this.content && this.content.identifier && this.content.primaryCategory) {
534
- const req = {
535
- activityId: this.content.identifier,
536
- activityType: this.content.primaryCategory,
537
- // this field can be enabled if specific ratings have to be looked up
538
- // rating: 0,
539
- limit: this.lookupLimit,
540
- ...((this.lastLookUp && this.lastLookUp.updatedOnUUID) ? { updateOn: (this.lastLookUp && this.lastLookUp.updatedOnUUID) } : null),
541
- };
542
- this.ratingSvc.getRatingLookup(req).subscribe((res) => {
543
- this.displayLoader = false;
544
- // // console.log('Rating summary res ', res)
545
- if (res && res.result && res.result.response) {
546
- if (this.reviewPage > 1) {
547
- res.result.response.map((item) => {
548
- if (!this.ratingLookup.find((o) => o.updatedOnUUID === item.updatedOnUUID)) {
549
- this.ratingLookup.push(item);
550
- }
551
- });
552
- }
553
- else {
554
- this.ratingLookup = res.result.response;
555
- }
556
- }
557
- this.processRatingLookup(res.result.response);
558
- }, (err) => {
559
- this.displayLoader = false;
560
- this.logger.error('USER RATING FETCH ERROR >', err);
561
- });
562
- }
563
- }
564
- showALLReviews(length) {
565
- this.ratingViewCount = length;
566
- }
567
- processRatingSummary() {
568
- const breakDownArray = [];
569
- const ratingSummaryPr = {
570
- breakDown: breakDownArray,
571
- latest50Reviews: breakDownArray,
572
- ratingsNumber: breakDownArray,
573
- total_number_of_ratings: _.get(this.ratingSummary, 'total_number_of_ratings') || 0,
574
- avgRating: 0,
575
- };
576
- const totRatings = _.get(this.ratingSummary, 'sum_of_total_ratings') || 0;
577
- ratingSummaryPr.breakDown.push({
578
- percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount1stars'), 1, totRatings),
579
- key: 1,
580
- value: _.get(this.ratingSummary, 'totalcount1stars'),
581
- });
582
- ratingSummaryPr.breakDown.push({
583
- percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount2stars'), 2, totRatings),
584
- key: 2,
585
- value: _.get(this.ratingSummary, 'totalcount2stars'),
586
- });
587
- ratingSummaryPr.breakDown.push({
588
- percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount3stars'), 3, totRatings),
589
- key: 3,
590
- value: _.get(this.ratingSummary, 'totalcount3stars'),
591
- });
592
- ratingSummaryPr.breakDown.push({
593
- percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount4stars'), 4, totRatings),
594
- key: 4,
595
- value: _.get(this.ratingSummary, 'totalcount4stars'),
596
- });
597
- ratingSummaryPr.breakDown.push({
598
- percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount5stars'), 5, totRatings),
599
- key: 5,
600
- value: _.get(this.ratingSummary, 'totalcount5stars'),
601
- });
602
- // tslint:disable-next-line:max-line-length
603
- // ratingSummaryPr.latest50Reviews = this.ratingSummary && this.ratingSummary.latest50Reviews ? JSON.parse(this.ratingSummary.latest50Reviews) : []
604
- // // ratingSummaryPr.latest50Reviews = this.ratingSummary.latest50Reviews
605
- // this.ratingReviews = this.ratingSummary && this.ratingSummary.latest50Reviews ? JSON.parse(this.ratingSummary.latest50Reviews) : []
606
- // ratingSummaryPr.avgRating = parseFloat(((((totRatings / this.ratingSummary.total_number_of_ratings) * 100) * 5) / 100).toFixed(1))
607
- if (this.ratingSummary && this.ratingSummary.latest50Reviews) {
608
- // ratingSummaryPr.latest50Reviews = JSON.parse(this.ratingSummary.latest50Reviews)
609
- // this.ratingReviews = JSON.parse(this.ratingSummary.latest50Reviews)
610
- const latest50Reviews = JSON.parse(this.ratingSummary.latest50Reviews);
611
- const modifiedReviews = _.map(latest50Reviews, rating => {
612
- rating['userId'] = rating.user_id;
613
- return rating;
614
- });
615
- this.authReplies = [];
616
- this.authReplies = _.keyBy(latest50Reviews, 'user_id');
617
- const userIds = _.map(latest50Reviews, 'user_id');
618
- if (this.content) {
619
- this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
620
- }
621
- ratingSummaryPr.latest50Reviews = modifiedReviews;
622
- this.ratingReviews = modifiedReviews;
623
- }
624
- // rating changes 07 march 23
625
- // const meanRating = ratingSummaryPr.breakDown.reduce((val, item) => {
626
- // // console.log('item', item)
627
- // return val + (item.key * item.value)
628
- // // tslint:disable-next-line: align
629
- // }, 0)
630
- // tslint:disable-next-line:max-line-length
631
- // ratingSummaryPr.avgRating = this.ratingSummary && this.ratingSummary.total_number_of_ratings ? parseFloat((meanRating / this.ratingSummary.total_number_of_ratings).toFixed(1)) : 0
632
- if (this.ratingSummary && this.ratingSummary.total_number_of_ratings) {
633
- // ratingSummaryPr.avgRating = parseFloat((meanRating / this.ratingSummary.total_number_of_ratings).toFixed(1))
634
- ratingSummaryPr.avgRating =
635
- parseFloat((this.ratingSummary.sum_of_total_ratings / this.ratingSummary.total_number_of_ratings).toFixed(1));
636
- }
637
- if (this.content) {
638
- this.content.averageRating = ratingSummaryPr.avgRating;
639
- this.content.totalRating = ratingSummaryPr.total_number_of_ratings;
640
- }
641
- // ratingSummaryPr.avgRating = 5
642
- return ratingSummaryPr;
643
- }
644
- processRatingLookup(response) {
645
- if (response) {
646
- if (response && response.length < this.lookupLimit) {
647
- this.disableLoadMore = true;
648
- }
649
- else {
650
- this.disableLoadMore = false;
651
- this.lookupLoading = false;
652
- }
653
- this.lastLookUp = response[response.length - 1];
654
- this.ratingReviews = this.ratingLookup;
655
- this.authReplies = [];
656
- this.authReplies = _.keyBy(this.ratingReviews, 'userId');
657
- const userIds = _.map(this.ratingReviews, 'userId');
658
- if (this.content && userIds) {
659
- this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
660
- }
661
- this.ratingReviews = this.ratingReviews.slice();
662
- }
663
- }
664
- countStarsPercentage(value, key, total) {
665
- if (value && total) {
666
- return (((value * key) / total) * 100).toFixed(2);
667
- }
668
- return 0;
669
- }
670
- getRatingIcon(ratingIndex, avg) {
671
- return this.ratingSvc.getRatingIcon(ratingIndex, avg);
672
- }
673
- getRatingIconClass(ratingIndex, avg) {
674
- return this.ratingSvc.getRatingIconClass(ratingIndex, avg);
675
- }
676
- sortReviews(sort) {
677
- // Reset the counters/ previous values before changing the filter and view
678
- this.ratingViewCount = this.ratingViewCountDefault;
679
- this.lastLookUp = '';
680
- this.ratingReviews = [];
681
- this.reviewPage = 1;
682
- this.disableLoadMore = false;
683
- this.ratingLookup = [];
684
- if (!this.forPreview) {
685
- if (sort === this.sortReviewValues[0]) {
686
- this.fetchRatingSummary();
687
- }
688
- else {
689
- this.fetchRatingLookup();
690
- }
691
- }
692
- }
693
- // To updated both reviews, and rating summary at once in case of edit scenario
694
- updateReviews() {
695
- // Reset the counters/ previous values before changing the filter and view
696
- this.ratingViewCount = this.ratingViewCountDefault;
697
- this.lastLookUp = '';
698
- this.ratingReviews = [];
699
- this.reviewPage = 1;
700
- this.disableLoadMore = false;
701
- this.ratingLookup = [];
702
- this.fetchRatingSummary();
703
- if (this.previousFilter !== this.sortReviewValues[0]) {
704
- this.fetchRatingLookup();
705
- }
706
- }
707
- get usr() {
708
- return this.howerUser;
709
- }
710
- tabClicked(tabEvent) {
711
- // if (this.forPreview) {
712
- // return
713
- // }
714
- const data = {
715
- label: `${tabEvent.tab.textLabel}`,
716
- index: tabEvent.index,
717
- };
718
- this.eventSvc.handleTabTelemetry(WsEvents.EnumInteractSubTypes.COURSE_TAB, data, {
719
- id: this.content && this.content.identifier,
720
- type: this.content && this.content.primaryCategory,
721
- });
722
- }
723
- loadMore() {
724
- if (!this.disableLoadMore && !this.lookupLoading) {
725
- this.lookupLoading = true;
726
- // tslint:disable-next-line: no-non-null-assertion
727
- if ((this.searchForm.get('sortByControl').value === this.sortReviewValues[0])) {
728
- if ((this.reviewPage * this.ratingViewCount) > this.ratingReviews.length) {
729
- this.disableLoadMore = true;
730
- }
731
- this.reviewPage = this.reviewPage + 1;
732
- this.ratingViewCount = this.reviewPage * this.ratingViewCount;
733
- }
734
- else {
735
- this.reviewPage = this.reviewPage + 1;
736
- this.ratingViewCount = this.reviewPage * this.reviewDefaultLimit;
737
- this.fetchRatingLookup();
738
- }
739
- }
740
- }
741
- translateLabels(label, type) {
742
- return this.langtranslations.translateLabelWithoutspace(label, type, '');
743
- }
744
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocSinglePageComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.AppTocService }, { token: i3.DomSanitizer }, { token: i4.AccessControlService }, { token: i5.LoggerService }, { token: i6.TitleTagService }, { token: i7.MatLegacyDialog }, { token: i8.MobileAppsService }, { token: i5.ConfigurationsService }, { token: i9.ConnectionHoverService }, { token: i5.EventService }, { token: i10.RatingService }, { token: i11.TranslateService }, { token: i5.MultilingualTranslationsService }, { token: 'environment', optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
745
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocSinglePageComponent, selector: "ws-app-app-toc-single-page", inputs: { content: "content", initialrouteData: "initialrouteData", forPreview: "forPreview", resumeData: "resumeData", batchData: "batchData" }, usesOnChanges: true, ngImport: i0, template: "<mat-tab-group [selectedIndex]=\"tabSelectedIndex\" class=\"custom-tabgroup\" (selectedTabChange)=\"tabClicked($event)\">\n <mat-tab label=\"{{'apptocsinglepage.overview' | translate}}\">\n <ng-template matTabContent>\n <section id=\"overview\">\n <div class=\"fixed-width flex flex-wrap\">\n <div class=\"meta-section\">\n <!-- Description : Conditional : If not shown here, will be shown over banner -->\n <mat-card *ngIf=\"\n tocConfig?.overview?.description?.enabled &&\n showDescription &&\n showSubtitleOnBanner &&\n content?.description\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.description?.displayName, 'apptocsinglepage') }}</h2>\n <mat-card-content>\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.description)\">\n </div>\n </mat-card-content>\n </mat-card>\n <!-- Content Body -->\n <mat-card *ngIf=\"tocConfig?.overview?.body?.enabled && content?.instructions\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.body?.displayName, 'apptocsinglepage') }}\n </h2>\n <mat-card-content>\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.instructions)\">\n </div>\n </mat-card-content>\n </mat-card>\n <!-- Learning objective -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.learningObjective?.enabled && content?.learningObjective\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.learningObjective?.displayName }}</h2>\n <mat-card-content>\n <p class=\"section-content mat-subheading-1\" [innerHTML]=\"content?.learningObjective\"></p>\n </mat-card-content>\n </mat-card> -->\n\n <!-- Registration instructions -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.registrationInstructions?.enabled &&\n content?.registrationInstructions?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.registrationInstructions?.displayName }}</h2>\n <mat-card-content>\n <div class=\"section-content mat-subheading-1 break-words\"\n [innerHTML]=\"content?.registrationInstructions\"></div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preContents?.enabled && content?.preContents?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preContents?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let preContent of content?.preContents\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + preContent.identifier\"\n [queryParams]=\"{primaryCategory: preContent?.primaryCategory}\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ preContent.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.postContents?.enabled && content?.postContents?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.postContents?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let postContent of content?.postContents\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + postContent.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ postContent.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.certificationList?.enabled && content?.certificationList?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.certificationList?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let certification of content?.certificationList\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + certification.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ certification.name }}\n </p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.studyMaterials?.enabled && content?.studyMaterials?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.studyMaterials?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let studyitem of content?.studyMaterials\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + studyitem.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ studyitem.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.playgroundResources?.enabled && content?.playgroundResources?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.playgroundResources?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let playgroundResource of content?.playgroundResources\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + playgroundResource.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\n {{ playgroundResource.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.kArtifacts?.enabled && content?.kArtifacts?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.kArtifacts?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let kArtifact of content?.kArtifacts\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + kArtifact.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ kArtifact.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.equivalentCertifications?.enabled &&\n content?.equivalentCertifications?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.equivalentCertifications?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let equivalentCertification of content?.equivalentCertifications\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + equivalentCertification.identifier +'?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\n {{ equivalentCertification.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.softwareRequirements?.enabled && content?.softwareRequirements?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.softwareRequirements?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let softwareRequirement of content?.softwareRequirements\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [href]=\"softwareRequirement.url\" target=\"blank\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\n {{ softwareRequirement.title }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- Skills -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.skills?.enabled && content?.skills?.length\"\n class=\"unit-meta-item mat-app-background\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.skills?.displayName }}</h2>\n <mat-chip-list>\n <mat-chip class=\"section-content\" *ngFor=\"let skill of content?.skills\">{{ skill.name }}</mat-chip>\n </mat-chip-list>\n </mat-card> -->\n <!-- Requirements -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preRequisites?.enabled && content?.preRequisites\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preRequisites?.displayName }}</h2>\n <mat-card-content>\n <div class=\"mat-subheading-1\" [innerHTML]=\"content?.preRequisites\"></div>\n <div class=\"margin-top-s\" *ngIf=\"content?.softwareRequirements?.length\">\n <h3 class=\"mat-h3 margin-bottom-xs\" >Software Requirements</h3>\n <ng-container *ngFor=\"let requirement of content?.softwareRequirements\">\n <a *ngIf=\"requirement.url\" class=\"margin-right-s\" mat-stroked-button target=\"_blank\"\n [href]=\"requirement.url\">\n {{ requirement.title }}\n </a>\n <a mat-stroked-button class=\"margin-right-s\"\n *ngIf=\"!requirement?.url\">{{ requirement.title }}\n </a>\n </ng-container>\n </div>\n </mat-card-content>\n </mat-card> -->\n\n <!-- Training (LHub) -->\n <!-- <mat-card *ngIf=\"trainingLHubEnabled && trainingLHubCount$ | async as trainingLHubCount\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\" >Trainings</h2>\n <h4 class=\"mat-h4\">\n <ng-container>{{ trainingLHubCount }}</ng-container>\n <ng-container i18n=\"x trainings available\" *ngIf=\"trainingLHubCount > 1\">\n trainings available</ng-container>\n <ng-container i18n=\"1 training available\" *ngIf=\"trainingLHubCount === 1\">\n training available</ng-container>\n </h4>\n <div>\n\n </div>\n </mat-card> -->\n\n <!-- Related Topics -->\n <!-- <mat-card class=\"unit-meta-item\" *ngIf=\"tocConfig?.overview?.topics?.enabled && content?.topics?.length\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.topics?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex flex-between flex-wrapped\">\n <a mat-stroked-button class=\"topic-button text-truncate\"\n *ngFor=\"let topic of content?.topics | pipeLimitTo: (viewMoreRelatedTopics ? 24 : 6)\"\n [title]=\"topic?.name\" [routerLink]=\"'/app/concept-graph/' + topic.identifier\">\n {{ topic?.name }}\n </a>\n </div>\n <div *ngIf=\"content?.topics?.length > 6\" class=\"text-right margin-top-xs\">\n <a mat-button (click)=\"viewMoreRelatedTopics = !viewMoreRelatedTopics\">\n <span *ngIf=\"!viewMoreRelatedTopics\" >View More</span>\n <span *ngIf=\"viewMoreRelatedTopics\" >View Less</span>\n </a>\n </div>\n </mat-card-content>\n </mat-card>\n <div class=\"margin-bottom-m\" *ngIf=\"objKeys(contentParents).length\">\n <mat-card>\n <h2 >This content is part of</h2>\n </mat-card>\n <mat-accordion>\n <ng-container *ngFor=\"let key of objKeys(contentParents)\">\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n {{ key }}\n </mat-expansion-panel-header>\n <div class=\"flex mb-1\" *ngFor=\"let content of contentParents[key]\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"\n content.status !== 'Live'\n ? '/author' + '/toc/' + content.identifier +'?primaryCategory='+ item.primaryCategory\n : '/app' + '/toc/' + content.identifier + '?primaryCategory='+ item.primaryCategory\n \">\n <p class=\"margin-remove-bottom mat-subheading-1\">{{ content.name }}</p>\n </a>\n </div>\n </mat-expansion-panel>\n </ng-container>\n </mat-accordion>\n </div> -->\n </div>\n </div>\n </section>\n <section id=\"authors\" *ngIf=\"(content?.creatorDetails && content?.creatorDetails.length > 0) || (content?.creatorContacts && content?.creatorContacts.length > 0) ||\n (cohortResults[cohortTypesEnum.AUTHORS] && cohortResults[cohortTypesEnum.AUTHORS].length > 0)\">\n <div class=\"fluid-width contacts-container\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.authorsAndCurators' | translate}}</h2>\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\n <!-- authors -->\n <div *ngFor=\"let author of parseJsonData(content?.creatorDetails)\"\n class=\"unit-cohort sm:pr-8 md:pr-10\">\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\n [datalen]=\"1\"\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\n </ws-widget-avatar-photo>\n <div class=\"margin-left-xl\">\n <div class=\"user-name\">{{ author.name }}</div>\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.author' | translate}}</p>\n </div>\n </div>\n <!-- curators -->\n <div *ngFor=\"let author of parseJsonData(content?.creatorContacts)\"\n class=\"unit-cohort user-card sm:pr-8 md:pr-10\">\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [randomColor]=\"true\"\n [datalen]=\"1\"\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\n </ws-widget-avatar-photo>\n <div class=\"\">\n <div class=\"user-name\">{{ author.name }}</div>\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\n </div>\n </div>\n <!-- <div *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS]\">\n <h3 *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS].hasError\" class=\"mat-error text-center\" >\n Failed to fetch curators\n </h3>\n <h3 *ngIf=\"\n !cohortResults[cohortTypesEnum.AUTHORS].hasError &&\n !cohortResults[cohortTypesEnum.AUTHORS].contents.length\n \" class=\"text-center\" >\n None\n </h3>\n <ng-container *ngFor=\"let cohort of cohortResults[cohortTypesEnum.AUTHORS].contents\"\n [ngTemplateOutlet]=\"unitCohortNew1\" [ngTemplateOutletContext]=\"{ user: cohort }\">\n </ng-container>\n </div> -->\n </div>\n </div>\n </div>\n </section>\n <section id=\"director\" *ngIf=\"checkForFacilitators.length\">\n <div class=\"fluid-width contacts-container\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.programDirectorFacilitators' | translate}}</h2>\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\n <!-- <ng-container *ngFor=\"let sessionDetails of selectedBatchData?.content[0]?.batchAttributes?.sessionDetails_v2\"> -->\n <ng-container *ngFor=\"let facilitator of checkForFacilitators\">\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\n [datalen]=\"1\"\n [size]=\"'round-m'\" [photoUrl]=\"facilitator.photo || ''\" [name]=\"facilitator.name\">\n </ws-widget-avatar-photo>\n <div class=\"margin-left-xl\">\n <div class=\"user-name\">{{ facilitator.name }}</div>\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.facilitator' | translate}}</p>\n </div>\n </div>\n </ng-container>\n <!-- </ng-container> -->\n </div>\n </div>\n </div>\n </section>\n <section id=\"competencies\"\n *ngIf=\"content[compentencyKey] && competencies.length\">\n <div class=\"fluid-width contacts-container mb-10\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\n </div>\n <div>\n <table class=\"compt-table width-1-1 text-left\">\n <tr>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.subTheme' | translate}}</th>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.theme' | translate}} </th>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.area' | translate}}</th>\n </tr>\n <tr *ngFor=\"let comp of competencies\">\n <td class=\"padding-xs mat-body-1\">{{comp.competencySubTheme}}</td>\n <td class=\"padding-xs mat-body-1\">{{comp.competencyTheme}}</td>\n <td class=\"padding-xs mat-body-1\">{{comp.competencyArea}}</td>\n </tr>\n </table>\n </div>\n </div>\n </section>\n <!-- <section id=\"competencies\"\n *ngIf=\"((!content?.test_competencies_v4 && content?.competencies_v3) &&\n (competencies.length) || (content?.competencies && competencies.length))\">\n <div class=\"fluid-width contacts-container mb-10\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\n </div>\n <div>\n <table class=\"compt-table width-1-1 text-left\">\n <tr>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.competency' | translate}}</th>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.type' | translate}}</th>\n </tr>\n <tr *ngFor=\"let comp of competencies\">\n <td class=\"padding-xs mat-body-1\">{{comp.name}}</td>\n <td class=\"padding-xs mat-body-1\">{{comp.competencyType}}</td>\n </tr>\n </table>\n </div>\n </div>\n </section> -->\n <section id=\"rating\" *ngIf=\"!forPreview\">\n <div class=\"fluid-width contacts-container mb-10\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.ratingsReviews' | translate}}</h2>\n </div>\n <!-- <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary> -->\n\n <div class=\"search\">\n <form [formGroup]=\"searchForm\">\n <div class=\"flex top_search_box\">\n <div class=\"flex-1 search_box_inner\">\n <div class=\"flex flex-1 flex-column margin-fix search search_box_main\">\n <mat-form-field appearance=\"outline\"\n class=\"autocomplete-form search_form margin-right-s\" color=\"primary\">\n <mat-icon matPrefix\n class=\"flex items-center justify-center mr-2\">search\n </mat-icon>\n <!-- <mat-label>Search</mat-label> -->\n <input type=\"search\" name=\"searchKey\" #searchKey class=\"ml-2\" i18-aria-label\n aria-label=\"Search\" formControlName=\"searchKey\"\n i18n-placeholder=\"search\" [placeholder]=\"'apptocsinglepage.search' | translate\" matInput maxlength=\"50\"/>\n <!-- (input)=\"updateQuery(searchKey.value)\" -->\n </mat-form-field>\n </div>\n </div>\n <div class=\"item_dropdown_box\">\n <div class=\"flex flex-1 flex-wrap section-input\">\n <div class=\"item\">\n <mat-form-field class=\"\" appearance=\"outline\">\n <mat-select #sortBySelect formControlName=\"sortByControl\"\n i18n-placeholder placeholder=\"Sort by\">\n <mat-option [value]=\"'topReviews'\" slected>{{'apptocsinglepage.topReviews' | translate}}\n </mat-option>\n <mat-option [value]=\"'latestReviews'\">{{'apptocsinglepage.latestReviews' | translate}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n\n <!-- <div class=\"rating-comments\">\n <ng-container *ngFor=\"let c of ratingReviews|\n pipeFilterV3:{ 'user_id': searchKey.value, 'review': searchKey.value } : false |\n slice:0:ratingViewCount; let i= index; let last = last\">\n <ws-widget-card-rating-comment [review]=\"c\"></ws-widget-card-rating-comment>\n\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount <=3 && i>=2 && last\">\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \"\n (click)=\"showALLReviews(ratingReviews?.length)\">\n <span >SEE ALL {{ratingReviews?.length}} REVIEWS</span>\n </a>\n </div>\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount > 3 && i>=2 && last\">\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \" (click)=\"showALLReviews(3)\">\n <span >SEE LESS REVIEWS</span>\n </a>\n </div>\n </ng-container>\n </div> -->\n\n <div class=\"rating-comments\" *ngIf=\"ratingReviews\">\n <div infiniteScroll\n [infiniteScrollDistance]=\"1\"\n [infiniteScrollThrottle]=\"150\"\n [infiniteScrollContainer]=\"'.rating-comments'\"\n [fromRoot]=\"true\"\n [scrollWindow]=\"false\"\n (scrolled)=\"loadMore()\">\n <ng-container *ngFor=\"let c of ratingReviews|\n pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false; let i= index; let last = last\">\n <ws-widget-card-rating-comment [review]=\"authReplies[c.userId]\" [contentid]=\"content?.identifier\"></ws-widget-card-rating-comment>\n </ng-container>\n </div>\n <div *ngIf=\"displayLoader\" class=\"mt-5 pr-4 flex items-center justify-center spinner-border\">\n <mat-spinner [diameter]=\"30\"></mat-spinner>\n </div>\n <h4 *ngIf=\"(ratingReviews | pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false)?.length <=0\n && (displayLoader === false)\" class=\"w-full text-left ws-mat-black60-text \">\n {{'apptocsinglepage.noReviewsFound' | translate}}\n </h4>\n </div>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"{{'apptocsinglepage.content' | translate}}\" *ngIf=\"content?.children?.length\">\n <ng-template matTabContent>\n <section id=\"content\">\n <div class=\"fixed-width\">\n <ws-app-app-toc-contents [batchId]=\"batchId\" [content]=\"content\" [forPreview]=\"forPreview\">\n </ws-app-app-toc-contents>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"{{'apptocsinglepage.sessions' | translate}}\" *ngIf=\"content?.children?.length && (content?.primaryCategory === primaryCategory.BLENDED_PROGRAM)\">\n <ng-template matTabContent>\n <section id=\"content\">\n <div class=\"fixed-width\">\n <ws-app-app-toc-sessions [batchData]=\"selectedBatchData\" [content]=\"content\" [forPreview]=\"forPreview\" [config]=\"tocConfig\">\n </ws-app-app-toc-sessions>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"{{'apptocsinglepage.discussion' | translate}}\" *ngIf=\"!forPreview\">\n <ng-template matTabContent>\n <section id=\"discussion-forum\">\n <div class=\"fixed-width toc-discussion-container\">\n <!-- <ws-app-toc-discussion [content]=\"content\" class=\"discussion\"></ws-app-toc-discussion> -->\n <all-discussion-widget style=' width: 100%;' [config]=\"discussionConfig\"></all-discussion-widget>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n</mat-tab-group>\n\n<!-- <section id=\"cohorts\">\n <div class=\"fixed-width toc-discussion-container\">\n <ws-app-toc-cohorts [content]=\"content\" class=\"cohorts\"></ws-app-toc-cohorts>\n </div>\n</section> -->\n\n<ng-template #unitCohortNew1 let-user=\"user\">\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\n [name]=\"getUserFullName(user)\">\n </ws-widget-avatar-photo>\n <div class=\"margin-left-l\">\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\n class=\"width-expand padding-left-xs\">\n <div class=\"mat-body-1 cohorts-name\">\n {{\n { firstName: user.first_name, email: user.email }\n | pipeNameTransform\n }}\n </div>\n <p class=\"mat-body-2 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #unitCohortNew let-user=\"user\">\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"getUserFullName(user)\"\n [imageSize]=\"'small'\" [email]=\"user.email\" [imageUrl]=\"user.photo || ''\"></ws-widget-user-image> -->\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\n [name]=\"getUserFullName(user)\">\n </ws-widget-avatar-photo>\n <div class=\"margin-left-l\">\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\n class=\"width-expand padding-left-xs\">\n <!-- <div class=\"mat-body-1 cohorts-name\">\n {{\n { firstName: user.first_name, lastName: user.last_name, email: user.email }\n | pipeNameTransform\n }}\n </div> -->\n <ws-widget-connection-name\n [hoverUser]=\"{firstName: user.first_name, id:user.uid,designation: user.designation,department:user.department}\">\n </ws-widget-connection-name>\n <!-- {{user | json}} -->\n <p class=\"mat-body-2 ws-mat-black60-text\">{{user.designation}}</p>\n <!-- <div class=\"mat-caption cohorts-desc\">{{ user.desc }}</div>\n </div>\n <div class=\"width-auto user-action-container\">\n <ws-widget-btn-mail-user [widgetData]=\"{ content: content, emails: [user.email], user: user }\">\n </ws-widget-btn-mail-user>\n <ws-widget-btn-call *ngIf=\"user.phone_No !== '0'\" [widgetData]=\"{\n userName:\n {\n firstName: user.first_name,\n lastName: user.last_name,\n email: user.email\n } | pipeNameTransform,\n userPhone: user.phone_No\n }\"></ws-widget-btn-call> -->\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".fixed-width{max-width:1200px;display:block;margin:0 auto;padding:0 15px!important}.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.toc-body{padding-bottom:30px}.toc-body .toc-links{position:sticky;top:0;width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links ::ng-deep .mat-tab-links{margin:24px 0 0}.toc-body .toc-links .mat-tab-link{color:#5f5f5f;text-align:left;padding-left:0;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#00a9f4!important;border-bottom:none!important;font-weight:400!important}.section-content{word-break:break-word}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:24px;box-shadow:none;padding:0!important;background:transparent!important}@media only screen and (max-width: 599px){.meta-section{width:100%}}.info-section{width:28%;padding:0 8px;min-width:250px;margin-left:24px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0}}.info-section .glance-container .info-container{margin-bottom:24px}.info-section .glance-container .info-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-container .info-item{display:flex;align-items:center;padding:8px 0;box-sizing:border-box}.info-section .glance-container .info-container .info-item h3{margin:0}.info-section .glance-container .info-container .info-item .item-heading{width:40%;min-width:80px;max-width:140px;text-align:left;letter-spacing:0px}.info-section .glance-container .info-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px;outline:none;cursor:pointer}.divider-transparent{border-top-color:transparent!important}.section-heading,.section-content{letter-spacing:0px;color:#222}.resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box!important;box-shadow:0 10px 30px #9993;color:#fff!important}.resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.compt-table{border-spacing:0px 6px!important}.compt-table th{background:#0000000a;font-weight:700!important}.compt-table td{background:#fff}.custom-tabgroup .fixed-width{padding:0!important}.custom-tabgroup .unit-cohort{background:#e7eaeb;margin:10px 0;padding:22px 15px;border-radius:4px;align-self:center}.custom-tabgroup .unit-cohort .circle-l-xs,.custom-tabgroup .unit-cohort .circle-l-s,.custom-tabgroup .unit-cohort .circle-l,.custom-tabgroup .unit-cohort .circle-xl,.custom-tabgroup .unit-cohort .circle-m,.custom-tabgroup .unit-cohort .circle-xxl{width:56px!important;height:56px!important}::ng-deep .custom-tabgroup .mat-tab-header{border:0!important}::ng-deep .custom-tabgroup .mat-tab-body{padding:15px 0 220px!important;box-sizing:border-box;overflow-y:initial!important}@media (min-width: 767px) and (max-width: 1050px){::ng-deep .custom-tabgroup .mat-tab-body.mat-tab-body-active{overflow-x:initial!important}}::ng-deep .custom-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep .custom-tabgroup .mat-tab-label{border-bottom:2px solid rgba(0,0,0,.1);margin-right:3%}::ng-deep .custom-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:uppercase}::ng-deep .custom-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.rating-comments{height:auto;max-height:400px;padding:0 15px 0 0;overflow-y:auto;box-sizing:border-box}.view-all{border:1px solid #d3d3d3}.rating-progress{width:100%;max-width:298px}.bold-imp{font-weight:700!important}.mb-0{margin-bottom:0!important}.user-card{display:flex;align-items:center;justify-content:flex-start}.spinner-border{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i13.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i13.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i13.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i15.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i15.MatLegacyPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i16.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i17.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i17.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "component", type: i18.MatLegacyTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i18.MatLegacyTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "directive", type: i18.MatLegacyTabContent, selector: "[matTabContent]" }, { kind: "component", type: i19.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i20.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i21.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i22.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i23.ConnectionNameComponent, selector: "ws-widget-connection-name", inputs: ["hoverUser", "showBadge"] }, { kind: "component", type: i24.CardRatingCommentComponent, selector: "ws-widget-card-rating-comment", inputs: ["review", "contentid"] }, { kind: "directive", type: i25.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i26.AppTocSessionsComponent, selector: "ws-app-app-toc-sessions", inputs: ["batchData", "content", "forPreview", "config"] }, { kind: "pipe", type: i5.PipeNameTransformPipe, name: "pipeNameTransform" }, { kind: "pipe", type: i5.PipeFilterV3Pipe, name: "pipeFilterV3" }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] }); }
746
- }
747
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocSinglePageComponent, decorators: [{
748
- type: Component,
749
- args: [{ selector: 'ws-app-app-toc-single-page', template: "<mat-tab-group [selectedIndex]=\"tabSelectedIndex\" class=\"custom-tabgroup\" (selectedTabChange)=\"tabClicked($event)\">\n <mat-tab label=\"{{'apptocsinglepage.overview' | translate}}\">\n <ng-template matTabContent>\n <section id=\"overview\">\n <div class=\"fixed-width flex flex-wrap\">\n <div class=\"meta-section\">\n <!-- Description : Conditional : If not shown here, will be shown over banner -->\n <mat-card *ngIf=\"\n tocConfig?.overview?.description?.enabled &&\n showDescription &&\n showSubtitleOnBanner &&\n content?.description\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.description?.displayName, 'apptocsinglepage') }}</h2>\n <mat-card-content>\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.description)\">\n </div>\n </mat-card-content>\n </mat-card>\n <!-- Content Body -->\n <mat-card *ngIf=\"tocConfig?.overview?.body?.enabled && content?.instructions\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.body?.displayName, 'apptocsinglepage') }}\n </h2>\n <mat-card-content>\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.instructions)\">\n </div>\n </mat-card-content>\n </mat-card>\n <!-- Learning objective -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.learningObjective?.enabled && content?.learningObjective\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.learningObjective?.displayName }}</h2>\n <mat-card-content>\n <p class=\"section-content mat-subheading-1\" [innerHTML]=\"content?.learningObjective\"></p>\n </mat-card-content>\n </mat-card> -->\n\n <!-- Registration instructions -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.registrationInstructions?.enabled &&\n content?.registrationInstructions?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.registrationInstructions?.displayName }}</h2>\n <mat-card-content>\n <div class=\"section-content mat-subheading-1 break-words\"\n [innerHTML]=\"content?.registrationInstructions\"></div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preContents?.enabled && content?.preContents?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preContents?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let preContent of content?.preContents\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + preContent.identifier\"\n [queryParams]=\"{primaryCategory: preContent?.primaryCategory}\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ preContent.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.postContents?.enabled && content?.postContents?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.postContents?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let postContent of content?.postContents\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + postContent.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ postContent.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.certificationList?.enabled && content?.certificationList?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.certificationList?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let certification of content?.certificationList\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + certification.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ certification.name }}\n </p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.studyMaterials?.enabled && content?.studyMaterials?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.studyMaterials?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let studyitem of content?.studyMaterials\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + studyitem.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ studyitem.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.playgroundResources?.enabled && content?.playgroundResources?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.playgroundResources?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let playgroundResource of content?.playgroundResources\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + playgroundResource.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\n {{ playgroundResource.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.kArtifacts?.enabled && content?.kArtifacts?.length\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.kArtifacts?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let kArtifact of content?.kArtifacts\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + kArtifact.identifier + '?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ kArtifact.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.equivalentCertifications?.enabled &&\n content?.equivalentCertifications?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.equivalentCertifications?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let equivalentCertification of content?.equivalentCertifications\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + equivalentCertification.identifier +'?primaryCategory='+ item.primaryCategory\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\n {{ equivalentCertification.name }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- <mat-card *ngIf=\"\n tocConfig?.overview?.softwareRequirements?.enabled && content?.softwareRequirements?.length\n \" class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.softwareRequirements?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex mb-1\" *ngFor=\"let softwareRequirement of content?.softwareRequirements\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [href]=\"softwareRequirement.url\" target=\"blank\">\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\n {{ softwareRequirement.title }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card> -->\n <!-- Skills -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.skills?.enabled && content?.skills?.length\"\n class=\"unit-meta-item mat-app-background\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.skills?.displayName }}</h2>\n <mat-chip-list>\n <mat-chip class=\"section-content\" *ngFor=\"let skill of content?.skills\">{{ skill.name }}</mat-chip>\n </mat-chip-list>\n </mat-card> -->\n <!-- Requirements -->\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preRequisites?.enabled && content?.preRequisites\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preRequisites?.displayName }}</h2>\n <mat-card-content>\n <div class=\"mat-subheading-1\" [innerHTML]=\"content?.preRequisites\"></div>\n <div class=\"margin-top-s\" *ngIf=\"content?.softwareRequirements?.length\">\n <h3 class=\"mat-h3 margin-bottom-xs\" >Software Requirements</h3>\n <ng-container *ngFor=\"let requirement of content?.softwareRequirements\">\n <a *ngIf=\"requirement.url\" class=\"margin-right-s\" mat-stroked-button target=\"_blank\"\n [href]=\"requirement.url\">\n {{ requirement.title }}\n </a>\n <a mat-stroked-button class=\"margin-right-s\"\n *ngIf=\"!requirement?.url\">{{ requirement.title }}\n </a>\n </ng-container>\n </div>\n </mat-card-content>\n </mat-card> -->\n\n <!-- Training (LHub) -->\n <!-- <mat-card *ngIf=\"trainingLHubEnabled && trainingLHubCount$ | async as trainingLHubCount\"\n class=\"unit-meta-item\">\n <h2 class=\"section-heading\" >Trainings</h2>\n <h4 class=\"mat-h4\">\n <ng-container>{{ trainingLHubCount }}</ng-container>\n <ng-container i18n=\"x trainings available\" *ngIf=\"trainingLHubCount > 1\">\n trainings available</ng-container>\n <ng-container i18n=\"1 training available\" *ngIf=\"trainingLHubCount === 1\">\n training available</ng-container>\n </h4>\n <div>\n\n </div>\n </mat-card> -->\n\n <!-- Related Topics -->\n <!-- <mat-card class=\"unit-meta-item\" *ngIf=\"tocConfig?.overview?.topics?.enabled && content?.topics?.length\">\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.topics?.displayName }}</h2>\n <mat-card-content>\n <div class=\"flex flex-between flex-wrapped\">\n <a mat-stroked-button class=\"topic-button text-truncate\"\n *ngFor=\"let topic of content?.topics | pipeLimitTo: (viewMoreRelatedTopics ? 24 : 6)\"\n [title]=\"topic?.name\" [routerLink]=\"'/app/concept-graph/' + topic.identifier\">\n {{ topic?.name }}\n </a>\n </div>\n <div *ngIf=\"content?.topics?.length > 6\" class=\"text-right margin-top-xs\">\n <a mat-button (click)=\"viewMoreRelatedTopics = !viewMoreRelatedTopics\">\n <span *ngIf=\"!viewMoreRelatedTopics\" >View More</span>\n <span *ngIf=\"viewMoreRelatedTopics\" >View Less</span>\n </a>\n </div>\n </mat-card-content>\n </mat-card>\n <div class=\"margin-bottom-m\" *ngIf=\"objKeys(contentParents).length\">\n <mat-card>\n <h2 >This content is part of</h2>\n </mat-card>\n <mat-accordion>\n <ng-container *ngFor=\"let key of objKeys(contentParents)\">\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n {{ key }}\n </mat-expansion-panel-header>\n <div class=\"flex mb-1\" *ngFor=\"let content of contentParents[key]\">\n <span class=\"mr-1\">\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\n </span>\n <a class=\"ws-mat-primary-text\" [routerLink]=\"\n content.status !== 'Live'\n ? '/author' + '/toc/' + content.identifier +'?primaryCategory='+ item.primaryCategory\n : '/app' + '/toc/' + content.identifier + '?primaryCategory='+ item.primaryCategory\n \">\n <p class=\"margin-remove-bottom mat-subheading-1\">{{ content.name }}</p>\n </a>\n </div>\n </mat-expansion-panel>\n </ng-container>\n </mat-accordion>\n </div> -->\n </div>\n </div>\n </section>\n <section id=\"authors\" *ngIf=\"(content?.creatorDetails && content?.creatorDetails.length > 0) || (content?.creatorContacts && content?.creatorContacts.length > 0) ||\n (cohortResults[cohortTypesEnum.AUTHORS] && cohortResults[cohortTypesEnum.AUTHORS].length > 0)\">\n <div class=\"fluid-width contacts-container\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.authorsAndCurators' | translate}}</h2>\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\n <!-- authors -->\n <div *ngFor=\"let author of parseJsonData(content?.creatorDetails)\"\n class=\"unit-cohort sm:pr-8 md:pr-10\">\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\n [datalen]=\"1\"\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\n </ws-widget-avatar-photo>\n <div class=\"margin-left-xl\">\n <div class=\"user-name\">{{ author.name }}</div>\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.author' | translate}}</p>\n </div>\n </div>\n <!-- curators -->\n <div *ngFor=\"let author of parseJsonData(content?.creatorContacts)\"\n class=\"unit-cohort user-card sm:pr-8 md:pr-10\">\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [randomColor]=\"true\"\n [datalen]=\"1\"\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\n </ws-widget-avatar-photo>\n <div class=\"\">\n <div class=\"user-name\">{{ author.name }}</div>\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\n </div>\n </div>\n <!-- <div *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS]\">\n <h3 *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS].hasError\" class=\"mat-error text-center\" >\n Failed to fetch curators\n </h3>\n <h3 *ngIf=\"\n !cohortResults[cohortTypesEnum.AUTHORS].hasError &&\n !cohortResults[cohortTypesEnum.AUTHORS].contents.length\n \" class=\"text-center\" >\n None\n </h3>\n <ng-container *ngFor=\"let cohort of cohortResults[cohortTypesEnum.AUTHORS].contents\"\n [ngTemplateOutlet]=\"unitCohortNew1\" [ngTemplateOutletContext]=\"{ user: cohort }\">\n </ng-container>\n </div> -->\n </div>\n </div>\n </div>\n </section>\n <section id=\"director\" *ngIf=\"checkForFacilitators.length\">\n <div class=\"fluid-width contacts-container\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.programDirectorFacilitators' | translate}}</h2>\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\n <!-- <ng-container *ngFor=\"let sessionDetails of selectedBatchData?.content[0]?.batchAttributes?.sessionDetails_v2\"> -->\n <ng-container *ngFor=\"let facilitator of checkForFacilitators\">\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\n [datalen]=\"1\"\n [size]=\"'round-m'\" [photoUrl]=\"facilitator.photo || ''\" [name]=\"facilitator.name\">\n </ws-widget-avatar-photo>\n <div class=\"margin-left-xl\">\n <div class=\"user-name\">{{ facilitator.name }}</div>\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.facilitator' | translate}}</p>\n </div>\n </div>\n </ng-container>\n <!-- </ng-container> -->\n </div>\n </div>\n </div>\n </section>\n <section id=\"competencies\"\n *ngIf=\"content[compentencyKey] && competencies.length\">\n <div class=\"fluid-width contacts-container mb-10\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\n </div>\n <div>\n <table class=\"compt-table width-1-1 text-left\">\n <tr>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.subTheme' | translate}}</th>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.theme' | translate}} </th>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.area' | translate}}</th>\n </tr>\n <tr *ngFor=\"let comp of competencies\">\n <td class=\"padding-xs mat-body-1\">{{comp.competencySubTheme}}</td>\n <td class=\"padding-xs mat-body-1\">{{comp.competencyTheme}}</td>\n <td class=\"padding-xs mat-body-1\">{{comp.competencyArea}}</td>\n </tr>\n </table>\n </div>\n </div>\n </section>\n <!-- <section id=\"competencies\"\n *ngIf=\"((!content?.test_competencies_v4 && content?.competencies_v3) &&\n (competencies.length) || (content?.competencies && competencies.length))\">\n <div class=\"fluid-width contacts-container mb-10\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\n </div>\n <div>\n <table class=\"compt-table width-1-1 text-left\">\n <tr>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.competency' | translate}}</th>\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.type' | translate}}</th>\n </tr>\n <tr *ngFor=\"let comp of competencies\">\n <td class=\"padding-xs mat-body-1\">{{comp.name}}</td>\n <td class=\"padding-xs mat-body-1\">{{comp.competencyType}}</td>\n </tr>\n </table>\n </div>\n </div>\n </section> -->\n <section id=\"rating\" *ngIf=\"!forPreview\">\n <div class=\"fluid-width contacts-container mb-10\">\n <div class=\"fixed-width flex flex-col flex-wrap\">\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.ratingsReviews' | translate}}</h2>\n </div>\n <!-- <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary> -->\n\n <div class=\"search\">\n <form [formGroup]=\"searchForm\">\n <div class=\"flex top_search_box\">\n <div class=\"flex-1 search_box_inner\">\n <div class=\"flex flex-1 flex-column margin-fix search search_box_main\">\n <mat-form-field appearance=\"outline\"\n class=\"autocomplete-form search_form margin-right-s\" color=\"primary\">\n <mat-icon matPrefix\n class=\"flex items-center justify-center mr-2\">search\n </mat-icon>\n <!-- <mat-label>Search</mat-label> -->\n <input type=\"search\" name=\"searchKey\" #searchKey class=\"ml-2\" i18-aria-label\n aria-label=\"Search\" formControlName=\"searchKey\"\n i18n-placeholder=\"search\" [placeholder]=\"'apptocsinglepage.search' | translate\" matInput maxlength=\"50\"/>\n <!-- (input)=\"updateQuery(searchKey.value)\" -->\n </mat-form-field>\n </div>\n </div>\n <div class=\"item_dropdown_box\">\n <div class=\"flex flex-1 flex-wrap section-input\">\n <div class=\"item\">\n <mat-form-field class=\"\" appearance=\"outline\">\n <mat-select #sortBySelect formControlName=\"sortByControl\"\n i18n-placeholder placeholder=\"Sort by\">\n <mat-option [value]=\"'topReviews'\" slected>{{'apptocsinglepage.topReviews' | translate}}\n </mat-option>\n <mat-option [value]=\"'latestReviews'\">{{'apptocsinglepage.latestReviews' | translate}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n\n <!-- <div class=\"rating-comments\">\n <ng-container *ngFor=\"let c of ratingReviews|\n pipeFilterV3:{ 'user_id': searchKey.value, 'review': searchKey.value } : false |\n slice:0:ratingViewCount; let i= index; let last = last\">\n <ws-widget-card-rating-comment [review]=\"c\"></ws-widget-card-rating-comment>\n\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount <=3 && i>=2 && last\">\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \"\n (click)=\"showALLReviews(ratingReviews?.length)\">\n <span >SEE ALL {{ratingReviews?.length}} REVIEWS</span>\n </a>\n </div>\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount > 3 && i>=2 && last\">\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \" (click)=\"showALLReviews(3)\">\n <span >SEE LESS REVIEWS</span>\n </a>\n </div>\n </ng-container>\n </div> -->\n\n <div class=\"rating-comments\" *ngIf=\"ratingReviews\">\n <div infiniteScroll\n [infiniteScrollDistance]=\"1\"\n [infiniteScrollThrottle]=\"150\"\n [infiniteScrollContainer]=\"'.rating-comments'\"\n [fromRoot]=\"true\"\n [scrollWindow]=\"false\"\n (scrolled)=\"loadMore()\">\n <ng-container *ngFor=\"let c of ratingReviews|\n pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false; let i= index; let last = last\">\n <ws-widget-card-rating-comment [review]=\"authReplies[c.userId]\" [contentid]=\"content?.identifier\"></ws-widget-card-rating-comment>\n </ng-container>\n </div>\n <div *ngIf=\"displayLoader\" class=\"mt-5 pr-4 flex items-center justify-center spinner-border\">\n <mat-spinner [diameter]=\"30\"></mat-spinner>\n </div>\n <h4 *ngIf=\"(ratingReviews | pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false)?.length <=0\n && (displayLoader === false)\" class=\"w-full text-left ws-mat-black60-text \">\n {{'apptocsinglepage.noReviewsFound' | translate}}\n </h4>\n </div>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"{{'apptocsinglepage.content' | translate}}\" *ngIf=\"content?.children?.length\">\n <ng-template matTabContent>\n <section id=\"content\">\n <div class=\"fixed-width\">\n <ws-app-app-toc-contents [batchId]=\"batchId\" [content]=\"content\" [forPreview]=\"forPreview\">\n </ws-app-app-toc-contents>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"{{'apptocsinglepage.sessions' | translate}}\" *ngIf=\"content?.children?.length && (content?.primaryCategory === primaryCategory.BLENDED_PROGRAM)\">\n <ng-template matTabContent>\n <section id=\"content\">\n <div class=\"fixed-width\">\n <ws-app-app-toc-sessions [batchData]=\"selectedBatchData\" [content]=\"content\" [forPreview]=\"forPreview\" [config]=\"tocConfig\">\n </ws-app-app-toc-sessions>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"{{'apptocsinglepage.discussion' | translate}}\" *ngIf=\"!forPreview\">\n <ng-template matTabContent>\n <section id=\"discussion-forum\">\n <div class=\"fixed-width toc-discussion-container\">\n <!-- <ws-app-toc-discussion [content]=\"content\" class=\"discussion\"></ws-app-toc-discussion> -->\n <all-discussion-widget style=' width: 100%;' [config]=\"discussionConfig\"></all-discussion-widget>\n </div>\n </section>\n </ng-template>\n </mat-tab>\n</mat-tab-group>\n\n<!-- <section id=\"cohorts\">\n <div class=\"fixed-width toc-discussion-container\">\n <ws-app-toc-cohorts [content]=\"content\" class=\"cohorts\"></ws-app-toc-cohorts>\n </div>\n</section> -->\n\n<ng-template #unitCohortNew1 let-user=\"user\">\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\n [name]=\"getUserFullName(user)\">\n </ws-widget-avatar-photo>\n <div class=\"margin-left-l\">\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\n class=\"width-expand padding-left-xs\">\n <div class=\"mat-body-1 cohorts-name\">\n {{\n { firstName: user.first_name, email: user.email }\n | pipeNameTransform\n }}\n </div>\n <p class=\"mat-body-2 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #unitCohortNew let-user=\"user\">\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"getUserFullName(user)\"\n [imageSize]=\"'small'\" [email]=\"user.email\" [imageUrl]=\"user.photo || ''\"></ws-widget-user-image> -->\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\n [name]=\"getUserFullName(user)\">\n </ws-widget-avatar-photo>\n <div class=\"margin-left-l\">\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\n class=\"width-expand padding-left-xs\">\n <!-- <div class=\"mat-body-1 cohorts-name\">\n {{\n { firstName: user.first_name, lastName: user.last_name, email: user.email }\n | pipeNameTransform\n }}\n </div> -->\n <ws-widget-connection-name\n [hoverUser]=\"{firstName: user.first_name, id:user.uid,designation: user.designation,department:user.department}\">\n </ws-widget-connection-name>\n <!-- {{user | json}} -->\n <p class=\"mat-body-2 ws-mat-black60-text\">{{user.designation}}</p>\n <!-- <div class=\"mat-caption cohorts-desc\">{{ user.desc }}</div>\n </div>\n <div class=\"width-auto user-action-container\">\n <ws-widget-btn-mail-user [widgetData]=\"{ content: content, emails: [user.email], user: user }\">\n </ws-widget-btn-mail-user>\n <ws-widget-btn-call *ngIf=\"user.phone_No !== '0'\" [widgetData]=\"{\n userName:\n {\n firstName: user.first_name,\n lastName: user.last_name,\n email: user.email\n } | pipeNameTransform,\n userPhone: user.phone_No\n }\"></ws-widget-btn-call> -->\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".fixed-width{max-width:1200px;display:block;margin:0 auto;padding:0 15px!important}.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.toc-body{padding-bottom:30px}.toc-body .toc-links{position:sticky;top:0;width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links ::ng-deep .mat-tab-links{margin:24px 0 0}.toc-body .toc-links .mat-tab-link{color:#5f5f5f;text-align:left;padding-left:0;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#00a9f4!important;border-bottom:none!important;font-weight:400!important}.section-content{word-break:break-word}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:24px;box-shadow:none;padding:0!important;background:transparent!important}@media only screen and (max-width: 599px){.meta-section{width:100%}}.info-section{width:28%;padding:0 8px;min-width:250px;margin-left:24px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0}}.info-section .glance-container .info-container{margin-bottom:24px}.info-section .glance-container .info-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-container .info-item{display:flex;align-items:center;padding:8px 0;box-sizing:border-box}.info-section .glance-container .info-container .info-item h3{margin:0}.info-section .glance-container .info-container .info-item .item-heading{width:40%;min-width:80px;max-width:140px;text-align:left;letter-spacing:0px}.info-section .glance-container .info-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px;outline:none;cursor:pointer}.divider-transparent{border-top-color:transparent!important}.section-heading,.section-content{letter-spacing:0px;color:#222}.resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box!important;box-shadow:0 10px 30px #9993;color:#fff!important}.resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.compt-table{border-spacing:0px 6px!important}.compt-table th{background:#0000000a;font-weight:700!important}.compt-table td{background:#fff}.custom-tabgroup .fixed-width{padding:0!important}.custom-tabgroup .unit-cohort{background:#e7eaeb;margin:10px 0;padding:22px 15px;border-radius:4px;align-self:center}.custom-tabgroup .unit-cohort .circle-l-xs,.custom-tabgroup .unit-cohort .circle-l-s,.custom-tabgroup .unit-cohort .circle-l,.custom-tabgroup .unit-cohort .circle-xl,.custom-tabgroup .unit-cohort .circle-m,.custom-tabgroup .unit-cohort .circle-xxl{width:56px!important;height:56px!important}::ng-deep .custom-tabgroup .mat-tab-header{border:0!important}::ng-deep .custom-tabgroup .mat-tab-body{padding:15px 0 220px!important;box-sizing:border-box;overflow-y:initial!important}@media (min-width: 767px) and (max-width: 1050px){::ng-deep .custom-tabgroup .mat-tab-body.mat-tab-body-active{overflow-x:initial!important}}::ng-deep .custom-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep .custom-tabgroup .mat-tab-label{border-bottom:2px solid rgba(0,0,0,.1);margin-right:3%}::ng-deep .custom-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:uppercase}::ng-deep .custom-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.rating-comments{height:auto;max-height:400px;padding:0 15px 0 0;overflow-y:auto;box-sizing:border-box}.view-all{border:1px solid #d3d3d3}.rating-progress{width:100%;max-width:298px}.bold-imp{font-weight:700!important}.mb-0{margin-bottom:0!important}.user-card{display:flex;align-items:center;justify-content:flex-start}.spinner-border{overflow:hidden}\n"] }]
750
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.AppTocService }, { type: i3.DomSanitizer }, { type: i4.AccessControlService }, { type: i5.LoggerService }, { type: i6.TitleTagService }, { type: i7.MatLegacyDialog }, { type: i8.MobileAppsService }, { type: i5.ConfigurationsService }, { type: i9.ConnectionHoverService }, { type: i5.EventService }, { type: i10.RatingService }, { type: i11.TranslateService }, { type: i5.MultilingualTranslationsService }, { type: undefined, decorators: [{
751
- type: Inject,
752
- args: ['environment']
753
- }, {
754
- type: Optional
755
- }] }]; }, propDecorators: { content: [{
756
- type: Input
757
- }], initialrouteData: [{
758
- type: Input
759
- }], forPreview: [{
760
- type: Input
761
- }], resumeData: [{
762
- type: Input
763
- }], batchData: [{
764
- type: Input
765
- }] } });
766
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1zaW5nbGUtcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvY29tcG9uZW50cy9hcHAtdG9jLXNpbmdsZS1wYWdlL2FwcC10b2Mtc2luZ2xlLXBhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1zaW5nbGUtcGFnZS9hcHAtdG9jLXNpbmdsZS1wYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBR2hHLE9BQU8sRUFBd0MsUUFBUSxFQUFpRCxNQUFNLHNCQUFzQixDQUFBO0FBQ3BJLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUNoRSxPQUFPLEVBQTRCLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUN4RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUUsT0FBTyxFQUFZLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRWhFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFBO0FBSWpHLHlFQUF5RTtBQUN6RSwyQkFBMkI7QUFDM0IsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV3JFLE1BQU0sT0FBTyx5QkFBeUI7SUErRHBDLFlBQ1UsTUFBYyxFQUNkLEtBQXFCLEVB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RyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7b0JBQ3hFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO2lCQUM1QjtnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO2dCQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQTthQUM5RDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO2dCQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFBO2dCQUNoRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTthQUN6QjtTQUNGO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhLEVBQUUsSUFBUztRQUN0QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7K0dBenhCVSx5QkFBeUIsb2ZBZ0YxQixhQUFhO21HQWhGWix5QkFBeUIseU9DNUJ0Qyx5N3NDQXVqQkE7OzRGRDNoQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLDRCQUE0Qjs7MEJBb0ZuQyxNQUFNOzJCQUFDLGFBQWE7OzBCQUFHLFFBQVE7NENBakV6QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY2Nlc3MtY29udHJvbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9uQ2hhbmdlcywgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBEYXRhLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIExvZ2dlclNlcnZpY2UsIFdzRXZlbnRzLCBFdmVudFNlcnZpY2UsIE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzaGFyZSwgZGVib3VuY2VUaW1lLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgTnNBcHBUb2MsIE5zQ29ob3J0cyB9IGZyb20gJy4uLy4uL21vZGVscy9hcHAtdG9jLm1vZGVsJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IENyZWF0ZUJhdGNoRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY3JlYXRlLWJhdGNoLWRpYWxvZy9jcmVhdGUtYmF0Y2gtZGlhbG9nLmNvbXBvbmVudCdcbmltcG9ydCB7IFRpdGxlVGFnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpdGxlLXRhZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgQ29ubmVjdGlvbkhvdmVyU2VydmljZSB9IGZyb20gJy4uLy4uL19jb2xsZWN0aW9uL19jb21tb24vY29ubmVjdGlvbi1ob3Zlci1jYXJkL2Nvbm5lY3Rpb24taG92ZXIuc2Vydml2ZSdcbi8vIGltcG9ydCB7IElkaXNjdXNzaW9uQ29uZmlnIH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9kaXNjdXNzaW9ucy11aS12OCdcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZydcbmltcG9ydCB7IE1hdExlZ2FjeVRhYkNoYW5nZUV2ZW50IGFzIE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXRhYnMnXG5pbXBvcnQgeyBOc0F1dG9Db21wbGV0ZSB9IGZyb20gJy4uLy4uL21vZGVscy9hdXRvLWNvbXBsZXRlLm1vZGVsJ1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3MtYXBwLWFwcC10b2Mtc2luZ2xlLXBhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1zaW5nbGUtcGFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2Mtc2luZ2xlLXBhZ2UuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jU2luZ2xlUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBjb250ZW50VHlwZXMgPSBOc0NvbnRlbnQuRUNvbnRlbnRUeXBlc1xuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBzaG93TW9yZUdsYW5jZSA9IGZhbHNlXG4gIGFza0F1dGhvckVuYWJsZWQgPSB0cnVlXG4gIHRyYWluaW5nTEh1YkVuYWJsZWQgPSBmYWxzZVxuICB0cmFpbmluZ0xIdWJDb3VudCQ/OiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgYm9keTogU2FmZUh0bWwgfCBudWxsID0gbnVsbFxuICB2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSBmYWxzZVxuICBoYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICB0b2NTdHJ1Y3R1cmU6IE5zQXBwVG9jLklUb2NTdHJ1Y3R1cmUgfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogeyBba2V5OiBzdHJpbmddOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlW10gfSA9IHt9XG4gIG9iaktleXMgPSBPYmplY3Qua2V5c1xuICBmcmFnbWVudCE6IHN0cmluZ1xuICBhY3RpdmVGcmFnbWVudCA9IHRoaXMucm91dGUuZnJhZ21lbnQucGlwZShzaGFyZSgpKVxuICBASW5wdXQoKSBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBpbml0aWFscm91dGVEYXRhOiBhbnlcbiAgcm91dGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG5cbiAgQElucHV0KCkgcmVzdW1lRGF0YTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGJhdGNoRGF0YTogLyoqTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSAqLyBhbnkgfCBudWxsID0gbnVsbFxuICB0b2NDb25maWc6IGFueSA9IG51bGxcbiAgbG9nZ2VkSW5Vc2VySWQhOiBhbnlcbiAgcHJpdmF0ZSByb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBiYXRjaElkITogc3RyaW5nXG4gIGlzTm90RWRpdG9yID0gdHJ1ZVxuICBjb2hvcnRSZXN1bHRzOiB7XG4gICAgW2tleTogc3RyaW5nXTogeyBoYXNFcnJvcjogYm9vbGVhbjsgY29udGVudHM6IE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXSB9XG4gIH0gPSB7fVxuICBjb2hvcnRUeXBlc0VudW0gPSBOc0NvaG9ydHMuRUNvaG9ydFR5cGVzXG4gIGRpc2N1c3Npb25Db25maWc6IGFueSA9IHt9XG4gIGJhdGNoRGF0YUxvYWRlZCA9IGZhbHNlXG4gIHNob3dEaXNjdXNzaW9uRm9ydW06IGFueVxuICBjb21wZXRlbmNpZXM6IGFueVxuICBob3dlclVzZXIhOiBhbnlcbiAgc2VhcmNoRm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IHVuZGVmaW5lZFxuICBwcml2YXRlIHVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICAvLyBUT0RPOiBUTyBiZSByZW1vdmVkIGltcG9ydGFudFxuICBwcm9ncmVzcyA9IDUwXG4gIHJhdGluZ1N1bW1hcnk6IGFueVxuICByYXRpbmdMb29rdXA6IGFueVxuICByYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkOiBhbnlcbiAgcmF0aW5nUmV2aWV3czogYW55W10gPSBbXVxuICByYXRpbmdWaWV3Q291bnQgPSAzXG4gIHJhdGluZ1ZpZXdDb3VudERlZmF1bHQgPSAzXG4gIGxvb2t1cExpbWl0ID0gM1xuICBzb3J0UmV2aWV3VmFsdWVzID0gWyd0b3BSZXZpZXdzJywgJ2xhdGVzdFJldmlld3MnXVxuICBwcmV2aW91c0ZpbHRlciA9IHRoaXMuc29ydFJldmlld1ZhbHVlc1swXVxuICBsYXN0TG9va1VwOiBhbnlcbiAgcmV2aWV3UGFnZSA9IDFcbiAgcmV2aWV3RGVmYXVsdExpbWl0ID0gMlxuICBkaXNhYmxlTG9hZE1vcmUgPSBmYWxzZVxuICBkaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgdGFiU2VsZWN0ZWRJbmRleCA9IDBcbiAgdXBkYXRlUmV2aWV3c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgYXV0aFJlcGxpZXM6IGFueVxuICBsb29rdXBMb2FkaW5nOiBCb29sZWFuID0gdHJ1ZVxuICBzZWxlY3RlZEJhdGNoRGF0YTogYW55XG4gIGJhdGNoU3Vic2NyaXB0aW9uOiBhbnlcbiAgLy8gY29uZmlnU3ZjOiBhbnlcbiAgY29tcGVudGVuY3lLZXkgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB0b2NTaGFyZWRTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGF1dGhBY2Nlc3NDb250cm9sU3ZjOiBBY2Nlc3NDb250cm9sU2VydmljZSxcbiAgICAvLyBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGl0bGVUYWdTZXJ2aWNlOiBUaXRsZVRhZ1NlcnZpY2UsXG4gICAgcHVibGljIGNyZWF0ZUJhdGNoRGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2JpbGVBcHBzU3ZjOiBNb2JpbGVBcHBzU2VydmljZSxcbiAgICBwdWJsaWMgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25uZWN0aW9uSG92ZXJTZXJ2aWNlOiBDb25uZWN0aW9uSG92ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRTdmM6IEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJhdGluZ1N2YzogUmF0aW5nU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd0cmFuc2xhdGlvbnM6IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBAT3B0aW9uYWwoKSBwcml2YXRlIGVudmlyb25tZW50OiBhbnlcbiAgKSB7XG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSkge1xuICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcbiAgICAgIGxldCBsYW5nID0gSlNPTi5zdHJpbmdpZnkobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKVxuICAgICAgbGFuZyA9IGxhbmcucmVwbGFjZSgvXFxcIi9nLCAnJylcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICB0aGlzLmFza0F1dGhvckVuYWJsZWQgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygnYXNrQXV0aG9yJylcbiAgICAgIHRoaXMudHJhaW5pbmdMSHViRW5hYmxlZCA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCd0cmFpbmluZ0xIdWInKVxuICAgIH1cbiAgICAvLyBpZiAodGhpcy5yb3V0ZSAmJiB0aGlzLnJvdXRlLnBhcmVudCkge1xuICAgIC8vICAgdGhpcy5jb25maWdTdmMgPSB0aGlzLnJvdXRlLnBhcmVudC5zbmFwc2hvdC5kYXRhLnByb2ZpbGVEYXRhXG4gICAgLy8gfVxuICAgIC8vIHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgLy8gICB0aGlzLmFza0F1dGhvckVuYWJsZWQgPSAhZGF0YS5yZXN0cmljdGVkRGF0YS5kYXRhLmhhcygnYXNrQXV0aG9yJylcbiAgICAvLyAgIHRoaXMudHJhaW5pbmdMSHViRW5hYmxlZCA9ICFkYXRhLnJlc3RyaWN0ZWREYXRhLmRhdGEuaGFzKCd0cmFpbmluZ0xIdWInKVxuICAgIC8vIH0pXG4gICAgdGhpcy5kaXNjdXNzaW9uQ29uZmlnID0ge1xuICAgICAgLy8gbWVudU9wdGlvbnM6IFt7IHJvdXRlOiAnY2F0ZWdvcmllcycsIGVuYWJsZTogdHJ1ZSB9XSxcbiAgICAgIHVzZXJOYW1lOiAodGhpcy5jb25maWdTdmMubm9kZWJiVXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMubm9kZWJiVXNlclByb2ZpbGUudXNlcm5hbWUpIHx8ICcnLFxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcGVudGVuY3lLZXkgPSB0aGlzLmVudmlyb25tZW50Py5jb21wZW50ZW5jeVZlcnNpb25LZXkgfHwgJydcbiAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTaGFyZWRTdmMuZ2V0U2VsZWN0ZWRCYXRjaC5zdWJzY3JpYmUoYmF0Y2hEYXRhID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSBiYXRjaERhdGFcbiAgICB9KVxuICAgIHRoaXMuc2VhcmNoRm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICAgIHNvcnRCeUNvbnRyb2w6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGhpcy5zb3J0UmV2aWV3VmFsdWVzWzBdKSxcbiAgICAgIHNlYXJjaEtleTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyksXG4gICAgfSlcblxuICAgIC8vIGlmICh0aGlzLnJvdXRlICYmIHRoaXMucm91dGUucGFyZW50KSB7XG4gICAgLy8gICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5wYXJlbnQuZGF0YS5zdWJzY3JpYmUoKGRhdGE6IERhdGEpID0+IHtcbiAgICAvLyAgICAgdGhpcy5pbml0RGF0YShkYXRhKVxuICAgIC8vICAgICB0aGlzLnRvY0NvbmZpZyA9IGRhdGEucGFnZURhdGEuZGF0YVxuICAgIC8vICAgfSlcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuaW5pdGlhbHJvdXRlRGF0YSkge1xuICAgICAgdGhpcy5pbml0RGF0YSh0aGlzLmluaXRpYWxyb3V0ZURhdGEpXG4gICAgICB0aGlzLnRvY0NvbmZpZyA9IHRoaXMuaW5pdGlhbHJvdXRlRGF0YS5wYWdlRGF0YS5kYXRhXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQpIHtcbiAgICAgIHRoaXMubG9nZ2VkSW5Vc2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWRcbiAgICB9XG4gICAgLy8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJvbGUgZWRpdG9yLFxuICAgIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUm9sZXMgJiZcbiAgICAgIHRoaXMuY29uZmlnU3ZjLnVzZXJSb2xlcy5oYXMoJ2VkaXRvcicpXG4gICAgKSB7XG4gICAgICAvLyBpZiBlZGl0b3IsIGNyZWF0ZSBiYXRjaCBidXR0b24gd2lsbCBiZSBzaG93blxuICAgICAgdGhpcy5pc05vdEVkaXRvciA9IGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hGb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICBzd2l0Y2hNYXAoYXN5bmMgZm9ybVZhbHVlID0+IHtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZm9ybVZhbHVlIDo6ICcsIGZvcm1WYWx1ZSlcbiAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0ZpbHRlciAhPT0gZm9ybVZhbHVlLnNvcnRCeUNvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGaWx0ZXIgPSBmb3JtVmFsdWUuc29ydEJ5Q29udHJvbFxuICAgICAgICAgICAgdGhpcy5zb3J0UmV2aWV3cyhmb3JtVmFsdWUuc29ydEJ5Q29udHJvbClcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSlcbiAgICAgICkuc3Vic2NyaWJlKClcblxuICAgIHRoaXMudXBkYXRlUmV2aWV3c1N1YnNjcmlwdGlvbiA9IHRoaXMudG9jU2hhcmVkU3ZjLnVwZGF0ZVJldmlld3NPYnNlcnZhYmxlLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVJldmlld3MoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLmJhdGNoRGF0YSkge1xuICAgICAgLy8gc2V0dGluZyB0YWIgdG8gZm9jdXMgb24gXCJDT05URU5UIHRhYlwiIGlmIGFscmVhZHkgdXNlciBpcyBlbnJvbGxlZFxuICAgICAgdGhpcy50YWJTZWxlY3RlZEluZGV4ID0gMVxuICAgIH1cbiAgfVxuXG4gIGRldGFpbFVybChkYXRhOiBhbnkpIHtcbiAgICAvLyBsZXQgbG9jYXRpb25PcmlnaW4gPSBlbnZpcm9ubWVudC5zaXRlUGF0aCA/IGBodHRwczovLyR7ZW52aXJvbm1lbnQuc2l0ZVBhdGh9YCA6IGxvY2F0aW9uLm9yaWdpblxuICAgIGxldCBsb2NhdGlvbk9yaWdpbiA9IGxvY2F0aW9uLm9yaWdpblxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5hY3RpdmVMb2NhbGUgJiYgdGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlLnBhdGgpIHtcbiAgICAgIGxvY2F0aW9uT3JpZ2luICs9IGAvJHt0aGlzLmNvbmZpZ1N2Yy5hY3RpdmVMb2NhbGUucGF0aH1gXG4gICAgfVxuICAgIHN3aXRjaCAoZGF0YS5wcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgIGNhc2UgTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ0hBTk5FTDpcbiAgICAgICAgcmV0dXJuIGAke2xvY2F0aW9uT3JpZ2lufSR7ZGF0YS5hcnRpZmFjdFVybH1gXG4gICAgICBjYXNlIE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9CT0FSRDpcbiAgICAgICAgcmV0dXJuIGAke2xvY2F0aW9uT3JpZ2lufS9hcHAva25vd2xlZGdlLWJvYXJkLyR7ZGF0YS5pZGVudGlmaWVyfWBcbiAgICAgIGNhc2UgTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUOlxuICAgICAgICByZXR1cm4gYCR7bG9jYXRpb25PcmlnaW59L2FwcC90b2MvJHtkYXRhLmlkZW50aWZpZXJ9L292ZXJ2aWV3P3ByaW1hcnlDYXRlZ29yeT0ke2RhdGEucHJpbWFyeUNhdGVnb3J5fWBcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtsb2NhdGlvbk9yaWdpbn0vYXBwL3RvYy8ke2RhdGEuaWRlbnRpZmllcn0vb3ZlcnZpZXc/cHJpbWFyeUNhdGVnb3J5PSR7ZGF0YS5wcmltYXJ5Q2F0ZWdvcnl9YFxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJvdXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMucm91dGVRdWVyeVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMudXBkYXRlUmV2aWV3c1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy51cGRhdGVSZXZpZXdzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93U3VidGl0bGVPbkJhbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTaGFyZWRTdmMuc3VidGl0bGVPbkJhbm5lcnNcbiAgfVxuICBnZXQgc2hvd0Rlc2NyaXB0aW9uKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgIXRoaXMuY29udGVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2NTaGFyZWRTdmMuc2hvd0Rlc2NyaXB0aW9uXG4gIH1cblxuICBnZXQgaXNSZXNvdXJjZSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBjb25zdCBpc1Jlc291cmNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUIHx8XG4gICAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFIHx8ICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoXG4gICAgICBpZiAoaXNSZXNvdXJjZSkge1xuICAgICAgICB0aGlzLm1vYmlsZUFwcHNTdmMuc2VuZFZpZXdlckRhdGEodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzUmVzb3VyY2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBzZXRTb2NpYWxNZWRpYU1ldGFUYWdzKGRhdGE6IGFueSkge1xuICAgIHRoaXMudGl0bGVUYWdTZXJ2aWNlLnNldFNvY2lhbE1lZGlhVGFncyhcbiAgICAgIHRoaXMuZGV0YWlsVXJsKGRhdGEpLFxuICAgICAgZGF0YS5uYW1lLFxuICAgICAgZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGRhdGEuYXBwSWNvbilcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoZGF0YTogRGF0YSkge1xuICAgIGNvbnN0IGluaXREYXRhID0gdGhpcy50b2NTaGFyZWRTdmMuaW5pdERhdGEoZGF0YSlcbiAgICB0aGlzLmNvbnRlbnQgPSBpbml0RGF0YS5jb250ZW50XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudFt0aGlzLmNvbXBlbnRlbmN5S2V5XSkge1xuICAgICAgdGhpcy5jb250ZW50W3RoaXMuY29tcGVudGVuY3lLZXldID0gdGhpcy5jb250ZW50W3RoaXMuY29tcGVudGVuY3lLZXldXG4gICAgICB0aGlzLmNvbXBldGVuY2llcyA9IHRoaXMuY29udGVudFt0aGlzLmNvbXBlbnRlbmN5S2V5XSB8fCBbXVxuICAgIH1cblxuICAgIHRoaXMuZGlzY3Vzc2lvbkNvbmZpZy5jb250ZXh0SWRBcnIgPSAodGhpcy5jb250ZW50KSA/IFt0aGlzLmNvbnRlbnQuaWRlbnRpZmllcl0gOiBbXVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvbkNvbmZpZy5jYXRlZ29yeU9iaiA9IHtcbiAgICAgICAgY2F0ZWdvcnk6IHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgICAgICBwaWQ6ICcnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbnRlbnQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29udGV4dDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnY291cnNlJyxcbiAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGlzY3Vzc2lvbkNvbmZpZy5jb250ZXh0VHlwZSA9ICdjb3Vyc2UnXG4gICAgdGhpcy5zZXRTb2NpYWxNZWRpYU1ldGFUYWdzKHRoaXMuY29udGVudClcbiAgICB0aGlzLmJvZHkgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYm9keVxuICAgICAgICA/IHRoaXMuZm9yUHJldmlld1xuICAgICAgICAgID8gdGhpcy5hdXRoQWNjZXNzQ29udHJvbFN2Yy5wcm94eVRvQXV0aG9yaW5nVXJsKHRoaXMuY29udGVudC5ib2R5KVxuICAgICAgICAgIDogdGhpcy5jb250ZW50LmJvZHlcbiAgICAgICAgOiAnJyxcbiAgICApXG4gICAgdGhpcy5jb250ZW50UGFyZW50cyA9IHt9XG4gICAgdGhpcy5yZXNldEFuZEZldGNoVG9jU3RydWN0dXJlKClcbiAgICAvLyB0aGlzLmdldFRyYWluaW5nQ291bnQoKVxuICAgIC8vIHRoaXMuZ2V0Q29udGVudFBhcmVudCgpXG4gICAgLy8gaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgIC8vICAgdGhpcy5mZXRjaENvaG9ydHModGhpcy5jb2hvcnRUeXBlc0VudW0uQUNUSVZFX1VTRVJTLCB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAvLyAgIHRoaXMuZmV0Y2hDb2hvcnRzKHRoaXMuY29ob3J0VHlwZXNFbnVtLkFVVEhPUlMsIHRoaXMuY29udGVudC5pZGVudGlmaWVyKVxuICAgIC8vIH1cbiAgfVxuICBzYW5pdGl6ZShkYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoZGF0YSlcbiAgfVxuICBnZXRDb250ZW50UGFyZW50KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRQYXJlbnRSZXE6IE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVxID0ge1xuICAgICAgICBmaWVsZHM6IFsnY29udGVudFR5cGUnLCAnbmFtZSddLFxuICAgICAgfVxuICAgICAgdGhpcy50b2NTaGFyZWRTdmNcbiAgICAgICAgLmZldGNoQ29udGVudFBhcmVudCh0aGlzLmNvbnRlbnQuaWRlbnRpZmllciwgY29udGVudFBhcmVudFJlcSwgdGhpcy5mb3JQcmV2aWV3KVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlQ29udGVudFBhcmVudChyZXMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFBhcmVudHMgPSB7fVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcGV0ZW5jaWVzKGNvbXBldGVuY2llczogYW55KSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzQXJyYXkgPSBKU09OLnBhcnNlKGNvbXBldGVuY2llcylcbiAgICBjb25zdCBjb21wZXRlbmN5U3RyaW5nQXJyYXk6IGFueVtdID0gW11cbiAgICBjb21wZXRlbmNpZXNBcnJheS5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGkgPCAoY29tcGV0ZW5jaWVzQXJyYXkubGVuZ3RoIC0xKSkge1xuICAgICAgLy8gICBjb21wZXRlbmN5U3RyaW5nLnB1c2goYCR7Yy5uYW1lfSwgYClcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGNvbXBldGVuY3lTdHJpbmcucHVzaChjLm5hbWUpXG4gICAgICAvLyB9XG4gICAgICBjb21wZXRlbmN5U3RyaW5nQXJyYXkucHVzaChjLm5hbWUpXG4gICAgfSlcbiAgICByZXR1cm4gY29tcGV0ZW5jeVN0cmluZ0FycmF5XG4gIH1cblxuICBwYXJzZUNvbnRlbnRQYXJlbnQoY29udGVudDogTnNBcHBUb2MuSUNvbnRlbnRQYXJlbnRSZXNwb25zZSkge1xuICAgIGNvbnRlbnQuY29sbGVjdGlvbnMuZm9yRWFjaChjb2xsZWN0aW9uID0+IHtcbiAgICAgIGlmICghdGhpcy5jb250ZW50UGFyZW50cy5oYXNPd25Qcm9wZXJ0eShjb2xsZWN0aW9uLmNvbnRlbnRUeXBlKSkge1xuICAgICAgICB0aGlzLmNvbnRlbnRQYXJlbnRzW2NvbGxlY3Rpb24uY29udGVudFR5cGVdID0gW11cbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFBhcmVudHNbY29sbGVjdGlvbi5jb250ZW50VHlwZV0ucHVzaChjb2xsZWN0aW9uKVxuICAgICAgdGhpcy5wYXJzZUNvbnRlbnRQYXJlbnQoY29sbGVjdGlvbilcbiAgICB9KVxuICB9XG5cbiAgcmVzZXRBbmRGZXRjaFRvY1N0cnVjdHVyZSgpIHtcbiAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcbiAgICAgIGFzc2Vzc21lbnQ6IDAsXG4gICAgICBmaW5hbFRlc3Q6IDAsXG4gICAgICBjb3Vyc2U6IDAsXG4gICAgICBoYW5kc09uOiAwLFxuICAgICAgaW50ZXJhY3RpdmVWaWRlbzogMCxcbiAgICAgIGxlYXJuaW5nTW9kdWxlOiAwLFxuICAgICAgb3RoZXI6IDAsXG4gICAgICBwZGY6IDAsXG4gICAgICBzdXJ2ZXk6IDAsXG4gICAgICBwb2RjYXN0OiAwLFxuICAgICAgcHJhY3RpY2VUZXN0OiAwLFxuICAgICAgcXVpejogMCxcbiAgICAgIHZpZGVvOiAwLFxuICAgICAgd2ViTW9kdWxlOiAwLFxuICAgICAgd2ViUGFnZTogMCxcbiAgICAgIHlvdXR1YmU6IDAsXG4gICAgICBpbnRlcmFjdGl2ZWNvbnRlbnQ6IDAsXG4gICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5oYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUubGVhcm5pbmdNb2R1bGUgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NT0RVTEUgPyAtMSA6IDBcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlLmNvdXJzZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNPVVJTRSA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB0aGlzLnRvY1NoYXJlZFN2Yy5nZXRUb2NTdHJ1Y3R1cmUodGhpcy5jb250ZW50LCB0aGlzLnRvY1N0cnVjdHVyZSlcbiAgICAgIGZvciAoY29uc3QgcHJvZ1R5cGUgaW4gdGhpcy50b2NTdHJ1Y3R1cmUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9jU3RydWN0dXJlW3Byb2dUeXBlXSA+IDApIHtcbiAgICAgICAgICB0aGlzLmhhc1RvY1N0cnVjdHVyZSA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRm9yIExlYXJuaW5nIEh1YiB0cmFpbmluZ3NcbiAgLy8gcHJpdmF0ZSBnZXRUcmFpbmluZ0NvdW50KCkge1xuICAvLyAgIGlmIChcbiAgLy8gICAgIHRoaXMudHJhaW5pbmdMSHViRW5hYmxlZCAmJlxuICAvLyAgICAgdGhpcy5jb250ZW50ICYmXG4gIC8vIHRoaXMudHJhaW5pbmdTdmMuaXNWYWxpZFRyYWluaW5nQ29udGVudCh0aGlzLmNvbnRlbnQpICYmXG4gIC8vICAgIXRoaXMuZm9yUHJldmlld1xuICAvLyApIHtcbiAgLy8gdGhpcy50cmFpbmluZ0xIdWJDb3VudCQgPSB0aGlzLnRyYWluaW5nQXBpXG4gIC8vICAgLmdldFRyYWluaW5nQ291bnQodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gIC8vICAgLnBpcGUocmV0cnkoMikpXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gb3BlblF1ZXJ5TWFpbERpYWxvZyhjb250ZW50OiBhbnksIGRhdGE6IGFueSkge1xuICAvLyAgIGNvbnN0IGVtYWlsQXJyYXkgPSBbXVxuICAvLyAgIGVtYWlsQXJyYXkucHVzaChkYXRhLmVtYWlsKVxuICAvLyAgIGNvbnN0IGRpYWxvZ2RhdGEgPSB7XG4gIC8vICAgICBjb250ZW50LFxuICAvLyAgICAgdXNlcjogZGF0YSxcbiAgLy8gICAgIGVtYWlsczogZW1haWxBcnJheSxcbiAgLy8gICB9XG4gIC8vICAgZGlhbG9nZGF0YS51c2VyLmlzQXV0aG9yID0gdHJ1ZVxuICAvLyAgIHRoaXMuZGlhbG9nLm9wZW48QnRuTWFpbFVzZXJEaWFsb2dDb21wb25lbnQsIElCdG5NYWlsVXNlcj4oXG4gIC8vICAgICBCdG5NYWlsVXNlckRpYWxvZ0NvbXBvbmVudCxcbiAgLy8gICAgIHtcbiAgLy8gICAgICAgLy8gd2lkdGg6ICc1MHZ3JyxcbiAgLy8gICAgICAgbWluV2lkdGg6ICc0MHZ3JyxcbiAgLy8gICAgICAgbWF4V2lkdGg6ICc4MHZ3JyxcbiAgLy8gICAgICAgZGF0YTogZGlhbG9nZGF0YSxcbiAgLy8gICAgIH1cbiAgLy8gICApXG4gIC8vIH1cblxuICBvcGVuRGlhbG9nKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuY3JlYXRlQmF0Y2hEaWFsb2cub3BlbihDcmVhdGVCYXRjaERpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgLy8gaGVpZ2h0OiAnNDAwcHgnLFxuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiB7IGNvbnRlbnQgfSxcbiAgICB9KVxuICAgIC8vIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS54eXogPSB0aGlzLmNvbmZpZ1N2Y1xuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoX3Jlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnRvY1NoYXJlZFN2Yy51cGRhdGVCYXRjaERhdGEoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgcGFyc2VKc29uRGF0YShzOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLy8gY29ob3J0cyAmIGxlYXJuZXJzXG4gIHB1YmxpYyBnZXQgZW5hYmxlUGVvcGxlU2VhcmNoKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMpIHtcbiAgICAgIHJldHVybiAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygncGVvcGxlU2VhcmNoJylcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnb1RvVXNlclByb2ZpbGUodXNlcjogTnNBdXRvQ29tcGxldGUuSVVzZXJBdXRvQ29tcGxldGUpIHtcbiAgICBpZiAodGhpcy5lbmFibGVQZW9wbGVTZWFyY2gpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FwcC9wZXJzb24tcHJvZmlsZScsIHVzZXIud2lkXSlcblxuICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXBwL3BlcnNvbi1wcm9maWxlJ10sIHsgcXVlcnlQYXJhbXM6IHsgZW1haWxJZDogdXNlci5lbWFpbCB9IH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlckZ1bGxOYW1lKHVzZXI6IGFueSkge1xuICAgIC8vIHRoaXMuZ2V0SG92ZXJVc2VyKHVzZXI6IGFueSlcbiAgICBpZiAodXNlciAmJiB1c2VyLmZpcnN0X25hbWUgJiYgdXNlci5sYXN0X25hbWUpIHtcblxuICAgICAgcmV0dXJuIGAke3VzZXIuZmlyc3RfbmFtZS50cmltKCl9ICR7dXNlci5sYXN0X25hbWUudHJpbSgpfWBcbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBnZXRIb3ZlclVzZXIodXNlcjogYW55KSB7XG4gICAgY29uc3QgdXNlcklkID0gdXNlci53aWRcbiAgICB0aGlzLmNvbm5lY3Rpb25Ib3ZlclNlcnZpY2UuZmV0Y2hQcm9maWxlKHVzZXJJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcy5wcm9maWxlRGV0YWlscyAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmhvd2VyVXNlciA9IHJlcy5wcm9maWxlRGV0YWlsc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ob3dlclVzZXIgPSByZXMgfHwge31cblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuaG93ZXJVc2VyXG4gICAgfSlcbiAgfVxuICBmZXRjaENvaG9ydHMoY29ob3J0VHlwZTogTnNDb2hvcnRzLkVDb2hvcnRUeXBlcywgY29udGVudElEOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY29ob3J0UmVzdWx0c1tjb2hvcnRUeXBlXSAmJiAhdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLnRvY1NoYXJlZFN2Yy5mZXRjaENvbnRlbnRDb2hvcnRzKGNvaG9ydFR5cGUsIGNvbnRlbnRJRCkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVdID0ge1xuICAgICAgICAgICAgY29udGVudHM6IF8ubWFwKGRhdGEsIGQgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpcnN0X25hbWU6IF8uZ2V0KGQsICdmaXJzdF9uYW1lJyksXG4gICAgICAgICAgICAgICAgbGFzdF9uYW1lOiBfLmdldChkLCAnbGFzdF9uYW1lJyksXG4gICAgICAgICAgICAgICAgZGVwYXJ0bWVudDogXy5nZXQoZCwgJ2RlcGFydG1lbnQnKSxcbiAgICAgICAgICAgICAgICBkZXNpZ25hdGlvbjogXy5nZXQoZCwgJ2Rlc2lnbmF0aW9uJyksXG4gICAgICAgICAgICAgICAgZW1haWw6IF8uZ2V0KGQsICdlbWFpbCcpLFxuICAgICAgICAgICAgICAgIGRlc2M6IF8uZ2V0KGQsICdkZXNjJyksXG4gICAgICAgICAgICAgICAgdWlkOiBfLmdldChkLCAndXNlcl9pZCcpLFxuICAgICAgICAgICAgICAgIGxhc3RfdHM6IF8uZ2V0KGQsICdsYXN0X3RzJyksXG4gICAgICAgICAgICAgICAgcGhvbmVfTm86IF8uZ2V0KGQsICdwaG9uZV9ObycpLFxuICAgICAgICAgICAgICAgIGNpdHk6IF8uZ2V0KGQsICdjaXR5JyksXG4gICAgICAgICAgICAgICAgdXNlckxvY2F0aW9uOiBfLmdldChkLCAndXNlckxvY2F0aW9uJyksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pIHx8IFtdLFxuICAgICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29ob3J0UmVzdWx0c1tjb2hvcnRUeXBlXSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiBbXSxcbiAgICAgICAgICAgIGhhc0Vycm9yOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29ob3J0UmVzdWx0c1tjb2hvcnRUeXBlXSAmJiAhdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVdID0ge1xuICAgICAgICBjb250ZW50czogW10sXG4gICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmZXRjaFJhdGluZ1N1bW1hcnkoKSB7XG4gICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gdHJ1ZVxuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3ICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmdTdW1tYXJ5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IGZhbHNlXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeSA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUT0RPOiBUbyBiZSByZW1vdmVkXG4gICAgICAgICAgLy8gdGhpcy5oYXJkY29kZURhdGEoKVxuICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCA9IHRoaXMucHJvY2Vzc1JhdGluZ1N1bW1hcnkoKVxuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVU0VSIFJBVElORyBGRVRDSCBFUlJPUiA+JywgZXJyKVxuICAgICAgICAgIC8vIFRPRE86IFRvIGJlIHJlbW92ZWRcbiAgICAgICAgICAvLyB0aGlzLmhhcmRjb2RlRGF0YSgpXG4gICAgICAgICAgLy8gdGhpcy5yYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkID0gdGhpcy5wcm9jZXNzUmF0aW5nU3VtbWFyeSgpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBnZXRBdXRob3JSZXBseShpZGVudGlmaWVyOiBzdHJpbmcsIHByaW1hcnlDYXRlZ29yeTogTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnksIHVzZXJJZHM6IGFueVtdKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBhY3Rpdml0eUlkOiBpZGVudGlmaWVyLFxuICAgICAgICAgIGFjdGl2aXR5VHlwZTogcHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAgIHVzZXJJZDogdXNlcklkcyxcbiAgICAgIH0sXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmdSZXBseShyZXF1ZXN0KS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQuY29udGVudCkge1xuICAgICAgICAgIGNvbnN0IHJlYXRpbmdBdXRoUmVwbGF5ID0gcmVzLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgXy5mb3JFYWNoKHJlYXRpbmdBdXRoUmVwbGF5LCB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF1bJ2NvbW1lbnQnXSA9IHZhbHVlLmNvbW1lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF1bJ3VzZXJJZCddID0gdmFsdWUudXNlcklkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhSZXBsaWVzXG4gICAgICAgIC8vIFRPRE86IFRvIGJlIHJlbW92ZWRcbiAgICAgICAgLy8gdGhpcy5oYXJkY29kZURhdGEoKVxuICAgICAgICAvLyB0aGlzLnJhdGluZ1N1bW1hcnlQcm9jZXNzZWQgPSB0aGlzLnByb2Nlc3NSYXRpbmdTdW1tYXJ5KClcbiAgICAgIH0sXG4gICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgIC8vIFRPRE86IFRvIGJlIHJlbW92ZWRcbiAgICAgICAgLy8gdGhpcy5oYXJkY29kZURhdGEoKVxuICAgICAgICAvLyB0aGlzLnJhdGluZ1N1bW1hcnlQcm9jZXNzZWQgPSB0aGlzLnByb2Nlc3NSYXRpbmdTdW1tYXJ5KClcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBnZXQgY2hlY2tGb3JGYWNpbGl0YXRvcnMoKTogYW55W10ge1xuICAgIGNvbnN0IGZhY2lsaXRhdG9yczogYW55W10gPSBbXVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmXG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLmNvbnRlbnRbMF0gJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubWFwKChzZXNzaW9uRGV0YWlsczogYW55KSA9PiB7XG4gICAgICAgICAgc2Vzc2lvbkRldGFpbHMuZmFjaWxhdG9yRGV0YWlscy5tYXAoKGZhY2lsaXRhdG9yOiBhbnkpID0+IFtcbiAgICAgICAgICAgIGZhY2lsaXRhdG9ycy5wdXNoKGZhY2lsaXRhdG9yKSxcbiAgICAgICAgICBdKVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZmFjaWxpdGF0b3JzXG4gIH1cblxuICBmZXRjaFJhdGluZ0xvb2t1cCgpIHtcbiAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSB0cnVlXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBhY3Rpdml0eVR5cGU6IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIC8vIHRoaXMgZmllbGQgY2FuIGJlIGVuYWJsZWQgaWYgc3BlY2lmaWMgcmF0aW5ncyBoYXZlIHRvIGJlIGxvb2tlZCB1cFxuICAgICAgICAvLyByYXRpbmc6IDAsXG4gICAgICAgIGxpbWl0OiB0aGlzLmxvb2t1cExpbWl0LFxuICAgICAgICAuLi4oKHRoaXMubGFzdExvb2tVcCAmJiB0aGlzLmxhc3RMb29rVXAudXBkYXRlZE9uVVVJRCkgPyB7IHVwZGF0ZU9uOiAodGhpcy5sYXN0TG9va1VwICYmIHRoaXMubGFzdExvb2tVcC51cGRhdGVkT25VVUlEKSB9IDogbnVsbCksXG4gICAgICB9XG4gICAgICB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmdMb29rdXAocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IGZhbHNlXG4gICAgICAgICAgLy8gLy8gY29uc29sZS5sb2coJ1JhdGluZyBzdW1tYXJ5IHJlcyAnLCByZXMpXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJldmlld1BhZ2UgPiAxKSB7XG4gICAgICAgICAgICAgIHJlcy5yZXN1bHQucmVzcG9uc2UubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmF0aW5nTG9va3VwLmZpbmQoKG86IGFueSkgPT4gby51cGRhdGVkT25VVUlEID09PSBpdGVtLnVwZGF0ZWRPblVVSUQpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJhdGluZ0xvb2t1cC5wdXNoKGl0ZW0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yYXRpbmdMb29rdXAgPSByZXMucmVzdWx0LnJlc3BvbnNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5wcm9jZXNzUmF0aW5nTG9va3VwKHJlcy5yZXN1bHQucmVzcG9uc2UpXG4gICAgICAgIH0sXG4gICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBzaG93QUxMUmV2aWV3cyhsZW5ndGg6IG51bWJlcikge1xuICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gbGVuZ3RoXG4gIH1cblxuICBwcm9jZXNzUmF0aW5nU3VtbWFyeSgpIHtcbiAgICBjb25zdCBicmVha0Rvd25BcnJheTogYW55W10gPSBbXVxuICAgIGNvbnN0IHJhdGluZ1N1bW1hcnlQciA9IHtcbiAgICAgIGJyZWFrRG93bjogYnJlYWtEb3duQXJyYXksXG4gICAgICBsYXRlc3Q1MFJldmlld3M6IGJyZWFrRG93bkFycmF5LFxuICAgICAgcmF0aW5nc051bWJlcjogYnJlYWtEb3duQXJyYXksXG4gICAgICB0b3RhbF9udW1iZXJfb2ZfcmF0aW5nczogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxfbnVtYmVyX29mX3JhdGluZ3MnKSB8fCAwLFxuICAgICAgYXZnUmF0aW5nOiAwLFxuICAgIH1cblxuICAgIGNvbnN0IHRvdFJhdGluZ3MgPSBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICdzdW1fb2ZfdG90YWxfcmF0aW5ncycpIHx8IDBcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50MXN0YXJzJyksIDEsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiAxLFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQxc3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQyc3RhcnMnKSwgMiwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDIsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDJzdGFycycpLFxuICAgIH0pXG4gICAgcmF0aW5nU3VtbWFyeVByLmJyZWFrRG93bi5wdXNoKHtcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDNzdGFycycpLCAzLCB0b3RSYXRpbmdzKSxcbiAgICAgIGtleTogMyxcbiAgICAgIHZhbHVlOiBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50M3N0YXJzJyksXG4gICAgfSlcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50NHN0YXJzJyksIDQsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiA0LFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ0c3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ1c3RhcnMnKSwgNSwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDUsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDVzdGFycycpLFxuICAgIH0pXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIHJhdGluZ1N1bW1hcnlQci5sYXRlc3Q1MFJldmlld3MgPSB0aGlzLnJhdGluZ1N1bW1hcnkgJiYgdGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cyA/IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cykgOiBbXVxuICAgIC8vIC8vIHJhdGluZ1N1bW1hcnlQci5sYXRlc3Q1MFJldmlld3MgPSB0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzXG4gICAgLy8gdGhpcy5yYXRpbmdSZXZpZXdzID0gdGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MgPyBKU09OLnBhcnNlKHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MpIDogW11cbiAgICAvLyByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID0gcGFyc2VGbG9hdCgoKCgodG90UmF0aW5ncyAvIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykgKiAxMDApICogNSkgLyAxMDApLnRvRml4ZWQoMSkpXG4gICAgaWYgKHRoaXMucmF0aW5nU3VtbWFyeSAmJiB0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKSB7XG4gICAgICAvLyByYXRpbmdTdW1tYXJ5UHIubGF0ZXN0NTBSZXZpZXdzID0gSlNPTi5wYXJzZSh0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKVxuICAgICAgLy8gdGhpcy5yYXRpbmdSZXZpZXdzID0gSlNPTi5wYXJzZSh0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKVxuICAgICAgY29uc3QgbGF0ZXN0NTBSZXZpZXdzID0gSlNPTi5wYXJzZSh0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKVxuICAgICAgY29uc3QgbW9kaWZpZWRSZXZpZXdzID0gXy5tYXAobGF0ZXN0NTBSZXZpZXdzLCByYXRpbmcgPT4ge1xuICAgICAgICByYXRpbmdbJ3VzZXJJZCddID0gIHJhdGluZy51c2VyX2lkXG4gICAgICAgIHJldHVybiByYXRpbmdcbiAgICAgIH0pXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgY29uc3QgdXNlcklkcyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuICAgICAgcmF0aW5nU3VtbWFyeVByLmxhdGVzdDUwUmV2aWV3cyA9IG1vZGlmaWVkUmV2aWV3c1xuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gbW9kaWZpZWRSZXZpZXdzXG4gICAgfVxuICAgIC8vIHJhdGluZyBjaGFuZ2VzIDA3IG1hcmNoIDIzXG4gICAgLy8gY29uc3QgbWVhblJhdGluZyA9IHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucmVkdWNlKCh2YWwsIGl0ZW0pID0+IHtcbiAgICAvLyAgIC8vIGNvbnNvbGUubG9nKCdpdGVtJywgaXRlbSlcbiAgICAvLyAgIHJldHVybiB2YWwgKyAoaXRlbS5rZXkgKiBpdGVtLnZhbHVlKVxuICAgIC8vICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBhbGlnblxuICAgIC8vIH0sIDApXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIHJhdGluZ1N1bW1hcnlQci5hdmdSYXRpbmcgPSB0aGlzLnJhdGluZ1N1bW1hcnkgJiYgdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzID8gcGFyc2VGbG9hdCgobWVhblJhdGluZyAvIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykudG9GaXhlZCgxKSkgOiAwXG5cbiAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykge1xuICAgICAgLy8gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZyA9IHBhcnNlRmxvYXQoKG1lYW5SYXRpbmcgLyB0aGlzLnJhdGluZ1N1bW1hcnkudG90YWxfbnVtYmVyX29mX3JhdGluZ3MpLnRvRml4ZWQoMSkpXG4gICAgICByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID1cbiAgICAgIHBhcnNlRmxvYXQoKHRoaXMucmF0aW5nU3VtbWFyeS5zdW1fb2ZfdG90YWxfcmF0aW5ncyAvIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykudG9GaXhlZCgxKSlcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nXG4gICAgICB0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgPSByYXRpbmdTdW1tYXJ5UHIudG90YWxfbnVtYmVyX29mX3JhdGluZ3NcbiAgICB9XG4gICAgLy8gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZyA9IDVcbiAgICByZXR1cm4gcmF0aW5nU3VtbWFyeVByXG4gIH1cblxuICBwcm9jZXNzUmF0aW5nTG9va3VwKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGggPCB0aGlzLmxvb2t1cExpbWl0KSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSBmYWxzZVxuICAgICAgICB0aGlzLmxvb2t1cExvYWRpbmcgPSBmYWxzZVxuICAgICAgfVxuICAgICAgdGhpcy5sYXN0TG9va1VwID0gcmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nTG9va3VwXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KHRoaXMucmF0aW5nUmV2aWV3cywgJ3VzZXJJZCcpXG4gICAgICBjb25zdCB1c2VySWRzID0gXy5tYXAodGhpcy5yYXRpbmdSZXZpZXdzLCAndXNlcklkJylcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdXNlcklkcykge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gdGhpcy5yYXRpbmdSZXZpZXdzLnNsaWNlKClcbiAgICB9XG4gIH1cblxuICBjb3VudFN0YXJzUGVyY2VudGFnZSh2YWx1ZTogYW55LCBrZXk6IGFueSwgdG90YWw6IGFueSkge1xuICAgIGlmICh2YWx1ZSAmJiB0b3RhbCkge1xuICAgICAgcmV0dXJuICgoKHZhbHVlICoga2V5KSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgyKVxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9XG5cbiAgZ2V0UmF0aW5nSWNvbihyYXRpbmdJbmRleDogbnVtYmVyLCBhdmc6IG51bWJlcik6ICdzdGFyJyB8ICdzdGFyX2JvcmRlcicgfCAnc3Rhcl9oYWxmJyB7XG4gICAgcmV0dXJuIHRoaXMucmF0aW5nU3ZjLmdldFJhdGluZ0ljb24ocmF0aW5nSW5kZXgsIGF2ZylcbiAgfVxuXG4gIGdldFJhdGluZ0ljb25DbGFzcyhyYXRpbmdJbmRleDogbnVtYmVyLCBhdmc6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmdJY29uQ2xhc3MocmF0aW5nSW5kZXgsIGF2ZylcbiAgfVxuXG4gIHNvcnRSZXZpZXdzKHNvcnQ6IHN0cmluZykge1xuICAgIC8vIFJlc2V0IHRoZSBjb3VudGVycy8gcHJldmlvdXMgdmFsdWVzIGJlZm9yZSBjaGFuZ2luZyB0aGUgZmlsdGVyIGFuZCB2aWV3XG4gICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJhdGluZ1ZpZXdDb3VudERlZmF1bHRcbiAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xuICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IFtdXG4gICAgdGhpcy5yZXZpZXdQYWdlID0gMVxuICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcbiAgICB0aGlzLnJhdGluZ0xvb2t1cCA9IFtdXG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIGlmIChzb3J0ID09PSB0aGlzLnNvcnRSZXZpZXdWYWx1ZXNbMF0pIHtcbiAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVG8gdXBkYXRlZCBib3RoIHJldmlld3MsIGFuZCByYXRpbmcgc3VtbWFyeSBhdCBvbmNlIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpb1xuICB1cGRhdGVSZXZpZXdzKCkge1xuICAgIC8vIFJlc2V0IHRoZSBjb3VudGVycy8gcHJldmlvdXMgdmFsdWVzIGJlZm9yZSBjaGFuZ2luZyB0aGUgZmlsdGVyIGFuZCB2aWV3XG4gICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJhdGluZ1ZpZXdDb3VudERlZmF1bHRcbiAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xuICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IFtdXG4gICAgdGhpcy5yZXZpZXdQYWdlID0gMVxuICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcbiAgICB0aGlzLnJhdGluZ0xvb2t1cCA9IFtdXG4gICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgIGlmICh0aGlzLnByZXZpb3VzRmlsdGVyICE9PSB0aGlzLnNvcnRSZXZpZXdWYWx1ZXNbMF0pIHtcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdMb29rdXAoKVxuICAgIH1cbiAgfVxuXG4gIGdldCB1c3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuaG93ZXJVc2VyXG4gIH1cblxuICBwdWJsaWMgdGFiQ2xpY2tlZCh0YWJFdmVudDogTWF0VGFiQ2hhbmdlRXZlbnQpIHtcbiAgICAvLyBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgLy8gICByZXR1cm5cbiAgICAvLyB9XG4gICAgY29uc3QgZGF0YTogV3NFdmVudHMuSVRlbGVtZXRyeVRhYkRhdGEgPSB7XG4gICAgICBsYWJlbDogYCR7dGFiRXZlbnQudGFiLnRleHRMYWJlbH1gLFxuICAgICAgaW5kZXg6IHRhYkV2ZW50LmluZGV4LFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmhhbmRsZVRhYlRlbGVtZXRyeShcbiAgICAgIFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNPVVJTRV9UQUIsXG4gICAgICBkYXRhLFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBsb2FkTW9yZSgpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZUxvYWRNb3JlICYmICF0aGlzLmxvb2t1cExvYWRpbmcpIHtcbiAgICAgIHRoaXMubG9va3VwTG9hZGluZyA9IHRydWVcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICBpZiAoKHRoaXMuc2VhcmNoRm9ybSEuZ2V0ISgnc29ydEJ5Q29udHJvbCcpIS52YWx1ZSA9PT0gdGhpcy5zb3J0UmV2aWV3VmFsdWVzWzBdKSkge1xuICAgICAgICBpZiAoKHRoaXMucmV2aWV3UGFnZSAqIHRoaXMucmF0aW5nVmlld0NvdW50KSA+IHRoaXMucmF0aW5nUmV2aWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVMb2FkTW9yZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldmlld1BhZ2UgPSB0aGlzLnJldmlld1BhZ2UgKyAxXG4gICAgICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJldmlld0RlZmF1bHRMaW1pdFxuICAgICAgICB0aGlzLmZldGNoUmF0aW5nTG9va3VwKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVMYWJlbHMobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbFdpdGhvdXRzcGFjZShsYWJlbCwgdHlwZSwgJycpXG4gIH1cbn1cbiIsIjxtYXQtdGFiLWdyb3VwIFtzZWxlY3RlZEluZGV4XT1cInRhYlNlbGVjdGVkSW5kZXhcIiBjbGFzcz1cImN1c3RvbS10YWJncm91cFwiIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJ0YWJDbGlja2VkKCRldmVudClcIj5cbiAgICA8bWF0LXRhYiBsYWJlbD1cInt7J2FwcHRvY3NpbmdsZXBhZ2Uub3ZlcnZpZXcnIHwgdHJhbnNsYXRlfX1cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XG4gICAgICAgICAgICA8c2VjdGlvbiBpZD1cIm92ZXJ2aWV3XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeGVkLXdpZHRoIGZsZXggZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRhLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gOiBDb25kaXRpb25hbCA6IElmIG5vdCBzaG93biBoZXJlLCB3aWxsIGJlIHNob3duIG92ZXIgYmFubmVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2NDb25maWc/Lm92ZXJ2aWV3Py5kZXNjcmlwdGlvbj8uZW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Rlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGVPbkJhbm5lciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwidW5pdC1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0cmFuc2xhdGVMYWJlbHModG9jQ29uZmlnPy5vdmVydmlldz8uZGVzY3JpcHRpb24/LmRpc3BsYXlOYW1lLCAnYXBwdG9jc2luZ2xlcGFnZScpIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXQtYm9keS0xXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZShjb250ZW50Py5kZXNjcmlwdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29udGVudCBCb2R5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkICpuZ0lmPVwidG9jQ29uZmlnPy5vdmVydmlldz8uYm9keT8uZW5hYmxlZCAmJiBjb250ZW50Py5pbnN0cnVjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5pdC1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0cmFuc2xhdGVMYWJlbHModG9jQ29uZmlnPy5vdmVydmlldz8uYm9keT8uZGlzcGxheU5hbWUsICdhcHB0b2NzaW5nbGVwYWdlJykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hdC1ib2R5LTFcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplKGNvbnRlbnQ/Lmluc3RydWN0aW9ucylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGVhcm5pbmcgb2JqZWN0aXZlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJ0b2NDb25maWc/Lm92ZXJ2aWV3Py5sZWFybmluZ09iamVjdGl2ZT8uZW5hYmxlZCAmJiBjb250ZW50Py5sZWFybmluZ09iamVjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LmxlYXJuaW5nT2JqZWN0aXZlPy5kaXNwbGF5TmFtZSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hdC1zdWJoZWFkaW5nLTFcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQ/LmxlYXJuaW5nT2JqZWN0aXZlXCI+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlZ2lzdHJhdGlvbiBpbnN0cnVjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cIlxuICAgICAgICAgICAgdG9jQ29uZmlnPy5vdmVydmlldz8ucmVnaXN0cmF0aW9uSW5zdHJ1Y3Rpb25zPy5lbmFibGVkICYmXG4gICAgICAgICAgICBjb250ZW50Py5yZWdpc3RyYXRpb25JbnN0cnVjdGlvbnM/Lmxlbmd0aFxuICAgICAgICAgICAgXCIgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnJlZ2lzdHJhdGlvbkluc3RydWN0aW9ucz8uZGlzcGxheU5hbWUgfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hdC1zdWJoZWFkaW5nLTEgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjb250ZW50Py5yZWdpc3RyYXRpb25JbnN0cnVjdGlvbnNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkICpuZ0lmPVwidG9jQ29uZmlnPy5vdmVydmlldz8ucHJlQ29udGVudHM/LmVuYWJsZWQgJiYgY29udGVudD8ucHJlQ29udGVudHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnByZUNvbnRlbnRzPy5kaXNwbGF5TmFtZSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgcHJlQ29udGVudCBvZiBjb250ZW50Py5wcmVDb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtci0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwid3MtbWF0LXByaW1hcnktdGV4dFwiIFtyb3V0ZXJMaW5rXT1cIicvYXBwL3RvYy8nICsgcHJlQ29udGVudC5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJ7cHJpbWFyeUNhdGVnb3J5OiBwcmVDb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LXN1YmhlYWRpbmctMVwiPnt7IHByZUNvbnRlbnQubmFtZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnBvc3RDb250ZW50cz8uZW5hYmxlZCAmJiBjb250ZW50Py5wb3N0Q29udGVudHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnBvc3RDb250ZW50cz8uZGlzcGxheU5hbWUgfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtYi0xXCIgKm5nRm9yPVwibGV0IHBvc3RDb250ZW50IG9mIGNvbnRlbnQ/LnBvc3RDb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtci0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwid3MtbWF0LXByaW1hcnktdGV4dFwiIFtyb3V0ZXJMaW5rXT1cIicvYXBwL3RvYy8nICsgcG9zdENvbnRlbnQuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LXN1YmhlYWRpbmctMVwiPnt7IHBvc3RDb250ZW50Lm5hbWUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJ0b2NDb25maWc/Lm92ZXJ2aWV3Py5jZXJ0aWZpY2F0aW9uTGlzdD8uZW5hYmxlZCAmJiBjb250ZW50Py5jZXJ0aWZpY2F0aW9uTGlzdD8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8uY2VydGlmaWNhdGlvbkxpc3Q/LmRpc3BsYXlOYW1lIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbWItMVwiICpuZ0Zvcj1cImxldCBjZXJ0aWZpY2F0aW9uIG9mIGNvbnRlbnQ/LmNlcnRpZmljYXRpb25MaXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhbGlnbi1ib3R0b21cIj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBjZXJ0aWZpY2F0aW9uLmlkZW50aWZpZXIgKyAnP3ByaW1hcnlDYXRlZ29yeT0nKyBpdGVtLnByaW1hcnlDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1zdWJoZWFkaW5nLTFcIj57eyBjZXJ0aWZpY2F0aW9uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJ0b2NDb25maWc/Lm92ZXJ2aWV3Py5zdHVkeU1hdGVyaWFscz8uZW5hYmxlZCAmJiBjb250ZW50Py5zdHVkeU1hdGVyaWFscz8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8uc3R1ZHlNYXRlcmlhbHM/LmRpc3BsYXlOYW1lIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbWItMVwiICpuZ0Zvcj1cImxldCBzdHVkeWl0ZW0gb2YgY29udGVudD8uc3R1ZHlNYXRlcmlhbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFsaWduLWJvdHRvbVwiPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBbcm91dGVyTGlua109XCInL2FwcC90b2MvJyArIHN0dWR5aXRlbS5pZGVudGlmaWVyICsgJz9wcmltYXJ5Q2F0ZWdvcnk9JysgaXRlbS5wcmltYXJ5Q2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+e3sgc3R1ZHlpdGVtLm5hbWUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJcbiAgICAgICAgICAgIHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnBsYXlncm91bmRSZXNvdXJjZXM/LmVuYWJsZWQgJiYgY29udGVudD8ucGxheWdyb3VuZFJlc291cmNlcz8ubGVuZ3RoXG4gICAgICAgICAgICBcIiBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8ucGxheWdyb3VuZFJlc291cmNlcz8uZGlzcGxheU5hbWUgfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtYi0xXCIgKm5nRm9yPVwibGV0IHBsYXlncm91bmRSZXNvdXJjZSBvZiBjb250ZW50Py5wbGF5Z3JvdW5kUmVzb3VyY2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhbGlnbi1ib3R0b21cIj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBwbGF5Z3JvdW5kUmVzb3VyY2UuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LXN1YmhlYWRpbmctMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwbGF5Z3JvdW5kUmVzb3VyY2UubmFtZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LmtBcnRpZmFjdHM/LmVuYWJsZWQgJiYgY29udGVudD8ua0FydGlmYWN0cz8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8ua0FydGlmYWN0cz8uZGlzcGxheU5hbWUgfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtYi0xXCIgKm5nRm9yPVwibGV0IGtBcnRpZmFjdCBvZiBjb250ZW50Py5rQXJ0aWZhY3RzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhbGlnbi1ib3R0b21cIj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBrQXJ0aWZhY3QuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LXN1YmhlYWRpbmctMVwiPnt7IGtBcnRpZmFjdC5uYW1lIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkICpuZ0lmPVwiXG4gICAgICAgICAgICB0b2NDb25maWc/Lm92ZXJ2aWV3Py5lcXVpdmFsZW50Q2VydGlmaWNhdGlvbnM/LmVuYWJsZWQgJiZcbiAgICAgICAgICAgIGNvbnRlbnQ/LmVxdWl2YWxlbnRDZXJ0aWZpY2F0aW9ucz8ubGVuZ3RoXG4gICAgICAgICAgICBcIiBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8uZXF1aXZhbGVudENlcnRpZmljYXRpb25zPy5kaXNwbGF5TmFtZSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgZXF1aXZhbGVudENlcnRpZmljYXRpb24gb2YgY29udGVudD8uZXF1aXZhbGVudENlcnRpZmljYXRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhbGlnbi1ib3R0b21cIj53ZWJfYXNzZXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBlcXVpdmFsZW50Q2VydGlmaWNhdGlvbi5pZGVudGlmaWVyICsnP3ByaW1hcnlDYXRlZ29yeT0nKyBpdGVtLnByaW1hcnlDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1zdWJoZWFkaW5nLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXF1aXZhbGVudENlcnRpZmljYXRpb24ubmFtZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cIlxuICAgICAgICAgICAgdG9jQ29uZmlnPy5vdmVydmlldz8uc29mdHdhcmVSZXF1aXJlbWVudHM/LmVuYWJsZWQgJiYgY29udGVudD8uc29mdHdhcmVSZXF1aXJlbWVudHM/Lmxlbmd0aFxuICAgICAgICAgICAgXCIgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnNvZnR3YXJlUmVxdWlyZW1lbnRzPy5kaXNwbGF5TmFtZSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgc29mdHdhcmVSZXF1aXJlbWVudCBvZiBjb250ZW50Py5zb2Z0d2FyZVJlcXVpcmVtZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtci0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwid3MtbWF0LXByaW1hcnktdGV4dFwiIFtocmVmXT1cInNvZnR3YXJlUmVxdWlyZW1lbnQudXJsXCIgdGFyZ2V0PVwiYmxhbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNvZnR3YXJlUmVxdWlyZW1lbnQudGl0bGUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTa2lsbHMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnNraWxscz8uZW5hYmxlZCAmJiBjb250ZW50Py5za2lsbHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbSBtYXQtYXBwLWJhY2tncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py5za2lsbHM/LmRpc3BsYXlOYW1lIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwic2VjdGlvbi1jb250ZW50XCIgKm5nRm9yPVwibGV0IHNraWxsIG9mIGNvbnRlbnQ/LnNraWxsc1wiPnt7IHNraWxsLm5hbWUgfX08L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXF1aXJlbWVudHMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnByZVJlcXVpc2l0ZXM/LmVuYWJsZWQgJiYgY29udGVudD8ucHJlUmVxdWlzaXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnByZVJlcXVpc2l0ZXM/LmRpc3BsYXlOYW1lIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTFcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQ/LnByZVJlcXVpc2l0ZXNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi10b3Atc1wiICpuZ0lmPVwiY29udGVudD8uc29mdHdhcmVSZXF1aXJlbWVudHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWF0LWgzIG1hcmdpbi1ib3R0b20teHNcIiA+U29mdHdhcmUgUmVxdWlyZW1lbnRzPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlcXVpcmVtZW50IG9mIGNvbnRlbnQ/LnNvZnR3YXJlUmVxdWlyZW1lbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyZXF1aXJlbWVudC51cmxcIiBjbGFzcz1cIm1hcmdpbi1yaWdodC1zXCIgbWF0LXN0cm9rZWQtYnV0dG9uIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJlcXVpcmVtZW50LnVybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZXF1aXJlbWVudC50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJtYXJnaW4tcmlnaHQtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJlcXVpcmVtZW50Py51cmxcIj57eyByZXF1aXJlbWVudC50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUcmFpbmluZyAoTEh1YikgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRyYWluaW5nTEh1YkVuYWJsZWQgJiYgdHJhaW5pbmdMSHViQ291bnQkIHwgYXN5bmMgYXMgdHJhaW5pbmdMSHViQ291bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5pdC1tZXRhLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIiA+VHJhaW5pbmdzPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtYXQtaDRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj57eyB0cmFpbmluZ0xIdWJDb3VudCB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGkxOG49XCJ4IHRyYWluaW5ncyBhdmFpbGFibGVcIiAqbmdJZj1cInRyYWluaW5nTEh1YkNvdW50ID4gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmdzIGF2YWlsYWJsZTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGkxOG49XCIxIHRyYWluaW5nIGF2YWlsYWJsZVwiICpuZ0lmPVwidHJhaW5pbmdMSHViQ291bnQgPT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nIGF2YWlsYWJsZTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVsYXRlZCBUb3BpY3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCIgKm5nSWY9XCJ0b2NDb25maWc/Lm92ZXJ2aWV3Py50b3BpY3M/LmVuYWJsZWQgJiYgY29udGVudD8udG9waWNzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py50b3BpY3M/LmRpc3BsYXlOYW1lIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1iZXR3ZWVuIGZsZXgtd3JhcHBlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbWF0LXN0cm9rZWQtYnV0dG9uIGNsYXNzPVwidG9waWMtYnV0dG9uIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0b3BpYyBvZiBjb250ZW50Py50b3BpY3MgfCBwaXBlTGltaXRUbzogKHZpZXdNb3JlUmVsYXRlZFRvcGljcyA/IDI0IDogNilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJ0b3BpYz8ubmFtZVwiIFtyb3V0ZXJMaW5rXT1cIicvYXBwL2NvbmNlcHQtZ3JhcGgvJyArIHRvcGljLmlkZW50aWZpZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b3BpYz8ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LnRvcGljcz8ubGVuZ3RoID4gNlwiIGNsYXNzPVwidGV4dC1yaWdodCBtYXJnaW4tdG9wLXhzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtYnV0dG9uIChjbGljayk9XCJ2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSAhdmlld01vcmVSZWxhdGVkVG9waWNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdmlld01vcmVSZWxhdGVkVG9waWNzXCIgPlZpZXcgTW9yZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInZpZXdNb3JlUmVsYXRlZFRvcGljc1wiID5WaWV3IExlc3M8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLWJvdHRvbS1tXCIgKm5nSWY9XCJvYmpLZXlzKGNvbnRlbnRQYXJlbnRzKS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiA+VGhpcyBjb250ZW50IGlzIHBhcnQgb2Y8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBvYmpLZXlzKGNvbnRlbnRQYXJlbnRzKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBrZXkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgY29udGVudCBvZiBjb250ZW50UGFyZW50c1trZXldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBbcm91dGVyTGlua109XCJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC5zdGF0dXMgIT09ICdMaXZlJ1xuICAgICAgICAgICAgICAgICAgICA/ICcvYXV0aG9yJyArICcvdG9jLycgKyBjb250ZW50LmlkZW50aWZpZXIgKyc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XG4gICAgICAgICAgICAgICAgICAgIDogJy9hcHAnICsgJy90b2MvJyArIGNvbnRlbnQuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XG4gICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1zdWJoZWFkaW5nLTFcIj57eyBjb250ZW50Lm5hbWUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwiYXV0aG9yc1wiICpuZ0lmPVwiKGNvbnRlbnQ/LmNyZWF0b3JEZXRhaWxzICYmIGNvbnRlbnQ/LmNyZWF0b3JEZXRhaWxzLmxlbmd0aCA+IDApIHx8IChjb250ZW50Py5jcmVhdG9yQ29udGFjdHMgJiYgY29udGVudD8uY3JlYXRvckNvbnRhY3RzLmxlbmd0aCA+IDApICB8fFxuICAgICAgICAgICAgICAgIChjb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVzRW51bS5BVVRIT1JTXSAmJiBjb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVzRW51bS5BVVRIT1JTXS5sZW5ndGggPiAwKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbHVpZC13aWR0aCBjb250YWN0cy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeGVkLXdpZHRoIGZsZXggZmxleC1jb2wgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDIgX25nY29udGVudC1xbWwtYzI4PVwiXCIgY2xhc3M9XCJtYXQtdG9vbGJhciBjb250YWN0cy1oZWFkXCI+e3snYXBwdG9jc2luZ2xlcGFnZS5hdXRob3JzQW5kQ3VyYXRvcnMnIHwgdHJhbnNsYXRlfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbWQ6Z3JpZC1jb2xzLTIgY29sLWdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhdXRob3JzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBwYXJzZUpzb25EYXRhKGNvbnRlbnQ/LmNyZWF0b3JEZXRhaWxzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5pdC1jb2hvcnQgc206cHItOCBtZDpwci0xMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx3cy13aWRnZXQtdXNlci1pbWFnZSBjbGFzcz1cInVzZXItaW1hZ2VcIiBbaW1hZ2VUeXBlXT1cIid1c2VyLXBob3RvJ1wiIFt1c2VyTmFtZV09XCJhdXRob3IubmFtZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW1haWxdPVwiYXV0aG9yLmVtYWlsXCIgW2ltYWdlVXJsXT1cImF1dGhvci5waG90byB8fCAnJ1wiPjwvd3Mtd2lkZ2V0LXVzZXItaW1hZ2U+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXMgXCIgW3JhbmRvbUNvbG9yXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFsZW5dPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCIgW25hbWVdPVwiYXV0aG9yLm5hbWVcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1uYW1lXCI+e3sgYXV0aG9yLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWF0LWJvZHktMiAgbWItMCAgd3MtbWF0LWJsYWNrNjAtdGV4dFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9yJyB8IHRyYW5zbGF0ZX19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGN1cmF0b3JzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBwYXJzZUpzb25EYXRhKGNvbnRlbnQ/LmNyZWF0b3JDb250YWN0cylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5pdC1jb2hvcnQgdXNlci1jYXJkIHNtOnByLTggbWQ6cHItMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx3cy13aWRnZXQtdXNlci1pbWFnZSBjbGFzcz1cInVzZXItaW1hZ2VcIiBbaW1hZ2VUeXBlXT1cIid1c2VyLXBob3RvJ1wiIFt1c2VyTmFtZV09XCJhdXRob3IubmFtZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWFpbF09XCJhdXRob3IuZW1haWxcIiBbaW1hZ2VVcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCI+PC93cy13aWRnZXQtdXNlci1pbWFnZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC1zXCIgW3JhbmRvbUNvbG9yXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhbGVuXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCIgW25hbWVdPVwiYXV0aG9yLm5hbWVcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItbmFtZVwiPnt7IGF1dGhvci5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWF0LWJvZHktMiBtYi0wIHdzLW1hdC1ibGFjazYwLXRleHRcIj57eydhcHB0b2NzaW5nbGVwYWdlLmN1cmF0b3InIHwgdHJhbnNsYXRlfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJjb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVzRW51bS5BVVRIT1JTXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzICpuZ0lmPVwiY29ob3J0UmVzdWx0c1tjb2hvcnRUeXBlc0VudW0uQVVUSE9SU10uaGFzRXJyb3JcIiBjbGFzcz1cIm1hdC1lcnJvciB0ZXh0LWNlbnRlclwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBjdXJhdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVzRW51bS5BVVRIT1JTXS5oYXNFcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZXNFbnVtLkFVVEhPUlNdLmNvbnRlbnRzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29ob3J0IG9mIGNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZXNFbnVtLkFVVEhPUlNdLmNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInVuaXRDb2hvcnROZXcxXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdXNlcjogY29ob3J0IH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgPHNlY3Rpb24gaWQ9XCJkaXJlY3RvclwiICpuZ0lmPVwiY2hlY2tGb3JGYWNpbGl0YXRvcnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsdWlkLXdpZHRoIGNvbnRhY3RzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBfbmdjb250ZW50LXFtbC1jMjg9XCJcIiBjbGFzcz1cIm1hdC10b29sYmFyIGNvbnRhY3RzLWhlYWRcIj57eydhcHB0b2NzaW5nbGVwYWdlLnByb2dyYW1EaXJlY3RvckZhY2lsaXRhdG9ycycgfCB0cmFuc2xhdGV9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMSBzbTpncmlkLWNvbHMtMiBtZDpncmlkLWNvbHMtMiBjb2wtZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlc3Npb25EZXRhaWxzIG9mIHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LnNlc3Npb25EZXRhaWxzX3YyXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmYWNpbGl0YXRvciBvZiBjaGVja0ZvckZhY2lsaXRhdG9yc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVuaXQtY29ob3J0IHNtOnByLTggbWQ6cHItMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXMgXCIgW3JhbmRvbUNvbG9yXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhbGVuXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIidyb3VuZC1tJ1wiIFtwaG90b1VybF09XCJmYWNpbGl0YXRvci5waG90byB8fCAnJ1wiIFtuYW1lXT1cImZhY2lsaXRhdG9yLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLW5hbWVcIj57eyBmYWNpbGl0YXRvci5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWF0LWJvZHktMiAgbWItMCAgd3MtbWF0LWJsYWNrNjAtdGV4dFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuZmFjaWxpdGF0b3InIHwgdHJhbnNsYXRlfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICA8c2VjdGlvbiBpZD1cImNvbXBldGVuY2llc1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50W2NvbXBlbnRlbmN5S2V5XSAmJiBjb21wZXRlbmNpZXMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsdWlkLXdpZHRoIGNvbnRhY3RzLWNvbnRhaW5lciBtYi0xMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10b29sYmFyIGNvbnRhY3RzLWhlYWRcIj57eydhcHB0b2NzaW5nbGVwYWdlLmNvbXBldGVuY2llcycgfCB0cmFuc2xhdGV9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiY29tcHQtdGFibGUgd2lkdGgtMS0xIHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwicGFkZGluZy14cyB3cy1tYXQtYmxhY2s2MC10ZXh0IG1hdC1ib2R5LTFcIj57eydhcHB0b2NzaW5nbGVwYWdlLnN1YlRoZW1lJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwicGFkZGluZy14cyB3cy1tYXQtYmxhY2s2MC10ZXh0IG1hdC1ib2R5LTFcIj57eydhcHB0b2NzaW5nbGVwYWdlLnRoZW1lJyB8IHRyYW5zbGF0ZX19IDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInBhZGRpbmcteHMgd3MtbWF0LWJsYWNrNjAtdGV4dCBtYXQtYm9keS0xXCI+e3snYXBwdG9jc2luZ2xlcGFnZS5hcmVhJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgY29tcCBvZiBjb21wZXRlbmNpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLmNvbXBldGVuY3lTdWJUaGVtZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLmNvbXBldGVuY3lUaGVtZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLmNvbXBldGVuY3lBcmVhfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICAgIDwhLS0gPHNlY3Rpb24gaWQ9XCJjb21wZXRlbmNpZXNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiKCghY29udGVudD8udGVzdF9jb21wZXRlbmNpZXNfdjQgJiYgY29udGVudD8uY29tcGV0ZW5jaWVzX3YzKSAmJlxuICAgICAgICAgICAgICAgICAgICAoY29tcGV0ZW5jaWVzLmxlbmd0aCkgfHwgKGNvbnRlbnQ/LmNvbXBldGVuY2llcyAmJiBjb21wZXRlbmNpZXMubGVuZ3RoKSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmx1aWQtd2lkdGggY29udGFjdHMtY29udGFpbmVyIG1iLTEwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aCBmbGV4IGZsZXgtY29sIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRvb2xiYXIgY29udGFjdHMtaGVhZFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzJyB8IHRyYW5zbGF0ZX19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJjb21wdC10YWJsZSB3aWR0aC0xLTEgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJwYWRkaW5nLXhzIHdzLW1hdC1ibGFjazYwLXRleHQgbWF0LWJvZHktMVwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jeScgfCB0cmFuc2xhdGV9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInBhZGRpbmcteHMgd3MtbWF0LWJsYWNrNjAtdGV4dCBtYXQtYm9keS0xXCI+e3snYXBwdG9jc2luZ2xlcGFnZS50eXBlJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgY29tcCBvZiBjb21wZXRlbmNpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInBhZGRpbmcteHMgbWF0LWJvZHktMVwiPnt7Y29tcC5jb21wZXRlbmN5VHlwZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3NlY3Rpb24+IC0tPlxuICAgICAgICAgICAgPHNlY3Rpb24gaWQ9XCJyYXRpbmdcIiAqbmdJZj1cIiFmb3JQcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsdWlkLXdpZHRoIGNvbnRhY3RzLWNvbnRhaW5lciBtYi0xMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10b29sYmFyIGNvbnRhY3RzLWhlYWRcIj57eydhcHB0b2NzaW5nbGVwYWdlLnJhdGluZ3NSZXZpZXdzJyB8IHRyYW5zbGF0ZX19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHdzLXdpZGdldC1yYXRpbmctc3VtbWFyeSBbcmF0aW5nU3VtbWFyeV09XCJyYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkXCI+PC93cy13aWRnZXQtcmF0aW5nLXN1bW1hcnk+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2VhcmNoRm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHRvcF9zZWFyY2hfYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgc2VhcmNoX2JveF9pbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGZsZXgtY29sdW1uIG1hcmdpbi1maXggc2VhcmNoIHNlYXJjaF9ib3hfbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWZvcm0gc2VhcmNoX2Zvcm0gbWFyZ2luLXJpZ2h0LXNcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtci0yXCI+c2VhcmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgbmFtZT1cInNlYXJjaEtleVwiICNzZWFyY2hLZXkgY2xhc3M9XCJtbC0yXCIgaTE4LWFyaWEtbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1wbGFjZWhvbGRlcj1cInNlYXJjaFwiIFtwbGFjZWhvbGRlcl09XCInYXBwdG9jc2luZ2xlcGFnZS5zZWFyY2gnIHwgdHJhbnNsYXRlXCIgbWF0SW5wdXQgIG1heGxlbmd0aD1cIjUwXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIChpbnB1dCk9XCJ1cGRhdGVRdWVyeShzZWFyY2hLZXkudmFsdWUpXCIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1fZHJvcGRvd25fYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgZmxleC13cmFwIHNlY3Rpb24taW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgI3NvcnRCeVNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzb3J0QnlDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLXBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyPVwiU29ydCBieVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIndG9wUmV2aWV3cydcIiBzbGVjdGVkPnt7J2FwcHRvY3NpbmdsZXBhZ2UudG9wUmV2aWV3cycgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiJ2xhdGVzdFJldmlld3MnXCI+e3snYXBwdG9jc2luZ2xlcGFnZS5sYXRlc3RSZXZpZXdzJyB8IHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJyYXRpbmctY29tbWVudHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgcmF0aW5nUmV2aWV3c3xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVGaWx0ZXJWMzp7ICd1c2VyX2lkJzogc2VhcmNoS2V5LnZhbHVlLCAncmV2aWV3Jzogc2VhcmNoS2V5LnZhbHVlIH0gOiBmYWxzZSB8XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGljZTowOnJhdGluZ1ZpZXdDb3VudDsgbGV0IGk9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNhcmQtcmF0aW5nLWNvbW1lbnQgW3Jldmlld109XCJjXCI+PC93cy13aWRnZXQtY2FyZC1yYXRpbmctY29tbWVudD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYi0yIG10LTggd3MtbWF0LWFjY2VudC10ZXh0IHZpZXctYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJhdGluZ1Jldmlld3M/Lmxlbmd0aCA+IDMgJiYgcmF0aW5nVmlld0NvdW50IDw9MyAmJiBpPj0yICYmIGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbWF0LWJ1dHRvbiBjbGFzcz1cInBhZGRpbmctdG9wLXhzIHBhZGRpbmctYm90dG9tLXhzIHctZnVsbCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0FMTFJldmlld3MocmF0aW5nUmV2aWV3cz8ubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gPlNFRSBBTEwge3tyYXRpbmdSZXZpZXdzPy5sZW5ndGh9fSBSRVZJRVdTPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1iLTIgbXQtOCB3cy1tYXQtYWNjZW50LXRleHQgdmlldy1hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmF0aW5nUmV2aWV3cz8ubGVuZ3RoID4gMyAmJiByYXRpbmdWaWV3Q291bnQgPiAzICYmIGk+PTIgJiYgbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtYnV0dG9uIGNsYXNzPVwicGFkZGluZy10b3AteHMgcGFkZGluZy1ib3R0b20teHMgdy1mdWxsIFwiIChjbGljayk9XCJzaG93QUxMUmV2aWV3cygzKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gPlNFRSBMRVNTIFJFVklFV1M8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhdGluZy1jb21tZW50c1wiICpuZ0lmPVwicmF0aW5nUmV2aWV3c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpbmZpbml0ZVNjcm9sbFxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCIxNTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsQ29udGFpbmVyXT1cIicucmF0aW5nLWNvbW1lbnRzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvbVJvb3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzY3JvbGxlZCk9XCJsb2FkTW9yZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiByYXRpbmdSZXZpZXdzfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVGaWx0ZXJWMzp7ICdmaXJzdE5hbWUnOiBzZWFyY2hLZXkudmFsdWUsICdyZXZpZXcnOiBzZWFyY2hLZXkudmFsdWUgfSA6IGZhbHNlOyBsZXQgaT0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNhcmQtcmF0aW5nLWNvbW1lbnQgW3Jldmlld109XCJhdXRoUmVwbGllc1tjLnVzZXJJZF1cIiBbY29udGVudGlkXT1cImNvbnRlbnQ/LmlkZW50aWZpZXJcIj48L3dzLXdpZGdldC1jYXJkLXJhdGluZy1jb21tZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGlzcGxheUxvYWRlclwiIGNsYXNzPVwibXQtNSBwci00IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHNwaW5uZXItYm9yZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCIzMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCAqbmdJZj1cIihyYXRpbmdSZXZpZXdzIHwgcGlwZUZpbHRlclYzOnsgJ2ZpcnN0TmFtZSc6IHNlYXJjaEtleS52YWx1ZSwgJ3Jldmlldyc6IHNlYXJjaEtleS52YWx1ZSB9IDogZmFsc2UpPy5sZW5ndGggPD0wXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoZGlzcGxheUxvYWRlciAgPT09IGZhbHNlKVwiIGNsYXNzPVwidy1mdWxsIHRleHQtbGVmdCB3cy1tYXQtYmxhY2s2MC10ZXh0IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snYXBwdG9jc2luZ2xlcGFnZS5ub1Jldmlld3NGb3VuZCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbWF0LXRhYj5cbiAgICA8bWF0LXRhYiBsYWJlbD1cInt7J2FwcHRvY3NpbmdsZXBhZ2UuY29udGVudCcgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8d3MtYXBwLWFwcC10b2MtY29udGVudHMgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiIFtjb250ZW50XT1cImNvbnRlbnRcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvd3MtYXBwLWFwcC10b2MtY29udGVudHM+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtdGFiPlxuICAgIDxtYXQtdGFiIGxhYmVsPVwie3snYXBwdG9jc2luZ2xlcGFnZS5zZXNzaW9ucycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aCAmJiAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8d3MtYXBwLWFwcC10b2Mtc2Vzc2lvbnMgW2JhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiICBbY29udGVudF09XCJjb250ZW50XCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb25maWddPVwidG9jQ29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvd3MtYXBwLWFwcC10b2Mtc2Vzc2lvbnM+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtdGFiPlxuICAgIDxtYXQtdGFiIGxhYmVsPVwie3snYXBwdG9jc2luZ2xlcGFnZS5kaXNjdXNzaW9uJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhZm9yUHJldmlld1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwiZGlzY3Vzc2lvbi1mb3J1bVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aCB0b2MtZGlzY3Vzc2lvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8d3MtYXBwLXRvYy1kaXNjdXNzaW9uIFtjb250ZW50XT1cImNvbnRlbnRcIiBjbGFzcz1cImRpc2N1c3Npb25cIj48L3dzLWFwcC10b2MtZGlzY3Vzc2lvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxhbGwtZGlzY3Vzc2lvbi13aWRnZXQgc3R5bGU9JyB3aWR0aDogMTAwJTsnIFtjb25maWddPVwiZGlzY3Vzc2lvbkNvbmZpZ1wiPjwvYWxsLWRpc2N1c3Npb24td2lkZ2V0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbWF0LXRhYj5cbjwvbWF0LXRhYi1ncm91cD5cblxuPCEtLSA8c2VjdGlvbiBpZD1cImNvaG9ydHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggdG9jLWRpc2N1c3Npb24tY29udGFpbmVyXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWNvaG9ydHMgW2NvbnRlbnRdPVwiY29udGVudFwiIGNsYXNzPVwiY29ob3J0c1wiPjwvd3MtYXBwLXRvYy1jb2hvcnRzPlxuICAgIDwvZGl2PlxuPC9zZWN0aW9uPiAtLT5cblxuPG5nLXRlbXBsYXRlICN1bml0Q29ob3J0TmV3MSBsZXQtdXNlcj1cInVzZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidW5pdC1jb2hvcnQgc206cHItOCBtZDpwci0xMFwiPlxuICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXNcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwidXNlci5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICBbbmFtZV09XCJnZXRVc2VyRnVsbE5hbWUodXNlcilcIj5cbiAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLWxlZnQtbFwiPlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZ29Ub1VzZXJQcm9maWxlKHVzZXIpXCIgW25nQ2xhc3NdPVwieydjdXJzb3ItcG9pbnRlcic6IGVuYWJsZVBlb3BsZVNlYXJjaH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwid2lkdGgtZXhwYW5kIHBhZGRpbmctbGVmdC14c1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtYm9keS0xIGNvaG9ydHMtbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICB7IGZpcnN0TmFtZTogdXNlci5maXJzdF9uYW1lLCBlbWFpbDogdXNlci5lbWFpbCB9XG4gICAgICAgICAgICAgICAgICAgIHwgcGlwZU5hbWVUcmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hdC1ib2R5LTIgd3MtbWF0LWJsYWNrNjAtdGV4dFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3VuaXRDb2hvcnROZXcgbGV0LXVzZXI9XCJ1c2VyXCI+XG4gICAgPGRpdiBjbGFzcz1cInVuaXQtY29ob3J0IHNtOnByLTggbWQ6cHItMTBcIj5cbiAgICAgICAgPCEtLSA8d3Mtd2lkZ2V0LXVzZXItaW1hZ2UgY2xhc3M9XCJ1c2VyLWltYWdlXCIgW2ltYWdlVHlwZV09XCIndXNlci1waG90bydcIiBbdXNlck5hbWVdPVwiZ2V0VXNlckZ1bGxOYW1lKHVzZXIpXCJcbiAgICAgICAgW2ltYWdlU2l6ZV09XCInc21hbGwnXCIgW2VtYWlsXT1cInVzZXIuZW1haWxcIiBbaW1hZ2VVcmxdPVwidXNlci5waG90byB8fCAnJ1wiPjwvd3Mtd2lkZ2V0LXVzZXItaW1hZ2U+IC0tPlxuICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXNcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwidXNlci5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICBbbmFtZV09XCJnZXRVc2VyRnVsbE5hbWUodXNlcilcIj5cbiAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLWxlZnQtbFwiPlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZ29Ub1VzZXJQcm9maWxlKHVzZXIpXCIgW25nQ2xhc3NdPVwieydjdXJzb3ItcG9pbnRlcic6IGVuYWJsZVBlb3BsZVNlYXJjaH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwid2lkdGgtZXhwYW5kIHBhZGRpbmctbGVmdC14c1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm1hdC1ib2R5LTEgY29ob3J0cy1uYW1lXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgeyBmaXJzdE5hbWU6IHVzZXIuZmlyc3RfbmFtZSwgbGFzdE5hbWU6IHVzZXIubGFzdF9uYW1lLCBlbWFpbDogdXNlci5lbWFpbCB9XG4gICAgICAgICAgICAgICAgICAgIHwgcGlwZU5hbWVUcmFuc2Zvcm1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtY29ubmVjdGlvbi1uYW1lXG4gICAgICAgICAgICAgICAgICAgIFtob3ZlclVzZXJdPVwie2ZpcnN0TmFtZTogdXNlci5maXJzdF9uYW1lLCBpZDp1c2VyLnVpZCxkZXNpZ25hdGlvbjogdXNlci5kZXNpZ25hdGlvbixkZXBhcnRtZW50OnVzZXIuZGVwYXJ0bWVudH1cIj5cbiAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1jb25uZWN0aW9uLW5hbWU+XG4gICAgICAgICAgICAgICAgPCEtLSB7e3VzZXIgfCBqc29ufX0gLS0+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXQtYm9keS0yIHdzLW1hdC1ibGFjazYwLXRleHRcIj57e3VzZXIuZGVzaWduYXRpb259fTwvcD5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtYXQtY2FwdGlvbiBjb2hvcnRzLWRlc2NcIj57eyB1c2VyLmRlc2MgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZHRoLWF1dG8gdXNlci1hY3Rpb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LWJ0bi1tYWlsLXVzZXIgW3dpZGdldERhdGFdPVwieyBjb250ZW50OiBjb250ZW50LCBlbWFpbHM6IFt1c2VyLmVtYWlsXSwgdXNlcjogdXNlciB9XCI+XG4gICAgICAgICAgICA8L3dzLXdpZGdldC1idG4tbWFpbC11c2VyPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1idG4tY2FsbCAqbmdJZj1cInVzZXIucGhvbmVfTm8gIT09ICcwJ1wiIFt3aWRnZXREYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgdXNlck5hbWU6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0TmFtZTogdXNlci5maXJzdF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5hbWU6IHVzZXIubGFzdF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IHVzZXIuZW1haWxcbiAgICAgICAgICAgICAgICAgICAgfSB8IHBpcGVOYW1lVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICB1c2VyUGhvbmU6IHVzZXIucGhvbmVfTm9cbiAgICAgICAgICAgICAgICB9XCI+PC93cy13aWRnZXQtYnRuLWNhbGw+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
1
+ import { Component, Input, Inject, Optional } from '@angular/core';
2
+ import { WsEvents } from '@sunbird-cb/utils-v2';
3
+ import { NsContent } from '../../_services/widget-content.model';
4
+ import { Subject } from 'rxjs';
5
+ import { share, debounceTime, switchMap, takeUntil } from 'rxjs/operators';
6
+ import { NsCohorts } from '../../models/app-toc.model';
7
+ import { CreateBatchDialogComponent } from '../create-batch-dialog/create-batch-dialog.component';
8
+ // import { IdiscussionConfig } from '@project-sunbird/discussions-ui-v8'
9
+ // tslint:disable-next-line
10
+ import _ from 'lodash';
11
+ import { UntypedFormGroup, UntypedFormControl } from '@angular/forms';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/router";
14
+ import * as i2 from "../../services/app-toc.service";
15
+ import * as i3 from "@angular/platform-browser";
16
+ import * as i4 from "../../services/access-control.service";
17
+ import * as i5 from "@sunbird-cb/utils-v2";
18
+ import * as i6 from "../../services/title-tag.service";
19
+ import * as i7 from "@angular/material/legacy-dialog";
20
+ import * as i8 from "../../services/mobile-apps.service";
21
+ import * as i9 from "../../_collection/_common/connection-hover-card/connection-hover.servive";
22
+ import * as i10 from "../../_services/rating.service";
23
+ import * as i11 from "@ngx-translate/core";
24
+ import * as i12 from "@angular/common";
25
+ import * as i13 from "@angular/forms";
26
+ import * as i14 from "@angular/material/icon";
27
+ import * as i15 from "@angular/material/legacy-form-field";
28
+ import * as i16 from "@angular/material/legacy-input";
29
+ import * as i17 from "@angular/material/legacy-card";
30
+ import * as i18 from "@angular/material/legacy-tabs";
31
+ import * as i19 from "@angular/material/legacy-progress-spinner";
32
+ import * as i20 from "@angular/material/legacy-select";
33
+ import * as i21 from "@angular/material/legacy-core";
34
+ import * as i22 from "../../_collection/_common/avatar-photo/avatar-photo.component";
35
+ import * as i23 from "../../_collection/_common/connection-name/connection-name.component";
36
+ import * as i24 from "../../_collection/card-rating-comment/card-rating-comment.component";
37
+ import * as i25 from "ngx-infinite-scroll";
38
+ import * as i26 from "../app-toc-sessions/app-toc-sessions.component";
39
+ export class AppTocSinglePageComponent {
40
+ constructor(router, route, tocSharedSvc, domSanitizer, authAccessControlSvc,
41
+ // private dialog: MatDialog,
42
+ logger, titleTagService, createBatchDialog, mobileAppsSvc, configSvc, connectionHoverService, eventSvc, ratingSvc, translate, langtranslations, environment) {
43
+ this.router = router;
44
+ this.route = route;
45
+ this.tocSharedSvc = tocSharedSvc;
46
+ this.domSanitizer = domSanitizer;
47
+ this.authAccessControlSvc = authAccessControlSvc;
48
+ this.logger = logger;
49
+ this.titleTagService = titleTagService;
50
+ this.createBatchDialog = createBatchDialog;
51
+ this.mobileAppsSvc = mobileAppsSvc;
52
+ this.configSvc = configSvc;
53
+ this.connectionHoverService = connectionHoverService;
54
+ this.eventSvc = eventSvc;
55
+ this.ratingSvc = ratingSvc;
56
+ this.translate = translate;
57
+ this.langtranslations = langtranslations;
58
+ this.environment = environment;
59
+ this.contentTypes = NsContent.EContentTypes;
60
+ this.primaryCategory = NsContent.EPrimaryCategory;
61
+ this.showMoreGlance = false;
62
+ this.askAuthorEnabled = true;
63
+ this.trainingLHubEnabled = false;
64
+ this.body = null;
65
+ this.viewMoreRelatedTopics = false;
66
+ this.hasTocStructure = false;
67
+ this.tocStructure = null;
68
+ this.contentParents = {};
69
+ this.objKeys = Object.keys;
70
+ this.activeFragment = this.route.fragment.pipe(share());
71
+ this.content = null;
72
+ this.routeSubscription = null;
73
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
74
+ this.resumeData = null;
75
+ this.batchData = null;
76
+ this.tocConfig = null;
77
+ this.routeQuerySubscription = null;
78
+ this.isNotEditor = true;
79
+ this.cohortResults = {};
80
+ this.cohortTypesEnum = NsCohorts.ECohortTypes;
81
+ this.discussionConfig = {};
82
+ this.batchDataLoaded = false;
83
+ this.unsubscribe = new Subject();
84
+ // TODO: TO be removed important
85
+ this.progress = 50;
86
+ this.ratingReviews = [];
87
+ this.ratingViewCount = 3;
88
+ this.ratingViewCountDefault = 3;
89
+ this.lookupLimit = 3;
90
+ this.sortReviewValues = ['topReviews', 'latestReviews'];
91
+ this.previousFilter = this.sortReviewValues[0];
92
+ this.reviewPage = 1;
93
+ this.reviewDefaultLimit = 2;
94
+ this.disableLoadMore = false;
95
+ this.displayLoader = false;
96
+ this.tabSelectedIndex = 0;
97
+ this.updateReviewsSubscription = null;
98
+ this.lookupLoading = true;
99
+ // configSvc: any
100
+ this.compentencyKey = '';
101
+ if (localStorage.getItem('websiteLanguage')) {
102
+ this.translate.setDefaultLang('en');
103
+ let lang = JSON.stringify(localStorage.getItem('websiteLanguage'));
104
+ lang = lang.replace(/\"/g, '');
105
+ this.translate.use(lang);
106
+ }
107
+ if (this.configSvc.restrictedFeatures) {
108
+ this.askAuthorEnabled = !this.configSvc.restrictedFeatures.has('askAuthor');
109
+ this.trainingLHubEnabled = !this.configSvc.restrictedFeatures.has('trainingLHub');
110
+ }
111
+ // if (this.route && this.route.parent) {
112
+ // this.configSvc = this.route.parent.snapshot.data.profileData
113
+ // }
114
+ // this.route.data.subscribe(data => {
115
+ // this.askAuthorEnabled = !data.restrictedData.data.has('askAuthor')
116
+ // this.trainingLHubEnabled = !data.restrictedData.data.has('trainingLHub')
117
+ // })
118
+ this.discussionConfig = {
119
+ // menuOptions: [{ route: 'categories', enable: true }],
120
+ userName: (this.configSvc.nodebbUserProfile && this.configSvc.nodebbUserProfile.username) || '',
121
+ };
122
+ }
123
+ ngOnInit() {
124
+ this.compentencyKey = this.environment?.compentencyVersionKey || '';
125
+ this.batchSubscription = this.tocSharedSvc.getSelectedBatch.subscribe(batchData => {
126
+ this.selectedBatchData = batchData;
127
+ });
128
+ this.searchForm = new UntypedFormGroup({
129
+ sortByControl: new UntypedFormControl(this.sortReviewValues[0]),
130
+ searchKey: new UntypedFormControl(''),
131
+ });
132
+ // if (this.route && this.route.parent) {
133
+ // this.routeSubscription = this.route.parent.data.subscribe((data: Data) => {
134
+ // this.initData(data)
135
+ // this.tocConfig = data.pageData.data
136
+ // })
137
+ // }
138
+ if (this.initialrouteData) {
139
+ this.initData(this.initialrouteData);
140
+ this.tocConfig = this.initialrouteData.pageData.data;
141
+ }
142
+ if (this.configSvc && this.configSvc.userProfile && this.configSvc.userProfile.userId) {
143
+ this.loggedInUserId = this.configSvc.userProfile.userId;
144
+ }
145
+ // check if the user has role editor,
146
+ if (this.configSvc && this.configSvc.userRoles &&
147
+ this.configSvc.userRoles.has('editor')) {
148
+ // if editor, create batch button will be shown
149
+ this.isNotEditor = false;
150
+ }
151
+ this.searchForm.valueChanges
152
+ .pipe(debounceTime(500), switchMap(async (formValue) => {
153
+ // tslint:disable-next-line: no-console
154
+ // console.log('formValue :: ', formValue)
155
+ if (this.previousFilter !== formValue.sortByControl) {
156
+ this.previousFilter = formValue.sortByControl;
157
+ this.sortReviews(formValue.sortByControl);
158
+ }
159
+ }), takeUntil(this.unsubscribe)).subscribe();
160
+ this.updateReviewsSubscription = this.tocSharedSvc.updateReviewsObservable.subscribe((value) => {
161
+ if (value) {
162
+ this.updateReviews();
163
+ }
164
+ });
165
+ }
166
+ ngOnChanges() {
167
+ if (this.batchData) {
168
+ // setting tab to focus on "CONTENT tab" if already user is enrolled
169
+ this.tabSelectedIndex = 1;
170
+ }
171
+ }
172
+ detailUrl(data) {
173
+ // let locationOrigin = environment.sitePath ? `https://${environment.sitePath}` : location.origin
174
+ let locationOrigin = location.origin;
175
+ if (this.configSvc.activeLocale && this.configSvc.activeLocale.path) {
176
+ locationOrigin += `/${this.configSvc.activeLocale.path}`;
177
+ }
178
+ switch (data.primaryCategory) {
179
+ case NsContent.EPrimaryCategory.CHANNEL:
180
+ return `${locationOrigin}${data.artifactUrl}`;
181
+ case NsContent.EPrimaryCategory.KNOWLEDGE_BOARD:
182
+ return `${locationOrigin}/app/knowledge-board/${data.identifier}`;
183
+ case NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT:
184
+ return `${locationOrigin}/app/toc/${data.identifier}/overview?primaryCategory=${data.primaryCategory}`;
185
+ default:
186
+ return `${locationOrigin}/app/toc/${data.identifier}/overview?primaryCategory=${data.primaryCategory}`;
187
+ }
188
+ }
189
+ ngOnDestroy() {
190
+ if (this.routeSubscription) {
191
+ this.routeSubscription.unsubscribe();
192
+ }
193
+ if (this.routeQuerySubscription) {
194
+ this.routeQuerySubscription.unsubscribe();
195
+ }
196
+ if (this.updateReviewsSubscription) {
197
+ this.updateReviewsSubscription.unsubscribe();
198
+ }
199
+ if (this.batchSubscription) {
200
+ this.batchSubscription.unsubscribe();
201
+ }
202
+ }
203
+ get showSubtitleOnBanner() {
204
+ return this.tocSharedSvc.subtitleOnBanners;
205
+ }
206
+ get showDescription() {
207
+ if (this.content && !this.content.body) {
208
+ return true;
209
+ }
210
+ return this.tocSharedSvc.showDescription;
211
+ }
212
+ get isResource() {
213
+ if (this.content) {
214
+ const isResource = this.content.primaryCategory === NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT ||
215
+ this.content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE || !this.content.children.length;
216
+ if (isResource) {
217
+ this.mobileAppsSvc.sendViewerData(this.content);
218
+ }
219
+ return isResource;
220
+ }
221
+ return false;
222
+ }
223
+ setSocialMediaMetaTags(data) {
224
+ this.titleTagService.setSocialMediaTags(this.detailUrl(data), data.name, data.description, data.appIcon);
225
+ }
226
+ initData(data) {
227
+ const initData = this.tocSharedSvc.initData(data);
228
+ this.content = initData.content;
229
+ if (this.content && this.content.identifier) {
230
+ this.fetchRatingSummary();
231
+ }
232
+ if (this.content && this.content[this.compentencyKey]) {
233
+ this.content[this.compentencyKey] = this.content[this.compentencyKey];
234
+ this.competencies = this.content[this.compentencyKey] || [];
235
+ }
236
+ this.discussionConfig.contextIdArr = (this.content) ? [this.content.identifier] : [];
237
+ if (this.content) {
238
+ this.discussionConfig.categoryObj = {
239
+ category: {
240
+ name: this.content.name,
241
+ pid: '',
242
+ description: this.content.description,
243
+ context: [
244
+ {
245
+ type: 'course',
246
+ identifier: this.content.identifier,
247
+ },
248
+ ],
249
+ },
250
+ };
251
+ }
252
+ this.discussionConfig.contextType = 'course';
253
+ this.setSocialMediaMetaTags(this.content);
254
+ this.body = this.domSanitizer.bypassSecurityTrustHtml(this.content && this.content.body
255
+ ? this.forPreview
256
+ ? this.authAccessControlSvc.proxyToAuthoringUrl(this.content.body)
257
+ : this.content.body
258
+ : '');
259
+ this.contentParents = {};
260
+ this.resetAndFetchTocStructure();
261
+ // this.getTrainingCount()
262
+ // this.getContentParent()
263
+ // if (this.content && this.content.identifier) {
264
+ // this.fetchCohorts(this.cohortTypesEnum.ACTIVE_USERS, this.content.identifier)
265
+ // this.fetchCohorts(this.cohortTypesEnum.AUTHORS, this.content.identifier)
266
+ // }
267
+ }
268
+ sanitize(data) {
269
+ return this.domSanitizer.bypassSecurityTrustHtml(data);
270
+ }
271
+ getContentParent() {
272
+ if (this.content) {
273
+ const contentParentReq = {
274
+ fields: ['contentType', 'name'],
275
+ };
276
+ this.tocSharedSvc
277
+ .fetchContentParent(this.content.identifier, contentParentReq, this.forPreview)
278
+ .subscribe(res => {
279
+ this.parseContentParent(res);
280
+ }, _err => {
281
+ this.contentParents = {};
282
+ });
283
+ }
284
+ }
285
+ getCompetencies(competencies) {
286
+ const competenciesArray = JSON.parse(competencies);
287
+ const competencyStringArray = [];
288
+ competenciesArray.map((c) => {
289
+ // if (i < (competenciesArray.length -1)) {
290
+ // competencyString.push(`${c.name}, `)
291
+ // } else {
292
+ // competencyString.push(c.name)
293
+ // }
294
+ competencyStringArray.push(c.name);
295
+ });
296
+ return competencyStringArray;
297
+ }
298
+ parseContentParent(content) {
299
+ content.collections.forEach(collection => {
300
+ if (!this.contentParents.hasOwnProperty(collection.contentType)) {
301
+ this.contentParents[collection.contentType] = [];
302
+ }
303
+ this.contentParents[collection.contentType].push(collection);
304
+ this.parseContentParent(collection);
305
+ });
306
+ }
307
+ resetAndFetchTocStructure() {
308
+ this.tocStructure = {
309
+ assessment: 0,
310
+ finalTest: 0,
311
+ course: 0,
312
+ handsOn: 0,
313
+ interactiveVideo: 0,
314
+ learningModule: 0,
315
+ other: 0,
316
+ pdf: 0,
317
+ survey: 0,
318
+ podcast: 0,
319
+ practiceTest: 0,
320
+ quiz: 0,
321
+ video: 0,
322
+ webModule: 0,
323
+ webPage: 0,
324
+ youtube: 0,
325
+ interactivecontent: 0,
326
+ offlineSession: 0,
327
+ };
328
+ if (this.content) {
329
+ this.hasTocStructure = false;
330
+ this.tocStructure.learningModule = this.content.primaryCategory === this.primaryCategory.MODULE ? -1 : 0;
331
+ this.tocStructure.course = this.content.primaryCategory === this.primaryCategory.COURSE ? -1 : 0;
332
+ this.tocStructure = this.tocSharedSvc.getTocStructure(this.content, this.tocStructure);
333
+ for (const progType in this.tocStructure) {
334
+ if (this.tocStructure[progType] > 0) {
335
+ this.hasTocStructure = true;
336
+ break;
337
+ }
338
+ }
339
+ }
340
+ }
341
+ // For Learning Hub trainings
342
+ // private getTrainingCount() {
343
+ // if (
344
+ // this.trainingLHubEnabled &&
345
+ // this.content &&
346
+ // this.trainingSvc.isValidTrainingContent(this.content) &&
347
+ // !this.forPreview
348
+ // ) {
349
+ // this.trainingLHubCount$ = this.trainingApi
350
+ // .getTrainingCount(this.content.identifier)
351
+ // .pipe(retry(2))
352
+ // }
353
+ // }
354
+ // openQueryMailDialog(content: any, data: any) {
355
+ // const emailArray = []
356
+ // emailArray.push(data.email)
357
+ // const dialogdata = {
358
+ // content,
359
+ // user: data,
360
+ // emails: emailArray,
361
+ // }
362
+ // dialogdata.user.isAuthor = true
363
+ // this.dialog.open<BtnMailUserDialogComponent, IBtnMailUser>(
364
+ // BtnMailUserDialogComponent,
365
+ // {
366
+ // // width: '50vw',
367
+ // minWidth: '40vw',
368
+ // maxWidth: '80vw',
369
+ // data: dialogdata,
370
+ // }
371
+ // )
372
+ // }
373
+ openDialog(content) {
374
+ const dialogRef = this.createBatchDialog.open(CreateBatchDialogComponent, {
375
+ // height: '400px',
376
+ width: '600px',
377
+ data: { content },
378
+ });
379
+ // dialogRef.componentInstance.xyz = this.configSvc
380
+ dialogRef.afterClosed().subscribe((_result) => {
381
+ if (!this.batchId) {
382
+ this.tocSharedSvc.updateBatchData();
383
+ }
384
+ });
385
+ }
386
+ parseJsonData(s) {
387
+ try {
388
+ const parsedString = JSON.parse(s);
389
+ return parsedString;
390
+ }
391
+ catch {
392
+ return [];
393
+ }
394
+ }
395
+ // cohorts & learners
396
+ get enablePeopleSearch() {
397
+ if (this.configSvc.restrictedFeatures) {
398
+ return !this.configSvc.restrictedFeatures.has('peopleSearch');
399
+ }
400
+ return false;
401
+ }
402
+ goToUserProfile(user) {
403
+ if (this.enablePeopleSearch) {
404
+ this.router.navigate(['/app/person-profile', user.wid]);
405
+ // this.router.navigate(['/app/person-profile'], { queryParams: { emailId: user.email } })
406
+ }
407
+ }
408
+ getUserFullName(user) {
409
+ // this.getHoverUser(user: any)
410
+ if (user && user.first_name && user.last_name) {
411
+ return `${user.first_name.trim()} ${user.last_name.trim()}`;
412
+ }
413
+ return '';
414
+ }
415
+ getHoverUser(user) {
416
+ const userId = user.wid;
417
+ this.connectionHoverService.fetchProfile(userId).subscribe((res) => {
418
+ if (res.profileDetails !== null) {
419
+ this.howerUser = res.profileDetails;
420
+ }
421
+ else {
422
+ this.howerUser = res || {};
423
+ }
424
+ return this.howerUser;
425
+ });
426
+ }
427
+ fetchCohorts(cohortType, contentID) {
428
+ if (!this.cohortResults[cohortType] && !this.forPreview) {
429
+ this.tocSharedSvc.fetchContentCohorts(cohortType, contentID).subscribe((data) => {
430
+ this.cohortResults[cohortType] = {
431
+ contents: _.map(data, d => {
432
+ return {
433
+ first_name: _.get(d, 'first_name'),
434
+ last_name: _.get(d, 'last_name'),
435
+ department: _.get(d, 'department'),
436
+ designation: _.get(d, 'designation'),
437
+ email: _.get(d, 'email'),
438
+ desc: _.get(d, 'desc'),
439
+ uid: _.get(d, 'user_id'),
440
+ last_ts: _.get(d, 'last_ts'),
441
+ phone_No: _.get(d, 'phone_No'),
442
+ city: _.get(d, 'city'),
443
+ userLocation: _.get(d, 'userLocation'),
444
+ };
445
+ }) || [],
446
+ hasError: false,
447
+ };
448
+ }, () => {
449
+ this.cohortResults[cohortType] = {
450
+ contents: [],
451
+ hasError: true,
452
+ };
453
+ });
454
+ }
455
+ else if (this.cohortResults[cohortType] && !this.forPreview) {
456
+ return;
457
+ }
458
+ else {
459
+ this.cohortResults[cohortType] = {
460
+ contents: [],
461
+ hasError: false,
462
+ };
463
+ }
464
+ }
465
+ fetchRatingSummary() {
466
+ this.displayLoader = true;
467
+ if (!this.forPreview && this.content && this.content.identifier && this.content.primaryCategory) {
468
+ this.ratingSvc.getRatingSummary(this.content.identifier, this.content.primaryCategory).subscribe((res) => {
469
+ this.displayLoader = false;
470
+ if (res && res.result && res.result.response) {
471
+ this.ratingSummary = res.result.response;
472
+ }
473
+ // TODO: To be removed
474
+ // this.hardcodeData()
475
+ this.ratingSummaryProcessed = this.processRatingSummary();
476
+ }, (err) => {
477
+ this.displayLoader = false;
478
+ this.logger.error('USER RATING FETCH ERROR >', err);
479
+ // TODO: To be removed
480
+ // this.hardcodeData()
481
+ // this.ratingSummaryProcessed = this.processRatingSummary()
482
+ });
483
+ }
484
+ }
485
+ getAuthorReply(identifier, primaryCategory, userIds) {
486
+ const request = {
487
+ request: {
488
+ activityId: identifier,
489
+ activityType: primaryCategory,
490
+ userId: userIds,
491
+ },
492
+ };
493
+ return this.ratingSvc.getRatingReply(request).subscribe((res) => {
494
+ this.displayLoader = false;
495
+ if (res && res.result && res.result.content) {
496
+ const reatingAuthReplay = res.result.content;
497
+ _.forEach(reatingAuthReplay, value => {
498
+ if (this.authReplies[value.userId]) {
499
+ this.authReplies[value.userId]['comment'] = value.comment;
500
+ this.authReplies[value.userId]['userId'] = value.userId;
501
+ }
502
+ });
503
+ }
504
+ return this.authReplies;
505
+ // TODO: To be removed
506
+ // this.hardcodeData()
507
+ // this.ratingSummaryProcessed = this.processRatingSummary()
508
+ }, (err) => {
509
+ this.displayLoader = false;
510
+ this.logger.error('USER RATING FETCH ERROR >', err);
511
+ // TODO: To be removed
512
+ // this.hardcodeData()
513
+ // this.ratingSummaryProcessed = this.processRatingSummary()
514
+ });
515
+ }
516
+ get checkForFacilitators() {
517
+ const facilitators = [];
518
+ if (this.selectedBatchData &&
519
+ this.selectedBatchData.content[0] &&
520
+ this.selectedBatchData.content[0].batchAttributes &&
521
+ this.selectedBatchData.content[0].batchAttributes.sessionDetails_v2 &&
522
+ this.selectedBatchData.content[0].batchAttributes.sessionDetails_v2.length) {
523
+ this.selectedBatchData.content[0].batchAttributes.sessionDetails_v2.map((sessionDetails) => {
524
+ sessionDetails.facilatorDetails.map((facilitator) => [
525
+ facilitators.push(facilitator),
526
+ ]);
527
+ });
528
+ }
529
+ return facilitators;
530
+ }
531
+ fetchRatingLookup() {
532
+ this.displayLoader = true;
533
+ if (this.content && this.content.identifier && this.content.primaryCategory) {
534
+ const req = {
535
+ activityId: this.content.identifier,
536
+ activityType: this.content.primaryCategory,
537
+ // this field can be enabled if specific ratings have to be looked up
538
+ // rating: 0,
539
+ limit: this.lookupLimit,
540
+ ...((this.lastLookUp && this.lastLookUp.updatedOnUUID) ? { updateOn: (this.lastLookUp && this.lastLookUp.updatedOnUUID) } : null),
541
+ };
542
+ this.ratingSvc.getRatingLookup(req).subscribe((res) => {
543
+ this.displayLoader = false;
544
+ // // console.log('Rating summary res ', res)
545
+ if (res && res.result && res.result.response) {
546
+ if (this.reviewPage > 1) {
547
+ res.result.response.map((item) => {
548
+ if (!this.ratingLookup.find((o) => o.updatedOnUUID === item.updatedOnUUID)) {
549
+ this.ratingLookup.push(item);
550
+ }
551
+ });
552
+ }
553
+ else {
554
+ this.ratingLookup = res.result.response;
555
+ }
556
+ }
557
+ this.processRatingLookup(res.result.response);
558
+ }, (err) => {
559
+ this.displayLoader = false;
560
+ this.logger.error('USER RATING FETCH ERROR >', err);
561
+ });
562
+ }
563
+ }
564
+ showALLReviews(length) {
565
+ this.ratingViewCount = length;
566
+ }
567
+ processRatingSummary() {
568
+ const breakDownArray = [];
569
+ const ratingSummaryPr = {
570
+ breakDown: breakDownArray,
571
+ latest50Reviews: breakDownArray,
572
+ ratingsNumber: breakDownArray,
573
+ total_number_of_ratings: _.get(this.ratingSummary, 'total_number_of_ratings') || 0,
574
+ avgRating: 0,
575
+ };
576
+ const totRatings = _.get(this.ratingSummary, 'sum_of_total_ratings') || 0;
577
+ ratingSummaryPr.breakDown.push({
578
+ percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount1stars'), 1, totRatings),
579
+ key: 1,
580
+ value: _.get(this.ratingSummary, 'totalcount1stars'),
581
+ });
582
+ ratingSummaryPr.breakDown.push({
583
+ percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount2stars'), 2, totRatings),
584
+ key: 2,
585
+ value: _.get(this.ratingSummary, 'totalcount2stars'),
586
+ });
587
+ ratingSummaryPr.breakDown.push({
588
+ percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount3stars'), 3, totRatings),
589
+ key: 3,
590
+ value: _.get(this.ratingSummary, 'totalcount3stars'),
591
+ });
592
+ ratingSummaryPr.breakDown.push({
593
+ percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount4stars'), 4, totRatings),
594
+ key: 4,
595
+ value: _.get(this.ratingSummary, 'totalcount4stars'),
596
+ });
597
+ ratingSummaryPr.breakDown.push({
598
+ percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount5stars'), 5, totRatings),
599
+ key: 5,
600
+ value: _.get(this.ratingSummary, 'totalcount5stars'),
601
+ });
602
+ // tslint:disable-next-line:max-line-length
603
+ // ratingSummaryPr.latest50Reviews = this.ratingSummary && this.ratingSummary.latest50Reviews ? JSON.parse(this.ratingSummary.latest50Reviews) : []
604
+ // // ratingSummaryPr.latest50Reviews = this.ratingSummary.latest50Reviews
605
+ // this.ratingReviews = this.ratingSummary && this.ratingSummary.latest50Reviews ? JSON.parse(this.ratingSummary.latest50Reviews) : []
606
+ // ratingSummaryPr.avgRating = parseFloat(((((totRatings / this.ratingSummary.total_number_of_ratings) * 100) * 5) / 100).toFixed(1))
607
+ if (this.ratingSummary && this.ratingSummary.latest50Reviews) {
608
+ // ratingSummaryPr.latest50Reviews = JSON.parse(this.ratingSummary.latest50Reviews)
609
+ // this.ratingReviews = JSON.parse(this.ratingSummary.latest50Reviews)
610
+ const latest50Reviews = JSON.parse(this.ratingSummary.latest50Reviews);
611
+ const modifiedReviews = _.map(latest50Reviews, rating => {
612
+ rating['userId'] = rating.user_id;
613
+ return rating;
614
+ });
615
+ this.authReplies = [];
616
+ this.authReplies = _.keyBy(latest50Reviews, 'user_id');
617
+ const userIds = _.map(latest50Reviews, 'user_id');
618
+ if (this.content) {
619
+ this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
620
+ }
621
+ ratingSummaryPr.latest50Reviews = modifiedReviews;
622
+ this.ratingReviews = modifiedReviews;
623
+ }
624
+ // rating changes 07 march 23
625
+ // const meanRating = ratingSummaryPr.breakDown.reduce((val, item) => {
626
+ // // console.log('item', item)
627
+ // return val + (item.key * item.value)
628
+ // // tslint:disable-next-line: align
629
+ // }, 0)
630
+ // tslint:disable-next-line:max-line-length
631
+ // ratingSummaryPr.avgRating = this.ratingSummary && this.ratingSummary.total_number_of_ratings ? parseFloat((meanRating / this.ratingSummary.total_number_of_ratings).toFixed(1)) : 0
632
+ if (this.ratingSummary && this.ratingSummary.total_number_of_ratings) {
633
+ // ratingSummaryPr.avgRating = parseFloat((meanRating / this.ratingSummary.total_number_of_ratings).toFixed(1))
634
+ ratingSummaryPr.avgRating =
635
+ parseFloat((this.ratingSummary.sum_of_total_ratings / this.ratingSummary.total_number_of_ratings).toFixed(1));
636
+ }
637
+ if (this.content) {
638
+ this.content.averageRating = ratingSummaryPr.avgRating;
639
+ this.content.totalRating = ratingSummaryPr.total_number_of_ratings;
640
+ }
641
+ // ratingSummaryPr.avgRating = 5
642
+ return ratingSummaryPr;
643
+ }
644
+ processRatingLookup(response) {
645
+ if (response) {
646
+ if (response && response.length < this.lookupLimit) {
647
+ this.disableLoadMore = true;
648
+ }
649
+ else {
650
+ this.disableLoadMore = false;
651
+ this.lookupLoading = false;
652
+ }
653
+ this.lastLookUp = response[response.length - 1];
654
+ this.ratingReviews = this.ratingLookup;
655
+ this.authReplies = [];
656
+ this.authReplies = _.keyBy(this.ratingReviews, 'userId');
657
+ const userIds = _.map(this.ratingReviews, 'userId');
658
+ if (this.content && userIds) {
659
+ this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
660
+ }
661
+ this.ratingReviews = this.ratingReviews.slice();
662
+ }
663
+ }
664
+ countStarsPercentage(value, key, total) {
665
+ if (value && total) {
666
+ return (((value * key) / total) * 100).toFixed(2);
667
+ }
668
+ return 0;
669
+ }
670
+ getRatingIcon(ratingIndex, avg) {
671
+ return this.ratingSvc.getRatingIcon(ratingIndex, avg);
672
+ }
673
+ getRatingIconClass(ratingIndex, avg) {
674
+ return this.ratingSvc.getRatingIconClass(ratingIndex, avg);
675
+ }
676
+ sortReviews(sort) {
677
+ // Reset the counters/ previous values before changing the filter and view
678
+ this.ratingViewCount = this.ratingViewCountDefault;
679
+ this.lastLookUp = '';
680
+ this.ratingReviews = [];
681
+ this.reviewPage = 1;
682
+ this.disableLoadMore = false;
683
+ this.ratingLookup = [];
684
+ if (!this.forPreview) {
685
+ if (sort === this.sortReviewValues[0]) {
686
+ this.fetchRatingSummary();
687
+ }
688
+ else {
689
+ this.fetchRatingLookup();
690
+ }
691
+ }
692
+ }
693
+ // To updated both reviews, and rating summary at once in case of edit scenario
694
+ updateReviews() {
695
+ // Reset the counters/ previous values before changing the filter and view
696
+ this.ratingViewCount = this.ratingViewCountDefault;
697
+ this.lastLookUp = '';
698
+ this.ratingReviews = [];
699
+ this.reviewPage = 1;
700
+ this.disableLoadMore = false;
701
+ this.ratingLookup = [];
702
+ this.fetchRatingSummary();
703
+ if (this.previousFilter !== this.sortReviewValues[0]) {
704
+ this.fetchRatingLookup();
705
+ }
706
+ }
707
+ get usr() {
708
+ return this.howerUser;
709
+ }
710
+ tabClicked(tabEvent) {
711
+ // if (this.forPreview) {
712
+ // return
713
+ // }
714
+ const data = {
715
+ label: `${tabEvent.tab.textLabel}`,
716
+ index: tabEvent.index,
717
+ };
718
+ this.eventSvc.handleTabTelemetry(WsEvents.EnumInteractSubTypes.COURSE_TAB, data, {
719
+ id: this.content && this.content.identifier,
720
+ type: this.content && this.content.primaryCategory,
721
+ });
722
+ }
723
+ loadMore() {
724
+ if (!this.disableLoadMore && !this.lookupLoading) {
725
+ this.lookupLoading = true;
726
+ // tslint:disable-next-line: no-non-null-assertion
727
+ if ((this.searchForm.get('sortByControl').value === this.sortReviewValues[0])) {
728
+ if ((this.reviewPage * this.ratingViewCount) > this.ratingReviews.length) {
729
+ this.disableLoadMore = true;
730
+ }
731
+ this.reviewPage = this.reviewPage + 1;
732
+ this.ratingViewCount = this.reviewPage * this.ratingViewCount;
733
+ }
734
+ else {
735
+ this.reviewPage = this.reviewPage + 1;
736
+ this.ratingViewCount = this.reviewPage * this.reviewDefaultLimit;
737
+ this.fetchRatingLookup();
738
+ }
739
+ }
740
+ }
741
+ translateLabels(label, type) {
742
+ return this.langtranslations.translateLabelWithoutspace(label, type, '');
743
+ }
744
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocSinglePageComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.AppTocService }, { token: i3.DomSanitizer }, { token: i4.AccessControlService }, { token: i5.LoggerService }, { token: i6.TitleTagService }, { token: i7.MatLegacyDialog }, { token: i8.MobileAppsService }, { token: i5.ConfigurationsService }, { token: i9.ConnectionHoverService }, { token: i5.EventService }, { token: i10.RatingService }, { token: i11.TranslateService }, { token: i5.MultilingualTranslationsService }, { token: 'environment', optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
745
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocSinglePageComponent, selector: "ws-app-app-toc-single-page", inputs: { content: "content", initialrouteData: "initialrouteData", forPreview: "forPreview", resumeData: "resumeData", batchData: "batchData" }, usesOnChanges: true, ngImport: i0, template: "<mat-tab-group [selectedIndex]=\"tabSelectedIndex\" class=\"custom-tabgroup\" (selectedTabChange)=\"tabClicked($event)\">\r\n <mat-tab label=\"{{'apptocsinglepage.overview' | translate}}\">\r\n <ng-template matTabContent>\r\n <section id=\"overview\">\r\n <div class=\"fixed-width flex flex-wrap\">\r\n <div class=\"meta-section\">\r\n <!-- Description : Conditional : If not shown here, will be shown over banner -->\r\n <mat-card *ngIf=\"\r\n tocConfig?.overview?.description?.enabled &&\r\n showDescription &&\r\n showSubtitleOnBanner &&\r\n content?.description\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.description?.displayName, 'apptocsinglepage') }}</h2>\r\n <mat-card-content>\r\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.description)\">\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n <!-- Content Body -->\r\n <mat-card *ngIf=\"tocConfig?.overview?.body?.enabled && content?.instructions\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.body?.displayName, 'apptocsinglepage') }}\r\n </h2>\r\n <mat-card-content>\r\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.instructions)\">\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n <!-- Learning objective -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.learningObjective?.enabled && content?.learningObjective\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.learningObjective?.displayName }}</h2>\r\n <mat-card-content>\r\n <p class=\"section-content mat-subheading-1\" [innerHTML]=\"content?.learningObjective\"></p>\r\n </mat-card-content>\r\n </mat-card> -->\r\n\r\n <!-- Registration instructions -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.registrationInstructions?.enabled &&\r\n content?.registrationInstructions?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.registrationInstructions?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"section-content mat-subheading-1 break-words\"\r\n [innerHTML]=\"content?.registrationInstructions\"></div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preContents?.enabled && content?.preContents?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preContents?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let preContent of content?.preContents\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + preContent.identifier\"\r\n [queryParams]=\"{primaryCategory: preContent?.primaryCategory}\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ preContent.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.postContents?.enabled && content?.postContents?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.postContents?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let postContent of content?.postContents\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + postContent.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ postContent.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.certificationList?.enabled && content?.certificationList?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.certificationList?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let certification of content?.certificationList\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + certification.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ certification.name }}\r\n </p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.studyMaterials?.enabled && content?.studyMaterials?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.studyMaterials?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let studyitem of content?.studyMaterials\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + studyitem.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ studyitem.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.playgroundResources?.enabled && content?.playgroundResources?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.playgroundResources?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let playgroundResource of content?.playgroundResources\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + playgroundResource.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\r\n {{ playgroundResource.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.kArtifacts?.enabled && content?.kArtifacts?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.kArtifacts?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let kArtifact of content?.kArtifacts\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + kArtifact.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ kArtifact.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.equivalentCertifications?.enabled &&\r\n content?.equivalentCertifications?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.equivalentCertifications?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let equivalentCertification of content?.equivalentCertifications\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + equivalentCertification.identifier +'?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\r\n {{ equivalentCertification.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.softwareRequirements?.enabled && content?.softwareRequirements?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.softwareRequirements?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let softwareRequirement of content?.softwareRequirements\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [href]=\"softwareRequirement.url\" target=\"blank\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\r\n {{ softwareRequirement.title }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- Skills -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.skills?.enabled && content?.skills?.length\"\r\n class=\"unit-meta-item mat-app-background\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.skills?.displayName }}</h2>\r\n <mat-chip-list>\r\n <mat-chip class=\"section-content\" *ngFor=\"let skill of content?.skills\">{{ skill.name }}</mat-chip>\r\n </mat-chip-list>\r\n </mat-card> -->\r\n <!-- Requirements -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preRequisites?.enabled && content?.preRequisites\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preRequisites?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"mat-subheading-1\" [innerHTML]=\"content?.preRequisites\"></div>\r\n <div class=\"margin-top-s\" *ngIf=\"content?.softwareRequirements?.length\">\r\n <h3 class=\"mat-h3 margin-bottom-xs\" >Software Requirements</h3>\r\n <ng-container *ngFor=\"let requirement of content?.softwareRequirements\">\r\n <a *ngIf=\"requirement.url\" class=\"margin-right-s\" mat-stroked-button target=\"_blank\"\r\n [href]=\"requirement.url\">\r\n {{ requirement.title }}\r\n </a>\r\n <a mat-stroked-button class=\"margin-right-s\"\r\n *ngIf=\"!requirement?.url\">{{ requirement.title }}\r\n </a>\r\n </ng-container>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n\r\n <!-- Training (LHub) -->\r\n <!-- <mat-card *ngIf=\"trainingLHubEnabled && trainingLHubCount$ | async as trainingLHubCount\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\" >Trainings</h2>\r\n <h4 class=\"mat-h4\">\r\n <ng-container>{{ trainingLHubCount }}</ng-container>\r\n <ng-container i18n=\"x trainings available\" *ngIf=\"trainingLHubCount > 1\">\r\n trainings available</ng-container>\r\n <ng-container i18n=\"1 training available\" *ngIf=\"trainingLHubCount === 1\">\r\n training available</ng-container>\r\n </h4>\r\n <div>\r\n\r\n </div>\r\n </mat-card> -->\r\n\r\n <!-- Related Topics -->\r\n <!-- <mat-card class=\"unit-meta-item\" *ngIf=\"tocConfig?.overview?.topics?.enabled && content?.topics?.length\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.topics?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex flex-between flex-wrapped\">\r\n <a mat-stroked-button class=\"topic-button text-truncate\"\r\n *ngFor=\"let topic of content?.topics | pipeLimitTo: (viewMoreRelatedTopics ? 24 : 6)\"\r\n [title]=\"topic?.name\" [routerLink]=\"'/app/concept-graph/' + topic.identifier\">\r\n {{ topic?.name }}\r\n </a>\r\n </div>\r\n <div *ngIf=\"content?.topics?.length > 6\" class=\"text-right margin-top-xs\">\r\n <a mat-button (click)=\"viewMoreRelatedTopics = !viewMoreRelatedTopics\">\r\n <span *ngIf=\"!viewMoreRelatedTopics\" >View More</span>\r\n <span *ngIf=\"viewMoreRelatedTopics\" >View Less</span>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n <div class=\"margin-bottom-m\" *ngIf=\"objKeys(contentParents).length\">\r\n <mat-card>\r\n <h2 >This content is part of</h2>\r\n </mat-card>\r\n <mat-accordion>\r\n <ng-container *ngFor=\"let key of objKeys(contentParents)\">\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n {{ key }}\r\n </mat-expansion-panel-header>\r\n <div class=\"flex mb-1\" *ngFor=\"let content of contentParents[key]\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"\r\n content.status !== 'Live'\r\n ? '/author' + '/toc/' + content.identifier +'?primaryCategory='+ item.primaryCategory\r\n : '/app' + '/toc/' + content.identifier + '?primaryCategory='+ item.primaryCategory\r\n \">\r\n <p class=\"margin-remove-bottom mat-subheading-1\">{{ content.name }}</p>\r\n </a>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </mat-accordion>\r\n </div> -->\r\n </div>\r\n </div>\r\n </section>\r\n <section id=\"authors\" *ngIf=\"(content?.creatorDetails && content?.creatorDetails.length > 0) || (content?.creatorContacts && content?.creatorContacts.length > 0) ||\r\n (cohortResults[cohortTypesEnum.AUTHORS] && cohortResults[cohortTypesEnum.AUTHORS].length > 0)\">\r\n <div class=\"fluid-width contacts-container\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.authorsAndCurators' | translate}}</h2>\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\r\n <!-- authors -->\r\n <div *ngFor=\"let author of parseJsonData(content?.creatorDetails)\"\r\n class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\r\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\r\n [datalen]=\"1\"\r\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-xl\">\r\n <div class=\"user-name\">{{ author.name }}</div>\r\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.author' | translate}}</p>\r\n </div>\r\n </div>\r\n <!-- curators -->\r\n <div *ngFor=\"let author of parseJsonData(content?.creatorContacts)\"\r\n class=\"unit-cohort user-card sm:pr-8 md:pr-10\">\r\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\r\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [randomColor]=\"true\"\r\n [datalen]=\"1\"\r\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\r\n </ws-widget-avatar-photo>\r\n <div class=\"\">\r\n <div class=\"user-name\">{{ author.name }}</div>\r\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\r\n </div>\r\n </div>\r\n <!-- <div *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS]\">\r\n <h3 *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS].hasError\" class=\"mat-error text-center\" >\r\n Failed to fetch curators\r\n </h3>\r\n <h3 *ngIf=\"\r\n !cohortResults[cohortTypesEnum.AUTHORS].hasError &&\r\n !cohortResults[cohortTypesEnum.AUTHORS].contents.length\r\n \" class=\"text-center\" >\r\n None\r\n </h3>\r\n <ng-container *ngFor=\"let cohort of cohortResults[cohortTypesEnum.AUTHORS].contents\"\r\n [ngTemplateOutlet]=\"unitCohortNew1\" [ngTemplateOutletContext]=\"{ user: cohort }\">\r\n </ng-container>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n <section id=\"director\" *ngIf=\"checkForFacilitators.length\">\r\n <div class=\"fluid-width contacts-container\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.programDirectorFacilitators' | translate}}</h2>\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\r\n <!-- <ng-container *ngFor=\"let sessionDetails of selectedBatchData?.content[0]?.batchAttributes?.sessionDetails_v2\"> -->\r\n <ng-container *ngFor=\"let facilitator of checkForFacilitators\">\r\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\r\n [datalen]=\"1\"\r\n [size]=\"'round-m'\" [photoUrl]=\"facilitator.photo || ''\" [name]=\"facilitator.name\">\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-xl\">\r\n <div class=\"user-name\">{{ facilitator.name }}</div>\r\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.facilitator' | translate}}</p>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- </ng-container> -->\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n <section id=\"competencies\"\r\n *ngIf=\"content[compentencyKey] && competencies.length\">\r\n <div class=\"fluid-width contacts-container mb-10\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\r\n </div>\r\n <div>\r\n <table class=\"compt-table width-1-1 text-left\">\r\n <tr>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.subTheme' | translate}}</th>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.theme' | translate}} </th>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.area' | translate}}</th>\r\n </tr>\r\n <tr *ngFor=\"let comp of competencies\">\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencySubTheme}}</td>\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencyTheme}}</td>\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencyArea}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </section>\r\n <!-- <section id=\"competencies\"\r\n *ngIf=\"((!content?.test_competencies_v4 && content?.competencies_v3) &&\r\n (competencies.length) || (content?.competencies && competencies.length))\">\r\n <div class=\"fluid-width contacts-container mb-10\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\r\n </div>\r\n <div>\r\n <table class=\"compt-table width-1-1 text-left\">\r\n <tr>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.competency' | translate}}</th>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.type' | translate}}</th>\r\n </tr>\r\n <tr *ngFor=\"let comp of competencies\">\r\n <td class=\"padding-xs mat-body-1\">{{comp.name}}</td>\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencyType}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </section> -->\r\n <section id=\"rating\" *ngIf=\"!forPreview\">\r\n <div class=\"fluid-width contacts-container mb-10\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.ratingsReviews' | translate}}</h2>\r\n </div>\r\n <!-- <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary> -->\r\n\r\n <div class=\"search\">\r\n <form [formGroup]=\"searchForm\">\r\n <div class=\"flex top_search_box\">\r\n <div class=\"flex-1 search_box_inner\">\r\n <div class=\"flex flex-1 flex-column margin-fix search search_box_main\">\r\n <mat-form-field appearance=\"outline\"\r\n class=\"autocomplete-form search_form margin-right-s\" color=\"primary\">\r\n <mat-icon matPrefix\r\n class=\"flex items-center justify-center mr-2\">search\r\n </mat-icon>\r\n <!-- <mat-label>Search</mat-label> -->\r\n <input type=\"search\" name=\"searchKey\" #searchKey class=\"ml-2\" i18-aria-label\r\n aria-label=\"Search\" formControlName=\"searchKey\"\r\n i18n-placeholder=\"search\" [placeholder]=\"'apptocsinglepage.search' | translate\" matInput maxlength=\"50\"/>\r\n <!-- (input)=\"updateQuery(searchKey.value)\" -->\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"item_dropdown_box\">\r\n <div class=\"flex flex-1 flex-wrap section-input\">\r\n <div class=\"item\">\r\n <mat-form-field class=\"\" appearance=\"outline\">\r\n <mat-select #sortBySelect formControlName=\"sortByControl\"\r\n i18n-placeholder placeholder=\"Sort by\">\r\n <mat-option [value]=\"'topReviews'\" slected>{{'apptocsinglepage.topReviews' | translate}}\r\n </mat-option>\r\n <mat-option [value]=\"'latestReviews'\">{{'apptocsinglepage.latestReviews' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!-- <div class=\"rating-comments\">\r\n <ng-container *ngFor=\"let c of ratingReviews|\r\n pipeFilterV3:{ 'user_id': searchKey.value, 'review': searchKey.value } : false |\r\n slice:0:ratingViewCount; let i= index; let last = last\">\r\n <ws-widget-card-rating-comment [review]=\"c\"></ws-widget-card-rating-comment>\r\n\r\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\r\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount <=3 && i>=2 && last\">\r\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \"\r\n (click)=\"showALLReviews(ratingReviews?.length)\">\r\n <span >SEE ALL {{ratingReviews?.length}} REVIEWS</span>\r\n </a>\r\n </div>\r\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\r\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount > 3 && i>=2 && last\">\r\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \" (click)=\"showALLReviews(3)\">\r\n <span >SEE LESS REVIEWS</span>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <div class=\"rating-comments\" *ngIf=\"ratingReviews\">\r\n <div infiniteScroll\r\n [infiniteScrollDistance]=\"1\"\r\n [infiniteScrollThrottle]=\"150\"\r\n [infiniteScrollContainer]=\"'.rating-comments'\"\r\n [fromRoot]=\"true\"\r\n [scrollWindow]=\"false\"\r\n (scrolled)=\"loadMore()\">\r\n <ng-container *ngFor=\"let c of ratingReviews|\r\n pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false; let i= index; let last = last\">\r\n <ws-widget-card-rating-comment [review]=\"authReplies[c.userId]\" [contentid]=\"content?.identifier\"></ws-widget-card-rating-comment>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"displayLoader\" class=\"mt-5 pr-4 flex items-center justify-center spinner-border\">\r\n <mat-spinner [diameter]=\"30\"></mat-spinner>\r\n </div>\r\n <h4 *ngIf=\"(ratingReviews | pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false)?.length <=0\r\n && (displayLoader === false)\" class=\"w-full text-left ws-mat-black60-text \">\r\n {{'apptocsinglepage.noReviewsFound' | translate}}\r\n </h4>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab label=\"{{'apptocsinglepage.content' | translate}}\" *ngIf=\"content?.children?.length\">\r\n <ng-template matTabContent>\r\n <section id=\"content\">\r\n <div class=\"fixed-width\">\r\n <ws-app-app-toc-contents [batchId]=\"batchId\" [content]=\"content\" [forPreview]=\"forPreview\">\r\n </ws-app-app-toc-contents>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab label=\"{{'apptocsinglepage.sessions' | translate}}\" *ngIf=\"content?.children?.length && (content?.primaryCategory === primaryCategory.BLENDED_PROGRAM)\">\r\n <ng-template matTabContent>\r\n <section id=\"content\">\r\n <div class=\"fixed-width\">\r\n <ws-app-app-toc-sessions [batchData]=\"selectedBatchData\" [content]=\"content\" [forPreview]=\"forPreview\" [config]=\"tocConfig\">\r\n </ws-app-app-toc-sessions>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab label=\"{{'apptocsinglepage.discussion' | translate}}\" *ngIf=\"!forPreview\">\r\n <ng-template matTabContent>\r\n <section id=\"discussion-forum\">\r\n <div class=\"fixed-width toc-discussion-container\">\r\n <!-- <ws-app-toc-discussion [content]=\"content\" class=\"discussion\"></ws-app-toc-discussion> -->\r\n <all-discussion-widget style=' width: 100%;' [config]=\"discussionConfig\"></all-discussion-widget>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n</mat-tab-group>\r\n\r\n<!-- <section id=\"cohorts\">\r\n <div class=\"fixed-width toc-discussion-container\">\r\n <ws-app-toc-cohorts [content]=\"content\" class=\"cohorts\"></ws-app-toc-cohorts>\r\n </div>\r\n</section> -->\r\n\r\n<ng-template #unitCohortNew1 let-user=\"user\">\r\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\r\n [name]=\"getUserFullName(user)\">\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-l\">\r\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\r\n class=\"width-expand padding-left-xs\">\r\n <div class=\"mat-body-1 cohorts-name\">\r\n {{\r\n { firstName: user.first_name, email: user.email }\r\n | pipeNameTransform\r\n }}\r\n </div>\r\n <p class=\"mat-body-2 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #unitCohortNew let-user=\"user\">\r\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"getUserFullName(user)\"\r\n [imageSize]=\"'small'\" [email]=\"user.email\" [imageUrl]=\"user.photo || ''\"></ws-widget-user-image> -->\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\r\n [name]=\"getUserFullName(user)\">\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-l\">\r\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\r\n class=\"width-expand padding-left-xs\">\r\n <!-- <div class=\"mat-body-1 cohorts-name\">\r\n {{\r\n { firstName: user.first_name, lastName: user.last_name, email: user.email }\r\n | pipeNameTransform\r\n }}\r\n </div> -->\r\n <ws-widget-connection-name\r\n [hoverUser]=\"{firstName: user.first_name, id:user.uid,designation: user.designation,department:user.department}\">\r\n </ws-widget-connection-name>\r\n <!-- {{user | json}} -->\r\n <p class=\"mat-body-2 ws-mat-black60-text\">{{user.designation}}</p>\r\n <!-- <div class=\"mat-caption cohorts-desc\">{{ user.desc }}</div>\r\n </div>\r\n <div class=\"width-auto user-action-container\">\r\n <ws-widget-btn-mail-user [widgetData]=\"{ content: content, emails: [user.email], user: user }\">\r\n </ws-widget-btn-mail-user>\r\n <ws-widget-btn-call *ngIf=\"user.phone_No !== '0'\" [widgetData]=\"{\r\n userName:\r\n {\r\n firstName: user.first_name,\r\n lastName: user.last_name,\r\n email: user.email\r\n } | pipeNameTransform,\r\n userPhone: user.phone_No\r\n }\"></ws-widget-btn-call> -->\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [".fixed-width{max-width:1200px;display:block;margin:0 auto;padding:0 15px!important}.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.toc-body{padding-bottom:30px}.toc-body .toc-links{position:sticky;top:0;width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links ::ng-deep .mat-tab-links{margin:24px 0 0}.toc-body .toc-links .mat-tab-link{color:#5f5f5f;text-align:left;padding-left:0;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#00a9f4!important;border-bottom:none!important;font-weight:400!important}.section-content{word-break:break-word}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:24px;box-shadow:none;padding:0!important;background:transparent!important}@media only screen and (max-width: 599px){.meta-section{width:100%}}.info-section{width:28%;padding:0 8px;min-width:250px;margin-left:24px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0}}.info-section .glance-container .info-container{margin-bottom:24px}.info-section .glance-container .info-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-container .info-item{display:flex;align-items:center;padding:8px 0;box-sizing:border-box}.info-section .glance-container .info-container .info-item h3{margin:0}.info-section .glance-container .info-container .info-item .item-heading{width:40%;min-width:80px;max-width:140px;text-align:left;letter-spacing:0px}.info-section .glance-container .info-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px;outline:none;cursor:pointer}.divider-transparent{border-top-color:transparent!important}.section-heading,.section-content{letter-spacing:0px;color:#222}.resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box!important;box-shadow:0 10px 30px #9993;color:#fff!important}.resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.compt-table{border-spacing:0px 6px!important}.compt-table th{background:#0000000a;font-weight:700!important}.compt-table td{background:#fff}.custom-tabgroup .fixed-width{padding:0!important}.custom-tabgroup .unit-cohort{background:#e7eaeb;margin:10px 0;padding:22px 15px;border-radius:4px;align-self:center}.custom-tabgroup .unit-cohort .circle-l-xs,.custom-tabgroup .unit-cohort .circle-l-s,.custom-tabgroup .unit-cohort .circle-l,.custom-tabgroup .unit-cohort .circle-xl,.custom-tabgroup .unit-cohort .circle-m,.custom-tabgroup .unit-cohort .circle-xxl{width:56px!important;height:56px!important}::ng-deep .custom-tabgroup .mat-tab-header{border:0!important}::ng-deep .custom-tabgroup .mat-tab-body{padding:15px 0 220px!important;box-sizing:border-box;overflow-y:initial!important}@media (min-width: 767px) and (max-width: 1050px){::ng-deep .custom-tabgroup .mat-tab-body.mat-tab-body-active{overflow-x:initial!important}}::ng-deep .custom-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep .custom-tabgroup .mat-tab-label{border-bottom:2px solid rgba(0,0,0,.1);margin-right:3%}::ng-deep .custom-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:uppercase}::ng-deep .custom-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.rating-comments{height:auto;max-height:400px;padding:0 15px 0 0;overflow-y:auto;box-sizing:border-box}.view-all{border:1px solid #d3d3d3}.rating-progress{width:100%;max-width:298px}.bold-imp{font-weight:700!important}.mb-0{margin-bottom:0!important}.user-card{display:flex;align-items:center;justify-content:flex-start}.spinner-border{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i13.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i13.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i13.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i15.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i15.MatLegacyPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i16.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i17.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i17.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "component", type: i18.MatLegacyTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i18.MatLegacyTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "directive", type: i18.MatLegacyTabContent, selector: "[matTabContent]" }, { kind: "component", type: i19.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i20.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i21.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i22.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i23.ConnectionNameComponent, selector: "ws-widget-connection-name", inputs: ["hoverUser", "showBadge"] }, { kind: "component", type: i24.CardRatingCommentComponent, selector: "ws-widget-card-rating-comment", inputs: ["review", "contentid"] }, { kind: "directive", type: i25.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i26.AppTocSessionsComponent, selector: "ws-app-app-toc-sessions", inputs: ["batchData", "content", "forPreview", "config"] }, { kind: "pipe", type: i5.PipeNameTransformPipe, name: "pipeNameTransform" }, { kind: "pipe", type: i5.PipeFilterV3Pipe, name: "pipeFilterV3" }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] }); }
746
+ }
747
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocSinglePageComponent, decorators: [{
748
+ type: Component,
749
+ args: [{ selector: 'ws-app-app-toc-single-page', template: "<mat-tab-group [selectedIndex]=\"tabSelectedIndex\" class=\"custom-tabgroup\" (selectedTabChange)=\"tabClicked($event)\">\r\n <mat-tab label=\"{{'apptocsinglepage.overview' | translate}}\">\r\n <ng-template matTabContent>\r\n <section id=\"overview\">\r\n <div class=\"fixed-width flex flex-wrap\">\r\n <div class=\"meta-section\">\r\n <!-- Description : Conditional : If not shown here, will be shown over banner -->\r\n <mat-card *ngIf=\"\r\n tocConfig?.overview?.description?.enabled &&\r\n showDescription &&\r\n showSubtitleOnBanner &&\r\n content?.description\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.description?.displayName, 'apptocsinglepage') }}</h2>\r\n <mat-card-content>\r\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.description)\">\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n <!-- Content Body -->\r\n <mat-card *ngIf=\"tocConfig?.overview?.body?.enabled && content?.instructions\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ translateLabels(tocConfig?.overview?.body?.displayName, 'apptocsinglepage') }}\r\n </h2>\r\n <mat-card-content>\r\n <div class=\"section-content mat-body-1\" [innerHTML]=\"sanitize(content?.instructions)\">\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n <!-- Learning objective -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.learningObjective?.enabled && content?.learningObjective\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.learningObjective?.displayName }}</h2>\r\n <mat-card-content>\r\n <p class=\"section-content mat-subheading-1\" [innerHTML]=\"content?.learningObjective\"></p>\r\n </mat-card-content>\r\n </mat-card> -->\r\n\r\n <!-- Registration instructions -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.registrationInstructions?.enabled &&\r\n content?.registrationInstructions?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.registrationInstructions?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"section-content mat-subheading-1 break-words\"\r\n [innerHTML]=\"content?.registrationInstructions\"></div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preContents?.enabled && content?.preContents?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preContents?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let preContent of content?.preContents\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + preContent.identifier\"\r\n [queryParams]=\"{primaryCategory: preContent?.primaryCategory}\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ preContent.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.postContents?.enabled && content?.postContents?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.postContents?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let postContent of content?.postContents\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + postContent.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ postContent.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.certificationList?.enabled && content?.certificationList?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.certificationList?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let certification of content?.certificationList\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + certification.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ certification.name }}\r\n </p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.studyMaterials?.enabled && content?.studyMaterials?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.studyMaterials?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let studyitem of content?.studyMaterials\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + studyitem.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ studyitem.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.playgroundResources?.enabled && content?.playgroundResources?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.playgroundResources?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let playgroundResource of content?.playgroundResources\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + playgroundResource.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\r\n {{ playgroundResource.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.kArtifacts?.enabled && content?.kArtifacts?.length\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.kArtifacts?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let kArtifact of content?.kArtifacts\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + kArtifact.identifier + '?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">{{ kArtifact.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.equivalentCertifications?.enabled &&\r\n content?.equivalentCertifications?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.equivalentCertifications?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let equivalentCertification of content?.equivalentCertifications\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"'/app/toc/' + equivalentCertification.identifier +'?primaryCategory='+ item.primaryCategory\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\r\n {{ equivalentCertification.name }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- <mat-card *ngIf=\"\r\n tocConfig?.overview?.softwareRequirements?.enabled && content?.softwareRequirements?.length\r\n \" class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.softwareRequirements?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex mb-1\" *ngFor=\"let softwareRequirement of content?.softwareRequirements\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [href]=\"softwareRequirement.url\" target=\"blank\">\r\n <p class=\"section-content margin-remove-bottom mat-subheading-1\">\r\n {{ softwareRequirement.title }}</p>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n <!-- Skills -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.skills?.enabled && content?.skills?.length\"\r\n class=\"unit-meta-item mat-app-background\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.skills?.displayName }}</h2>\r\n <mat-chip-list>\r\n <mat-chip class=\"section-content\" *ngFor=\"let skill of content?.skills\">{{ skill.name }}</mat-chip>\r\n </mat-chip-list>\r\n </mat-card> -->\r\n <!-- Requirements -->\r\n <!-- <mat-card *ngIf=\"tocConfig?.overview?.preRequisites?.enabled && content?.preRequisites\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.preRequisites?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"mat-subheading-1\" [innerHTML]=\"content?.preRequisites\"></div>\r\n <div class=\"margin-top-s\" *ngIf=\"content?.softwareRequirements?.length\">\r\n <h3 class=\"mat-h3 margin-bottom-xs\" >Software Requirements</h3>\r\n <ng-container *ngFor=\"let requirement of content?.softwareRequirements\">\r\n <a *ngIf=\"requirement.url\" class=\"margin-right-s\" mat-stroked-button target=\"_blank\"\r\n [href]=\"requirement.url\">\r\n {{ requirement.title }}\r\n </a>\r\n <a mat-stroked-button class=\"margin-right-s\"\r\n *ngIf=\"!requirement?.url\">{{ requirement.title }}\r\n </a>\r\n </ng-container>\r\n </div>\r\n </mat-card-content>\r\n </mat-card> -->\r\n\r\n <!-- Training (LHub) -->\r\n <!-- <mat-card *ngIf=\"trainingLHubEnabled && trainingLHubCount$ | async as trainingLHubCount\"\r\n class=\"unit-meta-item\">\r\n <h2 class=\"section-heading\" >Trainings</h2>\r\n <h4 class=\"mat-h4\">\r\n <ng-container>{{ trainingLHubCount }}</ng-container>\r\n <ng-container i18n=\"x trainings available\" *ngIf=\"trainingLHubCount > 1\">\r\n trainings available</ng-container>\r\n <ng-container i18n=\"1 training available\" *ngIf=\"trainingLHubCount === 1\">\r\n training available</ng-container>\r\n </h4>\r\n <div>\r\n\r\n </div>\r\n </mat-card> -->\r\n\r\n <!-- Related Topics -->\r\n <!-- <mat-card class=\"unit-meta-item\" *ngIf=\"tocConfig?.overview?.topics?.enabled && content?.topics?.length\">\r\n <h2 class=\"section-heading\">{{ tocConfig?.overview?.topics?.displayName }}</h2>\r\n <mat-card-content>\r\n <div class=\"flex flex-between flex-wrapped\">\r\n <a mat-stroked-button class=\"topic-button text-truncate\"\r\n *ngFor=\"let topic of content?.topics | pipeLimitTo: (viewMoreRelatedTopics ? 24 : 6)\"\r\n [title]=\"topic?.name\" [routerLink]=\"'/app/concept-graph/' + topic.identifier\">\r\n {{ topic?.name }}\r\n </a>\r\n </div>\r\n <div *ngIf=\"content?.topics?.length > 6\" class=\"text-right margin-top-xs\">\r\n <a mat-button (click)=\"viewMoreRelatedTopics = !viewMoreRelatedTopics\">\r\n <span *ngIf=\"!viewMoreRelatedTopics\" >View More</span>\r\n <span *ngIf=\"viewMoreRelatedTopics\" >View Less</span>\r\n </a>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n <div class=\"margin-bottom-m\" *ngIf=\"objKeys(contentParents).length\">\r\n <mat-card>\r\n <h2 >This content is part of</h2>\r\n </mat-card>\r\n <mat-accordion>\r\n <ng-container *ngFor=\"let key of objKeys(contentParents)\">\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n {{ key }}\r\n </mat-expansion-panel-header>\r\n <div class=\"flex mb-1\" *ngFor=\"let content of contentParents[key]\">\r\n <span class=\"mr-1\">\r\n <mat-icon class=\"align-bottom\">web_asset</mat-icon>\r\n </span>\r\n <a class=\"ws-mat-primary-text\" [routerLink]=\"\r\n content.status !== 'Live'\r\n ? '/author' + '/toc/' + content.identifier +'?primaryCategory='+ item.primaryCategory\r\n : '/app' + '/toc/' + content.identifier + '?primaryCategory='+ item.primaryCategory\r\n \">\r\n <p class=\"margin-remove-bottom mat-subheading-1\">{{ content.name }}</p>\r\n </a>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </mat-accordion>\r\n </div> -->\r\n </div>\r\n </div>\r\n </section>\r\n <section id=\"authors\" *ngIf=\"(content?.creatorDetails && content?.creatorDetails.length > 0) || (content?.creatorContacts && content?.creatorContacts.length > 0) ||\r\n (cohortResults[cohortTypesEnum.AUTHORS] && cohortResults[cohortTypesEnum.AUTHORS].length > 0)\">\r\n <div class=\"fluid-width contacts-container\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.authorsAndCurators' | translate}}</h2>\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\r\n <!-- authors -->\r\n <div *ngFor=\"let author of parseJsonData(content?.creatorDetails)\"\r\n class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\r\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\r\n [datalen]=\"1\"\r\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-xl\">\r\n <div class=\"user-name\">{{ author.name }}</div>\r\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.author' | translate}}</p>\r\n </div>\r\n </div>\r\n <!-- curators -->\r\n <div *ngFor=\"let author of parseJsonData(content?.creatorContacts)\"\r\n class=\"unit-cohort user-card sm:pr-8 md:pr-10\">\r\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"author.name || ''\"\r\n [email]=\"author.email\" [imageUrl]=\"author.photo || ''\"></ws-widget-user-image> -->\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [randomColor]=\"true\"\r\n [datalen]=\"1\"\r\n [size]=\"'round-m'\" [photoUrl]=\"author.photo || ''\" [name]=\"author.name\" >\r\n </ws-widget-avatar-photo>\r\n <div class=\"\">\r\n <div class=\"user-name\">{{ author.name }}</div>\r\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\r\n </div>\r\n </div>\r\n <!-- <div *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS]\">\r\n <h3 *ngIf=\"cohortResults[cohortTypesEnum.AUTHORS].hasError\" class=\"mat-error text-center\" >\r\n Failed to fetch curators\r\n </h3>\r\n <h3 *ngIf=\"\r\n !cohortResults[cohortTypesEnum.AUTHORS].hasError &&\r\n !cohortResults[cohortTypesEnum.AUTHORS].contents.length\r\n \" class=\"text-center\" >\r\n None\r\n </h3>\r\n <ng-container *ngFor=\"let cohort of cohortResults[cohortTypesEnum.AUTHORS].contents\"\r\n [ngTemplateOutlet]=\"unitCohortNew1\" [ngTemplateOutletContext]=\"{ user: cohort }\">\r\n </ng-container>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n <section id=\"director\" *ngIf=\"checkForFacilitators.length\">\r\n <div class=\"fluid-width contacts-container\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 _ngcontent-qml-c28=\"\" class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.programDirectorFacilitators' | translate}}</h2>\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 col-gap-4\">\r\n <!-- <ng-container *ngFor=\"let sessionDetails of selectedBatchData?.content[0]?.batchAttributes?.sessionDetails_v2\"> -->\r\n <ng-container *ngFor=\"let facilitator of checkForFacilitators\">\r\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s \" [randomColor]=\"true\"\r\n [datalen]=\"1\"\r\n [size]=\"'round-m'\" [photoUrl]=\"facilitator.photo || ''\" [name]=\"facilitator.name\">\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-xl\">\r\n <div class=\"user-name\">{{ facilitator.name }}</div>\r\n <p class=\"mat-body-2 mb-0 ws-mat-black60-text\">{{'apptocsinglepage.facilitator' | translate}}</p>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- </ng-container> -->\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n <section id=\"competencies\"\r\n *ngIf=\"content[compentencyKey] && competencies.length\">\r\n <div class=\"fluid-width contacts-container mb-10\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\r\n </div>\r\n <div>\r\n <table class=\"compt-table width-1-1 text-left\">\r\n <tr>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.subTheme' | translate}}</th>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.theme' | translate}} </th>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.area' | translate}}</th>\r\n </tr>\r\n <tr *ngFor=\"let comp of competencies\">\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencySubTheme}}</td>\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencyTheme}}</td>\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencyArea}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </section>\r\n <!-- <section id=\"competencies\"\r\n *ngIf=\"((!content?.test_competencies_v4 && content?.competencies_v3) &&\r\n (competencies.length) || (content?.competencies && competencies.length))\">\r\n <div class=\"fluid-width contacts-container mb-10\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.competencies' | translate}}</h2>\r\n </div>\r\n <div>\r\n <table class=\"compt-table width-1-1 text-left\">\r\n <tr>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.competency' | translate}}</th>\r\n <th class=\"padding-xs ws-mat-black60-text mat-body-1\">{{'apptocsinglepage.type' | translate}}</th>\r\n </tr>\r\n <tr *ngFor=\"let comp of competencies\">\r\n <td class=\"padding-xs mat-body-1\">{{comp.name}}</td>\r\n <td class=\"padding-xs mat-body-1\">{{comp.competencyType}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </section> -->\r\n <section id=\"rating\" *ngIf=\"!forPreview\">\r\n <div class=\"fluid-width contacts-container mb-10\">\r\n <div class=\"fixed-width flex flex-col flex-wrap\">\r\n <h2 class=\"mat-toolbar contacts-head\">{{'apptocsinglepage.ratingsReviews' | translate}}</h2>\r\n </div>\r\n <!-- <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary> -->\r\n\r\n <div class=\"search\">\r\n <form [formGroup]=\"searchForm\">\r\n <div class=\"flex top_search_box\">\r\n <div class=\"flex-1 search_box_inner\">\r\n <div class=\"flex flex-1 flex-column margin-fix search search_box_main\">\r\n <mat-form-field appearance=\"outline\"\r\n class=\"autocomplete-form search_form margin-right-s\" color=\"primary\">\r\n <mat-icon matPrefix\r\n class=\"flex items-center justify-center mr-2\">search\r\n </mat-icon>\r\n <!-- <mat-label>Search</mat-label> -->\r\n <input type=\"search\" name=\"searchKey\" #searchKey class=\"ml-2\" i18-aria-label\r\n aria-label=\"Search\" formControlName=\"searchKey\"\r\n i18n-placeholder=\"search\" [placeholder]=\"'apptocsinglepage.search' | translate\" matInput maxlength=\"50\"/>\r\n <!-- (input)=\"updateQuery(searchKey.value)\" -->\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"item_dropdown_box\">\r\n <div class=\"flex flex-1 flex-wrap section-input\">\r\n <div class=\"item\">\r\n <mat-form-field class=\"\" appearance=\"outline\">\r\n <mat-select #sortBySelect formControlName=\"sortByControl\"\r\n i18n-placeholder placeholder=\"Sort by\">\r\n <mat-option [value]=\"'topReviews'\" slected>{{'apptocsinglepage.topReviews' | translate}}\r\n </mat-option>\r\n <mat-option [value]=\"'latestReviews'\">{{'apptocsinglepage.latestReviews' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!-- <div class=\"rating-comments\">\r\n <ng-container *ngFor=\"let c of ratingReviews|\r\n pipeFilterV3:{ 'user_id': searchKey.value, 'review': searchKey.value } : false |\r\n slice:0:ratingViewCount; let i= index; let last = last\">\r\n <ws-widget-card-rating-comment [review]=\"c\"></ws-widget-card-rating-comment>\r\n\r\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\r\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount <=3 && i>=2 && last\">\r\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \"\r\n (click)=\"showALLReviews(ratingReviews?.length)\">\r\n <span >SEE ALL {{ratingReviews?.length}} REVIEWS</span>\r\n </a>\r\n </div>\r\n <div class=\"flex items-center justify-center mb-2 mt-8 ws-mat-accent-text view-all\"\r\n *ngIf=\"ratingReviews?.length > 3 && ratingViewCount > 3 && i>=2 && last\">\r\n <a mat-button class=\"padding-top-xs padding-bottom-xs w-full \" (click)=\"showALLReviews(3)\">\r\n <span >SEE LESS REVIEWS</span>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <div class=\"rating-comments\" *ngIf=\"ratingReviews\">\r\n <div infiniteScroll\r\n [infiniteScrollDistance]=\"1\"\r\n [infiniteScrollThrottle]=\"150\"\r\n [infiniteScrollContainer]=\"'.rating-comments'\"\r\n [fromRoot]=\"true\"\r\n [scrollWindow]=\"false\"\r\n (scrolled)=\"loadMore()\">\r\n <ng-container *ngFor=\"let c of ratingReviews|\r\n pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false; let i= index; let last = last\">\r\n <ws-widget-card-rating-comment [review]=\"authReplies[c.userId]\" [contentid]=\"content?.identifier\"></ws-widget-card-rating-comment>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"displayLoader\" class=\"mt-5 pr-4 flex items-center justify-center spinner-border\">\r\n <mat-spinner [diameter]=\"30\"></mat-spinner>\r\n </div>\r\n <h4 *ngIf=\"(ratingReviews | pipeFilterV3:{ 'firstName': searchKey.value, 'review': searchKey.value } : false)?.length <=0\r\n && (displayLoader === false)\" class=\"w-full text-left ws-mat-black60-text \">\r\n {{'apptocsinglepage.noReviewsFound' | translate}}\r\n </h4>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab label=\"{{'apptocsinglepage.content' | translate}}\" *ngIf=\"content?.children?.length\">\r\n <ng-template matTabContent>\r\n <section id=\"content\">\r\n <div class=\"fixed-width\">\r\n <ws-app-app-toc-contents [batchId]=\"batchId\" [content]=\"content\" [forPreview]=\"forPreview\">\r\n </ws-app-app-toc-contents>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab label=\"{{'apptocsinglepage.sessions' | translate}}\" *ngIf=\"content?.children?.length && (content?.primaryCategory === primaryCategory.BLENDED_PROGRAM)\">\r\n <ng-template matTabContent>\r\n <section id=\"content\">\r\n <div class=\"fixed-width\">\r\n <ws-app-app-toc-sessions [batchData]=\"selectedBatchData\" [content]=\"content\" [forPreview]=\"forPreview\" [config]=\"tocConfig\">\r\n </ws-app-app-toc-sessions>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n <mat-tab label=\"{{'apptocsinglepage.discussion' | translate}}\" *ngIf=\"!forPreview\">\r\n <ng-template matTabContent>\r\n <section id=\"discussion-forum\">\r\n <div class=\"fixed-width toc-discussion-container\">\r\n <!-- <ws-app-toc-discussion [content]=\"content\" class=\"discussion\"></ws-app-toc-discussion> -->\r\n <all-discussion-widget style=' width: 100%;' [config]=\"discussionConfig\"></all-discussion-widget>\r\n </div>\r\n </section>\r\n </ng-template>\r\n </mat-tab>\r\n</mat-tab-group>\r\n\r\n<!-- <section id=\"cohorts\">\r\n <div class=\"fixed-width toc-discussion-container\">\r\n <ws-app-toc-cohorts [content]=\"content\" class=\"cohorts\"></ws-app-toc-cohorts>\r\n </div>\r\n</section> -->\r\n\r\n<ng-template #unitCohortNew1 let-user=\"user\">\r\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\r\n [name]=\"getUserFullName(user)\">\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-l\">\r\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\r\n class=\"width-expand padding-left-xs\">\r\n <div class=\"mat-body-1 cohorts-name\">\r\n {{\r\n { firstName: user.first_name, email: user.email }\r\n | pipeNameTransform\r\n }}\r\n </div>\r\n <p class=\"mat-body-2 ws-mat-black60-text\">{{'apptocsinglepage.curator' | translate}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #unitCohortNew let-user=\"user\">\r\n <div class=\"unit-cohort sm:pr-8 md:pr-10\">\r\n <!-- <ws-widget-user-image class=\"user-image\" [imageType]=\"'user-photo'\" [userName]=\"getUserFullName(user)\"\r\n [imageSize]=\"'small'\" [email]=\"user.email\" [imageUrl]=\"user.photo || ''\"></ws-widget-user-image> -->\r\n <ws-widget-avatar-photo class=\"float-left margin-right-s\" [size]=\"'round-m'\" [photoUrl]=\"user.photo || ''\"\r\n [name]=\"getUserFullName(user)\">\r\n </ws-widget-avatar-photo>\r\n <div class=\"margin-left-l\">\r\n <div (click)=\"goToUserProfile(user)\" [ngClass]=\"{'cursor-pointer': enablePeopleSearch}\"\r\n class=\"width-expand padding-left-xs\">\r\n <!-- <div class=\"mat-body-1 cohorts-name\">\r\n {{\r\n { firstName: user.first_name, lastName: user.last_name, email: user.email }\r\n | pipeNameTransform\r\n }}\r\n </div> -->\r\n <ws-widget-connection-name\r\n [hoverUser]=\"{firstName: user.first_name, id:user.uid,designation: user.designation,department:user.department}\">\r\n </ws-widget-connection-name>\r\n <!-- {{user | json}} -->\r\n <p class=\"mat-body-2 ws-mat-black60-text\">{{user.designation}}</p>\r\n <!-- <div class=\"mat-caption cohorts-desc\">{{ user.desc }}</div>\r\n </div>\r\n <div class=\"width-auto user-action-container\">\r\n <ws-widget-btn-mail-user [widgetData]=\"{ content: content, emails: [user.email], user: user }\">\r\n </ws-widget-btn-mail-user>\r\n <ws-widget-btn-call *ngIf=\"user.phone_No !== '0'\" [widgetData]=\"{\r\n userName:\r\n {\r\n firstName: user.first_name,\r\n lastName: user.last_name,\r\n email: user.email\r\n } | pipeNameTransform,\r\n userPhone: user.phone_No\r\n }\"></ws-widget-btn-call> -->\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [".fixed-width{max-width:1200px;display:block;margin:0 auto;padding:0 15px!important}.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.toc-body{padding-bottom:30px}.toc-body .toc-links{position:sticky;top:0;width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links ::ng-deep .mat-tab-links{margin:24px 0 0}.toc-body .toc-links .mat-tab-link{color:#5f5f5f;text-align:left;padding-left:0;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#00a9f4!important;border-bottom:none!important;font-weight:400!important}.section-content{word-break:break-word}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:24px;box-shadow:none;padding:0!important;background:transparent!important}@media only screen and (max-width: 599px){.meta-section{width:100%}}.info-section{width:28%;padding:0 8px;min-width:250px;margin-left:24px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0}}.info-section .glance-container .info-container{margin-bottom:24px}.info-section .glance-container .info-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-container .info-item{display:flex;align-items:center;padding:8px 0;box-sizing:border-box}.info-section .glance-container .info-container .info-item h3{margin:0}.info-section .glance-container .info-container .info-item .item-heading{width:40%;min-width:80px;max-width:140px;text-align:left;letter-spacing:0px}.info-section .glance-container .info-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px;outline:none;cursor:pointer}.divider-transparent{border-top-color:transparent!important}.section-heading,.section-content{letter-spacing:0px;color:#222}.resumeButton{height:52px;min-width:160px;display:flex;align-items:center;justify-content:center;background:#34d6a4 0% 0% no-repeat padding-box!important;box-shadow:0 10px 30px #9993;color:#fff!important}.resumeButton ::ng-deep .mat-button-wrapper{letter-spacing:0px;color:#fff;text-transform:capitalize}.compt-table{border-spacing:0px 6px!important}.compt-table th{background:#0000000a;font-weight:700!important}.compt-table td{background:#fff}.custom-tabgroup .fixed-width{padding:0!important}.custom-tabgroup .unit-cohort{background:#e7eaeb;margin:10px 0;padding:22px 15px;border-radius:4px;align-self:center}.custom-tabgroup .unit-cohort .circle-l-xs,.custom-tabgroup .unit-cohort .circle-l-s,.custom-tabgroup .unit-cohort .circle-l,.custom-tabgroup .unit-cohort .circle-xl,.custom-tabgroup .unit-cohort .circle-m,.custom-tabgroup .unit-cohort .circle-xxl{width:56px!important;height:56px!important}::ng-deep .custom-tabgroup .mat-tab-header{border:0!important}::ng-deep .custom-tabgroup .mat-tab-body{padding:15px 0 220px!important;box-sizing:border-box;overflow-y:initial!important}@media (min-width: 767px) and (max-width: 1050px){::ng-deep .custom-tabgroup .mat-tab-body.mat-tab-body-active{overflow-x:initial!important}}::ng-deep .custom-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep .custom-tabgroup .mat-tab-label{border-bottom:2px solid rgba(0,0,0,.1);margin-right:3%}::ng-deep .custom-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:uppercase}::ng-deep .custom-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.rating-comments{height:auto;max-height:400px;padding:0 15px 0 0;overflow-y:auto;box-sizing:border-box}.view-all{border:1px solid #d3d3d3}.rating-progress{width:100%;max-width:298px}.bold-imp{font-weight:700!important}.mb-0{margin-bottom:0!important}.user-card{display:flex;align-items:center;justify-content:flex-start}.spinner-border{overflow:hidden}\n"] }]
750
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.AppTocService }, { type: i3.DomSanitizer }, { type: i4.AccessControlService }, { type: i5.LoggerService }, { type: i6.TitleTagService }, { type: i7.MatLegacyDialog }, { type: i8.MobileAppsService }, { type: i5.ConfigurationsService }, { type: i9.ConnectionHoverService }, { type: i5.EventService }, { type: i10.RatingService }, { type: i11.TranslateService }, { type: i5.MultilingualTranslationsService }, { type: undefined, decorators: [{
751
+ type: Inject,
752
+ args: ['environment']
753
+ }, {
754
+ type: Optional
755
+ }] }]; }, propDecorators: { content: [{
756
+ type: Input
757
+ }], initialrouteData: [{
758
+ type: Input
759
+ }], forPreview: [{
760
+ type: Input
761
+ }], resumeData: [{
762
+ type: Input
763
+ }], batchData: [{
764
+ type: Input
765
+ }] } });
766
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1zaW5nbGUtcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvY29tcG9uZW50cy9hcHAtdG9jLXNpbmdsZS1wYWdlL2FwcC10b2Mtc2luZ2xlLXBhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1zaW5nbGUtcGFnZS9hcHAtdG9jLXNpbmdsZS1wYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBR2hHLE9BQU8sRUFBd0MsUUFBUSxFQUFpRCxNQUFNLHNCQUFzQixDQUFBO0FBQ3BJLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUNoRSxPQUFPLEVBQTRCLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUN4RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUUsT0FBTyxFQUFZLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRWhFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFBO0FBSWpHLHlFQUF5RTtBQUN6RSwyQkFBMkI7QUFDM0IsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV3JFLE1BQU0sT0FBTyx5QkFBeUI7SUErRHBDLFlBQ1UsTUFBYyxFQUNkLEtBQXFCLEVB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RyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUU7b0JBQ3hFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO2lCQUM1QjtnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO2dCQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQTthQUM5RDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO2dCQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFBO2dCQUNoRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTthQUN6QjtTQUNGO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhLEVBQUUsSUFBUztRQUN0QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7K0dBenhCVSx5QkFBeUIsb2ZBZ0YxQixhQUFhO21HQWhGWix5QkFBeUIseU9DNUJ0Qyx1aXZDQXVqQkE7OzRGRDNoQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLDRCQUE0Qjs7MEJBb0ZuQyxNQUFNOzJCQUFDLGFBQWE7OzBCQUFHLFFBQVE7NENBakV6QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY2Nlc3MtY29udHJvbC5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT25DaGFuZ2VzLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInXHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBEYXRhLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSwgTG9nZ2VyU2VydmljZSwgV3NFdmVudHMsIEV2ZW50U2VydmljZSwgTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xyXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IHNoYXJlLCBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IE5zQXBwVG9jLCBOc0NvaG9ydHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcclxuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcclxuaW1wb3J0IHsgQ3JlYXRlQmF0Y2hEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jcmVhdGUtYmF0Y2gtZGlhbG9nL2NyZWF0ZS1iYXRjaC1kaWFsb2cuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBUaXRsZVRhZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aXRsZS10YWcuc2VydmljZSdcclxuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uSG92ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jb25uZWN0aW9uLWhvdmVyLWNhcmQvY29ubmVjdGlvbi1ob3Zlci5zZXJ2aXZlJ1xyXG4vLyBpbXBvcnQgeyBJZGlzY3Vzc2lvbkNvbmZpZyB9IGZyb20gJ0Bwcm9qZWN0LXN1bmJpcmQvZGlzY3Vzc2lvbnMtdWktdjgnXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xyXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcclxuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnXHJcbmltcG9ydCB7IE1hdExlZ2FjeVRhYkNoYW5nZUV2ZW50IGFzIE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXRhYnMnXHJcbmltcG9ydCB7IE5zQXV0b0NvbXBsZXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2F1dG8tY29tcGxldGUubW9kZWwnXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnd3MtYXBwLWFwcC10b2Mtc2luZ2xlLXBhZ2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLXNpbmdsZS1wYWdlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLXNpbmdsZS1wYWdlLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcHBUb2NTaW5nbGVQYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgY29udGVudFR5cGVzID0gTnNDb250ZW50LkVDb250ZW50VHlwZXNcclxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxyXG4gIHNob3dNb3JlR2xhbmNlID0gZmFsc2VcclxuICBhc2tBdXRob3JFbmFibGVkID0gdHJ1ZVxyXG4gIHRyYWluaW5nTEh1YkVuYWJsZWQgPSBmYWxzZVxyXG4gIHRyYWluaW5nTEh1YkNvdW50JD86IE9ic2VydmFibGU8bnVtYmVyPlxyXG4gIGJvZHk6IFNhZmVIdG1sIHwgbnVsbCA9IG51bGxcclxuICB2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSBmYWxzZVxyXG4gIGhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXHJcbiAgdG9jU3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlIHwgbnVsbCA9IG51bGxcclxuICBjb250ZW50UGFyZW50czogeyBba2V5OiBzdHJpbmddOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlW10gfSA9IHt9XHJcbiAgb2JqS2V5cyA9IE9iamVjdC5rZXlzXHJcbiAgZnJhZ21lbnQhOiBzdHJpbmdcclxuICBhY3RpdmVGcmFnbWVudCA9IHRoaXMucm91dGUuZnJhZ21lbnQucGlwZShzaGFyZSgpKVxyXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgaW5pdGlhbHJvdXRlRGF0YTogYW55XHJcbiAgcm91dGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcclxuXHJcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YSB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiAvKipOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlICovIGFueSB8IG51bGwgPSBudWxsXHJcbiAgdG9jQ29uZmlnOiBhbnkgPSBudWxsXHJcbiAgbG9nZ2VkSW5Vc2VySWQhOiBhbnlcclxuICBwcml2YXRlIHJvdXRlUXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXHJcbiAgYmF0Y2hJZCE6IHN0cmluZ1xyXG4gIGlzTm90RWRpdG9yID0gdHJ1ZVxyXG4gIGNvaG9ydFJlc3VsdHM6IHtcclxuICAgIFtrZXk6IHN0cmluZ106IHsgaGFzRXJyb3I6IGJvb2xlYW47IGNvbnRlbnRzOiBOc0NvaG9ydHMuSUNvaG9ydHNDb250ZW50W10gfVxyXG4gIH0gPSB7fVxyXG4gIGNvaG9ydFR5cGVzRW51bSA9IE5zQ29ob3J0cy5FQ29ob3J0VHlwZXNcclxuICBkaXNjdXNzaW9uQ29uZmlnOiBhbnkgPSB7fVxyXG4gIGJhdGNoRGF0YUxvYWRlZCA9IGZhbHNlXHJcbiAgc2hvd0Rpc2N1c3Npb25Gb3J1bTogYW55XHJcbiAgY29tcGV0ZW5jaWVzOiBhbnlcclxuICBob3dlclVzZXIhOiBhbnlcclxuICBzZWFyY2hGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkXHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuICAvLyBUT0RPOiBUTyBiZSByZW1vdmVkIGltcG9ydGFudFxyXG4gIHByb2dyZXNzID0gNTBcclxuICByYXRpbmdTdW1tYXJ5OiBhbnlcclxuICByYXRpbmdMb29rdXA6IGFueVxyXG4gIHJhdGluZ1N1bW1hcnlQcm9jZXNzZWQ6IGFueVxyXG4gIHJhdGluZ1Jldmlld3M6IGFueVtdID0gW11cclxuICByYXRpbmdWaWV3Q291bnQgPSAzXHJcbiAgcmF0aW5nVmlld0NvdW50RGVmYXVsdCA9IDNcclxuICBsb29rdXBMaW1pdCA9IDNcclxuICBzb3J0UmV2aWV3VmFsdWVzID0gWyd0b3BSZXZpZXdzJywgJ2xhdGVzdFJldmlld3MnXVxyXG4gIHByZXZpb3VzRmlsdGVyID0gdGhpcy5zb3J0UmV2aWV3VmFsdWVzWzBdXHJcbiAgbGFzdExvb2tVcDogYW55XHJcbiAgcmV2aWV3UGFnZSA9IDFcclxuICByZXZpZXdEZWZhdWx0TGltaXQgPSAyXHJcbiAgZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcclxuICBkaXNwbGF5TG9hZGVyID0gZmFsc2VcclxuICB0YWJTZWxlY3RlZEluZGV4ID0gMFxyXG4gIHVwZGF0ZVJldmlld3NTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXHJcbiAgYXV0aFJlcGxpZXM6IGFueVxyXG4gIGxvb2t1cExvYWRpbmc6IEJvb2xlYW4gPSB0cnVlXHJcbiAgc2VsZWN0ZWRCYXRjaERhdGE6IGFueVxyXG4gIGJhdGNoU3Vic2NyaXB0aW9uOiBhbnlcclxuICAvLyBjb25maWdTdmM6IGFueVxyXG4gIGNvbXBlbnRlbmN5S2V5ID0gJydcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHRvY1NoYXJlZFN2YzogQXBwVG9jU2VydmljZSxcclxuICAgIHByaXZhdGUgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIGF1dGhBY2Nlc3NDb250cm9sU3ZjOiBBY2Nlc3NDb250cm9sU2VydmljZSxcclxuICAgIC8vIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgdGl0bGVUYWdTZXJ2aWNlOiBUaXRsZVRhZ1NlcnZpY2UsXHJcbiAgICBwdWJsaWMgY3JlYXRlQmF0Y2hEaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgbW9iaWxlQXBwc1N2YzogTW9iaWxlQXBwc1NlcnZpY2UsXHJcbiAgICBwdWJsaWMgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbm5lY3Rpb25Ib3ZlclNlcnZpY2U6IENvbm5lY3Rpb25Ib3ZlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV2ZW50U3ZjOiBFdmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJhdGluZ1N2YzogUmF0aW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYW5ndHJhbnNsYXRpb25zOiBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxyXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBAT3B0aW9uYWwoKSBwcml2YXRlIGVudmlyb25tZW50OiBhbnlcclxuICApIHtcclxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcclxuICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcclxuICAgICAgbGV0IGxhbmcgPSBKU09OLnN0cmluZ2lmeShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpXHJcbiAgICAgIGxhbmcgPSBsYW5nLnJlcGxhY2UoL1xcXCIvZywgJycpXHJcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xyXG4gICAgICB0aGlzLmFza0F1dGhvckVuYWJsZWQgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygnYXNrQXV0aG9yJylcclxuICAgICAgdGhpcy50cmFpbmluZ0xIdWJFbmFibGVkID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3RyYWluaW5nTEh1YicpXHJcbiAgICB9XHJcbiAgICAvLyBpZiAodGhpcy5yb3V0ZSAmJiB0aGlzLnJvdXRlLnBhcmVudCkge1xyXG4gICAgLy8gICB0aGlzLmNvbmZpZ1N2YyA9IHRoaXMucm91dGUucGFyZW50LnNuYXBzaG90LmRhdGEucHJvZmlsZURhdGFcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAvLyAgIHRoaXMuYXNrQXV0aG9yRW5hYmxlZCA9ICFkYXRhLnJlc3RyaWN0ZWREYXRhLmRhdGEuaGFzKCdhc2tBdXRob3InKVxyXG4gICAgLy8gICB0aGlzLnRyYWluaW5nTEh1YkVuYWJsZWQgPSAhZGF0YS5yZXN0cmljdGVkRGF0YS5kYXRhLmhhcygndHJhaW5pbmdMSHViJylcclxuICAgIC8vIH0pXHJcbiAgICB0aGlzLmRpc2N1c3Npb25Db25maWcgPSB7XHJcbiAgICAgIC8vIG1lbnVPcHRpb25zOiBbeyByb3V0ZTogJ2NhdGVnb3JpZXMnLCBlbmFibGU6IHRydWUgfV0sXHJcbiAgICAgIHVzZXJOYW1lOiAodGhpcy5jb25maWdTdmMubm9kZWJiVXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMubm9kZWJiVXNlclByb2ZpbGUudXNlcm5hbWUpIHx8ICcnLFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNvbXBlbnRlbmN5S2V5ID0gdGhpcy5lbnZpcm9ubWVudD8uY29tcGVudGVuY3lWZXJzaW9uS2V5IHx8ICcnXHJcbiAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTaGFyZWRTdmMuZ2V0U2VsZWN0ZWRCYXRjaC5zdWJzY3JpYmUoYmF0Y2hEYXRhID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YSA9IGJhdGNoRGF0YVxyXG4gICAgfSlcclxuICAgIHRoaXMuc2VhcmNoRm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcclxuICAgICAgc29ydEJ5Q29udHJvbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh0aGlzLnNvcnRSZXZpZXdWYWx1ZXNbMF0pLFxyXG4gICAgICBzZWFyY2hLZXk6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycpLFxyXG4gICAgfSlcclxuXHJcbiAgICAvLyBpZiAodGhpcy5yb3V0ZSAmJiB0aGlzLnJvdXRlLnBhcmVudCkge1xyXG4gICAgLy8gICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5wYXJlbnQuZGF0YS5zdWJzY3JpYmUoKGRhdGE6IERhdGEpID0+IHtcclxuICAgIC8vICAgICB0aGlzLmluaXREYXRhKGRhdGEpXHJcbiAgICAvLyAgICAgdGhpcy50b2NDb25maWcgPSBkYXRhLnBhZ2VEYXRhLmRhdGFcclxuICAgIC8vICAgfSlcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLmluaXRpYWxyb3V0ZURhdGEpIHtcclxuICAgICAgdGhpcy5pbml0RGF0YSh0aGlzLmluaXRpYWxyb3V0ZURhdGEpXHJcbiAgICAgIHRoaXMudG9jQ29uZmlnID0gdGhpcy5pbml0aWFscm91dGVEYXRhLnBhZ2VEYXRhLmRhdGFcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQpIHtcclxuICAgICAgdGhpcy5sb2dnZWRJblVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxyXG4gICAgfVxyXG4gICAgLy8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJvbGUgZWRpdG9yLFxyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJSb2xlcyAmJlxyXG4gICAgICB0aGlzLmNvbmZpZ1N2Yy51c2VyUm9sZXMuaGFzKCdlZGl0b3InKVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIGlmIGVkaXRvciwgY3JlYXRlIGJhdGNoIGJ1dHRvbiB3aWxsIGJlIHNob3duXHJcbiAgICAgIHRoaXMuaXNOb3RFZGl0b3IgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VhcmNoRm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXHJcbiAgICAgICAgc3dpdGNoTWFwKGFzeW5jIGZvcm1WYWx1ZSA9PiB7XHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdmb3JtVmFsdWUgOjogJywgZm9ybVZhbHVlKVxyXG4gICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNGaWx0ZXIgIT09IGZvcm1WYWx1ZS5zb3J0QnlDb250cm9sKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGaWx0ZXIgPSBmb3JtVmFsdWUuc29ydEJ5Q29udHJvbFxyXG4gICAgICAgICAgICB0aGlzLnNvcnRSZXZpZXdzKGZvcm1WYWx1ZS5zb3J0QnlDb250cm9sKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKVxyXG4gICAgICApLnN1YnNjcmliZSgpXHJcblxyXG4gICAgdGhpcy51cGRhdGVSZXZpZXdzU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTaGFyZWRTdmMudXBkYXRlUmV2aWV3c09ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVJldmlld3MoKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhKSB7XHJcbiAgICAgIC8vIHNldHRpbmcgdGFiIHRvIGZvY3VzIG9uIFwiQ09OVEVOVCB0YWJcIiBpZiBhbHJlYWR5IHVzZXIgaXMgZW5yb2xsZWRcclxuICAgICAgdGhpcy50YWJTZWxlY3RlZEluZGV4ID0gMVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGV0YWlsVXJsKGRhdGE6IGFueSkge1xyXG4gICAgLy8gbGV0IGxvY2F0aW9uT3JpZ2luID0gZW52aXJvbm1lbnQuc2l0ZVBhdGggPyBgaHR0cHM6Ly8ke2Vudmlyb25tZW50LnNpdGVQYXRofWAgOiBsb2NhdGlvbi5vcmlnaW5cclxuICAgIGxldCBsb2NhdGlvbk9yaWdpbiA9IGxvY2F0aW9uLm9yaWdpblxyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLmFjdGl2ZUxvY2FsZSAmJiB0aGlzLmNvbmZpZ1N2Yy5hY3RpdmVMb2NhbGUucGF0aCkge1xyXG4gICAgICBsb2NhdGlvbk9yaWdpbiArPSBgLyR7dGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlLnBhdGh9YFxyXG4gICAgfVxyXG4gICAgc3dpdGNoIChkYXRhLnByaW1hcnlDYXRlZ29yeSkge1xyXG4gICAgICBjYXNlIE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNIQU5ORUw6XHJcbiAgICAgICAgcmV0dXJuIGAke2xvY2F0aW9uT3JpZ2lufSR7ZGF0YS5hcnRpZmFjdFVybH1gXHJcbiAgICAgIGNhc2UgTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0JPQVJEOlxyXG4gICAgICAgIHJldHVybiBgJHtsb2NhdGlvbk9yaWdpbn0vYXBwL2tub3dsZWRnZS1ib2FyZC8ke2RhdGEuaWRlbnRpZmllcn1gXHJcbiAgICAgIGNhc2UgTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUOlxyXG4gICAgICAgIHJldHVybiBgJHtsb2NhdGlvbk9yaWdpbn0vYXBwL3RvYy8ke2RhdGEuaWRlbnRpZmllcn0vb3ZlcnZpZXc/cHJpbWFyeUNhdGVnb3J5PSR7ZGF0YS5wcmltYXJ5Q2F0ZWdvcnl9YFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBgJHtsb2NhdGlvbk9yaWdpbn0vYXBwL3RvYy8ke2RhdGEuaWRlbnRpZmllcn0vb3ZlcnZpZXc/cHJpbWFyeUNhdGVnb3J5PSR7ZGF0YS5wcmltYXJ5Q2F0ZWdvcnl9YFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5yb3V0ZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJvdXRlUXVlcnlTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5yb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnVwZGF0ZVJldmlld3NTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy51cGRhdGVSZXZpZXdzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmJhdGNoU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dTdWJ0aXRsZU9uQmFubmVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9jU2hhcmVkU3ZjLnN1YnRpdGxlT25CYW5uZXJzXHJcbiAgfVxyXG4gIGdldCBzaG93RGVzY3JpcHRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmICF0aGlzLmNvbnRlbnQuYm9keSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudG9jU2hhcmVkU3ZjLnNob3dEZXNjcmlwdGlvblxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUmVzb3VyY2UoKSB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XHJcbiAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5LTk9XTEVER0VfQVJUSUZBQ1QgfHxcclxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSB8fCAhdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aFxyXG4gICAgICBpZiAoaXNSZXNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5zZW5kVmlld2VyRGF0YSh0aGlzLmNvbnRlbnQpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGlzUmVzb3VyY2VcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgc2V0U29jaWFsTWVkaWFNZXRhVGFncyhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMudGl0bGVUYWdTZXJ2aWNlLnNldFNvY2lhbE1lZGlhVGFncyhcclxuICAgICAgdGhpcy5kZXRhaWxVcmwoZGF0YSksXHJcbiAgICAgIGRhdGEubmFtZSxcclxuICAgICAgZGF0YS5kZXNjcmlwdGlvbixcclxuICAgICAgZGF0YS5hcHBJY29uKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RGF0YShkYXRhOiBEYXRhKSB7XHJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMudG9jU2hhcmVkU3ZjLmluaXREYXRhKGRhdGEpXHJcbiAgICB0aGlzLmNvbnRlbnQgPSBpbml0RGF0YS5jb250ZW50XHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XHJcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50W3RoaXMuY29tcGVudGVuY3lLZXldKSB7XHJcbiAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbXBlbnRlbmN5S2V5XSA9IHRoaXMuY29udGVudFt0aGlzLmNvbXBlbnRlbmN5S2V5XVxyXG4gICAgICB0aGlzLmNvbXBldGVuY2llcyA9IHRoaXMuY29udGVudFt0aGlzLmNvbXBlbnRlbmN5S2V5XSB8fCBbXVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGlzY3Vzc2lvbkNvbmZpZy5jb250ZXh0SWRBcnIgPSAodGhpcy5jb250ZW50KSA/IFt0aGlzLmNvbnRlbnQuaWRlbnRpZmllcl0gOiBbXVxyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICB0aGlzLmRpc2N1c3Npb25Db25maWcuY2F0ZWdvcnlPYmogPSB7XHJcbiAgICAgICAgY2F0ZWdvcnk6IHtcclxuICAgICAgICAgIG5hbWU6IHRoaXMuY29udGVudC5uYW1lLFxyXG4gICAgICAgICAgcGlkOiAnJyxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbnRlbnQuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICBjb250ZXh0OiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAnY291cnNlJyxcclxuICAgICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNjdXNzaW9uQ29uZmlnLmNvbnRleHRUeXBlID0gJ2NvdXJzZSdcclxuICAgIHRoaXMuc2V0U29jaWFsTWVkaWFNZXRhVGFncyh0aGlzLmNvbnRlbnQpXHJcbiAgICB0aGlzLmJvZHkgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcclxuICAgICAgdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5ib2R5XHJcbiAgICAgICAgPyB0aGlzLmZvclByZXZpZXdcclxuICAgICAgICAgID8gdGhpcy5hdXRoQWNjZXNzQ29udHJvbFN2Yy5wcm94eVRvQXV0aG9yaW5nVXJsKHRoaXMuY29udGVudC5ib2R5KVxyXG4gICAgICAgICAgOiB0aGlzLmNvbnRlbnQuYm9keVxyXG4gICAgICAgIDogJycsXHJcbiAgICApXHJcbiAgICB0aGlzLmNvbnRlbnRQYXJlbnRzID0ge31cclxuICAgIHRoaXMucmVzZXRBbmRGZXRjaFRvY1N0cnVjdHVyZSgpXHJcbiAgICAvLyB0aGlzLmdldFRyYWluaW5nQ291bnQoKVxyXG4gICAgLy8gdGhpcy5nZXRDb250ZW50UGFyZW50KClcclxuICAgIC8vIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcclxuICAgIC8vICAgdGhpcy5mZXRjaENvaG9ydHModGhpcy5jb2hvcnRUeXBlc0VudW0uQUNUSVZFX1VTRVJTLCB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcilcclxuICAgIC8vICAgdGhpcy5mZXRjaENvaG9ydHModGhpcy5jb2hvcnRUeXBlc0VudW0uQVVUSE9SUywgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpXHJcbiAgICAvLyB9XHJcbiAgfVxyXG4gIHNhbml0aXplKGRhdGE6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGRhdGEpXHJcbiAgfVxyXG4gIGdldENvbnRlbnRQYXJlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRQYXJlbnRSZXE6IE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVxID0ge1xyXG4gICAgICAgIGZpZWxkczogWydjb250ZW50VHlwZScsICduYW1lJ10sXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50b2NTaGFyZWRTdmNcclxuICAgICAgICAuZmV0Y2hDb250ZW50UGFyZW50KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCBjb250ZW50UGFyZW50UmVxLCB0aGlzLmZvclByZXZpZXcpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyc2VDb250ZW50UGFyZW50KHJlcylcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBfZXJyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50UGFyZW50cyA9IHt9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb21wZXRlbmNpZXMoY29tcGV0ZW5jaWVzOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbXBldGVuY2llc0FycmF5ID0gSlNPTi5wYXJzZShjb21wZXRlbmNpZXMpXHJcbiAgICBjb25zdCBjb21wZXRlbmN5U3RyaW5nQXJyYXk6IGFueVtdID0gW11cclxuICAgIGNvbXBldGVuY2llc0FycmF5Lm1hcCgoYzogYW55KSA9PiB7XHJcbiAgICAgIC8vIGlmIChpIDwgKGNvbXBldGVuY2llc0FycmF5Lmxlbmd0aCAtMSkpIHtcclxuICAgICAgLy8gICBjb21wZXRlbmN5U3RyaW5nLnB1c2goYCR7Yy5uYW1lfSwgYClcclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICBjb21wZXRlbmN5U3RyaW5nLnB1c2goYy5uYW1lKVxyXG4gICAgICAvLyB9XHJcbiAgICAgIGNvbXBldGVuY3lTdHJpbmdBcnJheS5wdXNoKGMubmFtZSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gY29tcGV0ZW5jeVN0cmluZ0FycmF5XHJcbiAgfVxyXG5cclxuICBwYXJzZUNvbnRlbnRQYXJlbnQoY29udGVudDogTnNBcHBUb2MuSUNvbnRlbnRQYXJlbnRSZXNwb25zZSkge1xyXG4gICAgY29udGVudC5jb2xsZWN0aW9ucy5mb3JFYWNoKGNvbGxlY3Rpb24gPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuY29udGVudFBhcmVudHMuaGFzT3duUHJvcGVydHkoY29sbGVjdGlvbi5jb250ZW50VHlwZSkpIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYXJlbnRzW2NvbGxlY3Rpb24uY29udGVudFR5cGVdID0gW11cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNvbnRlbnRQYXJlbnRzW2NvbGxlY3Rpb24uY29udGVudFR5cGVdLnB1c2goY29sbGVjdGlvbilcclxuICAgICAgdGhpcy5wYXJzZUNvbnRlbnRQYXJlbnQoY29sbGVjdGlvbilcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXNldEFuZEZldGNoVG9jU3RydWN0dXJlKCkge1xyXG4gICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB7XHJcbiAgICAgIGFzc2Vzc21lbnQ6IDAsXHJcbiAgICAgIGZpbmFsVGVzdDogMCxcclxuICAgICAgY291cnNlOiAwLFxyXG4gICAgICBoYW5kc09uOiAwLFxyXG4gICAgICBpbnRlcmFjdGl2ZVZpZGVvOiAwLFxyXG4gICAgICBsZWFybmluZ01vZHVsZTogMCxcclxuICAgICAgb3RoZXI6IDAsXHJcbiAgICAgIHBkZjogMCxcclxuICAgICAgc3VydmV5OiAwLFxyXG4gICAgICBwb2RjYXN0OiAwLFxyXG4gICAgICBwcmFjdGljZVRlc3Q6IDAsXHJcbiAgICAgIHF1aXo6IDAsXHJcbiAgICAgIHZpZGVvOiAwLFxyXG4gICAgICB3ZWJNb2R1bGU6IDAsXHJcbiAgICAgIHdlYlBhZ2U6IDAsXHJcbiAgICAgIHlvdXR1YmU6IDAsXHJcbiAgICAgIGludGVyYWN0aXZlY29udGVudDogMCxcclxuICAgICAgb2ZmbGluZVNlc3Npb246IDAsXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XHJcbiAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gZmFsc2VcclxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUubGVhcm5pbmdNb2R1bGUgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NT0RVTEUgPyAtMSA6IDBcclxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFID8gLTEgOiAwXHJcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlID0gdGhpcy50b2NTaGFyZWRTdmMuZ2V0VG9jU3RydWN0dXJlKHRoaXMuY29udGVudCwgdGhpcy50b2NTdHJ1Y3R1cmUpXHJcbiAgICAgIGZvciAoY29uc3QgcHJvZ1R5cGUgaW4gdGhpcy50b2NTdHJ1Y3R1cmUpIHtcclxuICAgICAgICBpZiAodGhpcy50b2NTdHJ1Y3R1cmVbcHJvZ1R5cGVdID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5oYXNUb2NTdHJ1Y3R1cmUgPSB0cnVlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRm9yIExlYXJuaW5nIEh1YiB0cmFpbmluZ3NcclxuICAvLyBwcml2YXRlIGdldFRyYWluaW5nQ291bnQoKSB7XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgIHRoaXMudHJhaW5pbmdMSHViRW5hYmxlZCAmJlxyXG4gIC8vICAgICB0aGlzLmNvbnRlbnQgJiZcclxuICAvLyB0aGlzLnRyYWluaW5nU3ZjLmlzVmFsaWRUcmFpbmluZ0NvbnRlbnQodGhpcy5jb250ZW50KSAmJlxyXG4gIC8vICAgIXRoaXMuZm9yUHJldmlld1xyXG4gIC8vICkge1xyXG4gIC8vIHRoaXMudHJhaW5pbmdMSHViQ291bnQkID0gdGhpcy50cmFpbmluZ0FwaVxyXG4gIC8vICAgLmdldFRyYWluaW5nQ291bnQodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXHJcbiAgLy8gICAucGlwZShyZXRyeSgyKSlcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIG9wZW5RdWVyeU1haWxEaWFsb2coY29udGVudDogYW55LCBkYXRhOiBhbnkpIHtcclxuICAvLyAgIGNvbnN0IGVtYWlsQXJyYXkgPSBbXVxyXG4gIC8vICAgZW1haWxBcnJheS5wdXNoKGRhdGEuZW1haWwpXHJcbiAgLy8gICBjb25zdCBkaWFsb2dkYXRhID0ge1xyXG4gIC8vICAgICBjb250ZW50LFxyXG4gIC8vICAgICB1c2VyOiBkYXRhLFxyXG4gIC8vICAgICBlbWFpbHM6IGVtYWlsQXJyYXksXHJcbiAgLy8gICB9XHJcbiAgLy8gICBkaWFsb2dkYXRhLnVzZXIuaXNBdXRob3IgPSB0cnVlXHJcbiAgLy8gICB0aGlzLmRpYWxvZy5vcGVuPEJ0bk1haWxVc2VyRGlhbG9nQ29tcG9uZW50LCBJQnRuTWFpbFVzZXI+KFxyXG4gIC8vICAgICBCdG5NYWlsVXNlckRpYWxvZ0NvbXBvbmVudCxcclxuICAvLyAgICAge1xyXG4gIC8vICAgICAgIC8vIHdpZHRoOiAnNTB2dycsXHJcbiAgLy8gICAgICAgbWluV2lkdGg6ICc0MHZ3JyxcclxuICAvLyAgICAgICBtYXhXaWR0aDogJzgwdncnLFxyXG4gIC8vICAgICAgIGRhdGE6IGRpYWxvZ2RhdGEsXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIClcclxuICAvLyB9XHJcblxyXG4gIG9wZW5EaWFsb2coY29udGVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmNyZWF0ZUJhdGNoRGlhbG9nLm9wZW4oQ3JlYXRlQmF0Y2hEaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgLy8gaGVpZ2h0OiAnNDAwcHgnLFxyXG4gICAgICB3aWR0aDogJzYwMHB4JyxcclxuICAgICAgZGF0YTogeyBjb250ZW50IH0sXHJcbiAgICB9KVxyXG4gICAgLy8gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLnh5eiA9IHRoaXMuY29uZmlnU3ZjXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKF9yZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuYmF0Y2hJZCkge1xyXG4gICAgICAgIHRoaXMudG9jU2hhcmVkU3ZjLnVwZGF0ZUJhdGNoRGF0YSgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFyc2VKc29uRGF0YShzOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZFN0cmluZyA9IEpTT04ucGFyc2UocylcclxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gY29ob3J0cyAmIGxlYXJuZXJzXHJcbiAgcHVibGljIGdldCBlbmFibGVQZW9wbGVTZWFyY2goKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XHJcbiAgICAgIHJldHVybiAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygncGVvcGxlU2VhcmNoJylcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgZ29Ub1VzZXJQcm9maWxlKHVzZXI6IE5zQXV0b0NvbXBsZXRlLklVc2VyQXV0b0NvbXBsZXRlKSB7XHJcbiAgICBpZiAodGhpcy5lbmFibGVQZW9wbGVTZWFyY2gpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXBwL3BlcnNvbi1wcm9maWxlJywgdXNlci53aWRdKVxyXG5cclxuICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXBwL3BlcnNvbi1wcm9maWxlJ10sIHsgcXVlcnlQYXJhbXM6IHsgZW1haWxJZDogdXNlci5lbWFpbCB9IH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyRnVsbE5hbWUodXNlcjogYW55KSB7XHJcbiAgICAvLyB0aGlzLmdldEhvdmVyVXNlcih1c2VyOiBhbnkpXHJcbiAgICBpZiAodXNlciAmJiB1c2VyLmZpcnN0X25hbWUgJiYgdXNlci5sYXN0X25hbWUpIHtcclxuXHJcbiAgICAgIHJldHVybiBgJHt1c2VyLmZpcnN0X25hbWUudHJpbSgpfSAke3VzZXIubGFzdF9uYW1lLnRyaW0oKX1gXHJcbiAgICB9XHJcbiAgICByZXR1cm4gJydcclxuICB9XHJcblxyXG4gIGdldEhvdmVyVXNlcih1c2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXIud2lkXHJcbiAgICB0aGlzLmNvbm5lY3Rpb25Ib3ZlclNlcnZpY2UuZmV0Y2hQcm9maWxlKHVzZXJJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzLnByb2ZpbGVEZXRhaWxzICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5ob3dlclVzZXIgPSByZXMucHJvZmlsZURldGFpbHNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhvd2VyVXNlciA9IHJlcyB8fCB7fVxyXG5cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5ob3dlclVzZXJcclxuICAgIH0pXHJcbiAgfVxyXG4gIGZldGNoQ29ob3J0cyhjb2hvcnRUeXBlOiBOc0NvaG9ydHMuRUNvaG9ydFR5cGVzLCBjb250ZW50SUQ6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLmNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZV0gJiYgIXRoaXMuZm9yUHJldmlldykge1xyXG4gICAgICB0aGlzLnRvY1NoYXJlZFN2Yy5mZXRjaENvbnRlbnRDb2hvcnRzKGNvaG9ydFR5cGUsIGNvbnRlbnRJRCkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29ob3J0UmVzdWx0c1tjb2hvcnRUeXBlXSA9IHtcclxuICAgICAgICAgICAgY29udGVudHM6IF8ubWFwKGRhdGEsIGQgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdF9uYW1lOiBfLmdldChkLCAnZmlyc3RfbmFtZScpLFxyXG4gICAgICAgICAgICAgICAgbGFzdF9uYW1lOiBfLmdldChkLCAnbGFzdF9uYW1lJyksXHJcbiAgICAgICAgICAgICAgICBkZXBhcnRtZW50OiBfLmdldChkLCAnZGVwYXJ0bWVudCcpLFxyXG4gICAgICAgICAgICAgICAgZGVzaWduYXRpb246IF8uZ2V0KGQsICdkZXNpZ25hdGlvbicpLFxyXG4gICAgICAgICAgICAgICAgZW1haWw6IF8uZ2V0KGQsICdlbWFpbCcpLFxyXG4gICAgICAgICAgICAgICAgZGVzYzogXy5nZXQoZCwgJ2Rlc2MnKSxcclxuICAgICAgICAgICAgICAgIHVpZDogXy5nZXQoZCwgJ3VzZXJfaWQnKSxcclxuICAgICAgICAgICAgICAgIGxhc3RfdHM6IF8uZ2V0KGQsICdsYXN0X3RzJyksXHJcbiAgICAgICAgICAgICAgICBwaG9uZV9ObzogXy5nZXQoZCwgJ3Bob25lX05vJyksXHJcbiAgICAgICAgICAgICAgICBjaXR5OiBfLmdldChkLCAnY2l0eScpLFxyXG4gICAgICAgICAgICAgICAgdXNlckxvY2F0aW9uOiBfLmdldChkLCAndXNlckxvY2F0aW9uJyksXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSB8fCBbXSxcclxuICAgICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVdID0ge1xyXG4gICAgICAgICAgICBjb250ZW50czogW10sXHJcbiAgICAgICAgICAgIGhhc0Vycm9yOiB0cnVlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVdICYmICF0aGlzLmZvclByZXZpZXcpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZV0gPSB7XHJcbiAgICAgICAgY29udGVudHM6IFtdLFxyXG4gICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hSYXRpbmdTdW1tYXJ5KCkge1xyXG4gICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gdHJ1ZVxyXG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcgJiYgdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpIHtcclxuICAgICAgdGhpcy5yYXRpbmdTdmMuZ2V0UmF0aW5nU3VtbWFyeSh0aGlzLmNvbnRlbnQuaWRlbnRpZmllciwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gZmFsc2VcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeSA9IHJlcy5yZXN1bHQucmVzcG9uc2VcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBUT0RPOiBUbyBiZSByZW1vdmVkXHJcbiAgICAgICAgICAvLyB0aGlzLmhhcmRjb2RlRGF0YSgpXHJcbiAgICAgICAgICB0aGlzLnJhdGluZ1N1bW1hcnlQcm9jZXNzZWQgPSB0aGlzLnByb2Nlc3NSYXRpbmdTdW1tYXJ5KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVU0VSIFJBVElORyBGRVRDSCBFUlJPUiA+JywgZXJyKVxyXG4gICAgICAgICAgLy8gVE9ETzogVG8gYmUgcmVtb3ZlZFxyXG4gICAgICAgICAgLy8gdGhpcy5oYXJkY29kZURhdGEoKVxyXG4gICAgICAgICAgLy8gdGhpcy5yYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkID0gdGhpcy5wcm9jZXNzUmF0aW5nU3VtbWFyeSgpXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBdXRob3JSZXBseShpZGVudGlmaWVyOiBzdHJpbmcsIHByaW1hcnlDYXRlZ29yeTogTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnksIHVzZXJJZHM6IGFueVtdKSB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICByZXF1ZXN0OiB7XHJcbiAgICAgICAgICBhY3Rpdml0eUlkOiBpZGVudGlmaWVyLFxyXG4gICAgICAgICAgYWN0aXZpdHlUeXBlOiBwcmltYXJ5Q2F0ZWdvcnksXHJcbiAgICAgICAgICB1c2VySWQ6IHVzZXJJZHMsXHJcbiAgICAgIH0sXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yYXRpbmdTdmMuZ2V0UmF0aW5nUmVwbHkocmVxdWVzdCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmNvbnRlbnQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlYXRpbmdBdXRoUmVwbGF5ID0gcmVzLnJlc3VsdC5jb250ZW50XHJcbiAgICAgICAgICBfLmZvckVhY2gocmVhdGluZ0F1dGhSZXBsYXksIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoUmVwbGllc1t2YWx1ZS51c2VySWRdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF1bJ2NvbW1lbnQnXSA9IHZhbHVlLmNvbW1lbnRcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXVsndXNlcklkJ10gPSB2YWx1ZS51c2VySWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoUmVwbGllc1xyXG4gICAgICAgIC8vIFRPRE86IFRvIGJlIHJlbW92ZWRcclxuICAgICAgICAvLyB0aGlzLmhhcmRjb2RlRGF0YSgpXHJcbiAgICAgICAgLy8gdGhpcy5yYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkID0gdGhpcy5wcm9jZXNzUmF0aW5nU3VtbWFyeSgpXHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXHJcbiAgICAgICAgLy8gVE9ETzogVG8gYmUgcmVtb3ZlZFxyXG4gICAgICAgIC8vIHRoaXMuaGFyZGNvZGVEYXRhKClcclxuICAgICAgICAvLyB0aGlzLnJhdGluZ1N1bW1hcnlQcm9jZXNzZWQgPSB0aGlzLnByb2Nlc3NSYXRpbmdTdW1tYXJ5KClcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNoZWNrRm9yRmFjaWxpdGF0b3JzKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IGZhY2lsaXRhdG9yczogYW55W10gPSBbXVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50WzBdICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50WzBdLmJhdGNoQXR0cmlidXRlcy5zZXNzaW9uRGV0YWlsc192MiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLmNvbnRlbnRbMF0uYmF0Y2hBdHRyaWJ1dGVzLnNlc3Npb25EZXRhaWxzX3YyLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubWFwKChzZXNzaW9uRGV0YWlsczogYW55KSA9PiB7XHJcbiAgICAgICAgICBzZXNzaW9uRGV0YWlscy5mYWNpbGF0b3JEZXRhaWxzLm1hcCgoZmFjaWxpdGF0b3I6IGFueSkgPT4gW1xyXG4gICAgICAgICAgICBmYWNpbGl0YXRvcnMucHVzaChmYWNpbGl0YXRvciksXHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFjaWxpdGF0b3JzXHJcbiAgfVxyXG5cclxuICBmZXRjaFJhdGluZ0xvb2t1cCgpIHtcclxuICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IHRydWVcclxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xyXG4gICAgICBjb25zdCByZXEgPSB7XHJcbiAgICAgICAgYWN0aXZpdHlJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXHJcbiAgICAgICAgYWN0aXZpdHlUeXBlOiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxyXG4gICAgICAgIC8vIHRoaXMgZmllbGQgY2FuIGJlIGVuYWJsZWQgaWYgc3BlY2lmaWMgcmF0aW5ncyBoYXZlIHRvIGJlIGxvb2tlZCB1cFxyXG4gICAgICAgIC8vIHJhdGluZzogMCxcclxuICAgICAgICBsaW1pdDogdGhpcy5sb29rdXBMaW1pdCxcclxuICAgICAgICAuLi4oKHRoaXMubGFzdExvb2tVcCAmJiB0aGlzLmxhc3RMb29rVXAudXBkYXRlZE9uVVVJRCkgPyB7IHVwZGF0ZU9uOiAodGhpcy5sYXN0TG9va1VwICYmIHRoaXMubGFzdExvb2tVcC51cGRhdGVkT25VVUlEKSB9IDogbnVsbCksXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yYXRpbmdTdmMuZ2V0UmF0aW5nTG9va3VwKHJlcSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gZmFsc2VcclxuICAgICAgICAgIC8vIC8vIGNvbnNvbGUubG9nKCdSYXRpbmcgc3VtbWFyeSByZXMgJywgcmVzKVxyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmV2aWV3UGFnZSA+IDEpIHtcclxuICAgICAgICAgICAgICByZXMucmVzdWx0LnJlc3BvbnNlLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmF0aW5nTG9va3VwLmZpbmQoKG86IGFueSkgPT4gby51cGRhdGVkT25VVUlEID09PSBpdGVtLnVwZGF0ZWRPblVVSUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmF0aW5nTG9va3VwLnB1c2goaXRlbSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMucmF0aW5nTG9va3VwID0gcmVzLnJlc3VsdC5yZXNwb25zZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzUmF0aW5nTG9va3VwKHJlcy5yZXN1bHQucmVzcG9uc2UpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dBTExSZXZpZXdzKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnJhdGluZ1ZpZXdDb3VudCA9IGxlbmd0aFxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1JhdGluZ1N1bW1hcnkoKSB7XHJcbiAgICBjb25zdCBicmVha0Rvd25BcnJheTogYW55W10gPSBbXVxyXG4gICAgY29uc3QgcmF0aW5nU3VtbWFyeVByID0ge1xyXG4gICAgICBicmVha0Rvd246IGJyZWFrRG93bkFycmF5LFxyXG4gICAgICBsYXRlc3Q1MFJldmlld3M6IGJyZWFrRG93bkFycmF5LFxyXG4gICAgICByYXRpbmdzTnVtYmVyOiBicmVha0Rvd25BcnJheSxcclxuICAgICAgdG90YWxfbnVtYmVyX29mX3JhdGluZ3M6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsX251bWJlcl9vZl9yYXRpbmdzJykgfHwgMCxcclxuICAgICAgYXZnUmF0aW5nOiAwLFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvdFJhdGluZ3MgPSBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICdzdW1fb2ZfdG90YWxfcmF0aW5ncycpIHx8IDBcclxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XHJcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDFzdGFycycpLCAxLCB0b3RSYXRpbmdzKSxcclxuICAgICAga2V5OiAxLFxyXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDFzdGFycycpLFxyXG4gICAgfSlcclxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XHJcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDJzdGFycycpLCAyLCB0b3RSYXRpbmdzKSxcclxuICAgICAga2V5OiAyLFxyXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDJzdGFycycpLFxyXG4gICAgfSlcclxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XHJcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDNzdGFycycpLCAzLCB0b3RSYXRpbmdzKSxcclxuICAgICAga2V5OiAzLFxyXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDNzdGFycycpLFxyXG4gICAgfSlcclxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XHJcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDRzdGFycycpLCA0LCB0b3RSYXRpbmdzKSxcclxuICAgICAga2V5OiA0LFxyXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDRzdGFycycpLFxyXG4gICAgfSlcclxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XHJcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDVzdGFycycpLCA1LCB0b3RSYXRpbmdzKSxcclxuICAgICAga2V5OiA1LFxyXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDVzdGFycycpLFxyXG4gICAgfSlcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIC8vIHJhdGluZ1N1bW1hcnlQci5sYXRlc3Q1MFJldmlld3MgPSB0aGlzLnJhdGluZ1N1bW1hcnkgJiYgdGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cyA/IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cykgOiBbXVxyXG4gICAgLy8gLy8gcmF0aW5nU3VtbWFyeVByLmxhdGVzdDUwUmV2aWV3cyA9IHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3NcclxuICAgIC8vIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nU3VtbWFyeSAmJiB0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzID8gSlNPTi5wYXJzZSh0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKSA6IFtdXHJcbiAgICAvLyByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID0gcGFyc2VGbG9hdCgoKCgodG90UmF0aW5ncyAvIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykgKiAxMDApICogNSkgLyAxMDApLnRvRml4ZWQoMSkpXHJcbiAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MpIHtcclxuICAgICAgLy8gcmF0aW5nU3VtbWFyeVByLmxhdGVzdDUwUmV2aWV3cyA9IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cylcclxuICAgICAgLy8gdGhpcy5yYXRpbmdSZXZpZXdzID0gSlNPTi5wYXJzZSh0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKVxyXG4gICAgICBjb25zdCBsYXRlc3Q1MFJldmlld3MgPSBKU09OLnBhcnNlKHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MpXHJcbiAgICAgIGNvbnN0IG1vZGlmaWVkUmV2aWV3cyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgcmF0aW5nID0+IHtcclxuICAgICAgICByYXRpbmdbJ3VzZXJJZCddID0gIHJhdGluZy51c2VyX2lkXHJcbiAgICAgICAgcmV0dXJuIHJhdGluZ1xyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cclxuICAgICAgdGhpcy5hdXRoUmVwbGllcyA9IF8ua2V5QnkobGF0ZXN0NTBSZXZpZXdzLCAndXNlcl9pZCcpXHJcbiAgICAgIGNvbnN0IHVzZXJJZHMgPSBfLm1hcChsYXRlc3Q1MFJldmlld3MsICd1c2VyX2lkJylcclxuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICAgIHRoaXMuZ2V0QXV0aG9yUmVwbHkodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksIHVzZXJJZHMpXHJcbiAgICAgIH1cclxuICAgICAgcmF0aW5nU3VtbWFyeVByLmxhdGVzdDUwUmV2aWV3cyA9IG1vZGlmaWVkUmV2aWV3c1xyXG4gICAgICB0aGlzLnJhdGluZ1Jldmlld3MgPSBtb2RpZmllZFJldmlld3NcclxuICAgIH1cclxuICAgIC8vIHJhdGluZyBjaGFuZ2VzIDA3IG1hcmNoIDIzXHJcbiAgICAvLyBjb25zdCBtZWFuUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLmJyZWFrRG93bi5yZWR1Y2UoKHZhbCwgaXRlbSkgPT4ge1xyXG4gICAgLy8gICAvLyBjb25zb2xlLmxvZygnaXRlbScsIGl0ZW0pXHJcbiAgICAvLyAgIHJldHVybiB2YWwgKyAoaXRlbS5rZXkgKiBpdGVtLnZhbHVlKVxyXG4gICAgLy8gICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGFsaWduXHJcbiAgICAvLyB9LCAwKVxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgLy8gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZyA9IHRoaXMucmF0aW5nU3VtbWFyeSAmJiB0aGlzLnJhdGluZ1N1bW1hcnkudG90YWxfbnVtYmVyX29mX3JhdGluZ3MgPyBwYXJzZUZsb2F0KChtZWFuUmF0aW5nIC8gdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKS50b0ZpeGVkKDEpKSA6IDBcclxuXHJcbiAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykge1xyXG4gICAgICAvLyByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID0gcGFyc2VGbG9hdCgobWVhblJhdGluZyAvIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykudG9GaXhlZCgxKSlcclxuICAgICAgcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZyA9XHJcbiAgICAgIHBhcnNlRmxvYXQoKHRoaXMucmF0aW5nU3VtbWFyeS5zdW1fb2ZfdG90YWxfcmF0aW5ncyAvIHRoaXMucmF0aW5nU3VtbWFyeS50b3RhbF9udW1iZXJfb2ZfcmF0aW5ncykudG9GaXhlZCgxKSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nXHJcbiAgICAgIHRoaXMuY29udGVudC50b3RhbFJhdGluZyA9IHJhdGluZ1N1bW1hcnlQci50b3RhbF9udW1iZXJfb2ZfcmF0aW5nc1xyXG4gICAgfVxyXG4gICAgLy8gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZyA9IDVcclxuICAgIHJldHVybiByYXRpbmdTdW1tYXJ5UHJcclxuICB9XHJcblxyXG4gIHByb2Nlc3NSYXRpbmdMb29rdXAocmVzcG9uc2U6IGFueSkge1xyXG4gICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGggPCB0aGlzLmxvb2t1cExpbWl0KSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSB0cnVlXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMubG9va3VwTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5sYXN0TG9va1VwID0gcmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV1cclxuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gdGhpcy5yYXRpbmdMb29rdXBcclxuICAgICAgdGhpcy5hdXRoUmVwbGllcyA9IFtdXHJcbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KHRoaXMucmF0aW5nUmV2aWV3cywgJ3VzZXJJZCcpXHJcbiAgICAgIGNvbnN0IHVzZXJJZHMgPSBfLm1hcCh0aGlzLnJhdGluZ1Jldmlld3MsICd1c2VySWQnKVxyXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHVzZXJJZHMpIHtcclxuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nUmV2aWV3cy5zbGljZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3VudFN0YXJzUGVyY2VudGFnZSh2YWx1ZTogYW55LCBrZXk6IGFueSwgdG90YWw6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlICYmIHRvdGFsKSB7XHJcbiAgICAgIHJldHVybiAoKCh2YWx1ZSAqIGtleSkgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMilcclxuICAgIH1cclxuICAgIHJldHVybiAwXHJcbiAgfVxyXG5cclxuICBnZXRSYXRpbmdJY29uKHJhdGluZ0luZGV4OiBudW1iZXIsIGF2ZzogbnVtYmVyKTogJ3N0YXInIHwgJ3N0YXJfYm9yZGVyJyB8ICdzdGFyX2hhbGYnIHtcclxuICAgIHJldHVybiB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmdJY29uKHJhdGluZ0luZGV4LCBhdmcpXHJcbiAgfVxyXG5cclxuICBnZXRSYXRpbmdJY29uQ2xhc3MocmF0aW5nSW5kZXg6IG51bWJlciwgYXZnOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmdJY29uQ2xhc3MocmF0aW5nSW5kZXgsIGF2ZylcclxuICB9XHJcblxyXG4gIHNvcnRSZXZpZXdzKHNvcnQ6IHN0cmluZykge1xyXG4gICAgLy8gUmVzZXQgdGhlIGNvdW50ZXJzLyBwcmV2aW91cyB2YWx1ZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBmaWx0ZXIgYW5kIHZpZXdcclxuICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yYXRpbmdWaWV3Q291bnREZWZhdWx0XHJcbiAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xyXG4gICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gW11cclxuICAgIHRoaXMucmV2aWV3UGFnZSA9IDFcclxuICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcclxuICAgIHRoaXMucmF0aW5nTG9va3VwID0gW11cclxuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XHJcbiAgICAgIGlmIChzb3J0ID09PSB0aGlzLnNvcnRSZXZpZXdWYWx1ZXNbMF0pIHtcclxuICAgICAgICB0aGlzLmZldGNoUmF0aW5nU3VtbWFyeSgpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFRvIHVwZGF0ZWQgYm90aCByZXZpZXdzLCBhbmQgcmF0aW5nIHN1bW1hcnkgYXQgb25jZSBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW9cclxuICB1cGRhdGVSZXZpZXdzKCkge1xyXG4gICAgLy8gUmVzZXQgdGhlIGNvdW50ZXJzLyBwcmV2aW91cyB2YWx1ZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBmaWx0ZXIgYW5kIHZpZXdcclxuICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yYXRpbmdWaWV3Q291bnREZWZhdWx0XHJcbiAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xyXG4gICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gW11cclxuICAgIHRoaXMucmV2aWV3UGFnZSA9IDFcclxuICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcclxuICAgIHRoaXMucmF0aW5nTG9va3VwID0gW11cclxuICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcclxuICAgIGlmICh0aGlzLnByZXZpb3VzRmlsdGVyICE9PSB0aGlzLnNvcnRSZXZpZXdWYWx1ZXNbMF0pIHtcclxuICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdXNyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaG93ZXJVc2VyXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdGFiQ2xpY2tlZCh0YWJFdmVudDogTWF0VGFiQ2hhbmdlRXZlbnQpIHtcclxuICAgIC8vIGlmICh0aGlzLmZvclByZXZpZXcpIHtcclxuICAgIC8vICAgcmV0dXJuXHJcbiAgICAvLyB9XHJcbiAgICBjb25zdCBkYXRhOiBXc0V2ZW50cy5JVGVsZW1ldHJ5VGFiRGF0YSA9IHtcclxuICAgICAgbGFiZWw6IGAke3RhYkV2ZW50LnRhYi50ZXh0TGFiZWx9YCxcclxuICAgICAgaW5kZXg6IHRhYkV2ZW50LmluZGV4LFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN2Yy5oYW5kbGVUYWJUZWxlbWV0cnkoXHJcbiAgICAgIFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNPVVJTRV9UQUIsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBsb2FkTW9yZSgpIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlTG9hZE1vcmUgJiYgIXRoaXMubG9va3VwTG9hZGluZykge1xyXG4gICAgICB0aGlzLmxvb2t1cExvYWRpbmcgPSB0cnVlXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgIGlmICgodGhpcy5zZWFyY2hGb3JtIS5nZXQhKCdzb3J0QnlDb250cm9sJykhLnZhbHVlID09PSB0aGlzLnNvcnRSZXZpZXdWYWx1ZXNbMF0pKSB7XHJcbiAgICAgICAgaWYgKCh0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJhdGluZ1ZpZXdDb3VudCkgPiB0aGlzLnJhdGluZ1Jldmlld3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVMb2FkTW9yZSA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXZpZXdQYWdlID0gdGhpcy5yZXZpZXdQYWdlICsgMVxyXG4gICAgICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnRcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJldmlld1BhZ2UgPSB0aGlzLnJldmlld1BhZ2UgKyAxXHJcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJldmlld0RlZmF1bHRMaW1pdFxyXG4gICAgICAgIHRoaXMuZmV0Y2hSYXRpbmdMb29rdXAoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmFuc2xhdGVMYWJlbHMobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsV2l0aG91dHNwYWNlKGxhYmVsLCB0eXBlLCAnJylcclxuICB9XHJcbn1cclxuIiwiPG1hdC10YWItZ3JvdXAgW3NlbGVjdGVkSW5kZXhdPVwidGFiU2VsZWN0ZWRJbmRleFwiIGNsYXNzPVwiY3VzdG9tLXRhYmdyb3VwXCIgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cInRhYkNsaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJ7eydhcHB0b2NzaW5nbGVwYWdlLm92ZXJ2aWV3JyB8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwib3ZlcnZpZXdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aCBmbGV4IGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRhLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiA6IENvbmRpdGlvbmFsIDogSWYgbm90IHNob3duIGhlcmUsIHdpbGwgYmUgc2hvd24gb3ZlciBiYW5uZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2NDb25maWc/Lm92ZXJ2aWV3Py5kZXNjcmlwdGlvbj8uZW5hYmxlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93RGVzY3JpcHRpb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1N1YnRpdGxlT25CYW5uZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdHJhbnNsYXRlTGFiZWxzKHRvY0NvbmZpZz8ub3ZlcnZpZXc/LmRlc2NyaXB0aW9uPy5kaXNwbGF5TmFtZSwgJ2FwcHRvY3NpbmdsZXBhZ2UnKSB9fTwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hdC1ib2R5LTFcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplKGNvbnRlbnQ/LmRlc2NyaXB0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbnRlbnQgQm9keSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkICpuZ0lmPVwidG9jQ29uZmlnPy5vdmVydmlldz8uYm9keT8uZW5hYmxlZCAmJiBjb250ZW50Py5pbnN0cnVjdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdHJhbnNsYXRlTGFiZWxzKHRvY0NvbmZpZz8ub3ZlcnZpZXc/LmJvZHk/LmRpc3BsYXlOYW1lLCAnYXBwdG9jc2luZ2xlcGFnZScpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXQtYm9keS0xXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZShjb250ZW50Py5pbnN0cnVjdGlvbnMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGVhcm5pbmcgb2JqZWN0aXZlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LmxlYXJuaW5nT2JqZWN0aXZlPy5lbmFibGVkICYmIGNvbnRlbnQ/LmxlYXJuaW5nT2JqZWN0aXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5pdC1tZXRhLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24taGVhZGluZ1wiPnt7IHRvY0NvbmZpZz8ub3ZlcnZpZXc/LmxlYXJuaW5nT2JqZWN0aXZlPy5kaXNwbGF5TmFtZSB9fTwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXQtc3ViaGVhZGluZy0xXCIgW2lubmVySFRNTF09XCJjb250ZW50Py5sZWFybmluZ09iamVjdGl2ZVwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlZ2lzdHJhdGlvbiBpbnN0cnVjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHRvY0NvbmZpZz8ub3ZlcnZpZXc/LnJlZ2lzdHJhdGlvbkluc3RydWN0aW9ucz8uZW5hYmxlZCAmJlxyXG4gICAgICAgICAgICBjb250ZW50Py5yZWdpc3RyYXRpb25JbnN0cnVjdGlvbnM/Lmxlbmd0aFxyXG4gICAgICAgICAgICBcIiBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py5yZWdpc3RyYXRpb25JbnN0cnVjdGlvbnM/LmRpc3BsYXlOYW1lIH19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWF0LXN1YmhlYWRpbmctMSBicmVhay13b3Jkc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiY29udGVudD8ucmVnaXN0cmF0aW9uSW5zdHJ1Y3Rpb25zXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnByZUNvbnRlbnRzPy5lbmFibGVkICYmIGNvbnRlbnQ/LnByZUNvbnRlbnRzPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8ucHJlQ29udGVudHM/LmRpc3BsYXlOYW1lIH19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgcHJlQ29udGVudCBvZiBjb250ZW50Py5wcmVDb250ZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFsaWduLWJvdHRvbVwiPndlYl9hc3NldDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBwcmVDb250ZW50LmlkZW50aWZpZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwie3ByaW1hcnlDYXRlZ29yeTogcHJlQ29udGVudD8ucHJpbWFyeUNhdGVnb3J5fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LXN1YmhlYWRpbmctMVwiPnt7IHByZUNvbnRlbnQubmFtZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJ0b2NDb25maWc/Lm92ZXJ2aWV3Py5wb3N0Q29udGVudHM/LmVuYWJsZWQgJiYgY29udGVudD8ucG9zdENvbnRlbnRzPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8ucG9zdENvbnRlbnRzPy5kaXNwbGF5TmFtZSB9fTwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtYi0xXCIgKm5nRm9yPVwibGV0IHBvc3RDb250ZW50IG9mIGNvbnRlbnQ/LnBvc3RDb250ZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFsaWduLWJvdHRvbVwiPndlYl9hc3NldDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBwb3N0Q29udGVudC5pZGVudGlmaWVyICsgJz9wcmltYXJ5Q2F0ZWdvcnk9JysgaXRlbS5wcmltYXJ5Q2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1zdWJoZWFkaW5nLTFcIj57eyBwb3N0Q29udGVudC5uYW1lIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LmNlcnRpZmljYXRpb25MaXN0Py5lbmFibGVkICYmIGNvbnRlbnQ/LmNlcnRpZmljYXRpb25MaXN0Py5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8uY2VydGlmaWNhdGlvbkxpc3Q/LmRpc3BsYXlOYW1lIH19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgY2VydGlmaWNhdGlvbiBvZiBjb250ZW50Py5jZXJ0aWZpY2F0aW9uTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFsaWduLWJvdHRvbVwiPndlYl9hc3NldDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBjZXJ0aWZpY2F0aW9uLmlkZW50aWZpZXIgKyAnP3ByaW1hcnlDYXRlZ29yeT0nKyBpdGVtLnByaW1hcnlDYXRlZ29yeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzZWN0aW9uLWNvbnRlbnQgbWFyZ2luLXJlbW92ZS1ib3R0b20gbWF0LXN1YmhlYWRpbmctMVwiPnt7IGNlcnRpZmljYXRpb24ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnN0dWR5TWF0ZXJpYWxzPy5lbmFibGVkICYmIGNvbnRlbnQ/LnN0dWR5TWF0ZXJpYWxzPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8uc3R1ZHlNYXRlcmlhbHM/LmRpc3BsYXlOYW1lIH19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgc3R1ZHlpdGVtIG9mIGNvbnRlbnQ/LnN0dWR5TWF0ZXJpYWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBbcm91dGVyTGlua109XCInL2FwcC90b2MvJyArIHN0dWR5aXRlbS5pZGVudGlmaWVyICsgJz9wcmltYXJ5Q2F0ZWdvcnk9JysgaXRlbS5wcmltYXJ5Q2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbi1jb250ZW50IG1hcmdpbi1yZW1vdmUtYm90dG9tIG1hdC1zdWJoZWFkaW5nLTFcIj57eyBzdHVkeWl0ZW0ubmFtZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJcclxuICAgICAgICAgICAgdG9jQ29uZmlnPy5vdmVydmlldz8ucGxheWdyb3VuZFJlc291cmNlcz8uZW5hYmxlZCAmJiBjb250ZW50Py5wbGF5Z3JvdW5kUmVzb3VyY2VzPy5sZW5ndGhcclxuICAgICAgICAgICAgXCIgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8ucGxheWdyb3VuZFJlc291cmNlcz8uZGlzcGxheU5hbWUgfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbWItMVwiICpuZ0Zvcj1cImxldCBwbGF5Z3JvdW5kUmVzb3VyY2Ugb2YgY29udGVudD8ucGxheWdyb3VuZFJlc291cmNlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFsaWduLWJvdHRvbVwiPndlYl9hc3NldDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBwbGF5Z3JvdW5kUmVzb3VyY2UuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcGxheWdyb3VuZFJlc291cmNlLm5hbWUgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkICpuZ0lmPVwidG9jQ29uZmlnPy5vdmVydmlldz8ua0FydGlmYWN0cz8uZW5hYmxlZCAmJiBjb250ZW50Py5rQXJ0aWZhY3RzPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8ua0FydGlmYWN0cz8uZGlzcGxheU5hbWUgfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbWItMVwiICpuZ0Zvcj1cImxldCBrQXJ0aWZhY3Qgb2YgY29udGVudD8ua0FydGlmYWN0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFsaWduLWJvdHRvbVwiPndlYl9hc3NldDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvdG9jLycgKyBrQXJ0aWZhY3QuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+e3sga0FydGlmYWN0Lm5hbWUgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHRvY0NvbmZpZz8ub3ZlcnZpZXc/LmVxdWl2YWxlbnRDZXJ0aWZpY2F0aW9ucz8uZW5hYmxlZCAmJlxyXG4gICAgICAgICAgICBjb250ZW50Py5lcXVpdmFsZW50Q2VydGlmaWNhdGlvbnM/Lmxlbmd0aFxyXG4gICAgICAgICAgICBcIiBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py5lcXVpdmFsZW50Q2VydGlmaWNhdGlvbnM/LmRpc3BsYXlOYW1lIH19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1iLTFcIiAqbmdGb3I9XCJsZXQgZXF1aXZhbGVudENlcnRpZmljYXRpb24gb2YgY29udGVudD8uZXF1aXZhbGVudENlcnRpZmljYXRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBbcm91dGVyTGlua109XCInL2FwcC90b2MvJyArIGVxdWl2YWxlbnRDZXJ0aWZpY2F0aW9uLmlkZW50aWZpZXIgKyc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXF1aXZhbGVudENlcnRpZmljYXRpb24ubmFtZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgKm5nSWY9XCJcclxuICAgICAgICAgICAgdG9jQ29uZmlnPy5vdmVydmlldz8uc29mdHdhcmVSZXF1aXJlbWVudHM/LmVuYWJsZWQgJiYgY29udGVudD8uc29mdHdhcmVSZXF1aXJlbWVudHM/Lmxlbmd0aFxyXG4gICAgICAgICAgICBcIiBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py5zb2Z0d2FyZVJlcXVpcmVtZW50cz8uZGlzcGxheU5hbWUgfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggbWItMVwiICpuZ0Zvcj1cImxldCBzb2Z0d2FyZVJlcXVpcmVtZW50IG9mIGNvbnRlbnQ/LnNvZnR3YXJlUmVxdWlyZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWxpZ24tYm90dG9tXCI+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBbaHJlZl09XCJzb2Z0d2FyZVJlcXVpcmVtZW50LnVybFwiIHRhcmdldD1cImJsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb24tY29udGVudCBtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc29mdHdhcmVSZXF1aXJlbWVudC50aXRsZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTa2lsbHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkICpuZ0lmPVwidG9jQ29uZmlnPy5vdmVydmlldz8uc2tpbGxzPy5lbmFibGVkICYmIGNvbnRlbnQ/LnNraWxscz8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5pdC1tZXRhLWl0ZW0gbWF0LWFwcC1iYWNrZ3JvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py5za2lsbHM/LmRpc3BsYXlOYW1lIH19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBjbGFzcz1cInNlY3Rpb24tY29udGVudFwiICpuZ0Zvcj1cImxldCBza2lsbCBvZiBjb250ZW50Py5za2lsbHNcIj57eyBza2lsbC5uYW1lIH19PC9tYXQtY2hpcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVxdWlyZW1lbnRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnByZVJlcXVpc2l0ZXM/LmVuYWJsZWQgJiYgY29udGVudD8ucHJlUmVxdWlzaXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVuaXQtbWV0YS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj57eyB0b2NDb25maWc/Lm92ZXJ2aWV3Py5wcmVSZXF1aXNpdGVzPy5kaXNwbGF5TmFtZSB9fTwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMVwiIFtpbm5lckhUTUxdPVwiY29udGVudD8ucHJlUmVxdWlzaXRlc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJnaW4tdG9wLXNcIiAqbmdJZj1cImNvbnRlbnQ/LnNvZnR3YXJlUmVxdWlyZW1lbnRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWF0LWgzIG1hcmdpbi1ib3R0b20teHNcIiA+U29mdHdhcmUgUmVxdWlyZW1lbnRzPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVxdWlyZW1lbnQgb2YgY29udGVudD8uc29mdHdhcmVSZXF1aXJlbWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwicmVxdWlyZW1lbnQudXJsXCIgY2xhc3M9XCJtYXJnaW4tcmlnaHQtc1wiIG1hdC1zdHJva2VkLWJ1dHRvbiB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJlcXVpcmVtZW50LnVybFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlcXVpcmVtZW50LnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJtYXJnaW4tcmlnaHQtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVxdWlyZW1lbnQ/LnVybFwiPnt7IHJlcXVpcmVtZW50LnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVHJhaW5pbmcgKExIdWIpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2FyZCAqbmdJZj1cInRyYWluaW5nTEh1YkVuYWJsZWQgJiYgdHJhaW5pbmdMSHViQ291bnQkIHwgYXN5bmMgYXMgdHJhaW5pbmdMSHViQ291bnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LW1ldGEtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCIgPlRyYWluaW5nczwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtYXQtaDRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7IHRyYWluaW5nTEh1YkNvdW50IH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBpMThuPVwieCB0cmFpbmluZ3MgYXZhaWxhYmxlXCIgKm5nSWY9XCJ0cmFpbmluZ0xIdWJDb3VudCA+IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmdzIGF2YWlsYWJsZTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgaTE4bj1cIjEgdHJhaW5pbmcgYXZhaWxhYmxlXCIgKm5nSWY9XCJ0cmFpbmluZ0xIdWJDb3VudCA9PT0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyBhdmFpbGFibGU8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVsYXRlZCBUb3BpY3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkIGNsYXNzPVwidW5pdC1tZXRhLWl0ZW1cIiAqbmdJZj1cInRvY0NvbmZpZz8ub3ZlcnZpZXc/LnRvcGljcz8uZW5hYmxlZCAmJiBjb250ZW50Py50b3BpY3M/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+e3sgdG9jQ29uZmlnPy5vdmVydmlldz8udG9waWNzPy5kaXNwbGF5TmFtZSB9fTwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWJldHdlZW4gZmxleC13cmFwcGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG1hdC1zdHJva2VkLWJ1dHRvbiBjbGFzcz1cInRvcGljLWJ1dHRvbiB0ZXh0LXRydW5jYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0b3BpYyBvZiBjb250ZW50Py50b3BpY3MgfCBwaXBlTGltaXRUbzogKHZpZXdNb3JlUmVsYXRlZFRvcGljcyA/IDI0IDogNilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInRvcGljPy5uYW1lXCIgW3JvdXRlckxpbmtdPVwiJy9hcHAvY29uY2VwdC1ncmFwaC8nICsgdG9waWMuaWRlbnRpZmllclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9waWM/Lm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py50b3BpY3M/Lmxlbmd0aCA+IDZcIiBjbGFzcz1cInRleHQtcmlnaHQgbWFyZ2luLXRvcC14c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtYnV0dG9uIChjbGljayk9XCJ2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSAhdmlld01vcmVSZWxhdGVkVG9waWNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF2aWV3TW9yZVJlbGF0ZWRUb3BpY3NcIiA+VmlldyBNb3JlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2aWV3TW9yZVJlbGF0ZWRUb3BpY3NcIiA+VmlldyBMZXNzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJnaW4tYm90dG9tLW1cIiAqbmdJZj1cIm9iaktleXMoY29udGVudFBhcmVudHMpLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiA+VGhpcyBjb250ZW50IGlzIHBhcnQgb2Y8L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBvYmpLZXlzKGNvbnRlbnRQYXJlbnRzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBrZXkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtYi0xXCIgKm5nRm9yPVwibGV0IGNvbnRlbnQgb2YgY29udGVudFBhcmVudHNba2V5XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhbGlnbi1ib3R0b21cIj53ZWJfYXNzZXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBbcm91dGVyTGlua109XCJcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnN0YXR1cyAhPT0gJ0xpdmUnXHJcbiAgICAgICAgICAgICAgICAgICAgPyAnL2F1dGhvcicgKyAnL3RvYy8nICsgY29udGVudC5pZGVudGlmaWVyICsnP3ByaW1hcnlDYXRlZ29yeT0nKyBpdGVtLnByaW1hcnlDYXRlZ29yeVxyXG4gICAgICAgICAgICAgICAgICAgIDogJy9hcHAnICsgJy90b2MvJyArIGNvbnRlbnQuaWRlbnRpZmllciArICc/cHJpbWFyeUNhdGVnb3J5PScrIGl0ZW0ucHJpbWFyeUNhdGVnb3J5XHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBtYXQtc3ViaGVhZGluZy0xXCI+e3sgY29udGVudC5uYW1lIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwiYXV0aG9yc1wiICpuZ0lmPVwiKGNvbnRlbnQ/LmNyZWF0b3JEZXRhaWxzICYmIGNvbnRlbnQ/LmNyZWF0b3JEZXRhaWxzLmxlbmd0aCA+IDApIHx8IChjb250ZW50Py5jcmVhdG9yQ29udGFjdHMgJiYgY29udGVudD8uY3JlYXRvckNvbnRhY3RzLmxlbmd0aCA+IDApICB8fFxyXG4gICAgICAgICAgICAgICAgKGNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZXNFbnVtLkFVVEhPUlNdICYmIGNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZXNFbnVtLkFVVEhPUlNdLmxlbmd0aCA+IDApXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmx1aWQtd2lkdGggY29udGFjdHMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeGVkLXdpZHRoIGZsZXggZmxleC1jb2wgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBfbmdjb250ZW50LXFtbC1jMjg9XCJcIiBjbGFzcz1cIm1hdC10b29sYmFyIGNvbnRhY3RzLWhlYWRcIj57eydhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcnNBbmRDdXJhdG9ycycgfCB0cmFuc2xhdGV9fTwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIG1kOmdyaWQtY29scy0yIGNvbC1nYXAtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhdXRob3JzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYXV0aG9yIG9mIHBhcnNlSnNvbkRhdGEoY29udGVudD8uY3JlYXRvckRldGFpbHMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVuaXQtY29ob3J0IHNtOnByLTggbWQ6cHItMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx3cy13aWRnZXQtdXNlci1pbWFnZSBjbGFzcz1cInVzZXItaW1hZ2VcIiBbaW1hZ2VUeXBlXT1cIid1c2VyLXBob3RvJ1wiIFt1c2VyTmFtZV09XCJhdXRob3IubmFtZSB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWFpbF09XCJhdXRob3IuZW1haWxcIiBbaW1hZ2VVcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCI+PC93cy13aWRnZXQtdXNlci1pbWFnZT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC1zIFwiIFtyYW5kb21Db2xvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFsZW5dPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIidyb3VuZC1tJ1wiIFtwaG90b1VybF09XCJhdXRob3IucGhvdG8gfHwgJydcIiBbbmFtZV09XCJhdXRob3IubmFtZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLW5hbWVcIj57eyBhdXRob3IubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hdC1ib2R5LTIgIG1iLTAgIHdzLW1hdC1ibGFjazYwLXRleHRcIj57eydhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcicgfCB0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjdXJhdG9ycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBwYXJzZUpzb25EYXRhKGNvbnRlbnQ/LmNyZWF0b3JDb250YWN0cylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1bml0LWNvaG9ydCB1c2VyLWNhcmQgc206cHItOCBtZDpwci0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8d3Mtd2lkZ2V0LXVzZXItaW1hZ2UgY2xhc3M9XCJ1c2VyLWltYWdlXCIgW2ltYWdlVHlwZV09XCIndXNlci1waG90bydcIiBbdXNlck5hbWVdPVwiYXV0aG9yLm5hbWUgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWFpbF09XCJhdXRob3IuZW1haWxcIiBbaW1hZ2VVcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCI+PC93cy13aWRnZXQtdXNlci1pbWFnZT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXNcIiBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YWxlbl09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCIgW25hbWVdPVwiYXV0aG9yLm5hbWVcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItbmFtZVwiPnt7IGF1dGhvci5uYW1lIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXQtYm9keS0yIG1iLTAgd3MtbWF0LWJsYWNrNjAtdGV4dFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZXNFbnVtLkFVVEhPUlNdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyAqbmdJZj1cImNvaG9ydFJlc3VsdHNbY29ob3J0VHlwZXNFbnVtLkFVVEhPUlNdLmhhc0Vycm9yXCIgY2xhc3M9XCJtYXQtZXJyb3IgdGV4dC1jZW50ZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBjdXJhdG9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVzRW51bS5BVVRIT1JTXS5oYXNFcnJvciAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29ob3J0UmVzdWx0c1tjb2hvcnRUeXBlc0VudW0uQVVUSE9SU10uY29udGVudHMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvaG9ydCBvZiBjb2hvcnRSZXN1bHRzW2NvaG9ydFR5cGVzRW51bS5BVVRIT1JTXS5jb250ZW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInVuaXRDb2hvcnROZXcxXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdXNlcjogY29ob3J0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8c2VjdGlvbiBpZD1cImRpcmVjdG9yXCIgKm5nSWY9XCJjaGVja0ZvckZhY2lsaXRhdG9ycy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbHVpZC13aWR0aCBjb250YWN0cy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIF9uZ2NvbnRlbnQtcW1sLWMyOD1cIlwiIGNsYXNzPVwibWF0LXRvb2xiYXIgY29udGFjdHMtaGVhZFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UucHJvZ3JhbURpcmVjdG9yRmFjaWxpdGF0b3JzJyB8IHRyYW5zbGF0ZX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbWQ6Z3JpZC1jb2xzLTIgY29sLWdhcC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlc3Npb25EZXRhaWxzIG9mIHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LnNlc3Npb25EZXRhaWxzX3YyXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZhY2lsaXRhdG9yIG9mIGNoZWNrRm9yRmFjaWxpdGF0b3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bml0LWNvaG9ydCBzbTpwci04IG1kOnByLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXMgXCIgW3JhbmRvbUNvbG9yXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFsZW5dPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiZmFjaWxpdGF0b3IucGhvdG8gfHwgJydcIiBbbmFtZV09XCJmYWNpbGl0YXRvci5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLWxlZnQteGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1uYW1lXCI+e3sgZmFjaWxpdGF0b3IubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWF0LWJvZHktMiAgbWItMCAgd3MtbWF0LWJsYWNrNjAtdGV4dFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuZmFjaWxpdGF0b3InIHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICA8c2VjdGlvbiBpZD1cImNvbXBldGVuY2llc1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRbY29tcGVudGVuY3lLZXldICYmIGNvbXBldGVuY2llcy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbHVpZC13aWR0aCBjb250YWN0cy1jb250YWluZXIgbWItMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRvb2xiYXIgY29udGFjdHMtaGVhZFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzJyB8IHRyYW5zbGF0ZX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJjb21wdC10YWJsZSB3aWR0aC0xLTEgdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwicGFkZGluZy14cyB3cy1tYXQtYmxhY2s2MC10ZXh0IG1hdC1ib2R5LTFcIj57eydhcHB0b2NzaW5nbGVwYWdlLnN1YlRoZW1lJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJwYWRkaW5nLXhzIHdzLW1hdC1ibGFjazYwLXRleHQgbWF0LWJvZHktMVwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UudGhlbWUnIHwgdHJhbnNsYXRlfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJwYWRkaW5nLXhzIHdzLW1hdC1ibGFjazYwLXRleHQgbWF0LWJvZHktMVwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuYXJlYScgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBjb21wIG9mIGNvbXBldGVuY2llc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInBhZGRpbmcteHMgbWF0LWJvZHktMVwiPnt7Y29tcC5jb21wZXRlbmN5U3ViVGhlbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLmNvbXBldGVuY3lUaGVtZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwYWRkaW5nLXhzIG1hdC1ib2R5LTFcIj57e2NvbXAuY29tcGV0ZW5jeUFyZWF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgPCEtLSA8c2VjdGlvbiBpZD1cImNvbXBldGVuY2llc1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIigoIWNvbnRlbnQ/LnRlc3RfY29tcGV0ZW5jaWVzX3Y0ICYmIGNvbnRlbnQ/LmNvbXBldGVuY2llc192MykgJiZcclxuICAgICAgICAgICAgICAgICAgICAoY29tcGV0ZW5jaWVzLmxlbmd0aCkgfHwgKGNvbnRlbnQ/LmNvbXBldGVuY2llcyAmJiBjb21wZXRlbmNpZXMubGVuZ3RoKSlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbHVpZC13aWR0aCBjb250YWN0cy1jb250YWluZXIgbWItMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRvb2xiYXIgY29udGFjdHMtaGVhZFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzJyB8IHRyYW5zbGF0ZX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJjb21wdC10YWJsZSB3aWR0aC0xLTEgdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwicGFkZGluZy14cyB3cy1tYXQtYmxhY2s2MC10ZXh0IG1hdC1ib2R5LTFcIj57eydhcHB0b2NzaW5nbGVwYWdlLmNvbXBldGVuY3knIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInBhZGRpbmcteHMgd3MtbWF0LWJsYWNrNjAtdGV4dCBtYXQtYm9keS0xXCI+e3snYXBwdG9jc2luZ2xlcGFnZS50eXBlJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGNvbXAgb2YgY29tcGV0ZW5jaWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLm5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicGFkZGluZy14cyBtYXQtYm9keS0xXCI+e3tjb21wLmNvbXBldGVuY3lUeXBlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+IC0tPlxyXG4gICAgICAgICAgICA8c2VjdGlvbiBpZD1cInJhdGluZ1wiICpuZ0lmPVwiIWZvclByZXZpZXdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbHVpZC13aWR0aCBjb250YWN0cy1jb250YWluZXIgbWItMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGggZmxleCBmbGV4LWNvbCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRvb2xiYXIgY29udGFjdHMtaGVhZFwiPnt7J2FwcHRvY3NpbmdsZXBhZ2UucmF0aW5nc1Jldmlld3MnIHwgdHJhbnNsYXRlfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHdzLXdpZGdldC1yYXRpbmctc3VtbWFyeSBbcmF0aW5nU3VtbWFyeV09XCJyYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkXCI+PC93cy13aWRnZXQtcmF0aW5nLXN1bW1hcnk+IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2VhcmNoRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdG9wX3NlYXJjaF9ib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIHNlYXJjaF9ib3hfaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGZsZXgtY29sdW1uIG1hcmdpbi1maXggc2VhcmNoIHNlYXJjaF9ib3hfbWFpblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS1mb3JtIHNlYXJjaF9mb3JtIG1hcmdpbi1yaWdodC1zXCIgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFByZWZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1yLTJcIj5zZWFyY2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBuYW1lPVwic2VhcmNoS2V5XCIgI3NlYXJjaEtleSBjbGFzcz1cIm1sLTJcIiBpMTgtYXJpYS1sYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoS2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1wbGFjZWhvbGRlcj1cInNlYXJjaFwiIFtwbGFjZWhvbGRlcl09XCInYXBwdG9jc2luZ2xlcGFnZS5zZWFyY2gnIHwgdHJhbnNsYXRlXCIgbWF0SW5wdXQgIG1heGxlbmd0aD1cIjUwXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGlucHV0KT1cInVwZGF0ZVF1ZXJ5KHNlYXJjaEtleS52YWx1ZSlcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtX2Ryb3Bkb3duX2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgZmxleC13cmFwIHNlY3Rpb24taW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgI3NvcnRCeVNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzb3J0QnlDb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tcGxhY2Vob2xkZXIgcGxhY2Vob2xkZXI9XCJTb3J0IGJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiJ3RvcFJldmlld3MnXCIgc2xlY3RlZD57eydhcHB0b2NzaW5nbGVwYWdlLnRvcFJldmlld3MnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCInbGF0ZXN0UmV2aWV3cydcIj57eydhcHB0b2NzaW5nbGVwYWdlLmxhdGVzdFJldmlld3MnIHwgdHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicmF0aW5nLWNvbW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgcmF0aW5nUmV2aWV3c3xcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGlwZUZpbHRlclYzOnsgJ3VzZXJfaWQnOiBzZWFyY2hLZXkudmFsdWUsICdyZXZpZXcnOiBzZWFyY2hLZXkudmFsdWUgfSA6IGZhbHNlIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2U6MDpyYXRpbmdWaWV3Q291bnQ7IGxldCBpPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNhcmQtcmF0aW5nLWNvbW1lbnQgW3Jldmlld109XCJjXCI+PC93cy13aWRnZXQtY2FyZC1yYXRpbmctY29tbWVudD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWItMiBtdC04IHdzLW1hdC1hY2NlbnQtdGV4dCB2aWV3LWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJhdGluZ1Jldmlld3M/Lmxlbmd0aCA+IDMgJiYgcmF0aW5nVmlld0NvdW50IDw9MyAmJiBpPj0yICYmIGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtYnV0dG9uIGNsYXNzPVwicGFkZGluZy10b3AteHMgcGFkZGluZy1ib3R0b20teHMgdy1mdWxsIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dBTExSZXZpZXdzKHJhdGluZ1Jldmlld3M/Lmxlbmd0aClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gPlNFRSBBTEwge3tyYXRpbmdSZXZpZXdzPy5sZW5ndGh9fSBSRVZJRVdTPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1iLTIgbXQtOCB3cy1tYXQtYWNjZW50LXRleHQgdmlldy1hbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyYXRpbmdSZXZpZXdzPy5sZW5ndGggPiAzICYmIHJhdGluZ1ZpZXdDb3VudCA+IDMgJiYgaT49MiAmJiBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbWF0LWJ1dHRvbiBjbGFzcz1cInBhZGRpbmctdG9wLXhzIHBhZGRpbmctYm90dG9tLXhzIHctZnVsbCBcIiAoY2xpY2spPVwic2hvd0FMTFJldmlld3MoMylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gPlNFRSBMRVNTIFJFVklFV1M8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhdGluZy1jb21tZW50c1wiICpuZ0lmPVwicmF0aW5nUmV2aWV3c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGluZmluaXRlU2Nyb2xsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCIxNTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxDb250YWluZXJdPVwiJy5yYXRpbmctY29tbWVudHMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb21Sb290XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVkKT1cImxvYWRNb3JlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgcmF0aW5nUmV2aWV3c3xcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVGaWx0ZXJWMzp7ICdmaXJzdE5hbWUnOiBzZWFyY2hLZXkudmFsdWUsICdyZXZpZXcnOiBzZWFyY2hLZXkudmFsdWUgfSA6IGZhbHNlOyBsZXQgaT0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtY2FyZC1yYXRpbmctY29tbWVudCBbcmV2aWV3XT1cImF1dGhSZXBsaWVzW2MudXNlcklkXVwiIFtjb250ZW50aWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiPjwvd3Mtd2lkZ2V0LWNhcmQtcmF0aW5nLWNvbW1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkaXNwbGF5TG9hZGVyXCIgY2xhc3M9XCJtdC01IHByLTQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc3Bpbm5lci1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMzBcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0ICpuZ0lmPVwiKHJhdGluZ1Jldmlld3MgfCBwaXBlRmlsdGVyVjM6eyAnZmlyc3ROYW1lJzogc2VhcmNoS2V5LnZhbHVlLCAncmV2aWV3Jzogc2VhcmNoS2V5LnZhbHVlIH0gOiBmYWxzZSk/Lmxlbmd0aCA8PTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGRpc3BsYXlMb2FkZXIgID09PSBmYWxzZSlcIiBjbGFzcz1cInctZnVsbCB0ZXh0LWxlZnQgd3MtbWF0LWJsYWNrNjAtdGV4dCBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snYXBwdG9jc2luZ2xlcGFnZS5ub1Jldmlld3NGb3VuZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbWF0LXRhYj5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwie3snYXBwdG9jc2luZ2xlcGFnZS5jb250ZW50JyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCJjb250ZW50Py5jaGlsZHJlbj8ubGVuZ3RoXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XHJcbiAgICAgICAgICAgIDxzZWN0aW9uIGlkPVwiY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeGVkLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdzLWFwcC1hcHAtdG9jLWNvbnRlbnRzIFtiYXRjaElkXT1cImJhdGNoSWRcIiBbY29udGVudF09XCJjb250ZW50XCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvd3MtYXBwLWFwcC10b2MtY29udGVudHM+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L21hdC10YWI+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cInt7J2FwcHRvY3NpbmdsZXBhZ2Uuc2Vzc2lvbnMnIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cImNvbnRlbnQ/LmNoaWxkcmVuPy5sZW5ndGggJiYgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSlcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cclxuICAgICAgICAgICAgPHNlY3Rpb24gaWQ9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8d3MtYXBwLWFwcC10b2Mtc2Vzc2lvbnMgW2JhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiICBbY29udGVudF09XCJjb250ZW50XCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb25maWddPVwidG9jQ29uZmlnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC93cy1hcHAtYXBwLXRvYy1zZXNzaW9ucz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbWF0LXRhYj5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwie3snYXBwdG9jc2luZ2xlcGFnZS5kaXNjdXNzaW9uJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhZm9yUHJldmlld1wiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICA8c2VjdGlvbiBpZD1cImRpc2N1c3Npb24tZm9ydW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aCB0b2MtZGlzY3Vzc2lvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDx3cy1hcHAtdG9jLWRpc2N1c3Npb24gW2NvbnRlbnRdPVwiY29udGVudFwiIGNsYXNzPVwiZGlzY3Vzc2lvblwiPjwvd3MtYXBwLXRvYy1kaXNjdXNzaW9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8YWxsLWRpc2N1c3Npb24td2lkZ2V0IHN0eWxlPScgd2lkdGg6IDEwMCU7JyBbY29uZmlnXT1cImRpc2N1c3Npb25Db25maWdcIj48L2FsbC1kaXNjdXNzaW9uLXdpZGdldD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbWF0LXRhYj5cclxuPC9tYXQtdGFiLWdyb3VwPlxyXG5cclxuPCEtLSA8c2VjdGlvbiBpZD1cImNvaG9ydHNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmaXhlZC13aWR0aCB0b2MtZGlzY3Vzc2lvbi1jb250YWluZXJcIj5cclxuICAgICAgICA8d3MtYXBwLXRvYy1jb2hvcnRzIFtjb250ZW50XT1cImNvbnRlbnRcIiBjbGFzcz1cImNvaG9ydHNcIj48L3dzLWFwcC10b2MtY29ob3J0cz5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+IC0tPlxyXG5cclxuPG5nLXRlbXBsYXRlICN1bml0Q29ob3J0TmV3MSBsZXQtdXNlcj1cInVzZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1bml0LWNvaG9ydCBzbTpwci04IG1kOnByLTEwXCI+XHJcbiAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC1zXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCIgW3Bob3RvVXJsXT1cInVzZXIucGhvdG8gfHwgJydcIlxyXG4gICAgICAgICAgICBbbmFtZV09XCJnZXRVc2VyRnVsbE5hbWUodXNlcilcIj5cclxuICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi1sZWZ0LWxcIj5cclxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZ29Ub1VzZXJQcm9maWxlKHVzZXIpXCIgW25nQ2xhc3NdPVwieydjdXJzb3ItcG9pbnRlcic6IGVuYWJsZVBlb3BsZVNlYXJjaH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3aWR0aC1leHBhbmQgcGFkZGluZy1sZWZ0LXhzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWJvZHktMSBjb2hvcnRzLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgIHsgZmlyc3ROYW1lOiB1c2VyLmZpcnN0X25hbWUsIGVtYWlsOiB1c2VyLmVtYWlsIH1cclxuICAgICAgICAgICAgICAgICAgICB8IHBpcGVOYW1lVHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXQtYm9keS0yIHdzLW1hdC1ibGFjazYwLXRleHRcIj57eydhcHB0b2NzaW5nbGVwYWdlLmN1cmF0b3InIHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjdW5pdENvaG9ydE5ldyBsZXQtdXNlcj1cInVzZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1bml0LWNvaG9ydCBzbTpwci04IG1kOnByLTEwXCI+XHJcbiAgICAgICAgPCEtLSA8d3Mtd2lkZ2V0LXVzZXItaW1hZ2UgY2xhc3M9XCJ1c2VyLWltYWdlXCIgW2ltYWdlVHlwZV09XCIndXNlci1waG90bydcIiBbdXNlck5hbWVdPVwiZ2V0VXNlckZ1bGxOYW1lKHVzZXIpXCJcclxuICAgICAgICBbaW1hZ2VTaXplXT1cIidzbWFsbCdcIiBbZW1haWxdPVwidXNlci5lbWFpbFwiIFtpbWFnZVVybF09XCJ1c2VyLnBob3RvIHx8ICcnXCI+PC93cy13aWRnZXQtdXNlci1pbWFnZT4gLS0+XHJcbiAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC1zXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCIgW3Bob3RvVXJsXT1cInVzZXIucGhvdG8gfHwgJydcIlxyXG4gICAgICAgICAgICBbbmFtZV09XCJnZXRVc2VyRnVsbE5hbWUodXNlcilcIj5cclxuICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi1sZWZ0LWxcIj5cclxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZ29Ub1VzZXJQcm9maWxlKHVzZXIpXCIgW25nQ2xhc3NdPVwieydjdXJzb3ItcG9pbnRlcic6IGVuYWJsZVBlb3BsZVNlYXJjaH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3aWR0aC1leHBhbmQgcGFkZGluZy1sZWZ0LXhzXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtYXQtYm9keS0xIGNvaG9ydHMtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICB7IGZpcnN0TmFtZTogdXNlci5maXJzdF9uYW1lLCBsYXN0TmFtZTogdXNlci5sYXN0X25hbWUsIGVtYWlsOiB1c2VyLmVtYWlsIH1cclxuICAgICAgICAgICAgICAgICAgICB8IHBpcGVOYW1lVHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNvbm5lY3Rpb24tbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIFtob3ZlclVzZXJdPVwie2ZpcnN0TmFtZTogdXNlci5maXJzdF9uYW1lLCBpZDp1c2VyLnVpZCxkZXNpZ25hdGlvbjogdXNlci5kZXNpZ25hdGlvbixkZXBhcnRtZW50OnVzZXIuZGVwYXJ0bWVudH1cIj5cclxuICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWNvbm5lY3Rpb24tbmFtZT5cclxuICAgICAgICAgICAgICAgIDwhLS0ge3t1c2VyIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXQtYm9keS0yIHdzLW1hdC1ibGFjazYwLXRleHRcIj57e3VzZXIuZGVzaWduYXRpb259fTwvcD5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm1hdC1jYXB0aW9uIGNvaG9ydHMtZGVzY1wiPnt7IHVzZXIuZGVzYyB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZHRoLWF1dG8gdXNlci1hY3Rpb24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDx3cy13aWRnZXQtYnRuLW1haWwtdXNlciBbd2lkZ2V0RGF0YV09XCJ7IGNvbnRlbnQ6IGNvbnRlbnQsIGVtYWlsczogW3VzZXIuZW1haWxdLCB1c2VyOiB1c2VyIH1cIj5cclxuICAgICAgICAgICAgPC93cy13aWRnZXQtYnRuLW1haWwtdXNlcj5cclxuICAgICAgICAgICAgPHdzLXdpZGdldC1idG4tY2FsbCAqbmdJZj1cInVzZXIucGhvbmVfTm8gIT09ICcwJ1wiIFt3aWRnZXREYXRhXT1cIntcclxuICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZTpcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0TmFtZTogdXNlci5maXJzdF9uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0TmFtZTogdXNlci5sYXN0X25hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsXHJcbiAgICAgICAgICAgICAgICAgICAgfSB8IHBpcGVOYW1lVHJhbnNmb3JtLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogdXNlci5waG9uZV9Ob1xyXG4gICAgICAgICAgICAgICAgfVwiPjwvd3Mtd2lkZ2V0LWJ0bi1jYWxsPiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19