@sunbird-cb/toc 0.0.9 → 0.0.10-mauritius

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 (346) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -55
  4. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -126
  5. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -32
  6. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -85
  7. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -100
  8. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -48
  9. package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
  10. package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
  11. package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
  12. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +223 -120
  13. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +96 -92
  14. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -48
  15. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -25
  16. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -41
  17. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -89
  18. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -42
  19. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -41
  20. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -78
  21. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -45
  22. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -2
  23. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -70
  24. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -28
  25. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -187
  26. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -86
  27. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -31
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +961 -941
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -183
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -327
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -297
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +304 -248
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1227 -1148
  34. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -16
  35. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -43
  36. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -133
  37. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -66
  38. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -278
  39. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -21
  40. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -21
  41. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +835 -847
  42. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +224 -219
  43. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +276 -209
  44. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -26
  45. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -19
  46. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -23
  47. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -113
  48. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -110
  49. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -26
  50. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -19
  51. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -67
  52. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -28
  53. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -77
  54. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -2
  55. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -61
  56. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -20
  57. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -67
  58. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -139
  59. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -71
  60. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -34
  61. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -56
  62. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -25
  63. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -37
  64. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -32
  65. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -30
  66. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -38
  67. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -51
  68. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -115
  69. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -12
  70. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -51
  71. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -61
  72. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -87
  73. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -36
  74. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -62
  75. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -24
  76. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -192
  77. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -44
  78. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -99
  79. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -58
  80. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -67
  81. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +115 -112
  82. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -2
  83. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -69
  84. package/esm2022/lib/_collection-api.mjs +57 -57
  85. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -19
  86. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -68
  87. package/esm2022/lib/_models/common.model.mjs +2 -2
  88. package/esm2022/lib/_models/error.model.mjs +2 -2
  89. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -24
  90. package/esm2022/lib/_services/rating.service.mjs +89 -89
  91. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -29
  92. package/esm2022/lib/_services/viewer-route-util.mjs +103 -103
  93. package/esm2022/lib/_services/widget-content.model.mjs +254 -247
  94. package/esm2022/lib/_services/widget-content.service.mjs +594 -594
  95. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -9
  96. package/esm2022/lib/app-toc-lib.module.mjs +508 -499
  97. package/esm2022/lib/collection.config.mjs +161 -161
  98. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -37
  99. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -1436
  100. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +522 -475
  101. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -119
  102. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -80
  103. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -249
  104. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -39
  105. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -58
  106. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2230 -2229
  107. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +3017 -2907
  108. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -157
  109. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -48
  110. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -47
  111. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -766
  112. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -243
  113. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -116
  114. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -44
  115. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1854 -1838
  116. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -236
  117. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -213
  118. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -36
  119. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +258 -256
  120. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -133
  121. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -36
  122. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -2
  123. package/esm2022/lib/models/app-toc.model.mjs +38 -38
  124. package/esm2022/lib/models/auto-complete.model.mjs +2 -2
  125. package/esm2022/lib/models/card-content.model.mjs +13 -13
  126. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -2
  127. package/esm2022/lib/models/discussion-forum.model.mjs +14 -14
  128. package/esm2022/lib/models/goal.model.mjs +2 -2
  129. package/esm2022/lib/models/meta-tag.model.mjs +8 -8
  130. package/esm2022/lib/models/playlist.model.mjs +2 -2
  131. package/esm2022/lib/models/profile-revamp.model.mjs +2 -2
  132. package/esm2022/lib/models/rating.model.mjs +2 -2
  133. package/esm2022/lib/models/user-profile.model.mjs +21 -21
  134. package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
  135. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -24
  136. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -24
  137. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -60
  138. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -25
  139. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -106
  140. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -25
  141. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -25
  142. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -25
  143. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -51
  144. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -16
  145. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -18
  146. package/esm2022/lib/services/access-control.service.mjs +56 -56
  147. package/esm2022/lib/services/action.service.mjs +23 -23
  148. package/esm2022/lib/services/app-toc-v2.service.mjs +368 -313
  149. package/esm2022/lib/services/app-toc.service.mjs +1577 -1613
  150. package/esm2022/lib/services/certificate.service.mjs +114 -69
  151. package/esm2022/lib/services/discuss-utils.service.mjs +45 -58
  152. package/esm2022/lib/services/editor.service.mjs +34 -34
  153. package/esm2022/lib/services/load-check.service.mjs +21 -21
  154. package/esm2022/lib/services/loader.service.mjs +33 -33
  155. package/esm2022/lib/services/mobile-apps.service.mjs +67 -67
  156. package/esm2022/lib/services/netcore.service.mjs +126 -56
  157. package/esm2022/lib/services/nps-grid.service.mjs +43 -31
  158. package/esm2022/lib/services/otp.service.mjs +81 -43
  159. package/esm2022/lib/services/profile-v2.service.mjs +71 -43
  160. package/esm2022/lib/services/reset-ratings.service.mjs +19 -19
  161. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -64
  162. package/esm2022/lib/services/root.service.mjs +106 -0
  163. package/esm2022/lib/services/timer.service.mjs +23 -23
  164. package/esm2022/lib/services/title-tag.service.mjs +71 -71
  165. package/esm2022/lib/services/user-profile.service.mjs +180 -55
  166. package/esm2022/lib/services/viewer-data.service.mjs +64 -64
  167. package/esm2022/lib/services/viewer-util.service.mjs +627 -590
  168. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -291
  169. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -119
  170. package/esm2022/public-api.mjs +81 -71
  171. package/esm2022/sunbird-cb-toc.mjs +4 -4
  172. package/fesm2022/sunbird-cb-toc.mjs +27145 -24836
  173. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  174. package/index.d.ts +5 -5
  175. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
  176. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
  177. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -16
  178. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -31
  179. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -15
  180. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -20
  181. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -22
  182. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -15
  183. package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
  184. package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
  185. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
  186. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +31 -22
  187. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -22
  188. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -9
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -11
  190. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -12
  191. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -18
  192. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -14
  193. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -11
  194. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -17
  195. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -14
  196. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -199
  197. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -16
  198. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -10
  199. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -38
  200. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -19
  201. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -11
  202. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +187 -183
  203. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -41
  204. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -54
  205. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -47
  206. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +56 -49
  207. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +195 -171
  208. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -8
  209. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -16
  210. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -40
  211. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -21
  212. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -45
  213. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -10
  214. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -10
  215. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +131 -128
  216. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -51
  217. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +32 -29
  218. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -9
  219. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -7
  220. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -7
  221. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -28
  222. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -24
  223. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -14
  224. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -9
  225. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -12
  226. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -10
  227. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -22
  228. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -8
  229. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -18
  230. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -8
  231. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -15
  232. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -35
  233. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -19
  234. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -14
  235. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -13
  236. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -11
  237. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -11
  238. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -15
  239. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -10
  240. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -16
  241. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -11
  242. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -34
  243. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -17
  244. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -15
  245. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -15
  246. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -21
  247. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -12
  248. package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -21
  249. package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -9
  250. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -47
  251. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -14
  252. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -22
  253. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -19
  254. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -15
  255. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +26 -25
  256. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -21
  257. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -18
  258. package/lib/_collection-api.d.ts +34 -34
  259. package/lib/_constants/widget-content.constants.d.ts +7 -7
  260. package/lib/_directives/tooltip.directive.d.ts +17 -17
  261. package/lib/_models/common.model.d.ts +3 -3
  262. package/lib/_models/error.model.d.ts +5 -5
  263. package/lib/_pipes/highlight.pipe.d.ts +10 -10
  264. package/lib/_services/rating.service.d.ts +18 -18
  265. package/lib/_services/samuhik-charcha.service.d.ts +13 -13
  266. package/lib/_services/viewer-route-util.d.ts +8 -8
  267. package/lib/_services/widget-content.model.d.ts +521 -515
  268. package/lib/_services/widget-content.service.d.ts +101 -101
  269. package/lib/_shared/translate-loader.factory.d.ts +7 -7
  270. package/lib/app-toc-lib.module.d.ts +89 -88
  271. package/lib/collection.config.d.ts +159 -159
  272. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -17
  273. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -225
  274. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +83 -78
  275. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -22
  276. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -31
  277. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -47
  278. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -14
  279. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -21
  280. package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -314
  281. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +418 -408
  282. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -47
  283. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -22
  284. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -14
  285. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -149
  286. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -42
  287. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -27
  288. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -15
  289. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +197 -195
  290. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -44
  291. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -54
  292. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -18
  293. package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -43
  294. package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -20
  295. package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -13
  296. package/lib/models/app-toc-analytics.model.d.ts +152 -152
  297. package/lib/models/app-toc.model.d.ts +84 -84
  298. package/lib/models/auto-complete.model.d.ts +27 -27
  299. package/lib/models/card-content.model.d.ts +19 -19
  300. package/lib/models/content-strip-with-tabs.model.d.ts +44 -44
  301. package/lib/models/discussion-forum.model.d.ts +40 -40
  302. package/lib/models/goal.model.d.ts +22 -22
  303. package/lib/models/meta-tag.model.d.ts +6 -6
  304. package/lib/models/playlist.model.d.ts +23 -23
  305. package/lib/models/profile-revamp.model.d.ts +14 -14
  306. package/lib/models/rating.model.d.ts +17 -17
  307. package/lib/models/user-profile.model.d.ts +124 -37
  308. package/lib/registration-toc-lib.config.d.ts +4 -0
  309. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -12
  310. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -12
  311. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -16
  312. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -12
  313. package/lib/resolvers/app-toc-resolver.service.d.ts +16 -16
  314. package/lib/resolvers/config-resolver.service.d.ts +11 -11
  315. package/lib/resolvers/profile-resolver.service.d.ts +11 -11
  316. package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -11
  317. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -19
  318. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -8
  319. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -8
  320. package/lib/services/access-control.service.d.ts +29 -29
  321. package/lib/services/action.service.d.ts +9 -9
  322. package/lib/services/app-toc-v2.service.d.ts +17 -16
  323. package/lib/services/app-toc.service.d.ts +190 -235
  324. package/lib/services/certificate.service.d.ts +41 -42
  325. package/lib/services/discuss-utils.service.d.ts +11 -33
  326. package/lib/services/editor.service.d.ts +17 -17
  327. package/lib/services/load-check.service.d.ts +8 -8
  328. package/lib/services/loader.service.d.ts +16 -16
  329. package/lib/services/mobile-apps.service.d.ts +38 -38
  330. package/lib/services/netcore.service.d.ts +21 -33
  331. package/lib/services/nps-grid.service.d.ts +16 -15
  332. package/lib/services/otp.service.d.ts +15 -20
  333. package/lib/services/profile-v2.service.d.ts +17 -20
  334. package/lib/services/reset-ratings.service.d.ts +8 -8
  335. package/lib/services/resource-download-helper.service.d.ts +29 -29
  336. package/lib/services/root.service.d.ts +26 -0
  337. package/lib/services/timer.service.d.ts +9 -9
  338. package/lib/services/title-tag.service.d.ts +21 -21
  339. package/lib/services/user-profile.service.d.ts +44 -24
  340. package/lib/services/viewer-data.service.d.ts +62 -58
  341. package/lib/services/viewer-util.service.d.ts +76 -76
  342. package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -56
  343. package/lib/share-toc/share-toc.module.d.ts +32 -32
  344. package/package.json +3 -3
  345. package/public-api.d.ts +65 -56
  346. package/sunbird-cb-toc-0.0.10-mauritius.tgz +0 -0
@@ -1,847 +1,835 @@
1
- import { Component, EventEmitter, HostListener, Inject, Input, Output, ViewChild, ViewChildren } from '@angular/core';
2
- import { NsContent, WsEvents } from '@sunbird-cb/utils-v2';
3
- import { AiTutorConfirmPopupComponent } from './ai-tutor-confirm-popup/ai-tutor-confirm-popup.component';
4
- import { MatLegacyDialogConfig as MatDialogConfig } from '@angular/material/legacy-dialog';
5
- import { viewerRouteGenerator } from '../../../_services/viewer-route-util';
6
- import { VttFile } from '@polyflix/vtt-parser';
7
- import { tap } from 'rxjs/operators';
8
- import { MatTab } from '@angular/material/tabs';
9
- import * as _ from 'lodash';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/router";
12
- import * as i2 from "@sunbird-cb/utils-v2";
13
- import * as i3 from "../../../services/load-check.service";
14
- import * as i4 from "@angular/material/legacy-dialog";
15
- import * as i5 from "../../../services/app-toc.service";
16
- import * as i6 from "../../../services/action.service";
17
- import * as i7 from "../../../services/viewer-data.service";
18
- import * as i8 from "../../../_services/samuhik-charcha.service";
19
- import * as i9 from "@angular/common";
20
- import * as i10 from "@angular/material/icon";
21
- import * as i11 from "@angular/material/tabs";
22
- import * as i12 from "@sunbird-cb/discussion-v2";
23
- import * as i13 from "@angular/material/form-field";
24
- import * as i14 from "@angular/material/select";
25
- import * as i15 from "@angular/material/core";
26
- import * as i16 from "./app-toc-about/app-toc-about.component";
27
- import * as i17 from "./app-toc-content/app-toc-content.component";
28
- import * as i18 from "./app-toc-teachers-notes/app-toc-teachers-notes.component";
29
- import * as i19 from "./app-toc-batch-assignments/app-toc-batch-assignments.component";
30
- import * as i20 from "./samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component";
31
- import * as i21 from "@ngx-translate/core";
32
- import * as i22 from "../../../_pipes/highlight.pipe";
33
- export class ContentTocComponent {
34
- constructor(route, utilityService, loadCheckService, configService, dialog, tocSvc, actionSVC, router, eventSvc, viewerDataSvc, samuhikCharchaSvc, environment) {
35
- this.route = route;
36
- this.utilityService = utilityService;
37
- this.loadCheckService = loadCheckService;
38
- this.configService = configService;
39
- this.dialog = dialog;
40
- this.tocSvc = tocSvc;
41
- this.actionSVC = actionSVC;
42
- this.router = router;
43
- this.eventSvc = eventSvc;
44
- this.viewerDataSvc = viewerDataSvc;
45
- this.samuhikCharchaSvc = samuhikCharchaSvc;
46
- this.environment = environment;
47
- this.tabChangeValue = '';
48
- this.changeTab = false;
49
- this.routeSubscription = null;
50
- this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
51
- this.contentTabFlag = true;
52
- this.resumeData = null;
53
- this.batchData = null;
54
- this.skeletonLoader = false;
55
- this.tocStructure = {};
56
- this.fromViewer = false;
57
- this.hierarchyMapData = {};
58
- this.playResourceId = '';
59
- this.sideNavBarOpened = false;
60
- this.languageList = [];
61
- this.lockCertificate = false;
62
- this.playResumeForAI = new EventEmitter();
63
- this.enrollUserToAI = new EventEmitter();
64
- this.trigerCompletionSurveyForm = new EventEmitter();
65
- this.resumeContent = new EventEmitter();
66
- this.commentId = '';
67
- this.sticky = false;
68
- this.isMobile = false;
69
- this.selectedTabIndex = 0;
70
- this.teacherNotesFlag = false;
71
- this.referenceNotesFlag = false;
72
- this.viewerPage = window.location.href.includes('/viewer/') ? true : false;
73
- this.enableAITutorFlag = false;
74
- this.enableTranscriptionFlag = false;
75
- this.courseCategory = NsContent.ECourseCategory;
76
- this.subTitles$ = null;
77
- this.resourceIdentifier$ = null;
78
- this.subTitles = [];
79
- this.keywordToHighlight = '';
80
- this.highlightCondition = false;
81
- this.vttLangArr = [];
82
- this.transcriptionActiveLanguage = 'en';
83
- this.defaultTranscriptLanguage = 'en';
84
- this.transriptionLanguageSub = null;
85
- this.fromAITutor = false;
86
- this.totalResource = 0;
87
- this.scormAssessmentCount = 0;
88
- this.showAITutorPopup = false;
89
- this.fromAISelectedTabIndex = false;
90
- this.isMobileForAI = false;
91
- this.transcriptActiveLanguageText = 'English';
92
- this.showAssignmentsTab = false;
93
- this.enableSamuhikCharchaTab = false;
94
- }
95
- ngOnInit() {
96
- if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig?.aiTutor?.all) {
97
- // console.log('this.contentReadData--', this.route.snapshot.data)
98
- this.enableAITutorFlag = this.onlyscormAssessmentExists(this.route.snapshot?.data?.content?.data?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
99
- // this.enableAITutorFlag = true
100
- }
101
- else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig?.aiTutor?.forOrg && this.configService.iGOTAIConfig.aiTutor?.forOrg?.length &&
102
- this.configService.iGOTAIConfig?.aiTutor?.forOrg.includes(this.configService.userProfile?.rootOrgId)) {
103
- // console.log('this.contentReadData--', this.route.snapshot.data)
104
- this.enableAITutorFlag = this.onlyscormAssessmentExists(this.route.snapshot?.data?.content?.data?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
105
- // this.enableAITutorFlag = true
106
- }
107
- else {
108
- this.enableAITutorFlag = false;
109
- }
110
- if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription?.all) {
111
- // console.log('in')
112
- // this.resourceIdentifier$ = this.tocSvc.transriptionIdentifier.subscribe((value:any)=>{
113
- // // console.log('resource identifier', value)
114
- // if(value && value?.identifier) {
115
- // this.resourceIdentifier = value?.identifier //value?.identifier // do_1138891198489067521147
116
- // this.parseVTT()
117
- // }
118
- // })
119
- this.subTitles$ = this.tocSvc.transcriptionData$.subscribe((value) => {
120
- // console.log('value', value)
121
- this.keywordToHighlight = value;
122
- });
123
- this.transriptionLanguageSub = this.tocSvc.transriptionActiveLanguageDataObject$
124
- .pipe(tap((langvalue) => console.log('tap langvalue:', langvalue)))
125
- .subscribe((langvalue) => {
126
- // console.log('langValue', langvalue);
127
- if (langvalue) {
128
- // this.renderSelectedLanguageTranscription();
129
- }
130
- });
131
- this.enableTranscriptionFlag = true;
132
- }
133
- else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription && this.configService.iGOTAIConfig?.transcription?.forOrg && this.configService.iGOTAIConfig?.transcription?.forOrg?.length &&
134
- this.configService.iGOTAIConfig?.transcription?.forOrg?.includes(this.configService.userProfile?.rootOrgId)) {
135
- // console.log('in')
136
- // this.resourceIdentifier$ = this.tocSvc.transriptionIdentifier.subscribe((value:any)=>{
137
- // // console.log('resource identifier', value)
138
- // if(value && value?.identifier) {
139
- // this.resourceIdentifier = value?.identifier //value?.identifier // do_1138891198489067521147
140
- // this.parseVTT()
141
- // }
142
- // })
143
- this.subTitles$ = this.tocSvc.transcriptionData$.subscribe((value) => {
144
- // console.log('value', value)
145
- this.keywordToHighlight = value;
146
- });
147
- this.transriptionLanguageSub = this.tocSvc.transriptionActiveLanguageDataObject$
148
- .pipe(tap((langvalue) => console.log('tap langvalue:', langvalue)))
149
- .subscribe((langvalue) => {
150
- // console.log('langValue', langvalue);
151
- if (langvalue) {
152
- // this.renderSelectedLanguageTranscription();
153
- }
154
- });
155
- this.enableTranscriptionFlag = true;
156
- }
157
- else {
158
- this.enableTranscriptionFlag = false;
159
- }
160
- const batchId = this.route.snapshot.queryParams.batchId ?
161
- this.route.snapshot.queryParams.batchId : '';
162
- if (batchId) {
163
- this.selectedTabIndex = 1;
164
- }
165
- this.commentId = this.route.snapshot.queryParams.commentId ? this.route.snapshot.queryParams.commentId : '';
166
- if (this.commentId) {
167
- this.selectedTabIndex = 2;
168
- }
169
- }
170
- ngAfterViewInit() {
171
- this.isMobile = this.utilityService.isMobile;
172
- if (window.innerWidth < 1480) {
173
- this.isMobileForAI = true;
174
- }
175
- else {
176
- this.isMobileForAI = false;
177
- }
178
- this.menuPosition = this.tabElement._elementRef.nativeElement.offsetTop;
179
- this.route.queryParamMap.subscribe(async (params) => {
180
- let fromAITutor = params.get('fromAITutor');
181
- if ((fromAITutor === 'true' || fromAITutor === true) && this.isMobile) {
182
- setTimeout(() => {
183
- const tabsArray = this.tabs?.toArray();
184
- let index = tabsArray?.findIndex(tab => tab.textLabel.trim() === "AI Tutor".trim());
185
- if (index > -1) {
186
- this.selectedTabIndex = index;
187
- this.fromAISelectedTabIndex = true;
188
- }
189
- }, 3000);
190
- }
191
- });
192
- }
193
- get getCurrentTimeInUTC() {
194
- const currentDate = new Date();
195
- const isoString = currentDate.toISOString();
196
- return isoString.replace('Z', '+0000');
197
- }
198
- async getSamuhikConfig() {
199
- try {
200
- this.samuhikConfig = await this.samuhikCharchaSvc.fetchConfigFile().toPromise();
201
- }
202
- catch (error) {
203
- }
204
- }
205
- async ngOnChanges(changes) {
206
- this.resourceIdentifier = this.viewerDataSvc.resourceId;
207
- if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription?.all) {
208
- this.enableTranscriptionFlag = true;
209
- }
210
- else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription && this.configService.iGOTAIConfig?.transcription?.forOrg && this.configService.iGOTAIConfig?.transcription?.forOrg?.length &&
211
- this.configService.iGOTAIConfig?.transcription?.forOrg?.includes(this.configService?.userProfile?.rootOrgId)) {
212
- this.enableTranscriptionFlag = true;
213
- }
214
- else {
215
- this.enableTranscriptionFlag = false;
216
- }
217
- if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig.aiTutor?.all) {
218
- // console.log('this.contentReadData--', this.route.snapshot.data)
219
- this.enableAITutorFlag = this.onlyscormAssessmentExists(this.content?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
220
- // this.enableAITutorFlag = true
221
- }
222
- else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig?.aiTutor?.forOrg && this.configService.iGOTAIConfig?.aiTutor?.forOrg?.length
223
- && this.configService.iGOTAIConfig.aiTutor?.forOrg?.includes(this.configService?.userProfile?.rootOrgId)) {
224
- this.enableAITutorFlag = this.onlyscormAssessmentExists(this.content?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
225
- }
226
- else {
227
- this.enableAITutorFlag = false;
228
- }
229
- if (changes && changes['playResourceId']) {
230
- if (changes?.playResourceId?.previousValue !== changes?.playResourceId?.currentValue) {
231
- if (this.viewerPage && this.viewerDataSvc?.resourceId && this.enableTranscriptionFlag) {
232
- this.parseVTT();
233
- }
234
- }
235
- }
236
- if (changes.changeTab && changes.changeTab.currentValue && !this.fromAISelectedTabIndex) {
237
- this.selectedTabIndex = 1;
238
- }
239
- if (this.route.snapshot.data.pageData && this.route.snapshot.data.pageData.data) {
240
- this.config = this.route.snapshot.data.pageData.data;
241
- }
242
- if (this.config && this.config.discussWidgetData) {
243
- this.discussWidgetData = this.config.discussWidgetData;
244
- if (this.baseContentReadData && this.baseContentReadData.identifier) {
245
- // console.log('this.content.identifier', this.content.identifier)
246
- if (!this.discussWidgetData.newCommentSection.commentTreeData.entityId) {
247
- this.discussWidgetData.newCommentSection.commentTreeData.entityId = this.baseContentReadData.identifier;
248
- }
249
- if (this.discussWidgetData.commentsList.repliesSection && this.discussWidgetData.commentsList.repliesSection.newCommentReply) {
250
- this.discussWidgetData.commentsList.repliesSection.newCommentReply.commentTreeData.entityId = this.baseContentReadData.identifier;
251
- }
252
- }
253
- if (this.isEnrolled) {
254
- if (this.content && this.content.primaryCategory === NsContent.ECourseCategory.BLENDED_PROGRAM) {
255
- this.showAssignmentsTab = true;
256
- }
257
- this.discussWidgetData.enrolledContent = true;
258
- this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Start a discussion';
259
- }
260
- else {
261
- this.discussWidgetData.enrolledContent = false;
262
- this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Enrol to add your comments';
263
- }
264
- if (this.commentId) {
265
- this.discussWidgetData.newCommentSection.show = false;
266
- }
267
- this.discussWidgetData = { ...this.discussWidgetData };
268
- }
269
- if (this.contentReadData && this.contentReadData?.eventLinked?.length) {
270
- const orgId = _.get(this.configService, 'userProfile.userRootOrg.id', '');
271
- await this.getSamuhikConfig();
272
- const eventsLinked = this.contentReadData.eventLinked || [];
273
- let eventsData = [];
274
- this.samuhikConfig?.strips[0].tabs.forEach((ele) => {
275
- ele.request.searchV6.request.filters.identifier = eventsLinked;
276
- ele.request.searchV6.request.filters.createdFor = [orgId];
277
- if (ele.request.searchV6.request.filters.endDateTime.hasOwnProperty('>=')) {
278
- ele.request.searchV6.request.filters.endDateTime['>='] = this.getCurrentTimeInUTC;
279
- }
280
- if (ele.request.searchV6.request.filters.endDateTime.hasOwnProperty('<')) {
281
- ele.request.searchV6.request.filters.endDateTime['<'] = this.getCurrentTimeInUTC;
282
- }
283
- this.samuhikCharchaSvc.getSearchV6Results(ele.request.searchV6).subscribe((res) => {
284
- if (res && res.result && res.result.count && res.result?.Event && res.result.Event?.length) {
285
- for (let eve = 0; eve < res.result.Event?.length; eve++) {
286
- if (res.result.Event[eve]['createdFor'] && res.result.Event[eve]['createdFor'].length &&
287
- res.result.Event[eve]['resourceType'] === 'Samuhik Charcha')
288
- eventsData.push(res.result.Event[eve]['createdFor'][0]);
289
- if (eventsData.includes(this.configService.userProfile?.rootOrgId)) {
290
- this.enableSamuhikCharchaTab = true;
291
- }
292
- }
293
- }
294
- });
295
- });
296
- }
297
- if (this.contentReadData && this.contentReadData.referenceNodes) {
298
- this.contentReadData.referenceNodes.forEach((item) => {
299
- let userRoles = this.configService?.userRoles || new Set();
300
- let hasEducatorRole = false;
301
- // Check if user has MENTOR role
302
- if (userRoles.has('MENTOR') ||
303
- userRoles.has('mentor') ||
304
- userRoles.has('Mentor')) {
305
- hasEducatorRole = true;
306
- }
307
- // Check local storage for survey response only if URL contains 'public' or 'preview=true'
308
- if (!hasEducatorRole && this.forPreview) {
309
- const surveyId = this.environment.publicContentSurveyId || '';
310
- const courseId = this.contentReadData?.identifier || '';
311
- const storageKey = `survey_${surveyId}_${courseId}`;
312
- const storedData = localStorage.getItem(storageKey);
313
- if (storedData) {
314
- try {
315
- const surveyResponses = JSON.parse(storedData);
316
- const educatorQuestion = surveyResponses.find((response) => response.question === 'Are you an Educator/Faculty member?');
317
- if (educatorQuestion && educatorQuestion.answer === 'Yes') {
318
- hasEducatorRole = true;
319
- }
320
- }
321
- catch (error) {
322
- console.error('Error parsing survey data from local storage:', error);
323
- }
324
- }
325
- }
326
- // Set teacherNotesFlag if user has educator role
327
- if (hasEducatorRole) {
328
- if (item && item.resourceCategory && item.resourceCategory === 'Teachers Resource') {
329
- this.teacherNotesFlag = true;
330
- }
331
- }
332
- if (item && item.resourceCategory && item.resourceCategory === 'Reference Resource') {
333
- this.referenceNotesFlag = true;
334
- }
335
- });
336
- }
337
- if (this.sideNavBarOpened) {
338
- if (window.innerWidth < 1480) {
339
- if (this.isMobileForAI) {
340
- this.isMobileForAI = false;
341
- }
342
- }
343
- else {
344
- this.isMobileForAI = false;
345
- }
346
- }
347
- else {
348
- if (window.innerWidth < 1480) {
349
- this.isMobileForAI = true;
350
- }
351
- else {
352
- this.isMobileForAI = false;
353
- }
354
- }
355
- }
356
- handleScroll() {
357
- const windowScroll = window.scrollY;
358
- if (windowScroll >= (this.menuPosition - ((this.isMobile) ? 96 : 104))) {
359
- this.sticky = true;
360
- }
361
- else {
362
- this.sticky = false;
363
- }
364
- }
365
- handleTabChange(event) {
366
- this.tabChangeValue = event.tab;
367
- this.selectedTabIndex = event.index;
368
- this.loadCheckService.componentLoaded(true);
369
- // console.log('event', event)
370
- // console.log('this.content', this.viewerDataSvc?.resourceId)
371
- if (event && event.tab.textLabel === 'AI Tutor') {
372
- this.showAITutorPopup = true;
373
- }
374
- if (event && event.index === 0 && event.tab.textLabel === 'Transcription') {
375
- this.raiseTranscriptionTabStartTelemetry();
376
- setTimeout(() => {
377
- this.raiseTranscriptionTabInteractTelemetry();
378
- }, 1000);
379
- }
380
- else {
381
- this.raiseTranscriptionTabStopTelemetry();
382
- }
383
- }
384
- showAiTutorConfirmPopup() {
385
- this.raiseAIPopupStartTelemetry();
386
- if (this.isEnrolled) {
387
- this.fromAITutor = true;
388
- setTimeout(() => {
389
- this.raiseAIPopupInteractTelemetry();
390
- }, 1000);
391
- this.generateResumeDataLinkNew();
392
- setTimeout(() => {
393
- this.raiseAIPopupEndTelemetry();
394
- }, 1000);
395
- }
396
- else {
397
- setTimeout(() => {
398
- this.raiseAIPopupInteractTelemetry();
399
- }, 1000);
400
- const dialogConfig = new MatDialogConfig();
401
- dialogConfig.width = '421px';
402
- dialogConfig.data = {
403
- enroll: this.isEnrolled
404
- };
405
- const dialogRef = this.dialog.open(AiTutorConfirmPopupComponent, dialogConfig);
406
- dialogRef.afterClosed().subscribe((response) => {
407
- if (response === 'enroll') {
408
- this.fromAITutor = true;
409
- this.generateResumeDataLinkNew();
410
- }
411
- else if (response === 'needToEnroll') {
412
- this.enrollUserForAITutor();
413
- }
414
- this.raiseAIPopupEndTelemetry();
415
- });
416
- }
417
- }
418
- generateResumeDataLinkNew() {
419
- if (this.resumeData && this.content) {
420
- let resumeDataV2;
421
- if (this.content.completionPercentage === 100) {
422
- resumeDataV2 = this.getResumeDataFromList('start');
423
- }
424
- else {
425
- resumeDataV2 = this.getResumeDataFromList();
426
- }
427
- if (!resumeDataV2.mimeType) {
428
- resumeDataV2.mimeType = this.tocSvc.getMimeType(this.content, resumeDataV2.identifier);
429
- }
430
- this.resumeDataLink = viewerRouteGenerator(resumeDataV2.identifier, resumeDataV2.mimeType, this.content.identifier, this.content.contentType, this.forPreview, 'Learning Resource', this.getBatchId(), this.content.name);
431
- this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
432
- // console.log('this.resumeDataLink',this.resumeDataLink)
433
- // console.log('this.actionSVC', this.actionSVC)
434
- this.router.navigate([this.resumeDataLink.url], {
435
- queryParams: {
436
- ...this.resumeDataLink.queryParams,
437
- fromAITutor: this.fromAITutor
438
- }
439
- });
440
- // this.router.navigateByUrl(
441
- // [this.resumeDataLink.url],
442
- // {
443
- // relativeTo: this.resumeDataLink.url,
444
- // queryParams: this.resumeDataLink.queryParams,
445
- // queryParamsHandling: 'merge',
446
- // })
447
- /* tslint:disable-next-line */
448
- }
449
- else {
450
- this.playResumeForAI.emit();
451
- }
452
- }
453
- getResumeDataFromList(type) {
454
- const resumeCopy = [...this.resumeData];
455
- if (!type) {
456
- // tslint:disable-next-line:max-line-length
457
- const lastItem = resumeCopy && resumeCopy.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
458
- return {
459
- identifier: lastItem.contentId,
460
- mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
461
- };
462
- }
463
- const firstItem = resumeCopy && resumeCopy.length && resumeCopy[0];
464
- return {
465
- identifier: firstItem.contentId,
466
- mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
467
- };
468
- }
469
- getBatchId() {
470
- let batchId = '';
471
- if (this.batchData && this.batchData.content) {
472
- for (const batch of this.batchData.content) {
473
- batchId = batch.batchId;
474
- }
475
- }
476
- return batchId;
477
- }
478
- raiseAIPopupStartTelemetry() {
479
- const event = {
480
- eventType: WsEvents.WsEventType.Telemetry,
481
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
482
- data: {
483
- edata: { type: 'click', "id": "ai-tutor-toc-page", "pageid": `/app/toc/${this.content?.identifier}` },
484
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
485
- state: WsEvents.EnumTelemetrySubType.Loaded,
486
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
487
- mode: 'view',
488
- },
489
- pageContext: { pageId: '/app/toc', module: 'Learn' },
490
- from: '',
491
- to: 'Telemetry',
492
- };
493
- this.eventSvc.dispatchChatbotEvent(event);
494
- }
495
- raiseAIPopupEndTelemetry() {
496
- const event = {
497
- eventType: WsEvents.WsEventType.Telemetry,
498
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
499
- data: {
500
- edata: { type: 'click', "id": "ai-tutor-toc-page", "pageid": `/app/toc/${this.content?.identifier}` },
501
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
502
- state: WsEvents.EnumTelemetrySubType.Unloaded,
503
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
504
- mode: 'view',
505
- },
506
- pageContext: { pageId: '/app/toc', module: 'Learn' },
507
- from: '',
508
- to: 'Telemetry',
509
- };
510
- this.eventSvc.dispatchChatbotEvent(event);
511
- }
512
- raiseAIPopupInteractTelemetry() {
513
- const event = {
514
- eventType: WsEvents.WsEventType.Telemetry,
515
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
516
- data: {
517
- edata: { type: 'click', "id": "ai-tutor-toc-page", "pageid": `/app/toc/${this.content?.identifier}` },
518
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
519
- state: WsEvents.EnumTelemetrySubType.Interact,
520
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
521
- mode: 'view',
522
- },
523
- pageContext: { pageId: '/app/toc', module: 'Learn' },
524
- from: '',
525
- to: 'Telemetry',
526
- };
527
- this.eventSvc.dispatchChatbotEvent(event);
528
- }
529
- enrollUserForAITutor() {
530
- this.enrollUserToAI.emit();
531
- }
532
- async parseVTT() {
533
- let identifier = this.resourceIdentifier;
534
- // console.log('identifier--', identifier)
535
- await this.tocSvc.aiGetResourceVttFile(identifier).subscribe(async (datas) => {
536
- let data = datas?.data;
537
- if (data && data.length && data[0]['transcription_urls'] && data[0]['transcription_urls'].length) {
538
- this.vttLangArr = data[0]['transcription_urls'];
539
- this.enableTranscriptionFlag = true;
540
- // let url = data[0]['transcription_urls'][0]['uri']
541
- // console.log('this.vttLangArr--',this.vttLangArr)
542
- this.transcriptionActiveLanguage = this.vttLangArr && this.vttLangArr.length && this.vttLangArr[0] && this.vttLangArr[0]['default_lang'] ? 'en' : 'en';
543
- this.defaultTranscriptLanguage = this.vttLangArr && this.vttLangArr.length && this.vttLangArr[0] && this.vttLangArr[0]['default_lang'] ? 'en' : 'en';
544
- // console.log('this.transcriptionActiveLanguage--', this.transcriptionActiveLanguage)
545
- let selectedTranscriptionStyle = this.vttLangArr.filter((item) => {
546
- return item?.label === this.transcriptionActiveLanguage;
547
- });
548
- if (selectedTranscriptionStyle && selectedTranscriptionStyle.length) {
549
- this.selectedTranscriptionStyle = selectedTranscriptionStyle[0];
550
- }
551
- else {
552
- this.selectedTranscriptionStyle = this.vttLangArr[0];
553
- }
554
- // console.log('this.selectedTranscriptionStyle--', this.selectedTranscriptionStyle)
555
- const filteredArr = this.vttLangArr.filter((item) => item.label === this.transcriptionActiveLanguage);
556
- let url = filteredArr.length > 0 ? filteredArr[0].uri : null;
557
- //let url = this.vttLangArr.filter((item: any) => item.label === this.transcriptionActiveLanguage)[0]['uri']
558
- if (url) {
559
- const file = await VttFile.fromUrl(url);
560
- let blocks = file.getBlocks();
561
- this.subTitles = blocks;
562
- }
563
- // console.log('this.vttLangArr--',this.vttLangArr)
564
- // if(this.vttLangArr && this.vttLangArr.length) {
565
- // this.transcriptionActiveLanguage = this.vttLangArr[0]['label']
566
- // } else {
567
- // this.transcriptionActiveLanguage = this.vttLangArr[0]['default_lang']
568
- // }
569
- this.tocSvc.changeTranscriptionLanguageEvent.next({ activeLang: this.transcriptionActiveLanguage, langData: this.vttLangArr, loadPlayer: true });
570
- }
571
- else {
572
- this.vttLangArr = [];
573
- this.enableTranscriptionFlag = false;
574
- }
575
- });
576
- }
577
- async renderSelectedLanguageTranscription(_langvalue) {
578
- // this.transcriptionActiveLanguage = this.selectedTranscriptionStyle?.label
579
- if (typeof _langvalue === 'string' && _langvalue) {
580
- this.transcriptionActiveLanguage = _langvalue;
581
- }
582
- else {
583
- this.selectedTranscriptionStyle = _langvalue?.value;
584
- this.transcriptionActiveLanguage = this.selectedTranscriptionStyle?.label;
585
- this.transcriptActiveLanguageText = _langvalue?.value?.language;
586
- }
587
- this.raiseTranscriptionLanguageStartTelemetry();
588
- setTimeout(() => {
589
- this.raiseTranscriptionLanguageInteractTelemetry();
590
- });
591
- let currentPath = this.vttLangArr.filter((item) => item?.label === this.transcriptionActiveLanguage);
592
- if (currentPath && currentPath.length) {
593
- this.selectedTranscriptionStyle = currentPath[0];
594
- }
595
- const file = await VttFile.fromUrl(currentPath && currentPath[0]?.uri);
596
- let blocks = file.getBlocks();
597
- this.subTitles = blocks;
598
- this.raiseTranscriptionLanguageStopTelemetry();
599
- // this.tocSvc.changeTranscriptionLanguageEvent.next({activeLang: this.transcriptionActiveLanguage, langData: this.vttLangArr, loadPlayer:false})
600
- }
601
- openSurveyFormPopup(event) {
602
- this.trigerCompletionSurveyForm.emit(event);
603
- }
604
- playFromSlot(subtitle) {
605
- if (subtitle) {
606
- let startTime = subtitle.startTime / 1000;
607
- let endTime = subtitle.endTime / 1000;
608
- this.tocSvc.playTranscriptionVideo.next({ startTime, endTime });
609
- }
610
- }
611
- formatMsToVttTime(ms) {
612
- const totalSeconds = Math.floor(ms / 1000);
613
- // const milliseconds = ms % 1000;
614
- const hours = Math.floor(totalSeconds / 3600);
615
- const minutes = Math.floor((totalSeconds % 3600) / 60);
616
- const seconds = totalSeconds % 60;
617
- const pad = (num, size) => num.toString().padStart(size, '0');
618
- // return `${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}.${pad(milliseconds, 3)}`;
619
- return `${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`;
620
- }
621
- onlyscormAssessmentExists(data, key, value) {
622
- for (let i = 0; i < data?.length; i++) {
623
- if (data[i] && data[i]['children'] && data[i]['children'].length) {
624
- // this.totalResource = this.totalResource + 1
625
- // console.log('in children')
626
- this.onlyscormAssessmentExists(data[i]?.children, key, value);
627
- }
628
- else {
629
- this.totalResource = this.totalResource + 1;
630
- if (value.includes(data[i][key])) {
631
- // this.showAITutorFlag = false;
632
- this.scormAssessmentCount = this.scormAssessmentCount + 1;
633
- }
634
- }
635
- }
636
- if (this.totalResource === this.scormAssessmentCount) {
637
- this.enableAITutorFlag = false;
638
- }
639
- else {
640
- this.enableAITutorFlag = true;
641
- }
642
- return this.enableAITutorFlag;
643
- }
644
- raiseTranscriptionTabStartTelemetry() {
645
- const event = {
646
- eventType: WsEvents.WsEventType.Telemetry,
647
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
648
- data: {
649
- edata: { type: 'click', "id": "ai-tutor-viewer-page", "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-tab' },
650
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
651
- state: WsEvents.EnumTelemetrySubType.Loaded,
652
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
653
- mode: 'view',
654
- },
655
- pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
656
- from: '',
657
- to: 'Telemetry',
658
- };
659
- this.eventSvc.dispatchChatbotEvent(event);
660
- }
661
- raiseTranscriptionTabInteractTelemetry() {
662
- const event = {
663
- eventType: WsEvents.WsEventType.Telemetry,
664
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
665
- data: {
666
- edata: { type: 'click', "id": "ai-tutor-viewer-page", "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-tab' },
667
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
668
- state: WsEvents.EnumTelemetrySubType.Interact,
669
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
670
- mode: 'view',
671
- },
672
- pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
673
- from: '',
674
- to: 'Telemetry',
675
- };
676
- this.eventSvc.dispatchChatbotEvent(event);
677
- }
678
- raiseTranscriptionTabStopTelemetry() {
679
- const event = {
680
- eventType: WsEvents.WsEventType.Telemetry,
681
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
682
- data: {
683
- edata: { type: 'click', "id": "ai-tutor-viewer-page", "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-tab' },
684
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
685
- state: WsEvents.EnumTelemetrySubType.Unloaded,
686
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
687
- mode: 'view',
688
- },
689
- pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
690
- from: '',
691
- to: 'Telemetry',
692
- };
693
- this.eventSvc.dispatchChatbotEvent(event);
694
- }
695
- raiseTranscriptionLanguageStartTelemetry() {
696
- const event = {
697
- eventType: WsEvents.WsEventType.Telemetry,
698
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
699
- data: {
700
- edata: { type: 'click', "id": this.transcriptActiveLanguageText, "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-language' },
701
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
702
- state: WsEvents.EnumTelemetrySubType.Loaded,
703
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
704
- mode: 'view',
705
- },
706
- pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
707
- from: '',
708
- to: 'Telemetry',
709
- };
710
- this.eventSvc.dispatchChatbotEvent(event);
711
- }
712
- raiseTranscriptionLanguageInteractTelemetry() {
713
- const event = {
714
- eventType: WsEvents.WsEventType.Telemetry,
715
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
716
- data: {
717
- edata: { type: 'click', "id": this.transcriptActiveLanguageText, "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-language' },
718
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
719
- state: WsEvents.EnumTelemetrySubType.Interact,
720
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
721
- mode: 'view',
722
- },
723
- pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
724
- from: '',
725
- to: 'Telemetry',
726
- };
727
- this.eventSvc.dispatchChatbotEvent(event);
728
- }
729
- raiseTranscriptionLanguageStopTelemetry() {
730
- const event = {
731
- eventType: WsEvents.WsEventType.Telemetry,
732
- eventLogLevel: WsEvents.WsEventLogLevel.Info,
733
- data: {
734
- edata: { type: 'click', "id": this.transcriptActiveLanguageText, "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-language' },
735
- object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
736
- state: WsEvents.EnumTelemetrySubType.Unloaded,
737
- eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
738
- mode: 'view',
739
- },
740
- pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
741
- from: '',
742
- to: 'Telemetry',
743
- };
744
- this.eventSvc.dispatchChatbotEvent(event);
745
- }
746
- closeAIPopup(event) {
747
- if (event) {
748
- this.showAITutorPopup = false;
749
- this.selectedTabIndex = 0;
750
- }
751
- }
752
- ngOnDestroy() {
753
- if (this.resourceIdentifier$) {
754
- this.resourceIdentifier$.unsubscribe();
755
- }
756
- if (this.subTitles$) {
757
- this.subTitles$.unsubscribe();
758
- }
759
- if (this.transriptionLanguageSub) {
760
- this.transriptionLanguageSub.unsubscribe();
761
- }
762
- }
763
- clearCommentIdFromUrl() {
764
- const currentQueryParams = { ...this.route.snapshot.queryParams };
765
- delete currentQueryParams.commentId;
766
- this.commentId = '';
767
- this.discussWidgetData.newCommentSection.show = true;
768
- }
769
- resumeContentCall() {
770
- this.resumeContent.emit();
771
- }
772
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContentTocComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.UtilityService }, { token: i3.LoadCheckService }, { token: i2.ConfigurationsService }, { token: i4.MatLegacyDialog }, { token: i5.AppTocService }, { token: i6.ActionService }, { token: i1.Router }, { token: i2.EventService }, { token: i7.ViewerDataService }, { token: i8.SamuhikCharchaService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
773
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ContentTocComponent, selector: "ws-widget-content-toc", inputs: { content: "content", contentReadData: "contentReadData", initialRouteData: "initialRouteData", changeTab: "changeTab", baseContentReadData: "baseContentReadData", forPreview: "forPreview", contentTabFlag: "contentTabFlag", resumeData: "resumeData", batchData: "batchData", skeletonLoader: "skeletonLoader", tocStructure: "tocStructure", pathSet: "pathSet", fromViewer: "fromViewer", hierarchyMapData: "hierarchyMapData", condition: "condition", kparray: "kparray", selectedBatchData: "selectedBatchData", config: "config", componentName: "componentName", isEnrolled: "isEnrolled", playResourceId: "playResourceId", sideNavBarOpened: "sideNavBarOpened", languageList: "languageList", lockCertificate: "lockCertificate" }, outputs: { playResumeForAI: "playResumeForAI", enrollUserToAI: "enrollUserToAI", trigerCompletionSurveyForm: "trigerCompletionSurveyForm", resumeContent: "resumeContent" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "tabElement", first: true, predicate: ["stickyMenu"], descendants: true }, { propertyName: "tabs", predicate: MatTab, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- && (content?.courseCategory !== courseCategory?.BLENDED_PROGRAM) -->\r\n<div class=\"ai-tutor-get-started\" *ngIf=\"!viewerPage && enableAITutorFlag && !isMobile\">\r\n <div class=\"flex flex-row align-items-center\">\r\n <div class=\"px-2 py-2\">\r\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"64px\" width=\"64px\" />\r\n </div>\r\n <div class=\"flex flex-row align-items-center\">\r\n <div class=\"py-2\" [ngClass]=\"isMobile ? '' : 'w-565'\">\r\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\r\n <span>Get instant explanations, step-by-step learning guidance, and customised learning tailored just\r\n for you.</span>\r\n </div>\r\n <div class=\"ai-tutor-btn px-2 py-1\">\r\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\r\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"tab-group-container\">\r\n <mat-tab-group (selectedTabChange)=\"handleTabChange($event)\" #stickyMenu [class.sticky-mat-tabs]=\"sticky\"\r\n [selectedIndex]=\"selectedTabIndex\" [ngClass]=\"{'content-tabs':!fromViewer,'contentSticky': forPreview}\">\r\n\r\n <!-- Transcription Tab -->\r\n <mat-tab label=\"Transcription\"\r\n *ngIf=\"viewerPage && enableTranscriptionFlag && vttLangArr?.length && subTitles?.length\">\r\n <ng-template mat-tab-label>\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex\">\r\n <span>Transcript</span>\r\n </div>\r\n <div class=\"red-circle ml-5\">\r\n New\r\n </div>\r\n </div>\r\n\r\n </ng-template>\r\n <ng-template matTabContent>\r\n <div class=\"disclaimer my-2\">\r\n <p class=\"py-2 px-2\">Disclaimer : These transcripts and subtitles are AI-generated and may contain\r\n errors.</p>\r\n </div>\r\n <div class=\"w-full ml-5 mr-5\" *ngIf=\"isMobileForAI\">\r\n <div class=\"transcript-flex-container mt-2\">\r\n <mat-form-field class=\"multiline-select\" appearance=\"fill\" style=\"height: auto; width: 100%;\"\r\n floatLabel=\"never\">\r\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\r\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\r\n <mat-select-trigger class=\"multiline-select-box-trigger\">\r\n <div class=\"selected-option-content px-5 py-2\">\r\n <div class=\"title\"><span\r\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\r\n <b>Transcript Language: </b></span>\r\n {{selectedTranscriptionStyle?.language | titlecase}} <span\r\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\r\n </div>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option class=\"multiline-select-option\" value=\"\" *ngFor=\"let lang of vttLangArr\"\r\n [value]=\"lang\"\r\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\r\n <div class=\"option-content\">\r\n <div class=\"title\">{{lang?.language | titlecase}}</div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"ml-4 flex flex-row justify-end transcript-control\">\r\n <!-- <mat-form-field appearance=\"none\">\r\n <select matNativeControl required class=\"section-dd\" (change)=\"renderSelectedLanguageTranscription($event)\">\r\n <option [value]=\"lang?.language\" *ngFor=\"let lang of vttLangArr\" [selected]=\"lang?.label === transcriptionActiveLanguage\">\r\n <span *ngIf=\"transcriptionActiveLanguage === lang?.label\"> Transcript Language: </span> {{lang?.language | titlecase}} <span *ngIf=\"transcriptionActiveLanguage === lang?.language\">(Auto)</span>\r\n </option>\r\n </select>\r\n </mat-form-field> -->\r\n <div class=\"flex flex-row w-full\">\r\n <div [ngClass]=\"!isMobileForAI ? 'w-subtitle-80':'w-full'\">\r\n <div [ngClass]=\"!isMobileForAI ? 'ml-5-per' : ''\" *ngIf=\"subTitles && subTitles?.length\">\r\n <!-- Transcription content -->\r\n <ng-container *ngFor=\"let subtitle of subTitles\">\r\n <div class=\"flex flex-col my-2\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"subtitle-time\">\r\n <p class=\"cursor-pointer\" (click)=\"playFromSlot(subtitle)\">\r\n <span class=\"pr-1 blue-underline\"> {{\r\n formatMsToVttTime(subtitle?.startTime) }} </span>\r\n <span class=\"black-text\">-</span>\r\n <span class=\"pl-1 blue-underline\">{{\r\n formatMsToVttTime(subtitle?.endTime) }}</span>\r\n </p>\r\n </div>\r\n <div class=\"ml-4 subtitle-text-slot mr-4\">\r\n <p class=\"black-text\" [innerHtml]=\"subtitle?.text\r\n | highlight : keywordToHighlight?.text\r\n : ((subtitle?.startTime / 1000) >= keywordToHighlight?.start\r\n && (subtitle?.endTime / 1000) <= keywordToHighlight?.end)\">\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"w-subtitle-20\" *ngIf=\"!isMobileForAI\">\r\n <div class=\"transcript-flex-container mt-2\">\r\n <mat-form-field class=\"multiline-select\" appearance=\"fill\"\r\n style=\"height: auto; width: 100%;\" floatLabel=\"never\">\r\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\r\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\r\n <mat-select-trigger class=\"multiline-select-box-trigger\">\r\n <div class=\"selected-option-content px-5 py-2\">\r\n <div class=\"title\"><span\r\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\r\n <b>Transcript Language: </b></span>\r\n {{selectedTranscriptionStyle?.language | titlecase}} <span\r\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\r\n </div>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option class=\"multiline-select-option\" value=\"\"\r\n *ngFor=\"let lang of vttLangArr\" [value]=\"lang\"\r\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\r\n <div class=\"option-content\">\r\n <div class=\"title\">{{lang?.language | titlecase}}</div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <!-- <div class=\"flex flex-row align-items-center my-2\">\r\n <div>\r\n <p>0.00</p>\r\n </div>\r\n <div class=\"ml-4\">\r\n <p>AI for Digital Transformation: Machine Learning and Deep Learning Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\r\n </div>\r\n <div class=\"ml-4\">\r\n <mat-form-field appearance=\"none\">\r\n <select matNativeControl required class=\"section-dd\">\r\n <option value=\"\">Transcription Language: English (Auto)</option>\r\n </select>\r\n </mat-form-field>\r\n </div>\r\n </div> -->\r\n\r\n </ng-template>\r\n </mat-tab>\r\n\r\n <!-- About Tab -->\r\n <mat-tab label=\"{{ 'apptocsinglepage.about' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"ai-tutor-get-started-mobile my-2 ml-2\" *ngIf=\"!viewerPage && enableAITutorFlag && isMobile\">\r\n <div class=\"flex flex-row align-items-center w-98\">\r\n <div class=\"px-2 py-2\">\r\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"48px\" width=\"48px\" />\r\n </div>\r\n <div class=\"flex flex-row align-items-center w-60\">\r\n <div class=\"py-2\">\r\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\r\n <span>Get instant explanations, step-by-step learning guidance, and customised learning\r\n tailored just for you.</span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"ai-tutor-btn px-2 py-1\">\r\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\r\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI\r\n Tutor</span></a>\r\n </div>\r\n\r\n </div>\r\n <!-- <div class=\"flex justify-end my-2 mx-2\">\r\n <div class=\"ai-tutor-btn px-2 py-1\">\r\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\r\n </div>\r\n </div> -->\r\n </div>\r\n <ws-widget-app-toc-about [fromViewer]=\"fromViewer\" [pathSet]=\"pathSet\" [content]=\"content\"\r\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\r\n [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"false\" [sticky]=\"sticky\"\r\n [selectedBatchData]=\"selectedBatchData\" [selectedTabValue]=\"selectedTabIndex\"\r\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\r\n [condition]=\"condition\" [kparray]=\"kparray\" [showReviews]=\"'true'\" [languageList]=\"languageList\"\r\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\">\r\n </ws-widget-app-toc-about>\r\n </ng-template>\r\n </mat-tab>\r\n\r\n <!-- Content Tab -->\r\n <ng-container *ngIf=\"content?.children?.length\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.content' | translate }}\" *ngIf=\"contentTabFlag\">\r\n <ng-template matTabContent>\r\n <ws-widget-app-toc-content [batchId]=\"batchId\" [componentName]=\"componentName\" [pathSet]=\"pathSet\"\r\n [content]=\"content\" [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"forPreview\"\r\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\r\n [hierarchyMapData]=\"hierarchyMapData\" [baseContentReadData]=\"baseContentReadData\">\r\n </ws-widget-app-toc-content>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"config?.commentsTab && !forPreview\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.startDiscussion' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"commentsDiv\"\r\n *ngIf=\"discussWidgetData && discussWidgetData?.newCommentSection?.commentTreeData?.entityId\">\r\n <ng-container *ngIf=\"!commentId\">\r\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\"></d-v2-widget-comment>\r\n </ng-container>\r\n <ng-container *ngIf=\"commentId\">\r\n <div class=\"flex flex-row gap-3 cursor-pointer mb-5\" (click)=\"clearCommentIdFromUrl()\">\r\n <mat-icon class=\"cursor-pointer\">arrow_back</mat-icon>\r\n Back to all comments\r\n </div>\r\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\" [commentId]=\"commentId\"\r\n [skeletonLoader]></d-v2-widget-comment>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"config?.samuhikCharchaTab && condition && contentReadData?.eventLinked?.length > 0 && enableSamuhikCharchaTab\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.samuhikCharcha' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"samuhikCharchaDiv\">\r\n <ws-widget-samuhik-charcha-content [content]=\"contentReadData\" [conditionData]=\"condition\"\r\n (resumeContent)=\"resumeContentCall()\">\r\n </ws-widget-samuhik-charcha-content>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <!-- Teachers Note Tab -->\r\n <ng-container *ngIf=\"contentReadData?.referenceNodes && teacherNotesFlag\">\r\n <mat-tab label=\"Teachers Note\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\r\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\r\n [notesDisplayType]=\"'Teachers Resource'\"></ws-widget-app-toc-teachers-notes>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <!-- Reference Note Tab -->\r\n <ng-container *ngIf=\"contentReadData?.referenceNodes && referenceNotesFlag\">\r\n <mat-tab label=\"Reference Note\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\r\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\r\n [notesDisplayType]=\"'Reference Resource'\"></ws-widget-app-toc-teachers-notes>\r\n\r\n <!-- <ws-widget-app-toc-reference-notes [content]=\"contentReadData\"></ws-widget-app-toc-reference-notes> -->\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"showAssignmentsTab && !forPreview\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.assignments' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"takeAssessmentDiv\">\r\n <ws-widget-app-batch-assignments [content]=\"content\"></ws-widget-app-batch-assignments>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <!-- Transcription Tab -->\r\n <mat-tab label=\"AI Tutor\" *ngIf=\"viewerPage && enableAITutorFlag && isMobile\">\r\n <ng-template mat-tab-label>\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex\">\r\n <span>AI Tutor</span>\r\n </div>\r\n <div class=\"red-circle ml-5\">\r\n New\r\n </div>\r\n </div>\r\n\r\n </ng-template>\r\n <ng-template matTabContent>\r\n <ng-container *ngIf=\"showAITutorPopup\">\r\n <div>\r\n <viewer-ai-tutor [content]=\"content?.identifier\"\r\n (closeAIPopup)=\"closeAIPopup($event)\"></viewer-ai-tutor>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </mat-tab>\r\n </mat-tab-group>\r\n</div>", styles: ["::ng-deep .content-tabs .mat-tab-body-content{overflow:hidden!important;background-color:#eff3f9}::ng-deep .content-tabs .mat-tab-body.mat-tab-body-active{overflow-y:hidden}:host ::ng-deep .sticky-mat-tabs .mat-tab-header{top:96px;z-index:1000;position:sticky;position:-webkit-sticky;background:#eff3f9}#commentsDiv,#samuhikCharchaDiv{margin:1rem auto;min-height:800px}@media screen and (max-width: 768px){.sticky-mat-tabs .mat-tab-header{top:120px;position:fixed;width:100%}.content-tabs{border-radius:16px 16px 0 0;box-shadow:0 -2px 9px #00000014;background-color:#fff}}::ng-deep .contentSticky .mat-tab-header{top:0!important}.ai-tutor-btn{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:114px}.ai-tutor-get-started{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:100%;min-height:80px}.ai-tutor-get-started-mobile{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:96%;min-height:80px}.align-items-center{align-items:center}.w-565{width:565px}.w-98{width:98%}.font-weight-600{font-weight:600;line-height:1}.ai-tutor-label{color:#1b4ca1;font-weight:700}.section-dd{border-radius:32px;border:1px solid #1b4ca1;padding:12px 16px;color:#1b4ca1;width:auto;height:45px;font-size:14px;font-weight:700}::ng-deep .section-dd-container .mat-form-field-wrapper{padding-bottom:.5em!important}::ng-deep .section-dd-container .mat-form-field-infix{width:auto!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:#1b4ca1!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{top:35%!important;right:15%!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-input-element{padding-right:65px}::ng-deep .section-dd .mat-form-field-underline{display:none!important}.w-20{width:20%}::ng-deep .highlight{background-color:#ff0!important;font-weight:700!important}.red-circle{background:red;opacity:1;color:#fff;padding:2px 10px;height:14px;width:20px;border-radius:2px;vertical-align:middle;display:flex;justify-content:center;align-items:center;margin-left:8px;margin-top:-10px}.w-60{width:60%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px}.blue-underline{color:#1b4ca1;text-decoration:underline;font-weight:700}.transcript-control{color:#fff;display:flex;align-items:flex-start;justify-content:flex-start}:host ::ng-deep .multiline-select .mat-mdc-select-value-text{white-space:pre-wrap!important}:host ::ng-deep .mat-pseudo-checkbox{display:none!important}:host ::ng-deep .mat-pseudo-checkbox-checked{display:none!important}::ng-deep .multiline-select.mat-form-field{border-bottom:1px solid #1b4ca1!important}::ng-deep .multiline-select-option .mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:#e3eeff!important;color:#1b4ca1!important;font-weight:700!important}.transcript-flex-container{display:flex;justify-content:flex-end;width:100%}.selected-option-content{color:#1b4ca1}.ml-5-per{margin-left:5%}.black-text{color:#000;word-wrap:break-word}.subtitle-time{width:20%;word-wrap:break-word}.subtitle-text-slot{width:74%}.w-subtitle-80{width:70%}.w-subtitle-20{width:30%}::ng-deep .mat-mdc-select-panel{background:#fff!important}@media (min-width: 1280px) and (max-width: 1280px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1056px) and (max-width: 1232px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1024px) and (max-width: 1024px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 768px) and (max-width: 1023px){.subtitle-time{width:25%}.subtitle-text-slot{width:75%}}@media (min-width: 360px) and (max-width: 360px){.subtitle-time,.subtitle-text-slot{width:50%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 361px) and (max-width: 540px){.subtitle-time,.subtitle-text-slot{width:50%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 541px) and (max-width: 767px){.subtitle-time{width:40%}.subtitle-text-slot{width:60%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 768px){::ng-deep .tab-group-container .mdc-tab{min-width:auto;max-width:max-content;text-align:left;justify-content:start;padding-left:24px;padding-right:24px}.w-60{width:60%}}:host ::ng-deep .tab-group-container ::ng-deep .mat-mdc-tab-header-pagination{z-index:1!important}:host ::ng-deep .transcript-flex-container .mat-mdc-text-field-wrapper{width:100%;padding:10px}:host ::ng-deep .multiline-select.mat-mdc-form-field .mdc-line-ripple{display:none!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mdc-line-ripple{display:block!important;height:4px!important;color:#1b4ca1!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mat-mdc-form-field-flex{background-color:#e3eeff!important}:host ::ng-deep .multiline-select .mat-mdc-select-arrow-wrapper{margin-right:10px}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.MatTabContent, selector: "[matTabContent]" }, { kind: "directive", type: i11.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i12.WidgetCommentComponent, selector: "d-v2-widget-comment", inputs: ["widgetData", "commentId"], outputs: ["commentDataChange"] }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i14.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i14.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i15.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i16.AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: ["condition", "kparray", "content", "contentReadData", "baseContentReadData", "skeletonLoader", "sticky", "tocStructure", "pathSet", "config", "resumeData", "forPreview", "showReviews", "batchData", "fromViewer", "selectedBatchData", "selectedTabValue", "fromMarketPlace", "showMarketPlaceCertificate", "languageList", "lockCertificate"], outputs: ["trigerCompletionSurveyForm"] }, { kind: "component", type: i17.AppTocContentComponent, selector: "ws-widget-app-toc-content", inputs: ["batchId", "content", "forPreview", "resumeData", "batchData", "skeletonLoader", "tocStructure", "config", "hierarchyMapData", "pathSet", "componentName", "isPreAssessment", "baseContentReadData", "contentReadData"] }, { kind: "component", type: i18.AppTocTeachersNotesComponent, selector: "ws-widget-app-toc-teachers-notes", inputs: ["content", "notesDisplayType"] }, { kind: "component", type: i19.AppTocBatchAssignmentsComponent, selector: "ws-widget-app-batch-assignments", inputs: ["content"] }, { kind: "component", type: i20.SamuhikCharchaContentComponent, selector: "ws-widget-samuhik-charcha-content", inputs: ["content", "conditionData", "locked"], outputs: ["resumeContent"] }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i21.TranslatePipe, name: "translate" }, { kind: "pipe", type: i22.HighlightPipe, name: "highlight" }] }); }
774
- }
775
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContentTocComponent, decorators: [{
776
- type: Component,
777
- args: [{ selector: 'ws-widget-content-toc', template: "<!-- && (content?.courseCategory !== courseCategory?.BLENDED_PROGRAM) -->\r\n<div class=\"ai-tutor-get-started\" *ngIf=\"!viewerPage && enableAITutorFlag && !isMobile\">\r\n <div class=\"flex flex-row align-items-center\">\r\n <div class=\"px-2 py-2\">\r\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"64px\" width=\"64px\" />\r\n </div>\r\n <div class=\"flex flex-row align-items-center\">\r\n <div class=\"py-2\" [ngClass]=\"isMobile ? '' : 'w-565'\">\r\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\r\n <span>Get instant explanations, step-by-step learning guidance, and customised learning tailored just\r\n for you.</span>\r\n </div>\r\n <div class=\"ai-tutor-btn px-2 py-1\">\r\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\r\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"tab-group-container\">\r\n <mat-tab-group (selectedTabChange)=\"handleTabChange($event)\" #stickyMenu [class.sticky-mat-tabs]=\"sticky\"\r\n [selectedIndex]=\"selectedTabIndex\" [ngClass]=\"{'content-tabs':!fromViewer,'contentSticky': forPreview}\">\r\n\r\n <!-- Transcription Tab -->\r\n <mat-tab label=\"Transcription\"\r\n *ngIf=\"viewerPage && enableTranscriptionFlag && vttLangArr?.length && subTitles?.length\">\r\n <ng-template mat-tab-label>\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex\">\r\n <span>Transcript</span>\r\n </div>\r\n <div class=\"red-circle ml-5\">\r\n New\r\n </div>\r\n </div>\r\n\r\n </ng-template>\r\n <ng-template matTabContent>\r\n <div class=\"disclaimer my-2\">\r\n <p class=\"py-2 px-2\">Disclaimer : These transcripts and subtitles are AI-generated and may contain\r\n errors.</p>\r\n </div>\r\n <div class=\"w-full ml-5 mr-5\" *ngIf=\"isMobileForAI\">\r\n <div class=\"transcript-flex-container mt-2\">\r\n <mat-form-field class=\"multiline-select\" appearance=\"fill\" style=\"height: auto; width: 100%;\"\r\n floatLabel=\"never\">\r\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\r\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\r\n <mat-select-trigger class=\"multiline-select-box-trigger\">\r\n <div class=\"selected-option-content px-5 py-2\">\r\n <div class=\"title\"><span\r\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\r\n <b>Transcript Language: </b></span>\r\n {{selectedTranscriptionStyle?.language | titlecase}} <span\r\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\r\n </div>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option class=\"multiline-select-option\" value=\"\" *ngFor=\"let lang of vttLangArr\"\r\n [value]=\"lang\"\r\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\r\n <div class=\"option-content\">\r\n <div class=\"title\">{{lang?.language | titlecase}}</div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"ml-4 flex flex-row justify-end transcript-control\">\r\n <!-- <mat-form-field appearance=\"none\">\r\n <select matNativeControl required class=\"section-dd\" (change)=\"renderSelectedLanguageTranscription($event)\">\r\n <option [value]=\"lang?.language\" *ngFor=\"let lang of vttLangArr\" [selected]=\"lang?.label === transcriptionActiveLanguage\">\r\n <span *ngIf=\"transcriptionActiveLanguage === lang?.label\"> Transcript Language: </span> {{lang?.language | titlecase}} <span *ngIf=\"transcriptionActiveLanguage === lang?.language\">(Auto)</span>\r\n </option>\r\n </select>\r\n </mat-form-field> -->\r\n <div class=\"flex flex-row w-full\">\r\n <div [ngClass]=\"!isMobileForAI ? 'w-subtitle-80':'w-full'\">\r\n <div [ngClass]=\"!isMobileForAI ? 'ml-5-per' : ''\" *ngIf=\"subTitles && subTitles?.length\">\r\n <!-- Transcription content -->\r\n <ng-container *ngFor=\"let subtitle of subTitles\">\r\n <div class=\"flex flex-col my-2\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"subtitle-time\">\r\n <p class=\"cursor-pointer\" (click)=\"playFromSlot(subtitle)\">\r\n <span class=\"pr-1 blue-underline\"> {{\r\n formatMsToVttTime(subtitle?.startTime) }} </span>\r\n <span class=\"black-text\">-</span>\r\n <span class=\"pl-1 blue-underline\">{{\r\n formatMsToVttTime(subtitle?.endTime) }}</span>\r\n </p>\r\n </div>\r\n <div class=\"ml-4 subtitle-text-slot mr-4\">\r\n <p class=\"black-text\" [innerHtml]=\"subtitle?.text\r\n | highlight : keywordToHighlight?.text\r\n : ((subtitle?.startTime / 1000) >= keywordToHighlight?.start\r\n && (subtitle?.endTime / 1000) <= keywordToHighlight?.end)\">\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"w-subtitle-20\" *ngIf=\"!isMobileForAI\">\r\n <div class=\"transcript-flex-container mt-2\">\r\n <mat-form-field class=\"multiline-select\" appearance=\"fill\"\r\n style=\"height: auto; width: 100%;\" floatLabel=\"never\">\r\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\r\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\r\n <mat-select-trigger class=\"multiline-select-box-trigger\">\r\n <div class=\"selected-option-content px-5 py-2\">\r\n <div class=\"title\"><span\r\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\r\n <b>Transcript Language: </b></span>\r\n {{selectedTranscriptionStyle?.language | titlecase}} <span\r\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\r\n </div>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option class=\"multiline-select-option\" value=\"\"\r\n *ngFor=\"let lang of vttLangArr\" [value]=\"lang\"\r\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\r\n <div class=\"option-content\">\r\n <div class=\"title\">{{lang?.language | titlecase}}</div>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <!-- <div class=\"flex flex-row align-items-center my-2\">\r\n <div>\r\n <p>0.00</p>\r\n </div>\r\n <div class=\"ml-4\">\r\n <p>AI for Digital Transformation: Machine Learning and Deep Learning Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\r\n </div>\r\n <div class=\"ml-4\">\r\n <mat-form-field appearance=\"none\">\r\n <select matNativeControl required class=\"section-dd\">\r\n <option value=\"\">Transcription Language: English (Auto)</option>\r\n </select>\r\n </mat-form-field>\r\n </div>\r\n </div> -->\r\n\r\n </ng-template>\r\n </mat-tab>\r\n\r\n <!-- About Tab -->\r\n <mat-tab label=\"{{ 'apptocsinglepage.about' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"ai-tutor-get-started-mobile my-2 ml-2\" *ngIf=\"!viewerPage && enableAITutorFlag && isMobile\">\r\n <div class=\"flex flex-row align-items-center w-98\">\r\n <div class=\"px-2 py-2\">\r\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"48px\" width=\"48px\" />\r\n </div>\r\n <div class=\"flex flex-row align-items-center w-60\">\r\n <div class=\"py-2\">\r\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\r\n <span>Get instant explanations, step-by-step learning guidance, and customised learning\r\n tailored just for you.</span>\r\n </div>\r\n\r\n </div>\r\n <div class=\"ai-tutor-btn px-2 py-1\">\r\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\r\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI\r\n Tutor</span></a>\r\n </div>\r\n\r\n </div>\r\n <!-- <div class=\"flex justify-end my-2 mx-2\">\r\n <div class=\"ai-tutor-btn px-2 py-1\">\r\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\r\n </div>\r\n </div> -->\r\n </div>\r\n <ws-widget-app-toc-about [fromViewer]=\"fromViewer\" [pathSet]=\"pathSet\" [content]=\"content\"\r\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\r\n [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"false\" [sticky]=\"sticky\"\r\n [selectedBatchData]=\"selectedBatchData\" [selectedTabValue]=\"selectedTabIndex\"\r\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\r\n [condition]=\"condition\" [kparray]=\"kparray\" [showReviews]=\"'true'\" [languageList]=\"languageList\"\r\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\">\r\n </ws-widget-app-toc-about>\r\n </ng-template>\r\n </mat-tab>\r\n\r\n <!-- Content Tab -->\r\n <ng-container *ngIf=\"content?.children?.length\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.content' | translate }}\" *ngIf=\"contentTabFlag\">\r\n <ng-template matTabContent>\r\n <ws-widget-app-toc-content [batchId]=\"batchId\" [componentName]=\"componentName\" [pathSet]=\"pathSet\"\r\n [content]=\"content\" [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"forPreview\"\r\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\r\n [hierarchyMapData]=\"hierarchyMapData\" [baseContentReadData]=\"baseContentReadData\">\r\n </ws-widget-app-toc-content>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"config?.commentsTab && !forPreview\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.startDiscussion' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"commentsDiv\"\r\n *ngIf=\"discussWidgetData && discussWidgetData?.newCommentSection?.commentTreeData?.entityId\">\r\n <ng-container *ngIf=\"!commentId\">\r\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\"></d-v2-widget-comment>\r\n </ng-container>\r\n <ng-container *ngIf=\"commentId\">\r\n <div class=\"flex flex-row gap-3 cursor-pointer mb-5\" (click)=\"clearCommentIdFromUrl()\">\r\n <mat-icon class=\"cursor-pointer\">arrow_back</mat-icon>\r\n Back to all comments\r\n </div>\r\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\" [commentId]=\"commentId\"\r\n [skeletonLoader]></d-v2-widget-comment>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"config?.samuhikCharchaTab && condition && contentReadData?.eventLinked?.length > 0 && enableSamuhikCharchaTab\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.samuhikCharcha' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"samuhikCharchaDiv\">\r\n <ws-widget-samuhik-charcha-content [content]=\"contentReadData\" [conditionData]=\"condition\"\r\n (resumeContent)=\"resumeContentCall()\">\r\n </ws-widget-samuhik-charcha-content>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <!-- Teachers Note Tab -->\r\n <ng-container *ngIf=\"contentReadData?.referenceNodes && teacherNotesFlag\">\r\n <mat-tab label=\"Teachers Note\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\r\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\r\n [notesDisplayType]=\"'Teachers Resource'\"></ws-widget-app-toc-teachers-notes>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <!-- Reference Note Tab -->\r\n <ng-container *ngIf=\"contentReadData?.referenceNodes && referenceNotesFlag\">\r\n <mat-tab label=\"Reference Note\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\r\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\r\n [notesDisplayType]=\"'Reference Resource'\"></ws-widget-app-toc-teachers-notes>\r\n\r\n <!-- <ws-widget-app-toc-reference-notes [content]=\"contentReadData\"></ws-widget-app-toc-reference-notes> -->\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"showAssignmentsTab && !forPreview\">\r\n <mat-tab label=\"{{ 'apptocsinglepage.assignments' | translate }}\">\r\n <ng-template matTabContent>\r\n <div class=\"flex flex-col ratings-div mt-5\" id=\"takeAssessmentDiv\">\r\n <ws-widget-app-batch-assignments [content]=\"content\"></ws-widget-app-batch-assignments>\r\n </div>\r\n </ng-template>\r\n </mat-tab>\r\n </ng-container>\r\n\r\n <!-- Transcription Tab -->\r\n <mat-tab label=\"AI Tutor\" *ngIf=\"viewerPage && enableAITutorFlag && isMobile\">\r\n <ng-template mat-tab-label>\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex\">\r\n <span>AI Tutor</span>\r\n </div>\r\n <div class=\"red-circle ml-5\">\r\n New\r\n </div>\r\n </div>\r\n\r\n </ng-template>\r\n <ng-template matTabContent>\r\n <ng-container *ngIf=\"showAITutorPopup\">\r\n <div>\r\n <viewer-ai-tutor [content]=\"content?.identifier\"\r\n (closeAIPopup)=\"closeAIPopup($event)\"></viewer-ai-tutor>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </mat-tab>\r\n </mat-tab-group>\r\n</div>", styles: ["::ng-deep .content-tabs .mat-tab-body-content{overflow:hidden!important;background-color:#eff3f9}::ng-deep .content-tabs .mat-tab-body.mat-tab-body-active{overflow-y:hidden}:host ::ng-deep .sticky-mat-tabs .mat-tab-header{top:96px;z-index:1000;position:sticky;position:-webkit-sticky;background:#eff3f9}#commentsDiv,#samuhikCharchaDiv{margin:1rem auto;min-height:800px}@media screen and (max-width: 768px){.sticky-mat-tabs .mat-tab-header{top:120px;position:fixed;width:100%}.content-tabs{border-radius:16px 16px 0 0;box-shadow:0 -2px 9px #00000014;background-color:#fff}}::ng-deep .contentSticky .mat-tab-header{top:0!important}.ai-tutor-btn{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:114px}.ai-tutor-get-started{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:100%;min-height:80px}.ai-tutor-get-started-mobile{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:96%;min-height:80px}.align-items-center{align-items:center}.w-565{width:565px}.w-98{width:98%}.font-weight-600{font-weight:600;line-height:1}.ai-tutor-label{color:#1b4ca1;font-weight:700}.section-dd{border-radius:32px;border:1px solid #1b4ca1;padding:12px 16px;color:#1b4ca1;width:auto;height:45px;font-size:14px;font-weight:700}::ng-deep .section-dd-container .mat-form-field-wrapper{padding-bottom:.5em!important}::ng-deep .section-dd-container .mat-form-field-infix{width:auto!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:#1b4ca1!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{top:35%!important;right:15%!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-input-element{padding-right:65px}::ng-deep .section-dd .mat-form-field-underline{display:none!important}.w-20{width:20%}::ng-deep .highlight{background-color:#ff0!important;font-weight:700!important}.red-circle{background:red;opacity:1;color:#fff;padding:2px 10px;height:14px;width:20px;border-radius:2px;vertical-align:middle;display:flex;justify-content:center;align-items:center;margin-left:8px;margin-top:-10px}.w-60{width:60%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px}.blue-underline{color:#1b4ca1;text-decoration:underline;font-weight:700}.transcript-control{color:#fff;display:flex;align-items:flex-start;justify-content:flex-start}:host ::ng-deep .multiline-select .mat-mdc-select-value-text{white-space:pre-wrap!important}:host ::ng-deep .mat-pseudo-checkbox{display:none!important}:host ::ng-deep .mat-pseudo-checkbox-checked{display:none!important}::ng-deep .multiline-select.mat-form-field{border-bottom:1px solid #1b4ca1!important}::ng-deep .multiline-select-option .mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:#e3eeff!important;color:#1b4ca1!important;font-weight:700!important}.transcript-flex-container{display:flex;justify-content:flex-end;width:100%}.selected-option-content{color:#1b4ca1}.ml-5-per{margin-left:5%}.black-text{color:#000;word-wrap:break-word}.subtitle-time{width:20%;word-wrap:break-word}.subtitle-text-slot{width:74%}.w-subtitle-80{width:70%}.w-subtitle-20{width:30%}::ng-deep .mat-mdc-select-panel{background:#fff!important}@media (min-width: 1280px) and (max-width: 1280px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1056px) and (max-width: 1232px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1024px) and (max-width: 1024px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 768px) and (max-width: 1023px){.subtitle-time{width:25%}.subtitle-text-slot{width:75%}}@media (min-width: 360px) and (max-width: 360px){.subtitle-time,.subtitle-text-slot{width:50%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 361px) and (max-width: 540px){.subtitle-time,.subtitle-text-slot{width:50%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 541px) and (max-width: 767px){.subtitle-time{width:40%}.subtitle-text-slot{width:60%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 768px){::ng-deep .tab-group-container .mdc-tab{min-width:auto;max-width:max-content;text-align:left;justify-content:start;padding-left:24px;padding-right:24px}.w-60{width:60%}}:host ::ng-deep .tab-group-container ::ng-deep .mat-mdc-tab-header-pagination{z-index:1!important}:host ::ng-deep .transcript-flex-container .mat-mdc-text-field-wrapper{width:100%;padding:10px}:host ::ng-deep .multiline-select.mat-mdc-form-field .mdc-line-ripple{display:none!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mdc-line-ripple{display:block!important;height:4px!important;color:#1b4ca1!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mat-mdc-form-field-flex{background-color:#e3eeff!important}:host ::ng-deep .multiline-select .mat-mdc-select-arrow-wrapper{margin-right:10px}\n"] }]
778
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.UtilityService }, { type: i3.LoadCheckService }, { type: i2.ConfigurationsService }, { type: i4.MatLegacyDialog }, { type: i5.AppTocService }, { type: i6.ActionService }, { type: i1.Router }, { type: i2.EventService }, { type: i7.ViewerDataService }, { type: i8.SamuhikCharchaService }, { type: undefined, decorators: [{
779
- type: Inject,
780
- args: ['environment']
781
- }] }]; }, propDecorators: { content: [{
782
- type: Input
783
- }], contentReadData: [{
784
- type: Input
785
- }], initialRouteData: [{
786
- type: Input
787
- }], changeTab: [{
788
- type: Input
789
- }], baseContentReadData: [{
790
- type: Input
791
- }], forPreview: [{
792
- type: Input
793
- }], contentTabFlag: [{
794
- type: Input
795
- }], resumeData: [{
796
- type: Input
797
- }], batchData: [{
798
- type: Input
799
- }], skeletonLoader: [{
800
- type: Input
801
- }], tocStructure: [{
802
- type: Input
803
- }], pathSet: [{
804
- type: Input
805
- }], fromViewer: [{
806
- type: Input
807
- }], hierarchyMapData: [{
808
- type: Input
809
- }], tabElement: [{
810
- type: ViewChild,
811
- args: ['stickyMenu']
812
- }], tabs: [{
813
- type: ViewChildren,
814
- args: [MatTab]
815
- }], condition: [{
816
- type: Input
817
- }], kparray: [{
818
- type: Input
819
- }], selectedBatchData: [{
820
- type: Input
821
- }], config: [{
822
- type: Input
823
- }], componentName: [{
824
- type: Input
825
- }], isEnrolled: [{
826
- type: Input
827
- }], playResourceId: [{
828
- type: Input
829
- }], sideNavBarOpened: [{
830
- type: Input
831
- }], languageList: [{
832
- type: Input
833
- }], lockCertificate: [{
834
- type: Input
835
- }], playResumeForAI: [{
836
- type: Output
837
- }], enrollUserToAI: [{
838
- type: Output
839
- }], trigerCompletionSurveyForm: [{
840
- type: Output
841
- }], resumeContent: [{
842
- type: Output
843
- }], handleScroll: [{
844
- type: HostListener,
845
- args: ['window:scroll', ['$event']]
846
- }] } });
847
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC10b2MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvY29udGVudC10b2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvY29udGVudC10b2MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQTRCLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFakwsT0FBTyxFQUF1QyxTQUFTLEVBQWtCLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBTS9HLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJEQUEyRCxDQUFBO0FBQ3hHLE9BQU8sRUFBZ0MscUJBQXFCLElBQUksZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDeEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFHM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVwQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFL0MsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBcUU5QixZQUNVLEtBQXFCLEVBQ3JCLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNs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Q0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRywwQkFBMEI7c0JBQW5DLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkF3VlAsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIEV2ZW50U2VydmljZSwgTnNDb250ZW50LCBVdGlsaXR5U2VydmljZSwgV3NFdmVudHMgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcclxuXHJcbmltcG9ydCB7IExvYWRDaGVja1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sb2FkLWNoZWNrLnNlcnZpY2UnXHJcbmltcG9ydCB7IE1hdExlZ2FjeVRhYkdyb3VwIGFzIE1hdFRhYkdyb3VwLCBNYXRMZWdhY3lUYWJDaGFuZ2VFdmVudCBhcyBNYXRUYWJDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS10YWJzJ1xyXG5pbXBvcnQgeyBOc0Rpc2N1c3Npb25WMiB9IGZyb20gJ0BzdW5iaXJkLWNiL2Rpc2N1c3Npb24tdjInXHJcbmltcG9ydCB7IEFpVHV0b3JDb25maXJtUG9wdXBDb21wb25lbnQgfSBmcm9tICcuL2FpLXR1dG9yLWNvbmZpcm0tcG9wdXAvYWktdHV0b3ItY29uZmlybS1wb3B1cC5jb21wb25lbnQnXHJcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2csIE1hdExlZ2FjeURpYWxvZ0NvbmZpZyBhcyBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xyXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZUdlbmVyYXRvciB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy92aWV3ZXItcm91dGUtdXRpbCdcclxuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcclxuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FjdGlvbi5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBWdHRGaWxlIH0gZnJvbSAnQHBvbHlmbGl4L3Z0dC1wYXJzZXInXHJcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBWaWV3ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZpZXdlci1kYXRhLnNlcnZpY2UnXHJcbmltcG9ydCB7IE1hdFRhYiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnXHJcbmltcG9ydCB7IFNhbXVoaWtDaGFyY2hhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9zYW11aGlrLWNoYXJjaGEuc2VydmljZSdcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnd3Mtd2lkZ2V0LWNvbnRlbnQtdG9jJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29udGVudC10b2MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvbnRlbnQtdG9jLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQ29udGVudFRvY0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgdGFiQ2hhbmdlVmFsdWU6IGFueSA9ICcnXHJcbiAgQElucHV0KCkgY29udGVudCE6IGFueVxyXG4gIEBJbnB1dCgpIGNvbnRlbnRSZWFkRGF0YSE6IGFueVxyXG4gIEBJbnB1dCgpIGluaXRpYWxSb3V0ZURhdGE6IGFueVxyXG4gIEBJbnB1dCgpIGNoYW5nZVRhYiA9IGZhbHNlXHJcbiAgQElucHV0KCkgYmFzZUNvbnRlbnRSZWFkRGF0YSE6IGFueVxyXG4gIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxyXG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXHJcbiAgQElucHV0KCkgY29udGVudFRhYkZsYWcgPSB0cnVlXHJcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogYW55IHwgbnVsbCA9IG51bGxcclxuICBASW5wdXQoKSBiYXRjaERhdGE6IC8qKk5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UgKi8gYW55IHwgbnVsbCA9IG51bGxcclxuICBASW5wdXQoKSBza2VsZXRvbkxvYWRlciA9IGZhbHNlXHJcbiAgQElucHV0KCkgdG9jU3RydWN0dXJlOiBhbnkgPSB7fVxyXG4gIEBJbnB1dCgpIHBhdGhTZXQ6IGFueVxyXG4gIEBJbnB1dCgpIGZyb21WaWV3ZXIgPSBmYWxzZVxyXG4gIEBJbnB1dCgpIGhpZXJhcmNoeU1hcERhdGE6IGFueSA9IHt9XHJcbiAgQFZpZXdDaGlsZCgnc3RpY2t5TWVudScpIHRhYkVsZW1lbnQhOiBNYXRUYWJHcm91cFxyXG4gIEBWaWV3Q2hpbGRyZW4oTWF0VGFiKSB0YWJzITogUXVlcnlMaXN0PE1hdFRhYj5cclxuICBASW5wdXQoKSBjb25kaXRpb246IGFueVxyXG4gIEBJbnB1dCgpIGtwYXJyYXk6IGFueVxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkQmF0Y2hEYXRhOiBhbnlcclxuICBASW5wdXQoKSBjb25maWc6IGFueVxyXG4gIEBJbnB1dCgpIGNvbXBvbmVudE5hbWUhOiBzdHJpbmdcclxuICBASW5wdXQoKSBpc0Vucm9sbGVkITogYm9vbGVhblxyXG4gIEBJbnB1dCgpIHBsYXlSZXNvdXJjZUlkID0gJydcclxuICBASW5wdXQoKSBzaWRlTmF2QmFyT3BlbmVkID0gZmFsc2VcclxuICBASW5wdXQoKSBsYW5ndWFnZUxpc3QgPSBbXVxyXG4gIEBJbnB1dCgpIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXHJcbiAgQE91dHB1dCgpIHBsYXlSZXN1bWVGb3JBSSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG4gIEBPdXRwdXQoKSBlbnJvbGxVc2VyVG9BSSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG4gIEBPdXRwdXQoKSB0cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKVxyXG4gIEBPdXRwdXQoKSByZXN1bWVDb250ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpXHJcblxyXG4gIGNvbW1lbnRJZD86IHN0cmluZyA9ICcnXHJcbiAgc3RpY2t5ID0gZmFsc2VcclxuICBtZW51UG9zaXRpb246IGFueVxyXG4gIGlzTW9iaWxlID0gZmFsc2VcclxuICBzZWxlY3RlZFRhYkluZGV4ID0gMFxyXG4gIGRpc2N1c3NXaWRnZXREYXRhITogTnNEaXNjdXNzaW9uVjIuSUNvbW1lbnRXaWRnZXREYXRhXHJcbiAgdGVhY2hlck5vdGVzRmxhZyA9IGZhbHNlXHJcbiAgcmVmZXJlbmNlTm90ZXNGbGFnID0gZmFsc2VcclxuICB2aWV3ZXJQYWdlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy92aWV3ZXIvJykgPyB0cnVlIDogZmFsc2VcclxuICByZXN1bWVEYXRhTGluazogYW55XHJcbiAgZW5hYmxlQUlUdXRvckZsYWcgPSBmYWxzZVxyXG4gIGVuYWJsZVRyYW5zY3JpcHRpb25GbGFnID0gZmFsc2VcclxuICBjb3Vyc2VDYXRlZ29yeSA9IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnlcclxuICBzdWJUaXRsZXMkOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxyXG4gIHJlc291cmNlSWRlbnRpZmllcjogYW55XHJcbiAgcmVzb3VyY2VJZGVudGlmaWVyJDogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcclxuICBzdWJUaXRsZXM6IGFueSA9IFtdXHJcbiAga2V5d29yZFRvSGlnaGxpZ2h0OiBhbnkgPSAnJ1xyXG4gIGhpZ2hsaWdodENvbmRpdGlvbiA9IGZhbHNlXHJcbiAgdnR0TGFuZ0FycjogYW55ID0gW11cclxuICB0cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPSAnZW4nXHJcbiAgZGVmYXVsdFRyYW5zY3JpcHRMYW5ndWFnZSA9ICdlbidcclxuICB0cmFuc3JpcHRpb25MYW5ndWFnZVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcclxuICBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZTogYW55XHJcbiAgZnJvbUFJVHV0b3IgPSBmYWxzZVxyXG4gIHRvdGFsUmVzb3VyY2UgPSAwXHJcbiAgc2Nvcm1Bc3Nlc3NtZW50Q291bnQgPSAwXHJcbiAgc2hvd0FJVHV0b3JQb3B1cCA9IGZhbHNlXHJcbiAgZnJvbUFJU2VsZWN0ZWRUYWJJbmRleCA9IGZhbHNlXHJcbiAgaXNNb2JpbGVGb3JBSSA9IGZhbHNlXHJcbiAgdHJhbnNjcmlwdEFjdGl2ZUxhbmd1YWdlVGV4dCA9ICdFbmdsaXNoJ1xyXG4gIHNob3dBc3NpZ25tZW50c1RhYiA9IGZhbHNlXHJcbiAgZW5hYmxlU2FtdWhpa0NoYXJjaGFUYWIgPSBmYWxzZVxyXG4gIHNhbXVoaWtDb25maWc6IGFueVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgbG9hZENoZWNrU2VydmljZTogTG9hZENoZWNrU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHVibGljIHRvY1N2YzogQXBwVG9jU2VydmljZSxcclxuICAgIHByaXZhdGUgYWN0aW9uU1ZDOiBBY3Rpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZXZlbnRTdmM6IEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgdmlld2VyRGF0YVN2YzogVmlld2VyRGF0YVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNhbXVoaWtDaGFyY2hhU3ZjOiBTYW11aGlrQ2hhcmNoYVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQ6IGFueVxyXG5cclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3IgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uYWxsKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnRSZWFkRGF0YS0tJywgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhKVxyXG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdGhpcy5vbmx5c2Nvcm1Bc3Nlc3NtZW50RXhpc3RzKHRoaXMucm91dGUuc25hcHNob3Q/LmRhdGE/LmNvbnRlbnQ/LmRhdGE/LmNoaWxkcmVuLCAnbWltZVR5cGUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JywgJ2FwcGxpY2F0aW9uL2pzb24nLCAndGV4dC94LXVybCddKVxyXG4gICAgICAvLyB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdHJ1ZVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3IgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uZm9yT3JnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWcuYWlUdXRvcj8uZm9yT3JnPy5sZW5ndGggJiZcclxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uZm9yT3JnLmluY2x1ZGVzKHRoaXMuY29uZmlnU2VydmljZS51c2VyUHJvZmlsZT8ucm9vdE9yZ0lkKVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnRSZWFkRGF0YS0tJywgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhKVxyXG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdGhpcy5vbmx5c2Nvcm1Bc3Nlc3NtZW50RXhpc3RzKHRoaXMucm91dGUuc25hcHNob3Q/LmRhdGE/LmNvbnRlbnQ/LmRhdGE/LmNoaWxkcmVuLCAnbWltZVR5cGUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JywgJ2FwcGxpY2F0aW9uL2pzb24nLCAndGV4dC94LXVybCddKVxyXG4gICAgICAvLyB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5hbGwpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ2luJylcclxuICAgICAgLy8gdGhpcy5yZXNvdXJjZUlkZW50aWZpZXIkID0gdGhpcy50b2NTdmMudHJhbnNyaXB0aW9uSWRlbnRpZmllci5zdWJzY3JpYmUoKHZhbHVlOmFueSk9PntcclxuICAgICAgLy8gICAvLyAgY29uc29sZS5sb2coJ3Jlc291cmNlIGlkZW50aWZpZXInLCB2YWx1ZSlcclxuICAgICAgLy8gICBpZih2YWx1ZSAmJiAgdmFsdWU/LmlkZW50aWZpZXIpIHtcclxuICAgICAgLy8gICAgIHRoaXMucmVzb3VyY2VJZGVudGlmaWVyID0gdmFsdWU/LmlkZW50aWZpZXIgLy92YWx1ZT8uaWRlbnRpZmllciAvLyBkb18xMTM4ODkxMTk4NDg5MDY3NTIxMTQ3XHJcbiAgICAgIC8vICAgICB0aGlzLnBhcnNlVlRUKClcclxuICAgICAgLy8gICB9XHJcblxyXG4gICAgICAvLyB9KVxyXG5cclxuICAgICAgdGhpcy5zdWJUaXRsZXMkID0gdGhpcy50b2NTdmMudHJhbnNjcmlwdGlvbkRhdGEkLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vICBjb25zb2xlLmxvZygndmFsdWUnLCB2YWx1ZSlcclxuICAgICAgICB0aGlzLmtleXdvcmRUb0hpZ2hsaWdodCA9IHZhbHVlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnRyYW5zcmlwdGlvbkxhbmd1YWdlU3ViID0gdGhpcy50b2NTdmMudHJhbnNyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VEYXRhT2JqZWN0JFxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgdGFwKChsYW5ndmFsdWU6IGFueSkgPT4gY29uc29sZS5sb2coJ3RhcCBsYW5ndmFsdWU6JywgbGFuZ3ZhbHVlKSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgobGFuZ3ZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdsYW5nVmFsdWUnLCBsYW5ndmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGxhbmd2YWx1ZSkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLnJlbmRlclNlbGVjdGVkTGFuZ3VhZ2VUcmFuc2NyaXB0aW9uKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSB0cnVlXHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWcgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8udHJhbnNjcmlwdGlvbiAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5mb3JPcmcgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8udHJhbnNjcmlwdGlvbj8uZm9yT3JnPy5sZW5ndGggJiZcclxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8udHJhbnNjcmlwdGlvbj8uZm9yT3JnPy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1NlcnZpY2UudXNlclByb2ZpbGU/LnJvb3RPcmdJZClcclxuICAgICkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnaW4nKVxyXG4gICAgICAvLyB0aGlzLnJlc291cmNlSWRlbnRpZmllciQgPSB0aGlzLnRvY1N2Yy50cmFuc3JpcHRpb25JZGVudGlmaWVyLnN1YnNjcmliZSgodmFsdWU6YW55KT0+e1xyXG4gICAgICAvLyAgIC8vICBjb25zb2xlLmxvZygncmVzb3VyY2UgaWRlbnRpZmllcicsIHZhbHVlKVxyXG4gICAgICAvLyAgIGlmKHZhbHVlICYmICB2YWx1ZT8uaWRlbnRpZmllcikge1xyXG4gICAgICAvLyAgICAgdGhpcy5yZXNvdXJjZUlkZW50aWZpZXIgPSB2YWx1ZT8uaWRlbnRpZmllciAvL3ZhbHVlPy5pZGVudGlmaWVyIC8vIGRvXzExMzg4OTExOTg0ODkwNjc1MjExNDdcclxuICAgICAgLy8gICAgIHRoaXMucGFyc2VWVFQoKVxyXG4gICAgICAvLyAgIH1cclxuXHJcbiAgICAgIC8vIH0pXHJcblxyXG4gICAgICB0aGlzLnN1YlRpdGxlcyQgPSB0aGlzLnRvY1N2Yy50cmFuc2NyaXB0aW9uRGF0YSQuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gIGNvbnNvbGUubG9nKCd2YWx1ZScsIHZhbHVlKVxyXG4gICAgICAgIHRoaXMua2V5d29yZFRvSGlnaGxpZ2h0ID0gdmFsdWVcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMudHJhbnNyaXB0aW9uTGFuZ3VhZ2VTdWIgPSB0aGlzLnRvY1N2Yy50cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QkXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKGxhbmd2YWx1ZTogYW55KSA9PiBjb25zb2xlLmxvZygndGFwIGxhbmd2YWx1ZTonLCBsYW5ndmFsdWUpKVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChsYW5ndmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2xhbmdWYWx1ZScsIGxhbmd2YWx1ZSk7XHJcbiAgICAgICAgICBpZiAobGFuZ3ZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMucmVuZGVyU2VsZWN0ZWRMYW5ndWFnZVRyYW5zY3JpcHRpb24oKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgdGhpcy5lbmFibGVUcmFuc2NyaXB0aW9uRmxhZyA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJhdGNoSWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmJhdGNoSWQgP1xyXG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmJhdGNoSWQgOiAnJ1xyXG4gICAgaWYgKGJhdGNoSWQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMVxyXG4gICAgfVxyXG4gICAgdGhpcy5jb21tZW50SWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmNvbW1lbnRJZCA/IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuY29tbWVudElkIDogJydcclxuICAgIGlmICh0aGlzLmNvbW1lbnRJZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAyXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5pc01vYmlsZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuaXNNb2JpbGVcclxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0ODApIHtcclxuICAgICAgdGhpcy5pc01vYmlsZUZvckFJID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc01vYmlsZUZvckFJID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMubWVudVBvc2l0aW9uID0gdGhpcy50YWJFbGVtZW50Ll9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wXHJcblxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShhc3luYyAocGFyYW1zOiBhbnkpID0+IHtcclxuXHJcbiAgICAgIGxldCBmcm9tQUlUdXRvciA9IHBhcmFtcy5nZXQoJ2Zyb21BSVR1dG9yJylcclxuXHJcbiAgICAgIGlmICgoZnJvbUFJVHV0b3IgPT09ICd0cnVlJyB8fCBmcm9tQUlUdXRvciA9PT0gdHJ1ZSkgJiYgdGhpcy5pc01vYmlsZSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGFic0FycmF5ID0gdGhpcy50YWJzPy50b0FycmF5KClcclxuICAgICAgICAgIGxldCBpbmRleCA9IHRhYnNBcnJheT8uZmluZEluZGV4KHRhYiA9PiB0YWIudGV4dExhYmVsLnRyaW0oKSA9PT0gXCJBSSBUdXRvclwiLnRyaW0oKSlcclxuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IGluZGV4XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbUFJU2VsZWN0ZWRUYWJJbmRleCA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAzMDAwKVxyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBnZXRDdXJyZW50VGltZUluVVRDKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKClcclxuICAgIGNvbnN0IGlzb1N0cmluZyA9IGN1cnJlbnREYXRlLnRvSVNPU3RyaW5nKClcclxuICAgIHJldHVybiBpc29TdHJpbmcucmVwbGFjZSgnWicsICcrMDAwMCcpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFNhbXVoaWtDb25maWcoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNhbXVoaWtDb25maWcgPSBhd2FpdCB0aGlzLnNhbXVoaWtDaGFyY2hhU3ZjLmZldGNoQ29uZmlnRmlsZSgpLnRvUHJvbWlzZSgpXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cclxuICAgIHRoaXMucmVzb3VyY2VJZGVudGlmaWVyID0gdGhpcy52aWV3ZXJEYXRhU3ZjLnJlc291cmNlSWRcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5hbGwpIHtcclxuICAgICAgdGhpcy5lbmFibGVUcmFuc2NyaXB0aW9uRmxhZyA9IHRydWVcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LnRyYW5zY3JpcHRpb24/LmZvck9yZyAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5mb3JPcmc/Lmxlbmd0aCAmJlxyXG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5mb3JPcmc/LmluY2x1ZGVzKHRoaXMuY29uZmlnU2VydmljZT8udXNlclByb2ZpbGU/LnJvb3RPcmdJZClcclxuICAgICkge1xyXG4gICAgICB0aGlzLmVuYWJsZVRyYW5zY3JpcHRpb25GbGFnID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmFibGVUcmFuc2NyaXB0aW9uRmxhZyA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWcgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvciAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnLmFpVHV0b3I/LmFsbCkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy5jb250ZW50UmVhZERhdGEtLScsIHRoaXMucm91dGUuc25hcHNob3QuZGF0YSlcclxuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IHRoaXMub25seXNjb3JtQXNzZXNzbWVudEV4aXN0cyh0aGlzLmNvbnRlbnQ/LmNoaWxkcmVuLCAnbWltZVR5cGUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JywgJ2FwcGxpY2F0aW9uL2pzb24nLCAndGV4dC94LXVybCddKVxyXG4gICAgICAvLyB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdHJ1ZVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3IgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uZm9yT3JnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3I/LmZvck9yZz8ubGVuZ3RoXHJcbiAgICAgICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWcuYWlUdXRvcj8uZm9yT3JnPy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1NlcnZpY2U/LnVzZXJQcm9maWxlPy5yb290T3JnSWQpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IHRoaXMub25seXNjb3JtQXNzZXNzbWVudEV4aXN0cyh0aGlzLmNvbnRlbnQ/LmNoaWxkcmVuLCAnbWltZVR5cGUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JywgJ2FwcGxpY2F0aW9uL2pzb24nLCAndGV4dC94LXVybCddKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlc1sncGxheVJlc291cmNlSWQnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlcz8ucGxheVJlc291cmNlSWQ/LnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZXM/LnBsYXlSZXNvdXJjZUlkPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy52aWV3ZXJQYWdlICYmIHRoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZCAmJiB0aGlzLmVuYWJsZVRyYW5zY3JpcHRpb25GbGFnKSB7XHJcbiAgICAgICAgICB0aGlzLnBhcnNlVlRUKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzLmNoYW5nZVRhYiAmJiBjaGFuZ2VzLmNoYW5nZVRhYi5jdXJyZW50VmFsdWUgJiYgIXRoaXMuZnJvbUFJU2VsZWN0ZWRUYWJJbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAxXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhICYmIHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5wYWdlRGF0YS5kYXRhKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGFcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5kaXNjdXNzV2lkZ2V0RGF0YSkge1xyXG4gICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhID0gdGhpcy5jb25maWcuZGlzY3Vzc1dpZGdldERhdGFcclxuICAgICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllcikge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnQuaWRlbnRpZmllcicsIHRoaXMuY29udGVudC5pZGVudGlmaWVyKVxyXG4gICAgICAgIGlmICghdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5uZXdDb21tZW50U2VjdGlvbi5jb21tZW50VHJlZURhdGEuZW50aXR5SWQpIHtcclxuICAgICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudFRyZWVEYXRhLmVudGl0eUlkID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzY3Vzc1dpZGdldERhdGEuY29tbWVudHNMaXN0LnJlcGxpZXNTZWN0aW9uICYmIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEuY29tbWVudHNMaXN0LnJlcGxpZXNTZWN0aW9uLm5ld0NvbW1lbnRSZXBseSkge1xyXG4gICAgICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5jb21tZW50c0xpc3QucmVwbGllc1NlY3Rpb24ubmV3Q29tbWVudFJlcGx5LmNvbW1lbnRUcmVlRGF0YS5lbnRpdHlJZCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Vucm9sbGVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xyXG4gICAgICAgICAgdGhpcy5zaG93QXNzaWdubWVudHNUYWIgPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEuZW5yb2xsZWRDb250ZW50ID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudEJveC5wbGFjZWhvbGRlciA9ICdTdGFydCBhIGRpc2N1c3Npb24nXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5lbnJvbGxlZENvbnRlbnQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudEJveC5wbGFjZWhvbGRlciA9ICdFbnJvbCB0byBhZGQgeW91ciBjb21tZW50cydcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jb21tZW50SWQpIHtcclxuICAgICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLm5ld0NvbW1lbnRTZWN0aW9uLnNob3cgPSBmYWxzZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEgPSB7IC4uLnRoaXMuZGlzY3Vzc1dpZGdldERhdGEgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uZXZlbnRMaW5rZWQ/Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBvcmdJZCA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ3VzZXJQcm9maWxlLnVzZXJSb290T3JnLmlkJywgJycpXHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2FtdWhpa0NvbmZpZygpXHJcbiAgICAgIGNvbnN0IGV2ZW50c0xpbmtlZCA9IHRoaXMuY29udGVudFJlYWREYXRhLmV2ZW50TGlua2VkIHx8IFtdXHJcbiAgICAgIGxldCBldmVudHNEYXRhOiBhbnkgPSBbXVxyXG4gICAgICB0aGlzLnNhbXVoaWtDb25maWc/LnN0cmlwc1swXS50YWJzLmZvckVhY2goKGVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgZWxlLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzLmlkZW50aWZpZXIgPSBldmVudHNMaW5rZWRcclxuICAgICAgICBlbGUucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMuY3JlYXRlZEZvciA9IFtvcmdJZF1cclxuICAgICAgICBpZiAoZWxlLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzLmVuZERhdGVUaW1lLmhhc093blByb3BlcnR5KCc+PScpKSB7XHJcbiAgICAgICAgICBlbGUucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMuZW5kRGF0ZVRpbWVbJz49J10gPSB0aGlzLmdldEN1cnJlbnRUaW1lSW5VVENcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVsZS5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycy5lbmREYXRlVGltZS5oYXNPd25Qcm9wZXJ0eSgnPCcpKSB7XHJcbiAgICAgICAgICBlbGUucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMuZW5kRGF0ZVRpbWVbJzwnXSA9IHRoaXMuZ2V0Q3VycmVudFRpbWVJblVUQ1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNhbXVoaWtDaGFyY2hhU3ZjLmdldFNlYXJjaFY2UmVzdWx0cyhlbGUucmVxdWVzdC5zZWFyY2hWNikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQuY291bnQgJiYgcmVzLnJlc3VsdD8uRXZlbnQgJiYgcmVzLnJlc3VsdC5FdmVudD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGV2ZSA9IDA7IGV2ZSA8IHJlcy5yZXN1bHQuRXZlbnQ/Lmxlbmd0aDsgZXZlKyspIHtcclxuICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdC5FdmVudFtldmVdWydjcmVhdGVkRm9yJ10gJiYgcmVzLnJlc3VsdC5FdmVudFtldmVdWydjcmVhdGVkRm9yJ10ubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICByZXMucmVzdWx0LkV2ZW50W2V2ZV1bJ3Jlc291cmNlVHlwZSddID09PSAnU2FtdWhpayBDaGFyY2hhJ1xyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGV2ZW50c0RhdGEucHVzaChyZXMucmVzdWx0LkV2ZW50W2V2ZV1bJ2NyZWF0ZWRGb3InXVswXSlcclxuICAgICAgICAgICAgICBpZiAoZXZlbnRzRGF0YS5pbmNsdWRlcyh0aGlzLmNvbmZpZ1NlcnZpY2UudXNlclByb2ZpbGU/LnJvb3RPcmdJZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU2FtdWhpa0NoYXJjaGFUYWIgPSB0cnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLnJlZmVyZW5jZU5vZGVzKSB7XHJcbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhLnJlZmVyZW5jZU5vZGVzLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB1c2VyUm9sZXM6IFNldDxzdHJpbmc+ID0gdGhpcy5jb25maWdTZXJ2aWNlPy51c2VyUm9sZXMgfHwgbmV3IFNldCgpXHJcbiAgICAgICAgbGV0IGhhc0VkdWNhdG9yUm9sZSA9IGZhbHNlXHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIE1FTlRPUiByb2xlXHJcbiAgICAgICAgaWYgKHVzZXJSb2xlcy5oYXMoJ01FTlRPUicpIHx8XHJcbiAgICAgICAgICB1c2VyUm9sZXMuaGFzKCdtZW50b3InKSB8fFxyXG4gICAgICAgICAgdXNlclJvbGVzLmhhcygnTWVudG9yJykpIHtcclxuICAgICAgICAgIGhhc0VkdWNhdG9yUm9sZSA9IHRydWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGxvY2FsIHN0b3JhZ2UgZm9yIHN1cnZleSByZXNwb25zZSBvbmx5IGlmIFVSTCBjb250YWlucyAncHVibGljJyBvciAncHJldmlldz10cnVlJ1xyXG4gICAgICAgIGlmICghaGFzRWR1Y2F0b3JSb2xlICYmIHRoaXMuZm9yUHJldmlldykge1xyXG4gICAgICAgICAgY29uc3Qgc3VydmV5SWQgPSB0aGlzLmVudmlyb25tZW50LnB1YmxpY0NvbnRlbnRTdXJ2ZXlJZCB8fCAnJ1xyXG4gICAgICAgICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xyXG4gICAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9IGBzdXJ2ZXlfJHtzdXJ2ZXlJZH1fJHtjb3Vyc2VJZH1gXHJcbiAgICAgICAgICBjb25zdCBzdG9yZWREYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSlcclxuXHJcbiAgICAgICAgICBpZiAoc3RvcmVkRGF0YSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1cnZleVJlc3BvbnNlcyA9IEpTT04ucGFyc2Uoc3RvcmVkRGF0YSlcclxuICAgICAgICAgICAgICBjb25zdCBlZHVjYXRvclF1ZXN0aW9uID0gc3VydmV5UmVzcG9uc2VzLmZpbmQoKHJlc3BvbnNlOiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5xdWVzdGlvbiA9PT0gJ0FyZSB5b3UgYW4gRWR1Y2F0b3IvRmFjdWx0eSBtZW1iZXI/J1xyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBpZiAoZWR1Y2F0b3JRdWVzdGlvbiAmJiBlZHVjYXRvclF1ZXN0aW9uLmFuc3dlciA9PT0gJ1llcycpIHtcclxuICAgICAgICAgICAgICAgIGhhc0VkdWNhdG9yUm9sZSA9IHRydWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdXJ2ZXkgZGF0YSBmcm9tIGxvY2FsIHN0b3JhZ2U6JywgZXJyb3IpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCB0ZWFjaGVyTm90ZXNGbGFnIGlmIHVzZXIgaGFzIGVkdWNhdG9yIHJvbGVcclxuICAgICAgICBpZiAoaGFzRWR1Y2F0b3JSb2xlKSB7XHJcbiAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnJlc291cmNlQ2F0ZWdvcnkgJiYgaXRlbS5yZXNvdXJjZUNhdGVnb3J5ID09PSAnVGVhY2hlcnMgUmVzb3VyY2UnKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVhY2hlck5vdGVzRmxhZyA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0ucmVzb3VyY2VDYXRlZ29yeSAmJiBpdGVtLnJlc291cmNlQ2F0ZWdvcnkgPT09ICdSZWZlcmVuY2UgUmVzb3VyY2UnKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZU5vdGVzRmxhZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zaWRlTmF2QmFyT3BlbmVkKSB7XHJcbiAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0ODApIHtcclxuICAgICAgICBpZiAodGhpcy5pc01vYmlsZUZvckFJKSB7XHJcbiAgICAgICAgICB0aGlzLmlzTW9iaWxlRm9yQUkgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzTW9iaWxlRm9yQUkgPSBmYWxzZVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQ4MCkge1xyXG4gICAgICAgIHRoaXMuaXNNb2JpbGVGb3JBSSA9IHRydWVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzTW9iaWxlRm9yQUkgPSBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2Nyb2xsKCkge1xyXG4gICAgY29uc3Qgd2luZG93U2Nyb2xsID0gd2luZG93LnNjcm9sbFlcclxuICAgIGlmICh3aW5kb3dTY3JvbGwgPj0gKHRoaXMubWVudVBvc2l0aW9uIC0gKCh0aGlzLmlzTW9iaWxlKSA/IDk2IDogMTA0KSkpIHtcclxuICAgICAgdGhpcy5zdGlja3kgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0aWNreSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnRhYkNoYW5nZVZhbHVlID0gZXZlbnQudGFiXHJcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBldmVudC5pbmRleFxyXG4gICAgdGhpcy5sb2FkQ2hlY2tTZXJ2aWNlLmNvbXBvbmVudExvYWRlZCh0cnVlKVxyXG4gICAgLy8gY29uc29sZS5sb2coJ2V2ZW50JywgZXZlbnQpXHJcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcy5jb250ZW50JywgdGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkKVxyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhYi50ZXh0TGFiZWwgPT09ICdBSSBUdXRvcicpIHtcclxuICAgICAgdGhpcy5zaG93QUlUdXRvclBvcHVwID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmluZGV4ID09PSAwICYmIGV2ZW50LnRhYi50ZXh0TGFiZWwgPT09ICdUcmFuc2NyaXB0aW9uJykge1xyXG4gICAgICB0aGlzLnJhaXNlVHJhbnNjcmlwdGlvblRhYlN0YXJ0VGVsZW1ldHJ5KClcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yYWlzZVRyYW5zY3JpcHRpb25UYWJJbnRlcmFjdFRlbGVtZXRyeSgpXHJcbiAgICAgIH0sIDEwMDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJhaXNlVHJhbnNjcmlwdGlvblRhYlN0b3BUZWxlbWV0cnkoKVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHNob3dBaVR1dG9yQ29uZmlybVBvcHVwKCkge1xyXG4gICAgdGhpcy5yYWlzZUFJUG9wdXBTdGFydFRlbGVtZXRyeSgpXHJcbiAgICBpZiAodGhpcy5pc0Vucm9sbGVkKSB7XHJcbiAgICAgIHRoaXMuZnJvbUFJVHV0b3IgPSB0cnVlXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmFpc2VBSVBvcHVwSW50ZXJhY3RUZWxlbWV0cnkoKVxyXG4gICAgICB9LCAxMDAwKVxyXG5cclxuXHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmFpc2VBSVBvcHVwRW5kVGVsZW1ldHJ5KClcclxuICAgICAgfSwgMTAwMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmFpc2VBSVBvcHVwSW50ZXJhY3RUZWxlbWV0cnkoKVxyXG4gICAgICB9LCAxMDAwKVxyXG4gICAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKClcclxuXHJcbiAgICAgIGRpYWxvZ0NvbmZpZy53aWR0aCA9ICc0MjFweCdcclxuICAgICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7XHJcbiAgICAgICAgZW5yb2xsOiB0aGlzLmlzRW5yb2xsZWRcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFpVHV0b3JDb25maXJtUG9wdXBDb21wb25lbnQsIGRpYWxvZ0NvbmZpZylcclxuXHJcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UgPT09ICdlbnJvbGwnKSB7XHJcbiAgICAgICAgICB0aGlzLmZyb21BSVR1dG9yID0gdHJ1ZVxyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlID09PSAnbmVlZFRvRW5yb2xsJykge1xyXG4gICAgICAgICAgdGhpcy5lbnJvbGxVc2VyRm9yQUlUdXRvcigpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmFpc2VBSVBvcHVwRW5kVGVsZW1ldHJ5KClcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KCkge1xyXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgbGV0IHJlc3VtZURhdGFWMjogYW55XHJcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xyXG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XHJcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlID0gdGhpcy50b2NTdmMuZ2V0TWltZVR5cGUodGhpcy5jb250ZW50LCByZXN1bWVEYXRhVjIuaWRlbnRpZmllcilcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc3VtZURhdGFMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXHJcbiAgICAgICAgcmVzdW1lRGF0YVYyLmlkZW50aWZpZXIsXHJcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlLFxyXG4gICAgICAgIHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcclxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXHJcbiAgICAgICAgJ0xlYXJuaW5nIFJlc291cmNlJyxcclxuICAgICAgICB0aGlzLmdldEJhdGNoSWQoKSxcclxuICAgICAgICB0aGlzLmNvbnRlbnQubmFtZSxcclxuICAgICAgKVxyXG4gICAgICB0aGlzLmFjdGlvblNWQy5zZXRVcGRhdGVDb21wR3JvdXBPID0gdGhpcy5yZXN1bWVEYXRhTGlua1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy5yZXN1bWVEYXRhTGluaycsdGhpcy5yZXN1bWVEYXRhTGluaylcclxuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuYWN0aW9uU1ZDJywgdGhpcy5hY3Rpb25TVkMpXHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnJlc3VtZURhdGFMaW5rLnVybF0sIHtcclxuICAgICAgICBxdWVyeVBhcmFtczoge1xyXG4gICAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcclxuICAgICAgICAgIGZyb21BSVR1dG9yOiB0aGlzLmZyb21BSVR1dG9yXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxyXG4gICAgICAvLyAgIFt0aGlzLnJlc3VtZURhdGFMaW5rLnVybF0sXHJcbiAgICAgIC8vICAge1xyXG4gICAgICAvLyAgICAgcmVsYXRpdmVUbzogdGhpcy5yZXN1bWVEYXRhTGluay51cmwsXHJcbiAgICAgIC8vICAgICBxdWVyeVBhcmFtczogdGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcclxuICAgICAgLy8gICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBsYXlSZXN1bWVGb3JBSS5lbWl0KClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmVzdW1lRGF0YUZyb21MaXN0KHR5cGU/OiBzdHJpbmcpOiBhbnkgfCB2b2lkIHtcclxuICAgIGNvbnN0IHJlc3VtZUNvcHkgPSBbLi4udGhpcy5yZXN1bWVEYXRhXVxyXG4gICAgaWYgKCF0eXBlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuXHJcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxyXG4gICAgICAgIG5ldyBEYXRlKGIubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSkuc2hpZnQoKVxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcclxuICAgICAgICBtaW1lVHlwZTogbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgZmlyc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5Lmxlbmd0aCAmJiByZXN1bWVDb3B5WzBdXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxyXG4gICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJhdGNoSWQoKTogc3RyaW5nIHtcclxuICAgIGxldCBiYXRjaElkID0gJydcclxuICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XHJcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xyXG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiYXRjaElkXHJcbiAgfVxyXG5cclxuICByYWlzZUFJUG9wdXBTdGFydFRlbGVtZXRyeSgpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcclxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IFwiYWktdHV0b3ItdG9jLXBhZ2VcIiwgXCJwYWdlaWRcIjogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfWAgfSxcclxuICAgICAgICBvYmplY3Q6IHsgXCJpZFwiOiB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIsIFwidHlwZVwiOiB0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5IH0sXHJcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCxcclxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXHJcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6ICcvYXBwL3RvYycsIG1vZHVsZTogJ0xlYXJuJyB9LFxyXG4gICAgICBmcm9tOiAnJyxcclxuICAgICAgdG86ICdUZWxlbWV0cnknLFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcclxuICB9XHJcblxyXG4gIHJhaXNlQUlQb3B1cEVuZFRlbGVtZXRyeSgpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcclxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IFwiYWktdHV0b3ItdG9jLXBhZ2VcIiwgXCJwYWdlaWRcIjogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfWAgfSxcclxuICAgICAgICBvYmplY3Q6IHsgXCJpZFwiOiB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIsIFwidHlwZVwiOiB0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5IH0sXHJcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkLFxyXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcclxuICAgICAgICBtb2RlOiAndmlldycsXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogJy9hcHAvdG9jJywgbW9kdWxlOiAnTGVhcm4nIH0sXHJcbiAgICAgIGZyb206ICcnLFxyXG4gICAgICB0bzogJ1RlbGVtZXRyeScsXHJcbiAgICB9XHJcbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxyXG4gIH1cclxuXHJcbiAgcmFpc2VBSVBvcHVwSW50ZXJhY3RUZWxlbWV0cnkoKSB7XHJcbiAgICBjb25zdCBldmVudCA9IHtcclxuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXHJcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJ2NsaWNrJywgXCJpZFwiOiBcImFpLXR1dG9yLXRvYy1wYWdlXCIsIFwicGFnZWlkXCI6IGAvYXBwL3RvYy8ke3RoaXMuY29udGVudD8uaWRlbnRpZmllcn1gIH0sXHJcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxyXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcclxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXHJcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6ICcvYXBwL3RvYycsIG1vZHVsZTogJ0xlYXJuJyB9LFxyXG4gICAgICBmcm9tOiAnJyxcclxuICAgICAgdG86ICdUZWxlbWV0cnknLFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcclxuICB9XHJcblxyXG4gIGVucm9sbFVzZXJGb3JBSVR1dG9yKCkge1xyXG4gICAgdGhpcy5lbnJvbGxVc2VyVG9BSS5lbWl0KClcclxuICB9XHJcblxyXG4gIGFzeW5jIHBhcnNlVlRUKCkge1xyXG4gICAgbGV0IGlkZW50aWZpZXIgPSB0aGlzLnJlc291cmNlSWRlbnRpZmllclxyXG4gICAgLy8gY29uc29sZS5sb2coJ2lkZW50aWZpZXItLScsIGlkZW50aWZpZXIpXHJcbiAgICBhd2FpdCB0aGlzLnRvY1N2Yy5haUdldFJlc291cmNlVnR0RmlsZShpZGVudGlmaWVyKS5zdWJzY3JpYmUoYXN5bmMgKGRhdGFzOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGRhdGE6IGFueSA9IGRhdGFzPy5kYXRhXHJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoICYmIGRhdGFbMF1bJ3RyYW5zY3JpcHRpb25fdXJscyddICYmIGRhdGFbMF1bJ3RyYW5zY3JpcHRpb25fdXJscyddLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudnR0TGFuZ0FyciA9IGRhdGFbMF1bJ3RyYW5zY3JpcHRpb25fdXJscyddXHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSB0cnVlXHJcbiAgICAgICAgLy8gbGV0IHVybCA9ICBkYXRhWzBdWyd0cmFuc2NyaXB0aW9uX3VybHMnXVswXVsndXJpJ11cclxuICAgICAgICAvLyAgY29uc29sZS5sb2coJ3RoaXMudnR0TGFuZ0Fyci0tJyx0aGlzLnZ0dExhbmdBcnIpXHJcbiAgICAgICAgdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPSB0aGlzLnZ0dExhbmdBcnIgJiYgdGhpcy52dHRMYW5nQXJyLmxlbmd0aCAmJiB0aGlzLnZ0dExhbmdBcnJbMF0gJiYgdGhpcy52dHRMYW5nQXJyWzBdWydkZWZhdWx0X2xhbmcnXSA/ICdlbicgOiAnZW4nXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNjcmlwdExhbmd1YWdlID0gdGhpcy52dHRMYW5nQXJyICYmIHRoaXMudnR0TGFuZ0Fyci5sZW5ndGggJiYgdGhpcy52dHRMYW5nQXJyWzBdICYmIHRoaXMudnR0TGFuZ0FyclswXVsnZGVmYXVsdF9sYW5nJ10gPyAnZW4nIDogJ2VuJ1xyXG4gICAgICAgIC8vICBjb25zb2xlLmxvZygndGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UtLScsIHRoaXMudHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlKVxyXG4gICAgICAgIGxldCBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZSA9IHRoaXMudnR0TGFuZ0Fyci5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGl0ZW0/LmxhYmVsID09PSB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlICYmIHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZSA9IHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlWzBdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGUgPSB0aGlzLnZ0dExhbmdBcnJbMF1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGUtLScsIHRoaXMuc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGUpXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRBcnIgPSB0aGlzLnZ0dExhbmdBcnIuZmlsdGVyKFxyXG4gICAgICAgICAgKGl0ZW06IGFueSkgPT4gaXRlbS5sYWJlbCA9PT0gdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VcclxuICAgICAgICApXHJcbiAgICAgICAgbGV0IHVybCA9IGZpbHRlcmVkQXJyLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEFyclswXS51cmkgOiBudWxsXHJcbiAgICAgICAgLy9sZXQgdXJsID0gdGhpcy52dHRMYW5nQXJyLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLmxhYmVsID09PSB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSlbMF1bJ3VyaSddXHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IFZ0dEZpbGUuZnJvbVVybCh1cmwpXHJcbiAgICAgICAgICBsZXQgYmxvY2tzOiBhbnkgPSBmaWxlLmdldEJsb2NrcygpXHJcblxyXG4gICAgICAgICAgdGhpcy5zdWJUaXRsZXMgPSBibG9ja3NcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMudnR0TGFuZ0Fyci0tJyx0aGlzLnZ0dExhbmdBcnIpXHJcbiAgICAgICAgLy8gaWYodGhpcy52dHRMYW5nQXJyICYmIHRoaXMudnR0TGFuZ0Fyci5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgIHRoaXMudHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlID0gdGhpcy52dHRMYW5nQXJyWzBdWydsYWJlbCddXHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgIHRoaXMudHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlICA9IHRoaXMudnR0TGFuZ0FyclswXVsnZGVmYXVsdF9sYW5nJ11cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlVHJhbnNjcmlwdGlvbkxhbmd1YWdlRXZlbnQubmV4dCh7IGFjdGl2ZUxhbmc6IHRoaXMudHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlLCBsYW5nRGF0YTogdGhpcy52dHRMYW5nQXJyLCBsb2FkUGxheWVyOiB0cnVlIH0pXHJcblxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnZ0dExhbmdBcnIgPSBbXVxyXG4gICAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSBmYWxzZVxyXG4gICAgICB9XHJcblxyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyByZW5kZXJTZWxlY3RlZExhbmd1YWdlVHJhbnNjcmlwdGlvbihfbGFuZ3ZhbHVlOiBhbnkpIHtcclxuICAgIC8vIHRoaXMudHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlID0gdGhpcy5zZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZT8ubGFiZWxcclxuICAgIGlmICh0eXBlb2YgX2xhbmd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgX2xhbmd2YWx1ZSkge1xyXG4gICAgICB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSA9IF9sYW5ndmFsdWVcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlID0gX2xhbmd2YWx1ZT8udmFsdWVcclxuICAgICAgdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPSB0aGlzLnNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYWJlbFxyXG4gICAgICB0aGlzLnRyYW5zY3JpcHRBY3RpdmVMYW5ndWFnZVRleHQgPSBfbGFuZ3ZhbHVlPy52YWx1ZT8ubGFuZ3VhZ2VcclxuICAgIH1cclxuICAgIHRoaXMucmFpc2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VTdGFydFRlbGVtZXRyeSgpXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yYWlzZVRyYW5zY3JpcHRpb25MYW5ndWFnZUludGVyYWN0VGVsZW1ldHJ5KClcclxuICAgIH0pXHJcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLnZ0dExhbmdBcnIuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LmxhYmVsID09PSB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSlcclxuICAgIGlmIChjdXJyZW50UGF0aCAmJiBjdXJyZW50UGF0aC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZSA9IGN1cnJlbnRQYXRoWzBdXHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgVnR0RmlsZS5mcm9tVXJsKGN1cnJlbnRQYXRoICYmIGN1cnJlbnRQYXRoWzBdPy51cmkpXHJcbiAgICBsZXQgYmxvY2tzOiBhbnkgPSBmaWxlLmdldEJsb2NrcygpXHJcbiAgICB0aGlzLnN1YlRpdGxlcyA9IGJsb2Nrc1xyXG4gICAgdGhpcy5yYWlzZVRyYW5zY3JpcHRpb25MYW5ndWFnZVN0b3BUZWxlbWV0cnkoKVxyXG4gICAgLy8gdGhpcy50b2NTdmMuY2hhbmdlVHJhbnNjcmlwdGlvbkxhbmd1YWdlRXZlbnQubmV4dCh7YWN0aXZlTGFuZzogdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UsIGxhbmdEYXRhOiB0aGlzLnZ0dExhbmdBcnIsIGxvYWRQbGF5ZXI6ZmFsc2V9KVxyXG5cclxuICB9XHJcblxyXG4gIG9wZW5TdXJ2ZXlGb3JtUG9wdXAoZXZlbnQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudHJpZ2VyQ29tcGxldGlvblN1cnZleUZvcm0uZW1pdChldmVudClcclxuICB9XHJcblxyXG4gIHBsYXlGcm9tU2xvdChzdWJ0aXRsZTogYW55KSB7XHJcbiAgICBpZiAoc3VidGl0bGUpIHtcclxuICAgICAgbGV0IHN0YXJ0VGltZSA9IHN1YnRpdGxlLnN0YXJ0VGltZSAvIDEwMDBcclxuICAgICAgbGV0IGVuZFRpbWUgPSBzdWJ0aXRsZS5lbmRUaW1lIC8gMTAwMFxyXG4gICAgICB0aGlzLnRvY1N2Yy5wbGF5VHJhbnNjcmlwdGlvblZpZGVvLm5leHQoeyBzdGFydFRpbWUsIGVuZFRpbWUgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdE1zVG9WdHRUaW1lKG1zOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApXHJcbiAgICAvLyAgY29uc3QgbWlsbGlzZWNvbmRzID0gbXMgJSAxMDAwO1xyXG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApXHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MClcclxuICAgIGNvbnN0IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MFxyXG5cclxuICAgIGNvbnN0IHBhZCA9IChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyKSA9PiBudW0udG9TdHJpbmcoKS5wYWRTdGFydChzaXplLCAnMCcpXHJcblxyXG4gICAgLy8gcmV0dXJuIGAke3BhZChob3VycywgMil9OiR7cGFkKG1pbnV0ZXMsIDIpfToke3BhZChzZWNvbmRzLCAyKX0uJHtwYWQobWlsbGlzZWNvbmRzLCAzKX1gO1xyXG4gICAgcmV0dXJuIGAke3BhZChob3VycywgMil9OiR7cGFkKG1pbnV0ZXMsIDIpfToke3BhZChzZWNvbmRzLCAyKX1gXHJcbiAgfVxyXG5cclxuICBvbmx5c2Nvcm1Bc3Nlc3NtZW50RXhpc3RzKGRhdGE6IGFueSwga2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGE/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChkYXRhW2ldICYmIGRhdGFbaV1bJ2NoaWxkcmVuJ10gJiYgZGF0YVtpXVsnY2hpbGRyZW4nXS5sZW5ndGgpIHtcclxuICAgICAgICAvLyB0aGlzLnRvdGFsUmVzb3VyY2UgPSB0aGlzLnRvdGFsUmVzb3VyY2UgKyAxXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2luIGNoaWxkcmVuJylcclxuICAgICAgICB0aGlzLm9ubHlzY29ybUFzc2Vzc21lbnRFeGlzdHMoZGF0YVtpXT8uY2hpbGRyZW4sIGtleSwgdmFsdWUpXHJcbiAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgIHRoaXMudG90YWxSZXNvdXJjZSA9IHRoaXMudG90YWxSZXNvdXJjZSArIDFcclxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoZGF0YVtpXVtrZXldKSkge1xyXG4gICAgICAgICAgLy8gdGhpcy5zaG93QUlUdXRvckZsYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2Nvcm1Bc3Nlc3NtZW50Q291bnQgPSB0aGlzLnNjb3JtQXNzZXNzbWVudENvdW50ICsgMVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRvdGFsUmVzb3VyY2UgPT09IHRoaXMuc2Nvcm1Bc3Nlc3NtZW50Q291bnQpIHtcclxuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlQUlUdXRvckZsYWdcclxuICB9XHJcblxyXG4gIHJhaXNlVHJhbnNjcmlwdGlvblRhYlN0YXJ0VGVsZW1ldHJ5KCkge1xyXG4gICAgY29uc3QgZXZlbnQgPSB7XHJcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxyXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogXCJhaS10dXRvci12aWV3ZXItcGFnZVwiLCBcInBhZ2VpZFwiOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBzdWJUeXBlOiAndHJhbnNjcmlwdC10YWInIH0sXHJcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxyXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQsXHJcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxyXG4gICAgICAgIG1vZGU6ICd2aWV3JyxcclxuICAgICAgfSxcclxuICAgICAgcGFnZUNvbnRleHQ6IHsgcGFnZUlkOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBtb2R1bGU6ICdMZWFybicgfSxcclxuICAgICAgZnJvbTogJycsXHJcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcclxuICAgIH1cclxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXHJcbiAgfVxyXG5cclxuICByYWlzZVRyYW5zY3JpcHRpb25UYWJJbnRlcmFjdFRlbGVtZXRyeSgpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcclxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IFwiYWktdHV0b3Itdmlld2VyLXBhZ2VcIiwgXCJwYWdlaWRcIjogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgc3ViVHlwZTogJ3RyYW5zY3JpcHQtdGFiJyB9LFxyXG4gICAgICAgIG9iamVjdDogeyBcImlkXCI6IHRoaXMuY29udGVudD8uaWRlbnRpZmllciwgXCJ0eXBlXCI6IHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnkgfSxcclxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuSW50ZXJhY3QsXHJcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxyXG4gICAgICAgIG1vZGU6ICd2aWV3JyxcclxuICAgICAgfSxcclxuICAgICAgcGFnZUNvbnRleHQ6IHsgcGFnZUlkOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBtb2R1bGU6ICdMZWFybicgfSxcclxuICAgICAgZnJvbTogJycsXHJcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcclxuICAgIH1cclxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXHJcbiAgfVxyXG5cclxuICByYWlzZVRyYW5zY3JpcHRpb25UYWJTdG9wVGVsZW1ldHJ5KCkge1xyXG4gICAgY29uc3QgZXZlbnQgPSB7XHJcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxyXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogXCJhaS10dXRvci12aWV3ZXItcGFnZVwiLCBcInBhZ2VpZFwiOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBzdWJUeXBlOiAndHJhbnNjcmlwdC10YWInIH0sXHJcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxyXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5VbmxvYWRlZCxcclxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXHJcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIG1vZHVsZTogJ0xlYXJuJyB9LFxyXG4gICAgICBmcm9tOiAnJyxcclxuICAgICAgdG86ICdUZWxlbWV0cnknLFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcclxuICB9XHJcblxyXG4gIHJhaXNlVHJhbnNjcmlwdGlvbkxhbmd1YWdlU3RhcnRUZWxlbWV0cnkoKSB7XHJcbiAgICBjb25zdCBldmVudCA9IHtcclxuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXHJcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJ2NsaWNrJywgXCJpZFwiOiB0aGlzLnRyYW5zY3JpcHRBY3RpdmVMYW5ndWFnZVRleHQsIFwicGFnZWlkXCI6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIHN1YlR5cGU6ICd0cmFuc2NyaXB0LWxhbmd1YWdlJyB9LFxyXG4gICAgICAgIG9iamVjdDogeyBcImlkXCI6IHRoaXMuY29udGVudD8uaWRlbnRpZmllciwgXCJ0eXBlXCI6IHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnkgfSxcclxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkLFxyXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcclxuICAgICAgICBtb2RlOiAndmlldycsXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgbW9kdWxlOiAnTGVhcm4nIH0sXHJcbiAgICAgIGZyb206ICcnLFxyXG4gICAgICB0bzogJ1RlbGVtZXRyeScsXHJcbiAgICB9XHJcbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxyXG4gIH1cclxuXHJcbiAgcmFpc2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VJbnRlcmFjdFRlbGVtZXRyeSgpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcclxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IHRoaXMudHJhbnNjcmlwdEFjdGl2ZUxhbmd1YWdlVGV4dCwgXCJwYWdlaWRcIjogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgc3ViVHlwZTogJ3RyYW5zY3JpcHQtbGFuZ3VhZ2UnIH0sXHJcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxyXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcclxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXHJcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIG1vZHVsZTogJ0xlYXJuJyB9LFxyXG4gICAgICBmcm9tOiAnJyxcclxuICAgICAgdG86ICdUZWxlbWV0cnknLFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcclxuICB9XHJcblxyXG4gIHJhaXNlVHJhbnNjcmlwdGlvbkxhbmd1YWdlU3RvcFRlbGVtZXRyeSgpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0ge1xyXG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcclxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IHRoaXMudHJhbnNjcmlwdEFjdGl2ZUxhbmd1YWdlVGV4dCwgXCJwYWdlaWRcIjogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgc3ViVHlwZTogJ3RyYW5zY3JpcHQtbGFuZ3VhZ2UnIH0sXHJcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxyXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5VbmxvYWRlZCxcclxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXHJcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIG1vZHVsZTogJ0xlYXJuJyB9LFxyXG4gICAgICBmcm9tOiAnJyxcclxuICAgICAgdG86ICdUZWxlbWV0cnknLFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcclxuICB9XHJcblxyXG4gIGNsb3NlQUlQb3B1cChldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgdGhpcy5zaG93QUlUdXRvclBvcHVwID0gZmFsc2VcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5yZXNvdXJjZUlkZW50aWZpZXIkKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VJZGVudGlmaWVyJC51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ViVGl0bGVzJCkge1xyXG4gICAgICB0aGlzLnN1YlRpdGxlcyQudW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRyYW5zcmlwdGlvbkxhbmd1YWdlU3ViKSB7XHJcbiAgICAgIHRoaXMudHJhbnNyaXB0aW9uTGFuZ3VhZ2VTdWIudW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJDb21tZW50SWRGcm9tVXJsKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3VycmVudFF1ZXJ5UGFyYW1zID0geyAuLi50aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zIH1cclxuICAgIGRlbGV0ZSBjdXJyZW50UXVlcnlQYXJhbXMuY29tbWVudElkXHJcbiAgICB0aGlzLmNvbW1lbnRJZCA9ICcnXHJcbiAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLm5ld0NvbW1lbnRTZWN0aW9uLnNob3cgPSB0cnVlXHJcbiAgfVxyXG5cclxuICByZXN1bWVDb250ZW50Q2FsbCgpIHtcclxuICAgIHRoaXMucmVzdW1lQ29udGVudC5lbWl0KClcclxuICB9XHJcbn0iLCI8IS0tICYmIChjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSAhPT0gY291cnNlQ2F0ZWdvcnk/LkJMRU5ERURfUFJPR1JBTSkgLS0+XHJcbjxkaXYgY2xhc3M9XCJhaS10dXRvci1nZXQtc3RhcnRlZFwiICpuZ0lmPVwiIXZpZXdlclBhZ2UgJiYgZW5hYmxlQUlUdXRvckZsYWcgJiYgIWlzTW9iaWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBweS0yXCI+XHJcbiAgICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2JvdC1jaGF0LXNtYWxsLnN2Z1wiIGhlaWdodD1cIjY0cHhcIiB3aWR0aD1cIjY0cHhcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMlwiIFtuZ0NsYXNzXT1cImlzTW9iaWxlID8gJycgOiAndy01NjUnXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtd2VpZ2h0LTYwMFwiPkdldCBTdGFydGVkIHdpdGggQUkgVHV0b3I8L3A+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5HZXQgaW5zdGFudCBleHBsYW5hdGlvbnMsIHN0ZXAtYnktc3RlcCBsZWFybmluZyBndWlkYW5jZSwgYW5kIGN1c3RvbWlzZWQgbGVhcm5pbmcgdGFpbG9yZWQganVzdFxyXG4gICAgICAgICAgICAgICAgICAgIGZvciB5b3UuPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXR1dG9yLWJ0biBweC0yIHB5LTFcIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwic2hvd0FpVHV0b3JDb25maXJtUG9wdXAoKVwiPjxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2FpLXR1dG9yL2FpLWljb24uc3ZnXCI+Jm5ic3A7ICZuYnNwOyA8c3BhbiBjbGFzcz1cImFpLXR1dG9yLWxhYmVsXCI+QUkgVHV0b3I8L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cInRhYi1ncm91cC1jb250YWluZXJcIj5cclxuICAgIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJoYW5kbGVUYWJDaGFuZ2UoJGV2ZW50KVwiICNzdGlja3lNZW51IFtjbGFzcy5zdGlja3ktbWF0LXRhYnNdPVwic3RpY2t5XCJcclxuICAgICAgICBbc2VsZWN0ZWRJbmRleF09XCJzZWxlY3RlZFRhYkluZGV4XCIgW25nQ2xhc3NdPVwieydjb250ZW50LXRhYnMnOiFmcm9tVmlld2VyLCdjb250ZW50U3RpY2t5JzogZm9yUHJldmlld31cIj5cclxuXHJcbiAgICAgICAgPCEtLSBUcmFuc2NyaXB0aW9uIFRhYiAtLT5cclxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIlRyYW5zY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAqbmdJZj1cInZpZXdlclBhZ2UgJiYgZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgJiYgdnR0TGFuZ0Fycj8ubGVuZ3RoICYmIHN1YlRpdGxlcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UcmFuc2NyaXB0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWQtY2lyY2xlIG1sLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTmV3XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc2NsYWltZXIgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHktMiBweC0yXCI+RGlzY2xhaW1lciA6IFRoZXNlIHRyYW5zY3JpcHRzIGFuZCBzdWJ0aXRsZXMgYXJlIEFJLWdlbmVyYXRlZCBhbmQgbWF5IGNvbnRhaW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBtbC01IG1yLTVcIiAqbmdJZj1cImlzTW9iaWxlRm9yQUlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJhbnNjcmlwdC1mbGV4LWNvbnRhaW5lciBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3RcIiBhcHBlYXJhbmNlPVwiZmlsbFwiIHN0eWxlPVwiaGVpZ2h0OiBhdXRvOyB3aWR0aDogMTAwJTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3QtYm94IHByLTVcIiBbKHZhbHVlKV09XCJzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJyZW5kZXJTZWxlY3RlZExhbmd1YWdlVHJhbnNjcmlwdGlvbigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlciBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3QtYm94LXRyaWdnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW9wdGlvbi1jb250ZW50IHB4LTUgcHktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPT09IHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5UcmFuc2NyaXB0IExhbmd1YWdlOiA8L2I+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/Lmxhbmd1YWdlIHwgdGl0bGVjYXNlfX0gPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkZWZhdWx0VHJhbnNjcmlwdExhbmd1YWdlID09PSBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZT8ubGFiZWxcIj4oQXV0byk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LW9wdGlvblwiIHZhbHVlPVwiXCIgKm5nRm9yPVwibGV0IGxhbmcgb2YgdnR0TGFuZ0FyclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtb3B0aW9uJzogc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/LmxhYmVsID09PSBsYW5nPy5sYWJlbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2xhbmc/Lmxhbmd1YWdlIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtNCBmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHRyYW5zY3JpcHQtY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sIHJlcXVpcmVkIGNsYXNzPVwic2VjdGlvbi1kZFwiIChjaGFuZ2UpPVwicmVuZGVyU2VsZWN0ZWRMYW5ndWFnZVRyYW5zY3JpcHRpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJsYW5nPy5sYW5ndWFnZVwiICpuZ0Zvcj1cImxldCBsYW5nIG9mIHZ0dExhbmdBcnJcIiBbc2VsZWN0ZWRdPVwibGFuZz8ubGFiZWwgPT09IHRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSA9PT0gbGFuZz8ubGFiZWxcIj4gVHJhbnNjcmlwdCBMYW5ndWFnZTogPC9zcGFuPiB7e2xhbmc/Lmxhbmd1YWdlIHwgdGl0bGVjYXNlfX0gPHNwYW4gKm5nSWY9XCJ0cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPT09IGxhbmc/Lmxhbmd1YWdlXCI+KEF1dG8pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHctZnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIiFpc01vYmlsZUZvckFJID8gJ3ctc3VidGl0bGUtODAnOid3LWZ1bGwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIiFpc01vYmlsZUZvckFJID8gJ21sLTUtcGVyJyA6ICcnXCIgKm5nSWY9XCJzdWJUaXRsZXMgJiYgc3ViVGl0bGVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRyYW5zY3JpcHRpb24gY29udGVudCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJ0aXRsZSBvZiBzdWJUaXRsZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlLXRpbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJwbGF5RnJvbVNsb3Qoc3VidGl0bGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLTEgYmx1ZS11bmRlcmxpbmVcIj4ge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRNc1RvVnR0VGltZShzdWJ0aXRsZT8uc3RhcnRUaW1lKSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJsYWNrLXRleHRcIj4tPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xIGJsdWUtdW5kZXJsaW5lXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRNc1RvVnR0VGltZShzdWJ0aXRsZT8uZW5kVGltZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtNCBzdWJ0aXRsZS10ZXh0LXNsb3QgbXItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImJsYWNrLXRleHRcIiBbaW5uZXJIdG1sXT1cInN1YnRpdGxlPy50ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGlnaGxpZ2h0IDoga2V5d29yZFRvSGlnaGxpZ2h0Py50ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChzdWJ0aXRsZT8uc3RhcnRUaW1lIC8gMTAwMCkgPj0ga2V5d29yZFRvSGlnaGxpZ2h0Py5zdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnRpdGxlPy5lbmRUaW1lIC8gMTAwMCkgPD0ga2V5d29yZFRvSGlnaGxpZ2h0Py5lbmQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctc3VidGl0bGUtMjBcIiAqbmdJZj1cIiFpc01vYmlsZUZvckFJXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJhbnNjcmlwdC1mbGV4LWNvbnRhaW5lciBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibXVsdGlsaW5lLXNlbGVjdFwiIGFwcGVhcmFuY2U9XCJmaWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IGF1dG87IHdpZHRoOiAxMDAlO1wiIGZsb2F0TGFiZWw9XCJuZXZlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3QtYm94IHByLTVcIiBbKHZhbHVlKV09XCJzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInJlbmRlclNlbGVjdGVkTGFuZ3VhZ2VUcmFuc2NyaXB0aW9uKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXIgY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LWJveC10cmlnZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW9wdGlvbi1jb250ZW50IHB4LTUgcHktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlID09PSBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZT8ubGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5UcmFuc2NyaXB0IExhbmd1YWdlOiA8L2I+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZT8ubGFuZ3VhZ2UgfCB0aXRsZWNhc2V9fSA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGVmYXVsdFRyYW5zY3JpcHRMYW5ndWFnZSA9PT0gc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/LmxhYmVsXCI+KEF1dG8pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LW9wdGlvblwiIHZhbHVlPVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGFuZyBvZiB2dHRMYW5nQXJyXCIgW3ZhbHVlXT1cImxhbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLW9wdGlvbic6IHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYWJlbCA9PT0gbGFuZz8ubGFiZWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7bGFuZz8ubGFuZ3VhZ2UgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIG15LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+MC4wMDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cD5BSSBmb3IgRGlnaXRhbCBUcmFuc2Zvcm1hdGlvbjogTWFjaGluZSBMZWFybmluZyBhbmQgRGVlcCBMZWFybmluZyAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sIHJlcXVpcmVkIGNsYXNzPVwic2VjdGlvbi1kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlRyYW5zY3JpcHRpb24gTGFuZ3VhZ2U6IEVuZ2xpc2ggKEF1dG8pPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L21hdC10YWI+XHJcblxyXG4gICAgICAgIDwhLS0gQWJvdXQgVGFiIC0tPlxyXG4gICAgICAgIDxtYXQtdGFiIGxhYmVsPVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYWJvdXQnIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXR1dG9yLWdldC1zdGFydGVkLW1vYmlsZSBteS0yIG1sLTJcIiAqbmdJZj1cIiF2aWV3ZXJQYWdlICYmIGVuYWJsZUFJVHV0b3JGbGFnICYmIGlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHctOThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYm90LWNoYXQtc21hbGwuc3ZnXCIgaGVpZ2h0PVwiNDhweFwiIHdpZHRoPVwiNDhweFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgdy02MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtd2VpZ2h0LTYwMFwiPkdldCBTdGFydGVkIHdpdGggQUkgVHV0b3I8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+R2V0IGluc3RhbnQgZXhwbGFuYXRpb25zLCBzdGVwLWJ5LXN0ZXAgbGVhcm5pbmcgZ3VpZGFuY2UsIGFuZCBjdXN0b21pc2VkIGxlYXJuaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxvcmVkIGp1c3QgZm9yIHlvdS48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktdHV0b3ItYnRuIHB4LTIgcHktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJzaG93QWlUdXRvckNvbmZpcm1Qb3B1cCgpXCI+PGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvYWktdHV0b3IvYWktaWNvbi5zdmdcIj4mbmJzcDsgJm5ic3A7IDxzcGFuIGNsYXNzPVwiYWktdHV0b3ItbGFiZWxcIj5BSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXRvcjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIG15LTIgbXgtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS10dXRvci1idG4gcHgtMiBweS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwic2hvd0FpVHV0b3JDb25maXJtUG9wdXAoKVwiPjxpbWcgc3JjPVwiYXNzZXRzL2FpLXR1dG9yL2FpLWljb24uc3ZnXCI+Jm5ic3A7ICZuYnNwOyA8c3BhbiBjbGFzcz1cImFpLXR1dG9yLWxhYmVsXCI+QUkgVHV0b3I8L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtYWJvdXQgW2Zyb21WaWV3ZXJdPVwiZnJvbVZpZXdlclwiIFtwYXRoU2V0XT1cInBhdGhTZXRcIiBbY29udGVudF09XCJjb250ZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW2NvbmZpZ109XCJjb25maWdcIiBbZm9yUHJldmlld109XCJmYWxzZVwiIFtzdGlja3ldPVwic3RpY2t5XCJcclxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRCYXRjaERhdGFdPVwic2VsZWN0ZWRCYXRjaERhdGFcIiBbc2VsZWN0ZWRUYWJWYWx1ZV09XCJzZWxlY3RlZFRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbc2tlbGV0b25Mb2FkZXJdPVwic2tlbGV0b25Mb2FkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25kaXRpb25dPVwiY29uZGl0aW9uXCIgW2twYXJyYXldPVwia3BhcnJheVwiIFtzaG93UmV2aWV3c109XCIndHJ1ZSdcIiBbbGFuZ3VhZ2VMaXN0XT1cImxhbmd1YWdlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xvY2tDZXJ0aWZpY2F0ZV09XCJsb2NrQ2VydGlmaWNhdGVcIiAodHJpZ2VyQ29tcGxldGlvblN1cnZleUZvcm0pPVwib3BlblN1cnZleUZvcm1Qb3B1cCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hcHAtdG9jLWFib3V0PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICAgICAgPCEtLSBDb250ZW50IFRhYiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbnRlbnQnIHwgdHJhbnNsYXRlIH19XCIgKm5nSWY9XCJjb250ZW50VGFiRmxhZ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiIFtjb21wb25lbnROYW1lXT1cImNvbXBvbmVudE5hbWVcIiBbcGF0aFNldF09XCJwYXRoU2V0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiY29udGVudFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW2NvbmZpZ109XCJjb25maWdcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VtZURhdGFdPVwicmVzdW1lRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCIgW3NrZWxldG9uTG9hZGVyXT1cInNrZWxldG9uTG9hZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L21hdC10YWI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWc/LmNvbW1lbnRzVGFiICYmICFmb3JQcmV2aWV3XCI+XHJcbiAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc3RhcnREaXNjdXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcmF0aW5ncy1kaXYgbXQtNVwiIGlkPVwiY29tbWVudHNEaXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc2N1c3NXaWRnZXREYXRhICYmIGRpc2N1c3NXaWRnZXREYXRhPy5uZXdDb21tZW50U2VjdGlvbj8uY29tbWVudFRyZWVEYXRhPy5lbnRpdHlJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbW1lbnRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGQtdjItd2lkZ2V0LWNvbW1lbnQgW3dpZGdldERhdGFdPVwiZGlzY3Vzc1dpZGdldERhdGFcIj48L2QtdjItd2lkZ2V0LWNvbW1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tbWVudElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBjdXJzb3ItcG9pbnRlciBtYi01XCIgKGNsaWNrKT1cImNsZWFyQ29tbWVudElkRnJvbVVybCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5hcnJvd19iYWNrPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrIHRvIGFsbCBjb21tZW50c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZC12Mi13aWRnZXQtY29tbWVudCBbd2lkZ2V0RGF0YV09XCJkaXNjdXNzV2lkZ2V0RGF0YVwiIFtjb21tZW50SWRdPVwiY29tbWVudElkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2tlbGV0b25Mb2FkZXJdPjwvZC12Mi13aWRnZXQtY29tbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L21hdC10YWI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZz8uc2FtdWhpa0NoYXJjaGFUYWIgJiYgY29uZGl0aW9uICYmIGNvbnRlbnRSZWFkRGF0YT8uZXZlbnRMaW5rZWQ/Lmxlbmd0aCA+IDAgJiYgZW5hYmxlU2FtdWhpa0NoYXJjaGFUYWJcIj5cclxuICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5zYW11aGlrQ2hhcmNoYScgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJhdGluZ3MtZGl2IG10LTVcIiBpZD1cInNhbXVoaWtDaGFyY2hhRGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2FtdWhpay1jaGFyY2hhLWNvbnRlbnQgW2NvbnRlbnRdPVwiY29udGVudFJlYWREYXRhXCIgW2NvbmRpdGlvbkRhdGFdPVwiY29uZGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bWVDb250ZW50KT1cInJlc3VtZUNvbnRlbnRDYWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtc2FtdWhpay1jaGFyY2hhLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L21hdC10YWI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gVGVhY2hlcnMgTm90ZSBUYWIgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucmVmZXJlbmNlTm9kZXMgJiYgdGVhY2hlck5vdGVzRmxhZ1wiPlxyXG4gICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIlRlYWNoZXJzIE5vdGVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJhdGluZ3MtZGl2IG10LTVcIiBpZD1cInRlYWNoZXJzTm90ZURpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtdGVhY2hlcnMtbm90ZXMgW2NvbnRlbnRdPVwiY29udGVudFJlYWREYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub3Rlc0Rpc3BsYXlUeXBlXT1cIidUZWFjaGVycyBSZXNvdXJjZSdcIj48L3dzLXdpZGdldC1hcHAtdG9jLXRlYWNoZXJzLW5vdGVzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFJlZmVyZW5jZSBOb3RlIFRhYiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5yZWZlcmVuY2VOb2RlcyAmJiByZWZlcmVuY2VOb3Rlc0ZsYWdcIj5cclxuICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJSZWZlcmVuY2UgTm90ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcmF0aW5ncy1kaXYgbXQtNVwiIGlkPVwidGVhY2hlcnNOb3RlRGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy10ZWFjaGVycy1ub3RlcyBbY29udGVudF09XCJjb250ZW50UmVhZERhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25vdGVzRGlzcGxheVR5cGVdPVwiJ1JlZmVyZW5jZSBSZXNvdXJjZSdcIj48L3dzLXdpZGdldC1hcHAtdG9jLXRlYWNoZXJzLW5vdGVzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8d3Mtd2lkZ2V0LWFwcC10b2MtcmVmZXJlbmNlLW5vdGVzIFtjb250ZW50XT1cImNvbnRlbnRSZWFkRGF0YVwiPjwvd3Mtd2lkZ2V0LWFwcC10b2MtcmVmZXJlbmNlLW5vdGVzPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbWF0LXRhYj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBc3NpZ25tZW50c1RhYiAmJiAhZm9yUHJldmlld1wiPlxyXG4gICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmFzc2lnbm1lbnRzJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcmF0aW5ncy1kaXYgbXQtNVwiIGlkPVwidGFrZUFzc2Vzc21lbnREaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtYmF0Y2gtYXNzaWdubWVudHMgW2NvbnRlbnRdPVwiY29udGVudFwiPjwvd3Mtd2lkZ2V0LWFwcC1iYXRjaC1hc3NpZ25tZW50cz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbWF0LXRhYj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBUcmFuc2NyaXB0aW9uIFRhYiAtLT5cclxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIkFJIFR1dG9yXCIgKm5nSWY9XCJ2aWV3ZXJQYWdlICYmIGVuYWJsZUFJVHV0b3JGbGFnICYmIGlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBUdXRvcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVkLWNpcmNsZSBtbC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ld1xyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QUlUdXRvclBvcHVwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHZpZXdlci1haS10dXRvciBbY29udGVudF09XCJjb250ZW50Py5pZGVudGlmaWVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZUFJUG9wdXApPVwiY2xvc2VBSVBvcHVwKCRldmVudClcIj48L3ZpZXdlci1haS10dXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbWF0LXRhYj5cclxuICAgIDwvbWF0LXRhYi1ncm91cD5cclxuPC9kaXY+Il19
1
+ import { Component, EventEmitter, HostListener, Inject, Input, Output, ViewChild, ViewChildren } from '@angular/core';
2
+ import { WsEvents } from '@sunbird-cb/utils-v2';
3
+ import { AiTutorConfirmPopupComponent } from './ai-tutor-confirm-popup/ai-tutor-confirm-popup.component';
4
+ import { MatLegacyDialogConfig as MatDialogConfig } from '@angular/material/legacy-dialog';
5
+ import { viewerRouteGenerator } from '../../../_services/viewer-route-util';
6
+ import { VttFile } from '@polyflix/vtt-parser';
7
+ import { tap } from 'rxjs/operators';
8
+ import { MatTab } from '@angular/material/tabs';
9
+ import * as _ from 'lodash';
10
+ import { NsContent } from '../../../_collection-api';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/router";
13
+ import * as i2 from "@sunbird-cb/utils-v2";
14
+ import * as i3 from "../../../services/load-check.service";
15
+ import * as i4 from "@angular/material/legacy-dialog";
16
+ import * as i5 from "../../../services/app-toc.service";
17
+ import * as i6 from "../../../services/action.service";
18
+ import * as i7 from "../../../services/viewer-data.service";
19
+ import * as i8 from "../../../_services/samuhik-charcha.service";
20
+ import * as i9 from "@angular/common";
21
+ import * as i10 from "@angular/material/icon";
22
+ import * as i11 from "@angular/material/tabs";
23
+ import * as i12 from "@sunbird-cb/discussion-v2";
24
+ import * as i13 from "@angular/material/form-field";
25
+ import * as i14 from "@angular/material/select";
26
+ import * as i15 from "@angular/material/core";
27
+ import * as i16 from "./app-toc-about/app-toc-about.component";
28
+ import * as i17 from "./app-toc-content/app-toc-content.component";
29
+ import * as i18 from "./app-toc-teachers-notes/app-toc-teachers-notes.component";
30
+ import * as i19 from "./app-toc-batch-assignments/app-toc-batch-assignments.component";
31
+ import * as i20 from "./samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component";
32
+ import * as i21 from "../ai-tutor/ai-tutor.component";
33
+ import * as i22 from "@ngx-translate/core";
34
+ import * as i23 from "../../../_pipes/highlight.pipe";
35
+ export class ContentTocComponent {
36
+ constructor(route, utilityService, loadCheckService, configService, dialog, tocSvc, actionSVC, router, eventSvc, viewerDataSvc, samuhikCharchaSvc, domainConfService, environment) {
37
+ this.route = route;
38
+ this.utilityService = utilityService;
39
+ this.loadCheckService = loadCheckService;
40
+ this.configService = configService;
41
+ this.dialog = dialog;
42
+ this.tocSvc = tocSvc;
43
+ this.actionSVC = actionSVC;
44
+ this.router = router;
45
+ this.eventSvc = eventSvc;
46
+ this.viewerDataSvc = viewerDataSvc;
47
+ this.samuhikCharchaSvc = samuhikCharchaSvc;
48
+ this.domainConfService = domainConfService;
49
+ this.environment = environment;
50
+ this.tabChangeValue = '';
51
+ this.changeTab = false;
52
+ this.routeSubscription = null;
53
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
54
+ this.contentTabFlag = true;
55
+ this.resumeData = null;
56
+ this.batchData = null;
57
+ this.skeletonLoader = false;
58
+ this.tocStructure = {};
59
+ this.fromViewer = false;
60
+ this.hierarchyMapData = {};
61
+ this.playResourceId = '';
62
+ this.sideNavBarOpened = false;
63
+ this.languageList = [];
64
+ this.lockCertificate = false;
65
+ this.fromMDO = false;
66
+ this.playResumeForAI = new EventEmitter();
67
+ this.enrollUserToAI = new EventEmitter();
68
+ this.trigerCompletionSurveyForm = new EventEmitter();
69
+ this.resumeContent = new EventEmitter();
70
+ this.commentId = '';
71
+ this.sticky = false;
72
+ this.isMobile = false;
73
+ this.selectedTabIndex = 0;
74
+ this.teacherNotesFlag = false;
75
+ this.referenceNotesFlag = false;
76
+ this.viewerPage = window.location.href.includes('/viewer/') ? true : false;
77
+ this.enableAITutorFlag = false;
78
+ this.enableTranscriptionFlag = false;
79
+ this.courseCategory = NsContent.ECourseCategory;
80
+ this.subTitles$ = null;
81
+ this.resourceIdentifier$ = null;
82
+ this.subTitles = [];
83
+ this.keywordToHighlight = '';
84
+ this.highlightCondition = false;
85
+ this.vttLangArr = [];
86
+ this.transcriptionActiveLanguage = 'en';
87
+ this.defaultTranscriptLanguage = 'en';
88
+ this.transriptionLanguageSub = null;
89
+ this.fromAITutor = false;
90
+ this.totalResource = 0;
91
+ this.scormAssessmentCount = 0;
92
+ this.showAITutorPopup = false;
93
+ this.fromAISelectedTabIndex = false;
94
+ this.isMobileForAI = false;
95
+ this.transcriptActiveLanguageText = 'English';
96
+ this.showAssignmentsTab = false;
97
+ this.enableSamuhikCharchaTab = false;
98
+ }
99
+ ngOnInit() {
100
+ if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig?.aiTutor?.all) {
101
+ this.enableAITutorFlag = this.onlyscormAssessmentExists(this.route.snapshot?.data?.content?.data?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
102
+ // this.enableAITutorFlag = true
103
+ }
104
+ else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig?.aiTutor?.forOrg && this.configService.iGOTAIConfig.aiTutor?.forOrg?.length &&
105
+ this.configService.iGOTAIConfig?.aiTutor?.forOrg.includes(this.configService.userProfile?.rootOrgId)) {
106
+ this.enableAITutorFlag = this.onlyscormAssessmentExists(this.route.snapshot?.data?.content?.data?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
107
+ // this.enableAITutorFlag = true
108
+ }
109
+ else {
110
+ this.enableAITutorFlag = false;
111
+ }
112
+ if (this.content && this.content.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
113
+ this.enableAITutorFlag = false;
114
+ }
115
+ if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription?.all) {
116
+ // this.resourceIdentifier$ = this.tocSvc.transriptionIdentifier.subscribe((value:any)=>{
117
+ // if(value && value?.identifier) {
118
+ // this.resourceIdentifier = value?.identifier //value?.identifier // do_1138891198489067521147
119
+ // this.parseVTT()
120
+ // }
121
+ // })
122
+ this.subTitles$ = this.tocSvc.transcriptionData$.subscribe((value) => {
123
+ this.keywordToHighlight = value;
124
+ });
125
+ this.transriptionLanguageSub = this.tocSvc.transriptionActiveLanguageDataObject$
126
+ .pipe(tap((langvalue) => console.log('tap langvalue:', langvalue)))
127
+ .subscribe((langvalue) => {
128
+ if (langvalue) {
129
+ // this.renderSelectedLanguageTranscription();
130
+ }
131
+ });
132
+ this.enableTranscriptionFlag = true;
133
+ }
134
+ else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription && this.configService.iGOTAIConfig?.transcription?.forOrg && this.configService.iGOTAIConfig?.transcription?.forOrg?.length &&
135
+ this.configService.iGOTAIConfig?.transcription?.forOrg?.includes(this.configService.userProfile?.rootOrgId)) {
136
+ // this.resourceIdentifier$ = this.tocSvc.transriptionIdentifier.subscribe((value:any)=>{
137
+ // if(value && value?.identifier) {
138
+ // this.resourceIdentifier = value?.identifier //value?.identifier // do_1138891198489067521147
139
+ // this.parseVTT()
140
+ // }
141
+ // })
142
+ this.subTitles$ = this.tocSvc.transcriptionData$.subscribe((value) => {
143
+ this.keywordToHighlight = value;
144
+ });
145
+ this.transriptionLanguageSub = this.tocSvc.transriptionActiveLanguageDataObject$
146
+ .pipe(tap((langvalue) => console.log('tap langvalue:', langvalue)))
147
+ .subscribe((langvalue) => {
148
+ if (langvalue) {
149
+ // this.renderSelectedLanguageTranscription();
150
+ }
151
+ });
152
+ this.enableTranscriptionFlag = true;
153
+ }
154
+ else {
155
+ this.enableTranscriptionFlag = false;
156
+ }
157
+ const batchId = this.route.snapshot.queryParams.batchId ?
158
+ this.route.snapshot.queryParams.batchId : '';
159
+ if (batchId) {
160
+ this.selectedTabIndex = 1;
161
+ }
162
+ this.commentId = this.route.snapshot.queryParams.commentId ? this.route.snapshot.queryParams.commentId : '';
163
+ if (this.commentId) {
164
+ this.selectedTabIndex = 2;
165
+ }
166
+ }
167
+ ngAfterViewInit() {
168
+ this.isMobile = this.utilityService.isMobile;
169
+ if (window.innerWidth < 1480) {
170
+ this.isMobileForAI = true;
171
+ }
172
+ else {
173
+ this.isMobileForAI = false;
174
+ }
175
+ this.menuPosition = this.tabElement._elementRef.nativeElement.offsetTop;
176
+ this.route.queryParamMap.subscribe(async (params) => {
177
+ let fromAITutor = params.get('fromAITutor');
178
+ if ((fromAITutor === 'true' || fromAITutor === true) && this.isMobile) {
179
+ setTimeout(() => {
180
+ const tabsArray = this.tabs?.toArray();
181
+ let index = tabsArray?.findIndex(tab => tab.textLabel.trim() === "AI Tutor".trim());
182
+ if (index > -1) {
183
+ this.selectedTabIndex = index;
184
+ this.fromAISelectedTabIndex = true;
185
+ }
186
+ }, 3000);
187
+ }
188
+ });
189
+ }
190
+ get getCurrentTimeInUTC() {
191
+ const currentDate = new Date();
192
+ const isoString = currentDate.toISOString();
193
+ return isoString.replace('Z', '+0000');
194
+ }
195
+ async getSamuhikConfig() {
196
+ try {
197
+ this.samuhikConfig = await this.samuhikCharchaSvc.fetchConfigFile().toPromise();
198
+ }
199
+ catch (error) {
200
+ }
201
+ }
202
+ async ngOnChanges(changes) {
203
+ this.resourceIdentifier = this.viewerDataSvc.resourceId;
204
+ if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription?.all) {
205
+ this.enableTranscriptionFlag = true;
206
+ }
207
+ else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.transcription && this.configService.iGOTAIConfig?.transcription?.forOrg && this.configService.iGOTAIConfig?.transcription?.forOrg?.length &&
208
+ this.configService.iGOTAIConfig?.transcription?.forOrg?.includes(this.configService?.userProfile?.rootOrgId)) {
209
+ this.enableTranscriptionFlag = true;
210
+ }
211
+ else {
212
+ this.enableTranscriptionFlag = false;
213
+ }
214
+ if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig.aiTutor?.all) {
215
+ this.enableAITutorFlag = this.onlyscormAssessmentExists(this.content?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
216
+ // this.enableAITutorFlag = true
217
+ }
218
+ else if (this.configService.iGOTAIConfig && this.configService.iGOTAIConfig?.aiTutor && this.configService.iGOTAIConfig?.aiTutor?.forOrg && this.configService.iGOTAIConfig?.aiTutor?.forOrg?.length
219
+ && this.configService.iGOTAIConfig.aiTutor?.forOrg?.includes(this.configService?.userProfile?.rootOrgId)) {
220
+ this.enableAITutorFlag = this.onlyscormAssessmentExists(this.content?.children, 'mimeType', ['application/vnd.ekstep.html-archive', 'application/vnd.sunbird.questionset', 'application/json', 'text/x-url']);
221
+ }
222
+ else {
223
+ this.enableAITutorFlag = false;
224
+ }
225
+ if (this.content && this.content.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
226
+ this.enableAITutorFlag = false;
227
+ }
228
+ if (changes && changes['playResourceId']) {
229
+ if (changes?.playResourceId?.previousValue !== changes?.playResourceId?.currentValue) {
230
+ if (this.viewerPage && this.enableTranscriptionFlag) {
231
+ this.resourceIdentifier = this.playResourceId || this.viewerDataSvc?.resourceId;
232
+ this.subTitles = [];
233
+ this.vttLangArr = [];
234
+ this.parseVTT();
235
+ }
236
+ }
237
+ }
238
+ if (changes.changeTab && changes.changeTab.currentValue && !this.fromAISelectedTabIndex) {
239
+ this.selectedTabIndex = 1;
240
+ }
241
+ if (this.route.snapshot.data.pageData && this.route.snapshot.data.pageData.data) {
242
+ this.config = this.route.snapshot.data.pageData.data;
243
+ }
244
+ if (this.config && this.config.discussWidgetData) {
245
+ this.discussWidgetData = this.config.discussWidgetData;
246
+ if (this.baseContentReadData && this.baseContentReadData.identifier) {
247
+ if (!this.discussWidgetData.newCommentSection.commentTreeData.entityId) {
248
+ this.discussWidgetData.newCommentSection.commentTreeData.entityId = this.baseContentReadData.identifier;
249
+ }
250
+ if (this.discussWidgetData.commentsList.repliesSection && this.discussWidgetData.commentsList.repliesSection.newCommentReply) {
251
+ this.discussWidgetData.commentsList.repliesSection.newCommentReply.commentTreeData.entityId = this.baseContentReadData.identifier;
252
+ }
253
+ }
254
+ if (this.isEnrolled) {
255
+ if (this.content && this.content.primaryCategory === NsContent.ECourseCategory.BLENDED_PROGRAM) {
256
+ this.showAssignmentsTab = true;
257
+ }
258
+ this.discussWidgetData.enrolledContent = true;
259
+ this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Start a discussion';
260
+ }
261
+ else {
262
+ this.discussWidgetData.enrolledContent = false;
263
+ this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Enrol to add your comments';
264
+ }
265
+ if (this.commentId) {
266
+ this.discussWidgetData.newCommentSection.show = false;
267
+ }
268
+ this.discussWidgetData = { ...this.discussWidgetData };
269
+ }
270
+ if (this.contentReadData && this.contentReadData?.eventLinked?.length) {
271
+ const orgId = _.get(this.configService, 'userProfile.userRootOrg.id', '');
272
+ await this.getSamuhikConfig();
273
+ const eventsLinked = this.contentReadData.eventLinked || [];
274
+ let eventsData = [];
275
+ this.samuhikConfig?.strips[0].tabs.forEach((ele) => {
276
+ ele.request.searchV6.request.filters.identifier = eventsLinked;
277
+ ele.request.searchV6.request.filters.createdFor = [orgId];
278
+ if (ele.request.searchV6.request.filters.endDateTime.hasOwnProperty('>=')) {
279
+ ele.request.searchV6.request.filters.endDateTime['>='] = this.getCurrentTimeInUTC;
280
+ }
281
+ if (ele.request.searchV6.request.filters.endDateTime.hasOwnProperty('<')) {
282
+ ele.request.searchV6.request.filters.endDateTime['<'] = this.getCurrentTimeInUTC;
283
+ }
284
+ this.samuhikCharchaSvc.getSearchV6Results(ele.request.searchV6).subscribe((res) => {
285
+ if (res && res.result && res.result.count && res.result?.Event && res.result.Event?.length) {
286
+ for (let eve = 0; eve < res.result.Event?.length; eve++) {
287
+ if (res.result.Event[eve]['createdFor'] && res.result.Event[eve]['createdFor'].length &&
288
+ res.result.Event[eve]['resourceType'] === 'Samuhik Charcha')
289
+ eventsData.push(res.result.Event[eve]['createdFor'][0]);
290
+ if (eventsData.includes(this.configService.userProfile?.rootOrgId)) {
291
+ this.enableSamuhikCharchaTab = true;
292
+ }
293
+ }
294
+ }
295
+ });
296
+ });
297
+ }
298
+ if (this.contentReadData && this.contentReadData.referenceNodes) {
299
+ this.contentReadData.referenceNodes.forEach((item) => {
300
+ let userRoles = this.configService?.userRoles || new Set();
301
+ let hasEducatorRole = false;
302
+ // Check if user has MENTOR role
303
+ if (userRoles.has('MENTOR') ||
304
+ userRoles.has('mentor') ||
305
+ userRoles.has('Mentor')) {
306
+ hasEducatorRole = true;
307
+ }
308
+ // Check local storage for survey response only if URL contains 'public' or 'preview=true'
309
+ if (!hasEducatorRole && this.forPreview) {
310
+ const surveyId = this.environment.publicContentSurveyId || '';
311
+ const courseId = this.contentReadData?.identifier || '';
312
+ const storageKey = `survey_${surveyId}_${courseId}`;
313
+ const storedData = localStorage.getItem(storageKey);
314
+ if (storedData) {
315
+ try {
316
+ const surveyResponses = JSON.parse(storedData);
317
+ const educatorQuestion = surveyResponses.find((response) => response.question === 'Are you an Educator/Faculty member?');
318
+ if (educatorQuestion && educatorQuestion.answer === 'Yes') {
319
+ hasEducatorRole = true;
320
+ }
321
+ }
322
+ catch (error) {
323
+ console.error('Error parsing survey data from local storage:', error);
324
+ }
325
+ }
326
+ }
327
+ // Set teacherNotesFlag if user has educator role
328
+ if (hasEducatorRole) {
329
+ if (item && item.resourceCategory && item.resourceCategory === 'Teachers Resource') {
330
+ this.teacherNotesFlag = true;
331
+ }
332
+ }
333
+ if (item && item.resourceCategory && item.resourceCategory === 'Reference Resource') {
334
+ this.referenceNotesFlag = true;
335
+ }
336
+ });
337
+ }
338
+ if (this.sideNavBarOpened) {
339
+ if (window.innerWidth < 1480) {
340
+ if (this.isMobileForAI) {
341
+ this.isMobileForAI = false;
342
+ }
343
+ }
344
+ else {
345
+ this.isMobileForAI = false;
346
+ }
347
+ }
348
+ else {
349
+ if (window.innerWidth < 1480) {
350
+ this.isMobileForAI = true;
351
+ }
352
+ else {
353
+ this.isMobileForAI = false;
354
+ }
355
+ }
356
+ }
357
+ handleScroll() {
358
+ const windowScroll = window.scrollY;
359
+ if (windowScroll >= (this.menuPosition - ((this.isMobile) ? 96 : 104))) {
360
+ this.sticky = true;
361
+ }
362
+ else {
363
+ this.sticky = false;
364
+ }
365
+ }
366
+ handleTabChange(event) {
367
+ this.tabChangeValue = event.tab;
368
+ this.selectedTabIndex = event.index;
369
+ this.loadCheckService.componentLoaded(true);
370
+ if (event && event.tab.textLabel === 'AI Tutor') {
371
+ this.showAITutorPopup = true;
372
+ }
373
+ if (event && event.index === 0 && event.tab.textLabel === 'Transcription') {
374
+ this.raiseTranscriptionTabStartTelemetry();
375
+ setTimeout(() => {
376
+ this.raiseTranscriptionTabInteractTelemetry();
377
+ }, 1000);
378
+ }
379
+ else {
380
+ this.raiseTranscriptionTabStopTelemetry();
381
+ }
382
+ }
383
+ showAiTutorConfirmPopup() {
384
+ this.raiseAIPopupStartTelemetry();
385
+ if (this.isEnrolled) {
386
+ this.fromAITutor = true;
387
+ setTimeout(() => {
388
+ this.raiseAIPopupInteractTelemetry();
389
+ }, 1000);
390
+ this.generateResumeDataLinkNew();
391
+ setTimeout(() => {
392
+ this.raiseAIPopupEndTelemetry();
393
+ }, 1000);
394
+ }
395
+ else {
396
+ setTimeout(() => {
397
+ this.raiseAIPopupInteractTelemetry();
398
+ }, 1000);
399
+ const dialogConfig = new MatDialogConfig();
400
+ dialogConfig.width = '421px';
401
+ dialogConfig.data = {
402
+ enroll: this.isEnrolled
403
+ };
404
+ const dialogRef = this.dialog.open(AiTutorConfirmPopupComponent, dialogConfig);
405
+ dialogRef.afterClosed().subscribe((response) => {
406
+ if (response === 'enroll') {
407
+ this.fromAITutor = true;
408
+ this.generateResumeDataLinkNew();
409
+ }
410
+ else if (response === 'needToEnroll') {
411
+ this.enrollUserForAITutor();
412
+ }
413
+ this.raiseAIPopupEndTelemetry();
414
+ });
415
+ }
416
+ }
417
+ generateResumeDataLinkNew() {
418
+ if (this.resumeData && this.content) {
419
+ let resumeDataV2;
420
+ if (this.content.completionPercentage === 100) {
421
+ resumeDataV2 = this.getResumeDataFromList('start');
422
+ }
423
+ else {
424
+ resumeDataV2 = this.getResumeDataFromList();
425
+ }
426
+ if (!resumeDataV2.mimeType) {
427
+ resumeDataV2.mimeType = this.tocSvc.getMimeType(this.content, resumeDataV2.identifier);
428
+ }
429
+ this.resumeDataLink = viewerRouteGenerator(resumeDataV2.identifier, resumeDataV2.mimeType, this.content.identifier, this.content.contentType, this.forPreview, 'Learning Resource', this.getBatchId(), this.content.name);
430
+ this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
431
+ this.router.navigate([this.resumeDataLink.url], {
432
+ queryParams: {
433
+ ...this.resumeDataLink.queryParams,
434
+ fromAITutor: this.fromAITutor
435
+ }
436
+ });
437
+ // this.router.navigateByUrl(
438
+ // [this.resumeDataLink.url],
439
+ // {
440
+ // relativeTo: this.resumeDataLink.url,
441
+ // queryParams: this.resumeDataLink.queryParams,
442
+ // queryParamsHandling: 'merge',
443
+ // })
444
+ /* tslint:disable-next-line */
445
+ }
446
+ else {
447
+ this.playResumeForAI.emit();
448
+ }
449
+ }
450
+ getResumeDataFromList(type) {
451
+ const resumeCopy = [...this.resumeData];
452
+ if (!type) {
453
+ // tslint:disable-next-line:max-line-length
454
+ const lastItem = resumeCopy && resumeCopy.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
455
+ return {
456
+ identifier: lastItem.contentId,
457
+ mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
458
+ };
459
+ }
460
+ const firstItem = resumeCopy && resumeCopy.length && resumeCopy[0];
461
+ return {
462
+ identifier: firstItem.contentId,
463
+ mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
464
+ };
465
+ }
466
+ getBatchId() {
467
+ let batchId = '';
468
+ if (this.batchData && this.batchData.content) {
469
+ for (const batch of this.batchData.content) {
470
+ batchId = batch.batchId;
471
+ }
472
+ }
473
+ return batchId;
474
+ }
475
+ raiseAIPopupStartTelemetry() {
476
+ const event = {
477
+ eventType: WsEvents.WsEventType.Telemetry,
478
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
479
+ data: {
480
+ edata: { type: 'click', "id": "ai-tutor-toc-page", "pageid": `/app/toc/${this.content?.identifier}` },
481
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
482
+ state: WsEvents.EnumTelemetrySubType.Loaded,
483
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
484
+ mode: 'view',
485
+ },
486
+ pageContext: { pageId: '/app/toc', module: 'Learn' },
487
+ from: '',
488
+ to: 'Telemetry',
489
+ };
490
+ this.eventSvc.dispatchChatbotEvent(event);
491
+ }
492
+ raiseAIPopupEndTelemetry() {
493
+ const event = {
494
+ eventType: WsEvents.WsEventType.Telemetry,
495
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
496
+ data: {
497
+ edata: { type: 'click', "id": "ai-tutor-toc-page", "pageid": `/app/toc/${this.content?.identifier}` },
498
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
499
+ state: WsEvents.EnumTelemetrySubType.Unloaded,
500
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
501
+ mode: 'view',
502
+ },
503
+ pageContext: { pageId: '/app/toc', module: 'Learn' },
504
+ from: '',
505
+ to: 'Telemetry',
506
+ };
507
+ this.eventSvc.dispatchChatbotEvent(event);
508
+ }
509
+ raiseAIPopupInteractTelemetry() {
510
+ const event = {
511
+ eventType: WsEvents.WsEventType.Telemetry,
512
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
513
+ data: {
514
+ edata: { type: 'click', "id": "ai-tutor-toc-page", "pageid": `/app/toc/${this.content?.identifier}` },
515
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
516
+ state: WsEvents.EnumTelemetrySubType.Interact,
517
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
518
+ mode: 'view',
519
+ },
520
+ pageContext: { pageId: '/app/toc', module: 'Learn' },
521
+ from: '',
522
+ to: 'Telemetry',
523
+ };
524
+ this.eventSvc.dispatchChatbotEvent(event);
525
+ }
526
+ enrollUserForAITutor() {
527
+ this.enrollUserToAI.emit();
528
+ }
529
+ async parseVTT() {
530
+ let identifier = this.resourceIdentifier;
531
+ // console.log('identifier--', identifier)
532
+ await this.tocSvc.aiGetResourceVttFile(identifier).subscribe(async (datas) => {
533
+ let data = datas?.data;
534
+ if (data && data.length && data[0]['transcription_urls'] && data[0]['transcription_urls'].length) {
535
+ this.vttLangArr = data[0]['transcription_urls'];
536
+ this.enableTranscriptionFlag = true;
537
+ // let url = data[0]['transcription_urls'][0]['uri']
538
+ this.transcriptionActiveLanguage = this.vttLangArr && this.vttLangArr.length && this.vttLangArr[0] && this.vttLangArr[0]['default_lang'] ? 'en' : 'en';
539
+ this.defaultTranscriptLanguage = this.vttLangArr && this.vttLangArr.length && this.vttLangArr[0] && this.vttLangArr[0]['default_lang'] ? 'en' : 'en';
540
+ let selectedTranscriptionStyle = this.vttLangArr.filter((item) => {
541
+ return item?.label === this.transcriptionActiveLanguage;
542
+ });
543
+ if (selectedTranscriptionStyle && selectedTranscriptionStyle.length) {
544
+ this.selectedTranscriptionStyle = selectedTranscriptionStyle[0];
545
+ }
546
+ else {
547
+ this.selectedTranscriptionStyle = this.vttLangArr[0];
548
+ }
549
+ const filteredArr = this.vttLangArr.filter((item) => item.label === this.transcriptionActiveLanguage);
550
+ let url = filteredArr.length > 0 ? filteredArr[0].uri : null;
551
+ //let url = this.vttLangArr.filter((item: any) => item.label === this.transcriptionActiveLanguage)[0]['uri']
552
+ if (url) {
553
+ const file = await VttFile.fromUrl(url);
554
+ let blocks = file.getBlocks();
555
+ this.subTitles = blocks;
556
+ }
557
+ this.tocSvc.changeTranscriptionLanguageEvent.next({ activeLang: this.transcriptionActiveLanguage, langData: this.vttLangArr, loadPlayer: true });
558
+ }
559
+ else {
560
+ this.vttLangArr = [];
561
+ this.enableTranscriptionFlag = false;
562
+ }
563
+ });
564
+ }
565
+ async renderSelectedLanguageTranscription(_langvalue) {
566
+ // this.transcriptionActiveLanguage = this.selectedTranscriptionStyle?.label
567
+ if (typeof _langvalue === 'string' && _langvalue) {
568
+ this.transcriptionActiveLanguage = _langvalue;
569
+ }
570
+ else {
571
+ this.selectedTranscriptionStyle = _langvalue?.value;
572
+ this.transcriptionActiveLanguage = this.selectedTranscriptionStyle?.label;
573
+ this.transcriptActiveLanguageText = _langvalue?.value?.language;
574
+ }
575
+ this.raiseTranscriptionLanguageStartTelemetry();
576
+ setTimeout(() => {
577
+ this.raiseTranscriptionLanguageInteractTelemetry();
578
+ });
579
+ let currentPath = this.vttLangArr.filter((item) => item?.label === this.transcriptionActiveLanguage);
580
+ if (currentPath && currentPath.length) {
581
+ this.selectedTranscriptionStyle = currentPath[0];
582
+ }
583
+ const file = await VttFile.fromUrl(currentPath && currentPath[0]?.uri);
584
+ let blocks = file.getBlocks();
585
+ this.subTitles = blocks;
586
+ this.raiseTranscriptionLanguageStopTelemetry();
587
+ // this.tocSvc.changeTranscriptionLanguageEvent.next({activeLang: this.transcriptionActiveLanguage, langData: this.vttLangArr, loadPlayer:false})
588
+ }
589
+ openSurveyFormPopup(event) {
590
+ this.trigerCompletionSurveyForm.emit(event);
591
+ }
592
+ playFromSlot(subtitle) {
593
+ if (subtitle) {
594
+ let startTime = subtitle.startTime / 1000;
595
+ let endTime = subtitle.endTime / 1000;
596
+ this.tocSvc.playTranscriptionVideo.next({ startTime, endTime });
597
+ }
598
+ }
599
+ formatMsToVttTime(ms) {
600
+ const totalSeconds = Math.floor(ms / 1000);
601
+ // const milliseconds = ms % 1000;
602
+ const hours = Math.floor(totalSeconds / 3600);
603
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
604
+ const seconds = totalSeconds % 60;
605
+ const pad = (num, size) => num.toString().padStart(size, '0');
606
+ // return `${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}.${pad(milliseconds, 3)}`;
607
+ return `${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`;
608
+ }
609
+ onlyscormAssessmentExists(data, key, value) {
610
+ for (let i = 0; i < data?.length; i++) {
611
+ if (data[i] && data[i]['children'] && data[i]['children'].length) {
612
+ this.onlyscormAssessmentExists(data[i]?.children, key, value);
613
+ }
614
+ else {
615
+ this.totalResource = this.totalResource + 1;
616
+ if (value.includes(data[i][key])) {
617
+ // this.showAITutorFlag = false;
618
+ this.scormAssessmentCount = this.scormAssessmentCount + 1;
619
+ }
620
+ }
621
+ }
622
+ if (this.totalResource === this.scormAssessmentCount) {
623
+ this.enableAITutorFlag = false;
624
+ }
625
+ else {
626
+ this.enableAITutorFlag = true;
627
+ }
628
+ return this.enableAITutorFlag;
629
+ }
630
+ raiseTranscriptionTabStartTelemetry() {
631
+ const event = {
632
+ eventType: WsEvents.WsEventType.Telemetry,
633
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
634
+ data: {
635
+ edata: { type: 'click', "id": "ai-tutor-viewer-page", "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-tab' },
636
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
637
+ state: WsEvents.EnumTelemetrySubType.Loaded,
638
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
639
+ mode: 'view',
640
+ },
641
+ pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
642
+ from: '',
643
+ to: 'Telemetry',
644
+ };
645
+ this.eventSvc.dispatchChatbotEvent(event);
646
+ }
647
+ raiseTranscriptionTabInteractTelemetry() {
648
+ const event = {
649
+ eventType: WsEvents.WsEventType.Telemetry,
650
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
651
+ data: {
652
+ edata: { type: 'click', "id": "ai-tutor-viewer-page", "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-tab' },
653
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
654
+ state: WsEvents.EnumTelemetrySubType.Interact,
655
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
656
+ mode: 'view',
657
+ },
658
+ pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
659
+ from: '',
660
+ to: 'Telemetry',
661
+ };
662
+ this.eventSvc.dispatchChatbotEvent(event);
663
+ }
664
+ raiseTranscriptionTabStopTelemetry() {
665
+ const event = {
666
+ eventType: WsEvents.WsEventType.Telemetry,
667
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
668
+ data: {
669
+ edata: { type: 'click', "id": "ai-tutor-viewer-page", "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-tab' },
670
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
671
+ state: WsEvents.EnumTelemetrySubType.Unloaded,
672
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
673
+ mode: 'view',
674
+ },
675
+ pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
676
+ from: '',
677
+ to: 'Telemetry',
678
+ };
679
+ this.eventSvc.dispatchChatbotEvent(event);
680
+ }
681
+ raiseTranscriptionLanguageStartTelemetry() {
682
+ const event = {
683
+ eventType: WsEvents.WsEventType.Telemetry,
684
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
685
+ data: {
686
+ edata: { type: 'click', "id": this.transcriptActiveLanguageText, "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-language' },
687
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
688
+ state: WsEvents.EnumTelemetrySubType.Loaded,
689
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
690
+ mode: 'view',
691
+ },
692
+ pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
693
+ from: '',
694
+ to: 'Telemetry',
695
+ };
696
+ this.eventSvc.dispatchChatbotEvent(event);
697
+ }
698
+ raiseTranscriptionLanguageInteractTelemetry() {
699
+ const event = {
700
+ eventType: WsEvents.WsEventType.Telemetry,
701
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
702
+ data: {
703
+ edata: { type: 'click', "id": this.transcriptActiveLanguageText, "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-language' },
704
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
705
+ state: WsEvents.EnumTelemetrySubType.Interact,
706
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
707
+ mode: 'view',
708
+ },
709
+ pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
710
+ from: '',
711
+ to: 'Telemetry',
712
+ };
713
+ this.eventSvc.dispatchChatbotEvent(event);
714
+ }
715
+ raiseTranscriptionLanguageStopTelemetry() {
716
+ const event = {
717
+ eventType: WsEvents.WsEventType.Telemetry,
718
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
719
+ data: {
720
+ edata: { type: 'click', "id": this.transcriptActiveLanguageText, "pageid": `/viewer/video/${this.viewerDataSvc?.resourceId}`, subType: 'transcript-language' },
721
+ object: { "id": this.content?.identifier, "type": this.content?.courseCategory },
722
+ state: WsEvents.EnumTelemetrySubType.Unloaded,
723
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
724
+ mode: 'view',
725
+ },
726
+ pageContext: { pageId: `/viewer/video/${this.viewerDataSvc?.resourceId}`, module: 'Learn' },
727
+ from: '',
728
+ to: 'Telemetry',
729
+ };
730
+ this.eventSvc.dispatchChatbotEvent(event);
731
+ }
732
+ closeAIPopup(event) {
733
+ if (event) {
734
+ this.showAITutorPopup = false;
735
+ this.selectedTabIndex = 0;
736
+ }
737
+ }
738
+ ngOnDestroy() {
739
+ if (this.resourceIdentifier$) {
740
+ this.resourceIdentifier$.unsubscribe();
741
+ }
742
+ if (this.subTitles$) {
743
+ this.subTitles$.unsubscribe();
744
+ }
745
+ if (this.transriptionLanguageSub) {
746
+ this.transriptionLanguageSub.unsubscribe();
747
+ }
748
+ }
749
+ clearCommentIdFromUrl() {
750
+ const currentQueryParams = { ...this.route.snapshot.queryParams };
751
+ delete currentQueryParams.commentId;
752
+ this.commentId = '';
753
+ this.discussWidgetData.newCommentSection.show = true;
754
+ }
755
+ resumeContentCall() {
756
+ this.resumeContent.emit();
757
+ }
758
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContentTocComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.UtilityService }, { token: i3.LoadCheckService }, { token: i2.ConfigurationsService }, { token: i4.MatLegacyDialog }, { token: i5.AppTocService }, { token: i6.ActionService }, { token: i1.Router }, { token: i2.EventService }, { token: i7.ViewerDataService }, { token: i8.SamuhikCharchaService }, { token: i2.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
759
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ContentTocComponent, selector: "ws-widget-content-toc", inputs: { content: "content", contentReadData: "contentReadData", initialRouteData: "initialRouteData", changeTab: "changeTab", baseContentReadData: "baseContentReadData", forPreview: "forPreview", contentTabFlag: "contentTabFlag", resumeData: "resumeData", batchData: "batchData", skeletonLoader: "skeletonLoader", tocStructure: "tocStructure", pathSet: "pathSet", fromViewer: "fromViewer", hierarchyMapData: "hierarchyMapData", condition: "condition", kparray: "kparray", selectedBatchData: "selectedBatchData", config: "config", componentName: "componentName", isEnrolled: "isEnrolled", playResourceId: "playResourceId", sideNavBarOpened: "sideNavBarOpened", languageList: "languageList", lockCertificate: "lockCertificate", fromMDO: "fromMDO" }, outputs: { playResumeForAI: "playResumeForAI", enrollUserToAI: "enrollUserToAI", trigerCompletionSurveyForm: "trigerCompletionSurveyForm", resumeContent: "resumeContent" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "tabElement", first: true, predicate: ["stickyMenu"], descendants: true }, { propertyName: "tabs", predicate: MatTab, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- && (content?.courseCategory !== courseCategory?.BLENDED_PROGRAM) -->\n<div class=\"ai-tutor-get-started\" *ngIf=\"!viewerPage && enableAITutorFlag && !isMobile\">\n <div class=\"flex flex-row align-items-center\">\n <div class=\"px-2 py-2\">\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"64px\" width=\"64px\" />\n </div>\n <div class=\"flex flex-row align-items-center\">\n <div class=\"py-2\" >\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\n <span>Get instant explanations, step-by-step learning guidance, and customised learning tailored just\n for you.</span>\n </div>\n <div class=\"ai-tutor-btn px-2 py-1\" [ngClass]=\"isMobile ? 'w-160' : ''\">\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\n </div>\n </div>\n </div>\n</div>\n<div class=\"tab-group-container\">\n <mat-tab-group (selectedTabChange)=\"handleTabChange($event)\" #stickyMenu [class.sticky-mat-tabs]=\"sticky\"\n [selectedIndex]=\"selectedTabIndex\" [ngClass]=\"{'content-tabs':!fromViewer,'contentSticky': forPreview}\">\n\n <!-- Transcription Tab -->\n <mat-tab label=\"Transcription\"\n *ngIf=\"viewerPage && enableTranscriptionFlag && vttLangArr?.length && subTitles?.length\">\n <ng-template mat-tab-label>\n <div class=\"flex flex-row\">\n <div class=\"flex\">\n <span>Transcript</span>\n </div>\n <div class=\"red-circle ml-5\">\n New\n </div>\n </div>\n\n </ng-template>\n <ng-template matTabContent>\n <div class=\"disclaimer my-2\">\n <p class=\"py-2 px-2\">Disclaimer : These transcripts and subtitles are AI-generated and may contain\n errors.</p>\n </div>\n <div class=\"w-full ml-5 mr-5\" *ngIf=\"isMobileForAI\">\n <div class=\"transcript-flex-container mt-2\">\n <mat-form-field class=\"multiline-select\" appearance=\"fill\" style=\"height: auto; width: 100%;\"\n floatLabel=\"never\">\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\n <mat-select-trigger class=\"multiline-select-box-trigger\">\n <div class=\"selected-option-content px-5 py-2\">\n <div class=\"title\"><span\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\n <b>Transcript Language: </b></span>\n {{selectedTranscriptionStyle?.language | titlecase}} <span\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\n </div>\n </div>\n </mat-select-trigger>\n <mat-option class=\"multiline-select-option\" value=\"\" *ngFor=\"let lang of vttLangArr\"\n [value]=\"lang\"\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\n <div class=\"option-content\">\n <div class=\"title\">{{lang?.language | titlecase}}</div>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"ml-4 flex flex-row justify-end transcript-control\">\n <!-- <mat-form-field appearance=\"none\">\n <select matNativeControl required class=\"section-dd\" (change)=\"renderSelectedLanguageTranscription($event)\">\n <option [value]=\"lang?.language\" *ngFor=\"let lang of vttLangArr\" [selected]=\"lang?.label === transcriptionActiveLanguage\">\n <span *ngIf=\"transcriptionActiveLanguage === lang?.label\"> Transcript Language: </span> {{lang?.language | titlecase}} <span *ngIf=\"transcriptionActiveLanguage === lang?.language\">(Auto)</span>\n </option>\n </select>\n </mat-form-field> -->\n <div class=\"flex flex-row w-full\">\n <div [ngClass]=\"!isMobileForAI ? 'w-subtitle-80':'w-full'\">\n <div [ngClass]=\"!isMobileForAI ? 'ml-5-per' : ''\" *ngIf=\"subTitles && subTitles?.length\">\n <!-- Transcription content -->\n <ng-container *ngFor=\"let subtitle of subTitles\">\n <div class=\"flex flex-col my-2\">\n <div class=\"flex flex-row\">\n <div class=\"subtitle-time\">\n <p class=\"cursor-pointer\" (click)=\"playFromSlot(subtitle)\">\n <span class=\"pr-1 blue-underline\"> {{\n formatMsToVttTime(subtitle?.startTime) }} </span>\n <span class=\"black-text\">-</span>\n <span class=\"pl-1 blue-underline\">{{\n formatMsToVttTime(subtitle?.endTime) }}</span>\n </p>\n </div>\n <div class=\"ml-4 subtitle-text-slot mr-4\">\n <p class=\"black-text\" [innerHtml]=\"subtitle?.text\n | highlight : keywordToHighlight?.text\n : ((subtitle?.startTime / 1000) >= keywordToHighlight?.start\n && (subtitle?.endTime / 1000) <= keywordToHighlight?.end)\">\n </p>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"w-subtitle-20\" *ngIf=\"!isMobileForAI\">\n <div class=\"transcript-flex-container mt-2\">\n <mat-form-field class=\"multiline-select\" appearance=\"fill\"\n style=\"height: auto; width: 100%;\" floatLabel=\"never\">\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\n <mat-select-trigger class=\"multiline-select-box-trigger\">\n <div class=\"selected-option-content px-5 py-2\">\n <div class=\"title\"><span\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\n <b>Transcript Language: </b></span>\n {{selectedTranscriptionStyle?.language | titlecase}} <span\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\n </div>\n </div>\n </mat-select-trigger>\n <mat-option class=\"multiline-select-option\" value=\"\"\n *ngFor=\"let lang of vttLangArr\" [value]=\"lang\"\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\n <div class=\"option-content\">\n <div class=\"title\">{{lang?.language | titlecase}}</div>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n </div>\n <!-- <div class=\"flex flex-row align-items-center my-2\">\n <div>\n <p>0.00</p>\n </div>\n <div class=\"ml-4\">\n <p>AI for Digital Transformation: Machine Learning and Deep Learning Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n </div>\n <div class=\"ml-4\">\n <mat-form-field appearance=\"none\">\n <select matNativeControl required class=\"section-dd\">\n <option value=\"\">Transcription Language: English (Auto)</option>\n </select>\n </mat-form-field>\n </div>\n </div> -->\n\n </ng-template>\n </mat-tab>\n\n <!-- About Tab -->\n <mat-tab label=\"{{ 'apptocsinglepage.about' | translate }}\">\n <ng-template matTabContent>\n <div class=\"ai-tutor-get-started-mobile my-2 ml-2\" *ngIf=\"!viewerPage && enableAITutorFlag && isMobile && (domainConfService?.isFeatureByPageEnabled('toc','aiTutor'))\">\n <div class=\"flex flex-row align-items-center w-98\">\n <div class=\"px-2 py-2\">\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"48px\" width=\"48px\" />\n </div>\n <div class=\"flex flex-row align-items-center w-60\">\n <div class=\"py-2\">\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\n <span>Get instant explanations, step-by-step learning guidance, and customised learning\n tailored just for you.</span>\n </div>\n\n </div>\n <div class=\"ai-tutor-btn px-2 py-1\">\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI\n Tutor</span></a>\n </div>\n\n </div>\n <!-- <div class=\"flex justify-end my-2 mx-2\">\n <div class=\"ai-tutor-btn px-2 py-1\">\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\n </div>\n </div> -->\n </div>\n <ws-widget-app-toc-about [fromViewer]=\"fromViewer\" [pathSet]=\"pathSet\" [content]=\"content\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"false\" [sticky]=\"sticky\"\n [selectedBatchData]=\"selectedBatchData\" [selectedTabValue]=\"selectedTabIndex\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\n [condition]=\"condition\" [kparray]=\"kparray\" [showReviews]=\"'true'\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n [fromMDO]=\"fromMDO\">\n </ws-widget-app-toc-about>\n </ng-template>\n </mat-tab>\n\n <!-- Content Tab -->\n <ng-container *ngIf=\"content?.children?.length\">\n <mat-tab label=\"{{ 'apptocsinglepage.content' | translate }}\" *ngIf=\"contentTabFlag\">\n <ng-template matTabContent>\n <ws-widget-app-toc-content [batchId]=\"batchId\" [componentName]=\"componentName\" [pathSet]=\"pathSet\"\n [content]=\"content\" [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"forPreview\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\n [hierarchyMapData]=\"hierarchyMapData\" [baseContentReadData]=\"baseContentReadData\">\n </ws-widget-app-toc-content>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <ng-container *ngIf=\"config?.commentsTab && !forPreview && (domainConfService?.isFeatureByPageEnabled('toc','startDiscussion'))\">\n <mat-tab label=\"{{ 'apptocsinglepage.startDiscussion' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"commentsDiv\"\n *ngIf=\"discussWidgetData && discussWidgetData?.newCommentSection?.commentTreeData?.entityId\">\n <ng-container *ngIf=\"!commentId\">\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\"></d-v2-widget-comment>\n </ng-container>\n <ng-container *ngIf=\"commentId\">\n <div class=\"flex flex-row gap-3 cursor-pointer mb-5\" (click)=\"clearCommentIdFromUrl()\">\n <mat-icon class=\"cursor-pointer\">arrow_back</mat-icon>\n Back to all comments\n </div>\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\" [commentId]=\"commentId\"\n [skeletonLoader]></d-v2-widget-comment>\n </ng-container>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <ng-container\n *ngIf=\"config?.samuhikCharchaTab && condition && contentReadData?.eventLinked?.length > 0 && enableSamuhikCharchaTab && (domainConfService?.isFeatureByPageEnabled('toc','samuhikCharcha'))\">\n <mat-tab label=\"{{ 'apptocsinglepage.samuhikCharcha' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"samuhikCharchaDiv\">\n <ws-widget-samuhik-charcha-content [content]=\"contentReadData\" [conditionData]=\"condition\"\n (resumeContent)=\"resumeContentCall()\">\n </ws-widget-samuhik-charcha-content>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <!-- Teachers Note Tab -->\n <ng-container *ngIf=\"contentReadData?.referenceNodes && teacherNotesFlag\">\n <mat-tab label=\"Teachers Note\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\n [notesDisplayType]=\"'Teachers Resource'\"></ws-widget-app-toc-teachers-notes>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <!-- Reference Note Tab -->\n <ng-container *ngIf=\"contentReadData?.referenceNodes && referenceNotesFlag\">\n <mat-tab label=\"Reference Note\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\n [notesDisplayType]=\"'Reference Resource'\"></ws-widget-app-toc-teachers-notes>\n\n <!-- <ws-widget-app-toc-reference-notes [content]=\"contentReadData\"></ws-widget-app-toc-reference-notes> -->\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <ng-container *ngIf=\"showAssignmentsTab && !forPreview && (domainConfService?.isFeatureByPageEnabled('toc','assignment'))\">\n <mat-tab label=\"{{ 'apptocsinglepage.assignments' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"takeAssessmentDiv\">\n <ws-widget-app-batch-assignments [content]=\"content\"></ws-widget-app-batch-assignments>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <!-- Transcription Tab -->\n <mat-tab label=\"AI Tutor\" *ngIf=\"viewerPage && enableAITutorFlag && isMobile && (domainConfService?.isFeatureByPageEnabled('toc','transcription'))\">\n <ng-template mat-tab-label>\n <div class=\"flex flex-row\">\n <div class=\"flex\">\n <span>AI Tutor</span>\n </div>\n <div class=\"red-circle ml-5\">\n New\n </div>\n </div>\n\n </ng-template>\n <ng-template matTabContent>\n <ng-container *ngIf=\"showAITutorPopup\">\n <div>\n <ws-widget-ai-tutor [content]=\"content?.identifier\"\n (closeAIPopup)=\"closeAIPopup($event)\"></ws-widget-ai-tutor>\n </div>\n </ng-container>\n </ng-template>\n </mat-tab>\n\n </mat-tab-group>\n</div>", styles: ["::ng-deep .content-tabs .mat-tab-body-content{overflow:hidden!important;background-color:#eff3f9}::ng-deep .content-tabs .mat-tab-body.mat-tab-body-active{overflow-y:hidden}:host ::ng-deep .sticky-mat-tabs .mat-tab-header{top:96px;z-index:1000;position:sticky;position:-webkit-sticky;background:#eff3f9}#commentsDiv,#samuhikCharchaDiv{margin:1rem auto;min-height:800px}@media screen and (max-width: 768px){.sticky-mat-tabs .mat-tab-header{top:120px;position:fixed;width:100%}.content-tabs{border-radius:16px 16px 0 0;box-shadow:0 -2px 9px #00000014;background-color:#fff}}::ng-deep .contentSticky .mat-tab-header{top:0!important}.ai-tutor-btn{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:115px}.ai-tutor-get-started{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:100%;min-height:80px}.ai-tutor-get-started-mobile{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:96%;min-height:80px}.align-items-center{align-items:center}.w-160{width:160px}.w-98{width:98%}.font-weight-600{font-weight:600;line-height:1}.ai-tutor-label{color:#1b4ca1;font-weight:700}.section-dd{border-radius:32px;border:1px solid #1b4ca1;padding:12px 16px;color:#1b4ca1;width:auto;height:45px;font-size:14px;font-weight:700}::ng-deep .section-dd-container .mat-form-field-wrapper{padding-bottom:.5em!important}::ng-deep .section-dd-container .mat-form-field-infix{width:auto!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:#1b4ca1!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{top:35%!important;right:15%!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-input-element{padding-right:65px}::ng-deep .section-dd .mat-form-field-underline{display:none!important}.w-20{width:20%}::ng-deep .highlight{background-color:#ff0!important;font-weight:700!important}.red-circle{background:red;opacity:1;color:#fff;padding:2px 10px;height:14px;width:20px;border-radius:2px;vertical-align:middle;display:flex;justify-content:center;align-items:center;margin-left:8px;margin-top:-10px}.w-60{width:60%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px}.blue-underline{color:#1b4ca1;text-decoration:underline;font-weight:700}.transcript-control{color:#fff;display:flex;align-items:flex-start;justify-content:flex-start}:host ::ng-deep .multiline-select .mat-mdc-select-value-text{white-space:pre-wrap!important}:host ::ng-deep .mat-pseudo-checkbox{display:none!important}:host ::ng-deep .mat-pseudo-checkbox-checked{display:none!important}::ng-deep .multiline-select.mat-form-field{border-bottom:1px solid #1b4ca1!important}::ng-deep .multiline-select-option .mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:#e3eeff!important;color:#1b4ca1!important;font-weight:700!important}.transcript-flex-container{display:flex;justify-content:flex-end;width:100%}.selected-option-content{color:#1b4ca1}.ml-5-per{margin-left:5%}.black-text{color:#000;word-wrap:break-word}.subtitle-time{width:20%;word-wrap:break-word}.subtitle-text-slot{width:74%}.w-subtitle-80{width:70%}.w-subtitle-20{width:30%}::ng-deep .mat-mdc-select-panel{background:#fff!important}@media (min-width: 1280px) and (max-width: 1280px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1056px) and (max-width: 1232px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1024px) and (max-width: 1024px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 768px) and (max-width: 1023px){.subtitle-time{width:25%}.subtitle-text-slot{width:75%}}@media (min-width: 360px) and (max-width: 360px){.subtitle-time,.subtitle-text-slot{width:50%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 361px) and (max-width: 540px){.subtitle-time,.subtitle-text-slot{width:50%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 541px) and (max-width: 767px){.subtitle-time{width:40%}.subtitle-text-slot{width:60%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 768px){::ng-deep .tab-group-container .mdc-tab{min-width:auto;max-width:max-content;text-align:left;justify-content:start;padding-left:24px;padding-right:24px}.w-60{width:60%}}:host ::ng-deep .tab-group-container ::ng-deep .mat-mdc-tab-header-pagination{z-index:1!important}:host ::ng-deep .transcript-flex-container .mat-mdc-text-field-wrapper{width:100%;padding:10px}:host ::ng-deep .multiline-select.mat-mdc-form-field .mdc-line-ripple{display:none!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mdc-line-ripple{display:block!important;height:4px!important;color:#1b4ca1!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mat-mdc-form-field-flex{background-color:#e3eeff!important}:host ::ng-deep .multiline-select .mat-mdc-select-arrow-wrapper{margin-right:10px}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.MatTabContent, selector: "[matTabContent]" }, { kind: "directive", type: i11.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i12.WidgetCommentComponent, selector: "d-v2-widget-comment", inputs: ["widgetData", "commentId"], outputs: ["commentDataChange"] }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i14.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i14.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i15.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i16.AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: ["condition", "kparray", "content", "contentReadData", "baseContentReadData", "skeletonLoader", "sticky", "tocStructure", "pathSet", "config", "resumeData", "forPreview", "showReviews", "batchData", "fromViewer", "selectedBatchData", "selectedTabValue", "fromMarketPlace", "showMarketPlaceCertificate", "languageList", "lockCertificate", "fromMDO"], outputs: ["trigerCompletionSurveyForm"] }, { kind: "component", type: i17.AppTocContentComponent, selector: "ws-widget-app-toc-content", inputs: ["batchId", "content", "forPreview", "resumeData", "batchData", "skeletonLoader", "tocStructure", "config", "hierarchyMapData", "pathSet", "componentName", "isPreAssessment", "baseContentReadData", "contentReadData"] }, { kind: "component", type: i18.AppTocTeachersNotesComponent, selector: "ws-widget-app-toc-teachers-notes", inputs: ["content", "notesDisplayType"] }, { kind: "component", type: i19.AppTocBatchAssignmentsComponent, selector: "ws-widget-app-batch-assignments", inputs: ["content"] }, { kind: "component", type: i20.SamuhikCharchaContentComponent, selector: "ws-widget-samuhik-charcha-content", inputs: ["content", "conditionData", "locked"], outputs: ["resumeContent"] }, { kind: "component", type: i21.AiTutorComponent, selector: "ws-widget-ai-tutor", inputs: ["from", "content", "userJourney"], outputs: ["closeAIPopup"] }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i22.TranslatePipe, name: "translate" }, { kind: "pipe", type: i23.HighlightPipe, name: "highlight" }] }); }
760
+ }
761
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContentTocComponent, decorators: [{
762
+ type: Component,
763
+ args: [{ selector: 'ws-widget-content-toc', template: "<!-- && (content?.courseCategory !== courseCategory?.BLENDED_PROGRAM) -->\n<div class=\"ai-tutor-get-started\" *ngIf=\"!viewerPage && enableAITutorFlag && !isMobile\">\n <div class=\"flex flex-row align-items-center\">\n <div class=\"px-2 py-2\">\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"64px\" width=\"64px\" />\n </div>\n <div class=\"flex flex-row align-items-center\">\n <div class=\"py-2\" >\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\n <span>Get instant explanations, step-by-step learning guidance, and customised learning tailored just\n for you.</span>\n </div>\n <div class=\"ai-tutor-btn px-2 py-1\" [ngClass]=\"isMobile ? 'w-160' : ''\">\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\n </div>\n </div>\n </div>\n</div>\n<div class=\"tab-group-container\">\n <mat-tab-group (selectedTabChange)=\"handleTabChange($event)\" #stickyMenu [class.sticky-mat-tabs]=\"sticky\"\n [selectedIndex]=\"selectedTabIndex\" [ngClass]=\"{'content-tabs':!fromViewer,'contentSticky': forPreview}\">\n\n <!-- Transcription Tab -->\n <mat-tab label=\"Transcription\"\n *ngIf=\"viewerPage && enableTranscriptionFlag && vttLangArr?.length && subTitles?.length\">\n <ng-template mat-tab-label>\n <div class=\"flex flex-row\">\n <div class=\"flex\">\n <span>Transcript</span>\n </div>\n <div class=\"red-circle ml-5\">\n New\n </div>\n </div>\n\n </ng-template>\n <ng-template matTabContent>\n <div class=\"disclaimer my-2\">\n <p class=\"py-2 px-2\">Disclaimer : These transcripts and subtitles are AI-generated and may contain\n errors.</p>\n </div>\n <div class=\"w-full ml-5 mr-5\" *ngIf=\"isMobileForAI\">\n <div class=\"transcript-flex-container mt-2\">\n <mat-form-field class=\"multiline-select\" appearance=\"fill\" style=\"height: auto; width: 100%;\"\n floatLabel=\"never\">\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\n <mat-select-trigger class=\"multiline-select-box-trigger\">\n <div class=\"selected-option-content px-5 py-2\">\n <div class=\"title\"><span\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\n <b>Transcript Language: </b></span>\n {{selectedTranscriptionStyle?.language | titlecase}} <span\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\n </div>\n </div>\n </mat-select-trigger>\n <mat-option class=\"multiline-select-option\" value=\"\" *ngFor=\"let lang of vttLangArr\"\n [value]=\"lang\"\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\n <div class=\"option-content\">\n <div class=\"title\">{{lang?.language | titlecase}}</div>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"ml-4 flex flex-row justify-end transcript-control\">\n <!-- <mat-form-field appearance=\"none\">\n <select matNativeControl required class=\"section-dd\" (change)=\"renderSelectedLanguageTranscription($event)\">\n <option [value]=\"lang?.language\" *ngFor=\"let lang of vttLangArr\" [selected]=\"lang?.label === transcriptionActiveLanguage\">\n <span *ngIf=\"transcriptionActiveLanguage === lang?.label\"> Transcript Language: </span> {{lang?.language | titlecase}} <span *ngIf=\"transcriptionActiveLanguage === lang?.language\">(Auto)</span>\n </option>\n </select>\n </mat-form-field> -->\n <div class=\"flex flex-row w-full\">\n <div [ngClass]=\"!isMobileForAI ? 'w-subtitle-80':'w-full'\">\n <div [ngClass]=\"!isMobileForAI ? 'ml-5-per' : ''\" *ngIf=\"subTitles && subTitles?.length\">\n <!-- Transcription content -->\n <ng-container *ngFor=\"let subtitle of subTitles\">\n <div class=\"flex flex-col my-2\">\n <div class=\"flex flex-row\">\n <div class=\"subtitle-time\">\n <p class=\"cursor-pointer\" (click)=\"playFromSlot(subtitle)\">\n <span class=\"pr-1 blue-underline\"> {{\n formatMsToVttTime(subtitle?.startTime) }} </span>\n <span class=\"black-text\">-</span>\n <span class=\"pl-1 blue-underline\">{{\n formatMsToVttTime(subtitle?.endTime) }}</span>\n </p>\n </div>\n <div class=\"ml-4 subtitle-text-slot mr-4\">\n <p class=\"black-text\" [innerHtml]=\"subtitle?.text\n | highlight : keywordToHighlight?.text\n : ((subtitle?.startTime / 1000) >= keywordToHighlight?.start\n && (subtitle?.endTime / 1000) <= keywordToHighlight?.end)\">\n </p>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"w-subtitle-20\" *ngIf=\"!isMobileForAI\">\n <div class=\"transcript-flex-container mt-2\">\n <mat-form-field class=\"multiline-select\" appearance=\"fill\"\n style=\"height: auto; width: 100%;\" floatLabel=\"never\">\n <mat-select class=\"multiline-select-box pr-5\" [(value)]=\"selectedTranscriptionStyle\"\n (selectionChange)=\"renderSelectedLanguageTranscription($event)\">\n <mat-select-trigger class=\"multiline-select-box-trigger\">\n <div class=\"selected-option-content px-5 py-2\">\n <div class=\"title\"><span\n *ngIf=\"transcriptionActiveLanguage === selectedTranscriptionStyle?.label\">\n <b>Transcript Language: </b></span>\n {{selectedTranscriptionStyle?.language | titlecase}} <span\n *ngIf=\"defaultTranscriptLanguage === selectedTranscriptionStyle?.label\">(Auto)</span>\n </div>\n </div>\n </mat-select-trigger>\n <mat-option class=\"multiline-select-option\" value=\"\"\n *ngFor=\"let lang of vttLangArr\" [value]=\"lang\"\n [ngClass]=\"{'active-option': selectedTranscriptionStyle?.label === lang?.label}\">\n <div class=\"option-content\">\n <div class=\"title\">{{lang?.language | titlecase}}</div>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n </div>\n <!-- <div class=\"flex flex-row align-items-center my-2\">\n <div>\n <p>0.00</p>\n </div>\n <div class=\"ml-4\">\n <p>AI for Digital Transformation: Machine Learning and Deep Learning Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n </div>\n <div class=\"ml-4\">\n <mat-form-field appearance=\"none\">\n <select matNativeControl required class=\"section-dd\">\n <option value=\"\">Transcription Language: English (Auto)</option>\n </select>\n </mat-form-field>\n </div>\n </div> -->\n\n </ng-template>\n </mat-tab>\n\n <!-- About Tab -->\n <mat-tab label=\"{{ 'apptocsinglepage.about' | translate }}\">\n <ng-template matTabContent>\n <div class=\"ai-tutor-get-started-mobile my-2 ml-2\" *ngIf=\"!viewerPage && enableAITutorFlag && isMobile && (domainConfService?.isFeatureByPageEnabled('toc','aiTutor'))\">\n <div class=\"flex flex-row align-items-center w-98\">\n <div class=\"px-2 py-2\">\n <img src=\"assets/icons/bot-chat-small.svg\" height=\"48px\" width=\"48px\" />\n </div>\n <div class=\"flex flex-row align-items-center w-60\">\n <div class=\"py-2\">\n <p class=\"font-weight-600\">Get Started with AI Tutor</p>\n <span>Get instant explanations, step-by-step learning guidance, and customised learning\n tailored just for you.</span>\n </div>\n\n </div>\n <div class=\"ai-tutor-btn px-2 py-1\">\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img\n src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI\n Tutor</span></a>\n </div>\n\n </div>\n <!-- <div class=\"flex justify-end my-2 mx-2\">\n <div class=\"ai-tutor-btn px-2 py-1\">\n <a href=\"javascript:void(0)\" (click)=\"showAiTutorConfirmPopup()\"><img src=\"assets/ai-tutor/ai-icon.svg\">&nbsp; &nbsp; <span class=\"ai-tutor-label\">AI Tutor</span></a>\n </div>\n </div> -->\n </div>\n <ws-widget-app-toc-about [fromViewer]=\"fromViewer\" [pathSet]=\"pathSet\" [content]=\"content\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"false\" [sticky]=\"sticky\"\n [selectedBatchData]=\"selectedBatchData\" [selectedTabValue]=\"selectedTabIndex\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\n [condition]=\"condition\" [kparray]=\"kparray\" [showReviews]=\"'true'\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n [fromMDO]=\"fromMDO\">\n </ws-widget-app-toc-about>\n </ng-template>\n </mat-tab>\n\n <!-- Content Tab -->\n <ng-container *ngIf=\"content?.children?.length\">\n <mat-tab label=\"{{ 'apptocsinglepage.content' | translate }}\" *ngIf=\"contentTabFlag\">\n <ng-template matTabContent>\n <ws-widget-app-toc-content [batchId]=\"batchId\" [componentName]=\"componentName\" [pathSet]=\"pathSet\"\n [content]=\"content\" [tocStructure]=\"tocStructure\" [config]=\"config\" [forPreview]=\"forPreview\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [skeletonLoader]=\"skeletonLoader\"\n [hierarchyMapData]=\"hierarchyMapData\" [baseContentReadData]=\"baseContentReadData\">\n </ws-widget-app-toc-content>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <ng-container *ngIf=\"config?.commentsTab && !forPreview && (domainConfService?.isFeatureByPageEnabled('toc','startDiscussion'))\">\n <mat-tab label=\"{{ 'apptocsinglepage.startDiscussion' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"commentsDiv\"\n *ngIf=\"discussWidgetData && discussWidgetData?.newCommentSection?.commentTreeData?.entityId\">\n <ng-container *ngIf=\"!commentId\">\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\"></d-v2-widget-comment>\n </ng-container>\n <ng-container *ngIf=\"commentId\">\n <div class=\"flex flex-row gap-3 cursor-pointer mb-5\" (click)=\"clearCommentIdFromUrl()\">\n <mat-icon class=\"cursor-pointer\">arrow_back</mat-icon>\n Back to all comments\n </div>\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\" [commentId]=\"commentId\"\n [skeletonLoader]></d-v2-widget-comment>\n </ng-container>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <ng-container\n *ngIf=\"config?.samuhikCharchaTab && condition && contentReadData?.eventLinked?.length > 0 && enableSamuhikCharchaTab && (domainConfService?.isFeatureByPageEnabled('toc','samuhikCharcha'))\">\n <mat-tab label=\"{{ 'apptocsinglepage.samuhikCharcha' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"samuhikCharchaDiv\">\n <ws-widget-samuhik-charcha-content [content]=\"contentReadData\" [conditionData]=\"condition\"\n (resumeContent)=\"resumeContentCall()\">\n </ws-widget-samuhik-charcha-content>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <!-- Teachers Note Tab -->\n <ng-container *ngIf=\"contentReadData?.referenceNodes && teacherNotesFlag\">\n <mat-tab label=\"Teachers Note\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\n [notesDisplayType]=\"'Teachers Resource'\"></ws-widget-app-toc-teachers-notes>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <!-- Reference Note Tab -->\n <ng-container *ngIf=\"contentReadData?.referenceNodes && referenceNotesFlag\">\n <mat-tab label=\"Reference Note\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"teachersNoteDiv\">\n <ws-widget-app-toc-teachers-notes [content]=\"contentReadData\"\n [notesDisplayType]=\"'Reference Resource'\"></ws-widget-app-toc-teachers-notes>\n\n <!-- <ws-widget-app-toc-reference-notes [content]=\"contentReadData\"></ws-widget-app-toc-reference-notes> -->\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <ng-container *ngIf=\"showAssignmentsTab && !forPreview && (domainConfService?.isFeatureByPageEnabled('toc','assignment'))\">\n <mat-tab label=\"{{ 'apptocsinglepage.assignments' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col ratings-div mt-5\" id=\"takeAssessmentDiv\">\n <ws-widget-app-batch-assignments [content]=\"content\"></ws-widget-app-batch-assignments>\n </div>\n </ng-template>\n </mat-tab>\n </ng-container>\n\n <!-- Transcription Tab -->\n <mat-tab label=\"AI Tutor\" *ngIf=\"viewerPage && enableAITutorFlag && isMobile && (domainConfService?.isFeatureByPageEnabled('toc','transcription'))\">\n <ng-template mat-tab-label>\n <div class=\"flex flex-row\">\n <div class=\"flex\">\n <span>AI Tutor</span>\n </div>\n <div class=\"red-circle ml-5\">\n New\n </div>\n </div>\n\n </ng-template>\n <ng-template matTabContent>\n <ng-container *ngIf=\"showAITutorPopup\">\n <div>\n <ws-widget-ai-tutor [content]=\"content?.identifier\"\n (closeAIPopup)=\"closeAIPopup($event)\"></ws-widget-ai-tutor>\n </div>\n </ng-container>\n </ng-template>\n </mat-tab>\n\n </mat-tab-group>\n</div>", styles: ["::ng-deep .content-tabs .mat-tab-body-content{overflow:hidden!important;background-color:#eff3f9}::ng-deep .content-tabs .mat-tab-body.mat-tab-body-active{overflow-y:hidden}:host ::ng-deep .sticky-mat-tabs .mat-tab-header{top:96px;z-index:1000;position:sticky;position:-webkit-sticky;background:#eff3f9}#commentsDiv,#samuhikCharchaDiv{margin:1rem auto;min-height:800px}@media screen and (max-width: 768px){.sticky-mat-tabs .mat-tab-header{top:120px;position:fixed;width:100%}.content-tabs{border-radius:16px 16px 0 0;box-shadow:0 -2px 9px #00000014;background-color:#fff}}::ng-deep .contentSticky .mat-tab-header{top:0!important}.ai-tutor-btn{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:115px}.ai-tutor-get-started{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:100%;min-height:80px}.ai-tutor-get-started-mobile{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:96%;min-height:80px}.align-items-center{align-items:center}.w-160{width:160px}.w-98{width:98%}.font-weight-600{font-weight:600;line-height:1}.ai-tutor-label{color:#1b4ca1;font-weight:700}.section-dd{border-radius:32px;border:1px solid #1b4ca1;padding:12px 16px;color:#1b4ca1;width:auto;height:45px;font-size:14px;font-weight:700}::ng-deep .section-dd-container .mat-form-field-wrapper{padding-bottom:.5em!important}::ng-deep .section-dd-container .mat-form-field-infix{width:auto!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:#1b4ca1!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-form-field-infix:after{top:35%!important;right:15%!important}::ng-deep .section-dd-container .mat-form-field-type-mat-native-select .mat-input-element{padding-right:65px}::ng-deep .section-dd .mat-form-field-underline{display:none!important}.w-20{width:20%}::ng-deep .highlight{background-color:#ff0!important;font-weight:700!important}.red-circle{background:red;opacity:1;color:#fff;padding:2px 10px;height:14px;width:20px;border-radius:2px;vertical-align:middle;display:flex;justify-content:center;align-items:center;margin-left:8px;margin-top:-10px}.w-60{width:60%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px}.blue-underline{color:#1b4ca1;text-decoration:underline;font-weight:700}.transcript-control{color:#fff;display:flex;align-items:flex-start;justify-content:flex-start}:host ::ng-deep .multiline-select .mat-mdc-select-value-text{white-space:pre-wrap!important}:host ::ng-deep .mat-pseudo-checkbox{display:none!important}:host ::ng-deep .mat-pseudo-checkbox-checked{display:none!important}::ng-deep .multiline-select.mat-form-field{border-bottom:1px solid #1b4ca1!important}::ng-deep .multiline-select-option .mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:#e3eeff!important;color:#1b4ca1!important;font-weight:700!important}.transcript-flex-container{display:flex;justify-content:flex-end;width:100%}.selected-option-content{color:#1b4ca1}.ml-5-per{margin-left:5%}.black-text{color:#000;word-wrap:break-word}.subtitle-time{width:20%;word-wrap:break-word}.subtitle-text-slot{width:74%}.w-subtitle-80{width:70%}.w-subtitle-20{width:30%}::ng-deep .mat-mdc-select-panel{background:#fff!important}@media (min-width: 1280px) and (max-width: 1280px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1056px) and (max-width: 1232px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 1024px) and (max-width: 1024px){.subtitle-time{width:30%}.subtitle-text-slot{width:70%}}@media (min-width: 768px) and (max-width: 1023px){.subtitle-time{width:25%}.subtitle-text-slot{width:75%}}@media (min-width: 360px) and (max-width: 360px){.subtitle-time,.subtitle-text-slot{width:50%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 361px) and (max-width: 540px){.subtitle-time,.subtitle-text-slot{width:50%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 541px) and (max-width: 767px){.subtitle-time{width:40%}.subtitle-text-slot{width:60%}.w-subtitle-20{width:40%}.disclaimer{background-color:#f3962f33;color:#000000de;font-family:Lato;font-size:16px;font-weight:500;border-radius:8px;margin:10px}}@media (min-width: 768px){::ng-deep .tab-group-container .mdc-tab{min-width:auto;max-width:max-content;text-align:left;justify-content:start;padding-left:24px;padding-right:24px}.w-60{width:60%}}:host ::ng-deep .tab-group-container ::ng-deep .mat-mdc-tab-header-pagination{z-index:1!important}:host ::ng-deep .transcript-flex-container .mat-mdc-text-field-wrapper{width:100%;padding:10px}:host ::ng-deep .multiline-select.mat-mdc-form-field .mdc-line-ripple{display:none!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mdc-line-ripple{display:block!important;height:4px!important;color:#1b4ca1!important}:host ::ng-deep .multiline-select.mat-mdc-form-field:hover .mat-mdc-form-field-flex{background-color:#e3eeff!important}:host ::ng-deep .multiline-select .mat-mdc-select-arrow-wrapper{margin-right:10px}\n"] }]
764
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.UtilityService }, { type: i3.LoadCheckService }, { type: i2.ConfigurationsService }, { type: i4.MatLegacyDialog }, { type: i5.AppTocService }, { type: i6.ActionService }, { type: i1.Router }, { type: i2.EventService }, { type: i7.ViewerDataService }, { type: i8.SamuhikCharchaService }, { type: i2.DomainConfService }, { type: undefined, decorators: [{
765
+ type: Inject,
766
+ args: ['environment']
767
+ }] }]; }, propDecorators: { content: [{
768
+ type: Input
769
+ }], contentReadData: [{
770
+ type: Input
771
+ }], initialRouteData: [{
772
+ type: Input
773
+ }], changeTab: [{
774
+ type: Input
775
+ }], baseContentReadData: [{
776
+ type: Input
777
+ }], forPreview: [{
778
+ type: Input
779
+ }], contentTabFlag: [{
780
+ type: Input
781
+ }], resumeData: [{
782
+ type: Input
783
+ }], batchData: [{
784
+ type: Input
785
+ }], skeletonLoader: [{
786
+ type: Input
787
+ }], tocStructure: [{
788
+ type: Input
789
+ }], pathSet: [{
790
+ type: Input
791
+ }], fromViewer: [{
792
+ type: Input
793
+ }], hierarchyMapData: [{
794
+ type: Input
795
+ }], tabElement: [{
796
+ type: ViewChild,
797
+ args: ['stickyMenu']
798
+ }], tabs: [{
799
+ type: ViewChildren,
800
+ args: [MatTab]
801
+ }], condition: [{
802
+ type: Input
803
+ }], kparray: [{
804
+ type: Input
805
+ }], selectedBatchData: [{
806
+ type: Input
807
+ }], config: [{
808
+ type: Input
809
+ }], componentName: [{
810
+ type: Input
811
+ }], isEnrolled: [{
812
+ type: Input
813
+ }], playResourceId: [{
814
+ type: Input
815
+ }], sideNavBarOpened: [{
816
+ type: Input
817
+ }], languageList: [{
818
+ type: Input
819
+ }], lockCertificate: [{
820
+ type: Input
821
+ }], fromMDO: [{
822
+ type: Input
823
+ }], playResumeForAI: [{
824
+ type: Output
825
+ }], enrollUserToAI: [{
826
+ type: Output
827
+ }], trigerCompletionSurveyForm: [{
828
+ type: Output
829
+ }], resumeContent: [{
830
+ type: Output
831
+ }], handleScroll: [{
832
+ type: HostListener,
833
+ args: ['window:scroll', ['$event']]
834
+ }] } });
835
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC10b2MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvY29udGVudC10b2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvY29udGVudC10b2MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQTRCLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFakwsT0FBTyxFQUEwRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQU12SCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQTtBQUN4RyxPQUFPLEVBQWdDLHFCQUFxQixJQUFJLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3hILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRzNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBRS9DLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9wRCxNQUFNLE9BQU8sbUJBQW1CO0lBc0U5QixZQUNVLEtBQXFCLEVBQ3JCLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyxhQUFvQyxFQUNyQyxNQUFpQixFQUNqQixNQUFxQixFQUNwQixTQUF3QixFQUN4QixNQUFjLEVBQ2QsUUFBc0IsRUFDdEIsYUFBZ0MsRUFDaEMsaUJBQXdDLEVBQ3pDLGlCQUFvQyxFQUNaLFdBQWdCO1FBWnZDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUNyQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBZTtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDaEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF1QjtRQUN6QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ1osZ0JBQVcsR0FBWCxXQUFXLENBQUs7UUFqRmpELG1CQUFjLEdBQVEsRUFBRSxDQUFBO1FBSWYsY0FBUyxHQUFHLEtBQUssQ0FBQTtRQUUxQixzQkFBaUIsR0FBd0IsSUFBSSxDQUFBO1FBQ3BDLGVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3hHLG1CQUFjLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLGVBQVUsR0FBZSxJQUFJLENBQUE7UUFDN0IsY0FBUyxHQUFrRCxJQUFJLENBQUE7UUFDL0QsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFDdEIsaUJBQVksR0FBUSxFQUFFLENBQUE7UUFFdEIsZUFBVSxHQUFHLEtBQUssQ0FBQTtRQUNsQixxQkFBZ0IsR0FBUSxFQUFFLENBQUE7UUFTMUIsbUJBQWMsR0FBRyxFQUFFLENBQUE7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLGlCQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ2pCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFDZCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7UUFDcEMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBQ25DLCtCQUEwQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUE7UUFDeEQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFBO1FBRWxELGNBQVMsR0FBWSxFQUFFLENBQUE7UUFDdkIsV0FBTSxHQUFHLEtBQUssQ0FBQTtRQUVkLGFBQVEsR0FBRyxLQUFLLENBQUE7UUFDaEIscUJBQWdCLEdBQUcsQ0FBQyxDQUFBO1FBRXBCLHFCQUFnQixHQUFHLEtBQUssQ0FBQTtRQUN4Qix1QkFBa0IsR0FBRyxLQUFLLENBQUE7UUFDMUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFFckUsc0JBQWlCLEdBQUcsS0FBSyxDQUFBO1FBQ3pCLDRCQUF1QixHQUFHLEtBQUssQ0FBQTtRQUMvQixtQkFBYyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUE7UUFDMUMsZUFBVSxHQUF3QixJQUFJLENBQUE7UUFFdEMsd0JBQW1CLEdBQXdCLElBQUksQ0FBQTtRQUMvQyxjQUFTLEdBQVEsRUFBRSxDQUFBO1FBQ25CLHVCQUFrQixHQUFRLEVBQUUsQ0FBQTtRQUM1Qix1QkFBa0IsR0FBRyxLQUFLLENBQUE7UUFDMUIsZUFBVSxHQUFRLEVBQUUsQ0FBQTtRQUNwQixnQ0FBMkIsR0FBRyxJQUFJLENBQUE7UUFDbEMsOEJBQXlCLEdBQUcsSUFBSSxDQUFBO1FBQ2hDLDRCQUF1QixHQUF3QixJQUFJLENBQUE7UUFFbkQsZ0JBQVcsR0FBRyxLQUFLLENBQUE7UUFDbkIsa0JBQWEsR0FBRyxDQUFDLENBQUE7UUFDakIseUJBQW9CLEdBQUcsQ0FBQyxDQUFBO1FBQ3hCLHFCQUFnQixHQUFHLEtBQUssQ0FBQTtRQUN4QiwyQkFBc0IsR0FBRyxLQUFLLENBQUE7UUFDOUIsa0JBQWEsR0FBRyxLQUFLLENBQUE7UUFDckIsaUNBQTRCLEdBQUcsU0FBUyxDQUFBO1FBQ3hDLHVCQUFrQixHQUFHLEtBQUssQ0FBQTtRQUMxQiw0QkFBdUIsR0FBRyxLQUFLLENBQUE7SUFpQjNCLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNoSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxxQ0FBcUMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO1lBQ3pPLGdDQUFnQztTQUNqQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQ25NLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUNwRztZQUNBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLHFDQUFxQyxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7WUFDek8sZ0NBQWdDO1NBQ2pDO2FBQU07WUFDTCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO1NBQy9CO1FBQ0EsSUFBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUU7WUFDOUYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQTtTQUMvQjtRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRTtZQUMxRix5RkFBeUY7WUFDekYsc0NBQXNDO1lBQ3RDLG1HQUFtRztZQUNuRyxzQkFBc0I7WUFDdEIsTUFBTTtZQUVOLEtBQUs7WUFFTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7WUFDakMsQ0FBQyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUM7aUJBQzdFLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDbEU7aUJBQ0EsU0FBUyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7Z0JBQzVCLElBQUksU0FBUyxFQUFFO29CQUNiLDhDQUE4QztpQkFDL0M7WUFFSCxDQUFDLENBQUMsQ0FBQTtZQUNKLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUE7U0FDcEM7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUN0TixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFDM0c7WUFDQSx5RkFBeUY7WUFDekYsc0NBQXNDO1lBQ3RDLG1HQUFtRztZQUNuRyxzQkFBc0I7WUFDdEIsTUFBTTtZQUVOLEtBQUs7WUFFTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7WUFDakMsQ0FBQyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUM7aUJBQzdFLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDbEU7aUJBQ0EsU0FBUyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7Z0JBQzVCLElBQUksU0FBUyxFQUFFO29CQUNiLDhDQUE4QztpQkFDL0M7WUFFSCxDQUFDLENBQUMsQ0FBQTtZQUNKLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUE7U0FDcEM7YUFBTTtZQUNMLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUE7U0FDckM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzlDLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtTQUMxQjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzNHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO1NBQzFCO0lBRUgsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFBO1FBQzVDLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7U0FDMUI7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFBO1FBRXZFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBVyxFQUFFLEVBQUU7WUFFdkQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUUzQyxJQUFJLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDckUsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFBO29CQUN0QyxJQUFJLEtBQUssR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtvQkFDbkYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQTt3QkFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQTtxQkFDbkM7Z0JBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2FBRVQ7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzlCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUMzQyxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCO1FBQzVCLElBQUk7WUFDRixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFBO1NBQ2hGO1FBQUMsT0FBTyxLQUFLLEVBQUU7U0FDZjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXNCO1FBRXRDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQTtRQUV2RCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDMUYsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQTtTQUNwQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQ3ROLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUM1RztZQUNBLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUE7U0FDcEM7YUFBTTtZQUNMLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUE7U0FDckM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQy9ILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMscUNBQXFDLEVBQUUscUNBQXFDLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtZQUM3TSxnQ0FBZ0M7U0FDakM7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtlQUNqTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFDeEc7WUFDQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLHFDQUFxQyxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7U0FDOU07YUFBTTtZQUNMLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUE7U0FDL0I7UUFFRCxJQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUM3RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO1NBQy9CO1FBRUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDeEMsSUFBSSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsS0FBSyxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRTtnQkFDcEYsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDbkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUE7b0JBQy9FLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO29CQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQTtvQkFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO2lCQUNoQjthQUNGO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDdkYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUMvRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFBO1NBQ3JEO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUE7WUFDdEQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO29CQUN0RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFBO2lCQUN4RztnQkFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRTtvQkFDNUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQTtpQkFDbEk7YUFDRjtZQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFO29CQUM5RixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO2lCQUMvQjtnQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtnQkFDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUE7YUFDdkY7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUE7Z0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLDRCQUE0QixDQUFBO2FBQy9GO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQTthQUN0RDtZQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7U0FDdkQ7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFO1lBQ3JFLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSw0QkFBNEIsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN6RSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQTtZQUMzRCxJQUFJLFVBQVUsR0FBUSxFQUFFLENBQUE7WUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUN0RCxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUE7Z0JBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3pELElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN6RSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUE7aUJBQ2xGO2dCQUNELElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN4RSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUE7aUJBQ2pGO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNyRixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTt3QkFDMUYsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTs0QkFDdkQsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNO2dDQUNuRixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxpQkFBaUI7Z0NBRTNELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTs0QkFDekQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dDQUNsRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFBOzZCQUNwQzt5QkFDRjtxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1NBRUg7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUU7WUFDL0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ3hELElBQUksU0FBUyxHQUFnQixJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO2dCQUN2RSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUE7Z0JBRTNCLGdDQUFnQztnQkFDaEMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztvQkFDekIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQ3ZCLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ3pCLGVBQWUsR0FBRyxJQUFJLENBQUE7aUJBQ3ZCO2dCQUVELDBGQUEwRjtnQkFDMUYsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQTtvQkFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFBO29CQUN2RCxNQUFNLFVBQVUsR0FBRyxVQUFVLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQTtvQkFDbkQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtvQkFFbkQsSUFBSSxVQUFVLEVBQUU7d0JBQ2QsSUFBSTs0QkFDRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBOzRCQUM5QyxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRSxDQUM5RCxRQUFRLENBQUMsUUFBUSxLQUFLLHFDQUFxQyxDQUM1RCxDQUFBOzRCQUNELElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQ0FDekQsZUFBZSxHQUFHLElBQUksQ0FBQTs2QkFDdkI7eUJBQ0Y7d0JBQUMsT0FBTyxLQUFLLEVBQUU7NEJBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRSxLQUFLLENBQUMsQ0FBQTt5QkFDdEU7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsaURBQWlEO2dCQUNqRCxJQUFJLGVBQWUsRUFBRTtvQkFDbkIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxtQkFBbUIsRUFBRTt3QkFDbEYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtxQkFDN0I7aUJBQ0Y7Z0JBRUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxvQkFBb0IsRUFBRTtvQkFDbkYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtpQkFDL0I7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksRUFBRTtnQkFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtpQkFDM0I7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTthQUMzQjtTQUVGO2FBQU07WUFDTCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTthQUMxQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTthQUMzQjtTQUNGO0lBRUgsQ0FBQztJQUdELFlBQVk7UUFDVixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFBO1FBQ25DLElBQUksWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDdEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7U0FDbkI7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUF3QjtRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUE7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtTQUM3QjtRQUNELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxLQUFLLGVBQWUsRUFBRTtZQUN6RSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQTtZQUMxQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxDQUFBO1lBQy9DLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNUO2FBQU07WUFDTCxJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQTtTQUMxQztJQUVILENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUE7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1lBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUE7WUFDdEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBR1IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7WUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtZQUNqQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7U0FDVDthQUFNO1lBQ0wsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtZQUN0QyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDUixNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO1lBRTFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFBO1lBQzVCLFlBQVksQ0FBQyxJQUFJLEdBQUc7Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTthQUN4QixDQUFBO1lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFFOUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUNsRCxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO29CQUN2QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQTtpQkFDakM7cUJBQU0sSUFBSSxRQUFRLEtBQUssY0FBYyxFQUFFO29CQUN0QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtpQkFDNUI7Z0JBQ0QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUE7WUFDakMsQ0FBQyxDQUFDLENBQUE7U0FDSDtJQUVILENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkMsSUFBSSxZQUFpQixDQUFBO1lBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxHQUFHLEVBQUU7Z0JBQzdDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDbkQ7aUJBQU07Z0JBQ0wsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO2FBQzVDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7YUFDdkY7WUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLG9CQUFvQixDQUN4QyxZQUFZLENBQUMsVUFBVSxFQUN2QixZQUFZLENBQUMsUUFBUSxFQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQ2YsbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2xCLENBQUE7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUE7WUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM5QyxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVc7b0JBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztpQkFDOUI7YUFDRixDQUFDLENBQUE7WUFDRiw2QkFBNkI7WUFDN0IsK0JBQStCO1lBQy9CLE1BQU07WUFDTiwyQ0FBMkM7WUFDM0Msb0RBQW9EO1lBQ3BELG9DQUFvQztZQUNwQyxPQUFPO1lBQ1AsOEJBQThCO1NBQy9CO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFBO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQWE7UUFDekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsMkNBQTJDO1lBRTNDLE1BQU0sUUFBUSxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxFQUFFLENBQ2hFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUN0RixPQUFPO2dCQUNMLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDOUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxRQUFRO2FBQ3hFLENBQUE7U0FDRjtRQUNELE1BQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsRSxPQUFPO1lBQ0wsVUFBVSxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQy9CLFFBQVEsRUFBRSxTQUFTLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUTtTQUMxRSxDQUFBO0lBQ0gsQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDaEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQzVDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO2FBQ3hCO1NBQ0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztZQUN6QyxhQUFhLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyRyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU07Z0JBQzNDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUNwRCxJQUFJLEVBQUUsRUFBRTtZQUNSLEVBQUUsRUFBRSxXQUFXO1NBQ2hCLENBQUE7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFxQyxLQUFLLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztZQUN6QyxhQUFhLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyRyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVE7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUNwRCxJQUFJLEVBQUUsRUFBRTtZQUNSLEVBQUUsRUFBRSxXQUFXO1NBQ2hCLENBQUE7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFxQyxLQUFLLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0lBRUQsNkJBQTZCO1FBQzNCLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztZQUN6QyxhQUFhLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUNyRyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVE7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUNwRCxJQUFJLEVBQUUsRUFBRTtZQUNSLEVBQUUsRUFBRSxXQUFXO1NBQ2hCLENBQUE7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFxQyxLQUFLLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFBO1FBQ3hDLDBDQUEwQztRQUMxQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFVLEVBQUUsRUFBRTtZQUNoRixJQUFJLElBQUksR0FBUSxLQUFLLEVBQUUsSUFBSSxDQUFBO1lBQzNCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNoRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO2dCQUUvQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFBO2dCQUNuQyxxREFBcUQ7Z0JBQ3JELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7Z0JBQ3RKLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7Z0JBQ3BKLElBQUksMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDcEUsT0FBTyxJQUFJLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQywyQkFBMkIsQ0FBQTtnQkFDekQsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsSUFBSSwwQkFBMEIsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLEVBQUU7b0JBQ25FLElBQUksQ0FBQywwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDaEU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ3JEO2dCQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUN4QyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsMkJBQTJCLENBQy9ELENBQUE7Z0JBQ0QsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtnQkFDNUQsNEdBQTRHO2dCQUM1RyxJQUFJLEdBQUcsRUFBRTtvQkFDUCxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3ZDLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtvQkFFbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUE7aUJBQ3hCO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTthQUdqSjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQTtnQkFDcEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQTthQUNyQztRQUVILENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUVELEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxVQUFlO1FBQ3ZELDRFQUE0RTtRQUM1RSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDaEQsSUFBSSxDQUFDLDJCQUEyQixHQUFHLFVBQVUsQ0FBQTtTQUU5QzthQUFNO1lBQ0wsSUFBSSxDQUFDLDBCQUEwQixHQUFHLFVBQVUsRUFBRSxLQUFLLENBQUE7WUFDbkQsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUE7WUFDekUsSUFBSSxDQUFDLDRCQUE0QixHQUFHLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFBO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUE7UUFDL0MsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxDQUFBO1FBQ3BELENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7UUFDekcsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2pEO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDdEUsSUFBSSxNQUFNLEdBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxDQUFBO1FBQzlDLGlKQUFpSjtJQUVuSixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBYztRQUNoQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFRCxZQUFZLENBQUMsUUFBYTtRQUN4QixJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1lBQ3pDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7U0FDaEU7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBVTtRQUMxQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUMxQyxtQ0FBbUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUN0RCxNQUFNLE9BQU8sR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRWpDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFFN0UsMkZBQTJGO1FBQzNGLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ2pFLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxJQUFTLEVBQUUsR0FBUSxFQUFFLEtBQVU7UUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTthQUM5RDtpQkFBTTtnQkFFTCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFBO2dCQUMzQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ2hDLGdDQUFnQztvQkFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUE7aUJBQzFEO2FBQ0Y7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQTtTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO0lBQy9CLENBQUM7SUFFRCxtQ0FBbUM7UUFDakMsTUFBTSxLQUFLLEdBQUc7WUFDWixTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO1lBQ3pDLGFBQWEsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7WUFDNUMsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzlJLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUU7Z0JBQ2hGLEtBQUssRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTTtnQkFDM0MsWUFBWSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPO2dCQUNuRCxJQUFJLEVBQUUsTUFBTTthQUNiO1lBQ0QsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7WUFDM0YsSUFBSSxFQUFFLEVBQUU7WUFDUixFQUFFLEVBQUUsV0FBVztTQUNoQixDQUFBO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBcUMsS0FBSyxDQUFDLENBQUE7SUFDL0UsQ0FBQztJQUVELHNDQUFzQztRQUNwQyxNQUFNLEtBQUssR0FBRztZQUNaLFNBQVMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVM7WUFDekMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtZQUM1QyxJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRTtnQkFDOUksTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRTtnQkFDaEYsS0FBSyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRO2dCQUM3QyxZQUFZLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU87Z0JBQ25ELElBQUksRUFBRSxNQUFNO2FBQ2I7WUFDRCxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUMzRixJQUFJLEVBQUUsRUFBRTtZQUNSLEVBQUUsRUFBRSxXQUFXO1NBQ2hCLENBQUE7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFxQyxLQUFLLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0lBRUQsa0NBQWtDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztZQUN6QyxhQUFhLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFO2dCQUM5SSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVE7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQzNGLElBQUksRUFBRSxFQUFFO1lBQ1IsRUFBRSxFQUFFLFdBQVc7U0FDaEIsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQXFDLEtBQUssQ0FBQyxDQUFBO0lBQy9FLENBQUM7SUFFRCx3Q0FBd0M7UUFDdEMsTUFBTSxLQUFLLEdBQUc7WUFDWixTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO1lBQ3pDLGFBQWEsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7WUFDNUMsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO2dCQUM5SixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU07Z0JBQzNDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQzNGLElBQUksRUFBRSxFQUFFO1lBQ1IsRUFBRSxFQUFFLFdBQVc7U0FDaEIsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQXFDLEtBQUssQ0FBQyxDQUFBO0lBQy9FLENBQUM7SUFFRCwyQ0FBMkM7UUFDekMsTUFBTSxLQUFLLEdBQUc7WUFDWixTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO1lBQ3pDLGFBQWEsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7WUFDNUMsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO2dCQUM5SixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVE7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQzNGLElBQUksRUFBRSxFQUFFO1lBQ1IsRUFBRSxFQUFFLFdBQVc7U0FDaEIsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQXFDLEtBQUssQ0FBQyxDQUFBO0lBQy9FLENBQUM7SUFFRCx1Q0FBdUM7UUFDckMsTUFBTSxLQUFLLEdBQUc7WUFDWixTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO1lBQ3pDLGFBQWEsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUk7WUFDNUMsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO2dCQUM5SixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFO2dCQUNoRixLQUFLLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVE7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztnQkFDbkQsSUFBSSxFQUFFLE1BQU07YUFDYjtZQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQzNGLElBQUksRUFBRSxFQUFFO1lBQ1IsRUFBRSxFQUFFLFdBQVc7U0FDaEIsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQXFDLEtBQUssQ0FBQyxDQUFBO0lBQy9FLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBVTtRQUNyQixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtTQUMxQjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFBO1NBQ3ZDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDOUI7UUFFRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDM0M7SUFDSCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2pFLE9BQU8sa0JBQWtCLENBQUMsU0FBUyxDQUFBO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ3RELENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzNCLENBQUM7K0dBenpCVSxtQkFBbUIscVlBbUZwQixhQUFhO21HQW5GWixtQkFBbUIsOG9DQW1CaEIsTUFBTSxxRUM3Q3RCLDJsbUJBOFNNOzs0RkRwUk8sbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLHVCQUF1Qjs7MEJBd0Y5QixNQUFNOzJCQUFDLGFBQWE7NENBaEZkLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ21CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDRCxJQUFJO3NCQUF6QixZQUFZO3VCQUFDLE1BQU07Z0JBQ1gsU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBdVZQLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIERvbWFpbkNvbmZTZXJ2aWNlLCBFdmVudFNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlLCBXc0V2ZW50cyB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcblxuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeVRhYkdyb3VwIGFzIE1hdFRhYkdyb3VwLCBNYXRMZWdhY3lUYWJDaGFuZ2VFdmVudCBhcyBNYXRUYWJDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS10YWJzJ1xuaW1wb3J0IHsgTnNEaXNjdXNzaW9uVjIgfSBmcm9tICdAc3VuYmlyZC1jYi9kaXNjdXNzaW9uLXYyJ1xuaW1wb3J0IHsgQWlUdXRvckNvbmZpcm1Qb3B1cENvbXBvbmVudCB9IGZyb20gJy4vYWktdHV0b3ItY29uZmlybS1wb3B1cC9haS10dXRvci1jb25maXJtLXBvcHVwLmNvbXBvbmVudCdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2csIE1hdExlZ2FjeURpYWxvZ0NvbmZpZyBhcyBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgdmlld2VyUm91dGVHZW5lcmF0b3IgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvdmlld2VyLXJvdXRlLXV0aWwnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FjdGlvbi5zZXJ2aWNlJ1xuaW1wb3J0IHsgVnR0RmlsZSB9IGZyb20gJ0Bwb2x5ZmxpeC92dHQtcGFyc2VyJ1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBWaWV3ZXJEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZpZXdlci1kYXRhLnNlcnZpY2UnXG5pbXBvcnQgeyBNYXRUYWIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJ1xuaW1wb3J0IHsgU2FtdWhpa0NoYXJjaGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX3NlcnZpY2VzL3NhbXVoaWstY2hhcmNoYS5zZXJ2aWNlJ1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi8uLi9fY29sbGVjdGlvbi1hcGknXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtY29udGVudC10b2MnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGVudC10b2MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb250ZW50LXRvYy5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIENvbnRlbnRUb2NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG5cbiAgdGFiQ2hhbmdlVmFsdWU6IGFueSA9ICcnXG4gIEBJbnB1dCgpIGNvbnRlbnQhOiBhbnlcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhITogYW55XG4gIEBJbnB1dCgpIGluaXRpYWxSb3V0ZURhdGE6IGFueVxuICBASW5wdXQoKSBjaGFuZ2VUYWIgPSBmYWxzZVxuICBASW5wdXQoKSBiYXNlQ29udGVudFJlYWREYXRhITogYW55XG4gIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxuICBASW5wdXQoKSBjb250ZW50VGFiRmxhZyA9IHRydWVcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogYW55IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiAvKipOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlICovIGFueSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIHNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgQElucHV0KCkgdG9jU3RydWN0dXJlOiBhbnkgPSB7fVxuICBASW5wdXQoKSBwYXRoU2V0OiBhbnlcbiAgQElucHV0KCkgZnJvbVZpZXdlciA9IGZhbHNlXG4gIEBJbnB1dCgpIGhpZXJhcmNoeU1hcERhdGE6IGFueSA9IHt9XG4gIEBWaWV3Q2hpbGQoJ3N0aWNreU1lbnUnKSB0YWJFbGVtZW50ITogTWF0VGFiR3JvdXBcbiAgQFZpZXdDaGlsZHJlbihNYXRUYWIpIHRhYnMhOiBRdWVyeUxpc3Q8TWF0VGFiPlxuICBASW5wdXQoKSBjb25kaXRpb246IGFueVxuICBASW5wdXQoKSBrcGFycmF5OiBhbnlcbiAgQElucHV0KCkgc2VsZWN0ZWRCYXRjaERhdGE6IGFueVxuICBASW5wdXQoKSBjb25maWc6IGFueVxuICBASW5wdXQoKSBjb21wb25lbnROYW1lITogc3RyaW5nXG4gIEBJbnB1dCgpIGlzRW5yb2xsZWQhOiBib29sZWFuXG4gIEBJbnB1dCgpIHBsYXlSZXNvdXJjZUlkID0gJydcbiAgQElucHV0KCkgc2lkZU5hdkJhck9wZW5lZCA9IGZhbHNlXG4gIEBJbnB1dCgpIGxhbmd1YWdlTGlzdCA9IFtdXG4gIEBJbnB1dCgpIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBJbnB1dCgpIGZyb21NRE8gPSBmYWxzZVxuICBAT3V0cHV0KCkgcGxheVJlc3VtZUZvckFJID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBPdXRwdXQoKSBlbnJvbGxVc2VyVG9BSSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgdHJpZ2VyQ29tcGxldGlvblN1cnZleUZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KClcbiAgQE91dHB1dCgpIHJlc3VtZUNvbnRlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KClcblxuICBjb21tZW50SWQ/OiBzdHJpbmcgPSAnJ1xuICBzdGlja3kgPSBmYWxzZVxuICBtZW51UG9zaXRpb246IGFueVxuICBpc01vYmlsZSA9IGZhbHNlXG4gIHNlbGVjdGVkVGFiSW5kZXggPSAwXG4gIGRpc2N1c3NXaWRnZXREYXRhITogTnNEaXNjdXNzaW9uVjIuSUNvbW1lbnRXaWRnZXREYXRhXG4gIHRlYWNoZXJOb3Rlc0ZsYWcgPSBmYWxzZVxuICByZWZlcmVuY2VOb3Rlc0ZsYWcgPSBmYWxzZVxuICB2aWV3ZXJQYWdlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy92aWV3ZXIvJykgPyB0cnVlIDogZmFsc2VcbiAgcmVzdW1lRGF0YUxpbms6IGFueVxuICBlbmFibGVBSVR1dG9yRmxhZyA9IGZhbHNlXG4gIGVuYWJsZVRyYW5zY3JpcHRpb25GbGFnID0gZmFsc2VcbiAgY291cnNlQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5XG4gIHN1YlRpdGxlcyQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHJlc291cmNlSWRlbnRpZmllcjogYW55XG4gIHJlc291cmNlSWRlbnRpZmllciQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHN1YlRpdGxlczogYW55ID0gW11cbiAga2V5d29yZFRvSGlnaGxpZ2h0OiBhbnkgPSAnJ1xuICBoaWdobGlnaHRDb25kaXRpb24gPSBmYWxzZVxuICB2dHRMYW5nQXJyOiBhbnkgPSBbXVxuICB0cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPSAnZW4nXG4gIGRlZmF1bHRUcmFuc2NyaXB0TGFuZ3VhZ2UgPSAnZW4nXG4gIHRyYW5zcmlwdGlvbkxhbmd1YWdlU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZTogYW55XG4gIGZyb21BSVR1dG9yID0gZmFsc2VcbiAgdG90YWxSZXNvdXJjZSA9IDBcbiAgc2Nvcm1Bc3Nlc3NtZW50Q291bnQgPSAwXG4gIHNob3dBSVR1dG9yUG9wdXAgPSBmYWxzZVxuICBmcm9tQUlTZWxlY3RlZFRhYkluZGV4ID0gZmFsc2VcbiAgaXNNb2JpbGVGb3JBSSA9IGZhbHNlXG4gIHRyYW5zY3JpcHRBY3RpdmVMYW5ndWFnZVRleHQgPSAnRW5nbGlzaCdcbiAgc2hvd0Fzc2lnbm1lbnRzVGFiID0gZmFsc2VcbiAgZW5hYmxlU2FtdWhpa0NoYXJjaGFUYWIgPSBmYWxzZVxuICBzYW11aGlrQ29uZmlnOiBhbnlcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB1dGlsaXR5U2VydmljZTogVXRpbGl0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2FkQ2hlY2tTZXJ2aWNlOiBMb2FkQ2hlY2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uU1ZDOiBBY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlld2VyRGF0YVN2YzogVmlld2VyRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW11aGlrQ2hhcmNoYVN2YzogU2FtdWhpa0NoYXJjaGFTZXJ2aWNlLFxuICAgIHB1YmxpYyBkb21haW5Db25mU2VydmljZTogRG9tYWluQ29uZlNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwcml2YXRlIGVudmlyb25tZW50OiBhbnlcblxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3IgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uYWxsKSB7XG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gdGhpcy5vbmx5c2Nvcm1Bc3Nlc3NtZW50RXhpc3RzKHRoaXMucm91dGUuc25hcHNob3Q/LmRhdGE/LmNvbnRlbnQ/LmRhdGE/LmNoaWxkcmVuLCAnbWltZVR5cGUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JywgJ2FwcGxpY2F0aW9uL2pzb24nLCAndGV4dC94LXVybCddKVxuICAgICAgLy8gdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWcgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvciAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy5haVR1dG9yPy5mb3JPcmcgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZy5haVR1dG9yPy5mb3JPcmc/Lmxlbmd0aCAmJlxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uZm9yT3JnLmluY2x1ZGVzKHRoaXMuY29uZmlnU2VydmljZS51c2VyUHJvZmlsZT8ucm9vdE9yZ0lkKVxuICAgICkge1xuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IHRoaXMub25seXNjb3JtQXNzZXNzbWVudEV4aXN0cyh0aGlzLnJvdXRlLnNuYXBzaG90Py5kYXRhPy5jb250ZW50Py5kYXRhPy5jaGlsZHJlbiwgJ21pbWVUeXBlJywgWydhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmh0bWwtYXJjaGl2ZScsICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcsICdhcHBsaWNhdGlvbi9qc29uJywgJ3RleHQveC11cmwnXSlcbiAgICAgIC8vIHRoaXMuZW5hYmxlQUlUdXRvckZsYWcgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5hYmxlQUlUdXRvckZsYWcgPSBmYWxzZVxuICAgIH1cbiAgICAgaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5MRUFSTklOR19QQVRIV0FZKSB7XG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWcgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8udHJhbnNjcmlwdGlvbj8uYWxsKSB7XG4gICAgICAvLyB0aGlzLnJlc291cmNlSWRlbnRpZmllciQgPSB0aGlzLnRvY1N2Yy50cmFuc3JpcHRpb25JZGVudGlmaWVyLnN1YnNjcmliZSgodmFsdWU6YW55KT0+e1xuICAgICAgLy8gICBpZih2YWx1ZSAmJiAgdmFsdWU/LmlkZW50aWZpZXIpIHtcbiAgICAgIC8vICAgICB0aGlzLnJlc291cmNlSWRlbnRpZmllciA9IHZhbHVlPy5pZGVudGlmaWVyIC8vdmFsdWU/LmlkZW50aWZpZXIgLy8gZG9fMTEzODg5MTE5ODQ4OTA2NzUyMTE0N1xuICAgICAgLy8gICAgIHRoaXMucGFyc2VWVFQoKVxuICAgICAgLy8gICB9XG5cbiAgICAgIC8vIH0pXG5cbiAgICAgIHRoaXMuc3ViVGl0bGVzJCA9IHRoaXMudG9jU3ZjLnRyYW5zY3JpcHRpb25EYXRhJC5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5rZXl3b3JkVG9IaWdobGlnaHQgPSB2YWx1ZVxuICAgICAgfSlcblxuICAgICAgdGhpcy50cmFuc3JpcHRpb25MYW5ndWFnZVN1YiA9IHRoaXMudG9jU3ZjLnRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChsYW5ndmFsdWU6IGFueSkgPT4gY29uc29sZS5sb2coJ3RhcCBsYW5ndmFsdWU6JywgbGFuZ3ZhbHVlKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChsYW5ndmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChsYW5ndmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHRoaXMucmVuZGVyU2VsZWN0ZWRMYW5ndWFnZVRyYW5zY3JpcHRpb24oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSlcbiAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LnRyYW5zY3JpcHRpb24gJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8udHJhbnNjcmlwdGlvbj8uZm9yT3JnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LnRyYW5zY3JpcHRpb24/LmZvck9yZz8ubGVuZ3RoICYmXG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5mb3JPcmc/LmluY2x1ZGVzKHRoaXMuY29uZmlnU2VydmljZS51c2VyUHJvZmlsZT8ucm9vdE9yZ0lkKVxuICAgICkge1xuICAgICAgLy8gdGhpcy5yZXNvdXJjZUlkZW50aWZpZXIkID0gdGhpcy50b2NTdmMudHJhbnNyaXB0aW9uSWRlbnRpZmllci5zdWJzY3JpYmUoKHZhbHVlOmFueSk9PntcbiAgICAgIC8vICAgaWYodmFsdWUgJiYgIHZhbHVlPy5pZGVudGlmaWVyKSB7XG4gICAgICAvLyAgICAgdGhpcy5yZXNvdXJjZUlkZW50aWZpZXIgPSB2YWx1ZT8uaWRlbnRpZmllciAvL3ZhbHVlPy5pZGVudGlmaWVyIC8vIGRvXzExMzg4OTExOTg0ODkwNjc1MjExNDdcbiAgICAgIC8vICAgICB0aGlzLnBhcnNlVlRUKClcbiAgICAgIC8vICAgfVxuXG4gICAgICAvLyB9KVxuXG4gICAgICB0aGlzLnN1YlRpdGxlcyQgPSB0aGlzLnRvY1N2Yy50cmFuc2NyaXB0aW9uRGF0YSQuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMua2V5d29yZFRvSGlnaGxpZ2h0ID0gdmFsdWVcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMudHJhbnNyaXB0aW9uTGFuZ3VhZ2VTdWIgPSB0aGlzLnRvY1N2Yy50cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgobGFuZ3ZhbHVlOiBhbnkpID0+IGNvbnNvbGUubG9nKCd0YXAgbGFuZ3ZhbHVlOicsIGxhbmd2YWx1ZSkpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgobGFuZ3ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAobGFuZ3ZhbHVlKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnJlbmRlclNlbGVjdGVkTGFuZ3VhZ2VUcmFuc2NyaXB0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pXG4gICAgICB0aGlzLmVuYWJsZVRyYW5zY3JpcHRpb25GbGFnID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZVRyYW5zY3JpcHRpb25GbGFnID0gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBiYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gICAgaWYgKGJhdGNoSWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDFcbiAgICB9XG4gICAgdGhpcy5jb21tZW50SWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmNvbW1lbnRJZCA/IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuY29tbWVudElkIDogJydcbiAgICBpZiAodGhpcy5jb21tZW50SWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDJcbiAgICB9XG5cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmlzTW9iaWxlID0gdGhpcy51dGlsaXR5U2VydmljZS5pc01vYmlsZVxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0ODApIHtcbiAgICAgIHRoaXMuaXNNb2JpbGVGb3JBSSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc01vYmlsZUZvckFJID0gZmFsc2VcbiAgICB9XG4gICAgdGhpcy5tZW51UG9zaXRpb24gPSB0aGlzLnRhYkVsZW1lbnQuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3BcblxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbU1hcC5zdWJzY3JpYmUoYXN5bmMgKHBhcmFtczogYW55KSA9PiB7XG5cbiAgICAgIGxldCBmcm9tQUlUdXRvciA9IHBhcmFtcy5nZXQoJ2Zyb21BSVR1dG9yJylcblxuICAgICAgaWYgKChmcm9tQUlUdXRvciA9PT0gJ3RydWUnIHx8IGZyb21BSVR1dG9yID09PSB0cnVlKSAmJiB0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhYnNBcnJheSA9IHRoaXMudGFicz8udG9BcnJheSgpXG4gICAgICAgICAgbGV0IGluZGV4ID0gdGFic0FycmF5Py5maW5kSW5kZXgodGFiID0+IHRhYi50ZXh0TGFiZWwudHJpbSgpID09PSBcIkFJIFR1dG9yXCIudHJpbSgpKVxuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpbmRleFxuICAgICAgICAgICAgdGhpcy5mcm9tQUlTZWxlY3RlZFRhYkluZGV4ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMzAwMClcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXQgZ2V0Q3VycmVudFRpbWVJblVUQygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IGlzb1N0cmluZyA9IGN1cnJlbnREYXRlLnRvSVNPU3RyaW5nKClcbiAgICByZXR1cm4gaXNvU3RyaW5nLnJlcGxhY2UoJ1onLCAnKzAwMDAnKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRTYW11aGlrQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNhbXVoaWtDb25maWcgPSBhd2FpdCB0aGlzLnNhbXVoaWtDaGFyY2hhU3ZjLmZldGNoQ29uZmlnRmlsZSgpLnRvUHJvbWlzZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cbiAgICB0aGlzLnJlc291cmNlSWRlbnRpZmllciA9IHRoaXMudmlld2VyRGF0YVN2Yy5yZXNvdXJjZUlkXG5cbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5hbGwpIHtcbiAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LnRyYW5zY3JpcHRpb24gJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8udHJhbnNjcmlwdGlvbj8uZm9yT3JnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LnRyYW5zY3JpcHRpb24/LmZvck9yZz8ubGVuZ3RoICYmXG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnPy50cmFuc2NyaXB0aW9uPy5mb3JPcmc/LmluY2x1ZGVzKHRoaXMuY29uZmlnU2VydmljZT8udXNlclByb2ZpbGU/LnJvb3RPcmdJZClcbiAgICApIHtcbiAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3IgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZy5haVR1dG9yPy5hbGwpIHtcbiAgICAgIHRoaXMuZW5hYmxlQUlUdXRvckZsYWcgPSB0aGlzLm9ubHlzY29ybUFzc2Vzc21lbnRFeGlzdHModGhpcy5jb250ZW50Py5jaGlsZHJlbiwgJ21pbWVUeXBlJywgWydhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmh0bWwtYXJjaGl2ZScsICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcsICdhcHBsaWNhdGlvbi9qc29uJywgJ3RleHQveC11cmwnXSlcbiAgICAgIC8vIHRoaXMuZW5hYmxlQUlUdXRvckZsYWcgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3IgJiYgdGhpcy5jb25maWdTZXJ2aWNlLmlHT1RBSUNvbmZpZz8uYWlUdXRvcj8uZm9yT3JnICYmIHRoaXMuY29uZmlnU2VydmljZS5pR09UQUlDb25maWc/LmFpVHV0b3I/LmZvck9yZz8ubGVuZ3RoXG4gICAgICAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuaUdPVEFJQ29uZmlnLmFpVHV0b3I/LmZvck9yZz8uaW5jbHVkZXModGhpcy5jb25maWdTZXJ2aWNlPy51c2VyUHJvZmlsZT8ucm9vdE9yZ0lkKVxuICAgICkge1xuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IHRoaXMub25seXNjb3JtQXNzZXNzbWVudEV4aXN0cyh0aGlzLmNvbnRlbnQ/LmNoaWxkcmVuLCAnbWltZVR5cGUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JywgJ2FwcGxpY2F0aW9uL2pzb24nLCAndGV4dC94LXVybCddKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZih0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkxFQVJOSU5HX1BBVEhXQVkpIHtcbiAgICAgIHRoaXMuZW5hYmxlQUlUdXRvckZsYWcgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXNbJ3BsYXlSZXNvdXJjZUlkJ10pIHtcbiAgICAgIGlmIChjaGFuZ2VzPy5wbGF5UmVzb3VyY2VJZD8ucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlcz8ucGxheVJlc291cmNlSWQ/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICBpZiAodGhpcy52aWV3ZXJQYWdlICYmIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcpIHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlSWRlbnRpZmllciA9IHRoaXMucGxheVJlc291cmNlSWQgfHwgdGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkXG4gICAgICAgICAgdGhpcy5zdWJUaXRsZXMgPSBbXVxuICAgICAgICAgIHRoaXMudnR0TGFuZ0FyciA9IFtdXG4gICAgICAgICAgdGhpcy5wYXJzZVZUVCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuY2hhbmdlVGFiICYmIGNoYW5nZXMuY2hhbmdlVGFiLmN1cnJlbnRWYWx1ZSAmJiAhdGhpcy5mcm9tQUlTZWxlY3RlZFRhYkluZGV4KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAxXG4gICAgfVxuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGFcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmRpc2N1c3NXaWRnZXREYXRhKSB7XG4gICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhID0gdGhpcy5jb25maWcuZGlzY3Vzc1dpZGdldERhdGFcbiAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2N1c3NXaWRnZXREYXRhLm5ld0NvbW1lbnRTZWN0aW9uLmNvbW1lbnRUcmVlRGF0YS5lbnRpdHlJZCkge1xuICAgICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudFRyZWVEYXRhLmVudGl0eUlkID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5jb21tZW50c0xpc3QucmVwbGllc1NlY3Rpb24gJiYgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5jb21tZW50c0xpc3QucmVwbGllc1NlY3Rpb24ubmV3Q29tbWVudFJlcGx5KSB7XG4gICAgICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5jb21tZW50c0xpc3QucmVwbGllc1NlY3Rpb24ubmV3Q29tbWVudFJlcGx5LmNvbW1lbnRUcmVlRGF0YS5lbnRpdHlJZCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNFbnJvbGxlZCkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgdGhpcy5zaG93QXNzaWdubWVudHNUYWIgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5lbnJvbGxlZENvbnRlbnQgPSB0cnVlXG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudEJveC5wbGFjZWhvbGRlciA9ICdTdGFydCBhIGRpc2N1c3Npb24nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLmVucm9sbGVkQ29udGVudCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudEJveC5wbGFjZWhvbGRlciA9ICdFbnJvbCB0byBhZGQgeW91ciBjb21tZW50cydcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbW1lbnRJZCkge1xuICAgICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLm5ld0NvbW1lbnRTZWN0aW9uLnNob3cgPSBmYWxzZVxuICAgICAgfVxuICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YSA9IHsgLi4udGhpcy5kaXNjdXNzV2lkZ2V0RGF0YSB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhPy5ldmVudExpbmtlZD8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvcmdJZCA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ3VzZXJQcm9maWxlLnVzZXJSb290T3JnLmlkJywgJycpXG4gICAgICBhd2FpdCB0aGlzLmdldFNhbXVoaWtDb25maWcoKVxuICAgICAgY29uc3QgZXZlbnRzTGlua2VkID0gdGhpcy5jb250ZW50UmVhZERhdGEuZXZlbnRMaW5rZWQgfHwgW11cbiAgICAgIGxldCBldmVudHNEYXRhOiBhbnkgPSBbXVxuICAgICAgdGhpcy5zYW11aGlrQ29uZmlnPy5zdHJpcHNbMF0udGFicy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICBlbGUucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMuaWRlbnRpZmllciA9IGV2ZW50c0xpbmtlZFxuICAgICAgICBlbGUucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMuY3JlYXRlZEZvciA9IFtvcmdJZF1cbiAgICAgICAgaWYgKGVsZS5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycy5lbmREYXRlVGltZS5oYXNPd25Qcm9wZXJ0eSgnPj0nKSkge1xuICAgICAgICAgIGVsZS5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycy5lbmREYXRlVGltZVsnPj0nXSA9IHRoaXMuZ2V0Q3VycmVudFRpbWVJblVUQ1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGUucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMuZW5kRGF0ZVRpbWUuaGFzT3duUHJvcGVydHkoJzwnKSkge1xuICAgICAgICAgIGVsZS5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycy5lbmREYXRlVGltZVsnPCddID0gdGhpcy5nZXRDdXJyZW50VGltZUluVVRDXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zYW11aGlrQ2hhcmNoYVN2Yy5nZXRTZWFyY2hWNlJlc3VsdHMoZWxlLnJlcXVlc3Quc2VhcmNoVjYpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5jb3VudCAmJiByZXMucmVzdWx0Py5FdmVudCAmJiByZXMucmVzdWx0LkV2ZW50Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGV2ZSA9IDA7IGV2ZSA8IHJlcy5yZXN1bHQuRXZlbnQ/Lmxlbmd0aDsgZXZlKyspIHtcbiAgICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHQuRXZlbnRbZXZlXVsnY3JlYXRlZEZvciddICYmIHJlcy5yZXN1bHQuRXZlbnRbZXZlXVsnY3JlYXRlZEZvciddLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIHJlcy5yZXN1bHQuRXZlbnRbZXZlXVsncmVzb3VyY2VUeXBlJ10gPT09ICdTYW11aGlrIENoYXJjaGEnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBldmVudHNEYXRhLnB1c2gocmVzLnJlc3VsdC5FdmVudFtldmVdWydjcmVhdGVkRm9yJ11bMF0pXG4gICAgICAgICAgICAgIGlmIChldmVudHNEYXRhLmluY2x1ZGVzKHRoaXMuY29uZmlnU2VydmljZS51c2VyUHJvZmlsZT8ucm9vdE9yZ0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlU2FtdWhpa0NoYXJjaGFUYWIgPSB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLnJlZmVyZW5jZU5vZGVzKSB7XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YS5yZWZlcmVuY2VOb2Rlcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHVzZXJSb2xlczogU2V0PHN0cmluZz4gPSB0aGlzLmNvbmZpZ1NlcnZpY2U/LnVzZXJSb2xlcyB8fCBuZXcgU2V0KClcbiAgICAgICAgbGV0IGhhc0VkdWNhdG9yUm9sZSA9IGZhbHNlXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgTUVOVE9SIHJvbGVcbiAgICAgICAgaWYgKHVzZXJSb2xlcy5oYXMoJ01FTlRPUicpIHx8XG4gICAgICAgICAgdXNlclJvbGVzLmhhcygnbWVudG9yJykgfHxcbiAgICAgICAgICB1c2VyUm9sZXMuaGFzKCdNZW50b3InKSkge1xuICAgICAgICAgIGhhc0VkdWNhdG9yUm9sZSA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGxvY2FsIHN0b3JhZ2UgZm9yIHN1cnZleSByZXNwb25zZSBvbmx5IGlmIFVSTCBjb250YWlucyAncHVibGljJyBvciAncHJldmlldz10cnVlJ1xuICAgICAgICBpZiAoIWhhc0VkdWNhdG9yUm9sZSAmJiB0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgICBjb25zdCBzdXJ2ZXlJZCA9IHRoaXMuZW52aXJvbm1lbnQucHVibGljQ29udGVudFN1cnZleUlkIHx8ICcnXG4gICAgICAgICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgc3VydmV5XyR7c3VydmV5SWR9XyR7Y291cnNlSWR9YFxuICAgICAgICAgIGNvbnN0IHN0b3JlZERhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KVxuXG4gICAgICAgICAgaWYgKHN0b3JlZERhdGEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1cnZleVJlc3BvbnNlcyA9IEpTT04ucGFyc2Uoc3RvcmVkRGF0YSlcbiAgICAgICAgICAgICAgY29uc3QgZWR1Y2F0b3JRdWVzdGlvbiA9IHN1cnZleVJlc3BvbnNlcy5maW5kKChyZXNwb25zZTogYW55KSA9PlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnF1ZXN0aW9uID09PSAnQXJlIHlvdSBhbiBFZHVjYXRvci9GYWN1bHR5IG1lbWJlcj8nXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKGVkdWNhdG9yUXVlc3Rpb24gJiYgZWR1Y2F0b3JRdWVzdGlvbi5hbnN3ZXIgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICAgICAgaGFzRWR1Y2F0b3JSb2xlID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHN1cnZleSBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZTonLCBlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGVhY2hlck5vdGVzRmxhZyBpZiB1c2VyIGhhcyBlZHVjYXRvciByb2xlXG4gICAgICAgIGlmIChoYXNFZHVjYXRvclJvbGUpIHtcbiAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnJlc291cmNlQ2F0ZWdvcnkgJiYgaXRlbS5yZXNvdXJjZUNhdGVnb3J5ID09PSAnVGVhY2hlcnMgUmVzb3VyY2UnKSB7XG4gICAgICAgICAgICB0aGlzLnRlYWNoZXJOb3Rlc0ZsYWcgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5yZXNvdXJjZUNhdGVnb3J5ICYmIGl0ZW0ucmVzb3VyY2VDYXRlZ29yeSA9PT0gJ1JlZmVyZW5jZSBSZXNvdXJjZScpIHtcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZU5vdGVzRmxhZyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc2lkZU5hdkJhck9wZW5lZCkge1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQ4MCkge1xuICAgICAgICBpZiAodGhpcy5pc01vYmlsZUZvckFJKSB7XG4gICAgICAgICAgdGhpcy5pc01vYmlsZUZvckFJID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc01vYmlsZUZvckFJID0gZmFsc2VcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDgwKSB7XG4gICAgICAgIHRoaXMuaXNNb2JpbGVGb3JBSSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNNb2JpbGVGb3JBSSA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlU2Nyb2xsKCkge1xuICAgIGNvbnN0IHdpbmRvd1Njcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG4gICAgaWYgKHdpbmRvd1Njcm9sbCA+PSAodGhpcy5tZW51UG9zaXRpb24gLSAoKHRoaXMuaXNNb2JpbGUpID8gOTYgOiAxMDQpKSkge1xuICAgICAgdGhpcy5zdGlja3kgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBoYW5kbGVUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy50YWJDaGFuZ2VWYWx1ZSA9IGV2ZW50LnRhYlxuICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IGV2ZW50LmluZGV4XG4gICAgdGhpcy5sb2FkQ2hlY2tTZXJ2aWNlLmNvbXBvbmVudExvYWRlZCh0cnVlKVxuICAgIGlmIChldmVudCAmJiBldmVudC50YWIudGV4dExhYmVsID09PSAnQUkgVHV0b3InKSB7XG4gICAgICB0aGlzLnNob3dBSVR1dG9yUG9wdXAgPSB0cnVlXG4gICAgfVxuICAgIGlmIChldmVudCAmJiBldmVudC5pbmRleCA9PT0gMCAmJiBldmVudC50YWIudGV4dExhYmVsID09PSAnVHJhbnNjcmlwdGlvbicpIHtcbiAgICAgIHRoaXMucmFpc2VUcmFuc2NyaXB0aW9uVGFiU3RhcnRUZWxlbWV0cnkoKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmFpc2VUcmFuc2NyaXB0aW9uVGFiSW50ZXJhY3RUZWxlbWV0cnkoKVxuICAgICAgfSwgMTAwMClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yYWlzZVRyYW5zY3JpcHRpb25UYWJTdG9wVGVsZW1ldHJ5KClcbiAgICB9XG5cbiAgfVxuXG4gIHNob3dBaVR1dG9yQ29uZmlybVBvcHVwKCkge1xuICAgIHRoaXMucmFpc2VBSVBvcHVwU3RhcnRUZWxlbWV0cnkoKVxuICAgIGlmICh0aGlzLmlzRW5yb2xsZWQpIHtcbiAgICAgIHRoaXMuZnJvbUFJVHV0b3IgPSB0cnVlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yYWlzZUFJUG9wdXBJbnRlcmFjdFRlbGVtZXRyeSgpXG4gICAgICB9LCAxMDAwKVxuXG5cbiAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yYWlzZUFJUG9wdXBFbmRUZWxlbWV0cnkoKVxuICAgICAgfSwgMTAwMClcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmFpc2VBSVBvcHVwSW50ZXJhY3RUZWxlbWV0cnkoKVxuICAgICAgfSwgMTAwMClcbiAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKVxuXG4gICAgICBkaWFsb2dDb25maWcud2lkdGggPSAnNDIxcHgnXG4gICAgICBkaWFsb2dDb25maWcuZGF0YSA9IHtcbiAgICAgICAgZW5yb2xsOiB0aGlzLmlzRW5yb2xsZWRcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWlUdXRvckNvbmZpcm1Qb3B1cENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKVxuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlID09PSAnZW5yb2xsJykge1xuICAgICAgICAgIHRoaXMuZnJvbUFJVHV0b3IgPSB0cnVlXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSA9PT0gJ25lZWRUb0Vucm9sbCcpIHtcbiAgICAgICAgICB0aGlzLmVucm9sbFVzZXJGb3JBSVR1dG9yKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJhaXNlQUlQb3B1cEVuZFRlbGVtZXRyeSgpXG4gICAgICB9KVxuICAgIH1cblxuICB9XG5cbiAgZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpIHtcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMuY29udGVudCkge1xuICAgICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgICBpZiAodGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoJ3N0YXJ0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KClcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMi5taW1lVHlwZSA9IHRoaXMudG9jU3ZjLmdldE1pbWVUeXBlKHRoaXMuY29udGVudCwgcmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VtZURhdGFMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIHJlc3VtZURhdGFWMi5pZGVudGlmaWVyLFxuICAgICAgICByZXN1bWVEYXRhVjIubWltZVR5cGUsXG4gICAgICAgIHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgJ0xlYXJuaW5nIFJlc291cmNlJyxcbiAgICAgICAgdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHRoaXMuY29udGVudC5uYW1lLFxuICAgICAgKVxuICAgICAgdGhpcy5hY3Rpb25TVkMuc2V0VXBkYXRlQ29tcEdyb3VwTyA9IHRoaXMucmVzdW1lRGF0YUxpbmtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnJlc3VtZURhdGFMaW5rLnVybF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIGZyb21BSVR1dG9yOiB0aGlzLmZyb21BSVR1dG9yXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFxuICAgICAgLy8gICBbdGhpcy5yZXN1bWVEYXRhTGluay51cmxdLFxuICAgICAgLy8gICB7XG4gICAgICAvLyAgICAgcmVsYXRpdmVUbzogdGhpcy5yZXN1bWVEYXRhTGluay51cmwsXG4gICAgICAvLyAgICAgcXVlcnlQYXJhbXM6IHRoaXMucmVzdW1lRGF0YUxpbmsucXVlcnlQYXJhbXMsXG4gICAgICAvLyAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIC8vICAgfSlcbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlSZXN1bWVGb3JBSS5lbWl0KClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKTogYW55IHwgdm9pZCB7XG4gICAgY29uc3QgcmVzdW1lQ29weSA9IFsuLi50aGlzLnJlc3VtZURhdGFdXG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICBuZXcgRGF0ZShiLmxhc3RBY2Nlc3NUaW1lKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RBY2Nlc3NUaW1lKS5nZXRUaW1lKCkpLnNoaWZ0KClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcbiAgICAgICAgbWltZVR5cGU6IGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0SXRlbSA9IHJlc3VtZUNvcHkgJiYgcmVzdW1lQ29weS5sZW5ndGggJiYgcmVzdW1lQ29weVswXVxuICAgIHJldHVybiB7XG4gICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxuICAgICAgbWltZVR5cGU6IGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0QmF0Y2hJZCgpOiBzdHJpbmcge1xuICAgIGxldCBiYXRjaElkID0gJydcbiAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXRjaElkXG4gIH1cblxuICByYWlzZUFJUG9wdXBTdGFydFRlbGVtZXRyeSgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogXCJhaS10dXRvci10b2MtcGFnZVwiLCBcInBhZ2VpZFwiOiBgL2FwcC90b2MvJHt0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXJ9YCB9LFxuICAgICAgICBvYmplY3Q6IHsgXCJpZFwiOiB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIsIFwidHlwZVwiOiB0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5IH0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogJy9hcHAvdG9jJywgbW9kdWxlOiAnTGVhcm4nIH0sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIHJhaXNlQUlQb3B1cEVuZFRlbGVtZXRyeSgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogXCJhaS10dXRvci10b2MtcGFnZVwiLCBcInBhZ2VpZFwiOiBgL2FwcC90b2MvJHt0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXJ9YCB9LFxuICAgICAgICBvYmplY3Q6IHsgXCJpZFwiOiB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIsIFwidHlwZVwiOiB0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5IH0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5VbmxvYWRlZCxcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgICAgcGFnZUNvbnRleHQ6IHsgcGFnZUlkOiAnL2FwcC90b2MnLCBtb2R1bGU6ICdMZWFybicgfSxcbiAgICAgIGZyb206ICcnLFxuICAgICAgdG86ICdUZWxlbWV0cnknLFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxuICB9XG5cbiAgcmFpc2VBSVBvcHVwSW50ZXJhY3RUZWxlbWV0cnkoKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IFwiYWktdHV0b3ItdG9jLXBhZ2VcIiwgXCJwYWdlaWRcIjogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfWAgfSxcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuSW50ZXJhY3QsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogJy9hcHAvdG9jJywgbW9kdWxlOiAnTGVhcm4nIH0sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIGVucm9sbFVzZXJGb3JBSVR1dG9yKCkge1xuICAgIHRoaXMuZW5yb2xsVXNlclRvQUkuZW1pdCgpXG4gIH1cblxuICBhc3luYyBwYXJzZVZUVCgpIHtcbiAgICBsZXQgaWRlbnRpZmllciA9IHRoaXMucmVzb3VyY2VJZGVudGlmaWVyXG4gICAgLy8gY29uc29sZS5sb2coJ2lkZW50aWZpZXItLScsIGlkZW50aWZpZXIpXG4gICAgYXdhaXQgdGhpcy50b2NTdmMuYWlHZXRSZXNvdXJjZVZ0dEZpbGUoaWRlbnRpZmllcikuc3Vic2NyaWJlKGFzeW5jIChkYXRhczogYW55KSA9PiB7XG4gICAgICBsZXQgZGF0YTogYW55ID0gZGF0YXM/LmRhdGFcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoICYmIGRhdGFbMF1bJ3RyYW5zY3JpcHRpb25fdXJscyddICYmIGRhdGFbMF1bJ3RyYW5zY3JpcHRpb25fdXJscyddLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnZ0dExhbmdBcnIgPSBkYXRhWzBdWyd0cmFuc2NyaXB0aW9uX3VybHMnXVxuXG4gICAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSB0cnVlXG4gICAgICAgIC8vIGxldCB1cmwgPSAgZGF0YVswXVsndHJhbnNjcmlwdGlvbl91cmxzJ11bMF1bJ3VyaSddXG4gICAgICAgIHRoaXMudHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlID0gdGhpcy52dHRMYW5nQXJyICYmIHRoaXMudnR0TGFuZ0Fyci5sZW5ndGggJiYgdGhpcy52dHRMYW5nQXJyWzBdICYmIHRoaXMudnR0TGFuZ0FyclswXVsnZGVmYXVsdF9sYW5nJ10gPyAnZW4nIDogJ2VuJ1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2NyaXB0TGFuZ3VhZ2UgPSB0aGlzLnZ0dExhbmdBcnIgJiYgdGhpcy52dHRMYW5nQXJyLmxlbmd0aCAmJiB0aGlzLnZ0dExhbmdBcnJbMF0gJiYgdGhpcy52dHRMYW5nQXJyWzBdWydkZWZhdWx0X2xhbmcnXSA/ICdlbicgOiAnZW4nXG4gICAgICAgIGxldCBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZSA9IHRoaXMudnR0TGFuZ0Fyci5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtPy5sYWJlbCA9PT0gdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlICYmIHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGUgPSBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGUgPSB0aGlzLnZ0dExhbmdBcnJbMF1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXJlZEFyciA9IHRoaXMudnR0TGFuZ0Fyci5maWx0ZXIoXG4gICAgICAgICAgKGl0ZW06IGFueSkgPT4gaXRlbS5sYWJlbCA9PT0gdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VcbiAgICAgICAgKVxuICAgICAgICBsZXQgdXJsID0gZmlsdGVyZWRBcnIubGVuZ3RoID4gMCA/IGZpbHRlcmVkQXJyWzBdLnVyaSA6IG51bGxcbiAgICAgICAgLy9sZXQgdXJsID0gdGhpcy52dHRMYW5nQXJyLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLmxhYmVsID09PSB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSlbMF1bJ3VyaSddXG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgVnR0RmlsZS5mcm9tVXJsKHVybClcbiAgICAgICAgICBsZXQgYmxvY2tzOiBhbnkgPSBmaWxlLmdldEJsb2NrcygpXG5cbiAgICAgICAgICB0aGlzLnN1YlRpdGxlcyA9IGJsb2Nrc1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVRyYW5zY3JpcHRpb25MYW5ndWFnZUV2ZW50Lm5leHQoeyBhY3RpdmVMYW5nOiB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSwgbGFuZ0RhdGE6IHRoaXMudnR0TGFuZ0FyciwgbG9hZFBsYXllcjogdHJ1ZSB9KVxuXG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudnR0TGFuZ0FyciA9IFtdXG4gICAgICAgIHRoaXMuZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgfSlcblxuICB9XG5cbiAgYXN5bmMgcmVuZGVyU2VsZWN0ZWRMYW5ndWFnZVRyYW5zY3JpcHRpb24oX2xhbmd2YWx1ZTogYW55KSB7XG4gICAgLy8gdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPSB0aGlzLnNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYWJlbFxuICAgIGlmICh0eXBlb2YgX2xhbmd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgX2xhbmd2YWx1ZSkge1xuICAgICAgdGhpcy50cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPSBfbGFuZ3ZhbHVlXG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZSA9IF9sYW5ndmFsdWU/LnZhbHVlXG4gICAgICB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSA9IHRoaXMuc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/LmxhYmVsXG4gICAgICB0aGlzLnRyYW5zY3JpcHRBY3RpdmVMYW5ndWFnZVRleHQgPSBfbGFuZ3ZhbHVlPy52YWx1ZT8ubGFuZ3VhZ2VcbiAgICB9XG4gICAgdGhpcy5yYWlzZVRyYW5zY3JpcHRpb25MYW5ndWFnZVN0YXJ0VGVsZW1ldHJ5KClcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmFpc2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VJbnRlcmFjdFRlbGVtZXRyeSgpXG4gICAgfSlcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLnZ0dExhbmdBcnIuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LmxhYmVsID09PSB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSlcbiAgICBpZiAoY3VycmVudFBhdGggJiYgY3VycmVudFBhdGgubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlID0gY3VycmVudFBhdGhbMF1cbiAgICB9XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IFZ0dEZpbGUuZnJvbVVybChjdXJyZW50UGF0aCAmJiBjdXJyZW50UGF0aFswXT8udXJpKVxuICAgIGxldCBibG9ja3M6IGFueSA9IGZpbGUuZ2V0QmxvY2tzKClcbiAgICB0aGlzLnN1YlRpdGxlcyA9IGJsb2Nrc1xuICAgIHRoaXMucmFpc2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VTdG9wVGVsZW1ldHJ5KClcbiAgICAvLyB0aGlzLnRvY1N2Yy5jaGFuZ2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VFdmVudC5uZXh0KHthY3RpdmVMYW5nOiB0aGlzLnRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSwgbGFuZ0RhdGE6IHRoaXMudnR0TGFuZ0FyciwgbG9hZFBsYXllcjpmYWxzZX0pXG5cbiAgfVxuXG4gIG9wZW5TdXJ2ZXlGb3JtUG9wdXAoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRyaWdlckNvbXBsZXRpb25TdXJ2ZXlGb3JtLmVtaXQoZXZlbnQpXG4gIH1cblxuICBwbGF5RnJvbVNsb3Qoc3VidGl0bGU6IGFueSkge1xuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgbGV0IHN0YXJ0VGltZSA9IHN1YnRpdGxlLnN0YXJ0VGltZSAvIDEwMDBcbiAgICAgIGxldCBlbmRUaW1lID0gc3VidGl0bGUuZW5kVGltZSAvIDEwMDBcbiAgICAgIHRoaXMudG9jU3ZjLnBsYXlUcmFuc2NyaXB0aW9uVmlkZW8ubmV4dCh7IHN0YXJ0VGltZSwgZW5kVGltZSB9KVxuICAgIH1cbiAgfVxuXG4gIGZvcm1hdE1zVG9WdHRUaW1lKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGguZmxvb3IobXMgLyAxMDAwKVxuICAgIC8vICBjb25zdCBtaWxsaXNlY29uZHMgPSBtcyAlIDEwMDA7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHRvdGFsU2Vjb25kcyAlIDM2MDApIC8gNjApXG4gICAgY29uc3Qgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwXG5cbiAgICBjb25zdCBwYWQgPSAobnVtOiBudW1iZXIsIHNpemU6IG51bWJlcikgPT4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgJzAnKVxuXG4gICAgLy8gcmV0dXJuIGAke3BhZChob3VycywgMil9OiR7cGFkKG1pbnV0ZXMsIDIpfToke3BhZChzZWNvbmRzLCAyKX0uJHtwYWQobWlsbGlzZWNvbmRzLCAzKX1gO1xuICAgIHJldHVybiBgJHtwYWQoaG91cnMsIDIpfToke3BhZChtaW51dGVzLCAyKX06JHtwYWQoc2Vjb25kcywgMil9YFxuICB9XG5cbiAgb25seXNjb3JtQXNzZXNzbWVudEV4aXN0cyhkYXRhOiBhbnksIGtleTogYW55LCB2YWx1ZTogYW55KSB7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGE/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZGF0YVtpXSAmJiBkYXRhW2ldWydjaGlsZHJlbiddICYmIGRhdGFbaV1bJ2NoaWxkcmVuJ10ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMub25seXNjb3JtQXNzZXNzbWVudEV4aXN0cyhkYXRhW2ldPy5jaGlsZHJlbiwga2V5LCB2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgdGhpcy50b3RhbFJlc291cmNlID0gdGhpcy50b3RhbFJlc291cmNlICsgMVxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoZGF0YVtpXVtrZXldKSkge1xuICAgICAgICAgIC8vIHRoaXMuc2hvd0FJVHV0b3JGbGFnID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zY29ybUFzc2Vzc21lbnRDb3VudCA9IHRoaXMuc2Nvcm1Bc3Nlc3NtZW50Q291bnQgKyAxXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50b3RhbFJlc291cmNlID09PSB0aGlzLnNjb3JtQXNzZXNzbWVudENvdW50KSB7XG4gICAgICB0aGlzLmVuYWJsZUFJVHV0b3JGbGFnID0gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbmFibGVBSVR1dG9yRmxhZyA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlQUlUdXRvckZsYWdcbiAgfVxuXG4gIHJhaXNlVHJhbnNjcmlwdGlvblRhYlN0YXJ0VGVsZW1ldHJ5KCkge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJ2NsaWNrJywgXCJpZFwiOiBcImFpLXR1dG9yLXZpZXdlci1wYWdlXCIsIFwicGFnZWlkXCI6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIHN1YlR5cGU6ICd0cmFuc2NyaXB0LXRhYicgfSxcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkLFxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgIH0sXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIG1vZHVsZTogJ0xlYXJuJyB9LFxuICAgICAgZnJvbTogJycsXG4gICAgICB0bzogJ1RlbGVtZXRyeScsXG4gICAgfVxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXG4gIH1cblxuICByYWlzZVRyYW5zY3JpcHRpb25UYWJJbnRlcmFjdFRlbGVtZXRyeSgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogXCJhaS10dXRvci12aWV3ZXItcGFnZVwiLCBcInBhZ2VpZFwiOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBzdWJUeXBlOiAndHJhbnNjcmlwdC10YWInIH0sXG4gICAgICAgIG9iamVjdDogeyBcImlkXCI6IHRoaXMuY29udGVudD8uaWRlbnRpZmllciwgXCJ0eXBlXCI6IHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnkgfSxcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0LFxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgIH0sXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIG1vZHVsZTogJ0xlYXJuJyB9LFxuICAgICAgZnJvbTogJycsXG4gICAgICB0bzogJ1RlbGVtZXRyeScsXG4gICAgfVxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXG4gIH1cblxuICByYWlzZVRyYW5zY3JpcHRpb25UYWJTdG9wVGVsZW1ldHJ5KCkge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJ2NsaWNrJywgXCJpZFwiOiBcImFpLXR1dG9yLXZpZXdlci1wYWdlXCIsIFwicGFnZWlkXCI6IGAvdmlld2VyL3ZpZGVvLyR7dGhpcy52aWV3ZXJEYXRhU3ZjPy5yZXNvdXJjZUlkfWAsIHN1YlR5cGU6ICd0cmFuc2NyaXB0LXRhYicgfSxcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgbW9kdWxlOiAnTGVhcm4nIH0sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIHJhaXNlVHJhbnNjcmlwdGlvbkxhbmd1YWdlU3RhcnRUZWxlbWV0cnkoKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBcImlkXCI6IHRoaXMudHJhbnNjcmlwdEFjdGl2ZUxhbmd1YWdlVGV4dCwgXCJwYWdlaWRcIjogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgc3ViVHlwZTogJ3RyYW5zY3JpcHQtbGFuZ3VhZ2UnIH0sXG4gICAgICAgIG9iamVjdDogeyBcImlkXCI6IHRoaXMuY29udGVudD8uaWRlbnRpZmllciwgXCJ0eXBlXCI6IHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnkgfSxcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCxcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgICAgcGFnZUNvbnRleHQ6IHsgcGFnZUlkOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBtb2R1bGU6ICdMZWFybicgfSxcbiAgICAgIGZyb206ICcnLFxuICAgICAgdG86ICdUZWxlbWV0cnknLFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxuICB9XG5cbiAgcmFpc2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VJbnRlcmFjdFRlbGVtZXRyeSgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogdGhpcy50cmFuc2NyaXB0QWN0aXZlTGFuZ3VhZ2VUZXh0LCBcInBhZ2VpZFwiOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBzdWJUeXBlOiAndHJhbnNjcmlwdC1sYW5ndWFnZScgfSxcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuSW50ZXJhY3QsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgbW9kdWxlOiAnTGVhcm4nIH0sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIHJhaXNlVHJhbnNjcmlwdGlvbkxhbmd1YWdlU3RvcFRlbGVtZXRyeSgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsIFwiaWRcIjogdGhpcy50cmFuc2NyaXB0QWN0aXZlTGFuZ3VhZ2VUZXh0LCBcInBhZ2VpZFwiOiBgL3ZpZXdlci92aWRlby8ke3RoaXMudmlld2VyRGF0YVN2Yz8ucmVzb3VyY2VJZH1gLCBzdWJUeXBlOiAndHJhbnNjcmlwdC1sYW5ndWFnZScgfSxcbiAgICAgICAgb2JqZWN0OiB7IFwiaWRcIjogdGhpcy5jb250ZW50Py5pZGVudGlmaWVyLCBcInR5cGVcIjogdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSB9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogYC92aWV3ZXIvdmlkZW8vJHt0aGlzLnZpZXdlckRhdGFTdmM/LnJlc291cmNlSWR9YCwgbW9kdWxlOiAnTGVhcm4nIH0sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIGNsb3NlQUlQb3B1cChldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLnNob3dBSVR1dG9yUG9wdXAgPSBmYWxzZVxuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMFxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJlc291cmNlSWRlbnRpZmllciQpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VJZGVudGlmaWVyJC51bnN1YnNjcmliZSgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3ViVGl0bGVzJCkge1xuICAgICAgdGhpcy5zdWJUaXRsZXMkLnVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc3JpcHRpb25MYW5ndWFnZVN1Yikge1xuICAgICAgdGhpcy50cmFuc3JpcHRpb25MYW5ndWFnZVN1Yi51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgY2xlYXJDb21tZW50SWRGcm9tVXJsKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRRdWVyeVBhcmFtcyA9IHsgLi4udGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyB9XG4gICAgZGVsZXRlIGN1cnJlbnRRdWVyeVBhcmFtcy5jb21tZW50SWRcbiAgICB0aGlzLmNvbW1lbnRJZCA9ICcnXG4gICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5uZXdDb21tZW50U2VjdGlvbi5zaG93ID0gdHJ1ZVxuICB9XG5cbiAgcmVzdW1lQ29udGVudENhbGwoKSB7XG4gICAgdGhpcy5yZXN1bWVDb250ZW50LmVtaXQoKVxuICB9XG59IiwiPCEtLSAmJiAoY29udGVudD8uY291cnNlQ2F0ZWdvcnkgIT09IGNvdXJzZUNhdGVnb3J5Py5CTEVOREVEX1BST0dSQU0pIC0tPlxuPGRpdiBjbGFzcz1cImFpLXR1dG9yLWdldC1zdGFydGVkXCIgKm5nSWY9XCIhdmlld2VyUGFnZSAmJiBlbmFibGVBSVR1dG9yRmxhZyAmJiAhaXNNb2JpbGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgcHktMlwiPlxuICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYm90LWNoYXQtc21hbGwuc3ZnXCIgaGVpZ2h0PVwiNjRweFwiIHdpZHRoPVwiNjRweFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yXCIgPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC13ZWlnaHQtNjAwXCI+R2V0IFN0YXJ0ZWQgd2l0aCBBSSBUdXRvcjwvcD5cbiAgICAgICAgICAgICAgICA8c3Bhbj5HZXQgaW5zdGFudCBleHBsYW5hdGlvbnMsIHN0ZXAtYnktc3RlcCBsZWFybmluZyBndWlkYW5jZSwgYW5kIGN1c3RvbWlzZWQgbGVhcm5pbmcgdGFpbG9yZWQganVzdFxuICAgICAgICAgICAgICAgICAgICBmb3IgeW91Ljwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXR1dG9yLWJ0biBweC0yIHB5LTFcIiBbbmdDbGFzc109XCJpc01vYmlsZSA/ICd3LTE2MCcgOiAnJ1wiPlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwic2hvd0FpVHV0b3JDb25maXJtUG9wdXAoKVwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9haS10dXRvci9haS1pY29uLnN2Z1wiPiZuYnNwOyAmbmJzcDsgPHNwYW4gY2xhc3M9XCJhaS10dXRvci1sYWJlbFwiPkFJIFR1dG9yPC9zcGFuPjwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInRhYi1ncm91cC1jb250YWluZXJcIj5cbiAgICA8bWF0LXRhYi1ncm91cCAoc2VsZWN0ZWRUYWJDaGFuZ2UpPVwiaGFuZGxlVGFiQ2hhbmdlKCRldmVudClcIiAjc3RpY2t5TWVudSBbY2xhc3Muc3RpY2t5LW1hdC10YWJzXT1cInN0aWNreVwiXG4gICAgICAgIFtzZWxlY3RlZEluZGV4XT1cInNlbGVjdGVkVGFiSW5kZXhcIiBbbmdDbGFzc109XCJ7J2NvbnRlbnQtdGFicyc6IWZyb21WaWV3ZXIsJ2NvbnRlbnRTdGlja3knOiBmb3JQcmV2aWV3fVwiPlxuXG4gICAgICAgIDwhLS0gVHJhbnNjcmlwdGlvbiBUYWIgLS0+XG4gICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiVHJhbnNjcmlwdGlvblwiXG4gICAgICAgICAgICAqbmdJZj1cInZpZXdlclBhZ2UgJiYgZW5hYmxlVHJhbnNjcmlwdGlvbkZsYWcgJiYgdnR0TGFuZ0Fycj8ubGVuZ3RoICYmIHN1YlRpdGxlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VHJhbnNjcmlwdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWQtY2lyY2xlIG1sLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIE5ld1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJweS0yIHB4LTJcIj5EaXNjbGFpbWVyIDogVGhlc2UgdHJhbnNjcmlwdHMgYW5kIHN1YnRpdGxlcyBhcmUgQUktZ2VuZXJhdGVkIGFuZCBtYXkgY29udGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1sLTUgbXItNVwiICpuZ0lmPVwiaXNNb2JpbGVGb3JBSVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJhbnNjcmlwdC1mbGV4LWNvbnRhaW5lciBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0XCIgYXBwZWFyYW5jZT1cImZpbGxcIiBzdHlsZT1cImhlaWdodDogYXV0bzsgd2lkdGg6IDEwMCU7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3QtYm94IHByLTVcIiBbKHZhbHVlKV09XCJzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwicmVuZGVyU2VsZWN0ZWRMYW5ndWFnZVRyYW5zY3JpcHRpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyIGNsYXNzPVwibXVsdGlsaW5lLXNlbGVjdC1ib3gtdHJpZ2dlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW9wdGlvbi1jb250ZW50IHB4LTUgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSA9PT0gc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/LmxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5UcmFuc2NyaXB0IExhbmd1YWdlOiA8L2I+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYW5ndWFnZSB8IHRpdGxlY2FzZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRlZmF1bHRUcmFuc2NyaXB0TGFuZ3VhZ2UgPT09IHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYWJlbFwiPihBdXRvKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LW9wdGlvblwiIHZhbHVlPVwiXCIgKm5nRm9yPVwibGV0IGxhbmcgb2YgdnR0TGFuZ0FyclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1vcHRpb24nOiBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZT8ubGFiZWwgPT09IGxhbmc/LmxhYmVsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tsYW5nPy5sYW5ndWFnZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC00IGZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgdHJhbnNjcmlwdC1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbWF0TmF0aXZlQ29udHJvbCByZXF1aXJlZCBjbGFzcz1cInNlY3Rpb24tZGRcIiAoY2hhbmdlKT1cInJlbmRlclNlbGVjdGVkTGFuZ3VhZ2VUcmFuc2NyaXB0aW9uKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImxhbmc/Lmxhbmd1YWdlXCIgKm5nRm9yPVwibGV0IGxhbmcgb2YgdnR0TGFuZ0FyclwiIFtzZWxlY3RlZF09XCJsYW5nPy5sYWJlbCA9PT0gdHJhbnNjcmlwdGlvbkFjdGl2ZUxhbmd1YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRyYW5zY3JpcHRpb25BY3RpdmVMYW5ndWFnZSA9PT0gbGFuZz8ubGFiZWxcIj4gVHJhbnNjcmlwdCBMYW5ndWFnZTogPC9zcGFuPiB7e2xhbmc/Lmxhbmd1YWdlIHwgdGl0bGVjYXNlfX0gPHNwYW4gKm5nSWY9XCJ0cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPT09IGxhbmc/Lmxhbmd1YWdlXCI+KEF1dG8pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiIWlzTW9iaWxlRm9yQUkgPyAndy1zdWJ0aXRsZS04MCc6J3ctZnVsbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIiFpc01vYmlsZUZvckFJID8gJ21sLTUtcGVyJyA6ICcnXCIgKm5nSWY9XCJzdWJUaXRsZXMgJiYgc3ViVGl0bGVzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUcmFuc2NyaXB0aW9uIGNvbnRlbnQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YnRpdGxlIG9mIHN1YlRpdGxlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGUtdGltZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJwbGF5RnJvbVNsb3Qoc3VidGl0bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0xIGJsdWUtdW5kZXJsaW5lXCI+IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE1zVG9WdHRUaW1lKHN1YnRpdGxlPy5zdGFydFRpbWUpIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJsYWNrLXRleHRcIj4tPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMSBibHVlLXVuZGVybGluZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE1zVG9WdHRUaW1lKHN1YnRpdGxlPy5lbmRUaW1lKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC00IHN1YnRpdGxlLXRleHQtc2xvdCBtci00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImJsYWNrLXRleHRcIiBbaW5uZXJIdG1sXT1cInN1YnRpdGxlPy50ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhpZ2hsaWdodCA6IGtleXdvcmRUb0hpZ2hsaWdodD8udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKHN1YnRpdGxlPy5zdGFydFRpbWUgLyAxMDAwKSA+PSBrZXl3b3JkVG9IaWdobGlnaHQ/LnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnRpdGxlPy5lbmRUaW1lIC8gMTAwMCkgPD0ga2V5d29yZFRvSGlnaGxpZ2h0Py5lbmQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1zdWJ0aXRsZS0yMFwiICpuZ0lmPVwiIWlzTW9iaWxlRm9yQUlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJhbnNjcmlwdC1mbGV4LWNvbnRhaW5lciBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3RcIiBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogYXV0bzsgd2lkdGg6IDEwMCU7XCIgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3QtYm94IHByLTVcIiBbKHZhbHVlKV09XCJzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJyZW5kZXJTZWxlY3RlZExhbmd1YWdlVHJhbnNjcmlwdGlvbigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlciBjbGFzcz1cIm11bHRpbGluZS1zZWxlY3QtYm94LXRyaWdnZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW9wdGlvbi1jb250ZW50IHB4LTUgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+PHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0cmFuc2NyaXB0aW9uQWN0aXZlTGFuZ3VhZ2UgPT09IHNlbGVjdGVkVHJhbnNjcmlwdGlvblN0eWxlPy5sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5UcmFuc2NyaXB0IExhbmd1YWdlOiA8L2I+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/Lmxhbmd1YWdlIHwgdGl0bGVjYXNlfX0gPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkZWZhdWx0VHJhbnNjcmlwdExhbmd1YWdlID09PSBzZWxlY3RlZFRyYW5zY3JpcHRpb25TdHlsZT8ubGFiZWxcIj4oQXV0byk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LW9wdGlvblwiIHZhbHVlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxhbmcgb2YgdnR0TGFuZ0FyclwiIFt2YWx1ZV09XCJsYW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtb3B0aW9uJzogc2VsZWN0ZWRUcmFuc2NyaXB0aW9uU3R5bGU/LmxhYmVsID09PSBsYW5nPy5sYWJlbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2xhbmc/Lmxhbmd1YWdlIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbXktMlwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwPjAuMDA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+QUkgZm9yIERpZ2l0YWwgVHJhbnNmb3JtYXRpb246IE1hY2hpbmUgTGVhcm5pbmcgYW5kIERlZXAgTGVhcm5pbmcgIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS48L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgcmVxdWlyZWQgY2xhc3M9XCJzZWN0aW9uLWRkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlRyYW5zY3JpcHRpb24gTGFuZ3VhZ2U6IEVuZ2xpc2ggKEF1dG8pPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtdGFiPlxuXG4gICAgICAgIDwhLS0gQWJvdXQgVGFiIC0tPlxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmFib3V0JyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXR1dG9yLWdldC1zdGFydGVkLW1vYmlsZSBteS0yIG1sLTJcIiAqbmdJZj1cIiF2aWV3ZXJQYWdlICYmIGVuYWJsZUFJVHV0b3JGbGFnICYmIGlzTW9iaWxlICYmICAgKGRvbWFpbkNvbmZTZXJ2aWNlPy5pc0ZlYXR1cmVCeVBhZ2VFbmFibGVkKCd0b2MnLCdhaVR1dG9yJykpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciB3LTk4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYm90LWNoYXQtc21hbGwuc3ZnXCIgaGVpZ2h0PVwiNDhweFwiIHdpZHRoPVwiNDhweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciB3LTYwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXdlaWdodC02MDBcIj5HZXQgU3RhcnRlZCB3aXRoIEFJIFR1dG9yPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5HZXQgaW5zdGFudCBleHBsYW5hdGlvbnMsIHN0ZXAtYnktc3RlcCBsZWFybmluZyBndWlkYW5jZSwgYW5kIGN1c3RvbWlzZWQgbGVhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxvcmVkIGp1c3QgZm9yIHlvdS48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXR1dG9yLWJ0biBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInNob3dBaVR1dG9yQ29uZmlybVBvcHVwKClcIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvYWktdHV0b3IvYWktaWNvbi5zdmdcIj4mbmJzcDsgJm5ic3A7IDxzcGFuIGNsYXNzPVwiYWktdHV0b3ItbGFiZWxcIj5BSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHV0b3I8L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXktMiBteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS10dXRvci1idG4gcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInNob3dBaVR1dG9yQ29uZmlybVBvcHVwKClcIj48aW1nIHNyYz1cImFzc2V0cy9haS10dXRvci9haS1pY29uLnN2Z1wiPiZuYnNwOyAmbmJzcDsgPHNwYW4gY2xhc3M9XCJhaS10dXRvci1sYWJlbFwiPkFJIFR1dG9yPC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy1hYm91dCBbZnJvbVZpZXdlcl09XCJmcm9tVmlld2VyXCIgW3BhdGhTZXRdPVwicGF0aFNldFwiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICBbdG9jU3RydWN0dXJlXT1cInRvY1N0cnVjdHVyZVwiIFtjb25maWddPVwiY29uZmlnXCIgW2ZvclByZXZpZXddPVwiZmFsc2VcIiBbc3RpY2t5XT1cInN0aWNreVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEJhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiIFtzZWxlY3RlZFRhYlZhbHVlXT1cInNlbGVjdGVkVGFiSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbc2tlbGV0b25Mb2FkZXJdPVwic2tlbGV0b25Mb2FkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cImNvbmRpdGlvblwiIFtrcGFycmF5XT1cImtwYXJyYXlcIiBbc2hvd1Jldmlld3NdPVwiJ3RydWUnXCIgW2xhbmd1YWdlTGlzdF09XCJsYW5ndWFnZUxpc3RcIlxuICAgICAgICAgICAgICAgICAgICBbbG9ja0NlcnRpZmljYXRlXT1cImxvY2tDZXJ0aWZpY2F0ZVwiICh0cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybSk9XCJvcGVuU3VydmV5Rm9ybVBvcHVwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZnJvbU1ET109XCJmcm9tTURPXCI+XG4gICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXBwLXRvYy1hYm91dD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbWF0LXRhYj5cblxuICAgICAgICA8IS0tIENvbnRlbnQgVGFiIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5jb250ZW50JyB8IHRyYW5zbGF0ZSB9fVwiICpuZ0lmPVwiY29udGVudFRhYkZsYWdcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLWNvbnRlbnQgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiIFtjb21wb25lbnROYW1lXT1cImNvbXBvbmVudE5hbWVcIiBbcGF0aFNldF09XCJwYXRoU2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50XT1cImNvbnRlbnRcIiBbdG9jU3RydWN0dXJlXT1cInRvY1N0cnVjdHVyZVwiIFtjb25maWddPVwiY29uZmlnXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbc2tlbGV0b25Mb2FkZXJdPVwic2tlbGV0b25Mb2FkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWc/LmNvbW1lbnRzVGFiICYmICFmb3JQcmV2aWV3ICYmICAgKGRvbWFpbkNvbmZTZXJ2aWNlPy5pc0ZlYXR1cmVCeVBhZ2VFbmFibGVkKCd0b2MnLCdzdGFydERpc2N1c3Npb24nKSlcIj5cbiAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc3RhcnREaXNjdXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCByYXRpbmdzLWRpdiBtdC01XCIgaWQ9XCJjb21tZW50c0RpdlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc2N1c3NXaWRnZXREYXRhICYmIGRpc2N1c3NXaWRnZXREYXRhPy5uZXdDb21tZW50U2VjdGlvbj8uY29tbWVudFRyZWVEYXRhPy5lbnRpdHlJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZC12Mi13aWRnZXQtY29tbWVudCBbd2lkZ2V0RGF0YV09XCJkaXNjdXNzV2lkZ2V0RGF0YVwiPjwvZC12Mi13aWRnZXQtY29tbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbW1lbnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGN1cnNvci1wb2ludGVyIG1iLTVcIiAoY2xpY2spPVwiY2xlYXJDb21tZW50SWRGcm9tVXJsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5hcnJvd19iYWNrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFjayB0byBhbGwgY29tbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZC12Mi13aWRnZXQtY29tbWVudCBbd2lkZ2V0RGF0YV09XCJkaXNjdXNzV2lkZ2V0RGF0YVwiIFtjb21tZW50SWRdPVwiY29tbWVudElkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NrZWxldG9uTG9hZGVyXT48L2QtdjItd2lkZ2V0LWNvbW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCJjb25maWc/LnNhbXVoaWtDaGFyY2hhVGFiICYmIGNvbmRpdGlvbiAmJiBjb250ZW50UmVhZERhdGE/LmV2ZW50TGlua2VkPy5sZW5ndGggPiAwICYmIGVuYWJsZVNhbXVoaWtDaGFyY2hhVGFiICYmIChkb21haW5Db25mU2VydmljZT8uaXNGZWF0dXJlQnlQYWdlRW5hYmxlZCgndG9jJywnc2FtdWhpa0NoYXJjaGEnKSlcIj5cbiAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc2FtdWhpa0NoYXJjaGEnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJhdGluZ3MtZGl2IG10LTVcIiBpZD1cInNhbXVoaWtDaGFyY2hhRGl2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNhbXVoaWstY2hhcmNoYS1jb250ZW50IFtjb250ZW50XT1cImNvbnRlbnRSZWFkRGF0YVwiIFtjb25kaXRpb25EYXRhXT1cImNvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VtZUNvbnRlbnQpPVwicmVzdW1lQ29udGVudENhbGwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtc2FtdWhpay1jaGFyY2hhLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gVGVhY2hlcnMgTm90ZSBUYWIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnJlZmVyZW5jZU5vZGVzICYmIHRlYWNoZXJOb3Rlc0ZsYWdcIj5cbiAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiVGVhY2hlcnMgTm90ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCByYXRpbmdzLWRpdiBtdC01XCIgaWQ9XCJ0ZWFjaGVyc05vdGVEaXZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy10ZWFjaGVycy1ub3RlcyBbY29udGVudF09XCJjb250ZW50UmVhZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub3Rlc0Rpc3BsYXlUeXBlXT1cIidUZWFjaGVycyBSZXNvdXJjZSdcIj48L3dzLXdpZGdldC1hcHAtdG9jLXRlYWNoZXJzLW5vdGVzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFJlZmVyZW5jZSBOb3RlIFRhYiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucmVmZXJlbmNlTm9kZXMgJiYgcmVmZXJlbmNlTm90ZXNGbGFnXCI+XG4gICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIlJlZmVyZW5jZSBOb3RlXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJhdGluZ3MtZGl2IG10LTVcIiBpZD1cInRlYWNoZXJzTm90ZURpdlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hcHAtdG9jLXRlYWNoZXJzLW5vdGVzIFtjb250ZW50XT1cImNvbnRlbnRSZWFkRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25vdGVzRGlzcGxheVR5cGVdPVwiJ1JlZmVyZW5jZSBSZXNvdXJjZSdcIj48L3dzLXdpZGdldC1hcHAtdG9jLXRlYWNoZXJzLW5vdGVzPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx3cy13aWRnZXQtYXBwLXRvYy1yZWZlcmVuY2Utbm90ZXMgW2NvbnRlbnRdPVwiY29udGVudFJlYWREYXRhXCI+PC93cy13aWRnZXQtYXBwLXRvYy1yZWZlcmVuY2Utbm90ZXM+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0Fzc2lnbm1lbnRzVGFiICYmICFmb3JQcmV2aWV3ICYmIChkb21haW5Db25mU2VydmljZT8uaXNGZWF0dXJlQnlQYWdlRW5hYmxlZCgndG9jJywnYXNzaWdubWVudCcpKVwiPlxuICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5hc3NpZ25tZW50cycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcmF0aW5ncy1kaXYgbXQtNVwiIGlkPVwidGFrZUFzc2Vzc21lbnREaXZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLWJhdGNoLWFzc2lnbm1lbnRzIFtjb250ZW50XT1cImNvbnRlbnRcIj48L3dzLXdpZGdldC1hcHAtYmF0Y2gtYXNzaWdubWVudHM+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gVHJhbnNjcmlwdGlvbiBUYWIgLS0+XG4gICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiQUkgVHV0b3JcIiAqbmdJZj1cInZpZXdlclBhZ2UgJiYgZW5hYmxlQUlUdXRvckZsYWcgJiYgaXNNb2JpbGUgJiYgKGRvbWFpbkNvbmZTZXJ2aWNlPy5pc0ZlYXR1cmVCeVBhZ2VFbmFibGVkKCd0b2MnLCd0cmFuc2NyaXB0aW9uJykpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgVHV0b3I8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVkLWNpcmNsZSBtbC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBOZXdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0FJVHV0b3JQb3B1cFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1haS10dXRvciBbY29udGVudF09XCJjb250ZW50Py5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VBSVBvcHVwKT1cImNsb3NlQUlQb3B1cCgkZXZlbnQpXCI+PC93cy13aWRnZXQtYWktdHV0b3I+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtdGFiPlxuXG4gICAgPC9tYXQtdGFiLWdyb3VwPlxuPC9kaXY+Il19