@sunbird-cb/cbp-ai 0.0.1
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/README.md +24 -0
- package/esm2022/lib/ai-cbp-routing.module.mjs +56 -0
- package/esm2022/lib/ai-cbp.component.mjs +14 -0
- package/esm2022/lib/ai-cbp.module.mjs +263 -0
- package/esm2022/lib/ai-cbp.service.mjs +14 -0
- package/esm2022/lib/components/add-course/add-course.component.mjs +444 -0
- package/esm2022/lib/components/add-designation/add-designation.component.mjs +460 -0
- package/esm2022/lib/components/add-personalisation/add-personalisation.component.mjs +33 -0
- package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +392 -0
- package/esm2022/lib/components/approval-requests/approval-requests.component.mjs +398 -0
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +265 -0
- package/esm2022/lib/components/delete-role-mapping/delete-role-mapping.component.mjs +53 -0
- package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +39 -0
- package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +699 -0
- package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +188 -0
- package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +1949 -0
- package/esm2022/lib/components/list-popup/list-popup.component.mjs +32 -0
- package/esm2022/lib/components/review-request/review-request.component.mjs +138 -0
- package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +1082 -0
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +714 -0
- package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +370 -0
- package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +235 -0
- package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +125 -0
- package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +397 -0
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +883 -0
- package/esm2022/lib/modules/initial-screen/initial-screen.component.mjs +127 -0
- package/esm2022/lib/modules/shared/constant/app.constant.mjs +2036 -0
- package/esm2022/lib/modules/shared/directives/clickoutside.directive.mjs +38 -0
- package/esm2022/lib/modules/shared/directives/directive.module.mjs +21 -0
- package/esm2022/lib/modules/shared/pipes/order-by-name.pipe.mjs +23 -0
- package/esm2022/lib/modules/shared/services/event.service.mjs +24 -0
- package/esm2022/lib/modules/shared/services/events.mjs +125 -0
- package/esm2022/lib/modules/shared/services/init.service.mjs +41 -0
- package/esm2022/lib/modules/shared/services/role-mapping.service.mjs +261 -0
- package/esm2022/lib/modules/shared/services/shared.service.mjs +869 -0
- package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs +53 -0
- package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +186 -0
- package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +367 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.pipe.mjs +23 -0
- package/esm2022/public-api.mjs +14 -0
- package/esm2022/sunbird-cb-cbp-ai.mjs +5 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs +12952 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ai-cbp-routing.module.d.ts +8 -0
- package/lib/ai-cbp-routing.module.d.ts.map +1 -0
- package/lib/ai-cbp.component.d.ts +7 -0
- package/lib/ai-cbp.component.d.ts.map +1 -0
- package/lib/ai-cbp.module.d.ts +68 -0
- package/lib/ai-cbp.module.d.ts.map +1 -0
- package/lib/ai-cbp.service.d.ts +7 -0
- package/lib/ai-cbp.service.d.ts.map +1 -0
- package/lib/components/add-course/add-course.component.d.ts +67 -0
- package/lib/components/add-course/add-course.component.d.ts.map +1 -0
- package/lib/components/add-designation/add-designation.component.d.ts +52 -0
- package/lib/components/add-designation/add-designation.component.d.ts.map +1 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts +16 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts.map +1 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts +48 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts.map +1 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts +80 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts.map +1 -0
- package/lib/components/dashboard/dashboard.component.d.ts +55 -0
- package/lib/components/dashboard/dashboard.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts +18 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +18 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts +94 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +35 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +198 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/list-popup/list-popup.component.d.ts +13 -0
- package/lib/components/list-popup/list-popup.component.d.ts.map +1 -0
- package/lib/components/review-request/review-request.component.d.ts +39 -0
- package/lib/components/review-request/review-request.component.d.ts.map +1 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +99 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +83 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +48 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +41 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts +29 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts +49 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +73 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts +85 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts.map +1 -0
- package/lib/modules/shared/constant/app.constant.d.ts +457 -0
- package/lib/modules/shared/constant/app.constant.d.ts.map +1 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts +13 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts.map +1 -0
- package/lib/modules/shared/directives/directive.module.d.ts +8 -0
- package/lib/modules/shared/directives/directive.module.d.ts.map +1 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts +8 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts.map +1 -0
- package/lib/modules/shared/services/event.service.d.ts +12 -0
- package/lib/modules/shared/services/event.service.d.ts.map +1 -0
- package/lib/modules/shared/services/events.d.ts +200 -0
- package/lib/modules/shared/services/events.d.ts.map +1 -0
- package/lib/modules/shared/services/init.service.d.ts +13 -0
- package/lib/modules/shared/services/init.service.d.ts.map +1 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts +21 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts.map +1 -0
- package/lib/modules/shared/services/shared.service.d.ts +108 -0
- package/lib/modules/shared/services/shared.service.d.ts.map +1 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts +14 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +29 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts +64 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts +11 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
- package/package.json +28 -0
- package/public-api.d.ts +11 -0
- package/public-api.d.ts.map +1 -0
- package/sunbird-cb-cbp-ai-0.0.1.tgz +0 -0
- package/sunbird-cb-cbp-ai.d.ts.map +1 -0
package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ProgressDialogComponent {
|
|
5
|
+
constructor(data) {
|
|
6
|
+
this.data = data;
|
|
7
|
+
console.log('data--', data);
|
|
8
|
+
}
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProgressDialogComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
10
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProgressDialogComponent, selector: "app-progress-dialog", ngImport: i0, template: `
|
|
11
|
+
<div class="progress-container">
|
|
12
|
+
<h3>Processing Summaries</h3>
|
|
13
|
+
<p>{{ data.message }}</p>
|
|
14
|
+
<p>Please wait , it will take few minutes to complete</p>
|
|
15
|
+
<div class="progress-container">
|
|
16
|
+
<!-- Circular Spinner -->
|
|
17
|
+
<div class="spinner"></div>
|
|
18
|
+
|
|
19
|
+
<!-- Linear Progress Bar -->
|
|
20
|
+
<div class="linear-progress">
|
|
21
|
+
<div class="bar"></div>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
`, isInline: true, styles: [".progress-container{padding:20px;width:auto;text-align:center}mat-progress-bar{margin-top:20px}.spinner{width:64px;height:64px;border-radius:50%;border:6px solid #e8e6ff;border-top-color:#5b5bf0;border-right-color:#8b7cf7;animation:spin 1.2s linear infinite;margin:0 auto 28px}@keyframes spin{to{transform:rotate(360deg)}}.linear-progress{position:relative;width:100%;height:8px;background:#e8e6ff;border-radius:4px;overflow:hidden;margin-bottom:24px}.linear-progress .bar{position:absolute;height:100%;width:40%;background:linear-gradient(90deg,#b8b1ff,#5b5bf0,#b8b1ff);animation:indeterminate 1.6s infinite ease-in-out}@keyframes indeterminate{0%{left:-40%}to{left:100%}}.label strong{font-size:18px;color:#2f2f44}.label p{margin-top:4px;font-size:14px;color:#6b6b8a}\n"] }); }
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProgressDialogComponent, decorators: [{
|
|
30
|
+
type: Component,
|
|
31
|
+
args: [{ selector: 'app-progress-dialog', template: `
|
|
32
|
+
<div class="progress-container">
|
|
33
|
+
<h3>Processing Summaries</h3>
|
|
34
|
+
<p>{{ data.message }}</p>
|
|
35
|
+
<p>Please wait , it will take few minutes to complete</p>
|
|
36
|
+
<div class="progress-container">
|
|
37
|
+
<!-- Circular Spinner -->
|
|
38
|
+
<div class="spinner"></div>
|
|
39
|
+
|
|
40
|
+
<!-- Linear Progress Bar -->
|
|
41
|
+
<div class="linear-progress">
|
|
42
|
+
<div class="bar"></div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
`, styles: [".progress-container{padding:20px;width:auto;text-align:center}mat-progress-bar{margin-top:20px}.spinner{width:64px;height:64px;border-radius:50%;border:6px solid #e8e6ff;border-top-color:#5b5bf0;border-right-color:#8b7cf7;animation:spin 1.2s linear infinite;margin:0 auto 28px}@keyframes spin{to{transform:rotate(360deg)}}.linear-progress{position:relative;width:100%;height:8px;background:#e8e6ff;border-radius:4px;overflow:hidden;margin-bottom:24px}.linear-progress .bar{position:absolute;height:100%;width:40%;background:linear-gradient(90deg,#b8b1ff,#5b5bf0,#b8b1ff);animation:indeterminate 1.6s infinite ease-in-out}@keyframes indeterminate{0%{left:-40%}to{left:100%}}.label strong{font-size:18px;color:#2f2f44}.label p{margin-top:4px;font-size:14px;color:#6b6b8a}\n"] }]
|
|
49
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
50
|
+
type: Inject,
|
|
51
|
+
args: [MAT_DIALOG_DATA]
|
|
52
|
+
}] }]; } });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9tb2R1bGVzL3VwbG9hZC1kb2N1bWVudC1wYWdlL3Byb2dyZXNzLWRpYWxvZy9wcm9ncmVzcy1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUF3RzNELE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFBNEMsSUFBMkM7UUFBM0MsU0FBSSxHQUFKLElBQUksQ0FBdUM7UUFDckYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDN0IsQ0FBQzsrR0FIVSx1QkFBdUIsa0JBQ2QsZUFBZTttR0FEeEIsdUJBQXVCLDJEQXBHeEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUOzs0RkFtRlUsdUJBQXVCO2tCQXRHbkMsU0FBUzsrQkFDRSxxQkFBcUIsWUFDckI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUOzswQkFvRlksTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9ncmVzcy1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIj5cbiAgICAgIDxoMz5Qcm9jZXNzaW5nIFN1bW1hcmllczwvaDM+XG4gICAgICA8cD57eyBkYXRhLm1lc3NhZ2UgfX08L3A+XG4gICAgICA8cD5QbGVhc2Ugd2FpdCAsIGl0IHdpbGwgdGFrZSBmZXcgbWludXRlcyB0byBjb21wbGV0ZTwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIj5cbiAgICAgICAgPCEtLSBDaXJjdWxhciBTcGlubmVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gTGluZWFyIFByb2dyZXNzIEJhciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVhci1wcm9ncmVzc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICBcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnByb2dyZXNzLWNvbnRhaW5lciB7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuICAgIG1hdC1wcm9ncmVzcy1iYXIge1xuICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICB9XG4gICBcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQ2lyY3VsYXIgU3Bpbm5lclxuPT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLnNwaW5uZXIge1xuICB3aWR0aDogNjRweDtcbiAgaGVpZ2h0OiA2NHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogNnB4IHNvbGlkICNlOGU2ZmY7XG4gIGJvcmRlci10b3AtY29sb3I6ICM1YjViZjA7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzhiN2NmNztcbiAgYW5pbWF0aW9uOiBzcGluIDEuMnMgbGluZWFyIGluZmluaXRlO1xuICBtYXJnaW46IDAgYXV0byAyOHB4O1xufVxuXG5Aa2V5ZnJhbWVzIHNwaW4ge1xuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExpbmVhciBQcm9ncmVzcyBCYXJcbj09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi5saW5lYXItcHJvZ3Jlc3Mge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDhweDtcbiAgYmFja2dyb3VuZDogI2U4ZTZmZjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xufVxuXG4ubGluZWFyLXByb2dyZXNzIC5iYXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDQwJTtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgIDkwZGVnLFxuICAgICNiOGIxZmYsXG4gICAgIzViNWJmMCxcbiAgICAjYjhiMWZmXG4gICk7XG4gIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZSAxLjZzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xufVxuXG5Aa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUge1xuICAwJSB7XG4gICAgbGVmdDogLTQwJTtcbiAgfVxuICAxMDAlIHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFRleHRcbj09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi5sYWJlbCBzdHJvbmcge1xuICBmb250LXNpemU6IDE4cHg7XG4gIGNvbG9yOiAjMmYyZjQ0O1xufVxuXG4ubGFiZWwgcCB7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogIzZiNmI4YTtcbn1cblxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0RpYWxvZ0NvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogeyBwcm9ncmVzczogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICB9XG59Il19
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ProgressDialogComponent } from '../progress-dialog/progress-dialog.component';
|
|
3
|
+
import { interval, forkJoin } from 'rxjs';
|
|
4
|
+
import { startWith, switchMap, takeWhile, tap } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/material/dialog";
|
|
7
|
+
import * as i2 from "../../shared/services/shared.service";
|
|
8
|
+
import * as i3 from "@angular/material/snack-bar";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
import * as i5 from "@angular/material/legacy-button";
|
|
11
|
+
import * as i6 from "@angular/material/icon";
|
|
12
|
+
import * as i7 from "@angular/material/progress-spinner";
|
|
13
|
+
import * as i8 from "@angular/material/tooltip";
|
|
14
|
+
export class UploadDialogComponent {
|
|
15
|
+
constructor(dialogRef, sharedService, snackBar, dialog) {
|
|
16
|
+
this.dialogRef = dialogRef;
|
|
17
|
+
this.sharedService = sharedService;
|
|
18
|
+
this.snackBar = snackBar;
|
|
19
|
+
this.dialog = dialog;
|
|
20
|
+
this.MAX_FILES = 10;
|
|
21
|
+
this.documentName = '';
|
|
22
|
+
this.selectedFiles = [];
|
|
23
|
+
this.cbpFinalObj = {};
|
|
24
|
+
this.loading = false;
|
|
25
|
+
this.uploadedFileData = {};
|
|
26
|
+
this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage();
|
|
27
|
+
}
|
|
28
|
+
/** Already uploaded files count */
|
|
29
|
+
get uploadedCount() {
|
|
30
|
+
return this.cbpFinalObj?.documents?.length || 0;
|
|
31
|
+
}
|
|
32
|
+
/** Uploaded + newly selected */
|
|
33
|
+
get totalFileCount() {
|
|
34
|
+
return this.uploadedCount + this.selectedFiles.length;
|
|
35
|
+
}
|
|
36
|
+
onFileSelected(event) {
|
|
37
|
+
const input = event.target;
|
|
38
|
+
if (!input.files)
|
|
39
|
+
return;
|
|
40
|
+
const files = Array.from(input.files);
|
|
41
|
+
const allowedExtensions = ['pdf', 'doc', 'docx'];
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
if (this.totalFileCount >= this.MAX_FILES) {
|
|
44
|
+
this.snackBar.open('You can upload a maximum of 10 documents.', 'X', {
|
|
45
|
+
duration: 3000,
|
|
46
|
+
panelClass: ['snackbar-error']
|
|
47
|
+
});
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
const ext = file.name.split('.').pop()?.toLowerCase();
|
|
51
|
+
if (!ext || !allowedExtensions.includes(ext)) {
|
|
52
|
+
this.snackBar.open(`Invalid file type: ${file.name}`, 'X', { duration: 3000, panelClass: ['snackbar-error'] });
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Prevent duplicate selection
|
|
56
|
+
if (this.selectedFiles.some(f => f.name === file.name && f.size === file.size)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
this.selectedFiles.push(file);
|
|
60
|
+
}
|
|
61
|
+
// Reset input so same file can be re-selected
|
|
62
|
+
input.value = '';
|
|
63
|
+
}
|
|
64
|
+
removeFile(index) {
|
|
65
|
+
this.selectedFiles.splice(index, 1);
|
|
66
|
+
}
|
|
67
|
+
// upload(): void {
|
|
68
|
+
// if (!this.documentName || this.selectedFiles.length === 0) {
|
|
69
|
+
// return;
|
|
70
|
+
// }
|
|
71
|
+
// if (this.totalFileCount > this.MAX_FILES) {
|
|
72
|
+
// this.snackBar.open('Maximum 10 documents allowed.', 'X', {
|
|
73
|
+
// duration: 3000,
|
|
74
|
+
// panelClass: ['snackbar-error']
|
|
75
|
+
// });
|
|
76
|
+
// return;
|
|
77
|
+
// }
|
|
78
|
+
// this.loading = true;
|
|
79
|
+
// const uploadNext = (index: number) => {
|
|
80
|
+
// if (index >= this.selectedFiles.length) {
|
|
81
|
+
// this.loading = false;
|
|
82
|
+
// this.dialogRef.close('close');
|
|
83
|
+
// return;
|
|
84
|
+
// }
|
|
85
|
+
// const file = this.selectedFiles[index];
|
|
86
|
+
// const reqBody = {
|
|
87
|
+
// state_center_id: this.cbpFinalObj?.ministry?.identifier,
|
|
88
|
+
// department_id: this.cbpFinalObj?.departments,
|
|
89
|
+
// documentName: this.documentName
|
|
90
|
+
// };
|
|
91
|
+
// this.sharedService.uploadDocument(reqBody, file).subscribe({
|
|
92
|
+
// next: (res) => {
|
|
93
|
+
// this.uploadedFileData = res;
|
|
94
|
+
// this.triggerFileSummary();
|
|
95
|
+
// uploadNext(index + 1);
|
|
96
|
+
// },
|
|
97
|
+
// error: (err) => {
|
|
98
|
+
// this.loading = false;
|
|
99
|
+
// this.snackBar.open(
|
|
100
|
+
// err?.error?.detail || 'Upload failed',
|
|
101
|
+
// 'X',
|
|
102
|
+
// { duration: 3000, panelClass: ['snackbar-error'] }
|
|
103
|
+
// );
|
|
104
|
+
// }
|
|
105
|
+
// });
|
|
106
|
+
// };
|
|
107
|
+
// uploadNext(0);
|
|
108
|
+
// }
|
|
109
|
+
upload() {
|
|
110
|
+
if (this.selectedFiles.length === 0) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (this.totalFileCount > this.MAX_FILES) {
|
|
114
|
+
this.snackBar.open('Maximum 10 documents allowed.', 'X', {
|
|
115
|
+
duration: 3000,
|
|
116
|
+
panelClass: ['snackbar-error']
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const formData = new FormData();
|
|
121
|
+
// Required fields
|
|
122
|
+
formData.append('state_center_id', this.cbpFinalObj?.ministry?.identifier || '');
|
|
123
|
+
formData.append('department_id', this.cbpFinalObj?.departments || '');
|
|
124
|
+
// Append multiple files with SAME key "files"
|
|
125
|
+
this.selectedFiles.forEach((file) => {
|
|
126
|
+
formData.append('files', file, file.name);
|
|
127
|
+
});
|
|
128
|
+
this.loading = true;
|
|
129
|
+
this.sharedService.uploadDocument(formData).subscribe({
|
|
130
|
+
next: (res) => {
|
|
131
|
+
this.loading = false;
|
|
132
|
+
this.uploadedFileData = res;
|
|
133
|
+
this.triggerFileSummary();
|
|
134
|
+
this.snackBar.open(res?.message, 'X', {
|
|
135
|
+
duration: 3000,
|
|
136
|
+
panelClass: ['snackbar-success']
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
error: (error) => {
|
|
140
|
+
this.loading = false;
|
|
141
|
+
this.snackBar.open(error?.error?.detail || 'Upload failed', 'X', { duration: 3000, panelClass: ['snackbar-error'] });
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
triggerFileSummary() {
|
|
146
|
+
if (!this.uploadedFileData?.successful_uploads?.length)
|
|
147
|
+
return;
|
|
148
|
+
const files = this.uploadedFileData.successful_uploads;
|
|
149
|
+
const totalFiles = files.length;
|
|
150
|
+
const dialogRefForProgress = this.dialog.open(ProgressDialogComponent, {
|
|
151
|
+
disableClose: true,
|
|
152
|
+
data: { progress: 0, message: `Processing 0 of ${totalFiles} summaries...` }
|
|
153
|
+
});
|
|
154
|
+
let completedFiles = 0;
|
|
155
|
+
const pollingRequests = files.map(file => interval(5000).pipe(startWith(0), // trigger immediately
|
|
156
|
+
switchMap(() => this.sharedService.triggerFileSummary(file.file_id)), // must return { summary_status }
|
|
157
|
+
tap((res) => {
|
|
158
|
+
if (res.summary_status === 'COMPLETED') {
|
|
159
|
+
completedFiles++;
|
|
160
|
+
dialogRefForProgress.componentInstance.data.progress = Math.floor((completedFiles / totalFiles) * 100);
|
|
161
|
+
dialogRefForProgress.componentInstance.data.message = `Processing ${completedFiles} of ${totalFiles} summaries...`;
|
|
162
|
+
}
|
|
163
|
+
}), takeWhile((res) => res.summary_status !== 'COMPLETED', true)));
|
|
164
|
+
forkJoin(pollingRequests).subscribe({
|
|
165
|
+
complete: () => {
|
|
166
|
+
dialogRefForProgress.componentInstance.data.progress = 100;
|
|
167
|
+
dialogRefForProgress.componentInstance.data.message = `All ${totalFiles} summaries completed!`;
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
dialogRefForProgress.close();
|
|
170
|
+
this.dialogRef.close('close');
|
|
171
|
+
}, 500);
|
|
172
|
+
},
|
|
173
|
+
error: () => {
|
|
174
|
+
dialogRefForProgress.close();
|
|
175
|
+
this.dialogRef.close('close');
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UploadDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
180
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UploadDialogComponent, selector: "app-upload-dialog", ngImport: i0, template: "<h2 mat-dialog-title>Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <div\n class=\"file-upload-box\"\n style=\"margin-top: 30px;\"\n [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\"\n >\n <input\n type=\"file\"\n #fileInput\n hidden\n multiple\n accept=\".pdf,.doc,.docx\"\n (change)=\"onFileSelected($event)\"\n >\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> <small>PDF Files Only (Max:25 MB)</small></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"center\" style=\"margin: 20px 0;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button class=\"primary-btn cursor-pointer\"\n mat-raised-button\n color=\"primary\"\n (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0\"\n >\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
|
|
181
|
+
}
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UploadDialogComponent, decorators: [{
|
|
183
|
+
type: Component,
|
|
184
|
+
args: [{ selector: 'app-upload-dialog', template: "<h2 mat-dialog-title>Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <div\n class=\"file-upload-box\"\n style=\"margin-top: 30px;\"\n [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\"\n >\n <input\n type=\"file\"\n #fileInput\n hidden\n multiple\n accept=\".pdf,.doc,.docx\"\n (change)=\"onFileSelected($event)\"\n >\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> <small>PDF Files Only (Max:25 MB)</small></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"center\" style=\"margin: 20px 0;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button class=\"primary-btn cursor-pointer\"\n mat-raised-button\n color=\"primary\"\n (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0\"\n >\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}\n"] }]
|
|
185
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i1.MatDialog }]; } });
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvbW9kdWxlcy91cGxvYWQtZG9jdW1lbnQtcGFnZS91cGxvYWQtZGlhbG9nL3VwbG9hZC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL21vZHVsZXMvdXBsb2FkLWRvY3VtZW50LXBhZ2UvdXBsb2FkLWRpYWxvZy91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFPLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBTTNFLE1BQU0sT0FBTyxxQkFBcUI7SUFVaEMsWUFDUyxTQUE4QyxFQUM5QyxhQUE0QixFQUM1QixRQUFxQixFQUNyQixNQUFpQjtRQUhqQixjQUFTLEdBQVQsU0FBUyxDQUFxQztRQUM5QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFaakIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUV4QixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hC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QUF1QixDQUFDO2dCQUMvRixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1Ysb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOytHQTlOVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix5RENibEMsNmlFQTBFQTs7NEZEN0RhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBQcm9ncmVzc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3Byb2dyZXNzLWRpYWxvZy9wcm9ncmVzcy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IGludGVydmFsLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXBsb2FkLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBsb2FkLWRpYWxvZy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZERpYWxvZ0NvbXBvbmVudCB7XG5cbiAgcmVhZG9ubHkgTUFYX0ZJTEVTID0gMTA7XG5cbiAgZG9jdW1lbnROYW1lID0gJyc7XG4gIHNlbGVjdGVkRmlsZXM6IEZpbGVbXSA9IFtdO1xuICBjYnBGaW5hbE9iajogYW55ID0ge307XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgdXBsb2FkZWRGaWxlRGF0YTogYW55ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFVwbG9hZERpYWxvZ0NvbXBvbmVudD4sXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2dcbiAgKSB7XG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICAvKiogQWxyZWFkeSB1cGxvYWRlZCBmaWxlcyBjb3VudCAqL1xuICBnZXQgdXBsb2FkZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNicEZpbmFsT2JqPy5kb2N1bWVudHM/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgLyoqIFVwbG9hZGVkICsgbmV3bHkgc2VsZWN0ZWQgKi9cbiAgZ2V0IHRvdGFsRmlsZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkZWRDb3VudCArIHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7XG4gIH1cblxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICghaW5wdXQuZmlsZXMpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShpbnB1dC5maWxlcyk7XG4gICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJ3BkZicsICdkb2MnLCAnZG9jeCddO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBpZiAodGhpcy50b3RhbEZpbGVDb3VudCA+PSB0aGlzLk1BWF9GSUxFUykge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1lvdSBjYW4gdXBsb2FkIGEgbWF4aW11bSBvZiAxMCBkb2N1bWVudHMuJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoIWV4dCB8fCAhYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgYEludmFsaWQgZmlsZSB0eXBlOiAke2ZpbGUubmFtZX1gLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGUgc2VsZWN0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLnNvbWUoZiA9PiBmLm5hbWUgPT09IGZpbGUubmFtZSAmJiBmLnNpemUgPT09IGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGlucHV0IHNvIHNhbWUgZmlsZSBjYW4gYmUgcmUtc2VsZWN0ZWRcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvLyB1cGxvYWQoKTogdm9pZCB7XG4gIC8vICAgaWYgKCF0aGlzLmRvY3VtZW50TmFtZSB8fCB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuXG4gIC8vICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPiB0aGlzLk1BWF9GSUxFUykge1xuICAvLyAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNYXhpbXVtIDEwIGRvY3VtZW50cyBhbGxvd2VkLicsICdYJywge1xuICAvLyAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgLy8gICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gIC8vICAgICB9KTtcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICB9XG5cbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gIC8vICAgY29uc3QgdXBsb2FkTmV4dCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gIC8vICAgICBpZiAoaW5kZXggPj0gdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCkge1xuICAvLyAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ2Nsb3NlJyk7XG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgZmlsZSA9IHRoaXMuc2VsZWN0ZWRGaWxlc1tpbmRleF07XG5cbiAgLy8gICAgIGNvbnN0IHJlcUJvZHkgPSB7XG4gIC8vICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsXG4gIC8vICAgICAgIGRlcGFydG1lbnRfaWQ6IHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzLFxuICAvLyAgICAgICBkb2N1bWVudE5hbWU6IHRoaXMuZG9jdW1lbnROYW1lXG4gIC8vICAgICB9O1xuXG4gIC8vICAgICB0aGlzLnNoYXJlZFNlcnZpY2UudXBsb2FkRG9jdW1lbnQocmVxQm9keSwgZmlsZSkuc3Vic2NyaWJlKHtcbiAgLy8gICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAvLyAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlRGF0YSA9IHJlcztcbiAgLy8gICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAvLyAgICAgICAgIHVwbG9hZE5leHQoaW5kZXggKyAxKTtcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gIC8vICAgICAgICAgICBlcnI/LmVycm9yPy5kZXRhaWwgfHwgJ1VwbG9hZCBmYWlsZWQnLFxuICAvLyAgICAgICAgICAgJ1gnLFxuICAvLyAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9KTtcbiAgLy8gICB9O1xuXG4gIC8vICAgdXBsb2FkTmV4dCgwKTtcbiAgLy8gfVxuXG4gIHVwbG9hZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPiB0aGlzLk1BWF9GSUxFUykge1xuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNYXhpbXVtIDEwIGRvY3VtZW50cyBhbGxvd2VkLicsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIFxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gIFxuICAgIC8vIFJlcXVpcmVkIGZpZWxkc1xuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICdzdGF0ZV9jZW50ZXJfaWQnLFxuICAgICAgdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIgfHwgJydcbiAgICApO1xuICBcbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAnZGVwYXJ0bWVudF9pZCcsXG4gICAgICB0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50cyB8fCAnJ1xuICAgICk7XG4gIFxuICAgIC8vIEFwcGVuZCBtdWx0aXBsZSBmaWxlcyB3aXRoIFNBTUUga2V5IFwiZmlsZXNcIlxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5mb3JFYWNoKChmaWxlOiBGaWxlKSA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGVzJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9KTtcbiAgXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwbG9hZERvY3VtZW50KGZvcm1EYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVEYXRhID0gcmVzO1xuICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocmVzPy5tZXNzYWdlLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgXG4gICAgICAgIFxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIFxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VwbG9hZCBmYWlsZWQnLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG5cbiAgdHJpZ2dlckZpbGVTdW1tYXJ5KCkge1xuICAgIGlmICghdGhpcy51cGxvYWRlZEZpbGVEYXRhPy5zdWNjZXNzZnVsX3VwbG9hZHM/Lmxlbmd0aCkgcmV0dXJuO1xuICBcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlRGF0YS5zdWNjZXNzZnVsX3VwbG9hZHM7XG4gICAgY29uc3QgdG90YWxGaWxlcyA9IGZpbGVzLmxlbmd0aDtcbiAgXG4gICAgY29uc3QgZGlhbG9nUmVmRm9yUHJvZ3Jlc3MgPSB0aGlzLmRpYWxvZy5vcGVuKFByb2dyZXNzRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBkYXRhOiB7IHByb2dyZXNzOiAwLCBtZXNzYWdlOiBgUHJvY2Vzc2luZyAwIG9mICR7dG90YWxGaWxlc30gc3VtbWFyaWVzLi4uYCB9XG4gICAgfSk7XG4gIFxuICAgIGxldCBjb21wbGV0ZWRGaWxlcyA9IDA7XG4gIFxuICAgIGNvbnN0IHBvbGxpbmdSZXF1ZXN0cyA9IGZpbGVzLm1hcChmaWxlID0+XG4gICAgICBpbnRlcnZhbCg1MDAwKS5waXBlKFxuICAgICAgICBzdGFydFdpdGgoMCksIC8vIHRyaWdnZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc2hhcmVkU2VydmljZS50cmlnZ2VyRmlsZVN1bW1hcnkoZmlsZS5maWxlX2lkKSksIC8vIG11c3QgcmV0dXJuIHsgc3VtbWFyeV9zdGF0dXMgfVxuICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5zdW1tYXJ5X3N0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHtcbiAgICAgICAgICAgIGNvbXBsZXRlZEZpbGVzKys7XG4gICAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLnByb2dyZXNzID0gTWF0aC5mbG9vcigoY29tcGxldGVkRmlsZXMgLyB0b3RhbEZpbGVzKSAqIDEwMCk7XG4gICAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLm1lc3NhZ2UgPSBgUHJvY2Vzc2luZyAke2NvbXBsZXRlZEZpbGVzfSBvZiAke3RvdGFsRmlsZXN9IHN1bW1hcmllcy4uLmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVdoaWxlKChyZXM6IGFueSkgPT4gcmVzLnN1bW1hcnlfc3RhdHVzICE9PSAnQ09NUExFVEVEJywgdHJ1ZSlcbiAgICAgIClcbiAgICApO1xuICBcbiAgICBmb3JrSm9pbihwb2xsaW5nUmVxdWVzdHMpLnN1YnNjcmliZSh7XG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLnByb2dyZXNzID0gMTAwO1xuICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLm1lc3NhZ2UgPSBgQWxsICR7dG90YWxGaWxlc30gc3VtbWFyaWVzIGNvbXBsZXRlZCFgO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIGRpYWxvZ1JlZkZvclByb2dyZXNzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG5cbn1cbiIsIjxoMiBtYXQtZGlhbG9nLXRpdGxlPlVwbG9hZCBEb2N1bWVudDwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbiAgPCEtLSA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1wiPlxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIFsobmdNb2RlbCldPVwiZG9jdW1lbnROYW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRG9jdW1lbnQgTmFtZVwiXG4gICAgICBbZGlzYWJsZWRdPVwidG90YWxGaWxlQ291bnQgPj0gTUFYX0ZJTEVTXCJcbiAgICA+XG4gIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuXG4gIDwhLS0gVXBsb2FkIEJveCAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZmlsZS11cGxvYWQtYm94XCJcbiAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDMwcHg7XCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwidG90YWxGaWxlQ291bnQgPj0gTUFYX0ZJTEVTXCJcbiAgICAoY2xpY2spPVwidG90YWxGaWxlQ291bnQgPCBNQVhfRklMRVMgJiYgZmlsZUlucHV0LmNsaWNrKClcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAjZmlsZUlucHV0XG4gICAgICBoaWRkZW5cbiAgICAgIG11bHRpcGxlXG4gICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3hcIlxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICA+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50IDwgTUFYX0ZJTEVTXCI+XG4gICAgICBDbGljayB0byBzZWxlY3QgZmlsZXNcbiAgICA8L3A+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50ID49IE1BWF9GSUxFU1wiIGNsYXNzPVwiZXJyb3ItdGV4dFwiPlxuICAgICAgTWF4aW11bSAxMCBkb2N1bWVudHMgYWxsb3dlZFxuICAgIDwvcD5cblxuICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gPHNtYWxsPlBERiBGaWxlcyBPbmx5IChNYXg6MjUgTUIpPC9zbWFsbD48L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2VsZWN0ZWQgRmlsZXMgTGlzdCAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiZmlsZS1saXN0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cbiAgICA8cD48c3Ryb25nPlNlbGVjdGVkIEZpbGVzPC9zdHJvbmc+PC9wPlxuXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtaXRlbVwiICpuZ0Zvcj1cImxldCBmaWxlIG9mIHNlbGVjdGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxzcGFuPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVGaWxlKGkpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImZpbGUtY3Jvc3MtaWNvblwiIG1hdFRvb2x0aXA9XCJSZW1vdmVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG48ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci10ZXh0XCI+XG4gIDxwPkRpc2NsYWltZXI6IFBsZWFzZSBkbyBub3QgdXBsb2FkIGFueSBjb25maWRlbnRpYWwgZG9jdW1lbnRzLjwvcD5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJtYXJnaW46IDIwcHggMDtcIj5cbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+Q2FuY2VsPC9idXR0b24+XG5cbiAgPGJ1dHRvbiBjbGFzcz1cInByaW1hcnktYnRuIGN1cnNvci1wb2ludGVyXCJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgKGNsaWNrKT1cInVwbG9hZCgpXCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRGaWxlcy5sZW5ndGggPT09IDBcIlxuICA+XG4gICAgVXBsb2FkXG4gIDwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cbiJdfQ==
|