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