@bnsights/bbsf-controls 1.0.194-beta.9 → 1.2.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 (159) hide show
  1. package/README.md +1315 -1245
  2. package/fesm2022/bnsights-bbsf-controls.mjs +375 -345
  3. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
  4. package/lib/Shared/Models/DropdownOptions.d.ts +3 -0
  5. package/lib/Shared/Models/RepeaterOptions.d.ts +2 -0
  6. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +0 -1
  7. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +0 -1
  8. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +1 -1
  9. package/lib/controls/Repeater/repeater/repeater.component.d.ts +7 -0
  10. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +7 -0
  11. package/lib/modules/bbsf-editors.module.d.ts +6 -7
  12. package/package.json +34 -37
  13. package/src/lib/assets/Style.scss +2 -0
  14. package/src/lib/assets/ace-builds/ace.js +1 -1
  15. package/src/lib/assets/ace-builds/mode-markdown.js +1 -1
  16. package/esm2022/bnsights-bbsf-controls.mjs +0 -5
  17. package/esm2022/lib/Shared/Components/app-base-component.mjs +0 -226
  18. package/esm2022/lib/Shared/Components/ng-tag-input.mjs +0 -336
  19. package/esm2022/lib/Shared/Directives/appPreventDoubleClick.directive.mjs +0 -39
  20. package/esm2022/lib/Shared/Directives/template-name.directive.mjs +0 -19
  21. package/esm2022/lib/Shared/Enums/CalendarView.mjs +0 -8
  22. package/esm2022/lib/Shared/Enums/ControlLayout.mjs +0 -6
  23. package/esm2022/lib/Shared/Enums/Countries.mjs +0 -247
  24. package/esm2022/lib/Shared/Enums/Enums.mjs +0 -36
  25. package/esm2022/lib/Shared/Enums/FileType.mjs +0 -29
  26. package/esm2022/lib/Shared/Enums/FilterType.mjs +0 -11
  27. package/esm2022/lib/Shared/Enums/FontSize.mjs +0 -7
  28. package/esm2022/lib/Shared/Enums/ForceDirection.mjs +0 -6
  29. package/esm2022/lib/Shared/Enums/IconPosition.mjs +0 -6
  30. package/esm2022/lib/Shared/Enums/ImageType.mjs +0 -10
  31. package/esm2022/lib/Shared/Enums/InputType.mjs +0 -10
  32. package/esm2022/lib/Shared/Enums/Insert.mjs +0 -9
  33. package/esm2022/lib/Shared/Enums/LanguageMode.mjs +0 -11
  34. package/esm2022/lib/Shared/Enums/LanguageValidation.mjs +0 -6
  35. package/esm2022/lib/Shared/Enums/Markdown.mjs +0 -20
  36. package/esm2022/lib/Shared/Enums/Misc.mjs +0 -7
  37. package/esm2022/lib/Shared/Enums/PagingActionMode.mjs +0 -6
  38. package/esm2022/lib/Shared/Enums/Para.mjs +0 -9
  39. package/esm2022/lib/Shared/Enums/PickerType.mjs +0 -7
  40. package/esm2022/lib/Shared/Enums/SelectMode.mjs +0 -6
  41. package/esm2022/lib/Shared/Enums/StartView.mjs +0 -7
  42. package/esm2022/lib/Shared/Enums/Style.mjs +0 -8
  43. package/esm2022/lib/Shared/Enums/StyleConfirmationMode.mjs +0 -7
  44. package/esm2022/lib/Shared/Enums/TagInputView.mjs +0 -7
  45. package/esm2022/lib/Shared/Enums/ToolbarButtons.mjs +0 -33
  46. package/esm2022/lib/Shared/Enums/map-enums.mjs +0 -15
  47. package/esm2022/lib/Shared/Enums/menu-list-enum.mjs +0 -6
  48. package/esm2022/lib/Shared/Models/Attribute.mjs +0 -3
  49. package/esm2022/lib/Shared/Models/AutocompleteDTO.mjs +0 -8
  50. package/esm2022/lib/Shared/Models/AutocompleteOptions.mjs +0 -39
  51. package/esm2022/lib/Shared/Models/CalendarDTO.mjs +0 -3
  52. package/esm2022/lib/Shared/Models/CalendarEventDTO.mjs +0 -3
  53. package/esm2022/lib/Shared/Models/CalendarOptions.mjs +0 -19
  54. package/esm2022/lib/Shared/Models/CancelDTO.mjs +0 -7
  55. package/esm2022/lib/Shared/Models/CaptchaStyle.mjs +0 -3
  56. package/esm2022/lib/Shared/Models/CheckBoxOptions.mjs +0 -11
  57. package/esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs +0 -39
  58. package/esm2022/lib/Shared/Models/ControlOptionsBase.mjs +0 -17
  59. package/esm2022/lib/Shared/Models/CustomValidation.mjs +0 -14
  60. package/esm2022/lib/Shared/Models/DatePickerOptions.mjs +0 -40
  61. package/esm2022/lib/Shared/Models/DropdownListItem.mjs +0 -3
  62. package/esm2022/lib/Shared/Models/DropdownOptions.mjs +0 -38
  63. package/esm2022/lib/Shared/Models/EditPersonalImage.mjs +0 -7
  64. package/esm2022/lib/Shared/Models/EnglishArabicDTO.mjs +0 -10
  65. package/esm2022/lib/Shared/Models/FileDTO.mjs +0 -24
  66. package/esm2022/lib/Shared/Models/FileOptions.mjs +0 -15
  67. package/esm2022/lib/Shared/Models/FileUploadModel.mjs +0 -3
  68. package/esm2022/lib/Shared/Models/FileUploadOptions.mjs +0 -13
  69. package/esm2022/lib/Shared/Models/FilterItem.mjs +0 -8
  70. package/esm2022/lib/Shared/Models/FormOptions.mjs +0 -32
  71. package/esm2022/lib/Shared/Models/HtmlEditorOptions.mjs +0 -12
  72. package/esm2022/lib/Shared/Models/ImageUploadOptions.mjs +0 -14
  73. package/esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs +0 -12
  74. package/esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs +0 -6
  75. package/esm2022/lib/Shared/Models/MarkdownEditorOptions.mjs +0 -24
  76. package/esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +0 -9
  77. package/esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +0 -9
  78. package/esm2022/lib/Shared/Models/MultiLingualTextBoxOptions.mjs +0 -17
  79. package/esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs +0 -21
  80. package/esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs +0 -9
  81. package/esm2022/lib/Shared/Models/PagingDTO.mjs +0 -13
  82. package/esm2022/lib/Shared/Models/PagingOptions.mjs +0 -49
  83. package/esm2022/lib/Shared/Models/PagingPayload.mjs +0 -3
  84. package/esm2022/lib/Shared/Models/PhoneOptions.mjs +0 -16
  85. package/esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs +0 -11
  86. package/esm2022/lib/Shared/Models/ProfilePictureDTO.mjs +0 -3
  87. package/esm2022/lib/Shared/Models/RadioButtonItem.mjs +0 -3
  88. package/esm2022/lib/Shared/Models/RadioButtonOptions.mjs +0 -7
  89. package/esm2022/lib/Shared/Models/RangeNumber.mjs +0 -3
  90. package/esm2022/lib/Shared/Models/Recaptcha.mjs +0 -6
  91. package/esm2022/lib/Shared/Models/RecaptchaOptions.mjs +0 -22
  92. package/esm2022/lib/Shared/Models/RepeaterField.mjs +0 -3
  93. package/esm2022/lib/Shared/Models/RepeaterOptions.mjs +0 -14
  94. package/esm2022/lib/Shared/Models/SaveDTO.mjs +0 -7
  95. package/esm2022/lib/Shared/Models/TagsInputDTO.mjs +0 -3
  96. package/esm2022/lib/Shared/Models/TagsInputOptions.mjs +0 -56
  97. package/esm2022/lib/Shared/Models/TextAreaOptions.mjs +0 -19
  98. package/esm2022/lib/Shared/Models/TextBoxOptions.mjs +0 -27
  99. package/esm2022/lib/Shared/Models/ToggleSlideOptions.mjs +0 -9
  100. package/esm2022/lib/Shared/Models/UploadPersonalImage.mjs +0 -7
  101. package/esm2022/lib/Shared/Models/bread-crumb.mjs +0 -8
  102. package/esm2022/lib/Shared/Models/control-filter-Item.mjs +0 -6
  103. package/esm2022/lib/Shared/Models/filter-options.mjs +0 -9
  104. package/esm2022/lib/Shared/Models/index.mjs +0 -58
  105. package/esm2022/lib/Shared/Models/page-header-options.mjs +0 -78
  106. package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +0 -22
  107. package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +0 -22
  108. package/esm2022/lib/Shared/config/environment.mjs +0 -12
  109. package/esm2022/lib/Shared/default_intl.mjs +0 -29
  110. package/esm2022/lib/Shared/services/ControlUtility.mjs +0 -162
  111. package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +0 -30
  112. package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
  113. package/esm2022/lib/Shared/services/file-upload.service.mjs +0 -29
  114. package/esm2022/lib/Shared/services/index.mjs +0 -7
  115. package/esm2022/lib/Shared/services/render-component-service.service.mjs +0 -32
  116. package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +0 -125
  117. package/esm2022/lib/Shared/utils/date-formatter.mjs +0 -48
  118. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -299
  119. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +0 -179
  120. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +0 -121
  121. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +0 -143
  122. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -240
  123. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +0 -296
  124. package/esm2022/lib/controls/FileUpload/FileUpload.component.mjs +0 -741
  125. package/esm2022/lib/controls/Form/Form.component.mjs +0 -117
  126. package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -185
  127. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -360
  128. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -502
  129. package/esm2022/lib/controls/MarkdownEditor/markdown-editor.component.mjs +0 -243
  130. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -456
  131. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -441
  132. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -500
  133. package/esm2022/lib/controls/Paging/JwPagination.component.mjs +0 -160
  134. package/esm2022/lib/controls/Paging/Paging.component.mjs +0 -626
  135. package/esm2022/lib/controls/Phone/Phone.component.mjs +0 -134
  136. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -390
  137. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +0 -113
  138. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +0 -134
  139. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +0 -135
  140. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +0 -1291
  141. package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +0 -22
  142. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +0 -118
  143. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +0 -308
  144. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +0 -581
  145. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +0 -357
  146. package/esm2022/lib/controls/Toggleslide/Toggleslide.component.mjs +0 -96
  147. package/esm2022/lib/controls/bbsf-controls.module.mjs +0 -92
  148. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +0 -42
  149. package/esm2022/lib/modules/bbsf-core.module.mjs +0 -210
  150. package/esm2022/lib/modules/bbsf-datetime.module.mjs +0 -90
  151. package/esm2022/lib/modules/bbsf-dropdown.module.mjs +0 -57
  152. package/esm2022/lib/modules/bbsf-editors.module.mjs +0 -97
  153. package/esm2022/lib/modules/bbsf-forms-basic.module.mjs +0 -79
  154. package/esm2022/lib/modules/bbsf-multilingual.module.mjs +0 -60
  155. package/esm2022/lib/modules/bbsf-phone.module.mjs +0 -57
  156. package/esm2022/lib/modules/bbsf-specialized.module.mjs +0 -160
  157. package/esm2022/lib/modules/bbsf-uploads.module.mjs +0 -106
  158. package/esm2022/lib/modules/bbsf-utility.module.mjs +0 -103
  159. package/esm2022/public-api.mjs +0 -169
@@ -1,441 +0,0 @@
1
- import { Component, Input, Optional, Output, EventEmitter } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormControl, Validators, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { InputType } from '../../Shared/Enums/InputType';
5
- import { EnglishArabicDTO } from '../../Shared/Models/EnglishArabicDTO';
6
- import { LanguageMode } from '../../Shared/Enums/LanguageMode';
7
- import { ControlLayout } from '../../Shared/Enums/ControlLayout';
8
- import { InlineSVGModule } from 'ng-inline-svg-2';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/forms";
11
- import * as i2 from "../../Shared/services/ControlUtility";
12
- import * as i3 from "@bnsights/bbsf-utilities/ui";
13
- import * as i4 from "../../Shared/services/GlobalSettings.service";
14
- import * as i5 from "@angular/common";
15
- export class MultiLingualTextAreaComponent {
16
- static { this.controlContainerstatic = null; }
17
- constructor(multiLingualTextAreaFormControlHost, controlContainer, controlUtility, utilityService, controlValidationService, globalSettings) {
18
- this.multiLingualTextAreaFormControlHost = multiLingualTextAreaFormControlHost;
19
- this.controlContainer = controlContainer;
20
- this.controlUtility = controlUtility;
21
- this.utilityService = utilityService;
22
- this.controlValidationService = controlValidationService;
23
- this.globalSettings = globalSettings;
24
- this.onChange = new EventEmitter();
25
- this.multiLanguageTextAreagroup = new FormGroup({});
26
- this.arabicWordCount = 0;
27
- this.arabicWordCountArray = 0;
28
- this.englishWordCount = 0;
29
- this.englishWordCountArray = 0;
30
- this.currentLanguage = "";
31
- this.arabicValidationRules = [];
32
- this.arabicValidationRulesasync = [];
33
- this.englishValidationRules = [];
34
- this.englishValidationRulesasync = [];
35
- this.validationRules = [];
36
- this.validationRulesasync = [];
37
- this.isShowArabicWordCount = false;
38
- this.isShowEnglishWordCount = false;
39
- this.markAllAsTouched = false;
40
- this.arabicLetterOnly = "";
41
- this.englishLetterOnly = "";
42
- //For Show warning message of max length limit
43
- this.minCharsLimit = -1; //To disable chars limit feature by default
44
- this.englishCurrentCharsCount = 0;
45
- this.arabicCurrentCharsCount = 0;
46
- this.showEnglishCharsLimitMsg = false;
47
- this.showArabicCharsLimitMsg = false;
48
- this.hasEnglishCharsLimitValidationError = false;
49
- this.hasArabicCharsLimitValidationError = false;
50
- this.englishMaxLimitWarningMsg = "";
51
- this.arabicMaxLimitWarningMsg = "";
52
- this.resetError = () => {
53
- this.controlValidationService.removeGlobalError();
54
- };
55
- //External Method
56
- this.RemoveRequiredValidation = () => {
57
- this.controlUtility.removeRequiredValidation(this.englishTextAreaFormControl, this.englishValidationRules, this.options);
58
- this.controlUtility.removeRequiredValidation(this.arabicTextAreaFormControl, this.arabicValidationRules, this.options);
59
- };
60
- //External Method
61
- this.AddRequiredValidation = () => {
62
- this.controlUtility.addRequiredValidation(this.englishTextAreaFormControl, this.englishValidationRules, this.options);
63
- this.controlUtility.addRequiredValidation(this.arabicTextAreaFormControl, this.arabicValidationRules, this.options);
64
- };
65
- //External Method
66
- this.RemoveCustomValidation = (CustomValidation) => {
67
- this.controlUtility.removeCustomValidation(this.englishTextAreaFormControl, this.englishValidationRules, CustomValidation);
68
- this.controlUtility.removeCustomValidation(this.arabicTextAreaFormControl, this.arabicValidationRules, CustomValidation);
69
- };
70
- //External Method
71
- this.AddCustomValidation = (CustomValidation) => {
72
- this.controlUtility.addCustomValidation(this.englishTextAreaFormControl, this.englishValidationRules, CustomValidation);
73
- this.controlUtility.addCustomValidation(this.arabicTextAreaFormControl, this.arabicValidationRules, CustomValidation);
74
- };
75
- //External Method
76
- this.IsValid = () => {
77
- this.controlUtility.isValid(this.englishTextAreaFormControl);
78
- this.controlUtility.isValid(this.arabicTextAreaFormControl);
79
- };
80
- MultiLingualTextAreaComponent.controlContainerstatic = this.controlContainer;
81
- }
82
- getCustomErrorsMassages() {
83
- this.arabicLetterOnly = this.utilityService.getResourceValue("VAL_ArabicIsRequiredAndOnly50CharactersEnglish");
84
- this.englishLetterOnly = this.utilityService.getResourceValue("EnglishLetterOnly");
85
- }
86
- async ngOnInit() {
87
- this.controlValidationService.isCreatedBefor = false;
88
- this.currentLanguage = await this.utilityService.getCurrentLanguage();
89
- // UtilityService.Translator.onLangChange.subscribe((event: LangChangeEvent) => {
90
- // this.CurrentLanguage = event.lang
91
- // this.showInputUsingLanguageMode();
92
- // });
93
- if (!this.options.viewType)
94
- this.options.viewType = this.globalSettings.viewType;
95
- if (!this.options.languageMode)
96
- this.options.languageMode = this.globalSettings.languageMode;
97
- if (!this.options.multiControlPlacementType)
98
- this.options.multiControlPlacementType = this.globalSettings.multiControlPlacementType;
99
- if (!this.options.maxLength)
100
- this.options.maxLength = this.globalSettings.maxLengthTextArea;
101
- if (this.options.labelKey != null && this.options.labelKey != "") {
102
- this.options.arabicLabelValue = this.utilityService.getResourceValue(this.options.labelKey) + " " + this.utilityService.getResourceValue("InArabic");
103
- this.options.englishLabelValue = this.utilityService.getResourceValue(this.options.labelKey) + " " + this.utilityService.getResourceValue("InEnglish");
104
- }
105
- else {
106
- if (this.options.arabicLabelKey != null && this.options.arabicLabelKey != "")
107
- this.options.arabicLabelValue = this.utilityService.getResourceValue(this.options.arabicLabelKey);
108
- if (this.options.englishLabelKey != null && this.options.englishLabelKey != "")
109
- this.options.englishLabelValue = this.utilityService.getResourceValue(this.options.englishLabelKey);
110
- }
111
- this.multiLanguageTextAreagroup = new FormGroup({});
112
- this.multiLanguageTextAreagroup.addControl("Arabic", new FormControl(''));
113
- this.multiLanguageTextAreagroup.addControl("English", new FormControl(''));
114
- this.arabicTextAreaFormControl = this.multiLanguageTextAreagroup.controls["Arabic"]; // new FormControl('',validationRules);
115
- this.englishTextAreaFormControl = this.multiLanguageTextAreagroup.controls["English"]; // new FormControl('',validationRules);
116
- this.group.addControl(this.options.name, new FormGroup(this.multiLanguageTextAreagroup.controls));
117
- this.getCustomErrorsMassages();
118
- switch (this.options.type) {
119
- case InputType.Email:
120
- this.englishValidationRules.push(Validators.compose([
121
- this.controlUtility.patternValidator(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/, { EmailValidationKey: "" }),
122
- ]));
123
- this.arabicValidationRules.push(Validators.compose([
124
- this.controlUtility.patternValidator(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/, { EmailValidationKey: "" }),
125
- ]));
126
- break;
127
- case InputType.Number:
128
- this.englishValidationRules.push(Validators.pattern('^[0-9]+(\.?[0-9]+)?$'));
129
- this.arabicValidationRules.push(Validators.pattern('^[0-9]+(\.?[0-9]+)?$'));
130
- break;
131
- }
132
- if (this.options.customValidation.length > 0) {
133
- let Validations = this.options.customValidation;
134
- for (let index = 0; index < Validations.length; index++) {
135
- const Validation = Validations[index];
136
- this.englishValidationRules.push(Validation.functionBody);
137
- this.arabicValidationRules.push(Validation.functionBody);
138
- }
139
- }
140
- if (this.options.minLength > 0) {
141
- this.arabicValidationRules.push(Validators.minLength(this.options.minLength));
142
- this.englishValidationRules.push(Validators.minLength(this.options.minLength));
143
- }
144
- if (this.options.maxLength > 0) {
145
- this.englishValidationRules.push(Validators.maxLength(this.options.maxLength));
146
- this.arabicValidationRules.push(Validators.maxLength(this.options.maxLength));
147
- if (!this.options.maxLengthWarningLimit)
148
- this.options.maxLengthWarningLimit = this.globalSettings.maxLengthWarningLimit;
149
- this.minCharsLimit = this.options.maxLength - this.options.maxLengthWarningLimit;
150
- }
151
- this.showInputUsingLanguageMode();
152
- this.arabicValidationRules.push(Validators.compose([
153
- this.controlUtility.arabicValidator({ ArabicIsRequiredAndOnly50CharactersEnglish: this.arabicLetterOnly }),
154
- ]));
155
- this.englishValidationRules.push(Validators.compose([
156
- this.controlUtility.patternValidator(/^[~`!@#$%^&*()‘’“”_+=[\]\\{}|;':",.\/<>?a-zA-Z0-9- \n]*$/, { EnglishLetterOnly: this.englishLetterOnly }),
157
- ]));
158
- this.arabicTextAreaFormControl.setValidators(this.arabicValidationRules);
159
- this.arabicTextAreaFormControl.setAsyncValidators(this.arabicValidationRulesasync);
160
- this.englishTextAreaFormControl.setValidators(this.englishValidationRules);
161
- this.englishTextAreaFormControl.setAsyncValidators(this.englishValidationRulesasync);
162
- if (this.options.isDisabled) {
163
- this.englishTextAreaFormControl.disable();
164
- this.arabicTextAreaFormControl.disable();
165
- }
166
- this.arabicTextAreaFormControl.setValue(this.options.value.arabic);
167
- this.englishTextAreaFormControl.setValue(this.options.value.english);
168
- this.multiLingualTextAreaFormControlHost.ngSubmit.subscribe((value) => {
169
- this.group.markAllAsTouched();
170
- this.markAllAsTouched = true;
171
- });
172
- if (this.options.isReadonly && !this.options.value) {
173
- this.options.value.arabic = this.utilityService.getResourceValue('NA');
174
- this.options.value.english = this.utilityService.getResourceValue('NA');
175
- }
176
- }
177
- onTextChange() {
178
- let arabicValue = "";
179
- let englishValue = "";
180
- if (this.englishTextAreaFormControl.value == "") {
181
- this.englishWordCountArray = 0;
182
- this.englishWordCount = 0;
183
- }
184
- else {
185
- if (this.englishTextAreaFormControl.value != null || this.englishTextAreaFormControl.value != undefined) {
186
- this.englishWordCountArray = this.englishTextAreaFormControl.value.split(" ").length;
187
- if (this.englishWordCountArray > 0) {
188
- if (this.englishWordCountArray > this.options.maxWordCount) {
189
- this.englishWordCount = this.options.maxWordCount;
190
- this.multiLanguageTextAreagroup.controls["English"].setErrors({ MaxWordCountValidationKey: this.options.maxWordCount });
191
- this.multiLanguageTextAreagroup.controls["English"].markAsTouched();
192
- this.multiLanguageTextAreagroup.controls["English"].invalid;
193
- }
194
- else {
195
- this.englishWordCount = this.englishWordCountArray;
196
- }
197
- englishValue = this.englishTextAreaFormControl.value;
198
- }
199
- }
200
- //Check for maxlength limit count
201
- //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
202
- if (this.options.maxLength && this.minCharsLimit >= 0) {
203
- this.englishCurrentCharsCount = this.englishTextAreaFormControl.value.length;
204
- if (this.englishCurrentCharsCount > this.minCharsLimit) {
205
- this.showEnglishCharsLimitMsg = true;
206
- this.hasEnglishCharsLimitValidationError = true;
207
- if (this.englishCurrentCharsCount == this.options.maxLength)
208
- this.englishCharsLimitMsgClass = "danger";
209
- else
210
- this.englishCharsLimitMsgClass = "warning";
211
- }
212
- else {
213
- this.showEnglishCharsLimitMsg = false;
214
- this.hasEnglishCharsLimitValidationError = false;
215
- }
216
- let max = this.options.maxLength;
217
- let current = this.englishCurrentCharsCount;
218
- let msg = this.utilityService.getResourceValue("MaxLengthLimitWarning");
219
- // Replace placeholders with actual values
220
- this.englishMaxLimitWarningMsg = msg.replace("${max}", max.toString()).replace("${current}", current.toString());
221
- }
222
- }
223
- if (this.arabicTextAreaFormControl.value == "") {
224
- this.arabicWordCountArray = 0;
225
- this.arabicWordCount = 0;
226
- }
227
- else {
228
- if (this.arabicTextAreaFormControl.value != null || this.arabicTextAreaFormControl.value != undefined) {
229
- this.arabicWordCountArray = this.arabicTextAreaFormControl.value.split(" ").length;
230
- if (this.arabicWordCountArray > 0) {
231
- if (this.arabicWordCountArray > this.options.maxWordCount) {
232
- this.arabicWordCount = this.options.maxWordCount;
233
- this.multiLanguageTextAreagroup.controls["Arabic"].setErrors({ MaxWordCountValidationKey: this.options.maxWordCount });
234
- this.multiLanguageTextAreagroup.controls["Arabic"].markAsTouched();
235
- this.multiLanguageTextAreagroup.controls["Arabic"].invalid;
236
- }
237
- else {
238
- this.arabicWordCount = this.arabicWordCountArray;
239
- }
240
- arabicValue = this.arabicTextAreaFormControl.value;
241
- }
242
- }
243
- //Check for maxlength limit count
244
- //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
245
- if (this.options.maxLength && this.minCharsLimit >= 0) {
246
- this.arabicCurrentCharsCount = this.arabicTextAreaFormControl.value.length;
247
- if (this.arabicCurrentCharsCount > this.minCharsLimit) {
248
- this.showArabicCharsLimitMsg = true;
249
- this.hasArabicCharsLimitValidationError = true;
250
- if (this.arabicCurrentCharsCount == this.options.maxLength)
251
- this.arabicCharsLimitMsgClass = "danger";
252
- else
253
- this.arabicCharsLimitMsgClass = "warning";
254
- }
255
- else {
256
- this.showArabicCharsLimitMsg = false;
257
- this.hasArabicCharsLimitValidationError = false;
258
- }
259
- let max = this.options.maxLength;
260
- let current = this.arabicCurrentCharsCount;
261
- let msg = this.utilityService.getResourceValue("MaxLengthLimitWarning");
262
- // Replace placeholders with actual values
263
- this.arabicMaxLimitWarningMsg = msg.replace("${max}", max.toString()).replace("${current}", current.toString());
264
- }
265
- }
266
- let multiLangModel = new EnglishArabicDTO();
267
- multiLangModel.arabic = arabicValue;
268
- multiLangModel.english = englishValue;
269
- this.onChange.emit(multiLangModel);
270
- this.arabicTextAreaFormControl.setValue(multiLangModel.arabic);
271
- this.englishTextAreaFormControl.setValue(multiLangModel.english);
272
- // this.group.get(this.options.name).setValue(mulitLangModel);
273
- //Use this line to enable two way binding.
274
- this.options.value = multiLangModel;
275
- }
276
- showGlobalError() {
277
- this.controlUtility.showGlobalError();
278
- }
279
- getErrorValidation(ErrorList) {
280
- if (this.markAllAsTouched && this.group.invalid) {
281
- this.showGlobalError();
282
- this.markAllAsTouched = false;
283
- }
284
- return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
285
- }
286
- getInputType(type) {
287
- return InputType[type];
288
- }
289
- trimControlValue(type) {
290
- const whitespace = ' ';
291
- if (type == "En") {
292
- let originalValue = this.englishTextAreaFormControl.value;
293
- if (this.options.patchFunction && this.options.patchPath && this.englishTextAreaFormControl.valid) {
294
- this.controlUtility.patchControlValue(originalValue, this.options.patchFunction, this.options.patchPath);
295
- }
296
- if (this.englishTextAreaFormControl.value.startsWith(whitespace) || this.englishTextAreaFormControl.value.endsWith(whitespace)) {
297
- this.englishTextAreaFormControl.patchValue(originalValue);
298
- }
299
- }
300
- if (type == "Ar") {
301
- let originalValue = this.arabicTextAreaFormControl.value;
302
- if (this.options.patchFunction && this.options.patchPath && this.arabicTextAreaFormControl.valid) {
303
- this.controlUtility.patchControlValue(originalValue, this.options.patchFunction, this.options.patchPath);
304
- }
305
- if (this.arabicTextAreaFormControl.value.startsWith(whitespace) || this.arabicTextAreaFormControl.value.endsWith(whitespace)) {
306
- this.arabicTextAreaFormControl.patchValue(originalValue);
307
- }
308
- }
309
- }
310
- copyInputMessage(inputElement) {
311
- this.controlUtility.CopyInputMessage(inputElement);
312
- }
313
- showInputUsingLanguageMode() {
314
- this.arabicValidationRules = this.arabicValidationRules.filter(item => item !== Validators.required);
315
- this.englishValidationRules = this.englishValidationRules.filter(item => item !== Validators.required);
316
- this.arabicTextAreaFormControl.clearValidators();
317
- this.englishTextAreaFormControl.clearValidators();
318
- this.arabicTextAreaFormControl.updateValueAndValidity();
319
- this.englishTextAreaFormControl.updateValueAndValidity();
320
- switch (this.options.languageMode) {
321
- case LanguageMode.Both_Languages_are_visible:
322
- this.showArabicTextArea = true;
323
- this.showEngishTextArea = true;
324
- if (this.options.isRequired == true) {
325
- this.englishValidationRules.push(Validators.required);
326
- this.arabicValidationRules.push(Validators.required);
327
- this.IsShowAsteriskInArabic = true;
328
- this.IsShowAsteriskInEnglish = true;
329
- }
330
- break;
331
- case LanguageMode.Arabic_Language_only_is_visible:
332
- this.showArabicTextArea = true;
333
- this.options.multiControlPlacementType = ControlLayout.Vertical;
334
- break;
335
- case LanguageMode.English_Language_only_is_visible:
336
- this.showEngishTextArea = true;
337
- this.options.multiControlPlacementType = ControlLayout.Vertical;
338
- break;
339
- case LanguageMode.Both_Languages_are_visible_but_only_current_language_is_required:
340
- this.showArabicTextArea = true;
341
- this.showEngishTextArea = true;
342
- this.options.multiControlPlacementType = this.globalSettings.multiControlPlacementType;
343
- if (this.currentLanguage == 'ar') {
344
- if (this.options.isRequired == true) {
345
- this.arabicValidationRules.push(Validators.required);
346
- this.IsShowAsteriskInArabic = true;
347
- }
348
- }
349
- if (this.currentLanguage == 'en') {
350
- if (this.options.isRequired == true) {
351
- this.englishValidationRules.push(Validators.required);
352
- this.IsShowAsteriskInEnglish = true;
353
- }
354
- }
355
- break;
356
- case LanguageMode.Both_Languages_but_only_Arabic_is_required:
357
- this.showArabicTextArea = true;
358
- this.showEngishTextArea = true;
359
- this.options.multiControlPlacementType = this.globalSettings.multiControlPlacementType;
360
- if (this.options.isRequired == true) {
361
- this.arabicValidationRules.push(Validators.required);
362
- this.IsShowAsteriskInArabic = true;
363
- }
364
- break;
365
- case LanguageMode.Both_Languages_but_only_English_is_required:
366
- this.showArabicTextArea = true;
367
- this.showEngishTextArea = true;
368
- this.options.multiControlPlacementType = this.globalSettings.multiControlPlacementType;
369
- if (this.options.isRequired == true) {
370
- this.englishValidationRules.push(Validators.required);
371
- this.IsShowAsteriskInEnglish = true;
372
- }
373
- break;
374
- case LanguageMode.Current_Language_only_is_visible_and_required:
375
- this.options.multiControlPlacementType = ControlLayout.Vertical;
376
- if (this.currentLanguage == 'ar') {
377
- this.showArabicTextArea = true;
378
- this.showEngishTextArea = false;
379
- if (this.options.isRequired == true) {
380
- this.arabicValidationRules.push(Validators.required);
381
- this.IsShowAsteriskInArabic = true;
382
- }
383
- }
384
- if (this.currentLanguage == 'en') {
385
- this.showArabicTextArea = false;
386
- this.showEngishTextArea = true;
387
- if (this.options.isRequired == true) {
388
- this.englishValidationRules.push(Validators.required);
389
- this.IsShowAsteriskInEnglish = true;
390
- }
391
- }
392
- break;
393
- default:
394
- break;
395
- }
396
- this.arabicTextAreaFormControl.setValidators(this.arabicValidationRules);
397
- this.englishTextAreaFormControl.setValidators(this.englishValidationRules);
398
- this.arabicTextAreaFormControl.updateValueAndValidity();
399
- this.englishTextAreaFormControl.updateValueAndValidity();
400
- }
401
- onArabicFocus(isFocus) {
402
- this.isShowArabicWordCount = isFocus;
403
- //onFocus
404
- if (isFocus) {
405
- if (this.hasArabicCharsLimitValidationError) //check if there was previous validation error
406
- this.showArabicCharsLimitMsg = true;
407
- }
408
- else //onFocusOut
409
- this.showArabicCharsLimitMsg = false;
410
- }
411
- onEnglishFocus(isFocus) {
412
- this.isShowEnglishWordCount = isFocus;
413
- //onFocus
414
- if (isFocus) {
415
- if (this.hasEnglishCharsLimitValidationError) //check if there was previous validation error
416
- this.showEnglishCharsLimitMsg = true;
417
- }
418
- else //onFocusOut
419
- this.showEnglishCharsLimitMsg = false;
420
- }
421
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLingualTextAreaComponent, deps: [{ token: i1.FormGroupDirective }, { token: i1.ControlContainer, optional: true }, { token: i2.ControlUtility }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
422
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiLingualTextAreaComponent, isStandalone: true, selector: "BBSF-MultiLingualTextArea", inputs: { group: "group", options: "options" }, outputs: { onChange: "onChange" }, ngImport: i0, template: "<div [formGroup]=\"group\">\r\n <div class=\"bbsf-control bbsf-multilang-textarea form-group mb-0\" [formGroup]=\"multiLanguageTextAreagroup\">\r\n <div class=\"row\">\r\n <!--#region English textarea-->\r\n <div [ngClass]=\"(options.multiControlPlacementType==1)?'col-md-12':'col-md-6'\" *ngIf=\"showEngishTextArea\" class=\"bbsf-multilang-form-group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label class=\"bbsf-label {{options.labelExtraClasses}}\" [hidden]=\"options.isHideEnglishLabel\">\r\n {{(options.englishLabelValue!=null&&options.englishLabelValue!=\"\")?options.englishLabelValue:options.labelValue+\"InEnglish\"}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"(((options.showAsterisk&&options.isRequired)||(options.isRequired))&&IsShowAsteriskInEnglish)&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.isReadonly\" [ngClass]=\"options.enableCopyToClipboard? 'p-40px' : '' \">\r\n <!--input-->\r\n <textarea class=\"form-control\" dir=\"ltr\" rows=\"{{options.rows}}\" cols=\"{{options.cols}}\" (focus)=\"onEnglishFocus(true)\"\r\n (focusout)=\"onEnglishFocus(false)\" maxlength=\"{{options.maxLength}}\" minlength=\"{{options.minLength}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"English\" [hidden]=\"options.isHideEnglishFields\"\r\n [class.is-invalid]=\"englishTextAreaFormControl.invalid && englishTextAreaFormControl.touched\"\r\n placeholder=\"{{options.englishPlaceholder}}\" (change)=\"trimControlValue('En')\" (keyup)=\"onTextChange()\"\r\n [(ngModel)]=\"options.value.english\"\r\n (keydown)=\"englishWordCountArray>options.maxWordCount&&$event.keyCode !=8?$event.preventDefault():null\" #userinputTextAreaEnglish>\r\n </textarea>\r\n <!--CopyToClipboard-->\r\n <div class=\"copy-clipboard\" [hidden]=\"options.isHideEnglishFields\" *ngIf=\"options.enableCopyToClipboard\"\r\n (click)=\"copyInputMessage(userinputTextAreaEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"options.isReadonly\"><span class=\"readonly-view\" [innerHTML]=\"options.value.english\"></span>\r\n\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!--wordCount-->\r\n <div class=\"bbsf-word-count\" *ngIf=\"options.maxWordCount>0&&isShowEnglishWordCount\">\r\n {{englishWordCount}}/{{options.maxWordCount}} Words</div>\r\n <!-- CharsLimitMsg-->\r\n <div class=\"bbsf-character-count\" *ngIf=\"showEnglishCharsLimitMsg\"\r\n [ngClass]=\"{'badge-light-warning': englishCharsLimitMsgClass === 'warning', 'badge-light-danger' : englishCharsLimitMsgClass === 'danger' }\">\r\n {{englishMaxLimitWarningMsg}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\"\r\n *ngIf=\"(options.labelDescription!=null&&options.labelDescription!='') ||(options.englishLabelDescription!=null&&options.englishLabelDescription!='')\">\r\n {{(options.englishLabelDescription!=null&&options.englishLabelDescription!=\"\")?options.englishLabelDescription:options.labelDescription}}\r\n </div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(englishTextAreaFormControl.invalid && englishTextAreaFormControl.touched)\">\r\n {{getErrorValidation(englishTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!--#region Arabic textbox-->\r\n <div [ngClass]=\"(options.multiControlPlacementType==1)?'col-md-12':'col-md-6'\" *ngIf=\"showArabicTextArea\" class=\"bbsf-multilang-form-group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label class=\"bbsf-label {{options.labelExtraClasses}}\" [hidden]=\"options.isHideArabicLabel\">\r\n {{(options.arabicLabelValue!=null&&options.arabicLabelValue!=\"\")?options.arabicLabelValue:options.labelValue+\"inArabic\"}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"(((options.showAsterisk&&options.isRequired)||(options.isRequired))&&IsShowAsteriskInArabic)&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <div *ngIf=\"!options.isReadonly\" class=\"bbsf-input-container\" [ngClass]=\"options.enableCopyToClipboard? 'p-40px' : '' \">\r\n <!--input-->\r\n <textarea class=\"form-control bnsights-control\" dir=\"rtl\" [rows]=\"options.rows\" [cols]=\"options.cols\" (focus)=\"onArabicFocus(true)\"\r\n (focusout)=\"onArabicFocus(false)\" [hidden]=\"options.isHideArabicFields\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"Arabic\" [maxlength]=\"options.maxLength\" [minlength]=\"options.minLength\"\r\n [class.is-invalid]=\"arabicTextAreaFormControl.invalid && arabicTextAreaFormControl.touched\" placeholder=\"{{options.arabicPlaceholder}}\"\r\n (change)=\"trimControlValue('Ar')\" (keyup)=\"onTextChange()\" [(ngModel)]=\"options.value.arabic\"\r\n (keydown)=\"arabicWordCountArray>options.maxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userInputTextAreaArabic></textarea>\r\n <!--CopyToClipboard-->\r\n <div class=\"copy-clipboard\" [hidden]=\"options.isHideArabicFields\" *ngIf=\"options.enableCopyToClipboard\"\r\n (click)=\"copyInputMessage(userInputTextAreaArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </div>\r\n </div>\r\n <div *ngIf=\"options.isReadonly\"><span class=\"readonly-view\" [innerHTML]=\"options.value.arabic\"></span>\r\n\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!--wordCount-->\r\n <div class=\"bbsf-word-count\" *ngIf=\"options.maxWordCount>0&&isShowArabicWordCount\">\r\n {{arabicWordCount}}/{{options.maxWordCount}} Words</div>\r\n <!-- CharsLimitMsg-->\r\n <div class=\"bbsf-character-count\" *ngIf=\"showArabicCharsLimitMsg\"\r\n [ngClass]=\"{'badge-light-warning': arabicCharsLimitMsgClass === 'warning', 'badge-light-danger' : arabicCharsLimitMsgClass === 'danger' }\">\r\n {{arabicMaxLimitWarningMsg}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\"\r\n *ngIf=\"(options.labelDescription!=null&&options.labelDescription!='')||(options.arabicLabelDescription!=null&&options.arabicLabelDescription!='')\">\r\n {{(options.arabicLabelDescription!=null&&options.arabicLabelDescription!=\"\")?options.arabicLabelDescription:options.labelDescription}}\r\n </div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(arabicTextAreaFormControl.invalid && arabicTextAreaFormControl.touched)\">\r\n {{getErrorValidation(arabicTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: InlineSVGModule }] }); }
423
- }
424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLingualTextAreaComponent, decorators: [{
425
- type: Component,
426
- args: [{ selector: 'BBSF-MultiLingualTextArea', standalone: true, imports: [
427
- CommonModule,
428
- FormsModule,
429
- ReactiveFormsModule,
430
- InlineSVGModule
431
- ], template: "<div [formGroup]=\"group\">\r\n <div class=\"bbsf-control bbsf-multilang-textarea form-group mb-0\" [formGroup]=\"multiLanguageTextAreagroup\">\r\n <div class=\"row\">\r\n <!--#region English textarea-->\r\n <div [ngClass]=\"(options.multiControlPlacementType==1)?'col-md-12':'col-md-6'\" *ngIf=\"showEngishTextArea\" class=\"bbsf-multilang-form-group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label class=\"bbsf-label {{options.labelExtraClasses}}\" [hidden]=\"options.isHideEnglishLabel\">\r\n {{(options.englishLabelValue!=null&&options.englishLabelValue!=\"\")?options.englishLabelValue:options.labelValue+\"InEnglish\"}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"(((options.showAsterisk&&options.isRequired)||(options.isRequired))&&IsShowAsteriskInEnglish)&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.isReadonly\" [ngClass]=\"options.enableCopyToClipboard? 'p-40px' : '' \">\r\n <!--input-->\r\n <textarea class=\"form-control\" dir=\"ltr\" rows=\"{{options.rows}}\" cols=\"{{options.cols}}\" (focus)=\"onEnglishFocus(true)\"\r\n (focusout)=\"onEnglishFocus(false)\" maxlength=\"{{options.maxLength}}\" minlength=\"{{options.minLength}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"English\" [hidden]=\"options.isHideEnglishFields\"\r\n [class.is-invalid]=\"englishTextAreaFormControl.invalid && englishTextAreaFormControl.touched\"\r\n placeholder=\"{{options.englishPlaceholder}}\" (change)=\"trimControlValue('En')\" (keyup)=\"onTextChange()\"\r\n [(ngModel)]=\"options.value.english\"\r\n (keydown)=\"englishWordCountArray>options.maxWordCount&&$event.keyCode !=8?$event.preventDefault():null\" #userinputTextAreaEnglish>\r\n </textarea>\r\n <!--CopyToClipboard-->\r\n <div class=\"copy-clipboard\" [hidden]=\"options.isHideEnglishFields\" *ngIf=\"options.enableCopyToClipboard\"\r\n (click)=\"copyInputMessage(userinputTextAreaEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"options.isReadonly\"><span class=\"readonly-view\" [innerHTML]=\"options.value.english\"></span>\r\n\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!--wordCount-->\r\n <div class=\"bbsf-word-count\" *ngIf=\"options.maxWordCount>0&&isShowEnglishWordCount\">\r\n {{englishWordCount}}/{{options.maxWordCount}} Words</div>\r\n <!-- CharsLimitMsg-->\r\n <div class=\"bbsf-character-count\" *ngIf=\"showEnglishCharsLimitMsg\"\r\n [ngClass]=\"{'badge-light-warning': englishCharsLimitMsgClass === 'warning', 'badge-light-danger' : englishCharsLimitMsgClass === 'danger' }\">\r\n {{englishMaxLimitWarningMsg}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\"\r\n *ngIf=\"(options.labelDescription!=null&&options.labelDescription!='') ||(options.englishLabelDescription!=null&&options.englishLabelDescription!='')\">\r\n {{(options.englishLabelDescription!=null&&options.englishLabelDescription!=\"\")?options.englishLabelDescription:options.labelDescription}}\r\n </div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(englishTextAreaFormControl.invalid && englishTextAreaFormControl.touched)\">\r\n {{getErrorValidation(englishTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!--#region Arabic textbox-->\r\n <div [ngClass]=\"(options.multiControlPlacementType==1)?'col-md-12':'col-md-6'\" *ngIf=\"showArabicTextArea\" class=\"bbsf-multilang-form-group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label class=\"bbsf-label {{options.labelExtraClasses}}\" [hidden]=\"options.isHideArabicLabel\">\r\n {{(options.arabicLabelValue!=null&&options.arabicLabelValue!=\"\")?options.arabicLabelValue:options.labelValue+\"inArabic\"}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"(((options.showAsterisk&&options.isRequired)||(options.isRequired))&&IsShowAsteriskInArabic)&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <div *ngIf=\"!options.isReadonly\" class=\"bbsf-input-container\" [ngClass]=\"options.enableCopyToClipboard? 'p-40px' : '' \">\r\n <!--input-->\r\n <textarea class=\"form-control bnsights-control\" dir=\"rtl\" [rows]=\"options.rows\" [cols]=\"options.cols\" (focus)=\"onArabicFocus(true)\"\r\n (focusout)=\"onArabicFocus(false)\" [hidden]=\"options.isHideArabicFields\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"Arabic\" [maxlength]=\"options.maxLength\" [minlength]=\"options.minLength\"\r\n [class.is-invalid]=\"arabicTextAreaFormControl.invalid && arabicTextAreaFormControl.touched\" placeholder=\"{{options.arabicPlaceholder}}\"\r\n (change)=\"trimControlValue('Ar')\" (keyup)=\"onTextChange()\" [(ngModel)]=\"options.value.arabic\"\r\n (keydown)=\"arabicWordCountArray>options.maxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userInputTextAreaArabic></textarea>\r\n <!--CopyToClipboard-->\r\n <div class=\"copy-clipboard\" [hidden]=\"options.isHideArabicFields\" *ngIf=\"options.enableCopyToClipboard\"\r\n (click)=\"copyInputMessage(userInputTextAreaArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </div>\r\n </div>\r\n <div *ngIf=\"options.isReadonly\"><span class=\"readonly-view\" [innerHTML]=\"options.value.arabic\"></span>\r\n\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!--wordCount-->\r\n <div class=\"bbsf-word-count\" *ngIf=\"options.maxWordCount>0&&isShowArabicWordCount\">\r\n {{arabicWordCount}}/{{options.maxWordCount}} Words</div>\r\n <!-- CharsLimitMsg-->\r\n <div class=\"bbsf-character-count\" *ngIf=\"showArabicCharsLimitMsg\"\r\n [ngClass]=\"{'badge-light-warning': arabicCharsLimitMsgClass === 'warning', 'badge-light-danger' : arabicCharsLimitMsgClass === 'danger' }\">\r\n {{arabicMaxLimitWarningMsg}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\"\r\n *ngIf=\"(options.labelDescription!=null&&options.labelDescription!='')||(options.arabicLabelDescription!=null&&options.arabicLabelDescription!='')\">\r\n {{(options.arabicLabelDescription!=null&&options.arabicLabelDescription!=\"\")?options.arabicLabelDescription:options.labelDescription}}\r\n </div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(arabicTextAreaFormControl.invalid && arabicTextAreaFormControl.touched)\">\r\n {{getErrorValidation(arabicTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n </div>\r\n </div>\r\n</div>\r\n" }]
432
- }], ctorParameters: () => [{ type: i1.FormGroupDirective }, { type: i1.ControlContainer, decorators: [{
433
- type: Optional
434
- }] }, { type: i2.ControlUtility }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }], propDecorators: { group: [{
435
- type: Input
436
- }], options: [{
437
- type: Input
438
- }], onChange: [{
439
- type: Output
440
- }] } });
441
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlMaW5ndWFsVGV4dEFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL011bHRpTGluZ3VhbFRleHRBcmVhL011bHRpTGluZ3VhbFRleHRBcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NdWx0aUxpbmd1YWxUZXh0QXJlYS9NdWx0aUxpbmd1YWxUZXh0QXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVyxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUF5RCxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3SixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSS9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFjbEQsTUFBTSxPQUFPLDZCQUE2QjthQUVqQywyQkFBc0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQUdyQyxZQUFtQixtQ0FBdUQsRUFBc0IsZ0JBQWtDLEVBQ3hILGNBQThCLEVBQVUsY0FBOEIsRUFBVSx3QkFBa0QsRUFDbEks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aEI7OzBCQU80RSxRQUFRO3VLQU01RSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIERvQ2hlY2ssIE9wdGlvbmFsLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cERpcmVjdGl2ZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IElucHV0VHlwZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9FbnVtcy9JbnB1dFR5cGUnO1xyXG5pbXBvcnQgeyBFbmdsaXNoQXJhYmljRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9FbmdsaXNoQXJhYmljRFRPJztcclxuaW1wb3J0IHsgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnMnO1xyXG5pbXBvcnQgeyBDb250cm9sVXRpbGl0eSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9Db250cm9sVXRpbGl0eSc7XHJcbmltcG9ydCB7IExhbmd1YWdlTW9kZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9FbnVtcy9MYW5ndWFnZU1vZGUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzL3VpJztcclxuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvR2xvYmFsU2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29udHJvbExheW91dCB9IGZyb20gJy4uLy4uL1NoYXJlZC9FbnVtcy9Db250cm9sTGF5b3V0JztcclxuaW1wb3J0IHsgSW5saW5lU1ZHTW9kdWxlIH0gZnJvbSAnbmctaW5saW5lLXN2Zy0yJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9NdWx0aUxpbmd1YWxUZXh0QXJlYS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBJbmxpbmVTVkdNb2R1bGVcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aUxpbmd1YWxUZXh0QXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyc3RhdGljID0gbnVsbDtcclxuICBJc1Nob3dBc3Rlcmlza0luQXJhYmljOiBib29sZWFuO1xyXG4gIElzU2hvd0FzdGVyaXNrSW5FbmdsaXNoOiBib29sZWFuO1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtdWx0aUxpbmd1YWxUZXh0QXJlYUZvcm1Db250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLCBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSwgcHJpdmF0ZSB1dGlsaXR5U2VydmljZTogVXRpbGl0eVNlcnZpY2UsIHByaXZhdGUgY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlOiBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdsb2JhbFNldHRpbmdzOiBHbG9iYWxTZXR0aW5nc1xyXG4gICkge1xyXG4gICAgTXVsdGlMaW5ndWFsVGV4dEFyZWFDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICB9XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnM7XHJcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBhcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBtdWx0aVRleHRBcmVhRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBtdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cDogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgYXJhYmljV29yZENvdW50OiBudW1iZXIgPSAwO1xyXG4gIGFyYWJpY1dvcmRDb3VudEFycmF5OiBudW1iZXIgPSAwO1xyXG4gIGVuZ2xpc2hXb3JkQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgZW5nbGlzaFdvcmRDb3VudEFycmF5OiBudW1iZXIgPSAwO1xyXG4gIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nID0gXCJcIjtcclxuICBzaG93QXJhYmljVGV4dEFyZWE6IGJvb2xlYW47XHJcbiAgc2hvd0VuZ2lzaFRleHRBcmVhOiBib29sZWFuO1xyXG4gIGFyYWJpY1ZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIGFyYWJpY1ZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgZW5nbGlzaFZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIGVuZ2xpc2hWYWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgaXNTaG93QXJhYmljV29yZENvdW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNTaG93RW5nbGlzaFdvcmRDb3VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIGFyYWJpY0xldHRlck9ubHk6IHN0cmluZyA9IFwiXCI7XHJcbiAgZW5nbGlzaExldHRlck9ubHk6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8vRm9yIFNob3cgd2FybmluZyBtZXNzYWdlIG9mIG1heCBsZW5ndGggbGltaXRcclxuICBtaW5DaGFyc0xpbWl0OiBudW1iZXIgPSAtMTsgLy9UbyBkaXNhYmxlIGNoYXJzIGxpbWl0IGZlYXR1cmUgYnkgZGVmYXVsdFxyXG4gIGVuZ2xpc2hDdXJyZW50Q2hhcnNDb3VudDogbnVtYmVyID0gMDtcclxuICBhcmFiaWNDdXJyZW50Q2hhcnNDb3VudDogbnVtYmVyID0gMDtcclxuICBzaG93RW5nbGlzaENoYXJzTGltaXRNc2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93QXJhYmljQ2hhcnNMaW1pdE1zZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhhc0VuZ2xpc2hDaGFyc0xpbWl0VmFsaWRhdGlvbkVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGFzQXJhYmljQ2hhcnNMaW1pdFZhbGlkYXRpb25FcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVuZ2xpc2hDaGFyc0xpbWl0TXNnQ2xhc3M6IHN0cmluZztcclxuICBhcmFiaWNDaGFyc0xpbWl0TXNnQ2xhc3M6IHN0cmluZztcclxuICBlbmdsaXNoTWF4TGltaXRXYXJuaW5nTXNnOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGFyYWJpY01heExpbWl0V2FybmluZ01zZzogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgZ2V0Q3VzdG9tRXJyb3JzTWFzc2FnZXMoKSB7XHJcbiAgICB0aGlzLmFyYWJpY0xldHRlck9ubHkgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJWQUxfQXJhYmljSXNSZXF1aXJlZEFuZE9ubHk1MENoYXJhY3RlcnNFbmdsaXNoXCIpO1xyXG4gICAgdGhpcy5lbmdsaXNoTGV0dGVyT25seSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkVuZ2xpc2hMZXR0ZXJPbmx5XCIpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2U7XHJcbiAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZSA9IGF3YWl0IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCk7XHJcbiAgICAvLyBVdGlsaXR5U2VydmljZS5UcmFuc2xhdG9yLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50OiBMYW5nQ2hhbmdlRXZlbnQpID0+IHtcclxuICAgIC8vICAgdGhpcy5DdXJyZW50TGFuZ3VhZ2UgPSBldmVudC5sYW5nXHJcbiAgICAvLyAgIHRoaXMuc2hvd0lucHV0VXNpbmdMYW5ndWFnZU1vZGUoKTtcclxuXHJcbiAgICAvLyB9KTtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLnZpZXdUeXBlKVxyXG4gICAgICB0aGlzLm9wdGlvbnMudmlld1R5cGUgPSB0aGlzLmdsb2JhbFNldHRpbmdzLnZpZXdUeXBlO1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubGFuZ3VhZ2VNb2RlKVxyXG4gICAgICB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VNb2RlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5sYW5ndWFnZU1vZGU7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aUNvbnRyb2xQbGFjZW1lbnRUeXBlKVxyXG4gICAgICB0aGlzLm9wdGlvbnMubXVsdGlDb250cm9sUGxhY2VtZW50VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3MubXVsdGlDb250cm9sUGxhY2VtZW50VHlwZTtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLm1heExlbmd0aClcclxuICAgICAgdGhpcy5vcHRpb25zLm1heExlbmd0aCA9IHRoaXMuZ2xvYmFsU2V0dGluZ3MubWF4TGVuZ3RoVGV4dEFyZWE7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSBcIlwiKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcmFiaWNMYWJlbFZhbHVlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKHRoaXMub3B0aW9ucy5sYWJlbEtleSkgKyBcIiBcIiArIHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkluQXJhYmljXCIpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZW5nbGlzaExhYmVsVmFsdWUgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUodGhpcy5vcHRpb25zLmxhYmVsS2V5KSArIFwiIFwiICsgdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSW5FbmdsaXNoXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXJhYmljTGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuYXJhYmljTGFiZWxLZXkgIT0gXCJcIilcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXJhYmljTGFiZWxWYWx1ZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMuYXJhYmljTGFiZWxLZXkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmdsaXNoTGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuZW5nbGlzaExhYmVsS2V5ICE9IFwiXCIpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmVuZ2xpc2hMYWJlbFZhbHVlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKHRoaXMub3B0aW9ucy5lbmdsaXNoTGFiZWxLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIHRoaXMubXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuYWRkQ29udHJvbChcIkFyYWJpY1wiLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMubXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuYWRkQ29udHJvbChcIkVuZ2xpc2hcIiwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wgPSB0aGlzLm11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljXCJdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sID0gdGhpcy5tdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5jb250cm9sc1tcIkVuZ2xpc2hcIl07IC8vICBuZXcgRm9ybUNvbnRyb2woJycsdmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMubmFtZSwgbmV3IEZvcm1Hcm91cCh0aGlzLm11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzKSk7XHJcbiAgICB0aGlzLmdldEN1c3RvbUVycm9yc01hc3NhZ2VzKCk7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudHlwZSkge1xyXG4gICAgICBjYXNlIElucHV0VHlwZS5FbWFpbDpcclxuICAgICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLmNvbXBvc2UoW1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXR0ZXJuVmFsaWRhdG9yKC9eW2EtejAtOS5fJSstXStAW2EtejAtOS4tXStcXC5bYS16XXsyLDR9JC8sIHsgRW1haWxWYWxpZGF0aW9uS2V5OiBcIlwiIH0pLFxyXG5cclxuICAgICAgICBdKSk7XHJcbiAgICAgICAgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLmNvbXBvc2UoW1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXR0ZXJuVmFsaWRhdG9yKC9eW2EtejAtOS5fJSstXStAW2EtejAtOS4tXStcXC5bYS16XXsyLDR9JC8sIHsgRW1haWxWYWxpZGF0aW9uS2V5OiBcIlwiIH0pLFxyXG5cclxuICAgICAgICBdKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIElucHV0VHlwZS5OdW1iZXI6XHJcbiAgICAgICAgdGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKCdeWzAtOV0rKFxcLj9bMC05XSspPyQnKSk7XHJcbiAgICAgICAgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSsoXFwuP1swLTldKyk/JCcpKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0aW9uLmZ1bmN0aW9uQm9keSk7XHJcbiAgICAgICAgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0aW9uLmZ1bmN0aW9uQm9keSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5taW5MZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuYXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5vcHRpb25zLm1pbkxlbmd0aCkpO1xyXG4gICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm9wdGlvbnMubWluTGVuZ3RoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1heExlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5vcHRpb25zLm1heExlbmd0aCkpO1xyXG4gICAgICB0aGlzLmFyYWJpY1ZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMub3B0aW9ucy5tYXhMZW5ndGgpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLm1heExlbmd0aFdhcm5pbmdMaW1pdClcclxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4TGVuZ3RoV2FybmluZ0xpbWl0ID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5tYXhMZW5ndGhXYXJuaW5nTGltaXQ7XHJcblxyXG4gICAgICB0aGlzLm1pbkNoYXJzTGltaXQgPSB0aGlzLm9wdGlvbnMubWF4TGVuZ3RoIC0gdGhpcy5vcHRpb25zLm1heExlbmd0aFdhcm5pbmdMaW1pdDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNob3dJbnB1dFVzaW5nTGFuZ3VhZ2VNb2RlKCk7XHJcblxyXG4gICAgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLmNvbXBvc2UoW1xyXG4gICAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmFyYWJpY1ZhbGlkYXRvcih7IEFyYWJpY0lzUmVxdWlyZWRBbmRPbmx5NTBDaGFyYWN0ZXJzRW5nbGlzaDogdGhpcy5hcmFiaWNMZXR0ZXJPbmx5IH0pLFxyXG5cclxuICAgIF0pKTtcclxuICAgIHRoaXMuZW5nbGlzaFZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMuY29tcG9zZShbXHJcbiAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0dGVyblZhbGlkYXRvcigvXlt+YCFAIyQlXiYqKCnigJjigJnigJzigJ1fKz1bXFxdXFxcXHt9fDsnOlwiLC5cXC88Pj9hLXpBLVowLTktIFxcbl0qJC8sIHsgRW5nbGlzaExldHRlck9ubHk6IHRoaXMuZW5nbGlzaExldHRlck9ubHkgfSksXHJcblxyXG4gICAgXSkpO1xyXG5cclxuICAgIHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuYXJhYmljVmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXNhc3luYyk7XHJcbiAgICB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMuZW5nbGlzaFZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy52YWx1ZS5hcmFiaWMpO1xyXG4gICAgdGhpcy5lbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMudmFsdWUuZW5nbGlzaCk7XHJcblxyXG4gICAgdGhpcy5tdWx0aUxpbmd1YWxUZXh0QXJlYUZvcm1Db250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc1JlYWRvbmx5ICYmICF0aGlzLm9wdGlvbnMudmFsdWUpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLnZhbHVlLmFyYWJpYyA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTkEnKTtcclxuICAgICAgdGhpcy5vcHRpb25zLnZhbHVlLmVuZ2xpc2ggPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ05BJyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIG9uVGV4dENoYW5nZSgpIHtcclxuICAgIGxldCBhcmFiaWNWYWx1ZSA9IFwiXCI7XHJcbiAgICBsZXQgZW5nbGlzaFZhbHVlID0gXCJcIjtcclxuICAgIGlmICh0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlID09IFwiXCIpIHtcclxuICAgICAgdGhpcy5lbmdsaXNoV29yZENvdW50QXJyYXkgPSAwO1xyXG4gICAgICB0aGlzLmVuZ2xpc2hXb3JkQ291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlICE9IG51bGwgfHwgdGhpcy5lbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLmVuZ2xpc2hXb3JkQ291bnRBcnJheSA9IHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUuc3BsaXQoXCIgXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5lbmdsaXNoV29yZENvdW50QXJyYXkgPiAwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5lbmdsaXNoV29yZENvdW50QXJyYXkgPiB0aGlzLm9wdGlvbnMubWF4V29yZENvdW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5nbGlzaFdvcmRDb3VudCA9IHRoaXMub3B0aW9ucy5tYXhXb3JkQ291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuY29udHJvbHNbXCJFbmdsaXNoXCJdLnNldEVycm9ycyh7IE1heFdvcmRDb3VudFZhbGlkYXRpb25LZXk6IHRoaXMub3B0aW9ucy5tYXhXb3JkQ291bnQgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuY29udHJvbHNbXCJFbmdsaXNoXCJdLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5jb250cm9sc1tcIkVuZ2xpc2hcIl0uaW52YWxpZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2xpc2hXb3JkQ291bnQgPSB0aGlzLmVuZ2xpc2hXb3JkQ291bnRBcnJheTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVuZ2xpc2hWYWx1ZSA9IHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWU7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9DaGVjayBmb3IgbWF4bGVuZ3RoIGxpbWl0IGNvdW50XHJcbiAgICAgIC8vTWF4TGVuZ3RoIHNob3VsZCBiZSBncmV0YWVyIHRoYW4gb3IgZXF1YWxzIGNoYXJzIGxpbWl0IHNvIHRoYXQgbWluQ2hhcnNMaW1pdCB3b3VsZCBiZSA+PSAwXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4TGVuZ3RoICYmIHRoaXMubWluQ2hhcnNMaW1pdCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5lbmdsaXNoQ3VycmVudENoYXJzQ291bnQgPSB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5lbmdsaXNoQ3VycmVudENoYXJzQ291bnQgPiB0aGlzLm1pbkNoYXJzTGltaXQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0VuZ2xpc2hDaGFyc0xpbWl0TXNnID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaGFzRW5nbGlzaENoYXJzTGltaXRWYWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZW5nbGlzaEN1cnJlbnRDaGFyc0NvdW50ID09IHRoaXMub3B0aW9ucy5tYXhMZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuZW5nbGlzaENoYXJzTGltaXRNc2dDbGFzcyA9IFwiZGFuZ2VyXCI7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZW5nbGlzaENoYXJzTGltaXRNc2dDbGFzcyA9IFwid2FybmluZ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0VuZ2xpc2hDaGFyc0xpbWl0TXNnID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmhhc0VuZ2xpc2hDaGFyc0xpbWl0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBtYXg6IG51bWJlciA9IHRoaXMub3B0aW9ucy5tYXhMZW5ndGg7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bWJlciA9IHRoaXMuZW5nbGlzaEN1cnJlbnRDaGFyc0NvdW50O1xyXG4gICAgICAgIGxldCBtc2c6IHN0cmluZyA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIk1heExlbmd0aExpbWl0V2FybmluZ1wiKTtcclxuXHJcbiAgICAgICAgLy8gUmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCBhY3R1YWwgdmFsdWVzXHJcbiAgICAgICAgdGhpcy5lbmdsaXNoTWF4TGltaXRXYXJuaW5nTXNnID0gbXNnLnJlcGxhY2UoXCIke21heH1cIiwgbWF4LnRvU3RyaW5nKCkpLnJlcGxhY2UoXCIke2N1cnJlbnR9XCIsIGN1cnJlbnQudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUgPT0gXCJcIikge1xyXG4gICAgICB0aGlzLmFyYWJpY1dvcmRDb3VudEFycmF5ID0gMDtcclxuICAgICAgdGhpcy5hcmFiaWNXb3JkQ291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUgIT0gbnVsbCB8fCB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5hcmFiaWNXb3JkQ291bnRBcnJheSA9IHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS5zcGxpdChcIiBcIikubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0aGlzLmFyYWJpY1dvcmRDb3VudEFycmF5ID4gMCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXJhYmljV29yZENvdW50QXJyYXkgPiB0aGlzLm9wdGlvbnMubWF4V29yZENvdW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXJhYmljV29yZENvdW50ID0gdGhpcy5vcHRpb25zLm1heFdvcmRDb3VudDtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5jb250cm9sc1tcIkFyYWJpY1wiXS5zZXRFcnJvcnMoeyBNYXhXb3JkQ291bnRWYWxpZGF0aW9uS2V5OiB0aGlzLm9wdGlvbnMubWF4V29yZENvdW50IH0pO1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljXCJdLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5jb250cm9sc1tcIkFyYWJpY1wiXS5pbnZhbGlkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXJhYmljV29yZENvdW50ID0gdGhpcy5hcmFiaWNXb3JkQ291bnRBcnJheTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyYWJpY1ZhbHVlID0gdGhpcy5hcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9DaGVjayBmb3IgbWF4bGVuZ3RoIGxpbWl0IGNvdW50XHJcbiAgICAgIC8vTWF4TGVuZ3RoIHNob3VsZCBiZSBncmV0YWVyIHRoYW4gb3IgZXF1YWxzIGNoYXJzIGxpbWl0IHNvIHRoYXQgbWluQ2hhcnNMaW1pdCB3b3VsZCBiZSA+PSAwXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4TGVuZ3RoICYmIHRoaXMubWluQ2hhcnNMaW1pdCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5hcmFiaWNDdXJyZW50Q2hhcnNDb3VudCA9IHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuYXJhYmljQ3VycmVudENoYXJzQ291bnQgPiB0aGlzLm1pbkNoYXJzTGltaXQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0FyYWJpY0NoYXJzTGltaXRNc2cgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5oYXNBcmFiaWNDaGFyc0xpbWl0VmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLmFyYWJpY0N1cnJlbnRDaGFyc0NvdW50ID09IHRoaXMub3B0aW9ucy5tYXhMZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuYXJhYmljQ2hhcnNMaW1pdE1zZ0NsYXNzID0gXCJkYW5nZXJcIjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5hcmFiaWNDaGFyc0xpbWl0TXNnQ2xhc3MgPSBcIndhcm5pbmdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dBcmFiaWNDaGFyc0xpbWl0TXNnID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmhhc0FyYWJpY0NoYXJzTGltaXRWYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1heDogbnVtYmVyID0gdGhpcy5vcHRpb25zLm1heExlbmd0aDtcclxuICAgICAgICBsZXQgY3VycmVudDogbnVtYmVyID0gdGhpcy5hcmFiaWNDdXJyZW50Q2hhcnNDb3VudDtcclxuICAgICAgICBsZXQgbXNnOiBzdHJpbmcgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJNYXhMZW5ndGhMaW1pdFdhcm5pbmdcIik7XHJcblxyXG4gICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggYWN0dWFsIHZhbHVlc1xyXG4gICAgICAgIHRoaXMuYXJhYmljTWF4TGltaXRXYXJuaW5nTXNnID0gbXNnLnJlcGxhY2UoXCIke21heH1cIiwgbWF4LnRvU3RyaW5nKCkpLnJlcGxhY2UoXCIke2N1cnJlbnR9XCIsIGN1cnJlbnQudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBtdWx0aUxhbmdNb2RlbCA9IG5ldyBFbmdsaXNoQXJhYmljRFRPKCk7XHJcbiAgICBtdWx0aUxhbmdNb2RlbC5hcmFiaWMgPSBhcmFiaWNWYWx1ZTtcclxuICAgIG11bHRpTGFuZ01vZGVsLmVuZ2xpc2ggPSBlbmdsaXNoVmFsdWU7XHJcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobXVsdGlMYW5nTW9kZWwpO1xyXG5cclxuICAgIHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRWYWx1ZShtdWx0aUxhbmdNb2RlbC5hcmFiaWMpO1xyXG4gICAgdGhpcy5lbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRWYWx1ZShtdWx0aUxhbmdNb2RlbC5lbmdsaXNoKTtcclxuXHJcbiAgICAvLyB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMubmFtZSkuc2V0VmFsdWUobXVsaXRMYW5nTW9kZWwpO1xyXG4gICAgLy9Vc2UgdGhpcyBsaW5lIHRvIGVuYWJsZSB0d28gd2F5IGJpbmRpbmcuXHJcbiAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSBtdWx0aUxhbmdNb2RlbDtcclxuXHJcbiAgfVxyXG5cclxuICByZXNldEVycm9yID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UucmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9O1xyXG5cclxuXHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24oRXJyb3JMaXN0KSB7XHJcbiAgICBpZiAodGhpcy5tYXJrQWxsQXNUb3VjaGVkICYmIHRoaXMuZ3JvdXAuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnNob3dHbG9iYWxFcnJvcigpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoRXJyb3JMaXN0LCB0aGlzLmdyb3VwLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW5wdXRUeXBlKHR5cGU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIElucHV0VHlwZVt0eXBlXTtcclxuICB9XHJcblxyXG4gIHRyaW1Db250cm9sVmFsdWUodHlwZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3aGl0ZXNwYWNlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBpZiAodHlwZSA9PSBcIkVuXCIpIHtcclxuICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24gJiYgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCAmJiB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShvcmlnaW5hbFZhbHVlLCB0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiwgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUuc3RhcnRzV2l0aCh3aGl0ZXNwYWNlKSB8fCB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlLmVuZHNXaXRoKHdoaXRlc3BhY2UpKSB7XHJcbiAgICAgICAgdGhpcy5lbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC5wYXRjaFZhbHVlKG9yaWdpbmFsVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PSBcIkFyXCIpIHtcclxuICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMucGF0Y2hQYXRoICYmIHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWxpZCkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0Y2hDb250cm9sVmFsdWUob3JpZ2luYWxWYWx1ZSwgdGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24sIHRoaXMub3B0aW9ucy5wYXRjaFBhdGgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUuc3RhcnRzV2l0aCh3aGl0ZXNwYWNlKSB8fCB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUuZW5kc1dpdGgod2hpdGVzcGFjZSkpIHtcclxuICAgICAgICB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShvcmlnaW5hbFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNvcHlJbnB1dE1lc3NhZ2UoaW5wdXRFbGVtZW50KSB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkNvcHlJbnB1dE1lc3NhZ2UoaW5wdXRFbGVtZW50KTtcclxuICB9XHJcblxyXG5cclxuICBzaG93SW5wdXRVc2luZ0xhbmd1YWdlTW9kZSgpIHtcclxuXHJcbiAgICB0aGlzLmFyYWJpY1ZhbGlkYXRpb25SdWxlcyA9IHRoaXMuYXJhYmljVmFsaWRhdGlvblJ1bGVzLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgdGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzID0gdGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgIHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgIHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgdGhpcy5hcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxhbmd1YWdlTW9kZSkge1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5Cb3RoX0xhbmd1YWdlc19hcmVfdmlzaWJsZTpcclxuICAgICAgICB0aGlzLnNob3dBcmFiaWNUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93RW5naXNoVGV4dEFyZWEgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIHRoaXMuYXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICB0aGlzLklzU2hvd0FzdGVyaXNrSW5BcmFiaWMgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5Jc1Nob3dBc3Rlcmlza0luRW5nbGlzaCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5BcmFiaWNfTGFuZ3VhZ2Vfb25seV9pc192aXNpYmxlOlxyXG4gICAgICAgIHRoaXMuc2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMubXVsdGlDb250cm9sUGxhY2VtZW50VHlwZSA9IENvbnRyb2xMYXlvdXQuVmVydGljYWw7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5FbmdsaXNoX0xhbmd1YWdlX29ubHlfaXNfdmlzaWJsZTpcclxuICAgICAgICB0aGlzLnNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm11bHRpQ29udHJvbFBsYWNlbWVudFR5cGUgPSBDb250cm9sTGF5b3V0LlZlcnRpY2FsO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMYW5ndWFnZU1vZGUuQm90aF9MYW5ndWFnZXNfYXJlX3Zpc2libGVfYnV0X29ubHlfY3VycmVudF9sYW5ndWFnZV9pc19yZXF1aXJlZDpcclxuICAgICAgICB0aGlzLnNob3dBcmFiaWNUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93RW5naXNoVGV4dEFyZWEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5tdWx0aUNvbnRyb2xQbGFjZW1lbnRUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5tdWx0aUNvbnRyb2xQbGFjZW1lbnRUeXBlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50TGFuZ3VhZ2UgPT0gJ2FyJykge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pc1JlcXVpcmVkID09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5Jc1Nob3dBc3Rlcmlza0luQXJhYmljID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYW5ndWFnZSA9PSAnZW4nKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5Jc1Nob3dBc3Rlcmlza0luRW5nbGlzaCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMYW5ndWFnZU1vZGUuQm90aF9MYW5ndWFnZXNfYnV0X29ubHlfQXJhYmljX2lzX3JlcXVpcmVkOlxyXG4gICAgICAgIHRoaXMuc2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm11bHRpQ29udHJvbFBsYWNlbWVudFR5cGUgPSB0aGlzLmdsb2JhbFNldHRpbmdzLm11bHRpQ29udHJvbFBsYWNlbWVudFR5cGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmFyYWJpY1ZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgdGhpcy5Jc1Nob3dBc3Rlcmlza0luQXJhYmljID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5Cb3RoX0xhbmd1YWdlc19idXRfb25seV9FbmdsaXNoX2lzX3JlcXVpcmVkOlxyXG4gICAgICAgIHRoaXMuc2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm11bHRpQ29udHJvbFBsYWNlbWVudFR5cGUgPSB0aGlzLmdsb2JhbFNldHRpbmdzLm11bHRpQ29udHJvbFBsYWNlbWVudFR5cGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIHRoaXMuSXNTaG93QXN0ZXJpc2tJbkVuZ2xpc2ggPSB0cnVlO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTGFuZ3VhZ2VNb2RlLkN1cnJlbnRfTGFuZ3VhZ2Vfb25seV9pc192aXNpYmxlX2FuZF9yZXF1aXJlZDpcclxuICAgICAgICB0aGlzLm9wdGlvbnMubXVsdGlDb250cm9sUGxhY2VtZW50VHlwZSA9IENvbnRyb2xMYXlvdXQuVmVydGljYWw7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudExhbmd1YWdlID09ICdhcicpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuc2hvd0VuZ2lzaFRleHRBcmVhID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFyYWJpY1ZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLklzU2hvd0FzdGVyaXNrSW5BcmFiaWMgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudExhbmd1YWdlID09ICdlbicpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0FyYWJpY1RleHRBcmVhID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5Jc1Nob3dBc3Rlcmlza0luRW5nbGlzaCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLmFyYWJpY1ZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG5cclxuICBvbkFyYWJpY0ZvY3VzKGlzRm9jdXM6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNTaG93QXJhYmljV29yZENvdW50ID0gaXNGb2N1cztcclxuXHJcbiAgICAvL29uRm9jdXNcclxuICAgIGlmIChpc0ZvY3VzKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc0FyYWJpY0NoYXJzTGltaXRWYWxpZGF0aW9uRXJyb3IpIC8vY2hlY2sgaWYgdGhlcmUgd2FzIHByZXZpb3VzIHZhbGlkYXRpb24gZXJyb3JcclxuICAgICAgICB0aGlzLnNob3dBcmFiaWNDaGFyc0xpbWl0TXNnID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgLy9vbkZvY3VzT3V0XHJcbiAgICAgIHRoaXMuc2hvd0FyYWJpY0NoYXJzTGltaXRNc2cgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uRW5nbGlzaEZvY3VzKGlzRm9jdXM6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNTaG93RW5nbGlzaFdvcmRDb3VudCA9IGlzRm9jdXM7XHJcblxyXG4gICAgLy9vbkZvY3VzXHJcbiAgICBpZiAoaXNGb2N1cykge1xyXG4gICAgICBpZiAodGhpcy5oYXNFbmdsaXNoQ2hhcnNMaW1pdFZhbGlkYXRpb25FcnJvcikgLy9jaGVjayBpZiB0aGVyZSB3YXMgcHJldmlvdXMgdmFsaWRhdGlvbiBlcnJvclxyXG4gICAgICAgIHRoaXMuc2hvd0VuZ2xpc2hDaGFyc0xpbWl0TXNnID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgLy9vbkZvY3VzT3V0XHJcbiAgICAgIHRoaXMuc2hvd0VuZ2xpc2hDaGFyc0xpbWl0TXNnID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIFJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkucmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMuZW5nbGlzaFZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKTtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkucmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIEFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMuZW5nbGlzaFZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKTtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5hcmFiaWNWYWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5lbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKTtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkucmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbih0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMuYXJhYmljVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmFkZEN1c3RvbVZhbGlkYXRpb24odGhpcy5lbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5lbmdsaXNoVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKTtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkQ3VzdG9tVmFsaWRhdGlvbih0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMuYXJhYmljVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgSXNWYWxpZCA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuaXNWYWxpZCh0aGlzLmVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sKTtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuaXNWYWxpZCh0aGlzLmFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wpO1xyXG4gIH07XHJcblxyXG59XHJcblxyXG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICA8ZGl2IGNsYXNzPVwiYmJzZi1jb250cm9sIGJic2YtbXVsdGlsYW5nLXRleHRhcmVhIGZvcm0tZ3JvdXAgbWItMFwiIFtmb3JtR3JvdXBdPVwibXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPCEtLSNyZWdpb24gRW5nbGlzaCB0ZXh0YXJlYS0tPlxyXG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLm11bHRpQ29udHJvbFBsYWNlbWVudFR5cGU9PTEpPydjb2wtbWQtMTInOidjb2wtbWQtNidcIiAqbmdJZj1cInNob3dFbmdpc2hUZXh0QXJlYVwiIGNsYXNzPVwiYmJzZi1tdWx0aWxhbmctZm9ybS1ncm91cFwiPlxyXG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMudmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgICAgICAgPCEtLWxhYmVsLS0+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJiYnNmLWxhYmVsIHt7b3B0aW9ucy5sYWJlbEV4dHJhQ2xhc3Nlc319XCIgW2hpZGRlbl09XCJvcHRpb25zLmlzSGlkZUVuZ2xpc2hMYWJlbFwiPlxyXG4gICAgICAgICAgICB7eyhvcHRpb25zLmVuZ2xpc2hMYWJlbFZhbHVlIT1udWxsJiZvcHRpb25zLmVuZ2xpc2hMYWJlbFZhbHVlIT1cIlwiKT9vcHRpb25zLmVuZ2xpc2hMYWJlbFZhbHVlOm9wdGlvbnMubGFiZWxWYWx1ZStcIkluRW5nbGlzaFwifX1cclxuICAgICAgICAgICAgPCEtLUFzdGVyaXNrLS0+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiKCgob3B0aW9ucy5zaG93QXN0ZXJpc2smJm9wdGlvbnMuaXNSZXF1aXJlZCl8fChvcHRpb25zLmlzUmVxdWlyZWQpKSYmSXNTaG93QXN0ZXJpc2tJbkVuZ2xpc2gpJiYhb3B0aW9ucy5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIiBbbmdDbGFzc109XCJvcHRpb25zLmVuYWJsZUNvcHlUb0NsaXBib2FyZD8gJ3AtNDBweCcgOiAnJyBcIj5cclxuICAgICAgICAgICAgPCEtLWlucHV0LS0+XHJcbiAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRpcj1cImx0clwiIHJvd3M9XCJ7e29wdGlvbnMucm93c319XCIgY29scz1cInt7b3B0aW9ucy5jb2xzfX1cIiAoZm9jdXMpPVwib25FbmdsaXNoRm9jdXModHJ1ZSlcIlxyXG4gICAgICAgICAgICAgIChmb2N1c291dCk9XCJvbkVuZ2xpc2hGb2N1cyhmYWxzZSlcIiBtYXhsZW5ndGg9XCJ7e29wdGlvbnMubWF4TGVuZ3RofX1cIiBtaW5sZW5ndGg9XCJ7e29wdGlvbnMubWluTGVuZ3RofX1cIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIlxyXG4gICAgICAgICAgICAgIGFyaWEtaW52YWxpZD1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJFbmdsaXNoXCIgW2hpZGRlbl09XCJvcHRpb25zLmlzSGlkZUVuZ2xpc2hGaWVsZHNcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLmludmFsaWQgJiYgZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e29wdGlvbnMuZW5nbGlzaFBsYWNlaG9sZGVyfX1cIiAoY2hhbmdlKT1cInRyaW1Db250cm9sVmFsdWUoJ0VuJylcIiAoa2V5dXApPVwib25UZXh0Q2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwib3B0aW9ucy52YWx1ZS5lbmdsaXNoXCJcclxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJlbmdsaXNoV29yZENvdW50QXJyYXk+b3B0aW9ucy5tYXhXb3JkQ291bnQmJiRldmVudC5rZXlDb2RlICE9OD8kZXZlbnQucHJldmVudERlZmF1bHQoKTpudWxsXCIgI3VzZXJpbnB1dFRleHRBcmVhRW5nbGlzaD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwhLS1Db3B5VG9DbGlwYm9hcmQtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvcHktY2xpcGJvYXJkXCIgW2hpZGRlbl09XCJvcHRpb25zLmlzSGlkZUVuZ2xpc2hGaWVsZHNcIiAqbmdJZj1cIm9wdGlvbnMuZW5hYmxlQ29weVRvQ2xpcGJvYXJkXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29weUlucHV0TWVzc2FnZSh1c2VyaW5wdXRUZXh0QXJlYUVuZ2xpc2gpXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY29weVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5pc1JlYWRvbmx5XCI+PHNwYW4gY2xhc3M9XCJyZWFkb25seS12aWV3XCIgW2lubmVySFRNTF09XCJvcHRpb25zLnZhbHVlLmVuZ2xpc2hcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIj5cclxuICAgICAgICAgICAgPCEtLXdvcmRDb3VudC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi13b3JkLWNvdW50XCIgKm5nSWY9XCJvcHRpb25zLm1heFdvcmRDb3VudD4wJiZpc1Nob3dFbmdsaXNoV29yZENvdW50XCI+XHJcbiAgICAgICAgICAgICAge3tlbmdsaXNoV29yZENvdW50fX0ve3tvcHRpb25zLm1heFdvcmRDb3VudH19IFdvcmRzPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gQ2hhcnNMaW1pdE1zZy0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi1jaGFyYWN0ZXItY291bnRcIiAqbmdJZj1cInNob3dFbmdsaXNoQ2hhcnNMaW1pdE1zZ1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydiYWRnZS1saWdodC13YXJuaW5nJzogZW5nbGlzaENoYXJzTGltaXRNc2dDbGFzcyA9PT0gJ3dhcm5pbmcnLCAnYmFkZ2UtbGlnaHQtZGFuZ2VyJyA6IGVuZ2xpc2hDaGFyc0xpbWl0TXNnQ2xhc3MgPT09ICdkYW5nZXInIH1cIj5cclxuICAgICAgICAgICAgICB7e2VuZ2xpc2hNYXhMaW1pdFdhcm5pbmdNc2d9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBMYWJlbERlc2NyaXB0aW9uLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIob3B0aW9ucy5sYWJlbERlc2NyaXB0aW9uIT1udWxsJiZvcHRpb25zLmxhYmVsRGVzY3JpcHRpb24hPScnKSB8fChvcHRpb25zLmVuZ2xpc2hMYWJlbERlc2NyaXB0aW9uIT1udWxsJiZvcHRpb25zLmVuZ2xpc2hMYWJlbERlc2NyaXB0aW9uIT0nJylcIj5cclxuICAgICAgICAgICAgICB7eyhvcHRpb25zLmVuZ2xpc2hMYWJlbERlc2NyaXB0aW9uIT1udWxsJiZvcHRpb25zLmVuZ2xpc2hMYWJlbERlc2NyaXB0aW9uIT1cIlwiKT9vcHRpb25zLmVuZ2xpc2hMYWJlbERlc2NyaXB0aW9uOm9wdGlvbnMubGFiZWxEZXNjcmlwdGlvbn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIHJlcXVpcmVkVGV4dC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCIgKm5nSWY9XCIoZW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBlbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC50b3VjaGVkKVwiPlxyXG4gICAgICAgICAgICAgIHt7Z2V0RXJyb3JWYWxpZGF0aW9uKGVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLmVycm9yc3xrZXl2YWx1ZSl9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpIFwiPlxyXG4gICAgICAgICAgICAgIHt7cmVzZXRFcnJvcigpfX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgPCEtLSNyZWdpb24gQXJhYmljIHRleHRib3gtLT5cclxuICAgICAgPGRpdiBbbmdDbGFzc109XCIob3B0aW9ucy5tdWx0aUNvbnRyb2xQbGFjZW1lbnRUeXBlPT0xKT8nY29sLW1kLTEyJzonY29sLW1kLTYnXCIgKm5nSWY9XCJzaG93QXJhYmljVGV4dEFyZWFcIiBjbGFzcz1cImJic2YtbXVsdGlsYW5nLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLnZpZXdUeXBlPT0xKT8nYmJzZi12ZXJ0aWNhbCc6J2Jic2YtaG9yaXpvbnRhbCdcIj5cclxuICAgICAgICAgIDwhLS1sYWJlbC0tPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmJzZi1sYWJlbCB7e29wdGlvbnMubGFiZWxFeHRyYUNsYXNzZXN9fVwiIFtoaWRkZW5dPVwib3B0aW9ucy5pc0hpZGVBcmFiaWNMYWJlbFwiPlxyXG4gICAgICAgICAgICB7eyhvcHRpb25zLmFyYWJpY0xhYmVsVmFsdWUhPW51bGwmJm9wdGlvbnMuYXJhYmljTGFiZWxWYWx1ZSE9XCJcIik/b3B0aW9ucy5hcmFiaWNMYWJlbFZhbHVlOm9wdGlvbnMubGFiZWxWYWx1ZStcImluQXJhYmljXCJ9fVxyXG4gICAgICAgICAgICA8IS0tQXN0ZXJpc2stLT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIoKChvcHRpb25zLnNob3dBc3RlcmlzayYmb3B0aW9ucy5pc1JlcXVpcmVkKXx8KG9wdGlvbnMuaXNSZXF1aXJlZCkpJiZJc1Nob3dBc3Rlcmlza0luQXJhYmljKSYmIW9wdGlvbnMuaXNSZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyXCIgW25nQ2xhc3NdPVwib3B0aW9ucy5lbmFibGVDb3B5VG9DbGlwYm9hcmQ/ICdwLTQwcHgnIDogJycgXCI+XHJcbiAgICAgICAgICAgIDwhLS1pbnB1dC0tPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYm5zaWdodHMtY29udHJvbFwiIGRpcj1cInJ0bFwiIFtyb3dzXT1cIm9wdGlvbnMucm93c1wiIFtjb2xzXT1cIm9wdGlvbnMuY29sc1wiIChmb2N1cyk9XCJvbkFyYWJpY0ZvY3VzKHRydWUpXCJcclxuICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25BcmFiaWNGb2N1cyhmYWxzZSlcIiBbaGlkZGVuXT1cIm9wdGlvbnMuaXNIaWRlQXJhYmljRmllbGRzXCIgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCIgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiQXJhYmljXCIgW21heGxlbmd0aF09XCJvcHRpb25zLm1heExlbmd0aFwiIFttaW5sZW5ndGhdPVwib3B0aW9ucy5taW5MZW5ndGhcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBhcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnRvdWNoZWRcIiBwbGFjZWhvbGRlcj1cInt7b3B0aW9ucy5hcmFiaWNQbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRyaW1Db250cm9sVmFsdWUoJ0FyJylcIiAoa2V5dXApPVwib25UZXh0Q2hhbmdlKClcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnMudmFsdWUuYXJhYmljXCJcclxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJhcmFiaWNXb3JkQ291bnRBcnJheT5vcHRpb25zLm1heFdvcmRDb3VudCYmJGV2ZW50LmtleUNvZGUgIT04PyRldmVudC5wcmV2ZW50RGVmYXVsdCgpOm51bGxcIlxyXG4gICAgICAgICAgICAgICN1c2VySW5wdXRUZXh0QXJlYUFyYWJpYz48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8IS0tQ29weVRvQ2xpcGJvYXJkLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3B5LWNsaXBib2FyZFwiIFtoaWRkZW5dPVwib3B0aW9ucy5pc0hpZGVBcmFiaWNGaWVsZHNcIiAqbmdJZj1cIm9wdGlvbnMuZW5hYmxlQ29weVRvQ2xpcGJvYXJkXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29weUlucHV0TWVzc2FnZSh1c2VySW5wdXRUZXh0QXJlYUFyYWJpYylcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jb3B5XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm9wdGlvbnMuaXNSZWFkb25seVwiPjxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmlld1wiIFtpbm5lckhUTUxdPVwib3B0aW9ucy52YWx1ZS5hcmFiaWNcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIj5cclxuICAgICAgICAgICAgPCEtLXdvcmRDb3VudC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi13b3JkLWNvdW50XCIgKm5nSWY9XCJvcHRpb25zLm1heFdvcmRDb3VudD4wJiZpc1Nob3dBcmFiaWNXb3JkQ291bnRcIj5cclxuICAgICAgICAgICAgICB7e2FyYWJpY1dvcmRDb3VudH19L3t7b3B0aW9ucy5tYXhXb3JkQ291bnR9fSBXb3JkczwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIENoYXJzTGltaXRNc2ctLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtY2hhcmFjdGVyLWNvdW50XCIgKm5nSWY9XCJzaG93QXJhYmljQ2hhcnNMaW1pdE1zZ1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydiYWRnZS1saWdodC13YXJuaW5nJzogYXJhYmljQ2hhcnNMaW1pdE1zZ0NsYXNzID09PSAnd2FybmluZycsICdiYWRnZS1saWdodC1kYW5nZXInIDogYXJhYmljQ2hhcnNMaW1pdE1zZ0NsYXNzID09PSAnZGFuZ2VyJyB9XCI+XHJcbiAgICAgICAgICAgICAge3thcmFiaWNNYXhMaW1pdFdhcm5pbmdNc2d9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBMYWJlbERlc2NyaXB0aW9uLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIob3B0aW9ucy5sYWJlbERlc2NyaXB0aW9uIT1udWxsJiZvcHRpb25zLmxhYmVsRGVzY3JpcHRpb24hPScnKXx8KG9wdGlvbnMuYXJhYmljTGFiZWxEZXNjcmlwdGlvbiE9bnVsbCYmb3B0aW9ucy5hcmFiaWNMYWJlbERlc2NyaXB0aW9uIT0nJylcIj5cclxuICAgICAgICAgICAgICB7eyhvcHRpb25zLmFyYWJpY0xhYmVsRGVzY3JpcHRpb24hPW51bGwmJm9wdGlvbnMuYXJhYmljTGFiZWxEZXNjcmlwdGlvbiE9XCJcIik/b3B0aW9ucy5hcmFiaWNMYWJlbERlc2NyaXB0aW9uOm9wdGlvbnMubGFiZWxEZXNjcmlwdGlvbn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIHJlcXVpcmVkVGV4dC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCIgKm5nSWY9XCIoYXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5pbnZhbGlkICYmIGFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAgICAgICAgICB7e2dldEVycm9yVmFsaWRhdGlvbihhcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLmVycm9yc3xrZXl2YWx1ZSl9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpIFwiPlxyXG4gICAgICAgICAgICAgIHt7cmVzZXRFcnJvcigpfX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19