@touchpoll/tp-survey 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.
Files changed (99) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/component/answer/answer.additional/answer.additional.component.mjs +49 -0
  3. package/esm2022/lib/component/answer/answer.additional/directive/additional.answer.caption.position/additional.answer.caption.position.directive.mjs +61 -0
  4. package/esm2022/lib/component/answer/answer.end/answer.end.component.mjs +30 -0
  5. package/esm2022/lib/component/answer/answer.info/answer.info.component.mjs +30 -0
  6. package/esm2022/lib/component/answer/answer.lang/answer.lang.component.mjs +22 -0
  7. package/esm2022/lib/component/answer/answer.master/answer.master.component.mjs +55 -0
  8. package/esm2022/lib/component/answer/answer.ms/answer.ms.component.mjs +106 -0
  9. package/esm2022/lib/component/answer/answer.od/answer.od.component.mjs +39 -0
  10. package/esm2022/lib/component/answer/answer.ol/answer.ol.component.mjs +39 -0
  11. package/esm2022/lib/component/answer/answer.sl/answer.sl.component.mjs +131 -0
  12. package/esm2022/lib/component/answer/answer.sl/pipe/as.form.array/as.form.array.pipe.mjs +17 -0
  13. package/esm2022/lib/component/answer/answer.sl/pipe/as.form.control/as.form.control.pipe.mjs +17 -0
  14. package/esm2022/lib/component/answer/answer.ss/answer.ss.component.mjs +51 -0
  15. package/esm2022/lib/component/answer/container.answer/container.answer.component.mjs +317 -0
  16. package/esm2022/lib/component/answer/container.answer/container.answer.validator.mjs +124 -0
  17. package/esm2022/lib/component/navigation.button/navigation.button.component.mjs +21 -0
  18. package/esm2022/lib/component/question.caption/question.caption.component.mjs +15 -0
  19. package/esm2022/lib/component/survey.play/survey.play.component.mjs +131 -0
  20. package/esm2022/lib/component/survey.question.preview/survey.question.preview.component.mjs +44 -0
  21. package/esm2022/lib/core/tp.servey.quota/tp.survey.quota.mjs +82 -0
  22. package/esm2022/lib/core/tp.survey.answer/tp.survey.answer.mjs +30 -0
  23. package/esm2022/lib/core/tp.survey.core/tp.survey.core.service.mjs +370 -0
  24. package/esm2022/lib/core/tp.survey.interview/tp.survey.interview.service.mjs +70 -0
  25. package/esm2022/lib/core/tp.survey.logic/tp.survey.logic.service.mjs +43 -0
  26. package/esm2022/lib/directive/alternatives.container/alternatives.container.directive.mjs +130 -0
  27. package/esm2022/lib/directive/focus.and.select/focus.and.select.directive.mjs +27 -0
  28. package/esm2022/lib/directive/survey.theme/survey.theme.directive.mjs +53 -0
  29. package/esm2022/lib/directive/update.font.size/update.font.size.directive.mjs +28 -0
  30. package/esm2022/lib/icons/default.icons/default.icons.mjs +15 -0
  31. package/esm2022/lib/icons/default.icons/default.icons.module.mjs +31 -0
  32. package/esm2022/lib/pipe/get.active.language/get.active.language.pipe.mjs +17 -0
  33. package/esm2022/lib/pipe/get.additional.value.by.value/get.additional.value.by.value.pipe.mjs +18 -0
  34. package/esm2022/lib/pipe/key.values/key.values.pipe.mjs +20 -0
  35. package/esm2022/lib/pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe.mjs +26 -0
  36. package/esm2022/lib/tp.survey.config.mjs +8 -0
  37. package/esm2022/lib/tp.survey.const.mjs +28 -0
  38. package/esm2022/lib/tp.survey.enum.mjs +59 -0
  39. package/esm2022/lib/tp.survey.interface.mjs +2 -0
  40. package/esm2022/lib/tp.survey.method.mjs +5 -0
  41. package/esm2022/lib/tp.survey.module.mjs +27 -0
  42. package/esm2022/lib/tp.survey.type.mjs +2 -0
  43. package/esm2022/public-api.mjs +14 -0
  44. package/esm2022/touchpoll-tp-survey.mjs +5 -0
  45. package/fesm2022/touchpoll-tp-survey.mjs +2210 -0
  46. package/fesm2022/touchpoll-tp-survey.mjs.map +1 -0
  47. package/index.d.ts +5 -0
  48. package/lib/component/answer/answer.additional/answer.additional.component.d.ts +17 -0
  49. package/lib/component/answer/answer.additional/directive/additional.answer.caption.position/additional.answer.caption.position.directive.d.ts +16 -0
  50. package/lib/component/answer/answer.end/answer.end.component.d.ts +6 -0
  51. package/lib/component/answer/answer.info/answer.info.component.d.ts +6 -0
  52. package/lib/component/answer/answer.lang/answer.lang.component.d.ts +9 -0
  53. package/lib/component/answer/answer.master/answer.master.component.d.ts +21 -0
  54. package/lib/component/answer/answer.ms/answer.ms.component.d.ts +21 -0
  55. package/lib/component/answer/answer.od/answer.od.component.d.ts +8 -0
  56. package/lib/component/answer/answer.ol/answer.ol.component.d.ts +7 -0
  57. package/lib/component/answer/answer.sl/answer.sl.component.d.ts +21 -0
  58. package/lib/component/answer/answer.sl/pipe/as.form.array/as.form.array.pipe.d.ts +8 -0
  59. package/lib/component/answer/answer.sl/pipe/as.form.control/as.form.control.pipe.d.ts +8 -0
  60. package/lib/component/answer/answer.ss/answer.ss.component.d.ts +10 -0
  61. package/lib/component/answer/container.answer/container.answer.component.d.ts +36 -0
  62. package/lib/component/answer/container.answer/container.answer.validator.d.ts +10 -0
  63. package/lib/component/navigation.button/navigation.button.component.d.ts +9 -0
  64. package/lib/component/question.caption/question.caption.component.d.ts +8 -0
  65. package/lib/component/survey.play/survey.play.component.d.ts +36 -0
  66. package/lib/component/survey.question.preview/survey.question.preview.component.d.ts +16 -0
  67. package/lib/core/tp.servey.quota/tp.survey.quota.d.ts +12 -0
  68. package/lib/core/tp.survey.answer/tp.survey.answer.d.ts +17 -0
  69. package/lib/core/tp.survey.core/tp.survey.core.service.d.ts +29 -0
  70. package/lib/core/tp.survey.interview/tp.survey.interview.service.d.ts +14 -0
  71. package/lib/core/tp.survey.logic/tp.survey.logic.service.d.ts +12 -0
  72. package/lib/directive/alternatives.container/alternatives.container.directive.d.ts +17 -0
  73. package/lib/directive/focus.and.select/focus.and.select.directive.d.ts +9 -0
  74. package/lib/directive/survey.theme/survey.theme.directive.d.ts +13 -0
  75. package/lib/directive/update.font.size/update.font.size.directive.d.ts +10 -0
  76. package/lib/icons/default.icons/default.icons.d.ts +5 -0
  77. package/lib/icons/default.icons/default.icons.module.d.ts +12 -0
  78. package/lib/pipe/get.active.language/get.active.language.pipe.d.ts +8 -0
  79. package/lib/pipe/get.additional.value.by.value/get.additional.value.by.value.pipe.d.ts +8 -0
  80. package/lib/pipe/key.values/key.values.pipe.d.ts +14 -0
  81. package/lib/pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe.d.ts +11 -0
  82. package/lib/tp.survey.config.d.ts +11 -0
  83. package/lib/tp.survey.const.d.ts +4 -0
  84. package/lib/tp.survey.enum.d.ts +51 -0
  85. package/lib/tp.survey.interface.d.ts +320 -0
  86. package/lib/tp.survey.method.d.ts +1 -0
  87. package/lib/tp.survey.module.d.ts +10 -0
  88. package/lib/tp.survey.type.d.ts +13 -0
  89. package/package.json +25 -0
  90. package/public-api.d.ts +9 -0
  91. package/styles/platform/component/survey.checkbox.scss +102 -0
  92. package/styles/platform/component/survey.radio.button.scss +34 -0
  93. package/styles/platform/survey.mixins.desktop.scss +146 -0
  94. package/styles/platform/survey.mixins.tablet.scss +132 -0
  95. package/styles/survey.mixins.scss +76 -0
  96. package/styles/survey.themes.scss +56 -0
  97. package/styles/theme/azure.blue.scss +54 -0
  98. package/styles/theme/cyan.orange.scss +54 -0
  99. package/styles/theme/rose.red.scss +54 -0
@@ -0,0 +1,131 @@
1
+ import { booleanAttribute, Component, forwardRef, input, numberAttribute } from '@angular/core';
2
+ import { FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
3
+ import { MatCheckbox } from '@angular/material/checkbox';
4
+ import { JsonPipe, KeyValuePipe } from '@angular/common';
5
+ import { MatIcon } from '@angular/material/icon';
6
+ import { MatRadioButton, MatRadioGroup } from '@angular/material/radio';
7
+ import { map } from 'rxjs/operators';
8
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import { filter, tap } from 'rxjs';
10
+ import { MultiLangObjectToHtmlPipe } from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';
11
+ import { AsFormArrayPipe } from './pipe/as.form.array/as.form.array.pipe';
12
+ import { AsFormControlPipe } from './pipe/as.form.control/as.form.control.pipe';
13
+ import { AnswerMasterComponent } from '../answer.master/answer.master.component';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/forms";
16
+ export class AnswerSLComponent extends AnswerMasterComponent {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.alternativeList = input.required();
20
+ this.sectionList = input.required();
21
+ this.multiSelect = input(false, { transform: booleanAttribute });
22
+ this.maxCount = input(0, { transform: numberAttribute });
23
+ this.answerSLForm = new FormGroup({});
24
+ }
25
+ ngOnInit() {
26
+ const multiSelect = this.multiSelect();
27
+ this.sectionList().forEach(section => {
28
+ const sectionControl = this.#createSectionRowControl(multiSelect, []);
29
+ this.answerSLForm.addControl(section.SectionGuid.toString(), sectionControl);
30
+ });
31
+ this.answerSLForm.valueChanges.pipe(map((fullAnswer) => {
32
+ let res = {};
33
+ //Если в настройках указали мультивыбор для секции, то в данной реализации, при изменении форма возвращает массив boolean?, true/false, нажата отжата.
34
+ //Этот массив нужно конвертировать в массив number, в котором будут только нажатые альтернативы.
35
+ if (this.multiSelect()) {
36
+ Object.entries(fullAnswer).forEach(([key]) => {
37
+ const sectionAnswerCheckedArray = this.answerSLForm.get(key)?.value;
38
+ res[key] = this.alternativeList()
39
+ .map(alt => alt.Value)
40
+ .filter((_, index) => sectionAnswerCheckedArray[index]);
41
+ });
42
+ }
43
+ else {
44
+ //если единичный выбор для секции, то ответ просто исходное значение.
45
+ res = fullAnswer;
46
+ }
47
+ return res;
48
+ }), tap(res => this.#disableExtraControls(this.maxCount())), takeUntilDestroyed(this.destroyRef)).subscribe({
49
+ next: res => this.control.patchValue(res, { emitEvent: true })
50
+ });
51
+ }
52
+ #createSectionRowControl(multiSelect, answers) {
53
+ if (multiSelect) {
54
+ const msArray = new FormArray([]);
55
+ const answerAsArray = Array(answers);
56
+ this.alternativeList().forEach((alt) => {
57
+ const control = new FormControl(answerAsArray.includes(alt.Value), { nonNullable: true });
58
+ msArray.push(control, { emitEvent: false });
59
+ //В режиме multiSelect у альтернативы есть понятие "Группа". Группа это число. Если выбирают альтернативу с определённой группой, то альтернативы с другой группой должны быть отжаты.
60
+ //Логика такая же как и в ms вопросе
61
+ control.valueChanges.pipe(filter(value => value && this.multiSelect()), takeUntilDestroyed(this.destroyRef)).subscribe({
62
+ next: () => {
63
+ //сначала отбираем контролы у которых другая группа.
64
+ const otherGroupAlternativesList = this.alternativeList()
65
+ .map((alt, altIndex) => ({ alternative: alt, index: altIndex })) //нужен индекс, по нему проще выбирать контролы в msArray
66
+ .filter(data => data.alternative.GroupNo !== alt.GroupNo); //контролы у которых другая группа
67
+ //"отжимаем галочку"
68
+ otherGroupAlternativesList.forEach(data => {
69
+ const altControl = msArray.controls.at(data.index);
70
+ altControl.patchValue(false, { emitEvent: false });
71
+ });
72
+ }
73
+ });
74
+ });
75
+ return msArray;
76
+ }
77
+ else {
78
+ return new FormControl(Number(answers), { nonNullable: true });
79
+ }
80
+ }
81
+ //дизейблит контроли если выбрали максимальное количество или енейблит если выбрали не максимальное количество
82
+ #disableExtraControls(maxCount) {
83
+ //если в настройках анкеты указали что максимальное возможное количество выбранных альтернатив = 0, но ничего контролировать не надо.
84
+ if (maxCount === 0 || !this.multiSelect()) {
85
+ return;
86
+ }
87
+ this.sectionList().forEach(sec => {
88
+ const sectionControlArray = this.answerSLForm.get(sec.SectionGuid.toString());
89
+ const values = sectionControlArray.value;
90
+ const checkedCount = values.filter(v => v).length;
91
+ sectionControlArray.controls.forEach(control => {
92
+ if (checkedCount >= maxCount && !control.value) {
93
+ control.disable({ emitEvent: false });
94
+ }
95
+ else {
96
+ control.enable({ emitEvent: false });
97
+ }
98
+ });
99
+ });
100
+ }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AnswerSLComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
102
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: AnswerSLComponent, isStandalone: true, selector: "tp-survey-answer-sl", inputs: { alternativeList: { classPropertyName: "alternativeList", publicName: "alternativeList", isSignal: true, isRequired: true, transformFunction: null }, sectionList: { classPropertyName: "sectionList", publicName: "sectionList", isSignal: true, isRequired: true, transformFunction: null }, multiSelect: { classPropertyName: "multiSelect", publicName: "multiSelect", isSignal: true, isRequired: false, transformFunction: null }, maxCount: { classPropertyName: "maxCount", publicName: "maxCount", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
103
+ {
104
+ provide: NG_VALUE_ACCESSOR,
105
+ useExisting: forwardRef(() => AnswerSLComponent),
106
+ multi: true
107
+ },
108
+ ], usesInheritance: true, ngImport: i0, template: "<table class=\"default-view\" [formGroup]=\"answerSLForm\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <th class=\"SLAlternativeCaption\">\r\n <span [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let sectionIndex = $index) {\r\n @if (multiSelect()){\r\n <tr>\r\n <td>\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </td>\r\n @for (alternativeControl of (secControl.value | asFormArray).controls ; track alternativeControl) {\r\n <td>\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\"/>\r\n </td>\r\n }\r\n </tr>\r\n } @else {\r\n <mat-radio-group [formControl]=\"secControl.value | asFormControl\" class=\"single-select-row\">\r\n <td class=\"single-select-item\">\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </td>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <td class=\"single-select-item\">\r\n <mat-radio-button\r\n class=\"alternative-sl tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n </mat-radio-button>\r\n </td>\r\n }\r\n </mat-radio-group>\r\n }\r\n }\r\n </tbody>\r\n</table>\r\n\r\n<div class=\"mobile-view\" [formGroup]=\"answerSLForm\">\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let secIndex = $index) {\r\n <div class=\"mobile-view-section-row\" [formArrayName]=\"secControl.key\">\r\n <span [innerHTML]= \"sectionList()[secIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"mobile-view-section-caption section-sl-caption\"></span>\r\n @if (multiSelect()) {\r\n <div class=\"mobile-view-alternative-list\">\r\n @for (alternativeControl of (secControl.value | asFormArray).controls; track alternativeControl; let altIndex = $index) {\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\">\r\n <span class=\"alternative-sl-caption\" [innerHTML]= \"alternativeList()[altIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </mat-checkbox>\r\n }\r\n </div>\r\n } @else {\r\n <mat-radio-group\r\n class=\"mobile-view-alternative-list\"\r\n [formControl]=\"secControl.value | asFormControl\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n class=\"tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n <span class=\"alternative-sl-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: ["td{text-align:center}table{width:100%}tr td{border-bottom:1px solid rgba(102,102,103,.49)}.default-view{display:block}.mobile-view{display:none;padding:1em;flex-flow:column;gap:4em}.mobile-view-alternative-list{display:flex;flex-flow:column}.mobile-view-section-row{margin-bottom:2em}.mobile-view-section-caption{display:block;border-bottom:1px solid}.section-sl-caption{font-size:1.3em}.alternative-sl-caption{font-size:1.1em}.single-select-row{display:table-row;vertical-align:middle;border-bottom:1px solid rgba(102,102,103,.49)}.single-select-item{vertical-align:middle;border-bottom:1px solid rgba(102,102,103,.49)}@media (max-width: 480px){.default-view{display:none}.mobile-view{display:block}}\n"], dependencies: [{ kind: "pipe", type: MultiLangObjectToHtmlPipe, name: "multiLangObjectToHtml" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: AsFormArrayPipe, name: "asFormArray" }, { kind: "component", type: MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "pipe", type: AsFormControlPipe, name: "asFormControl" }] }); }
109
+ }
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AnswerSLComponent, decorators: [{
111
+ type: Component,
112
+ args: [{ selector: 'tp-survey-answer-sl', standalone: true, imports: [
113
+ MultiLangObjectToHtmlPipe,
114
+ MatCheckbox,
115
+ ReactiveFormsModule,
116
+ KeyValuePipe,
117
+ MatIcon,
118
+ JsonPipe,
119
+ AsFormArrayPipe,
120
+ MatRadioButton,
121
+ MatRadioGroup,
122
+ AsFormControlPipe
123
+ ], providers: [
124
+ {
125
+ provide: NG_VALUE_ACCESSOR,
126
+ useExisting: forwardRef(() => AnswerSLComponent),
127
+ multi: true
128
+ },
129
+ ], template: "<table class=\"default-view\" [formGroup]=\"answerSLForm\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <th class=\"SLAlternativeCaption\">\r\n <span [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let sectionIndex = $index) {\r\n @if (multiSelect()){\r\n <tr>\r\n <td>\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </td>\r\n @for (alternativeControl of (secControl.value | asFormArray).controls ; track alternativeControl) {\r\n <td>\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\"/>\r\n </td>\r\n }\r\n </tr>\r\n } @else {\r\n <mat-radio-group [formControl]=\"secControl.value | asFormControl\" class=\"single-select-row\">\r\n <td class=\"single-select-item\">\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </td>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <td class=\"single-select-item\">\r\n <mat-radio-button\r\n class=\"alternative-sl tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n </mat-radio-button>\r\n </td>\r\n }\r\n </mat-radio-group>\r\n }\r\n }\r\n </tbody>\r\n</table>\r\n\r\n<div class=\"mobile-view\" [formGroup]=\"answerSLForm\">\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let secIndex = $index) {\r\n <div class=\"mobile-view-section-row\" [formArrayName]=\"secControl.key\">\r\n <span [innerHTML]= \"sectionList()[secIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"mobile-view-section-caption section-sl-caption\"></span>\r\n @if (multiSelect()) {\r\n <div class=\"mobile-view-alternative-list\">\r\n @for (alternativeControl of (secControl.value | asFormArray).controls; track alternativeControl; let altIndex = $index) {\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\">\r\n <span class=\"alternative-sl-caption\" [innerHTML]= \"alternativeList()[altIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </mat-checkbox>\r\n }\r\n </div>\r\n } @else {\r\n <mat-radio-group\r\n class=\"mobile-view-alternative-list\"\r\n [formControl]=\"secControl.value | asFormControl\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n class=\"tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n <span class=\"alternative-sl-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: ["td{text-align:center}table{width:100%}tr td{border-bottom:1px solid rgba(102,102,103,.49)}.default-view{display:block}.mobile-view{display:none;padding:1em;flex-flow:column;gap:4em}.mobile-view-alternative-list{display:flex;flex-flow:column}.mobile-view-section-row{margin-bottom:2em}.mobile-view-section-caption{display:block;border-bottom:1px solid}.section-sl-caption{font-size:1.3em}.alternative-sl-caption{font-size:1.1em}.single-select-row{display:table-row;vertical-align:middle;border-bottom:1px solid rgba(102,102,103,.49)}.single-select-item{vertical-align:middle;border-bottom:1px solid rgba(102,102,103,.49)}@media (max-width: 480px){.default-view{display:none}.mobile-view{display:block}}\n"] }]
130
+ }] });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5zd2VyLnNsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RwLnN1cnZleS9zcmMvbGliL2NvbXBvbmVudC9hbnN3ZXIvYW5zd2VyLnNsL2Fuc3dlci5zbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cC5zdXJ2ZXkvc3JjL2xpYi9jb21wb25lbnQvYW5zd2VyL2Fuc3dlci5zbC9hbnN3ZXIuc2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDakgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDOzs7QUFpQy9FLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxxQkFBbUM7SUF6QjFFOztRQTBCRSxvQkFBZSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXlCLENBQUM7UUFDMUQsZ0JBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFxQixDQUFDO1FBQ2xELGdCQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7UUFDMUQsYUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FBQztRQUNsRCxpQkFBWSxHQUFHLElBQUksU0FBUyxDQUFnQixFQUFFLENBQUMsQ0FBQTtLQTRGaEQ7SUExRkMsUUFBUTtRQUNOLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ25DLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFlBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxjQUFjLENBQUcsQ0FBQztRQUNsRixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDbEMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDakIsSUFBSSxHQUFHLEdBQTJDLEVBQUUsQ0FBQztZQUNyRCxzSkFBc0o7WUFDdEosZ0dBQWdHO1lBQ2hHLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO29CQUMzQyxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztvQkFDcEUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUU7eUJBQy9CLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7eUJBQ3JCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFFLENBQUE7Z0JBQzNELENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHFFQUFxRTtnQkFDckUsR0FBRyxHQUFHLFVBQW9DLENBQUM7WUFDN0MsQ0FBQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQ3ZELGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDbkMsQ0FBQyxTQUFTLENBQUM7WUFDVixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDN0QsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELHdCQUF3QixDQUFDLFdBQW9CLEVBQUUsT0FBK0I7UUFDNUUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBdUIsRUFBRSxDQUFDLENBQUM7WUFDeEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXJDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxPQUFPLEdBQUUsSUFBSSxXQUFXLENBQVcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztnQkFDakcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztnQkFFMUMsc0xBQXNMO2dCQUN0TCxvQ0FBb0M7Z0JBQ3BDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQzVDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDbkMsQ0FBQyxTQUFTLENBQUM7b0JBQ1YsSUFBSSxFQUFFLEdBQUcsRUFBRTt3QkFDVCxvREFBb0Q7d0JBQ3BELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTs2QkFDdkQsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUUsQ0FBRSx5REFBeUQ7NkJBQ3pILE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtDQUFrQzt3QkFFOUYsb0JBQW9CO3dCQUNwQiwwQkFBMEIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQ3hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbkQsVUFBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTt3QkFDbkQsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztpQkFDRixDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLFdBQVcsQ0FBUyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVELDhHQUE4RztJQUM5RyxxQkFBcUIsQ0FBQyxRQUFnQjtRQUNwQyxxSUFBcUk7UUFDckksSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDMUMsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBb0MsQ0FBQztZQUNqSCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7WUFDekMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUVsRCxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM3QyxJQUFJLFlBQVksSUFBSSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQy9DLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtnQkFDckMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtnQkFDcEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFBO1FBRUosQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDOzhHQWhHVSxpQkFBaUI7a0dBQWpCLGlCQUFpQix1bkJBUmpCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLGlEQzNDSCxna0dBMkVBLG92QkRqREkseUJBQXlCLDhEQUN6QixXQUFXLGdVQUNYLG1CQUFtQix5c0JBQ25CLFlBQVksNENBR1osZUFBZSxvREFDZixjQUFjLGdTQUNkLGFBQWEsa01BQ2IsaUJBQWlCOzsyRkFVUixpQkFBaUI7a0JBekI3QixTQUFTOytCQUNFLHFCQUFxQixjQUduQixJQUFJLFdBQ1A7d0JBQ1AseUJBQXlCO3dCQUN6QixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsZUFBZTt3QkFDZixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsaUJBQWlCO3FCQUNsQixhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Ym9vbGVhbkF0dHJpYnV0ZSwgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBpbnB1dCwgbnVtYmVyQXR0cmlidXRlLCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtNYXRDaGVja2JveH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQge0pzb25QaXBlLCBLZXlWYWx1ZVBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7TWF0UmFkaW9CdXR0b24sIE1hdFJhZGlvR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcclxuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHtmaWx0ZXIsIHRhcH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7TXVsdGlMYW5nT2JqZWN0VG9IdG1sUGlwZX0gZnJvbSAnLi4vLi4vLi4vcGlwZS9tdWx0aS5sYW5nLm9iamVjdC50by5odG1sL211bHRpLmxhbmcub2JqZWN0LnRvLmh0bWwucGlwZSc7XHJcbmltcG9ydCB7QXNGb3JtQXJyYXlQaXBlfSBmcm9tICcuL3BpcGUvYXMuZm9ybS5hcnJheS9hcy5mb3JtLmFycmF5LnBpcGUnO1xyXG5pbXBvcnQge0FzRm9ybUNvbnRyb2xQaXBlfSBmcm9tICcuL3BpcGUvYXMuZm9ybS5jb250cm9sL2FzLmZvcm0uY29udHJvbC5waXBlJztcclxuaW1wb3J0IHtBbnN3ZXJNYXN0ZXJDb21wb25lbnR9IGZyb20gJy4uL2Fuc3dlci5tYXN0ZXIvYW5zd2VyLm1hc3Rlci5jb21wb25lbnQnO1xyXG5pbXBvcnQge0Fuc3dlclNsVHlwZX0gZnJvbSAnLi4vLi4vLi4vdHAuc3VydmV5LnR5cGUnO1xyXG5pbXBvcnQge0lkYkFsdGVybmF0aXZlLCBJZGJTZWN0aW9ufSBmcm9tICcuLi8uLi8uLi90cC5zdXJ2ZXkuaW50ZXJmYWNlJztcclxuXHJcbmludGVyZmFjZSBJQW5zd2VyU0xGb3JtIHtcclxuICBba2V5OiBzdHJpbmddOiBGb3JtQXJyYXk8Rm9ybUNvbnRyb2w8Ym9vbGVhbj4+IHwgRm9ybUNvbnRyb2w8bnVtYmVyPiB8IEZvcm1Db250cm9sPEFycmF5PG51bWJlcj4+XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHAtc3VydmV5LWFuc3dlci1zbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Fuc3dlci5zbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5zd2VyLnNsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBNdWx0aUxhbmdPYmplY3RUb0h0bWxQaXBlLFxyXG4gICAgTWF0Q2hlY2tib3gsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgS2V5VmFsdWVQaXBlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIEpzb25QaXBlLFxyXG4gICAgQXNGb3JtQXJyYXlQaXBlLFxyXG4gICAgTWF0UmFkaW9CdXR0b24sXHJcbiAgICBNYXRSYWRpb0dyb3VwLFxyXG4gICAgQXNGb3JtQ29udHJvbFBpcGVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQW5zd2VyU0xDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5zd2VyU0xDb21wb25lbnQgZXh0ZW5kcyBBbnN3ZXJNYXN0ZXJDb21wb25lbnQ8QW5zd2VyU2xUeXBlPiBpbXBsZW1lbnRzIE9uSW5pdHtcclxuICBhbHRlcm5hdGl2ZUxpc3QgPSBpbnB1dC5yZXF1aXJlZDxBcnJheTxJZGJBbHRlcm5hdGl2ZT4+KCk7XHJcbiAgc2VjdGlvbkxpc3QgPSBpbnB1dC5yZXF1aXJlZDxBcnJheTxJZGJTZWN0aW9uPj4oKTtcclxuICBtdWx0aVNlbGVjdCA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XHJcbiAgbWF4Q291bnQgPSBpbnB1dCgwLCB7dHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGV9KTtcclxuICBhbnN3ZXJTTEZvcm0gPSBuZXcgRm9ybUdyb3VwPElBbnN3ZXJTTEZvcm0+KHt9KVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG11bHRpU2VsZWN0ID0gdGhpcy5tdWx0aVNlbGVjdCgpO1xyXG5cclxuICAgIHRoaXMuc2VjdGlvbkxpc3QoKS5mb3JFYWNoKHNlY3Rpb24gPT4ge1xyXG4gICAgICBjb25zdCBzZWN0aW9uQ29udHJvbCA9IHRoaXMuI2NyZWF0ZVNlY3Rpb25Sb3dDb250cm9sKG11bHRpU2VsZWN0LCBbXSk7XHJcbiAgICAgIHRoaXMuYW5zd2VyU0xGb3JtIS5hZGRDb250cm9sKHNlY3Rpb24uU2VjdGlvbkd1aWQudG9TdHJpbmcoKSwgc2VjdGlvbkNvbnRyb2wsICk7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuYW5zd2VyU0xGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgIG1hcCgoZnVsbEFuc3dlcikgPT4ge1xyXG4gICAgICAgbGV0IHJlczogUmVjb3JkPHN0cmluZywgQXJyYXk8bnVtYmVyPiB8IG51bWJlcj4gPSB7fTtcclxuICAgICAgIC8v0JXRgdC70Lgg0LIg0L3QsNGB0YLRgNC+0LnQutCw0YUg0YPQutCw0LfQsNC70Lgg0LzRg9C70YzRgtC40LLRi9Cx0L7RgCDQtNC70Y8g0YHQtdC60YbQuNC4LCDRgtC+INCyINC00LDQvdC90L7QuSDRgNC10LDQu9C40LfQsNGG0LjQuCwg0L/RgNC4INC40LfQvNC10L3QtdC90LjQuCDRhNC+0YDQvNCwINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC80LDRgdGB0LjQsiBib29sZWFuPywgdHJ1ZS9mYWxzZSwg0L3QsNC20LDRgtCwINC+0YLQttCw0YLQsC5cclxuICAgICAgIC8v0K3RgtC+0YIg0LzQsNGB0YHQuNCyINC90YPQttC90L4g0LrQvtC90LLQtdGA0YLQuNGA0L7QstCw0YLRjCDQsiDQvNCw0YHRgdC40LIgbnVtYmVyLCDQsiDQutC+0YLQvtGA0L7QvCDQsdGD0LTRg9GCINGC0L7Qu9GM0LrQviDQvdCw0LbQsNGC0YvQtSDQsNC70YzRgtC10YDQvdCw0YLQuNCy0YsuXHJcbiAgICAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCgpKSB7XHJcbiAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZ1bGxBbnN3ZXIpLmZvckVhY2goKFtrZXldKSA9PiB7XHJcbiAgICAgICAgICAgY29uc3Qgc2VjdGlvbkFuc3dlckNoZWNrZWRBcnJheSA9IHRoaXMuYW5zd2VyU0xGb3JtLmdldChrZXkpPy52YWx1ZTtcclxuICAgICAgICAgICByZXNba2V5XSA9IHRoaXMuYWx0ZXJuYXRpdmVMaXN0KClcclxuICAgICAgICAgICAgLm1hcChhbHQgPT4gYWx0LlZhbHVlKVxyXG4gICAgICAgICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT4gc2VjdGlvbkFuc3dlckNoZWNrZWRBcnJheVtpbmRleF0gKVxyXG4gICAgICAgICB9KTtcclxuICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgIC8v0LXRgdC70Lgg0LXQtNC40L3QuNGH0L3Ri9C5INCy0YvQsdC+0YAg0LTQu9GPINGB0LXQutGG0LjQuCwg0YLQviDQvtGC0LLQtdGCINC/0YDQvtGB0YLQviDQuNGB0YXQvtC00L3QvtC1INC30L3QsNGH0LXQvdC40LUuXHJcbiAgICAgICAgIHJlcyA9IGZ1bGxBbnN3ZXIgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcclxuICAgICAgIH1cclxuICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgfSksXHJcbiAgICAgdGFwKHJlcyA9PiB0aGlzLiNkaXNhYmxlRXh0cmFDb250cm9scyh0aGlzLm1heENvdW50KCkpKSxcclxuICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiByZXMgPT4gdGhpcy5jb250cm9sLnBhdGNoVmFsdWUocmVzLCB7ZW1pdEV2ZW50OiB0cnVlfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAjY3JlYXRlU2VjdGlvblJvd0NvbnRyb2wobXVsdGlTZWxlY3Q6IGJvb2xlYW4sIGFuc3dlcnM6IG51bWJlciB8IEFycmF5PG51bWJlcj4pOiBGb3JtQXJyYXk8Rm9ybUNvbnRyb2w8Ym9vbGVhbj4+IHwgRm9ybUNvbnRyb2w8bnVtYmVyPiB7XHJcbiAgICBpZiAobXVsdGlTZWxlY3QpIHtcclxuICAgICAgY29uc3QgbXNBcnJheSA9IG5ldyBGb3JtQXJyYXk8Rm9ybUNvbnRyb2w8Ym9vbGVhbj4+KFtdKTtcclxuICAgICAgY29uc3QgYW5zd2VyQXNBcnJheSA9IEFycmF5KGFuc3dlcnMpO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5hbHRlcm5hdGl2ZUxpc3QoKS5mb3JFYWNoKChhbHQpID0+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sPSBuZXcgRm9ybUNvbnRyb2w8Ym9vbGVhbj4oIGFuc3dlckFzQXJyYXkuaW5jbHVkZXMoYWx0LlZhbHVlKSwge25vbk51bGxhYmxlOiB0cnVlfSk7XHJcbiAgICAgICAgbXNBcnJheS5wdXNoKGNvbnRyb2wsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcblxyXG4gICAgICAgIC8v0JIg0YDQtdC20LjQvNC1IG11bHRpU2VsZWN0INGDINCw0LvRjNGC0LXRgNC90LDRgtC40LLRiyDQtdGB0YLRjCDQv9C+0L3Rj9GC0LjQtSBcItCT0YDRg9C/0L/QsFwiLiDQk9GA0YPQv9C/0LAg0Y3RgtC+INGH0LjRgdC70L4uINCV0YHQu9C4INCy0YvQsdC40YDQsNGO0YIg0LDQu9GM0YLQtdGA0L3QsNGC0LjQstGDINGBINC+0L/RgNC10LTQtdC70ZHQvdC90L7QuSDQs9GA0YPQv9C/0L7QuSwg0YLQviDQsNC70YzRgtC10YDQvdCw0YLQuNCy0Ysg0YEg0LTRgNGD0LPQvtC5INCz0YDRg9C/0L/QvtC5INC00L7Qu9C20L3RiyDQsdGL0YLRjCDQvtGC0LbQsNGC0YsuXHJcbiAgICAgICAgLy/Qm9C+0LPQuNC60LAg0YLQsNC60LDRjyDQttC1INC60LDQuiDQuCDQsiBtcyDQstC+0L/RgNC+0YHQtVxyXG4gICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAmJiB0aGlzLm11bHRpU2VsZWN0KCkpLFxyXG4gICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcclxuICAgICAgICApLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8v0YHQvdCw0YfQsNC70LAg0L7RgtCx0LjRgNCw0LXQvCDQutC+0L3RgtGA0L7Qu9GLINGDINC60L7RgtC+0YDRi9GFINC00YDRg9Cz0LDRjyDQs9GA0YPQv9C/0LAuXHJcbiAgICAgICAgICAgIGNvbnN0IG90aGVyR3JvdXBBbHRlcm5hdGl2ZXNMaXN0ID0gdGhpcy5hbHRlcm5hdGl2ZUxpc3QoKVxyXG4gICAgICAgICAgICAgLm1hcCgoYWx0LCBhbHRJbmRleCkgPT4gKHthbHRlcm5hdGl2ZTogYWx0LCBpbmRleDogYWx0SW5kZXh9KSApICAvL9C90YPQttC10L0g0LjQvdC00LXQutGBLCDQv9C+INC90LXQvNGDINC/0YDQvtGJ0LUg0LLRi9Cx0LjRgNCw0YLRjCDQutC+0L3RgtGA0L7Qu9GLINCyIG1zQXJyYXlcclxuICAgICAgICAgICAgIC5maWx0ZXIoZGF0YSA9PiBkYXRhLmFsdGVybmF0aXZlLkdyb3VwTm8gIT09IGFsdC5Hcm91cE5vKTsgLy/QutC+0L3RgtGA0L7Qu9GLINGDINC60L7RgtC+0YDRi9GFINC00YDRg9Cz0LDRjyDQs9GA0YPQv9C/0LBcclxuXHJcbiAgICAgICAgICAgIC8vXCLQvtGC0LbQuNC80LDQtdC8INCz0LDQu9C+0YfQutGDXCJcclxuICAgICAgICAgICAgb3RoZXJHcm91cEFsdGVybmF0aXZlc0xpc3QuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBhbHRDb250cm9sID0gbXNBcnJheS5jb250cm9scy5hdChkYXRhLmluZGV4KTtcclxuICAgICAgICAgICAgICBhbHRDb250cm9sIS5wYXRjaFZhbHVlKGZhbHNlLCB7ZW1pdEV2ZW50OiBmYWxzZX0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gbXNBcnJheTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihOdW1iZXIoYW5zd2VycyksIHtub25OdWxsYWJsZTogdHJ1ZX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy/QtNC40LfQtdC50LHQu9C40YIg0LrQvtC90YLRgNC+0LvQuCDQtdGB0LvQuCDQstGL0LHRgNCw0LvQuCDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0LjQu9C4INC10L3QtdC50LHQu9C40YIg0LXRgdC70Lgg0LLRi9Cx0YDQsNC70Lgg0L3QtSDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L5cclxuICAjZGlzYWJsZUV4dHJhQ29udHJvbHMobWF4Q291bnQ6IG51bWJlcik6IHZvaWR7XHJcbiAgICAvL9C10YHQu9C4INCyINC90LDRgdGC0YDQvtC50LrQsNGFINCw0L3QutC10YLRiyDRg9C60LDQt9Cw0LvQuCDRh9GC0L4g0LzQsNC60YHQuNC80LDQu9GM0L3QvtC1INCy0L7Qt9C80L7QttC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQstGL0LHRgNCw0L3QvdGL0YUg0LDQu9GM0YLQtdGA0L3QsNGC0LjQsiA9IDAsINC90L4g0L3QuNGH0LXQs9C+INC60L7QvdGC0YDQvtC70LjRgNC+0LLQsNGC0Ywg0L3QtSDQvdCw0LTQvi5cclxuICAgIGlmIChtYXhDb3VudCA9PT0gMCB8fCAhdGhpcy5tdWx0aVNlbGVjdCgpKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkxpc3QoKS5mb3JFYWNoKHNlYyA9PiB7XHJcbiAgICAgIGNvbnN0IHNlY3Rpb25Db250cm9sQXJyYXkgPSB0aGlzLmFuc3dlclNMRm9ybS5nZXQoc2VjLlNlY3Rpb25HdWlkLnRvU3RyaW5nKCkpIGFzIEZvcm1BcnJheTxGb3JtQ29udHJvbDxib29sZWFuPj47XHJcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHNlY3Rpb25Db250cm9sQXJyYXkudmFsdWU7XHJcbiAgICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IHZhbHVlcy5maWx0ZXIodiA9PiB2KS5sZW5ndGg7XHJcblxyXG4gICAgICBzZWN0aW9uQ29udHJvbEFycmF5LmNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgICAgaWYgKGNoZWNrZWRDb3VudCA+PSBtYXhDb3VudCAmJiAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iLCI8dGFibGUgY2xhc3M9XCJkZWZhdWx0LXZpZXdcIiBbZm9ybUdyb3VwXT1cImFuc3dlclNMRm9ybVwiPlxyXG4gPHRoZWFkPlxyXG4gPHRyPlxyXG4gIDx0aD48L3RoPlxyXG4gIEBmb3IgKGFsdCBvZiBhbHRlcm5hdGl2ZUxpc3QoKTsgdHJhY2sgYWx0LlZhbHVlOyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcclxuICAgPHRoIGNsYXNzPVwiU0xBbHRlcm5hdGl2ZUNhcHRpb25cIj5cclxuICAgIDxzcGFuIFtpbm5lckhUTUxdPSBcImFsdC5NdWx0aUxhbmdDYXB0aW9ucyB8IG11bHRpTGFuZ09iamVjdFRvSHRtbDpsYW5ndWFnZSgpXCI+PC9zcGFuPlxyXG4gICA8L3RoPlxyXG4gIH1cclxuIDwvdHI+XHJcbiA8L3RoZWFkPlxyXG4gPHRib2R5PlxyXG4gIEBmb3IgKHNlY0NvbnRyb2wgb2YgYW5zd2VyU0xGb3JtLmNvbnRyb2xzIHwga2V5dmFsdWU7IHRyYWNrIHNlY0NvbnRyb2wua2V5OyBsZXQgc2VjdGlvbkluZGV4ID0gJGluZGV4KSB7XHJcbiAgIEBpZiAobXVsdGlTZWxlY3QoKSl7XHJcbiAgICA8dHI+XHJcbiAgICAgPHRkPlxyXG4gICAgICA8c3BhbiBbaW5uZXJIVE1MXT0gXCJzZWN0aW9uTGlzdCgpW3NlY3Rpb25JbmRleF0uTXVsdGlMYW5nQ2FwdGlvbnMgfCBtdWx0aUxhbmdPYmplY3RUb0h0bWw6bGFuZ3VhZ2UoKVwiPjwvc3Bhbj5cclxuICAgICA8L3RkPlxyXG4gICAgIEBmb3IgKGFsdGVybmF0aXZlQ29udHJvbCBvZiAoc2VjQ29udHJvbC52YWx1ZSB8IGFzRm9ybUFycmF5KS5jb250cm9scyA7IHRyYWNrIGFsdGVybmF0aXZlQ29udHJvbCkge1xyXG4gICAgICA8dGQ+XHJcbiAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImFsdGVybmF0aXZlQ29udHJvbFwiXHJcbiAgICAgICAgY2xhc3M9XCJhbHRlcm5hdGl2ZS1zbCB0cC1zdXJ2ZXktY2hlY2tib3hcIi8+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgfVxyXG4gICAgPC90cj5cclxuICAgfSBAZWxzZSB7XHJcbiAgICA8bWF0LXJhZGlvLWdyb3VwIFtmb3JtQ29udHJvbF09XCJzZWNDb250cm9sLnZhbHVlIHwgYXNGb3JtQ29udHJvbFwiIGNsYXNzPVwic2luZ2xlLXNlbGVjdC1yb3dcIj5cclxuICAgICA8dGQgY2xhc3M9XCJzaW5nbGUtc2VsZWN0LWl0ZW1cIj5cclxuICAgICAgPHNwYW4gW2lubmVySFRNTF09IFwic2VjdGlvbkxpc3QoKVtzZWN0aW9uSW5kZXhdLk11bHRpTGFuZ0NhcHRpb25zIHwgbXVsdGlMYW5nT2JqZWN0VG9IdG1sOmxhbmd1YWdlKClcIj48L3NwYW4+XHJcbiAgICAgPC90ZD5cclxuICAgICBAZm9yIChhbHQgb2YgYWx0ZXJuYXRpdmVMaXN0KCk7IHRyYWNrIGFsdC5WYWx1ZTsgbGV0IGluZGV4ID0gJGluZGV4KSB7XHJcbiAgICAgIDx0ZCBjbGFzcz1cInNpbmdsZS1zZWxlY3QtaXRlbVwiPlxyXG4gICAgICAgPG1hdC1yYWRpby1idXR0b25cclxuICAgICAgICBjbGFzcz1cImFsdGVybmF0aXZlLXNsICB0cC1zdXJ2ZXktcmFkaW8tYnV0dG9uXCJcclxuICAgICAgICBbdmFsdWVdPVwiYWx0LlZhbHVlXCI+XHJcbiAgICAgICA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgfVxyXG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgIH1cclxuICB9XHJcbiA8L3Rib2R5PlxyXG48L3RhYmxlPlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vYmlsZS12aWV3XCIgW2Zvcm1Hcm91cF09XCJhbnN3ZXJTTEZvcm1cIj5cclxuIEBmb3IgKHNlY0NvbnRyb2wgb2YgYW5zd2VyU0xGb3JtLmNvbnRyb2xzIHwga2V5dmFsdWU7IHRyYWNrIHNlY0NvbnRyb2wua2V5OyBsZXQgc2VjSW5kZXggPSAkaW5kZXgpIHtcclxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLXZpZXctc2VjdGlvbi1yb3dcIiBbZm9ybUFycmF5TmFtZV09XCJzZWNDb250cm9sLmtleVwiPlxyXG4gICA8c3BhbiBbaW5uZXJIVE1MXT0gXCJzZWN0aW9uTGlzdCgpW3NlY0luZGV4XS5NdWx0aUxhbmdDYXB0aW9ucyB8IG11bHRpTGFuZ09iamVjdFRvSHRtbDpsYW5ndWFnZSgpXCIgY2xhc3M9XCJtb2JpbGUtdmlldy1zZWN0aW9uLWNhcHRpb24gc2VjdGlvbi1zbC1jYXB0aW9uXCI+PC9zcGFuPlxyXG4gICBAaWYgKG11bHRpU2VsZWN0KCkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtdmlldy1hbHRlcm5hdGl2ZS1saXN0XCI+XHJcbiAgICAgQGZvciAoYWx0ZXJuYXRpdmVDb250cm9sIG9mIChzZWNDb250cm9sLnZhbHVlIHwgYXNGb3JtQXJyYXkpLmNvbnRyb2xzOyB0cmFjayBhbHRlcm5hdGl2ZUNvbnRyb2w7IGxldCBhbHRJbmRleCA9ICRpbmRleCkge1xyXG4gICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICBbZm9ybUNvbnRyb2xdPVwiYWx0ZXJuYXRpdmVDb250cm9sXCJcclxuICAgICAgIGNsYXNzPVwiYWx0ZXJuYXRpdmUtc2wgdHAtc3VydmV5LWNoZWNrYm94XCI+XHJcbiAgICAgICA8c3BhbiBjbGFzcz1cImFsdGVybmF0aXZlLXNsLWNhcHRpb25cIiBbaW5uZXJIVE1MXT0gXCJhbHRlcm5hdGl2ZUxpc3QoKVthbHRJbmRleF0uTXVsdGlMYW5nQ2FwdGlvbnMgfCBtdWx0aUxhbmdPYmplY3RUb0h0bWw6bGFuZ3VhZ2UoKVwiPjwvc3Bhbj5cclxuICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgIH0gQGVsc2Uge1xyXG4gICAgPG1hdC1yYWRpby1ncm91cFxyXG4gICAgIGNsYXNzPVwibW9iaWxlLXZpZXctYWx0ZXJuYXRpdmUtbGlzdFwiXHJcbiAgICAgW2Zvcm1Db250cm9sXT1cInNlY0NvbnRyb2wudmFsdWUgfCBhc0Zvcm1Db250cm9sXCI+XHJcbiAgICAgQGZvciAoYWx0IG9mIGFsdGVybmF0aXZlTGlzdCgpOyB0cmFjayBhbHQuVmFsdWU7IGxldCBpbmRleCA9ICRpbmRleCkge1xyXG4gICAgICA8bWF0LXJhZGlvLWJ1dHRvblxyXG4gICAgICAgY2xhc3M9XCJ0cC1zdXJ2ZXktcmFkaW8tYnV0dG9uXCJcclxuICAgICAgIFt2YWx1ZV09XCJhbHQuVmFsdWVcIj5cclxuICAgICAgIDxzcGFuIGNsYXNzPVwiYWx0ZXJuYXRpdmUtc2wtY2FwdGlvblwiIFtpbm5lckhUTUxdPSBcImFsdC5NdWx0aUxhbmdDYXB0aW9ucyB8IG11bHRpTGFuZ09iamVjdFRvSHRtbDpsYW5ndWFnZSgpXCI+PC9zcGFuPlxyXG4gICAgICA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgfVxyXG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgIH1cclxuICA8L2Rpdj5cclxuIH1cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class AsFormArrayPipe {
4
+ transform(value) {
5
+ return value;
6
+ }
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AsFormArrayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
8
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: AsFormArrayPipe, isStandalone: true, name: "asFormArray" }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AsFormArrayPipe, decorators: [{
11
+ type: Pipe,
12
+ args: [{
13
+ name: 'asFormArray',
14
+ standalone: true
15
+ }]
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMuZm9ybS5hcnJheS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHAuc3VydmV5L3NyYy9saWIvY29tcG9uZW50L2Fuc3dlci9hbnN3ZXIuc2wvcGlwZS9hcy5mb3JtLmFycmF5L2FzLmZvcm0uYXJyYXkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFnQixNQUFNLGVBQWUsQ0FBQzs7QUFPbEQsTUFBTSxPQUFPLGVBQWU7SUFFMUIsU0FBUyxDQUFDLEtBQVU7UUFDbEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzhHQUpVLGVBQWU7NEdBQWYsZUFBZTs7MkZBQWYsZUFBZTtrQkFKM0IsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsYUFBYTtvQkFDbkIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtGb3JtQXJyYXksIEZvcm1Db250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2FzRm9ybUFycmF5JyxcclxuICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc0Zvcm1BcnJheVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuXHJcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnkpOiBGb3JtQXJyYXk8Rm9ybUNvbnRyb2w8Ym9vbGVhbj4+IHtcclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class AsFormControlPipe {
4
+ transform(value) {
5
+ return value;
6
+ }
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AsFormControlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
8
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: AsFormControlPipe, isStandalone: true, name: "asFormControl" }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AsFormControlPipe, decorators: [{
11
+ type: Pipe,
12
+ args: [{
13
+ name: 'asFormControl',
14
+ standalone: true
15
+ }]
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMuZm9ybS5jb250cm9sLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cC5zdXJ2ZXkvc3JjL2xpYi9jb21wb25lbnQvYW5zd2VyL2Fuc3dlci5zbC9waXBlL2FzLmZvcm0uY29udHJvbC9hcy5mb3JtLmNvbnRyb2wucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFnQixNQUFNLGVBQWUsQ0FBQzs7QUFPbEQsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixTQUFTLENBQUMsS0FBVTtRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OEdBSlUsaUJBQWlCOzRHQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBSjdCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UGlwZSwgUGlwZVRyYW5zZm9ybX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnYXNGb3JtQ29udHJvbCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNGb3JtQ29udHJvbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICBcclxuICB0cmFuc2Zvcm0odmFsdWU6IGFueSk6IEZvcm1Db250cm9sPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -0,0 +1,51 @@
1
+ import { ChangeDetectionStrategy, Component, forwardRef, input, output, } from '@angular/core';
2
+ import { MatRadioButton, MatRadioGroup } from '@angular/material/radio';
3
+ import { NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
4
+ import { KeyValuePipe } from '@angular/common';
5
+ import { MatFormField } from '@angular/material/form-field';
6
+ import { MatInput } from '@angular/material/input';
7
+ import { MatIcon } from '@angular/material/icon';
8
+ import { MatCheckbox } from '@angular/material/checkbox';
9
+ import { MultiLangObjectToHtmlPipe } from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';
10
+ import { AnswerMasterComponent } from '../answer.master/answer.master.component';
11
+ import { AlternativesContainerDirective } from '../../../directive/alternatives.container/alternatives.container.directive';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/forms";
14
+ export class AnswerSSComponent extends AnswerMasterComponent {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.question = input.required();
18
+ this.alternativeList = input.required();
19
+ this.onAlternativeClick = output();
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AnswerSSComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: AnswerSSComponent, isStandalone: true, selector: "tp-survey-answer-ss", inputs: { question: { classPropertyName: "question", publicName: "question", isSignal: true, isRequired: true, transformFunction: null }, alternativeList: { classPropertyName: "alternativeList", publicName: "alternativeList", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onAlternativeClick: "onAlternativeClick" }, providers: [
23
+ {
24
+ provide: NG_VALUE_ACCESSOR,
25
+ useExisting: forwardRef(() => AnswerSSComponent),
26
+ multi: true
27
+ },
28
+ ], usesInheritance: true, ngImport: i0, template: "<mat-radio-group\r\n class=\"container-ms-ss-alternatives\"\r\n [tpSurveyAlternativesContainer] = \"question()\"\r\n [containerViewModel]=\"viewModel()\"\r\n [formControl]=\"control\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n #tablet_alt\r\n class=\"alternative-ss-ms tp-survey-radio-button\"\r\n [style.font-size.%]=\"viewModel() === viewModelE.vmTablet ? question().AlternativeTabletFontSize : undefined\"\r\n [value]=\"alt.Value\"\r\n (change)=\"onAlternativeClick.emit($event.value)\">\r\n @if (alt.IsMute) {\r\n <mat-icon class=\"icon-is-mute\" svgIcon=\"iconIsMute\"></mat-icon>\r\n }\r\n <span class=\"alternative-ss-ms-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </mat-radio-button>\r\n }\r\n</mat-radio-group>\r\n\r\n", styles: [".container-controls{display:grid;justify-content:center;gap:1em}.container-controls>mat-radio-group{display:grid;grid-column-gap:2em;grid-gap:.5em;min-width:200px}@media (max-width: 480px){.container-controls{padding:1em}}\n"], dependencies: [{ kind: "directive", type: MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "pipe", type: MultiLangObjectToHtmlPipe, name: "multiLangObjectToHtml" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: AlternativesContainerDirective, selector: "[tpSurveyAlternativesContainer]", inputs: ["tpSurveyAlternativesContainer", "containerViewModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: AnswerSSComponent, decorators: [{
31
+ type: Component,
32
+ args: [{ selector: 'tp-survey-answer-ss', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
33
+ MatRadioGroup,
34
+ ReactiveFormsModule,
35
+ MatRadioButton,
36
+ MultiLangObjectToHtmlPipe,
37
+ KeyValuePipe,
38
+ MatFormField,
39
+ MatInput,
40
+ MatIcon,
41
+ MatCheckbox,
42
+ AlternativesContainerDirective
43
+ ], providers: [
44
+ {
45
+ provide: NG_VALUE_ACCESSOR,
46
+ useExisting: forwardRef(() => AnswerSSComponent),
47
+ multi: true
48
+ },
49
+ ], template: "<mat-radio-group\r\n class=\"container-ms-ss-alternatives\"\r\n [tpSurveyAlternativesContainer] = \"question()\"\r\n [containerViewModel]=\"viewModel()\"\r\n [formControl]=\"control\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n #tablet_alt\r\n class=\"alternative-ss-ms tp-survey-radio-button\"\r\n [style.font-size.%]=\"viewModel() === viewModelE.vmTablet ? question().AlternativeTabletFontSize : undefined\"\r\n [value]=\"alt.Value\"\r\n (change)=\"onAlternativeClick.emit($event.value)\">\r\n @if (alt.IsMute) {\r\n <mat-icon class=\"icon-is-mute\" svgIcon=\"iconIsMute\"></mat-icon>\r\n }\r\n <span class=\"alternative-ss-ms-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </mat-radio-button>\r\n }\r\n</mat-radio-group>\r\n\r\n", styles: [".container-controls{display:grid;justify-content:center;gap:1em}.container-controls>mat-radio-group{display:grid;grid-column-gap:2em;grid-gap:.5em;min-width:200px}@media (max-width: 480px){.container-controls{padding:1em}}\n"] }]
50
+ }] });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5zd2VyLnNzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RwLnN1cnZleS9zcmMvbGliL2NvbXBvbmVudC9hbnN3ZXIvYW5zd2VyLnNzL2Fuc3dlci5zcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cC5zdXJ2ZXkvc3JjL2xpYi9jb21wb25lbnQvYW5zd2VyL2Fuc3dlci5zcy9hbnN3ZXIuc3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDakgsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFL0UsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sNEVBQTRFLENBQUM7OztBQTRCMUgsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHFCQUE2QjtJQTFCcEU7O1FBMkJFLGFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7UUFDekMsb0JBQWUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF5QixDQUFDO1FBQzFELHVCQUFrQixHQUFHLE1BQU0sRUFBVSxDQUFDO0tBQ3ZDOzhHQUpZLGlCQUFpQjtrR0FBakIsaUJBQWlCLDBaQVJqQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixpRENyQ0gsNjFCQW9CQSwwUkRBSSxhQUFhLHNNQUNiLG1CQUFtQiwwVEFDbkIsY0FBYywyUkFDZCx5QkFBeUIsOERBSXpCLE9BQU8sMklBRVAsOEJBQThCOzsyRkFVckIsaUJBQWlCO2tCQTFCN0IsU0FBUzsrQkFDRSxxQkFBcUIsbUJBR2QsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsYUFBYTt3QkFDYixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2QseUJBQXlCO3dCQUN6QixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixPQUFPO3dCQUNQLFdBQVc7d0JBQ1gsOEJBQThCO3FCQUMvQixhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgaW5wdXQsIG91dHB1dCx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge01hdFJhZGlvQnV0dG9uLCBNYXRSYWRpb0dyb3VwfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XHJcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtLZXlWYWx1ZVBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHtNYXRJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQge01hdEljb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7TXVsdGlMYW5nT2JqZWN0VG9IdG1sUGlwZX0gZnJvbSAnLi4vLi4vLi4vcGlwZS9tdWx0aS5sYW5nLm9iamVjdC50by5odG1sL211bHRpLmxhbmcub2JqZWN0LnRvLmh0bWwucGlwZSc7XHJcbmltcG9ydCB7QW5zd2VyTWFzdGVyQ29tcG9uZW50fSBmcm9tICcuLi9hbnN3ZXIubWFzdGVyL2Fuc3dlci5tYXN0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtJZGJBbHRlcm5hdGl2ZSwgSWRiUXVlc3Rpb259IGZyb20gJy4uLy4uLy4uL3RwLnN1cnZleS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0FsdGVybmF0aXZlc0NvbnRhaW5lckRpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2FsdGVybmF0aXZlcy5jb250YWluZXIvYWx0ZXJuYXRpdmVzLmNvbnRhaW5lci5kaXJlY3RpdmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cC1zdXJ2ZXktYW5zd2VyLXNzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5zd2VyLnNzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hbnN3ZXIuc3MuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdFJhZGlvR3JvdXAsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0UmFkaW9CdXR0b24sXHJcbiAgICBNdWx0aUxhbmdPYmplY3RUb0h0bWxQaXBlLFxyXG4gICAgS2V5VmFsdWVQaXBlLFxyXG4gICAgTWF0Rm9ybUZpZWxkLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBNYXRJY29uLFxyXG4gICAgTWF0Q2hlY2tib3gsXHJcbiAgICBBbHRlcm5hdGl2ZXNDb250YWluZXJEaXJlY3RpdmVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQW5zd2VyU1NDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5zd2VyU1NDb21wb25lbnQgZXh0ZW5kcyBBbnN3ZXJNYXN0ZXJDb21wb25lbnQ8bnVtYmVyPntcclxuICBxdWVzdGlvbiA9IGlucHV0LnJlcXVpcmVkPElkYlF1ZXN0aW9uPigpO1xyXG4gIGFsdGVybmF0aXZlTGlzdCA9IGlucHV0LnJlcXVpcmVkPEFycmF5PElkYkFsdGVybmF0aXZlPj4oKTtcclxuICBvbkFsdGVybmF0aXZlQ2xpY2sgPSBvdXRwdXQ8bnVtYmVyPigpO1xyXG59XHJcblxyXG5cclxuIiwiPG1hdC1yYWRpby1ncm91cFxyXG4gY2xhc3M9XCJjb250YWluZXItbXMtc3MtYWx0ZXJuYXRpdmVzXCJcclxuIFt0cFN1cnZleUFsdGVybmF0aXZlc0NvbnRhaW5lcl0gPSBcInF1ZXN0aW9uKClcIlxyXG4gW2NvbnRhaW5lclZpZXdNb2RlbF09XCJ2aWV3TW9kZWwoKVwiXHJcbiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiPlxyXG4gQGZvciAoYWx0IG9mIGFsdGVybmF0aXZlTGlzdCgpOyB0cmFjayBhbHQuVmFsdWU7IGxldCBpbmRleCA9ICRpbmRleCkge1xyXG4gIDxtYXQtcmFkaW8tYnV0dG9uXHJcbiAgICN0YWJsZXRfYWx0XHJcbiAgIGNsYXNzPVwiYWx0ZXJuYXRpdmUtc3MtbXMgdHAtc3VydmV5LXJhZGlvLWJ1dHRvblwiXHJcbiAgIFtzdHlsZS5mb250LXNpemUuJV09XCJ2aWV3TW9kZWwoKSA9PT0gdmlld01vZGVsRS52bVRhYmxldCA/IHF1ZXN0aW9uKCkuQWx0ZXJuYXRpdmVUYWJsZXRGb250U2l6ZSA6IHVuZGVmaW5lZFwiXHJcbiAgIFt2YWx1ZV09XCJhbHQuVmFsdWVcIlxyXG4gICAoY2hhbmdlKT1cIm9uQWx0ZXJuYXRpdmVDbGljay5lbWl0KCRldmVudC52YWx1ZSlcIj5cclxuICAgQGlmIChhbHQuSXNNdXRlKSB7XHJcbiAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLWlzLW11dGVcIiBzdmdJY29uPVwiaWNvbklzTXV0ZVwiPjwvbWF0LWljb24+XHJcbiAgIH1cclxuICAgPHNwYW4gY2xhc3M9XCJhbHRlcm5hdGl2ZS1zcy1tcy1jYXB0aW9uXCIgW2lubmVySFRNTF09IFwiYWx0Lk11bHRpTGFuZ0NhcHRpb25zIHwgbXVsdGlMYW5nT2JqZWN0VG9IdG1sOmxhbmd1YWdlKClcIj48L3NwYW4+XHJcbiAgPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gfVxyXG48L21hdC1yYWRpby1ncm91cD5cclxuXHJcbiJdfQ==