@bnsights/bbsf-controls 1.0.107 → 1.0.110

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 (297) hide show
  1. package/README.md +15 -0
  2. package/esm2022/bnsights-bbsf-controls.mjs +5 -0
  3. package/esm2022/lib/Shared/Components/app-base-component.mjs +226 -0
  4. package/esm2022/lib/Shared/Components/ng-tag-input.mjs +331 -0
  5. package/esm2022/lib/Shared/Directives/template-name.directive.mjs +18 -0
  6. package/{esm2015/lib/Shared/Enums/CalendarView.js → esm2022/lib/Shared/Enums/CalendarView.mjs} +7 -7
  7. package/{esm2015/lib/Shared/Enums/ControlLayout.js → esm2022/lib/Shared/Enums/ControlLayout.mjs} +5 -5
  8. package/{esm2015/lib/Shared/Enums/Countries.js → esm2022/lib/Shared/Enums/Countries.mjs} +246 -246
  9. package/{esm2015/lib/Shared/Enums/Enums.js → esm2022/lib/Shared/Enums/Enums.mjs} +32 -32
  10. package/{esm2015/lib/Shared/Enums/FileType.js → esm2022/lib/Shared/Enums/FileType.mjs} +21 -21
  11. package/{esm2015/lib/Shared/Enums/FilterType.js → esm2022/lib/Shared/Enums/FilterType.mjs} +10 -10
  12. package/{esm2015/lib/Shared/Enums/FontSize.js → esm2022/lib/Shared/Enums/FontSize.mjs} +6 -6
  13. package/{esm2015/lib/Shared/Enums/ForceDirection.js → esm2022/lib/Shared/Enums/ForceDirection.mjs} +5 -5
  14. package/{esm2015/lib/Shared/Enums/IconPosition.js → esm2022/lib/Shared/Enums/IconPosition.mjs} +5 -5
  15. package/{esm2015/lib/Shared/Enums/ImageType.js → esm2022/lib/Shared/Enums/ImageType.mjs} +9 -9
  16. package/{esm2015/lib/Shared/Enums/InputType.js → esm2022/lib/Shared/Enums/InputType.mjs} +9 -9
  17. package/{esm2015/lib/Shared/Enums/Insert.js → esm2022/lib/Shared/Enums/Insert.mjs} +8 -8
  18. package/{esm2015/lib/Shared/Enums/LanguageMode.js → esm2022/lib/Shared/Enums/LanguageMode.mjs} +10 -10
  19. package/{esm2015/lib/Shared/Enums/LanguageValidation.js → esm2022/lib/Shared/Enums/LanguageValidation.mjs} +5 -5
  20. package/{esm2015/lib/Shared/Enums/Misc.js → esm2022/lib/Shared/Enums/Misc.mjs} +6 -6
  21. package/{esm2015/lib/Shared/Enums/PagingActionMode.js → esm2022/lib/Shared/Enums/PagingActionMode.mjs} +5 -5
  22. package/{esm2015/lib/Shared/Enums/Para.js → esm2022/lib/Shared/Enums/Para.mjs} +8 -8
  23. package/{esm2015/lib/Shared/Enums/PickerType.js → esm2022/lib/Shared/Enums/PickerType.mjs} +6 -6
  24. package/{esm2015/lib/Shared/Enums/SelectMode.js → esm2022/lib/Shared/Enums/SelectMode.mjs} +5 -5
  25. package/{esm2015/lib/Shared/Enums/StartView.js → esm2022/lib/Shared/Enums/StartView.mjs} +6 -6
  26. package/{esm2015/lib/Shared/Enums/Style.js → esm2022/lib/Shared/Enums/Style.mjs} +7 -7
  27. package/{esm2015/lib/Shared/Enums/StyleConfirmationMode.js → esm2022/lib/Shared/Enums/StyleConfirmationMode.mjs} +6 -6
  28. package/{esm2015/lib/Shared/Enums/TagInputView.js → esm2022/lib/Shared/Enums/TagInputView.mjs} +6 -6
  29. package/{esm2015/lib/Shared/Enums/menu-list-enum.js → esm2022/lib/Shared/Enums/menu-list-enum.mjs} +5 -5
  30. package/{esm2015/lib/Shared/Models/Attribute.js → esm2022/lib/Shared/Models/Attribute.mjs} +2 -2
  31. package/{esm2015/lib/Shared/Models/AutocompleteDTO.js → esm2022/lib/Shared/Models/AutocompleteDTO.mjs} +7 -7
  32. package/{esm2015/lib/Shared/Models/AutocompleteOptions.js → esm2022/lib/Shared/Models/AutocompleteOptions.mjs} +23 -23
  33. package/{esm2015/lib/Shared/Models/CalendarEventDTO.js → esm2022/lib/Shared/Models/CalendarEventDTO.mjs} +2 -2
  34. package/{esm2015/lib/Shared/Models/CalendarOptions.js → esm2022/lib/Shared/Models/CalendarOptions.mjs} +18 -18
  35. package/{esm2015/lib/Shared/Models/CancelDTO.js → esm2022/lib/Shared/Models/CancelDTO.mjs} +6 -6
  36. package/{esm2015/lib/Shared/Models/CaptchaStyle.js → esm2022/lib/Shared/Models/CaptchaStyle.mjs} +2 -2
  37. package/{esm2015/lib/Shared/Models/CheckBoxOptions.js → esm2022/lib/Shared/Models/CheckBoxOptions.mjs} +10 -10
  38. package/{esm2015/lib/Shared/Models/ConfirmationModalOptions.js → esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs} +38 -38
  39. package/{esm2015/lib/Shared/Models/ControlOptionsBase.js → esm2022/lib/Shared/Models/ControlOptionsBase.mjs} +12 -12
  40. package/{esm2015/lib/Shared/Models/CustomValidation.js → esm2022/lib/Shared/Models/CustomValidation.mjs} +13 -13
  41. package/{esm2015/lib/Shared/Models/DropdownListItem.js → esm2022/lib/Shared/Models/DropdownListItem.mjs} +3 -3
  42. package/{esm2015/lib/Shared/Models/DropdownOptions.js → esm2022/lib/Shared/Models/DropdownOptions.mjs} +15 -15
  43. package/{esm2015/lib/Shared/Models/EditPersonalImage.js → esm2022/lib/Shared/Models/EditPersonalImage.mjs} +6 -6
  44. package/{esm2015/lib/Shared/Models/EnglishArabicDTO.js → esm2022/lib/Shared/Models/EnglishArabicDTO.mjs} +10 -10
  45. package/{esm2015/lib/Shared/Models/FileDTO.js → esm2022/lib/Shared/Models/FileDTO.mjs} +1 -1
  46. package/{esm2015/lib/Shared/Models/FileUploadModel.js → esm2022/lib/Shared/Models/FileUploadModel.mjs} +2 -2
  47. package/{esm2015/lib/Shared/Models/FileUploadOptions.js → esm2022/lib/Shared/Models/FileUploadOptions.mjs} +10 -10
  48. package/{esm2015/lib/Shared/Models/FilterItem.js → esm2022/lib/Shared/Models/FilterItem.mjs} +7 -7
  49. package/{esm2015/lib/Shared/Models/FormOptions.js → esm2022/lib/Shared/Models/FormOptions.mjs} +27 -27
  50. package/{esm2015/lib/Shared/Models/HtmlEditorOptions.js → esm2022/lib/Shared/Models/HtmlEditorOptions.mjs} +11 -11
  51. package/{esm2015/lib/Shared/Models/ImageUploadOptions.js → esm2022/lib/Shared/Models/ImageUploadOptions.mjs} +13 -13
  52. package/{esm2015/lib/Shared/Models/MapAutoCompleteOptions.js → esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs} +3 -3
  53. package/{esm2015/lib/Shared/Models/MapAutocompleteDTO.js → esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs} +5 -5
  54. package/{esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js → esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs} +8 -8
  55. package/{esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js → esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs} +8 -8
  56. package/{esm2015/lib/Shared/Models/MultilingualControlOptionsBase.js → esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs} +15 -15
  57. package/{esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js → esm2022/lib/Shared/Models/MultilingualTextBoxOptions.mjs} +13 -13
  58. package/{esm2015/lib/Shared/Models/MultipleFileUploadModel.js → esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs} +8 -8
  59. package/{esm2015/lib/Shared/Models/PagingDTO.js → esm2022/lib/Shared/Models/PagingDTO.mjs} +12 -12
  60. package/{esm2015/lib/Shared/Models/PagingOptions.js → esm2022/lib/Shared/Models/PagingOptions.mjs} +46 -46
  61. package/{esm2015/lib/Shared/Models/PagingPayload.js → esm2022/lib/Shared/Models/PagingPayload.mjs} +2 -2
  62. package/{esm2015/lib/Shared/Models/PhoneOptions.js → esm2022/lib/Shared/Models/PhoneOptions.mjs} +12 -12
  63. package/{esm2015/lib/Shared/Models/ProfileImageUploadOptions.js → esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs} +10 -10
  64. package/{esm2015/lib/Shared/Models/ProfilePictureDTO.js → esm2022/lib/Shared/Models/ProfilePictureDTO.mjs} +2 -2
  65. package/{esm2015/lib/Shared/Models/RadioButtonItem.js → esm2022/lib/Shared/Models/RadioButtonItem.mjs} +2 -2
  66. package/{esm2015/lib/Shared/Models/RadioButtonOptions.js → esm2022/lib/Shared/Models/RadioButtonOptions.mjs} +3 -3
  67. package/{esm2015/lib/Shared/Models/RangeNumber.js → esm2022/lib/Shared/Models/RangeNumber.mjs} +2 -2
  68. package/{esm2015/lib/Shared/Models/Recaptcha.js → esm2022/lib/Shared/Models/Recaptcha.mjs} +5 -5
  69. package/{esm2015/lib/Shared/Models/RecaptchaOptions.js → esm2022/lib/Shared/Models/RecaptchaOptions.mjs} +21 -21
  70. package/{esm2015/lib/Shared/Models/RepeaterField.js → esm2022/lib/Shared/Models/RepeaterField.mjs} +2 -2
  71. package/{esm2015/lib/Shared/Models/RepeaterOptions.js → esm2022/lib/Shared/Models/RepeaterOptions.mjs} +12 -12
  72. package/{esm2015/lib/Shared/Models/SaveDTO.js → esm2022/lib/Shared/Models/SaveDTO.mjs} +6 -6
  73. package/{esm2015/lib/Shared/Models/TagsInputDTO.js → esm2022/lib/Shared/Models/TagsInputDTO.mjs} +2 -2
  74. package/{esm2015/lib/Shared/Models/TagsInputOptions.js → esm2022/lib/Shared/Models/TagsInputOptions.mjs} +40 -40
  75. package/{esm2015/lib/Shared/Models/TextAreaOptions.js → esm2022/lib/Shared/Models/TextAreaOptions.mjs} +3 -3
  76. package/{esm2015/lib/Shared/Models/TextBoxOptions.js → esm2022/lib/Shared/Models/TextBoxOptions.mjs} +22 -22
  77. package/{esm2015/lib/Shared/Models/ToggleslideOptions.js → esm2022/lib/Shared/Models/ToggleslideOptions.mjs} +8 -8
  78. package/{esm2015/lib/Shared/Models/UploadPersonalImage.js → esm2022/lib/Shared/Models/UploadPersonalImage.mjs} +6 -6
  79. package/{esm2015/lib/Shared/Models/bread-crumb.js → esm2022/lib/Shared/Models/bread-crumb.mjs} +7 -7
  80. package/{esm2015/lib/Shared/Models/control-filter-Item.js → esm2022/lib/Shared/Models/control-filter-Item.mjs} +5 -5
  81. package/{esm2015/lib/Shared/Models/datePickerOptions.js → esm2022/lib/Shared/Models/datePickerOptions.mjs} +22 -22
  82. package/{esm2015/lib/Shared/Models/filter-options.js → esm2022/lib/Shared/Models/filter-options.mjs} +8 -8
  83. package/{esm2015/lib/Shared/Models/page-header-options.js → esm2022/lib/Shared/Models/page-header-options.mjs} +77 -77
  84. package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +21 -0
  85. package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +21 -0
  86. package/{esm2015/lib/Shared/config/environment.js → esm2022/lib/Shared/config/environment.mjs} +11 -11
  87. package/esm2022/lib/Shared/default_intl.mjs +29 -0
  88. package/esm2022/lib/Shared/services/ControlUtility.mjs +162 -0
  89. package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +30 -0
  90. package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +24 -0
  91. package/esm2022/lib/Shared/services/render-component-service.service.mjs +30 -0
  92. package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +170 -0
  93. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +262 -0
  94. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +173 -0
  95. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +117 -0
  96. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +136 -0
  97. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +223 -0
  98. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +193 -0
  99. package/esm2022/lib/controls/FileUplaod/FileUplaod.component.mjs +447 -0
  100. package/esm2022/lib/controls/Form/Form.component.mjs +101 -0
  101. package/{esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js → esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs} +226 -226
  102. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +350 -0
  103. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +324 -0
  104. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +427 -0
  105. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +429 -0
  106. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +428 -0
  107. package/esm2022/lib/controls/Paging/JwPagination.component.mjs +156 -0
  108. package/esm2022/lib/controls/Paging/Paging.component.mjs +312 -0
  109. package/esm2022/lib/controls/Phone/Phone.component.mjs +129 -0
  110. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +376 -0
  111. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +109 -0
  112. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +135 -0
  113. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +125 -0
  114. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +750 -0
  115. package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +21 -0
  116. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +108 -0
  117. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +277 -0
  118. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +196 -0
  119. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +306 -0
  120. package/esm2022/lib/controls/Toggleslide/toggleslide.component.mjs +90 -0
  121. package/esm2022/lib/controls/bbsf-controls.module.mjs +350 -0
  122. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +37 -0
  123. package/{esm2015/public-api.js → esm2022/public-api.mjs} +130 -130
  124. package/{fesm2015/bnsights-bbsf-controls.js → fesm2022/bnsights-bbsf-controls.mjs} +8876 -8851
  125. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -0
  126. package/index.d.ts +5 -0
  127. package/lib/Shared/Components/app-base-component.d.ts +58 -51
  128. package/lib/Shared/Components/ng-tag-input.d.ts +50 -47
  129. package/lib/Shared/Directives/template-name.directive.d.ts +9 -6
  130. package/lib/Shared/Enums/CalendarView.d.ts +6 -6
  131. package/lib/Shared/Enums/ControlLayout.d.ts +4 -4
  132. package/lib/Shared/Enums/Countries.d.ts +245 -245
  133. package/lib/Shared/Enums/Enums.d.ts +30 -30
  134. package/lib/Shared/Enums/FileType.d.ts +20 -20
  135. package/lib/Shared/Enums/FilterType.d.ts +9 -9
  136. package/lib/Shared/Enums/FontSize.d.ts +5 -5
  137. package/lib/Shared/Enums/ForceDirection.d.ts +4 -4
  138. package/lib/Shared/Enums/IconPosition.d.ts +4 -4
  139. package/lib/Shared/Enums/ImageType.d.ts +8 -8
  140. package/lib/Shared/Enums/InputType.d.ts +8 -8
  141. package/lib/Shared/Enums/Insert.d.ts +7 -7
  142. package/lib/Shared/Enums/LanguageMode.d.ts +9 -9
  143. package/lib/Shared/Enums/LanguageValidation.d.ts +4 -4
  144. package/lib/Shared/Enums/Misc.d.ts +5 -5
  145. package/lib/Shared/Enums/PagingActionMode.d.ts +4 -4
  146. package/lib/Shared/Enums/Para.d.ts +7 -7
  147. package/lib/Shared/Enums/PickerType.d.ts +5 -5
  148. package/lib/Shared/Enums/SelectMode.d.ts +4 -4
  149. package/lib/Shared/Enums/StartView.d.ts +5 -5
  150. package/lib/Shared/Enums/Style.d.ts +6 -6
  151. package/lib/Shared/Enums/StyleConfirmationMode.d.ts +5 -5
  152. package/lib/Shared/Enums/TagInputView.d.ts +5 -5
  153. package/lib/Shared/Enums/menu-list-enum.d.ts +4 -4
  154. package/lib/Shared/Models/Attribute.d.ts +4 -4
  155. package/lib/Shared/Models/AutocompleteDTO.d.ts +5 -5
  156. package/lib/Shared/Models/AutocompleteOptions.d.ts +40 -40
  157. package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -8
  158. package/lib/Shared/Models/CalendarOptions.d.ts +23 -23
  159. package/lib/Shared/Models/CancelDTO.d.ts +5 -5
  160. package/lib/Shared/Models/CaptchaStyle.d.ts +7 -7
  161. package/lib/Shared/Models/CheckBoxOptions.d.ts +7 -7
  162. package/lib/Shared/Models/ConfirmationModalOptions.d.ts +21 -21
  163. package/lib/Shared/Models/ControlOptionsBase.d.ts +44 -44
  164. package/lib/Shared/Models/CustomValidation.d.ts +10 -10
  165. package/lib/Shared/Models/DropdownListItem.d.ts +4 -4
  166. package/lib/Shared/Models/DropdownOptions.d.ts +33 -33
  167. package/lib/Shared/Models/EditPersonalImage.d.ts +5 -5
  168. package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -4
  169. package/lib/Shared/Models/FileDTO.d.ts +19 -19
  170. package/lib/Shared/Models/FileUploadModel.d.ts +4 -4
  171. package/lib/Shared/Models/FileUploadOptions.d.ts +19 -19
  172. package/lib/Shared/Models/FilterItem.d.ts +13 -13
  173. package/lib/Shared/Models/FormOptions.d.ts +16 -16
  174. package/lib/Shared/Models/HtmlEditorOptions.d.ts +31 -31
  175. package/lib/Shared/Models/ImageUploadOptions.d.ts +23 -23
  176. package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +6 -6
  177. package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -7
  178. package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +22 -22
  179. package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +12 -12
  180. package/lib/Shared/Models/MultilingualControlOptionsBase.d.ts +77 -77
  181. package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +12 -12
  182. package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -7
  183. package/lib/Shared/Models/PagingDTO.d.ts +11 -11
  184. package/lib/Shared/Models/PagingOptions.d.ts +56 -56
  185. package/lib/Shared/Models/PagingPayload.d.ts +5 -5
  186. package/lib/Shared/Models/PhoneOptions.d.ts +21 -21
  187. package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +28 -28
  188. package/lib/Shared/Models/ProfilePictureDTO.d.ts +13 -13
  189. package/lib/Shared/Models/RadioButtonItem.d.ts +4 -4
  190. package/lib/Shared/Models/RadioButtonOptions.d.ts +8 -8
  191. package/lib/Shared/Models/RangeNumber.d.ts +4 -4
  192. package/lib/Shared/Models/Recaptcha.d.ts +6 -6
  193. package/lib/Shared/Models/RecaptchaOptions.d.ts +18 -18
  194. package/lib/Shared/Models/RepeaterField.d.ts +7 -7
  195. package/lib/Shared/Models/RepeaterOptions.d.ts +19 -19
  196. package/lib/Shared/Models/SaveDTO.d.ts +5 -5
  197. package/lib/Shared/Models/TagsInputDTO.d.ts +6 -6
  198. package/lib/Shared/Models/TagsInputOptions.d.ts +57 -57
  199. package/lib/Shared/Models/TextAreaOptions.d.ts +23 -23
  200. package/lib/Shared/Models/TextBoxOptions.d.ts +37 -37
  201. package/lib/Shared/Models/ToggleslideOptions.d.ts +9 -9
  202. package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -5
  203. package/lib/Shared/Models/bread-crumb.d.ts +6 -6
  204. package/lib/Shared/Models/control-filter-Item.d.ts +6 -6
  205. package/lib/Shared/Models/datePickerOptions.d.ts +29 -29
  206. package/lib/Shared/Models/filter-options.d.ts +7 -7
  207. package/lib/Shared/Models/page-header-options.d.ts +71 -71
  208. package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +10 -7
  209. package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +10 -7
  210. package/lib/Shared/config/environment.d.ts +1 -1
  211. package/lib/Shared/default_intl.d.ts +21 -18
  212. package/lib/Shared/services/ControlUtility.d.ts +32 -29
  213. package/lib/Shared/services/GlobalSettings.service.d.ts +17 -14
  214. package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +10 -7
  215. package/lib/Shared/services/render-component-service.service.d.ts +10 -7
  216. package/lib/Shared/services/validationErrorMassage.service.d.ts +14 -13
  217. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +59 -56
  218. package/lib/controls/Calendar/Calendar.component.d.ts +42 -39
  219. package/lib/controls/CheckBox/CheckBox.component.d.ts +37 -34
  220. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +29 -26
  221. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +61 -58
  222. package/lib/controls/DropdownList/DropdownList.component.d.ts +55 -50
  223. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +58 -55
  224. package/lib/controls/Form/Form.component.d.ts +28 -25
  225. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +49 -46
  226. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +70 -67
  227. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +49 -51
  228. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +65 -62
  229. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +74 -71
  230. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +73 -70
  231. package/lib/controls/Paging/JwPagination.component.d.ts +27 -24
  232. package/lib/controls/Paging/Paging.component.d.ts +57 -54
  233. package/lib/controls/Phone/Phone.component.d.ts +43 -40
  234. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +69 -66
  235. package/lib/controls/RadioButton/RadioButton.component.d.ts +37 -34
  236. package/lib/controls/Recaptcha/Recaptcha.component.d.ts +41 -38
  237. package/lib/controls/Repeater/repeater/repeater.component.d.ts +29 -26
  238. package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +23 -20
  239. package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +11 -8
  240. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +19 -16
  241. package/lib/controls/TagsInput/TagsInput.component.d.ts +58 -55
  242. package/lib/controls/TextArea/TextArea.component.d.ts +51 -48
  243. package/lib/controls/TextBox/TextBox.component.d.ts +66 -63
  244. package/lib/controls/Toggleslide/toggleslide.component.d.ts +33 -30
  245. package/lib/controls/bbsf-controls.module.d.ts +68 -10
  246. package/lib/controls/page-header-component/page-header-component.component.d.ts +20 -17
  247. package/package.json +61 -78
  248. package/public-api.d.ts +117 -117
  249. package/src/lib/assets/Style.scss +4 -4
  250. package/bnsights-bbsf-controls-1.0.107.tgz +0 -0
  251. package/bnsights-bbsf-controls.d.ts +0 -5
  252. package/bnsights-bbsf-controls.metadata.json +0 -1
  253. package/bundles/bnsights-bbsf-controls.umd.js +0 -9636
  254. package/bundles/bnsights-bbsf-controls.umd.js.map +0 -1
  255. package/esm2015/bnsights-bbsf-controls.js +0 -6
  256. package/esm2015/lib/Shared/Components/app-base-component.js +0 -202
  257. package/esm2015/lib/Shared/Components/ng-tag-input.js +0 -323
  258. package/esm2015/lib/Shared/Directives/template-name.directive.js +0 -18
  259. package/esm2015/lib/Shared/Pipes/bbsf-date-time.pipe.js +0 -20
  260. package/esm2015/lib/Shared/Pipes/bbsf-date.pipe.js +0 -20
  261. package/esm2015/lib/Shared/default_intl.js +0 -29
  262. package/esm2015/lib/Shared/services/ControlUtility.js +0 -164
  263. package/esm2015/lib/Shared/services/GlobalSettings.service.js +0 -28
  264. package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +0 -22
  265. package/esm2015/lib/Shared/services/render-component-service.service.js +0 -30
  266. package/esm2015/lib/Shared/services/validationErrorMassage.service.js +0 -172
  267. package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +0 -266
  268. package/esm2015/lib/controls/Calendar/Calendar.component.js +0 -177
  269. package/esm2015/lib/controls/CheckBox/CheckBox.component.js +0 -118
  270. package/esm2015/lib/controls/ConfirmationModal/ConfirmationModal.component.js +0 -139
  271. package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +0 -227
  272. package/esm2015/lib/controls/DropdownList/DropdownList.component.js +0 -192
  273. package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +0 -447
  274. package/esm2015/lib/controls/Form/Form.component.js +0 -106
  275. package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +0 -347
  276. package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +0 -325
  277. package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +0 -429
  278. package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +0 -434
  279. package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +0 -433
  280. package/esm2015/lib/controls/Paging/JwPagination.component.js +0 -129
  281. package/esm2015/lib/controls/Paging/Paging.component.js +0 -312
  282. package/esm2015/lib/controls/Phone/Phone.component.js +0 -129
  283. package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +0 -371
  284. package/esm2015/lib/controls/RadioButton/RadioButton.component.js +0 -111
  285. package/esm2015/lib/controls/Recaptcha/Recaptcha.component.js +0 -135
  286. package/esm2015/lib/controls/Repeater/repeater/repeater.component.js +0 -117
  287. package/esm2015/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.js +0 -748
  288. package/esm2015/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.js +0 -19
  289. package/esm2015/lib/controls/Repeater/repeater-table/repeater-table.component.js +0 -108
  290. package/esm2015/lib/controls/TagsInput/TagsInput.component.js +0 -278
  291. package/esm2015/lib/controls/TextArea/TextArea.component.js +0 -197
  292. package/esm2015/lib/controls/TextBox/TextBox.component.js +0 -309
  293. package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +0 -90
  294. package/esm2015/lib/controls/bbsf-controls.module.js +0 -240
  295. package/esm2015/lib/controls/page-header-component/page-header-component.component.js +0 -32
  296. package/fesm2015/bnsights-bbsf-controls.js.map +0 -1
  297. package/src/lib/assets/.gitkeep +0 -0
@@ -0,0 +1,376 @@
1
+ import { Component, Input, Optional, ViewChild, Output, EventEmitter, } from '@angular/core';
2
+ import { FormControl, Validators, } from '@angular/forms';
3
+ import { FileUploader } from 'ng2-file-upload';
4
+ import { ProfilePictureDTO } from '../../Shared/Models/ProfilePictureDTO';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../Shared/services/ControlUtility";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@bnsights/bbsf-utilities";
9
+ import * as i4 from "../../Shared/services/GlobalSettings.service";
10
+ import * as i5 from "@angular/common";
11
+ import * as i6 from "angular-cropperjs";
12
+ import * as i7 from "@ng-bootstrap/ng-bootstrap";
13
+ import * as i8 from "ngx-dropzone";
14
+ import * as i9 from "ngx-intl-tel-input";
15
+ export class ProfileImageUploaderComponent {
16
+ static { this.controlContainerstatic = null; }
17
+ constructor(zone, controlUtility, controlContainer, ProfileImageUploaderControlHost, UtilityService, controlValidationService, globalSettings) {
18
+ this.zone = zone;
19
+ this.controlUtility = controlUtility;
20
+ this.controlContainer = controlContainer;
21
+ this.ProfileImageUploaderControlHost = ProfileImageUploaderControlHost;
22
+ this.UtilityService = UtilityService;
23
+ this.controlValidationService = controlValidationService;
24
+ this.globalSettings = globalSettings;
25
+ this.files = [];
26
+ this.ImageSource = './src/assets/images/user.svg';
27
+ this.OnChange = new EventEmitter();
28
+ this.ValidationMessage = '';
29
+ this.AcceptedType = '';
30
+ this.AcceptedTypeArray = [];
31
+ this.ToolTipTypeArray = [];
32
+ this.markAllAsTouched = false;
33
+ this.imgUrl = null;
34
+ this.config = null;
35
+ this.imageUrl = '';
36
+ this.imgwUrl = '';
37
+ this.mdlSampleIsOpen = false;
38
+ this.validationRules = [];
39
+ this.validationRulesasync = [];
40
+ this.resetError = () => {
41
+ this.controlValidationService.removeGlobalError();
42
+ };
43
+ //External Method
44
+ this.RemoveRequiredValidation = () => {
45
+ this.controlUtility.RemoveRequiredValidation(this.ProfileImageUploadFormControl, this.validationRules, this.options);
46
+ };
47
+ //External Method
48
+ this.AddRequiredValidation = () => {
49
+ this.controlUtility.AddRequiredValidation(this.ProfileImageUploadFormControl, this.validationRules, this.options);
50
+ };
51
+ //External Method
52
+ this.RemoveCustomValidation = (CustomValidation) => {
53
+ this.controlUtility.RemoveCustomValidation(this.ProfileImageUploadFormControl, this.validationRules, CustomValidation);
54
+ };
55
+ //External Method
56
+ this.AddCustomValidation = (CustomValidation) => {
57
+ this.controlUtility.AddCustomValidation(this.ProfileImageUploadFormControl, this.validationRules, CustomValidation);
58
+ };
59
+ //External Method
60
+ this.IsValid = () => {
61
+ this.controlUtility.IsValid(this.ProfileImageUploadFormControl);
62
+ };
63
+ ProfileImageUploaderComponent.controlContainerstatic =
64
+ this.controlContainer;
65
+ this.uploader = new FileUploader({
66
+ disableMultipart: false, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
67
+ });
68
+ this.hasAnotherDropZoneOver = false;
69
+ this.ProfilePictureDTO = new ProfilePictureDTO();
70
+ }
71
+ ngOnInit() {
72
+ this.controlValidationService.isCreatedBefor = false;
73
+ if (!this.options.ViewType)
74
+ this.options.ViewType = this.globalSettings.ViewType;
75
+ if (this.options.DefaultImageSrc != null &&
76
+ this.options.DefaultImageSrc != '')
77
+ this.ImageSource = this.options.DefaultImageSrc;
78
+ this.config = {
79
+ aspectRatio: 200 / 200,
80
+ dragMode: 'move',
81
+ background: true,
82
+ movable: true,
83
+ rotatable: true,
84
+ scalable: true,
85
+ zoomable: true,
86
+ viewMode: 1,
87
+ checkImageOrigin: true,
88
+ modal: true,
89
+ checkCrossOrigin: false,
90
+ cropBoxResizable: false,
91
+ autoCrop: true,
92
+ };
93
+ if (this.options.ImageUploadAcceptsTypes != null) {
94
+ this.options.ImageUploadAcceptsTypes;
95
+ }
96
+ if (this.options.Value != null) {
97
+ let imgURL = this.options.Value['fileURL'];
98
+ if (imgURL != '' && imgURL != undefined && imgURL != null)
99
+ this.ImageSource = imgURL;
100
+ let element = this.options.Value;
101
+ this.FileLikeObject = {
102
+ name: element.FileName
103
+ };
104
+ this.uploader.addToQueue([this.FileLikeObject]);
105
+ }
106
+ if (this.options.LabelKey != null && this.options.LabelKey != '')
107
+ this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
108
+ if (this.options.ImageUploadAcceptsTypes != null &&
109
+ this.options.ImageUploadAcceptsTypes.length > 0) {
110
+ for (let index = 0; index < this.options.ImageUploadAcceptsTypes.length; index++) {
111
+ const Type = this.options.ImageUploadAcceptsTypes[index];
112
+ this.AcceptedType =
113
+ this.AcceptedType.toUpperCase() + Type.toUpperCase();
114
+ }
115
+ this.AcceptedTypeArray = this.AcceptedType.split(',');
116
+ for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
117
+ const element = this.AcceptedTypeArray[index];
118
+ const TypeToolTipe = element.split('/')[1];
119
+ this.ToolTipTypeArray.push(TypeToolTipe.toUpperCase());
120
+ }
121
+ this.ValidationMessage =
122
+ this.ValidationMessage +
123
+ this.UtilityService.getResourceValue('AllowedTypes') +
124
+ ` (${this.ToolTipTypeArray}) `;
125
+ }
126
+ if (this.options.FileMaxSizeInMB > 0) {
127
+ this.ValidationMessage =
128
+ this.ValidationMessage +
129
+ ` <br /> ${this.UtilityService.getResourceValue('FileMaxSizeInMB')} ${this.options.FileMaxSizeInMB}`;
130
+ }
131
+ if (this.options.ImageUploadAcceptsTypes != null &&
132
+ this.options.ImageUploadAcceptsTypes.length > 0) {
133
+ }
134
+ this.group.addControl(this.options.Name, new FormControl(''));
135
+ this.ProfileImageUploadFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
136
+ if (this.options.CustomValidation.length > 0) {
137
+ let Validations = this.options.CustomValidation;
138
+ for (let index = 0; index < Validations.length; index++) {
139
+ const Validation = Validations[index];
140
+ this.validationRules.push(Validation.functionBody);
141
+ }
142
+ }
143
+ if (this.options.IsRequired) {
144
+ this.validationRules.push(Validators.required);
145
+ }
146
+ this.ProfileImageUploadFormControl.setValidators(this.validationRules);
147
+ this.ProfileImageUploadFormControl.setAsyncValidators(this.validationRulesasync);
148
+ if (this.options.IsDisabled) {
149
+ this.ProfileImageUploadFormControl.disable();
150
+ }
151
+ this.ProfileImageUploaderControlHost.ngSubmit.subscribe((value) => {
152
+ this.group.markAllAsTouched();
153
+ this.markAllAsTouched = true;
154
+ });
155
+ }
156
+ ngAfterViewInit() {
157
+ if (this.options.AttributeList != null) {
158
+ var element = document.getElementById(this.options.Name);
159
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
160
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
161
+ }
162
+ }
163
+ }
164
+ showImageUploader(element) {
165
+ let input = element.parentElement.parentElement.querySelector('input[type=file]');
166
+ input.click();
167
+ }
168
+ showGlobalError() {
169
+ this.controlUtility.showGlobalError();
170
+ }
171
+ getErrorValidation(ErrorList) {
172
+ if (this.markAllAsTouched && this.group.invalid) {
173
+ this.showGlobalError();
174
+ this.markAllAsTouched = false;
175
+ }
176
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
177
+ }
178
+ onFileChange(event) {
179
+ if (event.rejectedFiles.length > 0) {
180
+ const file = event.rejectedFiles[0];
181
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
182
+ const fileType = file.type;
183
+ if (file.size > maxFileSize) {
184
+ const formControl = this.ProfileImageUploadFormControl;
185
+ formControl.setErrors({
186
+ FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
187
+ });
188
+ formControl.markAsTouched();
189
+ this.uploader.queue = [];
190
+ return;
191
+ }
192
+ if (this.options.ImageUploadAcceptsTypes != null &&
193
+ this.options.ImageUploadAcceptsTypes.length > 0 &&
194
+ !(this.AcceptedTypeArray.includes(fileType.toUpperCase()) ||
195
+ this.AcceptedTypeArray.includes(fileType.toLowerCase()))) {
196
+ const formControl = this.ProfileImageUploadFormControl;
197
+ formControl.setErrors({ ToolTipTypeError: this.ToolTipTypeArray });
198
+ formControl.markAsTouched();
199
+ this.uploader.queue = [];
200
+ return;
201
+ }
202
+ }
203
+ let FilesArray = [];
204
+ for (let index = 0; index < event.addedFiles.length; index++) {
205
+ const file = event.addedFiles[0];
206
+ this.EventFile = file;
207
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
208
+ if (file) {
209
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
210
+ const fileType = file.type;
211
+ if (file.size > maxFileSize) {
212
+ const formControl = this.ProfileImageUploadFormControl;
213
+ formControl.setErrors({
214
+ FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
215
+ });
216
+ formControl.markAsTouched();
217
+ this.uploader.queue = [];
218
+ return;
219
+ }
220
+ let reader = new FileReader();
221
+ let FileObject = file;
222
+ reader.readAsDataURL(FileObject);
223
+ reader.onload = () => {
224
+ this.imageUrl = reader.result.toString();
225
+ this.openModal(true);
226
+ let originalValue = this.group.get(this.options.Name).value;
227
+ if (this.options.PatchFunction &&
228
+ this.options.PatchPath &&
229
+ this.group.get(this.options.Name).valid) {
230
+ this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
231
+ }
232
+ //Use this line to enable two way binding.
233
+ this.options.Value = originalValue;
234
+ this.OnChange.emit(originalValue);
235
+ };
236
+ }
237
+ }
238
+ }
239
+ removeFromControlValue(event) {
240
+ let ItemList = this.group.get(this.options.Name).value;
241
+ this.files.splice(this.files.indexOf(event), 1);
242
+ ItemList = [];
243
+ if (this.files.length == 0 && this.options.IsRequired) {
244
+ this.ProfileImageUploadFormControl.markAsTouched();
245
+ this.ProfileImageUploadFormControl.setErrors(Validators.required);
246
+ this.ProfileImageUploadFormControl.invalid;
247
+ }
248
+ this.group.get(this.options.Name).setValue(ItemList);
249
+ this.OnChange.emit(this.group.get(this.options.Name).value);
250
+ this.options.Value = this.group.get(this.options.Name).value;
251
+ }
252
+ cropImage() {
253
+ this.ProfilePictureDTO.FileName = this.EventFile.name;
254
+ let Cropper = this.angularCropper.cropper;
255
+ let profilePicturCropper = Cropper.getCroppedCanvas({
256
+ width: 400,
257
+ height: 400,
258
+ imageSmoothingEnabled: false,
259
+ imageSmoothingQuality: 'high',
260
+ });
261
+ let AvatarPictureCropper = Cropper.getCroppedCanvas({
262
+ width: 100,
263
+ height: 100,
264
+ imageSmoothingEnabled: false,
265
+ imageSmoothingQuality: 'high',
266
+ });
267
+ let OriginalPictureCropper = Cropper.getCroppedCanvas({
268
+ width: 700,
269
+ height: 700,
270
+ imageSmoothingEnabled: false,
271
+ imageSmoothingQuality: 'high',
272
+ });
273
+ profilePicturCropper.toBlob((blob) => {
274
+ this.zone.run(() => {
275
+ this.getProfileImageBlobFile(blob, 'profilePicturCropper');
276
+ });
277
+ });
278
+ AvatarPictureCropper.toBlob((blob) => {
279
+ this.zone.run(() => {
280
+ this.getProfileImageBlobFile(blob, 'AvatarPictureCropper');
281
+ });
282
+ });
283
+ OriginalPictureCropper.toBlob((blob) => {
284
+ this.zone.run(() => {
285
+ this.getProfileImageBlobFile(blob, 'OriginalPictureCropper');
286
+ });
287
+ });
288
+ this.files = [];
289
+ this.openModal(false);
290
+ }
291
+ getProfileImageBlobFile(blob, type) {
292
+ let FilesArray = [];
293
+ let BlobFile;
294
+ let reader = new FileReader();
295
+ BlobFile = blob;
296
+ reader.readAsDataURL(BlobFile);
297
+ reader.onload = () => {
298
+ let FileObject;
299
+ switch (type) {
300
+ case 'profilePicturCropper':
301
+ BlobFile.name = this.EventFile.name + 'MediumPicture';
302
+ FileObject = {
303
+ FileName: this.EventFile.name + 'MediumPicture',
304
+ FileType: this.EventFile.type,
305
+ FileBase64: reader.result.toString().split(',')[1],
306
+ FileSizeInMB: BlobFile.size / 1000 / 1000,
307
+ };
308
+ this.ProfilePictureDTO.profilePicture = FileObject;
309
+ this.ProfilePictureDTO.MediumPicture =
310
+ FileObject.FileName + ',' + FileObject.FileBase64;
311
+ this.files.push(BlobFile);
312
+ break;
313
+ case 'AvatarPictureCropper':
314
+ FileObject = {
315
+ FileName: this.EventFile.name + 'SmallPicture',
316
+ FileType: this.EventFile.type,
317
+ FileBase64: reader.result.toString().split(',')[1],
318
+ FileSizeInMB: BlobFile.size / 1000 / 1000,
319
+ };
320
+ this.ProfilePictureDTO.AvatarPicture = FileObject;
321
+ this.ProfilePictureDTO.SmallPicture =
322
+ FileObject.FileName + ',' + FileObject.FileBase64;
323
+ break;
324
+ case 'OriginalPictureCropper':
325
+ FileObject = {
326
+ FileName: this.EventFile.name + 'Original',
327
+ FileType: this.EventFile.type,
328
+ FileBase64: reader.result.toString().split(',')[1],
329
+ FileSizeInMB: BlobFile.size / 1000 / 1000,
330
+ };
331
+ this.ProfilePictureDTO.OriginalPicture = FileObject;
332
+ this.ProfilePictureDTO.Original =
333
+ FileObject.FileName + ',' + FileObject.FileBase64;
334
+ this.group.get(this.options.Name).setValue(this.ProfilePictureDTO);
335
+ this.OnChange.emit(this.group.get(this.options.Name).value);
336
+ break;
337
+ default:
338
+ break;
339
+ }
340
+ this.options.Value = this.ProfilePictureDTO;
341
+ };
342
+ }
343
+ rotateImage(degree) {
344
+ this.angularCropper.cropper.rotate(degree);
345
+ }
346
+ moveImage(offsetX, offsetY) {
347
+ this.angularCropper.cropper.move(offsetX, offsetY);
348
+ }
349
+ zoomImage(ratio) {
350
+ this.angularCropper.cropper.zoom(ratio);
351
+ }
352
+ openModal(open) {
353
+ this.mdlSampleIsOpen = open;
354
+ }
355
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ProfileImageUploaderComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
356
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ProfileImageUploaderComponent, selector: "BBSF-ProfileImageUploader", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\" d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\" fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div #element >\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ProfileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }] }); }
357
+ }
358
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ProfileImageUploaderComponent, decorators: [{
359
+ type: Component,
360
+ args: [{ selector: 'BBSF-ProfileImageUploader', template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\" d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\" fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\"\r\n ngx-dropzone\r\n [disabled]=\"options.IsDisabled\"\r\n [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\" ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div #element >\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ProfileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n" }]
361
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
362
+ type: Optional
363
+ }] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }], propDecorators: { fileInput: [{
364
+ type: ViewChild,
365
+ args: ['fileInput', { static: false }]
366
+ }], group: [{
367
+ type: Input
368
+ }], options: [{
369
+ type: Input
370
+ }], OnChange: [{
371
+ type: Output
372
+ }], angularCropper: [{
373
+ type: ViewChild,
374
+ args: ['angularCropper', { static: false }]
375
+ }] } });
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZmlsZUltYWdlVXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL1Byb2ZpbGVJbWFnZVVwbG9hZGVyL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9Qcm9maWxlSW1hZ2VVcGxvYWRlci9Qcm9maWxlSW1hZ2VVcGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFDWCxVQUFVLEdBS1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUF1QyxNQUFNLGlCQUFpQixDQUFDO0FBSXBGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7OztBQVkxRSxNQUFNLE9BQU8sNkJBQTZCO2FBQ2pDLDJCQUFzQixHQUFHLElBQUksQUFBUCxDQUFRO0lBZ0NyQyxZQUNVLElBQVksRUFDWixjQUE4QixFQUNsQixnQkFBa0MsRUFDL0MsK0JBQW1ELEVBQ25ELGNBQThCLEVBQzdCLHdCQUFrRCxFQUNsRCxjQUE4QjtRQU45QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDL0Msb0NBQStCLEdBQS9CLCtCQUErQixDQUFvQjtRQUNuRCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsNkJBQXdCLEdBQXhCLHdCQUF3QixD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QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFhO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7OEdBNVlVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLCtWQ3BDMUMsdXVRQXNKQTs7MkZEbEhhLDZCQUE2QjtrQkFKekMsU0FBUzsrQkFDRSwyQkFBMkI7OzBCQXVDbEMsUUFBUTsyS0FqQ2dDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQWNBLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIE5nWm9uZSxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlTGlrZU9iamVjdCwgRmlsZVVwbG9hZGVyT3B0aW9ucyB9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XHJcbmltcG9ydCB7IEZpbGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVEVE8nO1xyXG5pbXBvcnQgeyBDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1jcm9wcGVyanMnO1xyXG5pbXBvcnQgeyBQcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9Qcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zJztcclxuaW1wb3J0IHsgUHJvZmlsZVBpY3R1cmVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL1Byb2ZpbGVQaWN0dXJlRFRPJztcclxuaW1wb3J0IHtcclxuICBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgVXRpbGl0eVNlcnZpY2UsXHJcbn0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvR2xvYmFsU2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1Qcm9maWxlSW1hZ2VVcGxvYWRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2ZpbGVJbWFnZVVwbG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBzdGF0aWMgY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IG51bGw7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcbiAgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gIEltYWdlU291cmNlOiBzdHJpbmcgPSAnLi9zcmMvYXNzZXRzL2ltYWdlcy91c2VyLnN2Zyc7XHJcbiAgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBQcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBQcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIFZhbGlkYXRpb25NZXNzYWdlID0gJyc7XHJcbiAgdXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBoYXNBbm90aGVyRHJvcFpvbmVPdmVyOiBib29sZWFuO1xyXG4gIEFjY2VwdGVkVHlwZTogc3RyaW5nID0gJyc7XHJcbiAgQWNjZXB0ZWRUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgVG9vbFRpcFR5cGVBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBGaWxlTGlrZU9iamVjdDogRmlsZUxpa2VPYmplY3Q7XHJcbiAgUHJvZmlsZVBpY3R1cmVEVE86IFByb2ZpbGVQaWN0dXJlRFRPO1xyXG4gIGNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYW5ndWxhckNyb3BwZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBwdWJsaWMgYW5ndWxhckNyb3BwZXI6IENyb3BwZXJDb21wb25lbnQ7XHJcbiAgaW1nVXJsID0gbnVsbDtcclxuICBjb25maWcgPSBudWxsO1xyXG4gIGltYWdlVXJsID0gJyc7XHJcbiAgaW1nd1VybCA9ICcnO1xyXG4gIEV2ZW50RmlsZTogYW55O1xyXG4gIG1kbFNhbXBsZUlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBQcm9maWxlSW1hZ2VVcGxvYWRlckNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgICBwdWJsaWMgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzXHJcbiAgKSB7XHJcbiAgICBQcm9maWxlSW1hZ2VVcGxvYWRlckNvbXBvbmVudC5jb250cm9sQ29udGFpbmVyc3RhdGljID1cclxuICAgICAgdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoPEZpbGVVcGxvYWRlck9wdGlvbnM+e1xyXG4gICAgICBkaXNhYmxlTXVsdGlwYXJ0OiBmYWxzZSwgLy8gJ0Rpc2FibGVNdWx0aXBhcnQnIG11c3QgYmUgJ3RydWUnIGZvciBmb3JtYXREYXRhRnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmhhc0Fub3RoZXJEcm9wWm9uZU92ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8gPSBuZXcgUHJvZmlsZVBpY3R1cmVEVE8oKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuaXNDcmVhdGVkQmVmb3IgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5WaWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLlZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5WaWV3VHlwZTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5EZWZhdWx0SW1hZ2VTcmMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuRGVmYXVsdEltYWdlU3JjICE9ICcnXHJcbiAgICApXHJcbiAgICAgIHRoaXMuSW1hZ2VTb3VyY2UgPSB0aGlzLm9wdGlvbnMuRGVmYXVsdEltYWdlU3JjO1xyXG5cclxuICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICBhc3BlY3RSYXRpbzogMjAwIC8gMjAwLFxyXG4gICAgICBkcmFnTW9kZTogJ21vdmUnLFxyXG4gICAgICBiYWNrZ3JvdW5kOiB0cnVlLFxyXG4gICAgICBtb3ZhYmxlOiB0cnVlLFxyXG4gICAgICByb3RhdGFibGU6IHRydWUsXHJcbiAgICAgIHNjYWxhYmxlOiB0cnVlLFxyXG4gICAgICB6b29tYWJsZTogdHJ1ZSxcclxuICAgICAgdmlld01vZGU6IDEsXHJcbiAgICAgIGNoZWNrSW1hZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBjaGVja0Nyb3NzT3JpZ2luOiBmYWxzZSxcclxuICAgICAgY3JvcEJveFJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgIGF1dG9Dcm9wOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBpbWdVUkwgPSB0aGlzLm9wdGlvbnMuVmFsdWVbJ2ZpbGVVUkwnXTtcclxuICAgICAgaWYgKGltZ1VSTCAhPSAnJyAmJiBpbWdVUkwgIT0gdW5kZWZpbmVkICYmIGltZ1VSTCAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuSW1hZ2VTb3VyY2UgPSBpbWdVUkw7XHJcblxyXG4gICAgICBsZXQgZWxlbWVudCA9IHRoaXMub3B0aW9ucy5WYWx1ZTtcclxuICAgICAgdGhpcy5GaWxlTGlrZU9iamVjdCA9IDxGaWxlTGlrZU9iamVjdD57XHJcbiAgICAgICAgbmFtZTogZWxlbWVudC5GaWxlTmFtZVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW3RoaXMuRmlsZUxpa2VPYmplY3QgYXMgYW55XSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSAnJylcclxuICAgICAgdGhpcy5vcHRpb25zLkxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkxhYmVsS2V5XHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBpbmRleCA8IHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGg7XHJcbiAgICAgICAgaW5kZXgrK1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBUeXBlID0gdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzW2luZGV4XTtcclxuICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZSA9XHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZS50b1VwcGVyQ2FzZSgpICsgVHlwZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkgPSB0aGlzLkFjY2VwdGVkVHlwZS5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5BY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5BY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgY29uc3QgVHlwZVRvb2xUaXBlID0gZWxlbWVudC5zcGxpdCgnLycpWzFdO1xyXG4gICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKFR5cGVUb29sVGlwZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0FsbG93ZWRUeXBlcycpICtcclxuICAgICAgICBgICgke3RoaXMuVG9vbFRpcFR5cGVBcnJheX0pIGA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiA+IDApIHtcclxuICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSArXHJcbiAgICAgICAgYCA8YnIgLz4gJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0ZpbGVNYXhTaXplSW5NQicpfSAke3RoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUJcclxuICAgICAgICB9YDtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXNhc3luY1xyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZGVyQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS5LZXksXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93SW1hZ2VVcGxvYWRlcihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgbGV0IGlucHV0ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgJ2lucHV0W3R5cGU9ZmlsZV0nXHJcbiAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaW5wdXQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH07XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24oRXJyb3JMaXN0KSB7XHJcbiAgICBpZiAodGhpcy5tYXJrQWxsQXNUb3VjaGVkICYmIHRoaXMuZ3JvdXAuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnNob3dHbG9iYWxFcnJvcigpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKFxyXG4gICAgICBFcnJvckxpc3QsXHJcbiAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uRmlsZUNoYW5nZShldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQucmVqZWN0ZWRGaWxlc1swXTtcclxuICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICogMTAwMCAqIDEwMDA7XHJcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIEZpbGVNYXhTaXplSW5NQjogdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiArICdNJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICEoXHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvVXBwZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgVG9vbFRpcFR5cGVFcnJvcjogdGhpcy5Ub29sVGlwVHlwZUFycmF5IH0pO1xyXG4gICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgRmlsZXNBcnJheSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5hZGRlZEZpbGVzWzBdO1xyXG4gICAgICB0aGlzLkV2ZW50RmlsZSA9IGZpbGU7XHJcbiAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgICAgRmlsZU1heFNpemVJbk1COiB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICsgJ00nLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIGxldCBGaWxlT2JqZWN0ID0gZmlsZTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChGaWxlT2JqZWN0KTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbWFnZVVybCA9IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgIHRoaXMub3Blbk1vZGFsKHRydWUpO1xyXG4gICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsdWU7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uICYmXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaFBhdGggJiZcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbGlkXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShcclxuICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaFBhdGhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuICAgICAgICAgIHRoaXMuT25DaGFuZ2UuZW1pdChvcmlnaW5hbFZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZUZyb21Db250cm9sVmFsdWUoZXZlbnQpIHtcclxuICAgIGxldCBJdGVtTGlzdCA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS52YWx1ZTtcclxuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihldmVudCksIDEpO1xyXG4gICAgSXRlbUxpc3QgPSBbXTtcclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PSAwICYmIHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEVycm9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKEl0ZW1MaXN0KTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsdWUpO1xyXG4gICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlO1xyXG4gIH1cclxuICBjcm9wSW1hZ2UoKSB7XHJcbiAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPLkZpbGVOYW1lID0gdGhpcy5FdmVudEZpbGUubmFtZTtcclxuICAgIGxldCBDcm9wcGVyID0gdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyO1xyXG4gICAgbGV0IHByb2ZpbGVQaWN0dXJDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDQwMCxcclxuICAgICAgaGVpZ2h0OiA0MDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBsZXQgQXZhdGFyUGljdHVyZUNyb3BwZXIgPSBDcm9wcGVyLmdldENyb3BwZWRDYW52YXMoe1xyXG4gICAgICB3aWR0aDogMTAwLFxyXG4gICAgICBoZWlnaHQ6IDEwMCxcclxuICAgICAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaW1hZ2VTbW9vdGhpbmdRdWFsaXR5OiAnaGlnaCcsXHJcbiAgICB9KTtcclxuICAgIGxldCBPcmlnaW5hbFBpY3R1cmVDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDcwMCxcclxuICAgICAgaGVpZ2h0OiA3MDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBwcm9maWxlUGljdHVyQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAncHJvZmlsZVBpY3R1ckNyb3BwZXInKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIEF2YXRhclBpY3R1cmVDcm9wcGVyLnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdldFByb2ZpbGVJbWFnZUJsb2JGaWxlKGJsb2IsICdBdmF0YXJQaWN0dXJlQ3JvcHBlcicpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgT3JpZ2luYWxQaWN0dXJlQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAnT3JpZ2luYWxQaWN0dXJlQ3JvcHBlcicpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmlsZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLm9wZW5Nb2RhbChmYWxzZSk7XHJcbiAgfVxyXG4gIGdldFByb2ZpbGVJbWFnZUJsb2JGaWxlKGJsb2IsIHR5cGUpIHtcclxuICAgIGxldCBGaWxlc0FycmF5ID0gW107XHJcbiAgICBsZXQgQmxvYkZpbGU7XHJcbiAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIEJsb2JGaWxlID0gYmxvYjtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKEJsb2JGaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGxldCBGaWxlT2JqZWN0OiBGaWxlRFRPO1xyXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlICdwcm9maWxlUGljdHVyQ3JvcHBlcic6XHJcbiAgICAgICAgICBCbG9iRmlsZS5uYW1lID0gdGhpcy5FdmVudEZpbGUubmFtZSArICdNZWRpdW1QaWN0dXJlJztcclxuICAgICAgICAgIEZpbGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIEZpbGVOYW1lOiB0aGlzLkV2ZW50RmlsZS5uYW1lICsgJ01lZGl1bVBpY3R1cmUnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8ucHJvZmlsZVBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5NZWRpdW1QaWN0dXJlID1cclxuICAgICAgICAgICAgRmlsZU9iamVjdC5GaWxlTmFtZSArICcsJyArIEZpbGVPYmplY3QuRmlsZUJhc2U2NDtcclxuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChCbG9iRmlsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdBdmF0YXJQaWN0dXJlQ3JvcHBlcic6XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdTbWFsbFBpY3R1cmUnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8uQXZhdGFyUGljdHVyZSA9IEZpbGVPYmplY3Q7XHJcbiAgICAgICAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPLlNtYWxsUGljdHVyZSA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnT3JpZ2luYWxQaWN0dXJlQ3JvcHBlcic6XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdPcmlnaW5hbCcsXHJcbiAgICAgICAgICAgIEZpbGVUeXBlOiB0aGlzLkV2ZW50RmlsZS50eXBlLFxyXG4gICAgICAgICAgICBGaWxlQmFzZTY0OiByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSxcclxuICAgICAgICAgICAgRmlsZVNpemVJbk1COiBCbG9iRmlsZS5zaXplIC8gMTAwMCAvIDEwMDAsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5PcmlnaW5hbFBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5PcmlnaW5hbCA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUodGhpcy5Qcm9maWxlUGljdHVyZURUTyk7XHJcbiAgICAgICAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IHRoaXMuUHJvZmlsZVBpY3R1cmVEVE87XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcm90YXRlSW1hZ2UoZGVncmVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5yb3RhdGUoZGVncmVlKTtcclxuICB9XHJcbiAgbW92ZUltYWdlKG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIubW92ZShvZmZzZXRYLCBvZmZzZXRZKTtcclxuICB9XHJcbiAgem9vbUltYWdlKHJhdGlvOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKHJhdGlvKTtcclxuICB9XHJcblxyXG4gIG9wZW5Nb2RhbChvcGVuOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLm1kbFNhbXBsZUlzT3BlbiA9IG9wZW47XHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIFJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLFxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcyxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZFJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICBDdXN0b21WYWxpZGF0aW9uXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIEN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LklzVmFsaWQodGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCk7XHJcbiAgfTtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBiYnNmLWNvbnRyb2wgYmJzZi1wcm9maWxlLWltYWdlLXVwbG9hZFwiIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLlZpZXdUeXBlPT0xKT8nYmJzZi12ZXJ0aWNhbCc6J2Jic2YtaG9yaXpvbnRhbCdcIj5cclxuICAgIDwhLS1sYWJlbC0tPlxyXG4gICAgPGxhYmVsIFtoaWRkZW5dPVwib3B0aW9ucy5IaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLkxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAge3tvcHRpb25zLkxhYmVsVmFsdWV9fVxyXG4gICAgICA8IS0tQXN0ZXJpc2stLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuU2hvd0FzdGVyaXNrJiZvcHRpb25zLklzUmVxdWlyZWQpfHwob3B0aW9ucy5Jc1JlcXVpcmVkKSkmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8IS0tQWxsb3cgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLkFsbG93RHJvcFpvbmUmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiXHJcbiAgICAgICAgIG5neC1kcm9wem9uZVxyXG4gICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9ucy5Jc0Rpc2FibGVkXCJcclxuICAgICAgICAgW2FjY2VwdF09XCJBY2NlcHRlZFR5cGVcIlxyXG4gICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCJcclxuICAgICAgICAgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXHJcbiAgICAgICAgIG5nRGVmYXVsdENvbnRyb2wgZm9ybUNvbnRyb2xOYW1lPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgICAgIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsIGNsYXNzPVwiZHJvcHpvbmUtbGFiZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWFuZC12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTUgMTZDMy4zIDE2IDIgMTQuNyAyIDEzQzIgMTEuMyAzLjMgMTAgNSAxMEg1LjFDNSA5LjcgNSA5LjMgNSA5QzUgNi4yIDcuMiA0IDEwIDRDMTEuOSA0IDEzLjUgNSAxNC4zIDYuNUMxNC44IDYuMiAxNS40IDYgMTYgNkMxNy43IDYgMTkgNy4zIDE5IDlDMTkgOS40IDE4LjkgOS43IDE4LjggMTBDMTguOSAxMCAxOC45IDEwIDE5IDEwQzIwLjcgMTAgMjIgMTEuMyAyMiAxM0MyMiAxNC43IDIwLjcgMTYgMTkgMTZINVpNOCAxMy42SDE2TDEyLjcgMTAuM0MxMi4zIDkuODk5OTkgMTEuNyA5Ljg5OTk5IDExLjMgMTAuM0w4IDEzLjZaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0eWxlPVwiZmlsbDogI2ExYTFhMTtcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgMTMuNlYxOUMxMSAxOS42IDExLjQgMjAgMTIgMjBDMTIuNiAyMCAxMyAxOS42IDEzIDE5VjEzLjZIMTFaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0eWxlPVwiZmlsbDogIzk4OTg5ODtcIj48L3BhdGg+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwhLS1WYWxpZGF0aW9uIHRleHQtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnXCIgKm5nSWY9XCJWYWxpZGF0aW9uTWVzc2FnZVwiIFtpbm5lckhUTUxdPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtbGFiZWw+XHJcbiAgICAgIDxuZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldyBjbGFzcz1cImRyb3B6b25lLXByZXZpZXdcIiAqbmdGb3I9XCJsZXQgZiBvZiBmaWxlc1wiIFtmaWxlXT1cImZcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlZCk9XCJyZW1vdmVGcm9tQ29udHJvbFZhbHVlKGYpXCIgbmdQcm9qZWN0QXM9XCJuZ3gtZHJvcHpvbmUtcHJldmlld1wiPlxyXG4gICAgICA8L25neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tTm90IGFsbG93ZWQgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCIhb3B0aW9ucy5BbGxvd0Ryb3Bab25lJiYhb3B0aW9ucy5Jc1JlYWRvbmx5XCIgc3R5bGU9XCJ3aWR0aDpmaXQtY29udGVudFwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgPGRpdiAjZWxlbWVudCAoY2xpY2spPVwic2hvd0ltYWdlVXBsb2FkZXIoZWxlbWVudClcIj5cclxuICAgICAgICAgIDxpbWcgW3NyY109XCJJbWFnZVNvdXJjZVwiIGNsYXNzPVwicHJvZmlsZS11cGxvYWQtaW1nXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUge3tvcHRpb25zLkV4dHJhQ2xhc3Nlc319XCJcclxuICAgICAgICAgIG5neC1kcm9wem9uZVxyXG4gICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb25zLklzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgIFthY2NlcHRdPVwiQWNjZXB0ZWRUeXBlXCJcclxuICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIiBhcmlhLWludmFsaWQ9XCJ0cnVlXCJcclxuICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sIGZvcm1Db250cm9sTmFtZT1cInt7b3B0aW9ucy5OYW1lfX1cIlxyXG4gICAgICAgICAgIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBQcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXcgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIiBbZmlsZV09XCJmXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwicmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShmKVwiIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldz5cclxuICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZ1wiICpuZ0lmPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIiBbaW5uZXJIVE1MXT1cIlZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wJiZvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgPGRpdiAjZWxlbWVudCA+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cIkltYWdlU291cmNlXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgIDwhLS0gcmVxdWlyZWQgdGV4dC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiXHJcbiAgICAgICAgICpuZ0lmPVwiKFByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuZXJyb3JzfGtleXZhbHVlKX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIExhYmVsRGVzY3JpcHRpb24tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiICpuZ0lmPVwib3B0aW9ucy5MYWJlbERlc2NyaXB0aW9uIT1udWxsXCI+e3tvcHRpb25zLkxhYmVsRGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpIFwiPnt7cmVzZXRFcnJvcigpfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tIGltYWdlIGNyb3BwZXIgbW9kYWwtLT5cclxuICA8ZGl2IGlkPVwibWRsU2FtcGxlXCIgY2xhc3M9XCJtb2RhbCBiYnNmLWNyb3BwZXItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgW25nU3R5bGVdPVwieydkaXNwbGF5JzogbWRsU2FtcGxlSXNPcGVuID8gJ2Jsb2NrJyA6ICdub25lJywgJ29wYWNpdHknOiAxfVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgIHt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNyb3BJbWFnZVwiKX19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJvcGVuTW9kYWwoZmFsc2UpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbWFnZVVybFwiPlxyXG4gICAgICAgICAgICA8YW5ndWxhci1jcm9wcGVyICNhbmd1bGFyQ3JvcHBlciBbY3JvcHBlck9wdGlvbnNdPVwiY29uZmlnXCIgW2ltYWdlVXJsXT1cImltYWdlVXJsXCI+XHJcbiAgICAgICAgICAgIDwvYW5ndWxhci1jcm9wcGVyPlxyXG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1nd1VybFwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wcGVyLWJ0bnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ6b29tSW1hZ2UoMC4xKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIlpvb20gaW5cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2VhcmNoLXBsdXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInpvb21JbWFnZSgtMC4xKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIlpvb20gb3V0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNlYXJjaC1taW51c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKC0xMCwwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIk1vdmUgbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtb3ZlSW1hZ2UoMTAsMClcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJNb3ZlIHJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LXJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtb3ZlSW1hZ2UoMCwtMTApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiTW92ZSB1cFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKDAsMTApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiTW92ZSBkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJvdGF0ZUltYWdlKC00NSlcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJSb3RhdGUgbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS11bmRvLWFsdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicm90YXRlSW1hZ2UoNDUpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiUm90YXRlIHJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXJlZG8tYWx0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIiBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJ0bkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodFwiIChjbGljayk9XCJvcGVuTW9kYWwoZmFsc2UpXCI+XHJcbiAgICAgICAgICAgIHt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNyb3BJbWFnZSgpXCIgaWQ9XCJidG5PS1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tYnJhbmRcIj5cclxuICAgICAgICAgICAge3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ3JvcFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4iXX0=