@sunbird-cb/toc 0.0.1-mauritius
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
- package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -0
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -0
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -0
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -0
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -0
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -0
- package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
- package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
- package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +221 -0
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +96 -0
- package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -0
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -0
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -0
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -0
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -0
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -0
- package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -0
- package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -0
- package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -0
- package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -0
- package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -0
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -0
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -0
- package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +961 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +304 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1229 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -0
- package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -0
- package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -0
- package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -0
- package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +833 -0
- package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +224 -0
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +212 -0
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -0
- package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -0
- package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -0
- package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -0
- package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -0
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -0
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -0
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -0
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -0
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -0
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -0
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -0
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -0
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -0
- package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -0
- package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -0
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -0
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -0
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -0
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -0
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -0
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -0
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -0
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -0
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -0
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -0
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -0
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -0
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -0
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -0
- package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -0
- package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -0
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -0
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -0
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -0
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -0
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -0
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -0
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -0
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -0
- package/esm2022/lib/_collection-api.mjs +57 -0
- package/esm2022/lib/_constants/widget-content.constants.mjs +19 -0
- package/esm2022/lib/_directives/tooltip.directive.mjs +68 -0
- package/esm2022/lib/_models/common.model.mjs +2 -0
- package/esm2022/lib/_models/error.model.mjs +2 -0
- package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -0
- package/esm2022/lib/_services/rating.service.mjs +89 -0
- package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -0
- package/esm2022/lib/_services/viewer-route-util.mjs +103 -0
- package/esm2022/lib/_services/widget-content.model.mjs +254 -0
- package/esm2022/lib/_services/widget-content.service.mjs +594 -0
- package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -0
- package/esm2022/lib/app-toc-lib.module.mjs +503 -0
- package/esm2022/lib/collection.config.mjs +161 -0
- package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -0
- package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -0
- package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +505 -0
- package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -0
- package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -0
- package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -0
- package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -0
- package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -0
- package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2230 -0
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +3001 -0
- package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -0
- package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -0
- package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -0
- package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -0
- package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -0
- package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -0
- package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -0
- package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -0
- package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -0
- package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -0
- package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -0
- package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +258 -0
- package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -0
- package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -0
- package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -0
- package/esm2022/lib/models/app-toc.model.mjs +38 -0
- package/esm2022/lib/models/auto-complete.model.mjs +2 -0
- package/esm2022/lib/models/card-content.model.mjs +13 -0
- package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -0
- package/esm2022/lib/models/discussion-forum.model.mjs +14 -0
- package/esm2022/lib/models/goal.model.mjs +2 -0
- package/esm2022/lib/models/meta-tag.model.mjs +8 -0
- package/esm2022/lib/models/playlist.model.mjs +2 -0
- package/esm2022/lib/models/profile-revamp.model.mjs +2 -0
- package/esm2022/lib/models/rating.model.mjs +2 -0
- package/esm2022/lib/models/user-profile.model.mjs +21 -0
- package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
- package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -0
- package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -0
- package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -0
- package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -0
- package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -0
- package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -0
- package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -0
- package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -0
- package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -0
- package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -0
- package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -0
- package/esm2022/lib/services/access-control.service.mjs +56 -0
- package/esm2022/lib/services/action.service.mjs +23 -0
- package/esm2022/lib/services/app-toc-v2.service.mjs +368 -0
- package/esm2022/lib/services/app-toc.service.mjs +1577 -0
- package/esm2022/lib/services/certificate.service.mjs +114 -0
- package/esm2022/lib/services/discuss-utils.service.mjs +58 -0
- package/esm2022/lib/services/editor.service.mjs +34 -0
- package/esm2022/lib/services/load-check.service.mjs +21 -0
- package/esm2022/lib/services/loader.service.mjs +33 -0
- package/esm2022/lib/services/mobile-apps.service.mjs +67 -0
- package/esm2022/lib/services/netcore.service.mjs +56 -0
- package/esm2022/lib/services/nps-grid.service.mjs +31 -0
- package/esm2022/lib/services/otp.service.mjs +43 -0
- package/esm2022/lib/services/profile-v2.service.mjs +43 -0
- package/esm2022/lib/services/reset-ratings.service.mjs +19 -0
- package/esm2022/lib/services/resource-download-helper.service.mjs +64 -0
- package/esm2022/lib/services/root.service.mjs +106 -0
- package/esm2022/lib/services/timer.service.mjs +23 -0
- package/esm2022/lib/services/title-tag.service.mjs +71 -0
- package/esm2022/lib/services/user-profile.service.mjs +55 -0
- package/esm2022/lib/services/viewer-data.service.mjs +64 -0
- package/esm2022/lib/services/viewer-util.service.mjs +627 -0
- package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -0
- package/esm2022/lib/share-toc/share-toc.module.mjs +119 -0
- package/esm2022/public-api.mjs +80 -0
- package/esm2022/sunbird-cb-toc.mjs +5 -0
- package/fesm2022/sunbird-cb-toc.mjs +27111 -0
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
- package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -0
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -0
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -0
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -0
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -0
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -0
- package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
- package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
- package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +30 -0
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -0
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -0
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -0
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -0
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -0
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -0
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -0
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -0
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -0
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -0
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -0
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -0
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -0
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -0
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -0
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +187 -0
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -0
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -0
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -0
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +56 -0
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +195 -0
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -0
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -0
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -0
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -0
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -0
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -0
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -0
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +131 -0
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -0
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -0
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -0
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -0
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -0
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -0
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -0
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -0
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -0
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -0
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -0
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -0
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -0
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -0
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -0
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -0
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -0
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -0
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -0
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -0
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -0
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -0
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -0
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -0
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -0
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -0
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -0
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -0
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -0
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -0
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -0
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -0
- package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -0
- package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -0
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -0
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -0
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -0
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -0
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -0
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -0
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -0
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -0
- package/lib/_collection-api.d.ts +34 -0
- package/lib/_constants/widget-content.constants.d.ts +7 -0
- package/lib/_directives/tooltip.directive.d.ts +17 -0
- package/lib/_models/common.model.d.ts +3 -0
- package/lib/_models/error.model.d.ts +5 -0
- package/lib/_pipes/highlight.pipe.d.ts +10 -0
- package/lib/_services/rating.service.d.ts +18 -0
- package/lib/_services/samuhik-charcha.service.d.ts +13 -0
- package/lib/_services/viewer-route-util.d.ts +8 -0
- package/lib/_services/widget-content.model.d.ts +521 -0
- package/lib/_services/widget-content.service.d.ts +101 -0
- package/lib/_shared/translate-loader.factory.d.ts +7 -0
- package/lib/app-toc-lib.module.d.ts +89 -0
- package/lib/collection.config.d.ts +159 -0
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -0
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -0
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +82 -0
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -0
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -0
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -0
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -0
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -0
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -0
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +417 -0
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -0
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -0
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -0
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -0
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -0
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -0
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -0
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -0
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -0
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -0
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -0
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -0
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -0
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -0
- package/lib/models/app-toc-analytics.model.d.ts +152 -0
- package/lib/models/app-toc.model.d.ts +84 -0
- package/lib/models/auto-complete.model.d.ts +27 -0
- package/lib/models/card-content.model.d.ts +19 -0
- package/lib/models/content-strip-with-tabs.model.d.ts +44 -0
- package/lib/models/discussion-forum.model.d.ts +40 -0
- package/lib/models/goal.model.d.ts +22 -0
- package/lib/models/meta-tag.model.d.ts +6 -0
- package/lib/models/playlist.model.d.ts +23 -0
- package/lib/models/profile-revamp.model.d.ts +14 -0
- package/lib/models/rating.model.d.ts +17 -0
- package/lib/models/user-profile.model.d.ts +37 -0
- package/lib/registration-toc-lib.config.d.ts +4 -0
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -0
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -0
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -0
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -0
- package/lib/resolvers/app-toc-resolver.service.d.ts +16 -0
- package/lib/resolvers/config-resolver.service.d.ts +11 -0
- package/lib/resolvers/profile-resolver.service.d.ts +11 -0
- package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -0
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -0
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -0
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -0
- package/lib/services/access-control.service.d.ts +29 -0
- package/lib/services/action.service.d.ts +9 -0
- package/lib/services/app-toc-v2.service.d.ts +17 -0
- package/lib/services/app-toc.service.d.ts +190 -0
- package/lib/services/certificate.service.d.ts +41 -0
- package/lib/services/discuss-utils.service.d.ts +33 -0
- package/lib/services/editor.service.d.ts +17 -0
- package/lib/services/load-check.service.d.ts +8 -0
- package/lib/services/loader.service.d.ts +16 -0
- package/lib/services/mobile-apps.service.d.ts +38 -0
- package/lib/services/netcore.service.d.ts +33 -0
- package/lib/services/nps-grid.service.d.ts +15 -0
- package/lib/services/otp.service.d.ts +20 -0
- package/lib/services/profile-v2.service.d.ts +20 -0
- package/lib/services/reset-ratings.service.d.ts +8 -0
- package/lib/services/resource-download-helper.service.d.ts +29 -0
- package/lib/services/root.service.d.ts +26 -0
- package/lib/services/timer.service.d.ts +9 -0
- package/lib/services/title-tag.service.d.ts +21 -0
- package/lib/services/user-profile.service.d.ts +24 -0
- package/lib/services/viewer-data.service.d.ts +62 -0
- package/lib/services/viewer-util.service.d.ts +76 -0
- package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -0
- package/lib/share-toc/share-toc.module.d.ts +32 -0
- package/package.json +34 -0
- package/public-api.d.ts +64 -0
- package/sunbird-cb-toc-0.0.1-mauritius.tgz +0 -0
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import { Component, HostListener, Inject, Optional, ViewChild } from '@angular/core';
|
|
2
|
+
import { WsEvents } from '@sunbird-cb/utils-v2';
|
|
3
|
+
import * as _ from 'lodash';
|
|
4
|
+
import { ConsentDialogComponent } from './consent-dialog.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/router";
|
|
7
|
+
import * as i2 from "@sunbird-cb/consumption";
|
|
8
|
+
import * as i3 from "@ngx-translate/core";
|
|
9
|
+
import * as i4 from "@sunbird-cb/utils-v2";
|
|
10
|
+
import * as i5 from "../../services/certificate.service";
|
|
11
|
+
import * as i6 from "../../services/loader.service";
|
|
12
|
+
import * as i7 from "@angular/material/dialog";
|
|
13
|
+
import * as i8 from "@angular/material/legacy-snack-bar";
|
|
14
|
+
import * as i9 from "../../services/netcore.service";
|
|
15
|
+
import * as i10 from "@angular/common";
|
|
16
|
+
import * as i11 from "@angular/material/icon";
|
|
17
|
+
import * as i12 from "@angular/material/legacy-tabs";
|
|
18
|
+
import * as i13 from "../../_collection/_common/skeleton-loader/skeleton-loader.component";
|
|
19
|
+
import * as i14 from "../../_collection/_common/content-toc/app-toc-about/app-toc-about.component";
|
|
20
|
+
import * as i15 from "../../share-toc/share-toc/share-toc.component";
|
|
21
|
+
import * as i16 from "@sunbird-cb/discussion-v2";
|
|
22
|
+
import * as i17 from "../../_collection/sliders-dynamic/sliders-dynamic.component";
|
|
23
|
+
export class AppTocCiosHomeComponent {
|
|
24
|
+
handleScroll() {
|
|
25
|
+
if (this.scrollLimit) {
|
|
26
|
+
if ((window.scrollY + this.rcElem.BottomPos) >= this.scrollLimit) {
|
|
27
|
+
this.rcElement.nativeElement.style.position = 'sticky';
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this.rcElement.nativeElement.style.position = 'fixed';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// 236... (OffsetTop of right container + 104)
|
|
34
|
+
if (window.scrollY > (this.rcElem.offSetTop + 104)) {
|
|
35
|
+
this.scrolled = true;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.scrolled = false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
constructor(route, commonSvc, translate, configSvc, events, langtranslations, contentSvc, certSvc, loader, matDialog, snackBar, netCoreService, environment) {
|
|
42
|
+
this.route = route;
|
|
43
|
+
this.commonSvc = commonSvc;
|
|
44
|
+
this.translate = translate;
|
|
45
|
+
this.configSvc = configSvc;
|
|
46
|
+
this.events = events;
|
|
47
|
+
this.langtranslations = langtranslations;
|
|
48
|
+
this.contentSvc = contentSvc;
|
|
49
|
+
this.certSvc = certSvc;
|
|
50
|
+
this.loader = loader;
|
|
51
|
+
this.matDialog = matDialog;
|
|
52
|
+
this.snackBar = snackBar;
|
|
53
|
+
this.netCoreService = netCoreService;
|
|
54
|
+
this.environment = environment;
|
|
55
|
+
this.commentId = '';
|
|
56
|
+
this.skeletonLoader = true;
|
|
57
|
+
this.extContentReadData = {};
|
|
58
|
+
this.userExtCourseEnroll = {};
|
|
59
|
+
this.downloadCertificateLoading = false;
|
|
60
|
+
this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('?editMode=true');
|
|
61
|
+
this.extContentAvailable = true;
|
|
62
|
+
this.canEnroll = false;
|
|
63
|
+
this.enrollValidationLoading = true;
|
|
64
|
+
this.rcElem = {
|
|
65
|
+
offSetTop: 0,
|
|
66
|
+
BottomPos: 0,
|
|
67
|
+
};
|
|
68
|
+
this.contentLink = '';
|
|
69
|
+
this.isMobile = false;
|
|
70
|
+
this.enableShare = false;
|
|
71
|
+
this.currentLang = 'en';
|
|
72
|
+
this.showProviderTips = false;
|
|
73
|
+
this.fromMDO = false;
|
|
74
|
+
this.route.data.subscribe((data) => {
|
|
75
|
+
this.enrollValidationLoading = false;
|
|
76
|
+
if (data && data.extContent && data.extContent.data && data.extContent.data.content) {
|
|
77
|
+
this.extContentReadData = data.extContent.data.content;
|
|
78
|
+
this.extContentReadData['certificateObj'] = {
|
|
79
|
+
data: {},
|
|
80
|
+
};
|
|
81
|
+
this.skeletonLoader = false;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.extContentAvailable = false;
|
|
85
|
+
this.skeletonLoader = false;
|
|
86
|
+
}
|
|
87
|
+
if (data && data.userEnrollContent && data.userEnrollContent.data && data.userEnrollContent.data.result &&
|
|
88
|
+
Object.keys(data.userEnrollContent.data.result).length > 0) {
|
|
89
|
+
this.userExtCourseEnroll = data.userEnrollContent.data.result;
|
|
90
|
+
if (this.userExtCourseEnroll.completionpercentage === 100) {
|
|
91
|
+
this.extContentReadData['completionStatus'] = 2;
|
|
92
|
+
this.downloadCert();
|
|
93
|
+
this.contentViewEventForNetCore('completion');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.validateEnrollmentEligibility();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
if (localStorage.getItem('websiteLanguage')) {
|
|
101
|
+
this.translate.setDefaultLang('en');
|
|
102
|
+
this.currentLang = localStorage.getItem('websiteLanguage');
|
|
103
|
+
this.translate.use(this.currentLang);
|
|
104
|
+
}
|
|
105
|
+
this.configSvc.languageTranslationFlag.subscribe((data) => {
|
|
106
|
+
if (data) {
|
|
107
|
+
if (localStorage.getItem('websiteLanguage')) {
|
|
108
|
+
this.currentLang = localStorage.getItem('websiteLanguage');
|
|
109
|
+
this.translate.use(this.currentLang);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
if (this.configSvc.userProfile) {
|
|
114
|
+
this.rootOrgId = this.configSvc.userProfile.rootOrgId;
|
|
115
|
+
}
|
|
116
|
+
this.contentLink = `${window.location.pathname.substring(1)}${window.location.search}`;
|
|
117
|
+
this.commentId = this.route.snapshot.queryParams.commentId ? this.route.snapshot.queryParams.commentId : '';
|
|
118
|
+
if (this.commentId) {
|
|
119
|
+
//this.selectedTabIndex = 2
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
ngOnInit() {
|
|
123
|
+
if (this.route.snapshot.data.pageData && this.route.snapshot.data.pageData.data) {
|
|
124
|
+
this.config = this.route.snapshot.data.pageData.data;
|
|
125
|
+
this.initializeDiscussData();
|
|
126
|
+
}
|
|
127
|
+
if (window.innerWidth <= 1200) {
|
|
128
|
+
this.isMobile = true;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.isMobile = false;
|
|
132
|
+
}
|
|
133
|
+
this.contentViewEventForNetCore('view');
|
|
134
|
+
}
|
|
135
|
+
initializeDiscussData() {
|
|
136
|
+
if (!_.get(this.extContentReadData, 'contentPartner.isActive', false)) {
|
|
137
|
+
this.snackBar.open('Courses from this learning partner are temporarily not available on iGOT Karmayogi. Our team is updating partner content. In the meantime, you can continue your journey with courses from other partners.', 'X', {
|
|
138
|
+
duration: 10000,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else if (!_.get(this.extContentReadData, 'isActive', false)) {
|
|
142
|
+
this.snackBar.open('This course is no longer being offered in its current form. We are updating our catalog to bring you improved learning options. Please choose another course with similar topics or browse recommended courses.', 'X', {
|
|
143
|
+
duration: 10000,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (this.config && this.config.discussWidgetData) {
|
|
147
|
+
this.discussWidgetData = this.config.discussWidgetData;
|
|
148
|
+
if (this.extContentReadData && this.extContentReadData.contentId) {
|
|
149
|
+
this.discussWidgetData.newCommentSection.commentTreeData.entityId = this.extContentReadData.contentId;
|
|
150
|
+
if (this.discussWidgetData.commentsList.repliesSection && this.discussWidgetData.commentsList.repliesSection.newCommentReply) {
|
|
151
|
+
this.discussWidgetData.commentsList.repliesSection.newCommentReply.commentTreeData.entityId = this.extContentReadData.contentId;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
this.widgetData = {
|
|
155
|
+
...this.config,
|
|
156
|
+
type: 'tips',
|
|
157
|
+
cardClass: 'slider-container',
|
|
158
|
+
height: 'auto',
|
|
159
|
+
sliderData: _.get(this.extContentReadData, 'contentPartner.providerTips', [])
|
|
160
|
+
};
|
|
161
|
+
this.showProviderTips = (this.widgetData && this.widgetData.sliderData?.length) &&
|
|
162
|
+
(Object.keys(this.userExtCourseEnroll).length === 0 ||
|
|
163
|
+
(this.userExtCourseEnroll?.issued_certificates?.length === 0 &&
|
|
164
|
+
this.userExtCourseEnroll?.progress <= 100));
|
|
165
|
+
if (Object.keys(this.userExtCourseEnroll).length) {
|
|
166
|
+
this.discussWidgetData.enrolledContent = true;
|
|
167
|
+
this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Start a discussion';
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.discussWidgetData.enrolledContent = false;
|
|
171
|
+
this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Enrol to add your comments';
|
|
172
|
+
}
|
|
173
|
+
this.discussWidgetData = { ...this.discussWidgetData };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
handleCapitalize(str, type) {
|
|
177
|
+
return this.commonSvc.handleCapitalize(str, type);
|
|
178
|
+
}
|
|
179
|
+
translateLabels(label, type) {
|
|
180
|
+
return this.langtranslations.translateLabel(label, type, '');
|
|
181
|
+
}
|
|
182
|
+
ngAfterViewInit() {
|
|
183
|
+
if (this.rcElement) {
|
|
184
|
+
this.rcElem.BottomPos = this.rcElement.nativeElement.offsetTop + this.rcElement.nativeElement.offsetHeight;
|
|
185
|
+
this.rcElem.offSetTop = this.rcElement.nativeElement.offsetTop;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
redirectToContent(contentData) {
|
|
189
|
+
const userData = this.configSvc.userProfileV2;
|
|
190
|
+
const extUrl = contentData.redirectUrl.replace('<username>', userData.email);
|
|
191
|
+
return extUrl;
|
|
192
|
+
}
|
|
193
|
+
replaceText(str, replaceTxt) {
|
|
194
|
+
return str.replaceAll(replaceTxt, '');
|
|
195
|
+
}
|
|
196
|
+
formatcourseProviders(providers) {
|
|
197
|
+
if (!providers || !Array.isArray(providers)) {
|
|
198
|
+
return '';
|
|
199
|
+
}
|
|
200
|
+
return providers.map((provider) => provider.name).join(', ');
|
|
201
|
+
}
|
|
202
|
+
async enRollToExtCourse(content) {
|
|
203
|
+
const consentUrl = `${this.environment?.missionKarmayogiPath}${this.config?.contentConsent?.consentDocUrl}` || '';
|
|
204
|
+
const assetsDocUrl = `${this.config?.contentConsent?.assetsDocUrl}` || '';
|
|
205
|
+
const dialogRef = this.matDialog.open(ConsentDialogComponent, {
|
|
206
|
+
width: '900px',
|
|
207
|
+
height: '70vh',
|
|
208
|
+
maxHeight: '90vh',
|
|
209
|
+
minHeight: '400px',
|
|
210
|
+
disableClose: true,
|
|
211
|
+
hasBackdrop: true,
|
|
212
|
+
panelClass: 'consent-dialog-panel',
|
|
213
|
+
data: {
|
|
214
|
+
consentUrl: consentUrl,
|
|
215
|
+
assetsDocUrl: assetsDocUrl
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
// Handle dialog close
|
|
219
|
+
dialogRef.afterClosed().subscribe((result) => {
|
|
220
|
+
if (result === true) {
|
|
221
|
+
// User agreed - proceed with enrollment
|
|
222
|
+
// need to call consent api
|
|
223
|
+
this.callConsentApi(content);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// User disagreed
|
|
227
|
+
this.snackBar.open('You must agree to the terms to enroll in this course.', 'X', {
|
|
228
|
+
duration: 5000,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
callConsentApi(content) {
|
|
234
|
+
console.log(content);
|
|
235
|
+
const request = {
|
|
236
|
+
"request": {
|
|
237
|
+
"contentId": content?.contentId,
|
|
238
|
+
"consentId": this.config?.contentConsent?.consentId || '',
|
|
239
|
+
"additionalAttributes": {
|
|
240
|
+
"userRoles": ["public"],
|
|
241
|
+
"versionKey": new Date().getTime(),
|
|
242
|
+
"description": "I have read and agree with the above declaration."
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
this.certSvc.consentSubmit(request).subscribe((_res) => {
|
|
247
|
+
this.proceedWithEnrollment(content);
|
|
248
|
+
}, (error) => {
|
|
249
|
+
this.snackBar.open(error?.error?.params?.msg || 'Unable to submit consent', 'X', {
|
|
250
|
+
duration: 5000,
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async proceedWithEnrollment(content) {
|
|
255
|
+
this.loader.changeLoad.next(true);
|
|
256
|
+
const reqbody = {
|
|
257
|
+
courseId: content.contentId,
|
|
258
|
+
partnerId: content.contentPartner.id,
|
|
259
|
+
};
|
|
260
|
+
const enrollRes = await this.contentSvc.extContentEnroll(reqbody).toPromise().catch(_error => { return _error; });
|
|
261
|
+
if (enrollRes && enrollRes.result && Object.keys(enrollRes.result).length > 0) {
|
|
262
|
+
this.discussWidgetData.enrolledContent = true;
|
|
263
|
+
this.discussWidgetData.newCommentSection.commentBox.placeholder = 'Start a discussion';
|
|
264
|
+
this.getUserContentEnroll(content.contentId);
|
|
265
|
+
this.contentViewEventForNetCore('enroll');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
this.loader.changeLoad.next(false);
|
|
269
|
+
this.snackBar.open(enrollRes?.error?.params?.msg || 'Unable to enroll to the content', 'X', {
|
|
270
|
+
duration: 10000,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async getUserContentEnroll(contentId) {
|
|
275
|
+
const enrollRes = await this.contentSvc.fetchExtUserContentEnroll(contentId).toPromise().catch(_error => { });
|
|
276
|
+
if (enrollRes && enrollRes.result && Object.keys(enrollRes.result).length > 0) {
|
|
277
|
+
this.userExtCourseEnroll = enrollRes.result;
|
|
278
|
+
this.loader.changeLoad.next(false);
|
|
279
|
+
this.telemetryToCaptureInteract(contentId, 'enroll', 'enrol-content');
|
|
280
|
+
this.snackBar.open('Successfully enrolled in the course.');
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
this.loader.changeLoad.next(false);
|
|
284
|
+
this.snackBar.open('Unable to get the enrolled details');
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
captureRedirectTelemetry(content) {
|
|
288
|
+
this.raiseTelemtryStartEvent();
|
|
289
|
+
this.telemetryToCaptureInteract(content.contentId, 'redirect', 'redirect-content');
|
|
290
|
+
this.raiseTelemtryEndEvent();
|
|
291
|
+
}
|
|
292
|
+
raiseTelemtryStartEvent() {
|
|
293
|
+
const event = {
|
|
294
|
+
eventType: WsEvents.WsEventType.Telemetry,
|
|
295
|
+
eventLogLevel: WsEvents.WsEventLogLevel.Info,
|
|
296
|
+
from: 'test',
|
|
297
|
+
to: '',
|
|
298
|
+
data: {
|
|
299
|
+
edata: { type: '' },
|
|
300
|
+
object: {},
|
|
301
|
+
state: WsEvents.EnumTelemetrySubType.Loaded,
|
|
302
|
+
type: 'session',
|
|
303
|
+
mode: 'view',
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
this.events.dispatchEvent(event);
|
|
307
|
+
}
|
|
308
|
+
telemetryToCaptureInteract(contentId, subType, id) {
|
|
309
|
+
this.events.raiseInteractTelemetry({
|
|
310
|
+
type: 'click',
|
|
311
|
+
subType,
|
|
312
|
+
id: id,
|
|
313
|
+
}, {
|
|
314
|
+
id: contentId,
|
|
315
|
+
type: 'External content',
|
|
316
|
+
}, {
|
|
317
|
+
module: 'Home',
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
raiseTelemtryEndEvent() {
|
|
321
|
+
const event = {
|
|
322
|
+
eventType: WsEvents.WsEventType.Telemetry,
|
|
323
|
+
eventLogLevel: WsEvents.WsEventLogLevel.Info,
|
|
324
|
+
from: 'test',
|
|
325
|
+
to: '',
|
|
326
|
+
data: {
|
|
327
|
+
edata: { type: '' },
|
|
328
|
+
object: {},
|
|
329
|
+
state: WsEvents.EnumTelemetrySubType.Unloaded,
|
|
330
|
+
type: 'session',
|
|
331
|
+
mode: 'view',
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
this.events.dispatchEvent(event);
|
|
335
|
+
}
|
|
336
|
+
async downloadCert() {
|
|
337
|
+
this.downloadCertificateLoading = true;
|
|
338
|
+
const certRes = await this.certSvc.downloadCertificate_v2(this.userExtCourseEnroll.issued_certificates[0].identifier).toPromise().catch(_error => { });
|
|
339
|
+
if (certRes && Object.keys(certRes.result).length > 0) {
|
|
340
|
+
this.downloadCertificateLoading = false;
|
|
341
|
+
if (this.userExtCourseEnroll.issued_certificates && this.userExtCourseEnroll.issued_certificates.length
|
|
342
|
+
&& this.userExtCourseEnroll.issued_certificates[0]) {
|
|
343
|
+
this.extContentReadData['certificateObj'] = {
|
|
344
|
+
data: this.userExtCourseEnroll.issued_certificates[0],
|
|
345
|
+
certData: certRes.result.printUri,
|
|
346
|
+
certId: this.userExtCourseEnroll.issued_certificates[0].identifier,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
this.downloadCertificateLoading = false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
onClickOfShare() {
|
|
355
|
+
this.enableShare = true;
|
|
356
|
+
//this.raiseTelemetryForShare('shareContent')
|
|
357
|
+
}
|
|
358
|
+
/* tslint:disable */
|
|
359
|
+
// raiseTelemetryForShare(subType: any) {
|
|
360
|
+
// //console.log(this.extContentReadData, this.events, subType)
|
|
361
|
+
// // this.events.raiseInteractTelemetry(
|
|
362
|
+
// // {
|
|
363
|
+
// // type: 'click',
|
|
364
|
+
// // subType,
|
|
365
|
+
// // id: this.content ? this.content.identifier : '',
|
|
366
|
+
// // },
|
|
367
|
+
// // {
|
|
368
|
+
// // id: this.content ? this.content.identifier : '',
|
|
369
|
+
// // type: this.content ? this.content.primaryCategory : '',
|
|
370
|
+
// // },
|
|
371
|
+
// // {
|
|
372
|
+
// // pageIdExt: `btn-${subType}`,
|
|
373
|
+
// // module: WsEvents.EnumTelemetrymodules.CONTENT,
|
|
374
|
+
// // }
|
|
375
|
+
// // )
|
|
376
|
+
// }
|
|
377
|
+
resetEnableShare(_eventData) {
|
|
378
|
+
this.enableShare = false;
|
|
379
|
+
}
|
|
380
|
+
contentViewEventForNetCore(eventType) {
|
|
381
|
+
if (this.configSvc.netcoreConfig && this.configSvc.netcoreConfig.netcoreWebConfig // NOSONAR
|
|
382
|
+
&& this.configSvc.netcoreConfig.netcoreWebConfig.isActive // NOSONAR
|
|
383
|
+
&& this.configSvc.netcoreConfig.netcoreWebConfig.events // NOSONAR
|
|
384
|
+
&& this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view // NOSONAR
|
|
385
|
+
&& this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view.isActive // NOSONAR
|
|
386
|
+
) {
|
|
387
|
+
let payload = {};
|
|
388
|
+
// if (this.configSvc && this.configSvc.unMappedUser && this.configSvc.unMappedUser.identifier) { // NOSONAR
|
|
389
|
+
// payload['pk^userid'] = this.configSvc.unMappedUser.identifier.trim().toLowerCase()
|
|
390
|
+
// }
|
|
391
|
+
// console.log('payload', payload)
|
|
392
|
+
if (this.extContentReadData && this.extContentReadData.name) {
|
|
393
|
+
payload['content_name'] = this.extContentReadData.name;
|
|
394
|
+
}
|
|
395
|
+
// if(this.extContentReadData && this.extContentReadData.courseCategory) {
|
|
396
|
+
payload['content_category'] = 'External Course';
|
|
397
|
+
// }
|
|
398
|
+
if (this.extContentReadData && this.extContentReadData.externalId) {
|
|
399
|
+
payload['content_id'] = this.extContentReadData.externalId;
|
|
400
|
+
}
|
|
401
|
+
// if(this.extContentReadData && this.extContentReadData.name) {
|
|
402
|
+
payload['content_url'] = window.location.href;
|
|
403
|
+
// }
|
|
404
|
+
if (this.extContentReadData && this.extContentReadData.appIcon) {
|
|
405
|
+
payload['content_image'] = this.extContentReadData.appIcon;
|
|
406
|
+
}
|
|
407
|
+
if (this.extContentReadData && this.extContentReadData.duration) {
|
|
408
|
+
payload['content_duration'] = this.extContentReadData.duration && Number(this.extContentReadData.duration) > 0 ? Number(this.extContentReadData.duration) : 0;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
payload['content_duration'] = 0;
|
|
412
|
+
}
|
|
413
|
+
if (this.extContentReadData && this.extContentReadData.avgRating) {
|
|
414
|
+
payload['content_rating'] = this.extContentReadData.avgRating;
|
|
415
|
+
payload['content rating'] = this.extContentReadData.avgRating;
|
|
416
|
+
}
|
|
417
|
+
if (this.extContentReadData && this.extContentReadData.totalNoOfRating) {
|
|
418
|
+
payload['no_users_rated'] = this.extContentReadData.totalNoOfRating;
|
|
419
|
+
}
|
|
420
|
+
// if(Object.keys(this.userExtCourseEnroll).length) {
|
|
421
|
+
payload['learning_path_content'] = Object.keys(this.userExtCourseEnroll).length ? true : false;
|
|
422
|
+
payload['learning path content'] = Object.keys(this.userExtCourseEnroll).length ? true : false;
|
|
423
|
+
// }
|
|
424
|
+
if (this.extContentReadData && this.extContentReadData.source) {
|
|
425
|
+
payload['content_provider_name'] = this.extContentReadData.source;
|
|
426
|
+
}
|
|
427
|
+
else if (this.extContentReadData && this.extContentReadData.contentPartner &&
|
|
428
|
+
this.extContentReadData.contentPartner.contentPartnerName) {
|
|
429
|
+
payload['content_provider_name'] = this.extContentReadData.contentPartner.contentPartnerName;
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
payload['content_provider_name'] = 'Karmayogi Bharat';
|
|
433
|
+
}
|
|
434
|
+
if (eventType === 'view') {
|
|
435
|
+
this.netCoreService.trackEventForContentAndEvent('content_view', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
|
|
436
|
+
}
|
|
437
|
+
else if (eventType === 'enroll') {
|
|
438
|
+
this.netCoreService.trackEventForContentAndEvent('content_enrolment', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
|
|
439
|
+
}
|
|
440
|
+
else if (eventType === 'completion') {
|
|
441
|
+
this.netCoreService.trackEventForContentAndEvent('content_completion', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
secondsToTime(d) {
|
|
446
|
+
d = Number(d);
|
|
447
|
+
var h = Math.floor(d / 3600);
|
|
448
|
+
var m = Math.floor(d % 3600 / 60);
|
|
449
|
+
var s = Math.floor(d % 3600 % 60);
|
|
450
|
+
var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
|
|
451
|
+
var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
|
|
452
|
+
var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
|
|
453
|
+
return hDisplay + mDisplay + sDisplay;
|
|
454
|
+
}
|
|
455
|
+
clearCommentIdFromUrl() {
|
|
456
|
+
const currentQueryParams = { ...this.route.snapshot.queryParams };
|
|
457
|
+
delete currentQueryParams.commentId;
|
|
458
|
+
this.commentId = '';
|
|
459
|
+
}
|
|
460
|
+
validateEnrollmentEligibility() {
|
|
461
|
+
// Only validate if user is not already enrolled and content is available
|
|
462
|
+
if (Object.keys(this.userExtCourseEnroll).length === 0 && this.extContentReadData && this.extContentReadData.contentId && this.extContentReadData.contentPartner && this.extContentReadData.contentPartner.id) {
|
|
463
|
+
this.enrollValidationLoading = true;
|
|
464
|
+
this.certSvc.validateEnrollmentEligibility(this.extContentReadData.contentId, this.extContentReadData.contentPartner.id).subscribe((_response) => {
|
|
465
|
+
this.enrollValidationLoading = false;
|
|
466
|
+
this.canEnroll = true;
|
|
467
|
+
}, (error) => {
|
|
468
|
+
this.snackBar.open(error?.error?.params?.msg || 'Unable to validate enrollment eligibility', 'X', {
|
|
469
|
+
duration: 10000,
|
|
470
|
+
});
|
|
471
|
+
this.enrollValidationLoading = false;
|
|
472
|
+
this.canEnroll = false;
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
get showEnroll() {
|
|
477
|
+
return Object.keys(this.userExtCourseEnroll).length === 0 &&
|
|
478
|
+
!this.enrollValidationLoading &&
|
|
479
|
+
this.canEnroll &&
|
|
480
|
+
_.get(this.extContentReadData, 'contentPartner.isActive', false);
|
|
481
|
+
}
|
|
482
|
+
get showRedirect() {
|
|
483
|
+
return Object.keys(this.userExtCourseEnroll).length > 0 &&
|
|
484
|
+
_.get(this.extContentReadData, 'redirectUrl') &&
|
|
485
|
+
_.get(this.extContentReadData, 'contentPartner.isActive', false);
|
|
486
|
+
}
|
|
487
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocCiosHomeComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.CommonMethodsService }, { token: i3.TranslateService }, { token: i4.ConfigurationsService }, { token: i4.EventService }, { token: i4.MultilingualTranslationsService }, { token: i4.WidgetContentService }, { token: i5.CertificateService }, { token: i6.LoaderService }, { token: i7.MatDialog }, { token: i8.MatLegacySnackBar }, { token: i9.NetCoreService }, { token: 'environment', optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
488
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocCiosHomeComponent, selector: "ws-app-app-toc-cios-home", host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"extContentAvailable\">\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"extContentReadData?.topic\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ 'External Course' }}</div>\n </ng-container>\n </div>\n </div> -->\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\">\n <mat-icon (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- Knowledge level block -->\n <div *ngIf=\"extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel\"\n class=\"knowledge-level-container\">\n <span\n *ngIf=\"extContentReadData?.difficultyLevel?.toLowerCase() === 'beginner' || extContentReadData?.knowledgeLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel}}\n </span>\n <span\n *ngIf=\"extContentReadData?.difficultyLevel?.toLowerCase() === 'intermediate' || extContentReadData?.knowledgeLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel}}\n </span>\n <span\n *ngIf=\"extContentReadData?.difficultyLevel?.toLowerCase() === 'advanced' || extContentReadData?.knowledgeLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel}}\n </span>\n </div>\n </ng-container>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold\">{{\n handleCapitalize(extContentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">\n {{ 'cardcontentv2.by' | translate }}\n <span *ngIf=\"extContentReadData?.contentPartner?.contentPartnerName\">\n <span *ngIf=\"extContentReadData?.courseProvider?.length;else contentPartnerName\">\n {{ formatcourseProviders(extContentReadData?.courseProvider) }}\n </span>\n <ng-template #contentPartnerName>\n {{extContentReadData?.contentPartner?.contentPartnerName }}\n </ng-template>\n </span>\n <span *ngIf=\"!extContentReadData?.contentPartner?.contentPartnerName\">{{\n 'common.karmayogiBharat' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon>grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div> -->\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && extContentReadData?.lastUpdatedOn\">\n <div class=\"text-xs leading-4 source-text\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n extContentReadData?.lastUpdatedOn | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"!forPreview\">\n\n <div *ngIf=\"isMobile\">\n <div class=\"flex flex-col gap-4 p-5 border-bottom position-bottom\">\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}'\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text\">\n {{userExtCourseEnroll?.progress}}%</span>\n </div>\n <ws-widget-content-progress [contentId]=\"userExtCourseEnroll?.progress\"\n [progress]=\"userExtCourseEnroll?.progress\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </ng-container> -->\n <ng-container *ngIf=\"showEnroll\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\"\n (click)=\"enRollToExtCourse(extContentReadData)\">\n <ng-container>{{ 'apptochome.enroll' | translate }}\n </ng-container>\n </button>\n </ng-container>\n <ng-container *ngIf=\"enrollValidationLoading\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"showRedirect\">\n <a class=\"flex action-button justify-center flex-middle resume\" target=\"_blank\"\n [href]=\"extContentReadData?.redirectUrl\" (click)=\"captureRedirectTelemetry(extContentReadData)\">\n <ng-container>{{ 'apptochome.redirect' | translate }}\n <mat-icon class=\"ml-2 ws-mat-white-text\">open_in_new</mat-icon>\n </ng-container>\n </a>\n </ng-container>\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}' && userExtCourseEnroll?.issued_certificates?.length > 0\n && userExtCourseEnroll?.progress === 100\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\" (click)=\"downloadCert()\">\n <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\">\n <span>Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\" class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader margin-left-s\" *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\" [diameter]=\"24\"></mat-spinner>\n </div>\n </button>\n </ng-container> -->\n </div>\n\n <div class=\"block md:hidden\">\n <ng-container [ngTemplateOutlet]=\"inProgressInfo\" ></ng-container>\n </div>\n <div>\n <div class=\"flex flex-col px-8 py-4 gap-2\" *ngIf=\"extContentReadData?.duration > 0\">\n <img src=\"/assets/icons/toc/timer.svg\" width=\"20px\" alt=\"web image\" />\n <div class=\"text-xs\">{{ extContentReadData?.duration * 60 | pipeDurationTransform: 'hms' }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\" [ngClass]=\"isMobile ? '':'mt-8 mb-8'\">\n <mat-tab-group>\n <mat-tab label=\"{{ 'apptocsinglepage.about' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col\" [ngClass]=\"isMobile ? '':'mt-5 mb-5'\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-app-toc-about [contentReadData]=\"extContentReadData\" [showReviews]=\"false\"\n [baseContentReadData]=\"extContentReadData\"\n [showMarketPlaceCertificate]=\"(userExtCourseEnroll | json) !== '{}' && userExtCourseEnroll?.issued_certificates?.length > 0 && userExtCourseEnroll?.progress === 100\"\n [content]=\"extContentReadData\" [fromMarketPlace]=\"true\"\n [skeletonLoader]=\"skeletonLoader\"\n [fromMDO]=\"fromMDO\">\n </ws-widget-app-toc-about>\n </ng-container>\n </div>\n </ng-template>\n </mat-tab>\n\n <ng-container *ngIf=\"config?.commentsTab\">\n <mat-tab label=\"{{ 'apptocsinglepage.comments' | translate }}\">\n <!-- <ng-template matTabContent> -->\n <div class=\"flex flex-col ratings-div mt-5\" id=\"commentsDiv\" *ngIf=\"discussWidgetData\">\n <ng-container *ngIf=\"!commentId\">\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\"></d-v2-widget-comment>\n </ng-container>\n <ng-container *ngIf=\"commentId\">\n <div class=\"flex flex-row gap-3 cursor-pointer mb-5\" (click)=\"clearCommentIdFromUrl()\">\n <mat-icon class=\"cursor-pointer\">arrow_back</mat-icon>\n Back to all comments\n </div>\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\" [commentId]=\"commentId\"\n [skeletonLoader]></d-v2-widget-comment>\n </ng-container>\n\n </div>\n <!-- </ng-template> -->\n </mat-tab>\n </ng-container>\n </mat-tab-group>\n\n </div>\n <div class=\"right-container\">\n <div class=\"right-content\" #rightContainer>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + extContentReadData?.appIcon + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-end\">\n <div (click)=\"onClickOfShare()\"\n class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"!forPreview\">\n <mat-icon>share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold text-scrol-custom\">{{\n handleCapitalize(extContentReadData?.name) }}\n </div>\n <!-- <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">\n {{ 'cardcontentv2.by' | translate }}\n <span *ngIf=\"extContentReadData?.contentPartner?.contentPartnerName\">{{ extContentReadData?.contentPartner?.contentPartnerName }}</span>\n <span *ngIf=\"!extContentReadData?.contentPartner?.contentPartnerName\">{{ 'common.karmayogiBharat' | translate }}</span>\n </div> -->\n </div>\n </div>\n\n\n </div>\n\n\n </ng-container>\n\n <ng-container *ngIf=\"!forPreview\">\n <div class=\"flex flex-col gap-3 p-3 border-bottom\">\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}'\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text\">\n {{userExtCourseEnroll?.progress}}%</span>\n </div>\n <ws-widget-content-progress [contentId]=\"userExtCourseEnroll?.progress\"\n [progress]=\"userExtCourseEnroll?.progress\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </ng-container> -->\n\n <ng-container *ngIf=\"showEnroll\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\"\n (click)=\"enRollToExtCourse(extContentReadData)\">\n <ng-container>{{ 'apptochome.enroll' | translate }}\n </ng-container>\n </button>\n </ng-container>\n <ng-container *ngIf=\"enrollValidationLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded '\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"showRedirect\">\n <a class=\"flex action-button justify-center flex-middle resume\" target=\"_blank\"\n [href]=\"extContentReadData?.redirectUrl\"\n (click)=\"captureRedirectTelemetry(extContentReadData)\">\n <ng-container>{{ 'apptochome.redirect' | translate }}\n <mat-icon class=\"ml-2 ws-mat-white-text\">open_in_new</mat-icon>\n </ng-container>\n </a>\n </ng-container>\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}' && userExtCourseEnroll?.issued_certificates?.length > 0\n && userExtCourseEnroll?.progress === 100\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\" (click)=\"downloadCert()\">\n <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\">\n <span>Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\" class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader margin-left-s\" *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\" [diameter]=\"24\"></mat-spinner>\n </div>\n </button>\n </ng-container> -->\n </div>\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"inProgressInfo\" ></ng-container>\n <div>\n <div class=\"flex flex-col kpi-values items-center gap-2\" *ngIf=\"extContentReadData?.duration > 0\">\n <img src=\"/assets/icons/toc/timer.svg\" width=\"20px\" alt=\"web image\" />\n <div class=\"text-xs\">\n {{ extContentReadData?.duration | pipeDurationTransform: 'hms' }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n<div *ngIf=\"!extContentAvailable\">\n <div class=\"flex justify-center w-full\">\n <div class=\"margin-xl text-center\">\n <img src=\"/assets/common/error-pages/empty_search.svg\" wsUtilsImageResponsive alt=\"No results\"\n class=\"margin-top-l margin-bottom-s\">\n <h2 class=\"mat-h2\" i18n=\"search route no result\">{{'learnsearch.noResults' | translate}}</h2>\n </div>\n </div>\n\n</div>\n\n<ws-app-share-toc *ngIf=\"enableShare\" [contentLink]=\"contentLink\" [rootOrgId]=\"rootOrgId\" [content]=\"extContentReadData\"\n (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n\n<ng-template #inProgressInfo>\n <ng-container *ngIf=\"showProviderTips\">\n <div class=\"no-certificate-found mt-6 mb-4 mx-2 p-2\" >\n <ws-widget-sliders-dynamic [widgetData]=\"widgetData\"></ws-widget-sliders-dynamic>\n </div>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2;word-wrap:break-word}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{background-color:#fff;border-radius:12px;position:fixed;z-index:10;top:132px;width:384px;margin-bottom:2rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}.text-scrol-custom{height:200px;overflow-y:auto}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;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:#0074b6!important}.tab:focus{outline:1px solid!important}.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}.blue-border{border:2px solid #0074b6!important}.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:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-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}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.certificate-loader ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}ul{padding:0!important}.kpi-values{min-width:64px;padding:8px;text-align:center}.kpi-values img{height:24px;width:24px}.position-bottom{position:fixed;width:88%;bottom:0;z-index:99}.no-certificate-found{border:1px solid #ccc;border-color:#f3962f;background-color:#fceedb;border-radius:12px}.no-certificate-found{min-height:56px}.no-certificate-found ::ng-deep ws-widget-sliders-dynamic .banner-data{font-size:16px!important;font-family:lato,sans-serif!important}.truncate-5{-webkit-line-clamp:1;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.ext-info-slider{padding:8px}#commentsDiv{margin:1rem auto;min-height:500px}.knowledge-level-container{margin-right:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}::ng-deep .consent-dialog-panel .mat-dialog-container{overflow:hidden;padding:0;margin:0;border-radius:8px}::ng-deep .consent-dialog-panel .mat-dialog-content{padding:0;margin:0;max-height:none;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatLegacyTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i12.MatLegacyTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "directive", type: i12.MatLegacyTabContent, selector: "[matTabContent]" }, { kind: "component", type: i13.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i14.AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: ["condition", "kparray", "content", "contentReadData", "baseContentReadData", "skeletonLoader", "sticky", "tocStructure", "pathSet", "config", "resumeData", "forPreview", "showReviews", "batchData", "fromViewer", "selectedBatchData", "selectedTabValue", "fromMarketPlace", "showMarketPlaceCertificate", "languageList", "lockCertificate", "fromMDO"], outputs: ["trigerCompletionSurveyForm"] }, { kind: "component", type: i15.ShareTocComponent, selector: "ws-app-share-toc", inputs: ["rootOrgId", "content", "contentLink", "baseContentReadData"], outputs: ["resetEnableShare"] }, { kind: "component", type: i16.WidgetCommentComponent, selector: "d-v2-widget-comment", inputs: ["widgetData", "commentId"], outputs: ["commentDataChange"] }, { kind: "component", type: i17.SlidersDynamicComponent, selector: "ws-widget-sliders-dynamic", inputs: ["widgetData"] }, { kind: "pipe", type: i10.JsonPipe, name: "json" }, { kind: "pipe", type: i10.DatePipe, name: "date" }, { kind: "pipe", type: i4.PipeDurationTransformPipe, name: "pipeDurationTransform" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
|
|
489
|
+
}
|
|
490
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocCiosHomeComponent, decorators: [{
|
|
491
|
+
type: Component,
|
|
492
|
+
args: [{ selector: 'ws-app-app-toc-cios-home', template: "<ng-container *ngIf=\"extContentAvailable\">\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"extContentReadData?.topic\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ 'External Course' }}</div>\n </ng-container>\n </div>\n </div> -->\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\">\n <mat-icon (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- Knowledge level block -->\n <div *ngIf=\"extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel\"\n class=\"knowledge-level-container\">\n <span\n *ngIf=\"extContentReadData?.difficultyLevel?.toLowerCase() === 'beginner' || extContentReadData?.knowledgeLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel}}\n </span>\n <span\n *ngIf=\"extContentReadData?.difficultyLevel?.toLowerCase() === 'intermediate' || extContentReadData?.knowledgeLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel}}\n </span>\n <span\n *ngIf=\"extContentReadData?.difficultyLevel?.toLowerCase() === 'advanced' || extContentReadData?.knowledgeLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{extContentReadData?.difficultyLevel || extContentReadData?.knowledgeLevel}}\n </span>\n </div>\n </ng-container>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold\">{{\n handleCapitalize(extContentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">\n {{ 'cardcontentv2.by' | translate }}\n <span *ngIf=\"extContentReadData?.contentPartner?.contentPartnerName\">\n <span *ngIf=\"extContentReadData?.courseProvider?.length;else contentPartnerName\">\n {{ formatcourseProviders(extContentReadData?.courseProvider) }}\n </span>\n <ng-template #contentPartnerName>\n {{extContentReadData?.contentPartner?.contentPartnerName }}\n </ng-template>\n </span>\n <span *ngIf=\"!extContentReadData?.contentPartner?.contentPartnerName\">{{\n 'common.karmayogiBharat' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon>grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div> -->\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && extContentReadData?.lastUpdatedOn\">\n <div class=\"text-xs leading-4 source-text\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n extContentReadData?.lastUpdatedOn | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"!forPreview\">\n\n <div *ngIf=\"isMobile\">\n <div class=\"flex flex-col gap-4 p-5 border-bottom position-bottom\">\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}'\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text\">\n {{userExtCourseEnroll?.progress}}%</span>\n </div>\n <ws-widget-content-progress [contentId]=\"userExtCourseEnroll?.progress\"\n [progress]=\"userExtCourseEnroll?.progress\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </ng-container> -->\n <ng-container *ngIf=\"showEnroll\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\"\n (click)=\"enRollToExtCourse(extContentReadData)\">\n <ng-container>{{ 'apptochome.enroll' | translate }}\n </ng-container>\n </button>\n </ng-container>\n <ng-container *ngIf=\"enrollValidationLoading\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"showRedirect\">\n <a class=\"flex action-button justify-center flex-middle resume\" target=\"_blank\"\n [href]=\"extContentReadData?.redirectUrl\" (click)=\"captureRedirectTelemetry(extContentReadData)\">\n <ng-container>{{ 'apptochome.redirect' | translate }}\n <mat-icon class=\"ml-2 ws-mat-white-text\">open_in_new</mat-icon>\n </ng-container>\n </a>\n </ng-container>\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}' && userExtCourseEnroll?.issued_certificates?.length > 0\n && userExtCourseEnroll?.progress === 100\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\" (click)=\"downloadCert()\">\n <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\">\n <span>Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\" class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader margin-left-s\" *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\" [diameter]=\"24\"></mat-spinner>\n </div>\n </button>\n </ng-container> -->\n </div>\n\n <div class=\"block md:hidden\">\n <ng-container [ngTemplateOutlet]=\"inProgressInfo\" ></ng-container>\n </div>\n <div>\n <div class=\"flex flex-col px-8 py-4 gap-2\" *ngIf=\"extContentReadData?.duration > 0\">\n <img src=\"/assets/icons/toc/timer.svg\" width=\"20px\" alt=\"web image\" />\n <div class=\"text-xs\">{{ extContentReadData?.duration * 60 | pipeDurationTransform: 'hms' }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\" [ngClass]=\"isMobile ? '':'mt-8 mb-8'\">\n <mat-tab-group>\n <mat-tab label=\"{{ 'apptocsinglepage.about' | translate }}\">\n <ng-template matTabContent>\n <div class=\"flex flex-col\" [ngClass]=\"isMobile ? '':'mt-5 mb-5'\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-app-toc-about [contentReadData]=\"extContentReadData\" [showReviews]=\"false\"\n [baseContentReadData]=\"extContentReadData\"\n [showMarketPlaceCertificate]=\"(userExtCourseEnroll | json) !== '{}' && userExtCourseEnroll?.issued_certificates?.length > 0 && userExtCourseEnroll?.progress === 100\"\n [content]=\"extContentReadData\" [fromMarketPlace]=\"true\"\n [skeletonLoader]=\"skeletonLoader\"\n [fromMDO]=\"fromMDO\">\n </ws-widget-app-toc-about>\n </ng-container>\n </div>\n </ng-template>\n </mat-tab>\n\n <ng-container *ngIf=\"config?.commentsTab\">\n <mat-tab label=\"{{ 'apptocsinglepage.comments' | translate }}\">\n <!-- <ng-template matTabContent> -->\n <div class=\"flex flex-col ratings-div mt-5\" id=\"commentsDiv\" *ngIf=\"discussWidgetData\">\n <ng-container *ngIf=\"!commentId\">\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\"></d-v2-widget-comment>\n </ng-container>\n <ng-container *ngIf=\"commentId\">\n <div class=\"flex flex-row gap-3 cursor-pointer mb-5\" (click)=\"clearCommentIdFromUrl()\">\n <mat-icon class=\"cursor-pointer\">arrow_back</mat-icon>\n Back to all comments\n </div>\n <d-v2-widget-comment [widgetData]=\"discussWidgetData\" [commentId]=\"commentId\"\n [skeletonLoader]></d-v2-widget-comment>\n </ng-container>\n\n </div>\n <!-- </ng-template> -->\n </mat-tab>\n </ng-container>\n </mat-tab-group>\n\n </div>\n <div class=\"right-container\">\n <div class=\"right-content\" #rightContainer>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + extContentReadData?.appIcon + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-end\">\n <div (click)=\"onClickOfShare()\"\n class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"!forPreview\">\n <mat-icon>share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold text-scrol-custom\">{{\n handleCapitalize(extContentReadData?.name) }}\n </div>\n <!-- <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">\n {{ 'cardcontentv2.by' | translate }}\n <span *ngIf=\"extContentReadData?.contentPartner?.contentPartnerName\">{{ extContentReadData?.contentPartner?.contentPartnerName }}</span>\n <span *ngIf=\"!extContentReadData?.contentPartner?.contentPartnerName\">{{ 'common.karmayogiBharat' | translate }}</span>\n </div> -->\n </div>\n </div>\n\n\n </div>\n\n\n </ng-container>\n\n <ng-container *ngIf=\"!forPreview\">\n <div class=\"flex flex-col gap-3 p-3 border-bottom\">\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}'\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text\">\n {{userExtCourseEnroll?.progress}}%</span>\n </div>\n <ws-widget-content-progress [contentId]=\"userExtCourseEnroll?.progress\"\n [progress]=\"userExtCourseEnroll?.progress\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </ng-container> -->\n\n <ng-container *ngIf=\"showEnroll\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\"\n (click)=\"enRollToExtCourse(extContentReadData)\">\n <ng-container>{{ 'apptochome.enroll' | translate }}\n </ng-container>\n </button>\n </ng-container>\n <ng-container *ngIf=\"enrollValidationLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded '\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"showRedirect\">\n <a class=\"flex action-button justify-center flex-middle resume\" target=\"_blank\"\n [href]=\"extContentReadData?.redirectUrl\"\n (click)=\"captureRedirectTelemetry(extContentReadData)\">\n <ng-container>{{ 'apptochome.redirect' | translate }}\n <mat-icon class=\"ml-2 ws-mat-white-text\">open_in_new</mat-icon>\n </ng-container>\n </a>\n </ng-container>\n <!-- <ng-container *ngIf=\"(userExtCourseEnroll | json) !== '{}' && userExtCourseEnroll?.issued_certificates?.length > 0\n && userExtCourseEnroll?.progress === 100\">\n <button class=\"flex action-button justify-center flex-middle resume\" type=\"button\" (click)=\"downloadCert()\">\n <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\">\n <span>Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\" class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader margin-left-s\" *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\" [diameter]=\"24\"></mat-spinner>\n </div>\n </button>\n </ng-container> -->\n </div>\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"inProgressInfo\" ></ng-container>\n <div>\n <div class=\"flex flex-col kpi-values items-center gap-2\" *ngIf=\"extContentReadData?.duration > 0\">\n <img src=\"/assets/icons/toc/timer.svg\" width=\"20px\" alt=\"web image\" />\n <div class=\"text-xs\">\n {{ extContentReadData?.duration | pipeDurationTransform: 'hms' }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n<div *ngIf=\"!extContentAvailable\">\n <div class=\"flex justify-center w-full\">\n <div class=\"margin-xl text-center\">\n <img src=\"/assets/common/error-pages/empty_search.svg\" wsUtilsImageResponsive alt=\"No results\"\n class=\"margin-top-l margin-bottom-s\">\n <h2 class=\"mat-h2\" i18n=\"search route no result\">{{'learnsearch.noResults' | translate}}</h2>\n </div>\n </div>\n\n</div>\n\n<ws-app-share-toc *ngIf=\"enableShare\" [contentLink]=\"contentLink\" [rootOrgId]=\"rootOrgId\" [content]=\"extContentReadData\"\n (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n\n<ng-template #inProgressInfo>\n <ng-container *ngIf=\"showProviderTips\">\n <div class=\"no-certificate-found mt-6 mb-4 mx-2 p-2\" >\n <ws-widget-sliders-dynamic [widgetData]=\"widgetData\"></ws-widget-sliders-dynamic>\n </div>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2;word-wrap:break-word}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{background-color:#fff;border-radius:12px;position:fixed;z-index:10;top:132px;width:384px;margin-bottom:2rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}.text-scrol-custom{height:200px;overflow-y:auto}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;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:#0074b6!important}.tab:focus{outline:1px solid!important}.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}.blue-border{border:2px solid #0074b6!important}.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:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-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}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.certificate-loader ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}ul{padding:0!important}.kpi-values{min-width:64px;padding:8px;text-align:center}.kpi-values img{height:24px;width:24px}.position-bottom{position:fixed;width:88%;bottom:0;z-index:99}.no-certificate-found{border:1px solid #ccc;border-color:#f3962f;background-color:#fceedb;border-radius:12px}.no-certificate-found{min-height:56px}.no-certificate-found ::ng-deep ws-widget-sliders-dynamic .banner-data{font-size:16px!important;font-family:lato,sans-serif!important}.truncate-5{-webkit-line-clamp:1;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.ext-info-slider{padding:8px}#commentsDiv{margin:1rem auto;min-height:500px}.knowledge-level-container{margin-right:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}::ng-deep .consent-dialog-panel .mat-dialog-container{overflow:hidden;padding:0;margin:0;border-radius:8px}::ng-deep .consent-dialog-panel .mat-dialog-content{padding:0;margin:0;max-height:none;overflow:hidden}\n"] }]
|
|
493
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.CommonMethodsService }, { type: i3.TranslateService }, { type: i4.ConfigurationsService }, { type: i4.EventService }, { type: i4.MultilingualTranslationsService }, { type: i4.WidgetContentService }, { type: i5.CertificateService }, { type: i6.LoaderService }, { type: i7.MatDialog }, { type: i8.MatLegacySnackBar }, { type: i9.NetCoreService }, { type: undefined, decorators: [{
|
|
494
|
+
type: Inject,
|
|
495
|
+
args: ['environment']
|
|
496
|
+
}, {
|
|
497
|
+
type: Optional
|
|
498
|
+
}] }]; }, propDecorators: { rcElement: [{
|
|
499
|
+
type: ViewChild,
|
|
500
|
+
args: ['rightContainer']
|
|
501
|
+
}], handleScroll: [{
|
|
502
|
+
type: HostListener,
|
|
503
|
+
args: ['window:scroll', ['$event']]
|
|
504
|
+
}] } });
|
|
505
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jaW9zLWhvbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1jaW9zLWhvbWUvYXBwLXRvYy1jaW9zLWhvbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1jaW9zLWhvbWUvYXBwLXRvYy1jaW9zLWhvbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBVSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBSXZILE9BQU8sRUFBOEYsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFNM0ksT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFM0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPbkUsTUFBTSxPQUFPLHVCQUF1QjtJQTRCbEMsWUFBWTtRQUVWLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ3ZEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO2FBQ3REO1NBQ0Y7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1NBQ3RCO0lBQ0gsQ0FBQztJQUNELFlBQW9CLEtBQXFCLEVBQy9CLFNBQStCLEVBQy9CLFNBQTJCLEVBQzNCLFNBQWdDLEVBQ2hDLE1BQW9CLEVBQ3BCLGdCQUFpRCxFQUNqRCxVQUFnQyxFQUNoQyxPQUEyQixFQUM1QixNQUFxQixFQUNwQixTQUFvQixFQUNyQixRQUFxQixFQUNyQixjQUE4QixFQUNNLFdBQWdCO1FBWnpDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQztRQUNqRCxlQUFVLEdBQVYsVUFBVSxDQUFzQjtRQUNoQyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDTSxnQkFBVyxHQUFYLFdBQVcsQ0FBSztRQXhEN0QsY0FBUyxHQUFZLEVBQUUsQ0FBQTtRQUN2QixtQkFBYyxHQUFHLElBQUksQ0FBQTtRQUNyQix1QkFBa0IsR0FBUSxFQUFFLENBQUE7UUFDNUIsd0JBQW1CLEdBQVEsRUFBRSxDQUFBO1FBQzdCLCtCQUEwQixHQUFHLEtBQUssQ0FBQTtRQUNsQyxlQUFVLEdBQVEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzlHLHdCQUFtQixHQUFHLElBQUksQ0FBQTtRQUMxQixjQUFTLEdBQUcsS0FBSyxDQUFBO1FBQ2pCLDRCQUF1QixHQUFHLElBQUksQ0FBQTtRQUM5QixXQUFNLEdBQUc7WUFDUCxTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsRUFBRSxDQUFDO1NBQ2IsQ0FBQTtRQUNELGdCQUFXLEdBQVEsRUFBRSxDQUFBO1FBSXJCLGFBQVEsR0FBRyxLQUFLLENBQUE7UUFHaEIsZ0JBQVcsR0FBRyxLQUFLLENBQUE7UUFFbkIsZ0JBQVcsR0FBUSxJQUFJLENBQUE7UUFFdkIscUJBQWdCLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFpQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQTtZQUNwQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbkYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtnQkFDdEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUc7b0JBQzFDLElBQUksRUFBRSxFQUFFO2lCQUNULENBQUE7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUE7YUFFNUI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQTtnQkFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUE7YUFDNUI7WUFFRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQ3JHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUMxRDtnQkFDQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUE7Z0JBQzdELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixLQUFLLEdBQUcsRUFBRTtvQkFDekQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUUvQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7b0JBQ25CLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtpQkFDOUM7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTthQUNyQztRQUVILENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFFLENBQUE7WUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFFLENBQUE7b0JBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtpQkFDckM7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQTtTQUN0RDtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUV0RixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUMzRyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsMkJBQTJCO1NBQzVCO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDL0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtZQUNwRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtTQUM3QjtRQUNELElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1NBQ3RCO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDRNQUE0TSxFQUFFLEdBQUcsRUFBRTtnQkFDcE8sUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFBO1NBQ0g7YUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlOQUFpTixFQUFFLEdBQUcsRUFBRTtnQkFDek8sUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtZQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQTtZQUN0RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFO2dCQUNoRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFBO2dCQUNyRyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRTtvQkFDNUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQTtpQkFDaEk7YUFDRjtZQUNELElBQUksQ0FBQyxVQUFVLEdBQUc7Z0JBQ2hCLEdBQUcsSUFBSSxDQUFDLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLE1BQU07Z0JBQ1osU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLDZCQUE2QixFQUFFLEVBQUUsQ0FBQzthQUM5RSxDQUFBO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7Z0JBQzdFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDbkQsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxLQUFLLENBQUM7d0JBQzVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUU3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtnQkFDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUE7YUFDdkY7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUE7Z0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLDRCQUE0QixDQUFBO2FBQy9GO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtTQUN2RDtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsSUFBYTtRQUN6QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDdEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQTtZQUMxRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUE7U0FDL0Q7SUFDSCxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsV0FBZ0I7UUFDaEMsTUFBTSxRQUFRLEdBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUE7UUFDbEQsTUFBTSxNQUFNLEdBQVcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwRixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFDRCxXQUFXLENBQUMsR0FBUSxFQUFFLFVBQWU7UUFDbkMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBZ0I7UUFDcEMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDM0MsT0FBTyxFQUFFLENBQUE7U0FDVjtRQUNELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQVk7UUFDbEMsTUFBTSxVQUFVLEdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLG9CQUFvQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUN6SCxNQUFNLFlBQVksR0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUNqRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUM1RCxLQUFLLEVBQUUsT0FBTztZQUNkLE1BQU0sRUFBRSxNQUFNO1lBQ2QsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE9BQU87WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxJQUFJLEVBQUU7Z0JBQ0osVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLFlBQVksRUFBRSxZQUFZO2FBQzNCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsc0JBQXNCO1FBQ3RCLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ25CLHdDQUF3QztnQkFDeEMsMkJBQTJCO2dCQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2FBQzdCO2lCQUFNO2dCQUNMLGlCQUFpQjtnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsdURBQXVELEVBQUUsR0FBRyxFQUFFO29CQUMvRSxRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUE7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFZO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDcEIsTUFBTSxPQUFPLEdBQUc7WUFDZCxTQUFTLEVBQUU7Z0JBQ1QsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTO2dCQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsU0FBUyxJQUFJLEVBQUU7Z0JBQ3pELHNCQUFzQixFQUFFO29CQUN0QixXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ3ZCLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTtvQkFDbEMsYUFBYSxFQUFFLG1EQUFtRDtpQkFDbkU7YUFDRjtTQUNGLENBQUE7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDckMsQ0FBQyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtnQkFDL0UsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDTyxLQUFLLENBQUMscUJBQXFCLENBQUMsT0FBWTtRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsTUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDM0IsU0FBUyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtTQUNyQyxDQUFBO1FBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sTUFBTSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEgsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFBO1lBQ3RGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQzFDO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtnQkFDMUYsUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFBO1NBQ0g7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQWM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzdHLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQTtZQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUE7WUFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtTQUMzRDthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7U0FDekQ7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsT0FBWTtRQUNuQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUM5QixJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUNsRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztZQUN6QyxhQUFhLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRSxNQUFNO1lBQ1osRUFBRSxFQUFFLEVBQUU7WUFDTixJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtnQkFDbkIsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNO2dCQUMzQyxJQUFJLEVBQUUsU0FBUztnQkFDZixJQUFJLEVBQUUsTUFBTTthQUNiO1NBQ0YsQ0FBQTtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWxDLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxTQUFjLEVBQUUsT0FBWSxFQUFFLEVBQU87UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDaEM7WUFDRSxJQUFJLEVBQUUsT0FBTztZQUNiLE9BQU87WUFDUCxFQUFFLEVBQUUsRUFBRTtTQUNQLEVBQ0Q7WUFDRSxFQUFFLEVBQUUsU0FBUztZQUNiLElBQUksRUFBRSxrQkFBa0I7U0FDekIsRUFDRDtZQUNFLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLEtBQUssR0FBRztZQUNaLFNBQVMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVM7WUFDekMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSTtZQUM1QyxJQUFJLEVBQUUsTUFBTTtZQUNaLEVBQUUsRUFBRSxFQUFFO1lBQ04sSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7Z0JBQ25CLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUTtnQkFDN0MsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLE1BQU07YUFDYjtTQUNGLENBQUE7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQTtRQUN0QyxNQUFNLE9BQU8sR0FBUSxNQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNsSSxJQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUE7WUFDdkMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLE1BQU07bUJBQ2xHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUc7b0JBQzFDLElBQUksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO29CQUNyRCxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRO29CQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7aUJBQ25FLENBQUE7YUFDRjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFBO1NBQ3hDO0lBQ0gsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtRQUN2Qiw2Q0FBNkM7SUFDL0MsQ0FBQztJQUVELG9CQUFvQjtJQUNwQix5Q0FBeUM7SUFDekMsaUVBQWlFO0lBQ2pFLDJDQUEyQztJQUMzQyxTQUFTO0lBQ1Qsd0JBQXdCO0lBQ3hCLGtCQUFrQjtJQUNsQiwwREFBMEQ7SUFDMUQsVUFBVTtJQUNWLFNBQVM7SUFDVCwwREFBMEQ7SUFDMUQsaUVBQWlFO0lBQ2pFLFVBQVU7SUFDVixTQUFTO0lBQ1Qsc0NBQXNDO0lBQ3RDLHdEQUF3RDtJQUN4RCxTQUFTO0lBQ1QsU0FBUztJQUNULElBQUk7SUFFSixnQkFBZ0IsQ0FBQyxVQUFlO1FBRTlCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO0lBQzFCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxTQUFjO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUUsVUFBVTtlQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVTtlQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVTtlQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVU7ZUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVTtVQUN4RjtZQUNBLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQTtZQUNyQiw0R0FBNEc7WUFDNUcsdUZBQXVGO1lBQ3ZGLElBQUk7WUFDSixrQ0FBa0M7WUFDbEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRTtnQkFDM0QsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUE7YUFDdkQ7WUFDRCwwRUFBMEU7WUFDMUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsaUJBQWlCLENBQUE7WUFDL0MsSUFBSTtZQUNKLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pFLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFBO2FBQzNEO1lBQ0QsZ0VBQWdFO1lBQ2hFLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtZQUM3QyxJQUFJO1lBQ0osSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRTtnQkFDOUQsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUE7YUFDM0Q7WUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO2dCQUMvRCxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDOUo7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ2hDO1lBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFDOUQ7Z0JBQ0EsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQTtnQkFDN0QsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQTthQUM5RDtZQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3RFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUE7YUFDcEU7WUFDRCxxREFBcUQ7WUFDckQsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO1lBQzlGLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtZQUM5RixJQUFJO1lBQ0osSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtnQkFDN0QsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQTthQUNsRTtpQkFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYztnQkFDMUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFDekQ7Z0JBQ0EsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQTthQUM3RjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsdUJBQXVCLENBQUMsR0FBRyxrQkFBa0IsQ0FBQTthQUN0RDtZQUNELElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2FBQ3ZJO2lCQUFNLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRTtnQkFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7YUFDNUk7aUJBQU0sSUFBSSxTQUFTLEtBQUssWUFBWSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTthQUM3STtTQUVGO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxDQUFNO1FBQ2xCLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDYixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUM1QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDakMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBRWpDLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNqRSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDckUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLE9BQU8sUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUE7SUFDdkMsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNqRSxPQUFPLGtCQUFrQixDQUFDLFNBQVMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRU8sNkJBQTZCO1FBQ25DLHlFQUF5RTtRQUN6RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFO1lBQzdNLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUE7WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUNoSSxDQUFDLFNBQWMsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFBO2dCQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtZQUN2QixDQUFDLEVBQ0QsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksMkNBQTJDLEVBQUUsR0FBRyxFQUFFO29CQUNoRyxRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUE7Z0JBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1lBQ3hCLENBQUMsQ0FDRixDQUFBO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3ZELENBQUMsSUFBSSxDQUFDLHVCQUF1QjtZQUM3QixJQUFJLENBQUMsU0FBUztZQUNkLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDckQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3BFLENBQUM7K0dBeGZVLHVCQUF1QiwrWkF5RHhCLGFBQWE7bUdBekRaLHVCQUF1QiwrT0NuQnBDLGs2ekJBeVhjOzs0RkR0V0QsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLDBCQUEwQjs7MEJBNkRqQyxNQUFNOzJCQUFDLGFBQWE7OzBCQUFHLFFBQVE7NENBMUNMLFNBQVM7c0JBQXJDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQWEzQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgT25Jbml0LCBPcHRpb25hbCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBDb21tb25NZXRob2RzU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBFdmVudFNlcnZpY2UsIE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsIFdpZGdldENvbnRlbnRTZXJ2aWNlLCBXc0V2ZW50cyB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvYWRlci5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJ1xuaW1wb3J0IHsgQ2VydGlmaWNhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2VydGlmaWNhdGUuc2VydmljZSdcbmltcG9ydCB7IE5zRGlzY3Vzc2lvblYyIH0gZnJvbSAnQHN1bmJpcmQtY2IvZGlzY3Vzc2lvbi12MidcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgTmV0Q29yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZXRjb3JlLnNlcnZpY2UnXG5pbXBvcnQgeyBDb25zZW50RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb25zZW50LWRpYWxvZy5jb21wb25lbnQnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLWFwcC1hcHAtdG9jLWNpb3MtaG9tZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLWNpb3MtaG9tZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtY2lvcy1ob21lLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFwcFRvY0Npb3NIb21lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgY29tbWVudElkPzogc3RyaW5nID0gJydcbiAgc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gIGV4dENvbnRlbnRSZWFkRGF0YTogYW55ID0ge31cbiAgdXNlckV4dENvdXJzZUVucm9sbDogYW55ID0ge31cbiAgZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgPSBmYWxzZVxuICBmb3JQcmV2aWV3OiBhbnkgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnP2VkaXRNb2RlPXRydWUnKVxuICBleHRDb250ZW50QXZhaWxhYmxlID0gdHJ1ZVxuICBjYW5FbnJvbGwgPSBmYWxzZVxuICBlbnJvbGxWYWxpZGF0aW9uTG9hZGluZyA9IHRydWVcbiAgcmNFbGVtID0ge1xuICAgIG9mZlNldFRvcDogMCxcbiAgICBCb3R0b21Qb3M6IDAsXG4gIH1cbiAgY29udGVudExpbms6IGFueSA9ICcnXG4gIEBWaWV3Q2hpbGQoJ3JpZ2h0Q29udGFpbmVyJykgcmNFbGVtZW50ITogRWxlbWVudFJlZlxuICBzY3JvbGxMaW1pdDogYW55XG4gIHNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIGlzTW9iaWxlID0gZmFsc2VcbiAgY29uZmlnOiBhbnlcbiAgd2lkZ2V0RGF0YTogYW55XG4gIGVuYWJsZVNoYXJlID0gZmFsc2VcbiAgcm9vdE9yZ0lkOiBhbnlcbiAgY3VycmVudExhbmc6IGFueSA9ICdlbidcbiAgZGlzY3Vzc1dpZGdldERhdGEhOiBOc0Rpc2N1c3Npb25WMi5JQ29tbWVudFdpZGdldERhdGFcbiAgc2hvd1Byb3ZpZGVyVGlwcyA9IGZhbHNlXG4gIGZyb21NRE8gPSBmYWxzZVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlU2Nyb2xsKCkge1xuXG4gICAgaWYgKHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgIGlmICgod2luZG93LnNjcm9sbFkgKyB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MpID49IHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgICAgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGlja3knXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIzNi4uLiAoT2Zmc2V0VG9wIG9mIHJpZ2h0IGNvbnRhaW5lciArIDEwNClcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAodGhpcy5yY0VsZW0ub2ZmU2V0VG9wICsgMTA0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlXG4gICAgfVxuICB9XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgY29tbW9uU3ZjOiBDb21tb25NZXRob2RzU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRzOiBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndHJhbnNsYXRpb25zOiBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZXJ0U3ZjOiBDZXJ0aWZpY2F0ZVNlcnZpY2UsXG4gICAgcHVibGljIGxvYWRlcjogTG9hZGVyU2VydmljZSxcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHVibGljIG5ldENvcmVTZXJ2aWNlOiBOZXRDb3JlU2VydmljZSxcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIEBPcHRpb25hbCgpIHByaXZhdGUgZW52aXJvbm1lbnQ6IGFueVxuICApIHtcbiAgICB0aGlzLnJvdXRlLmRhdGEuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuZW5yb2xsVmFsaWRhdGlvbkxvYWRpbmcgPSBmYWxzZVxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5leHRDb250ZW50ICYmIGRhdGEuZXh0Q29udGVudC5kYXRhICYmIGRhdGEuZXh0Q29udGVudC5kYXRhLmNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5leHRDb250ZW50UmVhZERhdGEgPSBkYXRhLmV4dENvbnRlbnQuZGF0YS5jb250ZW50XG4gICAgICAgIHRoaXMuZXh0Q29udGVudFJlYWREYXRhWydjZXJ0aWZpY2F0ZU9iaiddID0ge1xuICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4dENvbnRlbnRBdmFpbGFibGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS51c2VyRW5yb2xsQ29udGVudCAmJiBkYXRhLnVzZXJFbnJvbGxDb250ZW50LmRhdGEgJiYgZGF0YS51c2VyRW5yb2xsQ29udGVudC5kYXRhLnJlc3VsdCAmJlxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhLnVzZXJFbnJvbGxDb250ZW50LmRhdGEucmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51c2VyRXh0Q291cnNlRW5yb2xsID0gZGF0YS51c2VyRW5yb2xsQ29udGVudC5kYXRhLnJlc3VsdFxuICAgICAgICBpZiAodGhpcy51c2VyRXh0Q291cnNlRW5yb2xsLmNvbXBsZXRpb25wZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YVsnY29tcGxldGlvblN0YXR1cyddID0gMlxuXG4gICAgICAgICAgdGhpcy5kb3dubG9hZENlcnQoKVxuICAgICAgICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ2NvbXBsZXRpb24nKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbGlkYXRlRW5yb2xsbWVudEVsaWdpYmlsaXR5KClcbiAgICAgIH1cblxuICAgIH0pXG5cbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuICAgICAgdGhpcy5jdXJyZW50TGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZSh0aGlzLmN1cnJlbnRMYW5nKVxuICAgIH1cbiAgICB0aGlzLmNvbmZpZ1N2Yy5sYW5ndWFnZVRyYW5zbGF0aW9uRmxhZy5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudExhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykhXG4gICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKHRoaXMuY3VycmVudExhbmcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICB0aGlzLnJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZFxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRMaW5rID0gYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cmluZygxKX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9YFxuXG4gICAgdGhpcy5jb21tZW50SWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmNvbW1lbnRJZCA/IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuY29tbWVudElkIDogJydcbiAgICBpZiAodGhpcy5jb21tZW50SWQpIHtcbiAgICAgIC8vdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMlxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGFcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURpc2N1c3NEYXRhKClcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEyMDApIHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSBmYWxzZVxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCd2aWV3JylcbiAgfVxuXG4gIGluaXRpYWxpemVEaXNjdXNzRGF0YSgpIHtcbiAgICBpZiAoIV8uZ2V0KHRoaXMuZXh0Q29udGVudFJlYWREYXRhLCAnY29udGVudFBhcnRuZXIuaXNBY3RpdmUnLCBmYWxzZSkpIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignQ291cnNlcyBmcm9tIHRoaXMgbGVhcm5pbmcgcGFydG5lciBhcmUgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSBvbiBpR09UIEthcm1heW9naS4gT3VyIHRlYW0gaXMgdXBkYXRpbmcgcGFydG5lciBjb250ZW50LiBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gY29udGludWUgeW91ciBqb3VybmV5IHdpdGggY291cnNlcyBmcm9tIG90aGVyIHBhcnRuZXJzLicsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMTAwMDAsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoIV8uZ2V0KHRoaXMuZXh0Q29udGVudFJlYWREYXRhLCAnaXNBY3RpdmUnLCBmYWxzZSkpIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignVGhpcyBjb3Vyc2UgaXMgbm8gbG9uZ2VyIGJlaW5nIG9mZmVyZWQgaW4gaXRzIGN1cnJlbnQgZm9ybS4gV2UgYXJlIHVwZGF0aW5nIG91ciBjYXRhbG9nIHRvIGJyaW5nIHlvdSBpbXByb3ZlZCBsZWFybmluZyBvcHRpb25zLiBQbGVhc2UgY2hvb3NlIGFub3RoZXIgY291cnNlIHdpdGggc2ltaWxhciB0b3BpY3Mgb3IgYnJvd3NlIHJlY29tbWVuZGVkIGNvdXJzZXMuJywgJ1gnLCB7XG4gICAgICAgIGR1cmF0aW9uOiAxMDAwMCxcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5kaXNjdXNzV2lkZ2V0RGF0YSkge1xuICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YSA9IHRoaXMuY29uZmlnLmRpc2N1c3NXaWRnZXREYXRhXG4gICAgICBpZiAodGhpcy5leHRDb250ZW50UmVhZERhdGEgJiYgdGhpcy5leHRDb250ZW50UmVhZERhdGEuY29udGVudElkKSB7XG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEubmV3Q29tbWVudFNlY3Rpb24uY29tbWVudFRyZWVEYXRhLmVudGl0eUlkID0gdGhpcy5leHRDb250ZW50UmVhZERhdGEuY29udGVudElkXG4gICAgICAgIGlmICh0aGlzLmRpc2N1c3NXaWRnZXREYXRhLmNvbW1lbnRzTGlzdC5yZXBsaWVzU2VjdGlvbiAmJiB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLmNvbW1lbnRzTGlzdC5yZXBsaWVzU2VjdGlvbi5uZXdDb21tZW50UmVwbHkpIHtcbiAgICAgICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLmNvbW1lbnRzTGlzdC5yZXBsaWVzU2VjdGlvbi5uZXdDb21tZW50UmVwbHkuY29tbWVudFRyZWVEYXRhLmVudGl0eUlkID0gdGhpcy5leHRDb250ZW50UmVhZERhdGEuY29udGVudElkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMud2lkZ2V0RGF0YSA9IHtcbiAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgIHR5cGU6ICd0aXBzJyxcbiAgICAgICAgY2FyZENsYXNzOiAnc2xpZGVyLWNvbnRhaW5lcicsXG4gICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICBzbGlkZXJEYXRhOiBfLmdldCh0aGlzLmV4dENvbnRlbnRSZWFkRGF0YSwgJ2NvbnRlbnRQYXJ0bmVyLnByb3ZpZGVyVGlwcycsIFtdKVxuICAgICAgfVxuICAgICAgdGhpcy5zaG93UHJvdmlkZXJUaXBzID0gKHRoaXMud2lkZ2V0RGF0YSAmJiB0aGlzLndpZGdldERhdGEuc2xpZGVyRGF0YT8ubGVuZ3RoKSAmJlxuICAgICAgICAoT2JqZWN0LmtleXModGhpcy51c2VyRXh0Q291cnNlRW5yb2xsKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgKHRoaXMudXNlckV4dENvdXJzZUVucm9sbD8uaXNzdWVkX2NlcnRpZmljYXRlcz8ubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHRoaXMudXNlckV4dENvdXJzZUVucm9sbD8ucHJvZ3Jlc3MgPD0gMTAwKSlcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEuZW5yb2xsZWRDb250ZW50ID0gdHJ1ZVxuICAgICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLm5ld0NvbW1lbnRTZWN0aW9uLmNvbW1lbnRCb3gucGxhY2Vob2xkZXIgPSAnU3RhcnQgYSBkaXNjdXNzaW9uJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5lbnJvbGxlZENvbnRlbnQgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhLm5ld0NvbW1lbnRTZWN0aW9uLmNvbW1lbnRCb3gucGxhY2Vob2xkZXIgPSAnRW5yb2wgdG8gYWRkIHlvdXIgY29tbWVudHMnXG4gICAgICB9XG4gICAgICB0aGlzLmRpc2N1c3NXaWRnZXREYXRhID0geyAuLi50aGlzLmRpc2N1c3NXaWRnZXREYXRhIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVDYXBpdGFsaXplKHN0cjogc3RyaW5nLCB0eXBlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tb25TdmMuaGFuZGxlQ2FwaXRhbGl6ZShzdHIsIHR5cGUpXG4gIH1cblxuICB0cmFuc2xhdGVMYWJlbHMobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbChsYWJlbCwgdHlwZSwgJycpXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMucmNFbGVtZW50KSB7XG4gICAgICB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCArIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICB0aGlzLnJjRWxlbS5vZmZTZXRUb3AgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcFxuICAgIH1cbiAgfVxuICByZWRpcmVjdFRvQ29udGVudChjb250ZW50RGF0YTogYW55KSB7XG4gICAgY29uc3QgdXNlckRhdGE6IGFueSA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlVjJcbiAgICBjb25zdCBleHRVcmw6IHN0cmluZyA9IGNvbnRlbnREYXRhLnJlZGlyZWN0VXJsLnJlcGxhY2UoJzx1c2VybmFtZT4nLCB1c2VyRGF0YS5lbWFpbClcbiAgICByZXR1cm4gZXh0VXJsXG4gIH1cbiAgcmVwbGFjZVRleHQoc3RyOiBhbnksIHJlcGxhY2VUeHQ6IGFueSkge1xuICAgIHJldHVybiBzdHIucmVwbGFjZUFsbChyZXBsYWNlVHh0LCAnJylcbiAgfVxuXG4gIGZvcm1hdGNvdXJzZVByb3ZpZGVycyhwcm92aWRlcnM6IGFueVtdKTogc3RyaW5nIHtcbiAgICBpZiAoIXByb3ZpZGVycyB8fCAhQXJyYXkuaXNBcnJheShwcm92aWRlcnMpKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgcmV0dXJuIHByb3ZpZGVycy5tYXAoKHByb3ZpZGVyOiBhbnkpID0+IHByb3ZpZGVyLm5hbWUpLmpvaW4oJywgJylcbiAgfVxuXG4gIGFzeW5jIGVuUm9sbFRvRXh0Q291cnNlKGNvbnRlbnQ6IGFueSkge1xuICAgIGNvbnN0IGNvbnNlbnRVcmw6IHN0cmluZyA9IGAke3RoaXMuZW52aXJvbm1lbnQ/Lm1pc3Npb25LYXJtYXlvZ2lQYXRofSR7dGhpcy5jb25maWc/LmNvbnRlbnRDb25zZW50Py5jb25zZW50RG9jVXJsfWAgfHwgJydcbiAgICBjb25zdCBhc3NldHNEb2NVcmw6IHN0cmluZyA9IGAke3RoaXMuY29uZmlnPy5jb250ZW50Q29uc2VudD8uYXNzZXRzRG9jVXJsfWAgfHwgJydcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm1hdERpYWxvZy5vcGVuKENvbnNlbnREaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnOTAwcHgnLFxuICAgICAgaGVpZ2h0OiAnNzB2aCcsXG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JyxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgcGFuZWxDbGFzczogJ2NvbnNlbnQtZGlhbG9nLXBhbmVsJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29uc2VudFVybDogY29uc2VudFVybCxcbiAgICAgICAgYXNzZXRzRG9jVXJsOiBhc3NldHNEb2NVcmxcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gSGFuZGxlIGRpYWxvZyBjbG9zZVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIC8vIFVzZXIgYWdyZWVkIC0gcHJvY2VlZCB3aXRoIGVucm9sbG1lbnRcbiAgICAgICAgLy8gbmVlZCB0byBjYWxsIGNvbnNlbnQgYXBpXG4gICAgICAgIHRoaXMuY2FsbENvbnNlbnRBcGkoY29udGVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZXIgZGlzYWdyZWVkXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignWW91IG11c3QgYWdyZWUgdG8gdGhlIHRlcm1zIHRvIGVucm9sbCBpbiB0aGlzIGNvdXJzZS4nLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2FsbENvbnNlbnRBcGkoY29udGVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coY29udGVudClcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgXCJjb250ZW50SWRcIjogY29udGVudD8uY29udGVudElkLFxuICAgICAgICBcImNvbnNlbnRJZFwiOiB0aGlzLmNvbmZpZz8uY29udGVudENvbnNlbnQ/LmNvbnNlbnRJZCB8fCAnJyxcbiAgICAgICAgXCJhZGRpdGlvbmFsQXR0cmlidXRlc1wiOiB7XG4gICAgICAgICAgXCJ1c2VyUm9sZXNcIjogW1wicHVibGljXCJdLFxuICAgICAgICAgIFwidmVyc2lvbktleVwiOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiSSBoYXZlIHJlYWQgYW5kIGFncmVlIHdpdGggdGhlIGFib3ZlIGRlY2xhcmF0aW9uLlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNlcnRTdmMuY29uc2VudFN1Ym1pdChyZXF1ZXN0KS5zdWJzY3JpYmUoKF9yZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5wcm9jZWVkV2l0aEVucm9sbG1lbnQoY29udGVudClcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yPy5lcnJvcj8ucGFyYW1zPy5tc2cgfHwgJ1VuYWJsZSB0byBzdWJtaXQgY29uc2VudCcsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuICBwcml2YXRlIGFzeW5jIHByb2NlZWRXaXRoRW5yb2xsbWVudChjb250ZW50OiBhbnkpIHtcbiAgICB0aGlzLmxvYWRlci5jaGFuZ2VMb2FkLm5leHQodHJ1ZSlcbiAgICBjb25zdCByZXFib2R5ID0ge1xuICAgICAgY291cnNlSWQ6IGNvbnRlbnQuY29udGVudElkLFxuICAgICAgcGFydG5lcklkOiBjb250ZW50LmNvbnRlbnRQYXJ0bmVyLmlkLFxuICAgIH1cbiAgICBjb25zdCBlbnJvbGxSZXMgPSBhd2FpdCB0aGlzLmNvbnRlbnRTdmMuZXh0Q29udGVudEVucm9sbChyZXFib2R5KS50b1Byb21pc2UoKS5jYXRjaChfZXJyb3IgPT4geyByZXR1cm4gX2Vycm9yIH0pXG4gICAgaWYgKGVucm9sbFJlcyAmJiBlbnJvbGxSZXMucmVzdWx0ICYmIE9iamVjdC5rZXlzKGVucm9sbFJlcy5yZXN1bHQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGlzY3Vzc1dpZGdldERhdGEuZW5yb2xsZWRDb250ZW50ID0gdHJ1ZVxuICAgICAgdGhpcy5kaXNjdXNzV2lkZ2V0RGF0YS5uZXdDb21tZW50U2VjdGlvbi5jb21tZW50Qm94LnBsYWNlaG9sZGVyID0gJ1N0YXJ0IGEgZGlzY3Vzc2lvbidcbiAgICAgIHRoaXMuZ2V0VXNlckNvbnRlbnRFbnJvbGwoY29udGVudC5jb250ZW50SWQpXG4gICAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCdlbnJvbGwnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRlci5jaGFuZ2VMb2FkLm5leHQoZmFsc2UpXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZW5yb2xsUmVzPy5lcnJvcj8ucGFyYW1zPy5tc2cgfHwgJ1VuYWJsZSB0byBlbnJvbGwgdG8gdGhlIGNvbnRlbnQnLCAnWCcsIHtcbiAgICAgICAgZHVyYXRpb246IDEwMDAwLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRVc2VyQ29udGVudEVucm9sbChjb250ZW50SWQ6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbFJlcyA9IGF3YWl0IHRoaXMuY29udGVudFN2Yy5mZXRjaEV4dFVzZXJDb250ZW50RW5yb2xsKGNvbnRlbnRJZCkudG9Qcm9taXNlKCkuY2F0Y2goX2Vycm9yID0+IHsgfSlcbiAgICBpZiAoZW5yb2xsUmVzICYmIGVucm9sbFJlcy5yZXN1bHQgJiYgT2JqZWN0LmtleXMoZW5yb2xsUmVzLnJlc3VsdCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51c2VyRXh0Q291cnNlRW5yb2xsID0gZW5yb2xsUmVzLnJlc3VsdFxuICAgICAgdGhpcy5sb2FkZXIuY2hhbmdlTG9hZC5uZXh0KGZhbHNlKVxuICAgICAgdGhpcy50ZWxlbWV0cnlUb0NhcHR1cmVJbnRlcmFjdChjb250ZW50SWQsICdlbnJvbGwnLCAnZW5yb2wtY29udGVudCcpXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1N1Y2Nlc3NmdWxseSBlbnJvbGxlZCBpbiB0aGUgY291cnNlLicpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZGVyLmNoYW5nZUxvYWQubmV4dChmYWxzZSlcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignVW5hYmxlIHRvIGdldCB0aGUgZW5yb2xsZWQgZGV0YWlscycpXG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZVJlZGlyZWN0VGVsZW1ldHJ5KGNvbnRlbnQ6IGFueSkge1xuICAgIHRoaXMucmFpc2VUZWxlbXRyeVN0YXJ0RXZlbnQoKVxuICAgIHRoaXMudGVsZW1ldHJ5VG9DYXB0dXJlSW50ZXJhY3QoY29udGVudC5jb250ZW50SWQsICdyZWRpcmVjdCcsICdyZWRpcmVjdC1jb250ZW50JylcbiAgICB0aGlzLnJhaXNlVGVsZW10cnlFbmRFdmVudCgpXG4gIH1cblxuICByYWlzZVRlbGVtdHJ5U3RhcnRFdmVudCgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBmcm9tOiAndGVzdCcsXG4gICAgICB0bzogJycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICcnIH0sXG4gICAgICAgIG9iamVjdDoge30sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQsXG4gICAgICAgIHR5cGU6ICdzZXNzaW9uJyxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICB9XG4gICAgdGhpcy5ldmVudHMuZGlzcGF0Y2hFdmVudChldmVudClcblxuICB9XG5cbiAgdGVsZW1ldHJ5VG9DYXB0dXJlSW50ZXJhY3QoY29udGVudElkOiBhbnksIHN1YlR5cGU6IGFueSwgaWQ6IGFueSkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGUsXG4gICAgICAgIGlkOiBpZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBjb250ZW50SWQsXG4gICAgICAgIHR5cGU6ICdFeHRlcm5hbCBjb250ZW50JyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1vZHVsZTogJ0hvbWUnLFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHJhaXNlVGVsZW10cnlFbmRFdmVudCgpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBmcm9tOiAndGVzdCcsXG4gICAgICB0bzogJycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICcnIH0sXG4gICAgICAgIG9iamVjdDoge30sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5VbmxvYWRlZCxcbiAgICAgICAgdHlwZTogJ3Nlc3Npb24nLFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgIH1cbiAgICB0aGlzLmV2ZW50cy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICB9XG5cbiAgYXN5bmMgZG93bmxvYWRDZXJ0KCkge1xuICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgPSB0cnVlXG4gICAgY29uc3QgY2VydFJlczogYW55ID0gYXdhaXRcbiAgICAgIHRoaXMuY2VydFN2Yy5kb3dubG9hZENlcnRpZmljYXRlX3YyKHRoaXMudXNlckV4dENvdXJzZUVucm9sbC5pc3N1ZWRfY2VydGlmaWNhdGVzWzBdLmlkZW50aWZpZXIpLnRvUHJvbWlzZSgpLmNhdGNoKF9lcnJvciA9PiB7IH0pXG4gICAgaWYgKGNlcnRSZXMgJiYgT2JqZWN0LmtleXMoY2VydFJlcy5yZXN1bHQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgPSBmYWxzZVxuICAgICAgaWYgKHRoaXMudXNlckV4dENvdXJzZUVucm9sbC5pc3N1ZWRfY2VydGlmaWNhdGVzICYmIHRoaXMudXNlckV4dENvdXJzZUVucm9sbC5pc3N1ZWRfY2VydGlmaWNhdGVzLmxlbmd0aFxuICAgICAgICAmJiB0aGlzLnVzZXJFeHRDb3Vyc2VFbnJvbGwuaXNzdWVkX2NlcnRpZmljYXRlc1swXSkge1xuICAgICAgICB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YVsnY2VydGlmaWNhdGVPYmonXSA9IHtcbiAgICAgICAgICBkYXRhOiB0aGlzLnVzZXJFeHRDb3Vyc2VFbnJvbGwuaXNzdWVkX2NlcnRpZmljYXRlc1swXSxcbiAgICAgICAgICBjZXJ0RGF0YTogY2VydFJlcy5yZXN1bHQucHJpbnRVcmksXG4gICAgICAgICAgY2VydElkOiB0aGlzLnVzZXJFeHRDb3Vyc2VFbnJvbGwuaXNzdWVkX2NlcnRpZmljYXRlc1swXS5pZGVudGlmaWVyLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgPSBmYWxzZVxuICAgIH1cbiAgfVxuICBvbkNsaWNrT2ZTaGFyZSgpIHtcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gdHJ1ZVxuICAgIC8vdGhpcy5yYWlzZVRlbGVtZXRyeUZvclNoYXJlKCdzaGFyZUNvbnRlbnQnKVxuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgLy8gcmFpc2VUZWxlbWV0cnlGb3JTaGFyZShzdWJUeXBlOiBhbnkpIHtcbiAgLy8gICAvL2NvbnNvbGUubG9nKHRoaXMuZXh0Q29udGVudFJlYWREYXRhLCB0aGlzLmV2ZW50cywgc3ViVHlwZSlcbiAgLy8gICAvLyB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAvLyAgIC8vIHtcbiAgLy8gICAvLyAgIHR5cGU6ICdjbGljaycsXG4gIC8vICAgLy8gICBzdWJUeXBlLFxuICAvLyAgIC8vICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gIC8vICAgLy8gfSxcbiAgLy8gICAvLyB7XG4gIC8vICAgLy8gICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgLy8gICAvLyAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgLy8gICAvLyB9LFxuICAvLyAgIC8vIHtcbiAgLy8gICAvLyAgIHBhZ2VJZEV4dDogYGJ0bi0ke3N1YlR5cGV9YCxcbiAgLy8gICAvLyAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgLy8gICAvLyB9XG4gIC8vICAgLy8gKVxuICAvLyB9XG5cbiAgcmVzZXRFbmFibGVTaGFyZShfZXZlbnREYXRhOiBhbnkpIHtcblxuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSBmYWxzZVxuICB9XG5cbiAgY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoZXZlbnRUeXBlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcgIC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5pc0FjdGl2ZSAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzIC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5ldmVudHMuY29udGVudF92aWV3IC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5ldmVudHMuY29udGVudF92aWV3LmlzQWN0aXZlIC8vIE5PU09OQVJcbiAgICApIHtcbiAgICAgIGxldCBwYXlsb2FkOiBhbnkgPSB7fVxuICAgICAgLy8gaWYgKHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlciAmJiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllcikgeyAvLyBOT1NPTkFSXG4gICAgICAvLyAgIHBheWxvYWRbJ3BrXnVzZXJpZCddID0gdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdwYXlsb2FkJywgcGF5bG9hZClcbiAgICAgIGlmICh0aGlzLmV4dENvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5uYW1lKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfbmFtZSddID0gdGhpcy5leHRDb250ZW50UmVhZERhdGEubmFtZVxuICAgICAgfVxuICAgICAgLy8gaWYodGhpcy5leHRDb250ZW50UmVhZERhdGEgJiYgdGhpcy5leHRDb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkpIHtcbiAgICAgIHBheWxvYWRbJ2NvbnRlbnRfY2F0ZWdvcnknXSA9ICdFeHRlcm5hbCBDb3Vyc2UnXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5leHRDb250ZW50UmVhZERhdGEgJiYgdGhpcy5leHRDb250ZW50UmVhZERhdGEuZXh0ZXJuYWxJZCkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2lkJ10gPSB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5leHRlcm5hbElkXG4gICAgICB9XG4gICAgICAvLyBpZih0aGlzLmV4dENvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5uYW1lKSB7XG4gICAgICBwYXlsb2FkWydjb250ZW50X3VybCddID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmV4dENvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5hcHBJY29uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfaW1hZ2UnXSA9IHRoaXMuZXh0Q29udGVudFJlYWREYXRhLmFwcEljb25cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmV4dENvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5kdXJhdGlvbikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2R1cmF0aW9uJ10gPSB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5kdXJhdGlvbiAmJiBOdW1iZXIodGhpcy5leHRDb250ZW50UmVhZERhdGEuZHVyYXRpb24pID4gMCA/IE51bWJlcih0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5kdXJhdGlvbikgOiAwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2R1cmF0aW9uJ10gPSAwXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5leHRDb250ZW50UmVhZERhdGEgJiYgdGhpcy5leHRDb250ZW50UmVhZERhdGEuYXZnUmF0aW5nXG4gICAgICApIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9yYXRpbmcnXSA9IHRoaXMuZXh0Q29udGVudFJlYWREYXRhLmF2Z1JhdGluZ1xuICAgICAgICBwYXlsb2FkWydjb250ZW50IHJhdGluZyddID0gdGhpcy5leHRDb250ZW50UmVhZERhdGEuYXZnUmF0aW5nXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5leHRDb250ZW50UmVhZERhdGEgJiYgdGhpcy5leHRDb250ZW50UmVhZERhdGEudG90YWxOb09mUmF0aW5nKSB7XG4gICAgICAgIHBheWxvYWRbJ25vX3VzZXJzX3JhdGVkJ10gPSB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS50b3RhbE5vT2ZSYXRpbmdcbiAgICAgIH1cbiAgICAgIC8vIGlmKE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoKSB7XG4gICAgICBwYXlsb2FkWydsZWFybmluZ19wYXRoX2NvbnRlbnQnXSA9IE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICBwYXlsb2FkWydsZWFybmluZyBwYXRoIGNvbnRlbnQnXSA9IE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5leHRDb250ZW50UmVhZERhdGEgJiYgdGhpcy5leHRDb250ZW50UmVhZERhdGEuc291cmNlKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcHJvdmlkZXJfbmFtZSddID0gdGhpcy5leHRDb250ZW50UmVhZERhdGEuc291cmNlXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZXh0Q29udGVudFJlYWREYXRhICYmIHRoaXMuZXh0Q29udGVudFJlYWREYXRhLmNvbnRlbnRQYXJ0bmVyICYmXG4gICAgICAgIHRoaXMuZXh0Q29udGVudFJlYWREYXRhLmNvbnRlbnRQYXJ0bmVyLmNvbnRlbnRQYXJ0bmVyTmFtZVxuICAgICAgKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcHJvdmlkZXJfbmFtZSddID0gdGhpcy5leHRDb250ZW50UmVhZERhdGEuY29udGVudFBhcnRuZXIuY29udGVudFBhcnRuZXJOYW1lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X3Byb3ZpZGVyX25hbWUnXSA9ICdLYXJtYXlvZ2kgQmhhcmF0J1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgIHRoaXMubmV0Q29yZVNlcnZpY2UudHJhY2tFdmVudEZvckNvbnRlbnRBbmRFdmVudCgnY29udGVudF92aWV3JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2Vucm9sbCcpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X2Vucm9sbWVudCcsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdjb21wbGV0aW9uJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfY29tcGxldGlvbicsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgc2Vjb25kc1RvVGltZShkOiBhbnkpIHtcbiAgICBkID0gTnVtYmVyKGQpXG4gICAgdmFyIGggPSBNYXRoLmZsb29yKGQgLyAzNjAwKVxuICAgIHZhciBtID0gTWF0aC5mbG9vcihkICUgMzYwMCAvIDYwKVxuICAgIHZhciBzID0gTWF0aC5mbG9vcihkICUgMzYwMCAlIDYwKVxuXG4gICAgdmFyIGhEaXNwbGF5ID0gaCA+IDAgPyBoICsgKGggPT0gMSA/IFwiIGhvdXIsIFwiIDogXCIgaG91cnMsIFwiKSA6IFwiXCJcbiAgICB2YXIgbURpc3BsYXkgPSBtID4gMCA/IG0gKyAobSA9PSAxID8gXCIgbWludXRlLCBcIiA6IFwiIG1pbnV0ZXMsIFwiKSA6IFwiXCJcbiAgICB2YXIgc0Rpc3BsYXkgPSBzID4gMCA/IHMgKyAocyA9PSAxID8gXCIgc2Vjb25kXCIgOiBcIiBzZWNvbmRzXCIpIDogXCJcIlxuICAgIHJldHVybiBoRGlzcGxheSArIG1EaXNwbGF5ICsgc0Rpc3BsYXlcbiAgfVxuXG4gIGNsZWFyQ29tbWVudElkRnJvbVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50UXVlcnlQYXJhbXMgPSB7IC4uLnRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfVxuICAgIGRlbGV0ZSBjdXJyZW50UXVlcnlQYXJhbXMuY29tbWVudElkXG4gICAgdGhpcy5jb21tZW50SWQgPSAnJ1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVucm9sbG1lbnRFbGlnaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIHVzZXIgaXMgbm90IGFscmVhZHkgZW5yb2xsZWQgYW5kIGNvbnRlbnQgaXMgYXZhaWxhYmxlXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoID09PSAwICYmIHRoaXMuZXh0Q29udGVudFJlYWREYXRhICYmIHRoaXMuZXh0Q29udGVudFJlYWREYXRhLmNvbnRlbnRJZCAmJiB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5jb250ZW50UGFydG5lciAmJiB0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5jb250ZW50UGFydG5lci5pZCkge1xuICAgICAgdGhpcy5lbnJvbGxWYWxpZGF0aW9uTG9hZGluZyA9IHRydWVcbiAgICAgIHRoaXMuY2VydFN2Yy52YWxpZGF0ZUVucm9sbG1lbnRFbGlnaWJpbGl0eSh0aGlzLmV4dENvbnRlbnRSZWFkRGF0YS5jb250ZW50SWQsIHRoaXMuZXh0Q29udGVudFJlYWREYXRhLmNvbnRlbnRQYXJ0bmVyLmlkKS5zdWJzY3JpYmUoXG4gICAgICAgIChfcmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5yb2xsVmFsaWRhdGlvbkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuY2FuRW5yb2xsID0gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LnBhcmFtcz8ubXNnIHx8ICdVbmFibGUgdG8gdmFsaWRhdGUgZW5yb2xsbWVudCBlbGlnaWJpbGl0eScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDEwMDAwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5lbnJvbGxWYWxpZGF0aW9uTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5jYW5FbnJvbGwgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dFbnJvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoID09PSAwICYmXG4gICAgICAhdGhpcy5lbnJvbGxWYWxpZGF0aW9uTG9hZGluZyAmJlxuICAgICAgdGhpcy5jYW5FbnJvbGwgJiZcbiAgICAgIF8uZ2V0KHRoaXMuZXh0Q29udGVudFJlYWREYXRhLCAnY29udGVudFBhcnRuZXIuaXNBY3RpdmUnLCBmYWxzZSlcbiAgfVxuXG4gIGdldCBzaG93UmVkaXJlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckV4dENvdXJzZUVucm9sbCkubGVuZ3RoID4gMCAmJlxuICAgICAgXy5nZXQodGhpcy5leHRDb250ZW50UmVhZERhdGEsICdyZWRpcmVjdFVybCcpICYmXG4gICAgICBfLmdldCh0aGlzLmV4dENvbnRlbnRSZWFkRGF0YSwgJ2NvbnRlbnRQYXJ0bmVyLmlzQWN0aXZlJywgZmFsc2UpXG4gIH1cblxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4dENvbnRlbnRBdmFpbGFibGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidG9jLWJhbm5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1kZXRhaWxzIHRvYy1jb250ZW50XCIgI2Jhbm5lckRldGFpbHM+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMzJweCdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxNDBweCdcIiBbaGVpZ2h0XT1cIicyNHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdGFnLWRpdiByb3VuZGVkLTJ4bCBnYXAtMSBpdGVtcy1jZW50ZXIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dFwiPnZpZGVvX2xpYnJhcnk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTNcIj57eyB0cmFuc2xhdGVMYWJlbChjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4dENvbnRlbnRSZWFkRGF0YT8udG9waWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctM1wiPnt7ICdFeHRlcm5hbCBDb3Vyc2UnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtd2hpdGUgbW9iLXNoYXJlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJvbkNsaWNrT2ZTaGFyZSgpXCI+c2hhcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEtub3dsZWRnZSBsZXZlbCBibG9jayAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJleHRDb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbCB8fCBleHRDb250ZW50UmVhZERhdGE/Lmtub3dsZWRnZUxldmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImtub3dsZWRnZS1sZXZlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImV4dENvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsPy50b0xvd2VyQ2FzZSgpID09PSAnYmVnaW5uZXInIHx8IGV4dENvbnRlbnRSZWFkRGF0YT8ua25vd2xlZGdlTGV2ZWw/LnRvTG93ZXJDYXNlKCkgPT09ICdiZWdpbm5lcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGJlZ2lubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiI0RCRjREQ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NyA1QzcuNjc5MjcgNC41NTU1NSA4LjMyMDc3IDQuNTU1NTYgOC41NzczNyA1TDEyLjA0MTUgMTFDMTIuMjk4MSAxMS40NDQ0IDExLjk3NzMgMTIgMTEuNDY0MSAxMkg0LjUzNTkyQzQuMDIyNzIgMTIgMy43MDE5NyAxMS40NDQ0IDMuOTU4NTcgMTFMNy40MjI2NyA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0OUM5NTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tleHRDb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbCB8fCBleHRDb250ZW50UmVhZERhdGE/Lmtub3dsZWRnZUxldmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHRDb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2ludGVybWVkaWF0ZScgfHwgZXh0Q29udGVudFJlYWREYXRhPy5rbm93bGVkZ2VMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2ludGVybWVkaWF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGludGVybWVkaWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIiNEMURCRUNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgMi42NjY2NkM3LjY3OTI3IDIuMjIyMjEgOC4zMjA3NyAyLjIyMjIxIDguNTc3MzcgMi42NjY2NkwxMi4wNDE1IDguNjY2NjZDMTIuMjk4MSA5LjExMTEgMTEuOTc3MyA5LjY2NjY2IDExLjQ2NDEgOS42NjY2Nkg0LjUzNTkyQzQuMDIyNzIgOS42NjY2NiAzLjcwMTk3IDkuMTExMSAzLjk1ODU3IDguNjY2NjZMNy40MjI2NyAyLjY2NjY2WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxQjRDQTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgNS42NjY2NkM3LjY3OTI3IDUuMjIyMjEgOC4zMjA3NyA1LjIyMjIxIDguNTc3MzcgNS42NjY2NkwxMi4wNDE1IDExLjY2NjdDMTIuMjk4MSAxMi4xMTExIDExLjk3NzMgMTIuNjY2NyAxMS40NjQxIDEyLjY2NjdINC41MzU5MkM0LjAyMjcyIDEyLjY2NjcgMy43MDE5NyAxMi4xMTExIDMuOTU4NTcgMTEuNjY2N0w3LjQyMjY3IDUuNjY2NjZaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzFCNENBMVwiIHN0cm9rZT1cIiNEMURCRUNcIiBzdHJva2Utd2lkdGg9XCIwLjVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tleHRDb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbCB8fCBleHRDb250ZW50UmVhZERhdGE/Lmtub3dsZWRnZUxldmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHRDb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2FkdmFuY2VkJyB8fCBleHRDb250ZW50UmVhZERhdGE/Lmtub3dsZWRnZUxldmVsPy50b0xvd2VyQ2FzZSgpID09PSAnYWR2YW5jZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsZXZlbC1iYWRnZSBhZHZhbmNlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiI0ZGRTZFMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY0IDIuMzMzMzRDNy42NzkyNCAxLjg4ODkgOC4zMjA3NCAxLjg4ODkgOC41NzczNCAyLjMzMzM0TDEyLjA0MTQgOC4zMzMzNEMxMi4yOTggOC43Nzc3OSAxMS45NzczIDkuMzMzMzQgMTEuNDY0MSA5LjMzMzM0SDQuNTM1ODlDNC4wMjI2OSA5LjMzMzM0IDMuNzAxOTQgOC43Nzc3OSAzLjk1ODU0IDguMzMzMzRMNy40MjI2NCAyLjMzMzM0WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNUM3LjY3OTI0IDQuNTU1NTUgOC4zMjA3NCA0LjU1NTU2IDguNTc3MzQgNUwxMi4wNDE0IDExQzEyLjI5OCAxMS40NDQ0IDExLjk3NzMgMTIgMTEuNDY0MSAxMkg0LjUzNTg5QzQuMDIyNjkgMTIgMy43MDE5NCAxMS40NDQ0IDMuOTU4NTQgMTFMNy40MjI2NCA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgc3Ryb2tlPVwiI0ZGRTZFMVwiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY0IDcuNjY2NjlDNy42NzkyNCA3LjIyMjI0IDguMzIwNzQgNy4yMjIyNCA4LjU3NzM0IDcuNjY2NjlMMTIuMDQxNCAxMy42NjY3QzEyLjI5OCAxNC4xMTExIDExLjk3NzMgMTQuNjY2NyAxMS40NjQxIDE0LjY2NjdINC41MzU4OUM0LjAyMjY5IDE0LjY2NjcgMy43MDE5NCAxNC4xMTExIDMuOTU4NTQgMTMuNjY2N0w3LjQyMjY0IDcuNjY2NjlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGRjgyNjhcIiBzdHJva2U9XCIjRkZFNkUxXCIgc3Ryb2tlLXdpZHRoPVwiMC41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZXh0Q29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWwgfHwgZXh0Q29udGVudFJlYWREYXRhPy5rbm93bGVkZ2VMZXZlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5MCUnXCIgW2hlaWdodF09XCInMzJweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItdGV4dCB0ZXh0LWJhc2Ugc206dGV4dC00eGwgbGVhZGluZy02IHNtOmxlYWRpbmctMTAgZm9udC1ib2xkXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2FwaXRhbGl6ZShleHRDb250ZW50UmVhZERhdGE/Lm5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gc206dGV4dC1iYXNlIHNvdXJjZS10ZXh0IGZvbnQtc2VtaWJvbGQgYnJlYWstd29yZHNcIiAjY29udGVudFNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NvdXJjZUVsbGlwc2lzJzogc291cmNlRWxsaXBzaXN9XCIgdGl0bGU9XCJ7e2NvbnRlbnQ/LnNvdXJjZX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdjYXJkY29udGVudHYyLmJ5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImV4dENvbnRlbnRSZWFkRGF0YT8uY29udGVudFBhcnRuZXI/LmNvbnRlbnRQYXJ0bmVyTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJleHRDb250ZW50UmVhZERhdGE/LmNvdXJzZVByb3ZpZGVyPy5sZW5ndGg7ZWxzZSBjb250ZW50UGFydG5lck5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRjb3Vyc2VQcm92aWRlcnMoZXh0Q29udGVudFJlYWREYXRhPy5jb3Vyc2VQcm92aWRlcikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFBhcnRuZXJOYW1lPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZXh0Q29udGVudFJlYWREYXRhPy5jb250ZW50UGFydG5lcj8uY29udGVudFBhcnRuZXJOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWV4dENvbnRlbnRSZWFkRGF0YT8uY29udGVudFBhcnRuZXI/LmNvbnRlbnRQYXJ0bmVyTmFtZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tbW9uLmthcm1heW9naUJoYXJhdCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyMHB4J1wiIFtoZWlnaHRdPVwiJzQwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4OHB4J1wiIFtoZWlnaHRdPVwiJzI0cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmcgfHwgY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyByYXRpbmctY2hpcCBweS0yIGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJoYW5kbGVOYXZpZ2F0ZVRvUmV2aWV3cygpXCIgKm5nSWY9XCJjb250ZW50Py5hdmVyYWdlUmF0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIG1hcmdpbi1sZWZ0LXMgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Z3JhZGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTRcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00IG1hcmdpbi1yaWdodC1tXCI+e3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9zdC1lbnJvbGxlZC1jaGlwIHRleHQteHMgbGVhZGluZy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnbW9zdFRyZW5kaW5nJylcIj57eyAnY2FyZGNvbnRlbnR2Mi5tb3N0VHJlbmRpbmcnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8uaW5jbHVkZXMoJ21vc3RFbnJvbGxlZCcpXCI+e3sgJ2NhcmRjb250ZW50djIubW9zdEVucm9sbGVkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxODBweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgZXh0Q29udGVudFJlYWREYXRhPy5sYXN0VXBkYXRlZE9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgc291cmNlLXRleHRcIj4oe3sgJ2FwcHRvYy5sYXN0VXBkYXRlZE9uJyB8IHRyYW5zbGF0ZSB9fSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dENvbnRlbnRSZWFkRGF0YT8ubGFzdFVwZGF0ZWRPbiB8IGRhdGU6ICdNTU0gZCwgeScgfX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlld1wiPlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc01vYmlsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgcC01IGJvcmRlci1ib3R0b20gcG9zaXRpb24tYm90dG9tXCI+XG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiKHVzZXJFeHRDb3Vyc2VFbnJvbGwgfCBqc29uKSAhPT0gJ3t9J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCB3LWZ1bGwgd3MtbWF0LWJsYWNrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWJvZHktMiAgd3MtbWF0LWJsYWNrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3VzZXJFeHRDb3Vyc2VFbnJvbGw/LnByb2dyZXNzfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1jb250ZW50LXByb2dyZXNzIFtjb250ZW50SWRdPVwidXNlckV4dENvdXJzZUVucm9sbD8ucHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzXT1cInVzZXJFeHRDb3Vyc2VFbnJvbGw/LnByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCIgW2N1c3RvbUNsYXNzTmFtZV09XCIndmlld2VyLXByb2dyZXNzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1jb250ZW50LXByb2dyZXNzPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+ICAgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dFbnJvbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciBmbGV4LW1pZGRsZSByZXN1bWVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlblJvbGxUb0V4dENvdXJzZShleHRDb250ZW50UmVhZERhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5yb2xsVmFsaWRhdGlvbkxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMzJweCdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UmVkaXJlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgZmxleC1taWRkbGUgcmVzdW1lXCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImV4dENvbnRlbnRSZWFkRGF0YT8ucmVkaXJlY3RVcmxcIiAoY2xpY2spPVwiY2FwdHVyZVJlZGlyZWN0VGVsZW1ldHJ5KGV4dENvbnRlbnRSZWFkRGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+e3sgJ2FwcHRvY2hvbWUucmVkaXJlY3QnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWwtMiB3cy1tYXQtd2hpdGUtdGV4dFwiPm9wZW5faW5fbmV3PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiKHVzZXJFeHRDb3Vyc2VFbnJvbGwgfCBqc29uKSAhPT0gJ3t9JyAmJiB1c2VyRXh0Q291cnNlRW5yb2xsPy5pc3N1ZWRfY2VydGlmaWNhdGVzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICYmIHVzZXJFeHRDb3Vyc2VFbnJvbGw/LnByb2dyZXNzID09PSAxMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciBmbGV4LW1pZGRsZSByZXN1bWVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRvd25sb2FkQ2VydCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJmdXNpb24tYXNzZXRzL2ltYWdlcy9jZXJ0aWZpY2F0ZS1pY28uc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DZXJ0aWZpY2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAgKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmdcIiBjbGFzcz1cIm1sLTJcIj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyIGZsZXggZmxleC1taWRkbGUgY2VydGlmaWNhdGUtbG9hZGVyIG1hcmdpbi1sZWZ0LXNcIiAqbmdJZj1cImRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiIHN0cm9rZT1cIid3aGl0ZSdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIiBbZGlhbWV0ZXJdPVwiMjRcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+ICAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrIG1kOmhpZGRlblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW5Qcm9ncmVzc0luZm9cIiA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHB4LTggcHktNCBnYXAtMlwiICpuZ0lmPVwiZXh0Q29udGVudFJlYWREYXRhPy5kdXJhdGlvbiA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy90aW1lci5zdmdcIiB3aWR0aD1cIjIwcHhcIiBhbHQ9XCJ3ZWIgaW1hZ2VcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14c1wiPnt7IGV4dENvbnRlbnRSZWFkRGF0YT8uZHVyYXRpb24gKiA2MCB8IHBpcGVEdXJhdGlvblRyYW5zZm9ybTogJ2htcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9jLWNvbnRlbnRcIiBbbmdDbGFzc109XCJpc01vYmlsZSA/ICcnOidtdC04IG1iLTgnXCI+XG4gICAgICAgICAgICA8bWF0LXRhYi1ncm91cD5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmFib3V0JyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgW25nQ2xhc3NdPVwiaXNNb2JpbGUgPyAnJzonbXQtNSBtYi01J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtYWJvdXQgW2NvbnRlbnRSZWFkRGF0YV09XCJleHRDb250ZW50UmVhZERhdGFcIiBbc2hvd1Jldmlld3NdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VDb250ZW50UmVhZERhdGFdPVwiZXh0Q29udGVudFJlYWREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93TWFya2V0UGxhY2VDZXJ0aWZpY2F0ZV09XCIodXNlckV4dENvdXJzZUVucm9sbCB8IGpzb24pICE9PSAne30nICYmIHVzZXJFeHRDb3Vyc2VFbnJvbGw/Lmlzc3VlZF9jZXJ0aWZpY2F0ZXM/Lmxlbmd0aCA+ICAwICYmIHVzZXJFeHRDb3Vyc2VFbnJvbGw/LnByb2dyZXNzID09PSAxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiZXh0Q29udGVudFJlYWREYXRhXCIgW2Zyb21NYXJrZXRQbGFjZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtza2VsZXRvbkxvYWRlcl09XCJza2VsZXRvbkxvYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZnJvbU1ET109XCJmcm9tTURPXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWFwcC10b2MtYWJvdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnPy5jb21tZW50c1RhYlwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbW1lbnRzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCByYXRpbmdzLWRpdiBtdC01XCIgaWQ9XCJjb21tZW50c0RpdlwiICpuZ0lmPVwiZGlzY3Vzc1dpZGdldERhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbW1lbnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZC12Mi13aWRnZXQtY29tbWVudCBbd2lkZ2V0RGF0YV09XCJkaXNjdXNzV2lkZ2V0RGF0YVwiPjwvZC12Mi13aWRnZXQtY29tbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tbWVudElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGN1cnNvci1wb2ludGVyIG1iLTVcIiAoY2xpY2spPVwiY2xlYXJDb21tZW50SWRGcm9tVXJsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+YXJyb3dfYmFjazwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrIHRvIGFsbCBjb21tZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGQtdjItd2lkZ2V0LWNvbW1lbnQgW3dpZGdldERhdGFdPVwiZGlzY3Vzc1dpZGdldERhdGFcIiBbY29tbWVudElkXT1cImNvbW1lbnRJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2tlbGV0b25Mb2FkZXJdPjwvZC12Mi13aWRnZXQtY29tbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctdGVtcGxhdGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCIgI3JpZ2h0Q29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM4NHB4J1wiIFtoZWlnaHRdPVwiJzIyNHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGltYWdlLWRpdlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIGV4dENvbnRlbnRSZWFkRGF0YT8uYXBwSWNvbiArICcpJywgJ2JhY2tncm91bmQtcmVwZWF0JzogJ25vLXJlcGVhdCcsICdiYWNrZ3JvdW5kLXNpemUnOiAnY292ZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ltYWdlLWJhY2tkcm9wJzogc2Nyb2xsZWR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gdGV4dC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0yIHNoYXJlLXRhZ1wiICpuZ0lmPVwiIWZvclByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLnNoYXJlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiICpuZ0lmPVwic2Nyb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteGwgbGVhZGluZy02IHRleHQtd2hpdGUgZm9udC1ib2xkIHRleHQtc2Nyb2wtY3VzdG9tXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNhcGl0YWxpemUoZXh0Q29udGVudFJlYWREYXRhPy5uYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2UgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50Py5zb3VyY2V9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2NhcmRjb250ZW50djIuYnknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImV4dENvbnRlbnRSZWFkRGF0YT8uY29udGVudFBhcnRuZXI/LmNvbnRlbnRQYXJ0bmVyTmFtZVwiPnt7IGV4dENvbnRlbnRSZWFkRGF0YT8uY29udGVudFBhcnRuZXI/LmNvbnRlbnRQYXJ0bmVyTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWV4dENvbnRlbnRSZWFkRGF0YT8uY29udGVudFBhcnRuZXI/LmNvbnRlbnRQYXJ0bmVyTmFtZVwiPnt7ICdjb21tb24ua2FybWF5b2dpQmhhcmF0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTMgcC0zIGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIih1c2VyRXh0Q291cnNlRW5yb2xsIHwganNvbikgIT09ICd7fSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHctZnVsbCB3cy1tYXQtYmxhY2stdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWJvZHktMiAgd3MtbWF0LWJsYWNrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t1c2VyRXh0Q291cnNlRW5yb2xsPy5wcm9ncmVzc319JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1jb250ZW50LXByb2dyZXNzIFtjb250ZW50SWRdPVwidXNlckV4dENvdXJzZUVucm9sbD8ucHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc109XCJ1c2VyRXh0Q291cnNlRW5yb2xsPy5wcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzVHlwZV09XCIncGVyY2VudGFnZSdcIiBbY3VzdG9tQ2xhc3NOYW1lXT1cIid2aWV3ZXItcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1jb250ZW50LXByb2dyZXNzPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gICAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dFbnJvbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIGZsZXgtbWlkZGxlIHJlc3VtZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5Sb2xsVG9FeHRDb3Vyc2UoZXh0Q29udGVudFJlYWREYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxWYWxpZGF0aW9uTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZWRpcmVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIGZsZXgtbWlkZGxlIHJlc3VtZVwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImV4dENvbnRlbnRSZWFkRGF0YT8ucmVkaXJlY3RVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FwdHVyZVJlZGlyZWN0VGVsZW1ldHJ5KGV4dENvbnRlbnRSZWFkRGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj57eyAnYXBwdG9jaG9tZS5yZWRpcmVjdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1sLTIgd3MtbWF0LXdoaXRlLXRleHRcIj5vcGVuX2luX25ldzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiKHVzZXJFeHRDb3Vyc2VFbnJvbGwgfCBqc29uKSAhPT0gJ3t9JyAmJiB1c2VyRXh0Q291cnNlRW5yb2xsPy5pc3N1ZWRfY2VydGlmaWNhdGVzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyRXh0Q291cnNlRW5yb2xsPy5wcm9ncmVzcyA9PT0gMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIGZsZXgtbWlkZGxlIHJlc3VtZVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG93bmxvYWRDZXJ0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImZ1c2lvbi1hc3NldHMvaW1hZ2VzL2NlcnRpZmljYXRlLWljby5zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DZXJ0aWZpY2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gICpuZ0lmPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nXCIgY2xhc3M9XCJtbC0yXCI+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXIgZmxleCBmbGV4LW1pZGRsZSBjZXJ0aWZpY2F0ZS1sb2FkZXIgbWFyZ2luLWxlZnQtc1wiICpuZ0lmPVwiZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiIHN0cm9rZT1cIid3aGl0ZSdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIiBbZGlhbWV0ZXJdPVwiMjRcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpblByb2dyZXNzSW5mb1wiID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBrcGktdmFsdWVzIGl0ZW1zLWNlbnRlciBnYXAtMlwiICpuZ0lmPVwiZXh0Q29udGVudFJlYWREYXRhPy5kdXJhdGlvbiA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy90b2MvdGltZXIuc3ZnXCIgd2lkdGg9XCIyMHB4XCIgYWx0PVwid2ViIGltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXh0Q29udGVudFJlYWREYXRhPy5kdXJhdGlvbiB8IHBpcGVEdXJhdGlvblRyYW5zZm9ybTogJ2htcycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPGRpdiAqbmdJZj1cIiFleHRDb250ZW50QXZhaWxhYmxlXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXJnaW4teGwgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9jb21tb24vZXJyb3ItcGFnZXMvZW1wdHlfc2VhcmNoLnN2Z1wiIHdzVXRpbHNJbWFnZVJlc3BvbnNpdmUgYWx0PVwiTm8gcmVzdWx0c1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXJnaW4tdG9wLWwgbWFyZ2luLWJvdHRvbS1zXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJtYXQtaDJcIiBpMThuPVwic2VhcmNoIHJvdXRlIG5vIHJlc3VsdFwiPnt7J2xlYXJuc2VhcmNoLm5vUmVzdWx0cycgfCB0cmFuc2xhdGV9fTwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG48L2Rpdj5cblxuPHdzLWFwcC1zaGFyZS10b2MgKm5nSWY9XCJlbmFibGVTaGFyZVwiIFtjb250ZW50TGlua109XCJjb250ZW50TGlua1wiIFtyb290T3JnSWRdPVwicm9vdE9yZ0lkXCIgW2NvbnRlbnRdPVwiZXh0Q29udGVudFJlYWREYXRhXCJcbiAgICAocmVzZXRFbmFibGVTaGFyZSk9XCJyZXNldEVuYWJsZVNoYXJlKCRldmVudClcIj48L3dzLWFwcC1zaGFyZS10b2M+XG5cbjxuZy10ZW1wbGF0ZSAjaW5Qcm9ncmVzc0luZm8+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dQcm92aWRlclRpcHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNlcnRpZmljYXRlLWZvdW5kIG10LTYgbWItNCBteC0yIHAtMlwiID5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2xpZGVycy1keW5hbWljIFt3aWRnZXREYXRhXT1cIndpZGdldERhdGFcIj48L3dzLXdpZGdldC1zbGlkZXJzLWR5bmFtaWM+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|