@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,368 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { NsContent } from '@sunbird-cb/utils-v2';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./app-toc.service";
|
|
5
|
+
export class AppTocV2Service {
|
|
6
|
+
constructor(tocSvc) {
|
|
7
|
+
this.tocSvc = tocSvc;
|
|
8
|
+
}
|
|
9
|
+
constructHeirarchyData(contentReadData) {
|
|
10
|
+
let contentHeirarchy = { ...contentReadData };
|
|
11
|
+
let leafNodes = [];
|
|
12
|
+
if (contentHeirarchy['preliminaryAssessmentDetail'] && Object.keys(contentHeirarchy['preliminaryAssessmentDetail']).length > 0) {
|
|
13
|
+
contentHeirarchy['children'] = [];
|
|
14
|
+
// Set parent reference for preliminary assessment (pre-assessment)
|
|
15
|
+
contentHeirarchy['preliminaryAssessmentDetail'].parent = contentHeirarchy.identifier;
|
|
16
|
+
// Mark this as the pre-assessment for milestone locking logic
|
|
17
|
+
contentHeirarchy['preliminaryAssessmentDetail'].isPreAssessment = true;
|
|
18
|
+
contentHeirarchy['children'].push(contentHeirarchy['preliminaryAssessmentDetail']);
|
|
19
|
+
leafNodes.push(contentReadData?.preliminaryAssessment || contentReadData?.preliminaryAssessmentDetail?.identifier);
|
|
20
|
+
}
|
|
21
|
+
// Track milestone index for proper locking logic
|
|
22
|
+
// All milestones are locked by default - unlocking is computed based on progress
|
|
23
|
+
let milestoneIndex = 0;
|
|
24
|
+
contentHeirarchy['milestones_v1'].forEach((milestone) => {
|
|
25
|
+
// All milestones are locked by default
|
|
26
|
+
// M1 unlocks when pre-assessment is completed
|
|
27
|
+
// M2+ unlock when previous milestone's mandatory content + assessment are completed
|
|
28
|
+
const shouldBeLocked = true;
|
|
29
|
+
let mileStoneData = {
|
|
30
|
+
"identifier": milestone.id,
|
|
31
|
+
"description": milestone.description,
|
|
32
|
+
"mimeType": "application/vnd.ekstep.content-collection",
|
|
33
|
+
"duration": "0",
|
|
34
|
+
"primaryCategory": "Milestone",
|
|
35
|
+
"courseCategory": "Milestone",
|
|
36
|
+
"createdBy": "25311a4f-fa42-4cf7-882a-5e79198edfcb",
|
|
37
|
+
"name": milestone.name,
|
|
38
|
+
"contentType": "Course",
|
|
39
|
+
"isLocked": shouldBeLocked,
|
|
40
|
+
"milestoneIndex": milestoneIndex,
|
|
41
|
+
"status": 0,
|
|
42
|
+
"completionStatus": 0,
|
|
43
|
+
"completionPercentage": 0,
|
|
44
|
+
"leafNodes": [],
|
|
45
|
+
// Pre-computed flags for performance optimization
|
|
46
|
+
"isMilestone": true,
|
|
47
|
+
"isCollection": true,
|
|
48
|
+
"isModule": false,
|
|
49
|
+
"isResource": false,
|
|
50
|
+
"isLearningPathway": false,
|
|
51
|
+
"parent": contentHeirarchy.identifier
|
|
52
|
+
};
|
|
53
|
+
mileStoneData['children'] = [];
|
|
54
|
+
if (milestone?.courses && milestone?.courses?.length) {
|
|
55
|
+
milestone.courses.forEach((mileStoneCourse) => {
|
|
56
|
+
// Set parent reference for courses inside milestone
|
|
57
|
+
mileStoneCourse.parent = milestone.id;
|
|
58
|
+
mileStoneCourse['moduleCount'] = 0;
|
|
59
|
+
mileStoneData['duration'] = String(Number(mileStoneData['duration']) + Number(mileStoneCourse?.duration || 0));
|
|
60
|
+
this.tocSvc.mapModuleCount(mileStoneCourse);
|
|
61
|
+
if (mileStoneCourse && mileStoneCourse?.leafNodes && mileStoneCourse?.leafNodes?.length) {
|
|
62
|
+
leafNodes = [...leafNodes, ...mileStoneCourse.leafNodes];
|
|
63
|
+
mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, ...mileStoneCourse.leafNodes];
|
|
64
|
+
}
|
|
65
|
+
this.tocSvc.checkModuleWiseData(mileStoneCourse);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (milestone?.assessmentDetail) {
|
|
69
|
+
// Set parent reference for assessment inside milestone
|
|
70
|
+
milestone.assessmentDetail.parent = milestone.id;
|
|
71
|
+
leafNodes.push(milestone?.assessmentDetail?.identifier);
|
|
72
|
+
mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, milestone?.assessmentDetail?.identifier];
|
|
73
|
+
mileStoneData['children'].push(milestone?.assessmentDetail);
|
|
74
|
+
}
|
|
75
|
+
mileStoneData['children'] = [...milestone['courses'], ...mileStoneData['children']];
|
|
76
|
+
mileStoneData['leafNodesCount'] = mileStoneData['leafNodes'].length;
|
|
77
|
+
this.mapModuleCount(mileStoneData);
|
|
78
|
+
contentHeirarchy['children'] = contentHeirarchy['children'] ? [...contentHeirarchy['children'], mileStoneData] : [mileStoneData];
|
|
79
|
+
milestoneIndex++;
|
|
80
|
+
});
|
|
81
|
+
contentHeirarchy['leafNodes'] = [...leafNodes];
|
|
82
|
+
contentHeirarchy['leafNodesCount'] = leafNodes.length;
|
|
83
|
+
return contentHeirarchy;
|
|
84
|
+
}
|
|
85
|
+
mapModuleCount(content) {
|
|
86
|
+
if (content && content.children) {
|
|
87
|
+
content.children.map(child => {
|
|
88
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
89
|
+
if (child?.moduleCount) {
|
|
90
|
+
content['moduleCount'] = content['moduleCount'] ? content['moduleCount'] + child?.moduleCount :
|
|
91
|
+
child?.moduleCount;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
mapContentHierarchyProgressUpdate(contentHeirarchyData, enrollmentListData) {
|
|
98
|
+
if (contentHeirarchyData && contentHeirarchyData.children) {
|
|
99
|
+
let totalLeafNodes = 0;
|
|
100
|
+
let totalCompletedLeafNodes = 0;
|
|
101
|
+
let LPenrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
|
|
102
|
+
// First pass: Update progress for all content
|
|
103
|
+
contentHeirarchyData.children.forEach((child) => {
|
|
104
|
+
if (child.primaryCategory === 'Milestone') {
|
|
105
|
+
this.updateMilestoneProgress(child, contentHeirarchyData?.identifier, enrollmentListData);
|
|
106
|
+
// Only count mandatory course resources and milestone assessments
|
|
107
|
+
totalLeafNodes += child.mandatoryLeafNodesCount || 0;
|
|
108
|
+
totalCompletedLeafNodes += child.mandatoryCompletedLeafNodesCount || 0;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// For pre-assessment and other root-level content (always count these)
|
|
112
|
+
// Try to find enrollment with parent identifier first, then with child's own identifier
|
|
113
|
+
let enrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
|
|
114
|
+
if (!enrollment) {
|
|
115
|
+
enrollment = this.findEnrollment(enrollmentListData, child?.identifier);
|
|
116
|
+
}
|
|
117
|
+
this.updateNodeProgress(child, enrollment);
|
|
118
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
119
|
+
totalLeafNodes += child.leafNodesCount || 1;
|
|
120
|
+
totalCompletedLeafNodes += isCompleted ? (child.leafNodesCount || 1) : 0;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
if (LPenrollment && LPenrollment.completionPercentage === 100) {
|
|
124
|
+
contentHeirarchyData.completionPercentage = 100;
|
|
125
|
+
contentHeirarchyData.completionStatus = 2;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
if (totalLeafNodes > 0) {
|
|
129
|
+
const calculatedPercentage = Math.round((Number(totalCompletedLeafNodes) / Number(totalLeafNodes)) * 100);
|
|
130
|
+
contentHeirarchyData.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
|
|
131
|
+
contentHeirarchyData.completionStatus = Number(contentHeirarchyData.completionPercentage === 100 ? 2 : (contentHeirarchyData.completionPercentage > 0 ? 1 : 0));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return contentHeirarchyData;
|
|
136
|
+
}
|
|
137
|
+
updateMilestoneProgress(milestone, parentContentIdentifier, enrollmentListData) {
|
|
138
|
+
let totalLeafNodes = 0;
|
|
139
|
+
let totalCompletedLeafNodes = 0;
|
|
140
|
+
let mandatoryLeafNodes = 0;
|
|
141
|
+
let mandatoryCompletedLeafNodes = 0;
|
|
142
|
+
let completedCourses = 0;
|
|
143
|
+
let totalCourses = 0;
|
|
144
|
+
if (milestone.children) {
|
|
145
|
+
milestone.children.forEach((child) => {
|
|
146
|
+
if (child.primaryCategory === 'Course') {
|
|
147
|
+
totalCourses += 1;
|
|
148
|
+
this.updateCourseProgress(child, parentContentIdentifier, enrollmentListData);
|
|
149
|
+
const childLeafNodes = child.leafNodesCount || 1;
|
|
150
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
151
|
+
// Count all course leaf nodes for overall tracking
|
|
152
|
+
totalLeafNodes += childLeafNodes;
|
|
153
|
+
if (isCompleted) {
|
|
154
|
+
completedCourses += 1;
|
|
155
|
+
totalCompletedLeafNodes += childLeafNodes;
|
|
156
|
+
}
|
|
157
|
+
// Only count mandatory courses for LP completion percentage
|
|
158
|
+
if (child.isMandatory === true || child.mandatory === true) {
|
|
159
|
+
mandatoryLeafNodes += childLeafNodes;
|
|
160
|
+
// Count individual completed resources within mandatory courses
|
|
161
|
+
const completedCount = this.getCompletedLeafNodesCount(child);
|
|
162
|
+
mandatoryCompletedLeafNodes += completedCount;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// For assessments - always count them as mandatory
|
|
167
|
+
// Try multiple enrollment sources
|
|
168
|
+
let enrollment = this.findEnrollment(enrollmentListData, parentContentIdentifier);
|
|
169
|
+
if (!enrollment) {
|
|
170
|
+
enrollment = this.findEnrollment(enrollmentListData, milestone?.identifier);
|
|
171
|
+
}
|
|
172
|
+
this.updateNodeProgress(child, enrollment);
|
|
173
|
+
const leafNodes = child.leafNodesCount || 1;
|
|
174
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
175
|
+
// Count assessments in both total and mandatory
|
|
176
|
+
totalLeafNodes += leafNodes;
|
|
177
|
+
mandatoryLeafNodes += leafNodes;
|
|
178
|
+
if (isCompleted) {
|
|
179
|
+
totalCompletedLeafNodes += leafNodes;
|
|
180
|
+
mandatoryCompletedLeafNodes += leafNodes;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
milestone.leafNodesCount = totalLeafNodes;
|
|
186
|
+
milestone.completedLeafNodesCount = totalCompletedLeafNodes;
|
|
187
|
+
milestone.mandatoryLeafNodesCount = mandatoryLeafNodes;
|
|
188
|
+
milestone.mandatoryCompletedLeafNodesCount = mandatoryCompletedLeafNodes;
|
|
189
|
+
milestone.totalCourses = totalCourses;
|
|
190
|
+
milestone.completedCourses = completedCourses;
|
|
191
|
+
if (totalLeafNodes > 0) {
|
|
192
|
+
const calculatedPercentage = Math.round((totalCompletedLeafNodes / totalLeafNodes) * 100);
|
|
193
|
+
milestone.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
|
|
194
|
+
milestone.completionStatus = Number(milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0));
|
|
195
|
+
milestone.status = Number(milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
updateNodeProgress(node, enrollment) {
|
|
199
|
+
if (!enrollment) {
|
|
200
|
+
// If no enrollment data, preserve existing completion data from content hierarchy
|
|
201
|
+
// This is important for assessments that may have completion data but no enrollment entry
|
|
202
|
+
if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
|
|
203
|
+
node.completionPercentage = 0;
|
|
204
|
+
node.completionStatus = 0;
|
|
205
|
+
node.status = 0;
|
|
206
|
+
}
|
|
207
|
+
// Otherwise, keep the existing values from content hierarchy
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Check if the node itself is the enrolled content (direct enrollment)
|
|
211
|
+
// This happens for pre-assessments and standalone content
|
|
212
|
+
const isDirectEnrollment = enrollment.collectionId === node.identifier ||
|
|
213
|
+
enrollment.contentId === node.identifier;
|
|
214
|
+
if (isDirectEnrollment) {
|
|
215
|
+
// Use enrollment's direct progress
|
|
216
|
+
const progress = enrollment.completionPercentage || enrollment.progress || 0;
|
|
217
|
+
const status = Number(enrollment.status) || 0;
|
|
218
|
+
node.completionPercentage = progress;
|
|
219
|
+
node.completionStatus = status;
|
|
220
|
+
node.status = status;
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (enrollment?.status === 2) {
|
|
224
|
+
node.completionPercentage = 100;
|
|
225
|
+
node.completionStatus = 2;
|
|
226
|
+
node.status = 2;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// Try both contentId and collectionId as the API response may use either field
|
|
230
|
+
const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier || ele?.collectionId === node.identifier);
|
|
231
|
+
if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
|
|
232
|
+
node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
|
|
233
|
+
node.completionStatus = Number(nodeEnrollData.status) || 0;
|
|
234
|
+
node.status = Number(nodeEnrollData.status) || 0;
|
|
235
|
+
}
|
|
236
|
+
else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
|
|
237
|
+
node.completionPercentage = 100;
|
|
238
|
+
node.completionStatus = 2;
|
|
239
|
+
node.status = 2;
|
|
240
|
+
}
|
|
241
|
+
else if (enrollment && !nodeEnrollData) {
|
|
242
|
+
// Enrollment exists but this node is not in contentList
|
|
243
|
+
// This can happen for completed assessments - preserve their completion data from content hierarchy
|
|
244
|
+
// Only reset to 0 if there's no completion data at all
|
|
245
|
+
if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
|
|
246
|
+
node.completionPercentage = 0;
|
|
247
|
+
node.completionStatus = 0;
|
|
248
|
+
node.status = 0;
|
|
249
|
+
}
|
|
250
|
+
// Otherwise keep existing values from content hierarchy
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// No enrollment at all - reset to 0
|
|
254
|
+
node.completionPercentage = 0;
|
|
255
|
+
node.completionStatus = 0;
|
|
256
|
+
node.status = 0;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
updateCourseProgress(course, parentContentIdentifier, enrollmentListData) {
|
|
261
|
+
const enrollment = this.findEnrollment(enrollmentListData, course?.identifier);
|
|
262
|
+
if (enrollment?.completionPercentage === 100) {
|
|
263
|
+
// Enrollment shows 100% - mark course as complete
|
|
264
|
+
course.completionPercentage = 100;
|
|
265
|
+
course.completionStatus = 2;
|
|
266
|
+
if (enrollment.issuedCertificates.length > 0) {
|
|
267
|
+
const certificate = enrollment.issuedCertificates.sort((a, b) => new Date(a.lastIssuedOn).getTime() - new Date(b.lastIssuedOn).getTime());
|
|
268
|
+
const certId = certificate[0].identifier;
|
|
269
|
+
course.issuedCertificatesId = certId;
|
|
270
|
+
}
|
|
271
|
+
this.tocSvc.mapCompletionChildPercentageProgram(course);
|
|
272
|
+
}
|
|
273
|
+
else if (enrollment && enrollment.completionPercentage > 0) {
|
|
274
|
+
// Enrollment has partial progress
|
|
275
|
+
course.completionPercentage = enrollment.completionPercentage || 0;
|
|
276
|
+
course.completionStatus = 1;
|
|
277
|
+
// Also update children
|
|
278
|
+
if (course.children && course.children.length > 0) {
|
|
279
|
+
course.children.forEach((child) => {
|
|
280
|
+
// If child is a module, update its children (resources) as well
|
|
281
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children && child.children.length > 0) {
|
|
282
|
+
child.children.forEach((resource) => {
|
|
283
|
+
this.updateNodeProgress(resource, enrollment);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.updateNodeProgress(child, enrollment);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
if (course.children && course.children.length > 0) {
|
|
294
|
+
let totalLeafNodes = course.leafNodesCount || 0;
|
|
295
|
+
let totalCompleted = 0;
|
|
296
|
+
course.children.forEach((child) => {
|
|
297
|
+
// If child is a module, update its children (resources) as well
|
|
298
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children && child.children.length > 0) {
|
|
299
|
+
child.children.forEach((resource) => {
|
|
300
|
+
this.updateNodeProgress(resource, enrollment);
|
|
301
|
+
if (resource.completionStatus === 2 || resource.completionPercentage === 100) {
|
|
302
|
+
totalCompleted += resource.leafNodesCount || 1;
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.updateNodeProgress(child, enrollment);
|
|
308
|
+
}
|
|
309
|
+
if (child.completionStatus === 2 || child.completionPercentage === 100) {
|
|
310
|
+
totalCompleted += child.leafNodesCount || 1;
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
// If it's a collection and doesn't have its own enrollment progress, calculate it
|
|
314
|
+
if (!enrollment || !course.completionPercentage || course.completionPercentage === 0) {
|
|
315
|
+
if (!totalLeafNodes) {
|
|
316
|
+
totalLeafNodes = course.children.reduce((acc, curr) => acc + (curr.leafNodesCount || 1), 0);
|
|
317
|
+
}
|
|
318
|
+
if (totalLeafNodes > 0) {
|
|
319
|
+
const calculatedPercentage = Math.round((totalCompleted / totalLeafNodes) * 100);
|
|
320
|
+
course.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
|
|
321
|
+
course.completionStatus = Number(course.completionPercentage === 100 ? 2 : (course.completionPercentage > 0 ? 1 : 0));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
getCompletedLeafNodesCount(node) {
|
|
328
|
+
let completedCount = 0;
|
|
329
|
+
// If it's a leaf node (resource)
|
|
330
|
+
if (!node.children || node.children.length === 0) {
|
|
331
|
+
const isCompleted = node.status === 2 || node.completionStatus === 2 || node.completionPercentage >= 100;
|
|
332
|
+
return isCompleted ? (node.leafNodesCount || 1) : 0;
|
|
333
|
+
}
|
|
334
|
+
// If it has children, recursively count completed leaf nodes
|
|
335
|
+
node.children.forEach((child) => {
|
|
336
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children) {
|
|
337
|
+
// Module - recurse through its children
|
|
338
|
+
completedCount += this.getCompletedLeafNodesCount(child);
|
|
339
|
+
}
|
|
340
|
+
else if (!child.children || child.children.length === 0) {
|
|
341
|
+
// Resource (leaf node)
|
|
342
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
343
|
+
if (isCompleted) {
|
|
344
|
+
completedCount += child.leafNodesCount || 1;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
// Other collection type - recurse
|
|
349
|
+
completedCount += this.getCompletedLeafNodesCount(child);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
return completedCount;
|
|
353
|
+
}
|
|
354
|
+
findEnrollment(enrollmentList, identifier) {
|
|
355
|
+
if (!enrollmentList || !enrollmentList.length)
|
|
356
|
+
return null;
|
|
357
|
+
return enrollmentList.find((el) => el.collectionId === identifier || el.contentId === identifier);
|
|
358
|
+
}
|
|
359
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, deps: [{ token: i1.AppTocService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
360
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, providedIn: 'root' }); }
|
|
361
|
+
}
|
|
362
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, decorators: [{
|
|
363
|
+
type: Injectable,
|
|
364
|
+
args: [{
|
|
365
|
+
providedIn: 'root'
|
|
366
|
+
}]
|
|
367
|
+
}], ctorParameters: function () { return [{ type: i1.AppTocService }]; } });
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxlQUFlO0lBRTFCLFlBQW9CLE1BQXFCO1FBQXJCLFdBQU0sR0FBTixNQUFNLENBQWU7SUFBSSxDQUFDO0lBRTlDLHNCQUFzQixDQUFDLGVBQW9CO1FBQ3pDLElBQUksZ0JBQWdCLEdBQVEsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBQ2xELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5SCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsbUVBQW1FO1lBQ25FLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtZQUNwRiw4REFBOEQ7WUFDOUQsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBR3RFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUE7WUFDbEYsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLElBQUksZUFBZSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FB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QUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCx1QkFBdUI7Z0JBQ3ZCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQTtnQkFDM0csSUFBSSxXQUFXLEVBQUU7b0JBQ2YsY0FBYyxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFBO2lCQUM1QzthQUNGO2lCQUFNO2dCQUNMLGtDQUFrQztnQkFDbEMsY0FBYyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUN6RDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxjQUFtQixFQUFFLFVBQWtCO1FBQzVELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQTtJQUN4RyxDQUFDOytHQXBZVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuL2FwcC10b2Muc2VydmljZSc7XG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Mic7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NWMlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlKSB7IH1cblxuICBjb25zdHJ1Y3RIZWlyYXJjaHlEYXRhKGNvbnRlbnRSZWFkRGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgY29udGVudEhlaXJhcmNoeTogYW55ID0geyAuLi5jb250ZW50UmVhZERhdGEgfVxuICAgIGxldCBsZWFmTm9kZXM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10gJiYgT2JqZWN0LmtleXMoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10pLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIHByZWxpbWluYXJ5IGFzc2Vzc21lbnQgKHByZS1hc3Nlc3NtZW50KVxuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10ucGFyZW50ID0gY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICAvLyBNYXJrIHRoaXMgYXMgdGhlIHByZS1hc3Nlc3NtZW50IGZvciBtaWxlc3RvbmUgbG9ja2luZyBsb2dpY1xuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10uaXNQcmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgXG4gICAgIFxuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXS5wdXNoKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKVxuICAgICAgbGVhZk5vZGVzLnB1c2goY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnQgfHwgY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgLy8gVHJhY2sgbWlsZXN0b25lIGluZGV4IGZvciBwcm9wZXIgbG9ja2luZyBsb2dpY1xuICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdCAtIHVubG9ja2luZyBpcyBjb21wdXRlZCBiYXNlZCBvbiBwcm9ncmVzc1xuICAgIGxldCBtaWxlc3RvbmVJbmRleCA9IDBcbiAgICBjb250ZW50SGVpcmFyY2h5WydtaWxlc3RvbmVzX3YxJ10uZm9yRWFjaCgobWlsZXN0b25lOiBhbnkpID0+IHtcbiAgICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdFxuICAgICAgLy8gTTEgdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgLy8gTTIrIHVubG9jayB3aGVuIHByZXZpb3VzIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50ICsgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkXG4gICAgICBjb25zdCBzaG91bGRCZUxvY2tlZCA9IHRydWVcblxuICAgICAgbGV0IG1pbGVTdG9uZURhdGE6IGFueSA9IHtcbiAgICAgICAgXCJpZGVudGlmaWVyXCI6IG1pbGVzdG9uZS5pZCxcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBtaWxlc3RvbmUuZGVzY3JpcHRpb24sXG4gICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxuICAgICAgICBcImR1cmF0aW9uXCI6IFwiMFwiLFxuICAgICAgICBcInByaW1hcnlDYXRlZ29yeVwiOiBcIk1pbGVzdG9uZVwiLFxuICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXG4gICAgICAgIFwiY3JlYXRlZEJ5XCI6IFwiMjUzMTFhNGYtZmE0Mi00Y2Y3LTg4MmEtNWU3OTE5OGVkZmNiXCIsXG4gICAgICAgIFwibmFtZVwiOiBtaWxlc3RvbmUubmFtZSxcbiAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxuICAgICAgICBcImlzTG9ja2VkXCI6IHNob3VsZEJlTG9ja2VkLFxuICAgICAgICBcIm1pbGVzdG9uZUluZGV4XCI6IG1pbGVzdG9uZUluZGV4LFxuICAgICAgICBcInN0YXR1c1wiOiAwLFxuICAgICAgICBcImNvbXBsZXRpb25TdGF0dXNcIjogMCxcbiAgICAgICAgXCJjb21wbGV0aW9uUGVyY2VudGFnZVwiOiAwLFxuICAgICAgICBcImxlYWZOb2Rlc1wiOiBbXSxcbiAgICAgICAgLy8gUHJlLWNvbXB1dGVkIGZsYWdzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAgICAgXCJpc01pbGVzdG9uZVwiOiB0cnVlLFxuICAgICAgICBcImlzQ29sbGVjdGlvblwiOiB0cnVlLFxuICAgICAgICBcImlzTW9kdWxlXCI6IGZhbHNlLFxuICAgICAgICBcImlzUmVzb3VyY2VcIjogZmFsc2UsXG4gICAgICAgIFwiaXNMZWFybmluZ1BhdGh3YXlcIjogZmFsc2UsXG4gICAgICAgIFwicGFyZW50XCI6IGNvbnRlbnRIZWlyYXJjaHkuaWRlbnRpZmllclxuICAgICAgfVxuXG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gW11cbiAgICAgIGlmIChtaWxlc3RvbmU/LmNvdXJzZXMgJiYgbWlsZXN0b25lPy5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgbWlsZXN0b25lLmNvdXJzZXMuZm9yRWFjaCgobWlsZVN0b25lQ291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgY291cnNlcyBpbnNpZGUgbWlsZXN0b25lXG4gICAgICAgICAgbWlsZVN0b25lQ291cnNlLnBhcmVudCA9IG1pbGVzdG9uZS5pZFxuICAgICAgICAgIG1pbGVTdG9uZUNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IDBcbiAgICAgICAgICBtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddID0gU3RyaW5nKE51bWJlcihtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddKSArIE51bWJlcihtaWxlU3RvbmVDb3Vyc2U/LmR1cmF0aW9uIHx8IDApKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KG1pbGVTdG9uZUNvdXJzZSlcbiAgICAgICAgICBpZiAobWlsZVN0b25lQ291cnNlICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxlYWZOb2RlcyA9IFsuLi5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG4gICAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXG4gICAgICAgIH0pXG5cbiAgICAgIH1cbiAgICAgIGlmIChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpIHtcbiAgICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIGFzc2Vzc21lbnQgaW5zaWRlIG1pbGVzdG9uZVxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcbiAgICAgICAgbGVhZk5vZGVzLnB1c2gobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcl1cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbLi4ubWlsZXN0b25lWydjb3Vyc2VzJ10sIC4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ11dXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXG4gICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQobWlsZVN0b25lRGF0YSlcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID8gWy4uLmNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10sIG1pbGVTdG9uZURhdGFdIDogW21pbGVTdG9uZURhdGFdXG5cbiAgICAgIG1pbGVzdG9uZUluZGV4KytcbiAgICB9KVxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2xlYWZOb2RlcyddID0gWy4uLmxlYWZOb2Rlc11cbiAgICBjb250ZW50SGVpcmFyY2h5WydsZWFmTm9kZXNDb3VudCddID0gbGVhZk5vZGVzLmxlbmd0aFxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5XG4gIH1cblxuICAgbWFwTW9kdWxlQ291bnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIGlmKGNoaWxkPy5tb2R1bGVDb3VudCkge1xuICAgICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgY2hpbGQ/Lm1vZHVsZUNvdW50IDogXG4gICAgICAgICAgICBjaGlsZD8ubW9kdWxlQ291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5cbiAgbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKGNvbnRlbnRIZWlyYXJjaHlEYXRhOiBhbnksIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgTFBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBVcGRhdGUgcHJvZ3Jlc3MgZm9yIGFsbCBjb250ZW50XG4gICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhjaGlsZCwgY29udGVudEhlaXJhcmNoeURhdGE/LmlkZW50aWZpZXIsIGVucm9sbG1lbnRMaXN0RGF0YSlcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2UgcmVzb3VyY2VzIGFuZCBtaWxlc3RvbmUgYXNzZXNzbWVudHNcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5tYW5kYXRvcnlMZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gY2hpbGQubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBwcmUtYXNzZXNzbWVudCBhbmQgb3RoZXIgcm9vdC1sZXZlbCBjb250ZW50IChhbHdheXMgY291bnQgdGhlc2UpXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZW5yb2xsbWVudCB3aXRoIHBhcmVudCBpZGVudGlmaWVyIGZpcnN0LCB0aGVuIHdpdGggY2hpbGQncyBvd24gaWRlbnRpZmllclxuICAgICAgICAgIGxldCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuICAgICAgICAgIGlmICghZW5yb2xsbWVudCkge1xuICAgICAgICAgICAgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjaGlsZD8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gaXNDb21wbGV0ZWQgPyAoY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZihMUGVucm9sbG1lbnQgJiYgTFBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKE51bWJlcih0b3RhbENvbXBsZXRlZExlYWZOb2RlcykgLyBOdW1iZXIodG90YWxMZWFmTm9kZXMpKSAqIDEwMClcbiAgICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGlzTmFOKGNhbGN1bGF0ZWRQZXJjZW50YWdlKSA/IDAgOiBjYWxjdWxhdGVkUGVyY2VudGFnZVxuICAgICAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMgPSBOdW1iZXIoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwID8gMSA6IDApKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5RGF0YVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhtaWxlc3RvbmU6IGFueSwgcGFyZW50Q29udGVudElkZW50aWZpZXI6IHN0cmluZywgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuICAgIGxldCBtYW5kYXRvcnlMZWFmTm9kZXMgPSAwXG4gICAgbGV0IG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyA9IDBcbiAgICBsZXQgY29tcGxldGVkQ291cnNlcyA9IDBcbiAgICBsZXQgdG90YWxDb3Vyc2VzID0gMFxuXG4gICAgaWYgKG1pbGVzdG9uZS5jaGlsZHJlbikge1xuICAgICAgbWlsZXN0b25lLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScpIHtcbiAgICAgICAgICB0b3RhbENvdXJzZXMgKz0gMVxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgY2hpbGRMZWFmTm9kZXMgPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3VudCBhbGwgY291cnNlIGxlYWYgbm9kZXMgZm9yIG92ZXJhbGwgdHJhY2tpbmdcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgY29tcGxldGVkQ291cnNlcyArPSAxXG4gICAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2VzIGZvciBMUCBjb21wbGV0aW9uIHBlcmNlbnRhZ2VcbiAgICAgICAgICBpZiAoY2hpbGQuaXNNYW5kYXRvcnkgPT09IHRydWUgfHwgY2hpbGQubWFuZGF0b3J5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtYW5kYXRvcnlMZWFmTm9kZXMgKz0gY2hpbGRMZWFmTm9kZXNcbiAgICAgICAgICAgIC8vIENvdW50IGluZGl2aWR1YWwgY29tcGxldGVkIHJlc291cmNlcyB3aXRoaW4gbWFuZGF0b3J5IGNvdXJzZXNcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gdGhpcy5nZXRDb21wbGV0ZWRMZWFmTm9kZXNDb3VudChjaGlsZClcbiAgICAgICAgICAgIG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyArPSBjb21wbGV0ZWRDb3VudFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNzZXNzbWVudHMgLSBhbHdheXMgY291bnQgdGhlbSBhcyBtYW5kYXRvcnlcbiAgICAgICAgICAvLyBUcnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXG4gICAgICAgICAgbGV0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgcGFyZW50Q29udGVudElkZW50aWZpZXIpXG4gICAgICAgICAgaWYgKCFlbnJvbGxtZW50KSB7XG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIG1pbGVzdG9uZT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbGVhZk5vZGVzID0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ291bnQgYXNzZXNzbWVudHMgaW4gYm90aCB0b3RhbCBhbmQgbWFuZGF0b3J5XG4gICAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgbWFuZGF0b3J5TGVhZk5vZGVzICs9IGxlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgICBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIG1pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCA9IHRvdGFsTGVhZk5vZGVzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50ID0gdG90YWxDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5TGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUudG90YWxDb3Vyc2VzID0gdG90YWxDb3Vyc2VzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZENvdXJzZXMgPSBjb21wbGV0ZWRDb3Vyc2VzXG5cbiAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBOdW1iZXIobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogKG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMCkpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb2RlUHJvZ3Jlc3Mobm9kZTogYW55LCBlbnJvbGxtZW50OiBhbnkpIHtcbiAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgIC8vIElmIG5vIGVucm9sbG1lbnQgZGF0YSwgcHJlc2VydmUgZXhpc3RpbmcgY29tcGxldGlvbiBkYXRhIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhc3Nlc3NtZW50cyB0aGF0IG1heSBoYXZlIGNvbXBsZXRpb24gZGF0YSBidXQgbm8gZW5yb2xsbWVudCBlbnRyeVxuICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGtlZXAgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBpdHNlbGYgaXMgdGhlIGVucm9sbGVkIGNvbnRlbnQgKGRpcmVjdCBlbnJvbGxtZW50KVxuICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgcHJlLWFzc2Vzc21lbnRzIGFuZCBzdGFuZGFsb25lIGNvbnRlbnRcbiAgICBjb25zdCBpc0RpcmVjdEVucm9sbG1lbnQgPSBlbnJvbGxtZW50LmNvbGxlY3Rpb25JZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxtZW50LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyXG4gICAgXG4gICAgaWYgKGlzRGlyZWN0RW5yb2xsbWVudCkge1xuICAgICAgXG4gICAgICAvLyBVc2UgZW5yb2xsbWVudCdzIGRpcmVjdCBwcm9ncmVzc1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGVucm9sbG1lbnQucHJvZ3Jlc3MgfHwgMFxuICAgICAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKGVucm9sbG1lbnQuc3RhdHVzKSB8fCAwXG4gICAgICBcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwcm9ncmVzc1xuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gc3RhdHVzXG4gICAgICBub2RlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZihlbnJvbGxtZW50Py5zdGF0dXMgPT09IDIpIHtcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcnkgYm90aCBjb250ZW50SWQgYW5kIGNvbGxlY3Rpb25JZCBhcyB0aGUgQVBJIHJlc3BvbnNlIG1heSB1c2UgZWl0aGVyIGZpZWxkXG4gICAgICBjb25zdCBub2RlRW5yb2xsRGF0YSA9IGVucm9sbG1lbnQ/LmNvbnRlbnRMaXN0Py5maW5kKChlbGU6IGFueSkgPT4gXG4gICAgICAgIGVsZT8uY29udGVudElkID09PSBub2RlLmlkZW50aWZpZXIgfHwgZWxlPy5jb2xsZWN0aW9uSWQgPT09IG5vZGUuaWRlbnRpZmllclxuICAgICAgKVxuICAgICAgXG4gICAgICBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPCAyKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBub2RlRW5yb2xsRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBub2RlRW5yb2xsRGF0YS5wcm9ncmVzcyB8fCAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihub2RlRW5yb2xsRGF0YS5zdGF0dXMpIHx8IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSBOdW1iZXIobm9kZUVucm9sbERhdGEuc3RhdHVzKSB8fCAwXG4gICAgICB9ZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDEwMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAyXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgICAgfSBlbHNlIGlmIChlbnJvbGxtZW50ICYmICFub2RlRW5yb2xsRGF0YSkge1xuICAgICAgICAvLyBFbnJvbGxtZW50IGV4aXN0cyBidXQgdGhpcyBub2RlIGlzIG5vdCBpbiBjb250ZW50TGlzdFxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIGNvbXBsZXRlZCBhc3Nlc3NtZW50cyAtIHByZXNlcnZlIHRoZWlyIGNvbXBsZXRpb24gZGF0YSBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICAgIC8vIE9ubHkgcmVzZXQgdG8gMCBpZiB0aGVyZSdzIG5vIGNvbXBsZXRpb24gZGF0YSBhdCBhbGxcbiAgICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGtlZXAgZXhpc3RpbmcgdmFsdWVzIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGVucm9sbG1lbnQgYXQgYWxsIC0gcmVzZXQgdG8gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMFxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBcbiAgICBcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY291cnNlPy5pZGVudGlmaWVyKVxuXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgc2hvd3MgMTAwJSAtIG1hcmsgY291cnNlIGFzIGNvbXBsZXRlXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgaWYgKGVucm9sbG1lbnQuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBlbnJvbGxtZW50Lmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgICAgICBjb25zdCBjZXJ0SWQ6IGFueSA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgIGNvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlKVxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCkge1xuICAgICAgLy8gRW5yb2xsbWVudCBoYXMgcGFydGlhbCBwcm9ncmVzc1xuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IDFcbiAgICAgIC8vIEFsc28gdXBkYXRlIGNoaWxkcmVuXG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvdXJzZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgXG5cbiAgICAgICAgICAvLyBJZiBjaGlsZCBpcyBhIG1vZHVsZSwgdXBkYXRlIGl0cyBjaGlsZHJlbiAocmVzb3VyY2VzKSBhcyB3ZWxsXG4gICAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFICYmIGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MocmVzb3VyY2UsIGVucm9sbG1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5sZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIGxldCB0b3RhbENvbXBsZXRlZCA9IDBcblxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIGNoaWxkIGlzIGEgbW9kdWxlLCB1cGRhdGUgaXRzIGNoaWxkcmVuIChyZXNvdXJjZXMpIGFzIHdlbGxcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUgJiYgY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaCgocmVzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhyZXNvdXJjZSwgZW5yb2xsbWVudClcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgcmVzb3VyY2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IHJlc291cmNlLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSWYgaXQncyBhIGNvbGxlY3Rpb24gYW5kIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGVucm9sbG1lbnQgcHJvZ3Jlc3MsIGNhbGN1bGF0ZSBpdFxuICAgICAgICBpZiAoIWVucm9sbG1lbnQgfHwgIWNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDApIHtcbiAgICAgICAgICBpZiAoIXRvdGFsTGVhZk5vZGVzKSB7XG4gICAgICAgICAgICB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5jaGlsZHJlbi5yZWR1Y2UoKGFjYzogbnVtYmVyLCBjdXJyOiBhbnkpID0+IGFjYyArIChjdXJyLmxlYWZOb2Rlc0NvdW50IHx8IDEpLCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICAgICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQobm9kZTogYW55KTogbnVtYmVyIHtcbiAgICBsZXQgY29tcGxldGVkQ291bnQgPSAwXG4gICAgXG4gICAgLy8gSWYgaXQncyBhIGxlYWYgbm9kZSAocmVzb3VyY2UpXG4gICAgaWYgKCFub2RlLmNoaWxkcmVuIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IG5vZGUuc3RhdHVzID09PSAyIHx8IG5vZGUuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxuICAgICAgcmV0dXJuIGlzQ29tcGxldGVkID8gKG5vZGUubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgfVxuICAgIFxuICAgIC8vIElmIGl0IGhhcyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkgY291bnQgY29tcGxldGVkIGxlYWYgbm9kZXNcbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSAmJiBjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAvLyBNb2R1bGUgLSByZWN1cnNlIHRocm91Z2ggaXRzIGNoaWxkcmVuXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9IGVsc2UgaWYgKCFjaGlsZC5jaGlsZHJlbiB8fCBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmVzb3VyY2UgKGxlYWYgbm9kZSlcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgICAgY29tcGxldGVkQ291bnQgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlciBjb2xsZWN0aW9uIHR5cGUgLSByZWN1cnNlXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9XG4gICAgfSlcbiAgICBcbiAgICByZXR1cm4gY29tcGxldGVkQ291bnRcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFlbnJvbGxtZW50TGlzdCB8fCAhZW5yb2xsbWVudExpc3QubGVuZ3RoKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBlbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGlkZW50aWZpZXIgfHwgZWwuY29udGVudElkID09PSBpZGVudGlmaWVyKVxuICB9XG5cblxuXG59XG5cbiJdfQ==
|