@qbs-origin/origin-form 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/action-step-handler.mjs +163 -0
  3. package/esm2022/lib/auth-client.service.mjs +69 -0
  4. package/esm2022/lib/enums/label.keys.mjs +721 -0
  5. package/esm2022/lib/form-css.helper.mjs +367 -0
  6. package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
  7. package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
  8. package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
  9. package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
  10. package/esm2022/lib/formly/formly-action.mjs +56 -0
  11. package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
  12. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
  13. package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
  14. package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
  15. package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
  16. package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
  17. package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
  18. package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
  19. package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
  20. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
  21. package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
  22. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
  23. package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
  24. package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
  25. package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
  26. package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
  27. package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
  28. package/esm2022/lib/model-population.helper.mjs +265 -0
  29. package/esm2022/lib/models/application-type.model.mjs +12 -0
  30. package/esm2022/lib/models/application.model.mjs +30 -0
  31. package/esm2022/lib/models/auth/users.model.mjs +2 -0
  32. package/esm2022/lib/models/dictionary.model.mjs +20 -0
  33. package/esm2022/lib/models/flux.model.mjs +105 -0
  34. package/esm2022/lib/models/forms.model.mjs +572 -0
  35. package/esm2022/lib/models/label-info.model.mjs +2 -0
  36. package/esm2022/lib/models/label.model.mjs +2 -0
  37. package/esm2022/lib/models/language.model.mjs +3 -0
  38. package/esm2022/lib/models/list.model.mjs +2 -0
  39. package/esm2022/lib/models/partner.model.mjs +3 -0
  40. package/esm2022/lib/models/treeview.model.mjs +15 -0
  41. package/esm2022/lib/origin-form-auth.service.mjs +40 -0
  42. package/esm2022/lib/origin-form-config.model.mjs +2 -0
  43. package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
  44. package/esm2022/lib/origin-form.component.mjs +2391 -0
  45. package/esm2022/lib/origin-form.module.mjs +479 -0
  46. package/esm2022/lib/origin-form.service.mjs +14 -0
  47. package/esm2022/lib/others/check-list.database.mjs +55 -0
  48. package/esm2022/lib/others/config-service.mjs +42 -0
  49. package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
  50. package/esm2022/lib/others/environment-type.mjs +21 -0
  51. package/esm2022/lib/others/external-link.directive.mjs +49 -0
  52. package/esm2022/lib/others/flux-helper.mjs +1397 -0
  53. package/esm2022/lib/others/picker.component.mjs +119 -0
  54. package/esm2022/lib/others/translation.pipe.mjs +21 -0
  55. package/esm2022/lib/others/translations-helper.mjs +258 -0
  56. package/esm2022/lib/others/utils.mjs +272 -0
  57. package/esm2022/lib/services/applicationData.service.mjs +145 -0
  58. package/esm2022/lib/services/auth-http.service.mjs +80 -0
  59. package/esm2022/lib/services/dialog.service.mjs +56 -0
  60. package/esm2022/lib/services/dictionary.service.mjs +198 -0
  61. package/esm2022/lib/services/forms.service.mjs +47 -0
  62. package/esm2022/lib/services/labels.service.mjs +29 -0
  63. package/esm2022/lib/services/language.service.mjs +24 -0
  64. package/esm2022/lib/services/open-banking.service.mjs +194 -0
  65. package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
  66. package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
  67. package/esm2022/lib/services/otp.service.mjs +28 -0
  68. package/esm2022/lib/services/proxy.service.mjs +79 -0
  69. package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
  70. package/esm2022/lib/services/translation.service.mjs +27 -0
  71. package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
  72. package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
  73. package/esm2022/lib/shared-components/grid.component.mjs +241 -0
  74. package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
  75. package/esm2022/lib/theme-css.mjs +2254 -0
  76. package/esm2022/lib/theme-injector.service.mjs +26 -0
  77. package/esm2022/public-api.mjs +4 -0
  78. package/esm2022/qbs-origin-origin-form.mjs +5 -0
  79. package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
  80. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/action-step-handler.d.ts +49 -0
  83. package/lib/auth-client.service.d.ts +17 -0
  84. package/lib/enums/label.keys.d.ts +720 -0
  85. package/lib/form-css.helper.d.ts +28 -0
  86. package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
  87. package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
  88. package/lib/formly/custom-section-separator.component.d.ts +6 -0
  89. package/lib/formly/form-section-separator.component.d.ts +10 -0
  90. package/lib/formly/formly-action.d.ts +13 -0
  91. package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
  92. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
  93. package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
  94. package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
  95. package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
  96. package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
  97. package/lib/formly/formly-identification.component.d.ts +19 -0
  98. package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
  99. package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
  100. package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
  101. package/lib/formly/formly-row-fille.d.ts +6 -0
  102. package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
  103. package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
  104. package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
  105. package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
  106. package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
  107. package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
  108. package/lib/model-population.helper.d.ts +8 -0
  109. package/lib/models/application-type.model.d.ts +27 -0
  110. package/lib/models/application.model.d.ts +107 -0
  111. package/lib/models/auth/users.model.d.ts +20 -0
  112. package/lib/models/dictionary.model.d.ts +77 -0
  113. package/lib/models/flux.model.d.ts +101 -0
  114. package/lib/models/forms.model.d.ts +504 -0
  115. package/lib/models/label-info.model.d.ts +10 -0
  116. package/lib/models/label.model.d.ts +4 -0
  117. package/lib/models/language.model.d.ts +5 -0
  118. package/lib/models/list.model.d.ts +8 -0
  119. package/lib/models/partner.model.d.ts +12 -0
  120. package/lib/models/treeview.model.d.ts +17 -0
  121. package/lib/origin-form-auth.service.d.ts +15 -0
  122. package/lib/origin-form-config.model.d.ts +12 -0
  123. package/lib/origin-form-token.interceptor.d.ts +12 -0
  124. package/lib/origin-form.component.d.ts +231 -0
  125. package/lib/origin-form.module.d.ts +84 -0
  126. package/lib/origin-form.service.d.ts +6 -0
  127. package/lib/others/check-list.database.d.ts +16 -0
  128. package/lib/others/config-service.d.ts +22 -0
  129. package/lib/others/dictionary-label-info.d.ts +6 -0
  130. package/lib/others/environment-type.d.ts +8 -0
  131. package/lib/others/external-link.directive.d.ts +12 -0
  132. package/lib/others/flux-helper.d.ts +115 -0
  133. package/lib/others/picker.component.d.ts +36 -0
  134. package/lib/others/translation.pipe.d.ts +10 -0
  135. package/lib/others/translations-helper.d.ts +31 -0
  136. package/lib/others/utils.d.ts +37 -0
  137. package/lib/services/applicationData.service.d.ts +35 -0
  138. package/lib/services/auth-http.service.d.ts +21 -0
  139. package/lib/services/dialog.service.d.ts +20 -0
  140. package/lib/services/dictionary.service.d.ts +89 -0
  141. package/lib/services/forms.service.d.ts +17 -0
  142. package/lib/services/labels.service.d.ts +13 -0
  143. package/lib/services/language.service.d.ts +14 -0
  144. package/lib/services/open-banking.service.d.ts +137 -0
  145. package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
  146. package/lib/services/origin-form-signalr.service.d.ts +24 -0
  147. package/lib/services/otp.service.d.ts +22 -0
  148. package/lib/services/proxy.service.d.ts +29 -0
  149. package/lib/services/scroll-to-error.service.d.ts +54 -0
  150. package/lib/services/translation.service.d.ts +10 -0
  151. package/lib/shared-components/confirmation.component.d.ts +77 -0
  152. package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
  153. package/lib/shared-components/grid.component.d.ts +138 -0
  154. package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
  155. package/lib/theme-css.d.ts +2 -0
  156. package/lib/theme-injector.service.d.ts +8 -0
  157. package/package.json +42 -0
  158. package/public-api.d.ts +3 -0
  159. package/schematics-compiled/collection.json +10 -0
  160. package/schematics-compiled/ng-add/index.d.ts +2 -0
  161. package/schematics-compiled/ng-add/index.js +67 -0
  162. package/schematics-compiled/ng-add/index.js.map +1 -0
  163. package/schematics-compiled/ng-add/schema.json +8 -0
  164. package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
  165. package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
  166. package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
  167. package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
  171. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
  172. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
  173. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
  174. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
  175. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
  176. package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
  177. package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
  178. package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
  179. package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
  180. package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
  181. package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
  182. package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
@@ -0,0 +1,35 @@
1
+ import { Component } from '@angular/core';
2
+ import { BaseFormlyStepComponent } from '../baseFormlyStepComponent';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "../../others/external-link.directive";
6
+ export class FormlyParagraphComponent extends BaseFormlyStepComponent {
7
+ onInit() {
8
+ this.cssMargins = {
9
+ 'margin-top': this.props?.['design']?.['.component-text-field']?.['margin-top'],
10
+ 'margin-right': this.props?.['design']?.['.component-text-field']?.['margin-right'],
11
+ 'margin-bottom': this.props?.['design']?.['.component-text-field']?.['margin-bottom'],
12
+ 'margin-left': this.props?.['design']?.['.component-text-field']?.['margin-left'],
13
+ };
14
+ }
15
+ get formattedLabel() {
16
+ return this.formatDateIfNeeded(this.field.defaultValue).toString();
17
+ }
18
+ formatDateIfNeeded(value) {
19
+ if (!value)
20
+ return '';
21
+ let cleanValue = value.toString().trim();
22
+ // cast eg: "Fri Feb 14 2025 00:00:00 GMT+0200" → "2025-02-14"
23
+ if (/^\w{3} \w{3} \d{1,2} \d{4} \d{2}:\d{2}:\d{2} GMT[\+\-]\d{4}/.test(cleanValue)) {
24
+ return new Date(cleanValue).toISOString().split('T')[0];
25
+ }
26
+ return cleanValue;
27
+ }
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyParagraphComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyParagraphComponent, selector: "formly-paragraph", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mat-mdc-text-field-wrapper formly-paragraph\"\n [class.hasLabel]=\"title\"\n [ngStyle]=\"cssMargins\"\n appExternalLink\n>\n\n <ng-container *ngIf=\"props['controlType'] === 'Paragraph'\">\n <p *ngIf=\"props['translatedParagraphTitle']\" [ngStyle]=\"props['design']['.font-label']\">\n {{ props['translatedParagraphTitle'] }}\n </p>\n <p *ngIf=\"props['translatedDescription']\" [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ props['translatedDescription'] }}\n </p>\n </ng-container>\n\n <ng-container *ngIf=\"props['controlType'] !== 'Paragraph'\">\n <div\n class=\"component-text-field\"\n *ngIf=\"field?.defaultValue !== undefined && field?.defaultValue !== null\"\n >\n <p [ngStyle]=\"props['design']['.font-label']\">\n {{ field.props?.label }}\n </p>\n <p [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ field.defaultValue }}\n </p>\n </div>\n </ng-container>\n</div>\n", styles: [".formly-paragraph{border:none!important;background:none!important;padding:0;display:block}.formly-paragraph label{display:block}.formly-paragraph.hasLabel p{margin-top:.5rem}.mat-mdc-text-field-wrapper.formly-paragraph{padding:8px 16px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ExternalLinkDirective, selector: "[appExternalLink]" }] }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyParagraphComponent, decorators: [{
32
+ type: Component,
33
+ args: [{ selector: 'formly-paragraph', template: "<div\n class=\"mat-mdc-text-field-wrapper formly-paragraph\"\n [class.hasLabel]=\"title\"\n [ngStyle]=\"cssMargins\"\n appExternalLink\n>\n\n <ng-container *ngIf=\"props['controlType'] === 'Paragraph'\">\n <p *ngIf=\"props['translatedParagraphTitle']\" [ngStyle]=\"props['design']['.font-label']\">\n {{ props['translatedParagraphTitle'] }}\n </p>\n <p *ngIf=\"props['translatedDescription']\" [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ props['translatedDescription'] }}\n </p>\n </ng-container>\n\n <ng-container *ngIf=\"props['controlType'] !== 'Paragraph'\">\n <div\n class=\"component-text-field\"\n *ngIf=\"field?.defaultValue !== undefined && field?.defaultValue !== null\"\n >\n <p [ngStyle]=\"props['design']['.font-label']\">\n {{ field.props?.label }}\n </p>\n <p [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ field.defaultValue }}\n </p>\n </div>\n </ng-container>\n</div>\n", styles: [".formly-paragraph{border:none!important;background:none!important;padding:0;display:block}.formly-paragraph label{display:block}.formly-paragraph.hasLabel p{margin-top:.5rem}.mat-mdc-text-field-wrapper.formly-paragraph{padding:8px 16px}\n"] }]
34
+ }] });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXBhcmFncmFwaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL2Zvcm1seS9mb3JtbHktcGFyYWdyYXBoL2Zvcm1seS1wYXJhZ3JhcGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXBhcmFncmFwaC9mb3JtbHktcGFyYWdyYXBoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFPckUsTUFBTSxPQUFPLHdCQUF5QixTQUFRLHVCQUF1QjtJQUcxRCxNQUFNO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixZQUFZLEVBQ1YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNuRSxjQUFjLEVBQ1osSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUNyRSxlQUFlLEVBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUN0RSxhQUFhLEVBQ1gsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFVO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdEIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXpDLDhEQUE4RDtRQUM5RCxJQUNFLDZEQUE2RCxDQUFDLElBQUksQ0FDaEUsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDOytHQW5DVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwrRUNSckMsKzlCQThCQTs7NEZEdEJhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VGb3JtbHlTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZUZvcm1seVN0ZXBDb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktcGFyYWdyYXBoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm1seS1wYXJhZ3JhcGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybWx5LXBhcmFncmFwaC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVBhcmFncmFwaENvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtbHlTdGVwQ29tcG9uZW50IHtcbiAgY3NzTWFyZ2luczogYW55O1xuXG4gIG92ZXJyaWRlIG9uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNzc01hcmdpbnMgPSB7XG4gICAgICAnbWFyZ2luLXRvcCc6XG4gICAgICAgIHRoaXMucHJvcHM/LlsnZGVzaWduJ10/LlsnLmNvbXBvbmVudC10ZXh0LWZpZWxkJ10/LlsnbWFyZ2luLXRvcCddLFxuICAgICAgJ21hcmdpbi1yaWdodCc6XG4gICAgICAgIHRoaXMucHJvcHM/LlsnZGVzaWduJ10/LlsnLmNvbXBvbmVudC10ZXh0LWZpZWxkJ10/LlsnbWFyZ2luLXJpZ2h0J10sXG4gICAgICAnbWFyZ2luLWJvdHRvbSc6XG4gICAgICAgIHRoaXMucHJvcHM/LlsnZGVzaWduJ10/LlsnLmNvbXBvbmVudC10ZXh0LWZpZWxkJ10/LlsnbWFyZ2luLWJvdHRvbSddLFxuICAgICAgJ21hcmdpbi1sZWZ0JzpcbiAgICAgICAgdGhpcy5wcm9wcz8uWydkZXNpZ24nXT8uWycuY29tcG9uZW50LXRleHQtZmllbGQnXT8uWydtYXJnaW4tbGVmdCddLFxuICAgIH07XG4gIH1cblxuICBnZXQgZm9ybWF0dGVkTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlSWZOZWVkZWQodGhpcy5maWVsZC5kZWZhdWx0VmFsdWUpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGVJZk5lZWRlZCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICBsZXQgY2xlYW5WYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuXG4gICAgLy8gY2FzdCBlZzogXCJGcmkgRmViIDE0IDIwMjUgMDA6MDA6MDAgR01UKzAyMDBcIiDihpIgXCIyMDI1LTAyLTE0XCJcbiAgICBpZiAoXG4gICAgICAvXlxcd3szfSBcXHd7M30gXFxkezEsMn0gXFxkezR9IFxcZHsyfTpcXGR7Mn06XFxkezJ9IEdNVFtcXCtcXC1dXFxkezR9Ly50ZXN0KFxuICAgICAgICBjbGVhblZhbHVlXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoY2xlYW5WYWx1ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBjbGVhblZhbHVlO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIgZm9ybWx5LXBhcmFncmFwaFwiXG4gIFtjbGFzcy5oYXNMYWJlbF09XCJ0aXRsZVwiXG4gIFtuZ1N0eWxlXT1cImNzc01hcmdpbnNcIlxuICBhcHBFeHRlcm5hbExpbmtcbj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcHNbJ2NvbnRyb2xUeXBlJ10gPT09ICdQYXJhZ3JhcGgnXCI+XG4gICAgPHAgKm5nSWY9XCJwcm9wc1sndHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlJ11cIiBbbmdTdHlsZV09XCJwcm9wc1snZGVzaWduJ11bJy5mb250LWxhYmVsJ11cIj5cbiAgICAgIHt7IHByb3BzWyd0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGUnXSB9fVxuICAgIDwvcD5cbiAgICA8cCAqbmdJZj1cInByb3BzWyd0cmFuc2xhdGVkRGVzY3JpcHRpb24nXVwiIFtuZ1N0eWxlXT1cInByb3BzWydkZXNpZ24nXVsnLmZvbnQtcGFyYWdyYXBoJ11cIj5cbiAgICAgIHt7IHByb3BzWyd0cmFuc2xhdGVkRGVzY3JpcHRpb24nXSB9fVxuICAgIDwvcD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BzWydjb250cm9sVHlwZSddICE9PSAnUGFyYWdyYXBoJ1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY29tcG9uZW50LXRleHQtZmllbGRcIlxuICAgICAgKm5nSWY9XCJmaWVsZD8uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmllbGQ/LmRlZmF1bHRWYWx1ZSAhPT0gbnVsbFwiXG4gICAgPlxuICAgICAgPHAgW25nU3R5bGVdPVwicHJvcHNbJ2Rlc2lnbiddWycuZm9udC1sYWJlbCddXCI+XG4gICAgICAgIHt7IGZpZWxkLnByb3BzPy5sYWJlbCB9fVxuICAgICAgPC9wPlxuICAgICAgPHAgW25nU3R5bGVdPVwicHJvcHNbJ2Rlc2lnbiddWycuZm9udC1wYXJhZ3JhcGgnXVwiPlxuICAgICAgICB7eyBmaWVsZC5kZWZhdWx0VmFsdWUgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,49 @@
1
+ import { Component } from '@angular/core';
2
+ import { FieldType } from '@ngx-formly/core';
3
+ import { FormControl } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "ngx-markdown";
7
+ import * as i3 from "@angular/material/radio";
8
+ import * as i4 from "@ngx-formly/core";
9
+ import * as i5 from "../../others/external-link.directive";
10
+ export class FormlyRadioComponent extends FieldType {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.radioOptionsList = [];
14
+ this.title = '';
15
+ this.langIso = 'en';
16
+ }
17
+ ngOnInit() {
18
+ this.langIso = this.props['currentLanguageIso'];
19
+ this.title = this.props['label'] || '';
20
+ if (Array.isArray(this.to.options)) {
21
+ this.radioOptionsList = this.to.options;
22
+ }
23
+ }
24
+ get formControl() {
25
+ if (this.field.key) {
26
+ const keyPath = typeof this.field.key === 'string' || Array.isArray(this.field.key)
27
+ ? this.field.key
28
+ : String(this.field.key);
29
+ return this.form.get(keyPath);
30
+ }
31
+ return new FormControl();
32
+ }
33
+ onRadioChange(e) {
34
+ const selected = this.radioOptionsList.find((opt) => opt.value.id === e.value);
35
+ if (selected) {
36
+ this.formControl.setValue(selected.value);
37
+ if (this.props['onSelectedValueChanged']) {
38
+ this.props['onSelectedValueChanged'](selected.value);
39
+ }
40
+ }
41
+ }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyRadioComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
43
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyRadioComponent, selector: "formly-radio", usesInheritance: true, ngImport: i0, template: "<div class=\"mat-mdc-text-field-wrapper mdc-radiobox-field\" appExternalLink>\n <label>\n <markdown [data]=\"title\"></markdown>\n </label>\n <div *ngIf=\"radioOptionsList.length > 0\">\n <mat-radio-group [value]=\"formControl.value?.id\"\n (change)=\"onRadioChange($event)\">\n <ng-container *ngFor=\"let option of radioOptionsList\">\n <div>\n <mat-radio-button [value]=\"option.value.id\">\n {{ option.label }}\n </mat-radio-button>\n </div>\n </ng-container>\n </mat-radio-group>\n </div>\n <formly-validation-message *ngIf=\"showError\" [field]=\"field\">\n </formly-validation-message>\n</div>\n", styles: ["formly-validation-message{color:red;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "directive", type: i3.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i3.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i4.ɵFormlyValidationMessage, selector: "formly-validation-message", inputs: ["field"] }, { kind: "directive", type: i5.ExternalLinkDirective, selector: "[appExternalLink]" }] }); }
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyRadioComponent, decorators: [{
46
+ type: Component,
47
+ args: [{ selector: 'formly-radio', template: "<div class=\"mat-mdc-text-field-wrapper mdc-radiobox-field\" appExternalLink>\n <label>\n <markdown [data]=\"title\"></markdown>\n </label>\n <div *ngIf=\"radioOptionsList.length > 0\">\n <mat-radio-group [value]=\"formControl.value?.id\"\n (change)=\"onRadioChange($event)\">\n <ng-container *ngFor=\"let option of radioOptionsList\">\n <div>\n <mat-radio-button [value]=\"option.value.id\">\n {{ option.label }}\n </mat-radio-button>\n </div>\n </ng-container>\n </mat-radio-group>\n </div>\n <formly-validation-message *ngIf=\"showError\" [field]=\"field\">\n </formly-validation-message>\n</div>\n", styles: ["formly-validation-message{color:red;font-size:12px}\n"] }]
48
+ }] });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXJhZGlvLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvZm9ybWx5L2Zvcm1seS1yYWRpby9mb3JtbHktcmFkaW8tY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXJhZGlvL2Zvcm1seS1yYWRpby1jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFTN0MsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFNBQVM7SUFObkQ7O1FBT0UscUJBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQzdCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsWUFBTyxHQUFXLElBQUksQ0FBQztLQWdDeEI7SUE5QkMsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFhLFdBQVc7UUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sT0FBTyxHQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ2pFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBZ0IsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxhQUFhLENBQUMsQ0FBaUI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDekMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQ2xDLENBQUM7UUFDRixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQWxDVSxvQkFBb0I7bUdBQXBCLG9CQUFvQiwyRUNYakMsbXJCQW1CQTs7NEZEUmEsb0JBQW9CO2tCQU5oQyxTQUFTOytCQUNFLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFJhZGlvQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktcmFkaW8nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXJhZGlvLWNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybWx5LXJhZGlvLWNvbXBvbmVudC5zY3NzJ10sXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVJhZGlvQ29tcG9uZW50IGV4dGVuZHMgRmllbGRUeXBlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmFkaW9PcHRpb25zTGlzdDogYW55W10gPSBbXTtcbiAgdGl0bGU6IHN0cmluZyA9ICcnO1xuICBsYW5nSXNvOiBzdHJpbmcgPSAnZW4nO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ0lzbyA9IHRoaXMucHJvcHNbJ2N1cnJlbnRMYW5ndWFnZUlzbyddO1xuICAgIHRoaXMudGl0bGUgPSB0aGlzLnByb3BzWydsYWJlbCddIHx8ICcnO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudG8ub3B0aW9ucykpIHtcbiAgICAgIHRoaXMucmFkaW9PcHRpb25zTGlzdCA9IHRoaXMudG8ub3B0aW9ucztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBnZXQgZm9ybUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xuICAgIGlmICh0aGlzLmZpZWxkLmtleSkge1xuICAgICAgY29uc3Qga2V5UGF0aCA9XG4gICAgICAgIHR5cGVvZiB0aGlzLmZpZWxkLmtleSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmZpZWxkLmtleSlcbiAgICAgICAgICA/IHRoaXMuZmllbGQua2V5XG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5maWVsZC5rZXkpO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoa2V5UGF0aCkgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woKTtcbiAgfVxuXG4gIG9uUmFkaW9DaGFuZ2UoZTogTWF0UmFkaW9DaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucmFkaW9PcHRpb25zTGlzdC5maW5kKFxuICAgICAgKG9wdCkgPT4gb3B0LnZhbHVlLmlkID09PSBlLnZhbHVlXG4gICAgKTtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoc2VsZWN0ZWQudmFsdWUpO1xuICAgICAgaWYgKHRoaXMucHJvcHNbJ29uU2VsZWN0ZWRWYWx1ZUNoYW5nZWQnXSkge1xuICAgICAgICB0aGlzLnByb3BzWydvblNlbGVjdGVkVmFsdWVDaGFuZ2VkJ10oc2VsZWN0ZWQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIG1kYy1yYWRpb2JveC1maWVsZFwiIGFwcEV4dGVybmFsTGluaz5cbiAgPGxhYmVsPlxuICAgIDxtYXJrZG93biBbZGF0YV09XCJ0aXRsZVwiPjwvbWFya2Rvd24+XG4gIDwvbGFiZWw+XG4gIDxkaXYgKm5nSWY9XCJyYWRpb09wdGlvbnNMaXN0Lmxlbmd0aCA+IDBcIj5cbiAgICA8bWF0LXJhZGlvLWdyb3VwIFt2YWx1ZV09XCJmb3JtQ29udHJvbC52YWx1ZT8uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiByYWRpb09wdGlvbnNMaXN0XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZS5pZFwiPlxuICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICA8L2Rpdj5cbiAgPGZvcm1seS12YWxpZGF0aW9uLW1lc3NhZ2UgKm5nSWY9XCJzaG93RXJyb3JcIiBbZmllbGRdPVwiZmllbGRcIj5cbiAgPC9mb3JtbHktdmFsaWRhdGlvbi1tZXNzYWdlPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { Component } from '@angular/core';
2
+ import { FieldType } from '@ngx-formly/core';
3
+ import * as i0 from "@angular/core";
4
+ export class RowFillerComponent extends FieldType {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RowFillerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
6
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RowFillerComponent, selector: "formly-row-filler", usesInheritance: true, ngImport: i0, template: `<div class="row-filler"></div>`, isInline: true, styles: [".row-filler{width:100%}\n"] }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RowFillerComponent, decorators: [{
9
+ type: Component,
10
+ args: [{ selector: 'formly-row-filler', template: `<div class="row-filler"></div>`, styles: [".row-filler{width:100%}\n"] }]
11
+ }] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXJvdy1maWxsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvZm9ybWx5L2Zvcm1seS1yb3ctZmlsbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBYTdDLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTOytHQUFwQyxrQkFBa0I7bUdBQWxCLGtCQUFrQixnRkFUbkIsZ0NBQWdDOzs0RkFTL0Isa0JBQWtCO2tCQVg5QixTQUFTOytCQUNFLG1CQUFtQixZQUNuQixnQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktcm93LWZpbGxlcicsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInJvdy1maWxsZXJcIj48L2Rpdj5gLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAucm93LWZpbGxlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJvd0ZpbGxlckNvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZSB7fSJdfQ==
@@ -0,0 +1,284 @@
1
+ import { Component, ViewChild, } from '@angular/core';
2
+ import { FormControl, Validators } from '@angular/forms';
3
+ import { FieldType } from '@ngx-formly/core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/applicationData.service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@angular/material/button";
8
+ import * as i4 from "@angular/material/icon";
9
+ import * as i5 from "@angular/material/progress-spinner";
10
+ export class FormlyScanIdComponent extends FieldType {
11
+ constructor(appDataService, cdr) {
12
+ super();
13
+ this.appDataService = appDataService;
14
+ this.cdr = cdr;
15
+ this.control = new FormControl('', [Validators.required]);
16
+ this.fileError = null;
17
+ this.fileNameFront = '';
18
+ this.fileNameBack = '';
19
+ this.validFormats = [];
20
+ this.maxFileSizeKB = 0;
21
+ this.cardTypeSelected = false;
22
+ this.oldIdCard = false;
23
+ this.frontPhotoUploaded = false;
24
+ this.backPhotoUploaded = false;
25
+ this.photoBase64Front = '';
26
+ this.photoBase64Back = '';
27
+ this.isLoading = false;
28
+ this.successMessage = null;
29
+ this.videoStream = null;
30
+ this.isScanValid = true;
31
+ }
32
+ ngOnInit() {
33
+ const group = this.form;
34
+ group.addControl(this.props['identifier'], this.control);
35
+ this.validFormats = this.props['config'].allowedFormats?.split(',') || [
36
+ '.jpg',
37
+ '.png',
38
+ ];
39
+ this.maxFileSizeKB = this.props['config'].maxFileSizeKB || 2000;
40
+ if (this.props['config'].collected) {
41
+ const value = this.form.get(this.props['config'].componentCollected)?.value;
42
+ this.control.setValue(value);
43
+ this.form
44
+ .get(this.props['config'].componentCollected)
45
+ ?.valueChanges.subscribe(() => {
46
+ this.control.setValue(this.form.get(this.props['config'].componentCollected)?.value);
47
+ });
48
+ }
49
+ }
50
+ selectCardType(isOldIdCard) {
51
+ this.oldIdCard = isOldIdCard;
52
+ this.cardTypeSelected = true;
53
+ this.resetForm();
54
+ }
55
+ onFileSelected(event, isFront) {
56
+ const file = event.target.files[0];
57
+ if (file) {
58
+ const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();
59
+ const fileSizeKB = file.size / 1024;
60
+ if (!this.validFormats.includes(fileExtension)) {
61
+ this.fileError = (this.props['errorMessages']?.invalidType ||
62
+ `Invalid file type. Allowed formats are ${this.validFormats.join(', ')}`).replace('{formats}', this.validFormats.join(', '));
63
+ this.control.setErrors({ invalidType: true });
64
+ return;
65
+ }
66
+ if (fileSizeKB > this.maxFileSizeKB || fileSizeKB < 1) {
67
+ this.fileError = (this.props['errorMessages']?.maxSize ||
68
+ `File size must be between 1KB and ${this.maxFileSizeKB}KB.`).replace('{size}', this.maxFileSizeKB);
69
+ this.control.setErrors({ invalidSize: true });
70
+ return;
71
+ }
72
+ this.fileError = null;
73
+ const reader = new FileReader();
74
+ reader.readAsDataURL(file);
75
+ reader.onload = () => {
76
+ if (isFront) {
77
+ this.fileNameFront = file.name;
78
+ this.photoBase64Front = reader.result?.toString().split(',')[1] || '';
79
+ this.frontPhotoUploaded = true;
80
+ this.cdr.detectChanges();
81
+ }
82
+ else {
83
+ this.fileNameBack = file.name;
84
+ this.photoBase64Back = reader.result?.toString().split(',')[1] || '';
85
+ this.backPhotoUploaded = true;
86
+ this.cdr.detectChanges();
87
+ }
88
+ this.checkUploadCondition();
89
+ };
90
+ }
91
+ }
92
+ takePicture() {
93
+ this.resetForm();
94
+ if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
95
+ navigator.mediaDevices
96
+ .enumerateDevices()
97
+ .then((devices) => {
98
+ const videoDevices = devices.filter((device) => device.kind === 'videoinput');
99
+ if (videoDevices.length === 0) {
100
+ this.fileError = 'No camera devices found.';
101
+ return;
102
+ }
103
+ if (videoDevices.length === 1) {
104
+ this.startCamera(videoDevices[0].deviceId);
105
+ }
106
+ else {
107
+ const selectedDeviceId = prompt('Select camera', videoDevices.map((device) => device.label).join(', '));
108
+ const selectedDevice = videoDevices.find((device) => device.label === selectedDeviceId);
109
+ if (selectedDevice) {
110
+ this.startCamera(selectedDevice.deviceId);
111
+ }
112
+ else {
113
+ this.fileError = 'Invalid camera selection.';
114
+ }
115
+ }
116
+ })
117
+ .catch(() => {
118
+ this.fileError = 'Unable to access the camera devices.';
119
+ });
120
+ }
121
+ else {
122
+ this.fileError = 'Camera not supported by this device.';
123
+ }
124
+ }
125
+ startCamera(deviceId) {
126
+ navigator.mediaDevices
127
+ .getUserMedia({ video: { deviceId } })
128
+ .then((stream) => {
129
+ this.videoStream = stream;
130
+ this.videoElement.nativeElement.srcObject = stream;
131
+ this.videoElement.nativeElement.play();
132
+ })
133
+ .catch(() => {
134
+ this.fileError = 'Unable to access the selected camera.';
135
+ });
136
+ }
137
+ capturePhoto(isFront) {
138
+ if (!this.videoElement.nativeElement) {
139
+ this.fileError = 'No video element available.';
140
+ return;
141
+ }
142
+ const video = this.videoElement.nativeElement;
143
+ const canvas = document.createElement('canvas');
144
+ canvas.width = video.videoWidth;
145
+ canvas.height = video.videoHeight;
146
+ const context = canvas.getContext('2d');
147
+ context?.drawImage(video, 0, 0, canvas.width, canvas.height);
148
+ this.isLoading = true;
149
+ canvas.toBlob((blob) => {
150
+ if (blob) {
151
+ const reader = new FileReader();
152
+ reader.readAsDataURL(blob);
153
+ reader.onloadend = () => {
154
+ if (isFront) {
155
+ this.photoBase64Front =
156
+ reader.result?.toString().split(',')[1] || '';
157
+ this.frontPhotoUploaded = true;
158
+ }
159
+ else {
160
+ this.photoBase64Back =
161
+ reader.result?.toString().split(',')[1] || '';
162
+ this.backPhotoUploaded = true;
163
+ }
164
+ this.isLoading = false;
165
+ this.checkUploadCondition();
166
+ this.cdr.detectChanges();
167
+ };
168
+ }
169
+ if (this.videoStream) {
170
+ this.videoStream.getTracks().forEach((track) => track.stop());
171
+ this.videoStream = null;
172
+ }
173
+ }, 'image/jpeg');
174
+ }
175
+ uploadPhoto() {
176
+ this.isLoading = true;
177
+ this.cdr.detectChanges();
178
+ const command = {
179
+ appId: this.props['appId'],
180
+ appDataId: this.props['appDataId'],
181
+ stepId: this.props['stepId'],
182
+ oldIdCard: this.oldIdCard,
183
+ photos: this.oldIdCard
184
+ ? [{ base64: this.photoBase64Front }]
185
+ : [{ base64: this.photoBase64Front }, { base64: this.photoBase64Back }],
186
+ };
187
+ this.appDataService.scanId(command).subscribe({
188
+ next: async (result) => {
189
+ console.log('Scan ID result:', result);
190
+ this.isLoading = false;
191
+ var appData = await this.appDataService.getSteps(this.props['appDataId']);
192
+ if (appData) {
193
+ const status = this.extractStatusFromAppData(appData);
194
+ console.log('[SCAN-ID] extracted status:', status);
195
+ if (status?.toLowerCase().includes('invalid')) {
196
+ this.fileError =
197
+ this.props['errorMessages']?.invalidStatus ||
198
+ 'Invalid status response.';
199
+ this.resetForm(true);
200
+ this.control.setErrors({ invalidStatus: true });
201
+ this.cdr.detectChanges();
202
+ return;
203
+ }
204
+ this.isScanValid = true;
205
+ this.successMessage = 'Upload successful!';
206
+ if (this.props['event']) {
207
+ this.props['event'](appData);
208
+ }
209
+ }
210
+ this.cdr.detectChanges();
211
+ },
212
+ error: (err) => {
213
+ this.fileError = 'An error occurred while processing the scan.';
214
+ console.error('Scan ID error:', err);
215
+ this.isLoading = false;
216
+ this.cdr.detectChanges();
217
+ this.resetForm();
218
+ },
219
+ });
220
+ }
221
+ resetForm(preserveError = false) {
222
+ this.fileNameFront = '';
223
+ this.fileNameBack = '';
224
+ this.photoBase64Front = '';
225
+ this.photoBase64Back = '';
226
+ this.frontPhotoUploaded = false;
227
+ this.backPhotoUploaded = false;
228
+ if (!preserveError) {
229
+ this.fileError = null;
230
+ }
231
+ this.videoStream = null;
232
+ this.control.reset();
233
+ this.isLoading = false;
234
+ this.successMessage = null;
235
+ }
236
+ checkUploadCondition() {
237
+ if (this.oldIdCard || (this.frontPhotoUploaded && this.backPhotoUploaded)) {
238
+ this.uploadPhoto();
239
+ }
240
+ }
241
+ extractStatusFromAppData(appData) {
242
+ if (!appData?.fillData || !this.props['stepId'])
243
+ return null;
244
+ let fillData;
245
+ try {
246
+ fillData =
247
+ typeof appData.fillData === 'string'
248
+ ? JSON.parse(appData.fillData)
249
+ : appData.fillData;
250
+ }
251
+ catch (e) {
252
+ console.error('[extractStatusFromAppData] JSON parse error', e);
253
+ return null;
254
+ }
255
+ const step = fillData.flux.find((s) => s.stepId === this.props['stepId']);
256
+ if (!step?.sections)
257
+ return null;
258
+ for (const section of step.sections) {
259
+ for (const control of section.controls || []) {
260
+ if (typeof control.fillValue === 'string' &&
261
+ control.fillValue.trim() !== '') {
262
+ return control.fillValue.trim();
263
+ }
264
+ }
265
+ }
266
+ return null;
267
+ }
268
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyScanIdComponent, deps: [{ token: i1.ApplicationDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
269
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyScanIdComponent, selector: "app-formly-scan-id", viewQueries: [{ propertyName: "fileInputFront", first: true, predicate: ["fileInputFront"], descendants: true }, { propertyName: "fileInputBack", first: true, predicate: ["fileInputBack"], descendants: true }, { propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyScanIdComponent, decorators: [{
272
+ type: Component,
273
+ args: [{ selector: 'app-formly-scan-id', template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"] }]
274
+ }], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i0.ChangeDetectorRef }], propDecorators: { fileInputFront: [{
275
+ type: ViewChild,
276
+ args: ['fileInputFront']
277
+ }], fileInputBack: [{
278
+ type: ViewChild,
279
+ args: ['fileInputBack']
280
+ }], videoElement: [{
281
+ type: ViewChild,
282
+ args: ['videoElement']
283
+ }] } });
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFHVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFVN0MsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFNBQVM7SUFzQmxELFlBQ1UsY0FBc0MsRUFDdEMsR0FBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFIQSxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2QmhDLFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixH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UUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUNFLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRO29CQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDL0IsQ0FBQztvQkFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0F6VFUscUJBQXFCO21HQUFyQixxQkFBcUIsbVlDbEJsQyxraUhBMEVNOzs0RkR4RE8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG9CQUFvQjsySEFvQkQsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0MsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNDLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbkRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBTY2FuSWREdG8gfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQXBwRGF0YUZpbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybWx5LXNjYW4taWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtbHktc2Nhbi1pZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlTY2FuSWRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGUgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgZmlsZUVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmlsZU5hbWVGcm9udDogc3RyaW5nID0gJyc7XG4gIGZpbGVOYW1lQmFjazogc3RyaW5nID0gJyc7XG4gIHZhbGlkRm9ybWF0czogc3RyaW5nW10gPSBbXTtcbiAgbWF4RmlsZVNpemVLQjogbnVtYmVyID0gMDtcbiAgY2FyZFR5cGVTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbGRJZENhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZnJvbnRQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJhY2tQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHBob3RvQmFzZTY0RnJvbnQ6IHN0cmluZyA9ICcnO1xuICBwaG90b0Jhc2U2NEJhY2s6IHN0cmluZyA9ICcnO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEZyb250JykgZmlsZUlucHV0RnJvbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEJhY2snKSBmaWxlSW5wdXRCYWNrOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd2aWRlb0VsZW1lbnQnKSB2aWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICBpc1NjYW5WYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKHRoaXMucHJvcHNbJ2lkZW50aWZpZXInXSwgdGhpcy5jb250cm9sKTtcblxuICAgIHRoaXMudmFsaWRGb3JtYXRzID0gdGhpcy5wcm9wc1snY29uZmlnJ10uYWxsb3dlZEZvcm1hdHM/LnNwbGl0KCcsJykgfHwgW1xuICAgICAgJy5qcGcnLFxuICAgICAgJy5wbmcnLFxuICAgIF07XG4gICAgdGhpcy5tYXhGaWxlU2l6ZUtCID0gdGhpcy5wcm9wc1snY29uZmlnJ10ubWF4RmlsZVNpemVLQiB8fCAyMDAwO1xuXG4gICAgaWYgKHRoaXMucHJvcHNbJ2NvbmZpZyddLmNvbGxlY3RlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICB0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWRcbiAgICAgICk/LnZhbHVlO1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgdGhpcy5mb3JtXG4gICAgICAgIC5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKVxuICAgICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKT8udmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDYXJkVHlwZShpc09sZElkQ2FyZDogYm9vbGVhbikge1xuICAgIHRoaXMub2xkSWRDYXJkID0gaXNPbGRJZENhcmQ7XG4gICAgdGhpcy5jYXJkVHlwZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSwgaXNGcm9udDogYm9vbGVhbikge1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGZpbGVTaXplS0IgPSBmaWxlLnNpemUgLyAxMDI0O1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRGb3JtYXRzLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uaW52YWxpZFR5cGUgfHxcbiAgICAgICAgICBgSW52YWxpZCBmaWxlIHR5cGUuIEFsbG93ZWQgZm9ybWF0cyBhcmUgJHt0aGlzLnZhbGlkRm9ybWF0cy5qb2luKFxuICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICl9YFxuICAgICAgICApLnJlcGxhY2UoJ3tmb3JtYXRzfScsIHRoaXMudmFsaWRGb3JtYXRzLmpvaW4oJywgJykpO1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgaW52YWxpZFR5cGU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVTaXplS0IgPiB0aGlzLm1heEZpbGVTaXplS0IgfHwgZmlsZVNpemVLQiA8IDEpIHtcbiAgICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5tYXhTaXplIHx8XG4gICAgICAgICAgYEZpbGUgc2l6ZSBtdXN0IGJlIGJldHdlZW4gMUtCIGFuZCAke3RoaXMubWF4RmlsZVNpemVLQn1LQi5gXG4gICAgICAgICkucmVwbGFjZSgne3NpemV9JywgdGhpcy5tYXhGaWxlU2l6ZUtCKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7IGludmFsaWRTaXplOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgdGhpcy5maWxlTmFtZUZyb250ID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9IHJlYWRlci5yZXN1bHQ/LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID0gcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hlY2tVcGxvYWRDb25kaXRpb24oKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFrZVBpY3R1cmUoKSB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcblxuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykge1xuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAuZW51bWVyYXRlRGV2aWNlcygpXG4gICAgICAgIC50aGVuKChkZXZpY2VzKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9EZXZpY2VzID0gZGV2aWNlcy5maWx0ZXIoXG4gICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gJ3ZpZGVvaW5wdXQnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdObyBjYW1lcmEgZGV2aWNlcyBmb3VuZC4nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHZpZGVvRGV2aWNlc1swXS5kZXZpY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGV2aWNlSWQgPSBwcm9tcHQoXG4gICAgICAgICAgICAgICdTZWxlY3QgY2FtZXJhJyxcbiAgICAgICAgICAgICAgdmlkZW9EZXZpY2VzLm1hcCgoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwpLmpvaW4oJywgJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERldmljZSA9IHZpZGVvRGV2aWNlcy5maW5kKFxuICAgICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwgPT09IHNlbGVjdGVkRGV2aWNlSWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZSkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHNlbGVjdGVkRGV2aWNlLmRldmljZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0ludmFsaWQgY2FtZXJhIHNlbGVjdGlvbi4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdVbmFibGUgdG8gYWNjZXNzIHRoZSBjYW1lcmEgZGV2aWNlcy4nO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnQ2FtZXJhIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuJztcbiAgICB9XG4gIH1cblxuICBzdGFydENhbWVyYShkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB7IGRldmljZUlkIH0gfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy52aWRlb1N0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIGNhbWVyYS4nO1xuICAgICAgfSk7XG4gIH1cblxuICBjYXB0dXJlUGhvdG8oaXNGcm9udDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnTm8gdmlkZW8gZWxlbWVudCBhdmFpbGFibGUuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQ/LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgICB0aGlzLnBob3RvQmFzZTY0RnJvbnQgPVxuICAgICAgICAgICAgICByZWFkZXIucmVzdWx0Py50b1N0cmluZygpLnNwbGl0KCcsJylbMV0gfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID1cbiAgICAgICAgICAgICAgcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkQ29uZGl0aW9uKCk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aWRlb1N0cmVhbSkge1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAnaW1hZ2UvanBlZycpO1xuICB9XG5cbiAgdXBsb2FkUGhvdG8oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBjb21tYW5kOiBTY2FuSWREdG8gPSB7XG4gICAgICBhcHBJZDogdGhpcy5wcm9wc1snYXBwSWQnXSxcbiAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICBzdGVwSWQ6IHRoaXMucHJvcHNbJ3N0ZXBJZCddLFxuICAgICAgb2xkSWRDYXJkOiB0aGlzLm9sZElkQ2FyZCxcbiAgICAgIHBob3RvczogdGhpcy5vbGRJZENhcmRcbiAgICAgICAgPyBbeyBiYXNlNjQ6IHRoaXMucGhvdG9CYXNlNjRGcm9udCB9XVxuICAgICAgICA6IFt7IGJhc2U2NDogdGhpcy5waG90b0Jhc2U2NEZyb250IH0sIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0QmFjayB9XSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHBEYXRhU2VydmljZS5zY2FuSWQoY29tbWFuZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1NjYW4gSUQgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2FwcERhdGFJZCddXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFwcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NDQU4tSURdIGV4dHJhY3RlZCBzdGF0dXM6Jywgc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChzdGF0dXM/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmludmFsaWRTdGF0dXMgfHxcbiAgICAgICAgICAgICAgJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlLic7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkU3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNTY2FuVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwhJztcbiAgICAgICAgICBpZiAodGhpcy5wcm9wc1snZXZlbnQnXSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wc1snZXZlbnQnXShhcHBEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNjYW4uJztcbiAgICAgICAgY29uc29sZS5lcnJvcignU2NhbiBJRCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRGb3JtKHByZXNlcnZlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9ICcnO1xuICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEZyb250ID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEJhY2sgPSAnJztcbiAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXByZXNlcnZlRXJyb3IpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy52aWRlb1N0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gbnVsbDtcbiAgfVxuXG4gIGNoZWNrVXBsb2FkQ29uZGl0aW9uKCkge1xuICAgIGlmICh0aGlzLm9sZElkQ2FyZCB8fCAodGhpcy5mcm9udFBob3RvVXBsb2FkZWQgJiYgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCkpIHtcbiAgICAgIHRoaXMudXBsb2FkUGhvdG8oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWFwcERhdGE/LmZpbGxEYXRhIHx8ICF0aGlzLnByb3BzWydzdGVwSWQnXSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZmlsbERhdGE6IEFwcERhdGFGaWxsO1xuICAgIHRyeSB7XG4gICAgICBmaWxsRGF0YSA9XG4gICAgICAgIHR5cGVvZiBhcHBEYXRhLmZpbGxEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gKEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSkgYXMgQXBwRGF0YUZpbGwpXG4gICAgICAgICAgOiBhcHBEYXRhLmZpbGxEYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tleHRyYWN0U3RhdHVzRnJvbUFwcERhdGFdIEpTT04gcGFyc2UgZXJyb3InLCBlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogYW55KSA9PiBzLnN0ZXBJZCA9PT0gdGhpcy5wcm9wc1snc3RlcElkJ11cbiAgICApO1xuICAgIGlmICghc3RlcD8uc2VjdGlvbnMpIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgY29udHJvbC5maWxsVmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgY29udHJvbC5maWxsVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY29udHJvbC5maWxsVmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY2FuLWlkLWNvbnRhaW5lclwiPlxuICA8aDIgY2xhc3M9XCJ0aXRsZVwiPnt7IHByb3BzW1wibmFtZVwiXSB9fTwvaDI+XG4gIDxwIGNsYXNzPVwiZGVzY3JpcHRpb25cIj57eyBwcm9wc1tcImRlc2NyaXB0aW9uXCJdIH19PC9wPlxuXG4gIDwhLS0gU2VsZWN0aW9uIFN0ZXAgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLXNlbGVjdGlvbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25cIlxuICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwib2xkSWRDYXJkID09PSB0cnVlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2FyZFR5cGUodHJ1ZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL29sZC1pZC1jYXJkLnBuZ1wiIGFsdD1cIk9sZCBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9uXCJcbiAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9sZElkQ2FyZCA9PT0gZmFsc2UgJiYgY2FyZFR5cGVTZWxlY3RlZFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXJkVHlwZShmYWxzZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL25ldy1pZC1jYXJkLnBuZ1wiIGFsdD1cIk5ldyBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj5cbiAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNhcmRUeXBlU2VsZWN0ZWQgJiYgIWlzTG9hZGluZ1wiIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIDwhLS0gU3RlcCAxOiBVcGxvYWQgRnJvbnQgUGhvdG8gLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFmcm9udFBob3RvVXBsb2FkZWRcIiBjbGFzcz1cInVwbG9hZC1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICA8cD57eyBwcm9wc1snbGFiZWxzJ10udXBsb2FkRnJvbnRQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGZyb250IHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nIH19PC9wPlxuICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgI2ZpbGVJbnB1dEZyb250IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiIGhpZGRlbiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImZpbGVJbnB1dEZyb250LmNsaWNrKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgIHt7IGZpbGVOYW1lRnJvbnQgPyBmaWxlTmFtZUZyb250IDogcHJvcHNbJ2xhYmVscyddLnVwbG9hZEZpbGVCdXR0b25UcmFuc2xhdGlvbnMgfHwgJ1VwbG9hZCBGcm9udCBQaG90bycgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImZpbGVFcnJvclwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICB7eyBmaWxlRXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwIDI6IFVwbG9hZCBCYWNrIFBob3RvIChPbmx5IGZvciBOZXcgSUQgQ2FyZHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmcm9udFBob3RvVXBsb2FkZWQgJiYgIW9sZElkQ2FyZCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgPHA+e3sgcHJvcHNbJ2xhYmVscyddLnVwbG9hZEJhY2tQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGJhY2sgcGhvdG8gb2YgeW91ciBJRCBjYXJkLicgfX08L3A+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0QmFjayAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudCwgZmFsc2UpXCIgaGlkZGVuIC8+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZmlsZUlucHV0QmFjay5jbGljaygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICB7eyBmaWxlTmFtZUJhY2sgPyBmaWxlTmFtZUJhY2sgOiBwcm9wc1snbGFiZWxzJ10udXBsb2FkRmlsZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVXBsb2FkIEJhY2sgUGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWxlRXJyb3JcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgZmlsZUVycm9yIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gXG4gICAgPCEtLSBUYWtlIFBob3RvIEJ1dHRvbiAoT3B0aW9uYWwpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJwcm9wc1snY29uZmlnJ10uc2hvd1Rha2VQaWN0dXJlQnV0dG9uXCIgY2xhc3M9XCJ0YWtlLXBob3RvLWNvbnRhaW5lclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwidGFrZVBpY3R1cmUoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2FtZXJhX2FsdDwvbWF0LWljb24+XG4gICAgICAgIHt7IHByb3BzWydsYWJlbHMnXS50YWtlUGljdHVyZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8dmlkZW8gI3ZpZGVvRWxlbWVudCAqbmdJZj1cInZpZGVvU3RyZWFtXCIgd2lkdGg9XCIxMDAlXCIgY2xhc3M9XCJ2aWRlby1wcmV2aWV3XCIgYXV0b3BsYXk+PC92aWRlbz5cblxuICAgICAgPCEtLSBUYWtlIEZyb250IFBob3RvIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKm5nSWY9XCJ2aWRlb1N0cmVhbSAmJiAhZnJvbnRQaG90b1VwbG9hZGVkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byh0cnVlKVwiPlxuICAgICAgICA8bWF0LWljb24+cGhvdG9fY2FtZXJhPC9tYXQtaWNvbj5cbiAgICAgICAge3sgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5mcm9udElkIHx8ICdUYWtlIGEgcGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBUYWtlIEJhY2sgUGhvdG8gLS0+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAqbmdJZj1cInZpZGVvU3RyZWFtICYmIGZyb250UGhvdG9VcGxvYWRlZCAmJiAhb2xkSWRDYXJkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byhmYWxzZSlcIj5cbiAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgIHt7IHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uYmFja0lkICB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic3VjY2Vzc01lc3NhZ2UgJiYgaXNTY2FuVmFsaWRcIiBjbGFzcz1cInN1Y2Nlc3MtbWVzc2FnZS1jb250YWluZXJcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJsYXJnZS1pY29uXCIgY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=