@bnsights/bbsf-controls 1.0.109 → 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 (274) hide show
  1. package/README.md +4 -0
  2. package/{esm2020 → esm2022}/bnsights-bbsf-controls.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/Shared/Components/app-base-component.mjs +226 -226
  4. package/{esm2020 → esm2022}/lib/Shared/Components/ng-tag-input.mjs +176 -176
  5. package/{esm2020 → esm2022}/lib/Shared/Directives/template-name.directive.mjs +18 -18
  6. package/{esm2020 → esm2022}/lib/Shared/Enums/CalendarView.mjs +7 -7
  7. package/{esm2020 → esm2022}/lib/Shared/Enums/ControlLayout.mjs +5 -5
  8. package/{esm2020 → esm2022}/lib/Shared/Enums/Countries.mjs +246 -246
  9. package/{esm2020 → esm2022}/lib/Shared/Enums/Enums.mjs +32 -32
  10. package/{esm2020 → esm2022}/lib/Shared/Enums/FileType.mjs +21 -21
  11. package/{esm2020 → esm2022}/lib/Shared/Enums/FilterType.mjs +10 -10
  12. package/{esm2020 → esm2022}/lib/Shared/Enums/FontSize.mjs +6 -6
  13. package/{esm2020 → esm2022}/lib/Shared/Enums/ForceDirection.mjs +5 -5
  14. package/{esm2020 → esm2022}/lib/Shared/Enums/IconPosition.mjs +5 -5
  15. package/{esm2020 → esm2022}/lib/Shared/Enums/ImageType.mjs +9 -9
  16. package/{esm2020 → esm2022}/lib/Shared/Enums/InputType.mjs +9 -9
  17. package/{esm2020 → esm2022}/lib/Shared/Enums/Insert.mjs +8 -8
  18. package/{esm2020 → esm2022}/lib/Shared/Enums/LanguageMode.mjs +10 -10
  19. package/{esm2020 → esm2022}/lib/Shared/Enums/LanguageValidation.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/Shared/Enums/Misc.mjs +6 -6
  21. package/{esm2020 → esm2022}/lib/Shared/Enums/PagingActionMode.mjs +5 -5
  22. package/{esm2020 → esm2022}/lib/Shared/Enums/Para.mjs +8 -8
  23. package/{esm2020 → esm2022}/lib/Shared/Enums/PickerType.mjs +6 -6
  24. package/{esm2020 → esm2022}/lib/Shared/Enums/SelectMode.mjs +5 -5
  25. package/{esm2020 → esm2022}/lib/Shared/Enums/StartView.mjs +6 -6
  26. package/{esm2020 → esm2022}/lib/Shared/Enums/Style.mjs +7 -7
  27. package/{esm2020 → esm2022}/lib/Shared/Enums/StyleConfirmationMode.mjs +6 -6
  28. package/{esm2020 → esm2022}/lib/Shared/Enums/TagInputView.mjs +6 -6
  29. package/{esm2020 → esm2022}/lib/Shared/Enums/menu-list-enum.mjs +5 -5
  30. package/{esm2020 → esm2022}/lib/Shared/Models/Attribute.mjs +2 -2
  31. package/{esm2020 → esm2022}/lib/Shared/Models/AutocompleteDTO.mjs +7 -7
  32. package/{esm2020 → esm2022}/lib/Shared/Models/AutocompleteOptions.mjs +23 -23
  33. package/{esm2020 → esm2022}/lib/Shared/Models/CalendarEventDTO.mjs +2 -2
  34. package/{esm2020 → esm2022}/lib/Shared/Models/CalendarOptions.mjs +18 -18
  35. package/{esm2020 → esm2022}/lib/Shared/Models/CancelDTO.mjs +6 -6
  36. package/{esm2020 → esm2022}/lib/Shared/Models/CaptchaStyle.mjs +2 -2
  37. package/{esm2020 → esm2022}/lib/Shared/Models/CheckBoxOptions.mjs +10 -10
  38. package/{esm2020 → esm2022}/lib/Shared/Models/ConfirmationModalOptions.mjs +38 -38
  39. package/{esm2020 → esm2022}/lib/Shared/Models/ControlOptionsBase.mjs +12 -12
  40. package/{esm2020 → esm2022}/lib/Shared/Models/CustomValidation.mjs +13 -13
  41. package/{esm2020 → esm2022}/lib/Shared/Models/DropdownListItem.mjs +2 -2
  42. package/{esm2020 → esm2022}/lib/Shared/Models/DropdownOptions.mjs +15 -15
  43. package/{esm2020 → esm2022}/lib/Shared/Models/EditPersonalImage.mjs +6 -6
  44. package/{esm2020 → esm2022}/lib/Shared/Models/EnglishArabicDTO.mjs +10 -10
  45. package/{esm2020 → esm2022}/lib/Shared/Models/FileDTO.mjs +1 -1
  46. package/{esm2020 → esm2022}/lib/Shared/Models/FileUploadModel.mjs +2 -2
  47. package/{esm2020 → esm2022}/lib/Shared/Models/FileUploadOptions.mjs +10 -10
  48. package/{esm2020 → esm2022}/lib/Shared/Models/FilterItem.mjs +7 -7
  49. package/{esm2020 → esm2022}/lib/Shared/Models/FormOptions.mjs +27 -27
  50. package/{esm2020 → esm2022}/lib/Shared/Models/HtmlEditorOptions.mjs +11 -11
  51. package/{esm2020 → esm2022}/lib/Shared/Models/ImageUploadOptions.mjs +13 -13
  52. package/{esm2020 → esm2022}/lib/Shared/Models/MapAutoCompleteOptions.mjs +3 -3
  53. package/{esm2020 → esm2022}/lib/Shared/Models/MapAutocompleteDTO.mjs +5 -5
  54. package/{esm2020 → esm2022}/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +8 -8
  55. package/{esm2020 → esm2022}/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +8 -8
  56. package/{esm2020 → esm2022}/lib/Shared/Models/MultilingualControlOptionsBase.mjs +15 -15
  57. package/{esm2020 → esm2022}/lib/Shared/Models/MultilingualTextBoxOptions.mjs +13 -13
  58. package/{esm2020 → esm2022}/lib/Shared/Models/MultipleFileUploadModel.mjs +8 -8
  59. package/{esm2020 → esm2022}/lib/Shared/Models/PagingDTO.mjs +12 -12
  60. package/{esm2020 → esm2022}/lib/Shared/Models/PagingOptions.mjs +46 -46
  61. package/{esm2020 → esm2022}/lib/Shared/Models/PagingPayload.mjs +2 -2
  62. package/{esm2020 → esm2022}/lib/Shared/Models/PhoneOptions.mjs +12 -12
  63. package/{esm2020 → esm2022}/lib/Shared/Models/ProfileImageUploadOptions.mjs +10 -10
  64. package/{esm2020 → esm2022}/lib/Shared/Models/ProfilePictureDTO.mjs +2 -2
  65. package/{esm2020 → esm2022}/lib/Shared/Models/RadioButtonItem.mjs +2 -2
  66. package/{esm2020 → esm2022}/lib/Shared/Models/RadioButtonOptions.mjs +3 -3
  67. package/{esm2020 → esm2022}/lib/Shared/Models/RangeNumber.mjs +2 -2
  68. package/{esm2020 → esm2022}/lib/Shared/Models/Recaptcha.mjs +5 -5
  69. package/{esm2020 → esm2022}/lib/Shared/Models/RecaptchaOptions.mjs +21 -21
  70. package/{esm2020 → esm2022}/lib/Shared/Models/RepeaterField.mjs +2 -2
  71. package/{esm2020 → esm2022}/lib/Shared/Models/RepeaterOptions.mjs +12 -12
  72. package/{esm2020 → esm2022}/lib/Shared/Models/SaveDTO.mjs +6 -6
  73. package/{esm2020 → esm2022}/lib/Shared/Models/TagsInputDTO.mjs +2 -2
  74. package/{esm2020 → esm2022}/lib/Shared/Models/TagsInputOptions.mjs +40 -40
  75. package/{esm2020 → esm2022}/lib/Shared/Models/TextAreaOptions.mjs +3 -3
  76. package/{esm2020 → esm2022}/lib/Shared/Models/TextBoxOptions.mjs +22 -22
  77. package/{esm2020 → esm2022}/lib/Shared/Models/ToggleslideOptions.mjs +8 -8
  78. package/{esm2020 → esm2022}/lib/Shared/Models/UploadPersonalImage.mjs +6 -6
  79. package/{esm2020 → esm2022}/lib/Shared/Models/bread-crumb.mjs +7 -7
  80. package/{esm2020 → esm2022}/lib/Shared/Models/control-filter-Item.mjs +5 -5
  81. package/{esm2020 → esm2022}/lib/Shared/Models/datePickerOptions.mjs +22 -22
  82. package/{esm2020 → esm2022}/lib/Shared/Models/filter-options.mjs +8 -8
  83. package/{esm2020 → esm2022}/lib/Shared/Models/page-header-options.mjs +77 -77
  84. package/{esm2020 → esm2022}/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +21 -21
  85. package/{esm2020 → esm2022}/lib/Shared/Pipes/bbsf-date.pipe.mjs +21 -21
  86. package/{esm2020 → esm2022}/lib/Shared/config/environment.mjs +11 -11
  87. package/{esm2020 → esm2022}/lib/Shared/default_intl.mjs +29 -29
  88. package/{esm2020 → esm2022}/lib/Shared/services/ControlUtility.mjs +162 -162
  89. package/{esm2020 → esm2022}/lib/Shared/services/GlobalSettings.service.mjs +30 -30
  90. package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +24 -0
  91. package/{esm2020 → esm2022}/lib/Shared/services/render-component-service.service.mjs +30 -30
  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/{esm2020 → esm2022}/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +136 -136
  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/{esm2020 → esm2022}/lib/controls/Form/Form.component.mjs +101 -101
  101. package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +226 -0
  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/{esm2020 → esm2022}/lib/controls/Paging/JwPagination.component.mjs +121 -121
  108. package/{esm2020 → esm2022}/lib/controls/Paging/Paging.component.mjs +312 -312
  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/{esm2020 → esm2022}/lib/controls/Recaptcha/Recaptcha.component.mjs +135 -135
  113. package/{esm2020 → esm2022}/lib/controls/Repeater/repeater/repeater.component.mjs +125 -125
  114. package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +750 -750
  115. package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +21 -21
  116. package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +108 -108
  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/{esm2020 → esm2022}/lib/controls/page-header-component/page-header-component.component.mjs +37 -37
  123. package/{esm2020 → esm2022}/public-api.mjs +130 -130
  124. package/{fesm2020 → fesm2022}/bnsights-bbsf-controls.mjs +8718 -8735
  125. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -0
  126. package/index.d.ts +5 -5
  127. package/lib/Shared/Components/app-base-component.d.ts +58 -58
  128. package/lib/Shared/Components/ng-tag-input.d.ts +50 -50
  129. package/lib/Shared/Directives/template-name.directive.d.ts +9 -9
  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 -10
  209. package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +10 -10
  210. package/lib/Shared/config/environment.d.ts +1 -1
  211. package/lib/Shared/default_intl.d.ts +21 -21
  212. package/lib/Shared/services/ControlUtility.d.ts +32 -32
  213. package/lib/Shared/services/GlobalSettings.service.d.ts +17 -17
  214. package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +10 -10
  215. package/lib/Shared/services/render-component-service.service.d.ts +10 -10
  216. package/lib/Shared/services/validationErrorMassage.service.d.ts +14 -14
  217. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +59 -59
  218. package/lib/controls/Calendar/Calendar.component.d.ts +42 -42
  219. package/lib/controls/CheckBox/CheckBox.component.d.ts +37 -37
  220. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +29 -29
  221. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +61 -61
  222. package/lib/controls/DropdownList/DropdownList.component.d.ts +55 -55
  223. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +58 -58
  224. package/lib/controls/Form/Form.component.d.ts +28 -28
  225. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +49 -49
  226. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +70 -70
  227. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +49 -54
  228. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +65 -65
  229. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +74 -74
  230. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +73 -73
  231. package/lib/controls/Paging/JwPagination.component.d.ts +27 -27
  232. package/lib/controls/Paging/Paging.component.d.ts +57 -57
  233. package/lib/controls/Phone/Phone.component.d.ts +43 -43
  234. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +69 -69
  235. package/lib/controls/RadioButton/RadioButton.component.d.ts +37 -37
  236. package/lib/controls/Recaptcha/Recaptcha.component.d.ts +41 -41
  237. package/lib/controls/Repeater/repeater/repeater.component.d.ts +29 -29
  238. package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +23 -23
  239. package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +11 -11
  240. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +19 -19
  241. package/lib/controls/TagsInput/TagsInput.component.d.ts +58 -58
  242. package/lib/controls/TextArea/TextArea.component.d.ts +51 -51
  243. package/lib/controls/TextBox/TextBox.component.d.ts +66 -66
  244. package/lib/controls/Toggleslide/toggleslide.component.d.ts +33 -33
  245. package/lib/controls/bbsf-controls.module.d.ts +68 -77
  246. package/lib/controls/page-header-component/page-header-component.component.d.ts +20 -20
  247. package/package.json +50 -63
  248. package/public-api.d.ts +117 -117
  249. package/src/lib/assets/Style.scss +4 -4
  250. package/esm2020/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
  251. package/esm2020/lib/Shared/services/validationErrorMassage.service.mjs +0 -170
  252. package/esm2020/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -262
  253. package/esm2020/lib/controls/Calendar/Calendar.component.mjs +0 -173
  254. package/esm2020/lib/controls/CheckBox/CheckBox.component.mjs +0 -117
  255. package/esm2020/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -223
  256. package/esm2020/lib/controls/DropdownList/DropdownList.component.mjs +0 -194
  257. package/esm2020/lib/controls/FileUplaod/FileUplaod.component.mjs +0 -447
  258. package/esm2020/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -226
  259. package/esm2020/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -350
  260. package/esm2020/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -325
  261. package/esm2020/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -427
  262. package/esm2020/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -429
  263. package/esm2020/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -428
  264. package/esm2020/lib/controls/Phone/Phone.component.mjs +0 -129
  265. package/esm2020/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -376
  266. package/esm2020/lib/controls/RadioButton/RadioButton.component.mjs +0 -109
  267. package/esm2020/lib/controls/TagsInput/TagsInput.component.mjs +0 -277
  268. package/esm2020/lib/controls/TextArea/TextArea.component.mjs +0 -196
  269. package/esm2020/lib/controls/TextBox/TextBox.component.mjs +0 -312
  270. package/esm2020/lib/controls/Toggleslide/toggleslide.component.mjs +0 -90
  271. package/esm2020/lib/controls/bbsf-controls.module.mjs +0 -361
  272. package/fesm2015/bnsights-bbsf-controls.mjs +0 -9159
  273. package/fesm2015/bnsights-bbsf-controls.mjs.map +0 -1
  274. package/fesm2020/bnsights-bbsf-controls.mjs.map +0 -1
@@ -0,0 +1,447 @@
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 { FileUploadModel } from '../../Shared/Models/FileUploadModel';
5
+ import { MultipleFileUploadModel } from '../../Shared/Models/MultipleFileUploadModel';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ import * as i2 from "../../Shared/services/ControlUtility";
9
+ import * as i3 from "@bnsights/bbsf-utilities";
10
+ import * as i4 from "../../Shared/services/GlobalSettings.service";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "ng2-file-upload";
13
+ import * as i7 from "ngx-intl-tel-input";
14
+ export class FileUploadComponent {
15
+ static { this.controlContainerstatic = null; }
16
+ constructor(controlContainer, MultipleFileUplaodControlHost, controlUtility, UtilityService, controlValidationService, globalSettings) {
17
+ this.controlContainer = controlContainer;
18
+ this.MultipleFileUplaodControlHost = MultipleFileUplaodControlHost;
19
+ this.controlUtility = controlUtility;
20
+ this.UtilityService = UtilityService;
21
+ this.controlValidationService = controlValidationService;
22
+ this.globalSettings = globalSettings;
23
+ this.OnChange = new EventEmitter();
24
+ this.ValidationMessage = '';
25
+ this.ValidationCountMessage = '';
26
+ this.AcceptedType = '';
27
+ this.AcceptedTypeArray = [];
28
+ this.ToolTipTypeArray = [];
29
+ this.markAllAsTouched = false;
30
+ this.validationRules = [];
31
+ this.validationRulesasync = [];
32
+ this.deletedFiles = [];
33
+ this.resetError = () => {
34
+ this.controlValidationService.removeGlobalError();
35
+ };
36
+ //External Method
37
+ this.RemoveRequiredValidation = () => {
38
+ this.controlUtility.RemoveRequiredValidation(this.fileUploadFormControl, this.validationRules, this.options);
39
+ };
40
+ //External Method
41
+ this.AddRequiredValidation = () => {
42
+ this.controlUtility.AddRequiredValidation(this.fileUploadFormControl, this.validationRules, this.options);
43
+ };
44
+ //External Method
45
+ this.RemoveCustomValidation = (CustomValidation) => {
46
+ this.controlUtility.RemoveCustomValidation(this.fileUploadFormControl, this.validationRules, CustomValidation);
47
+ };
48
+ //External Method
49
+ this.AddCustomValidation = (CustomValidation) => {
50
+ this.controlUtility.AddCustomValidation(this.fileUploadFormControl, this.validationRules, CustomValidation);
51
+ };
52
+ //External Method
53
+ this.IsValid = () => {
54
+ this.controlUtility.IsValid(this.fileUploadFormControl);
55
+ };
56
+ FileUploadComponent.controlContainerstatic = this.controlContainer;
57
+ this.uploader = new FileUploader({
58
+ disableMultipart: false, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
59
+ });
60
+ this.hasAnotherDropZoneOver = false;
61
+ }
62
+ ngOnInit() {
63
+ this.fileUploadModel = new FileUploadModel();
64
+ this.multipleFileUploadModel = new MultipleFileUploadModel();
65
+ if (!this.options.ViewType)
66
+ this.options.ViewType = this.globalSettings.ViewType;
67
+ if (this.options.Value == null) {
68
+ if (this.options.IsMultipleFile == true) {
69
+ //this.options.Value=this.multipleFileUploadModel
70
+ }
71
+ else {
72
+ // this.options.Value=this.fileUploadModel
73
+ }
74
+ }
75
+ else {
76
+ if (this.options.IsMultipleFile == true) {
77
+ let files = [];
78
+ this.multipleFileUploadModel.ExistingFiles =
79
+ this.options.Value.ExistingFiles;
80
+ this.multipleFileUploadModel.UploadedFiles = [];
81
+ for (let index = 0; index < this.options.Value.ExistingFiles.length; index++) {
82
+ const element = this.options.Value.ExistingFiles[index];
83
+ var bytes = new Uint8Array(element.Bytes);
84
+ var base64 = btoa(String.fromCharCode(null, bytes));
85
+ this.FileLikeObject = {
86
+ name: element.NameWithExtension,
87
+ type: element.MimeType,
88
+ rawFile: base64
89
+ };
90
+ // let blob: any;
91
+ // blob = new Blob(['']) as any;
92
+ // blob.name = element.FileName;
93
+ // blob.lastModifiedDate = null;
94
+ // blob.webkitRelativePath = '';
95
+ let file = this.FileLikeObject;
96
+ file.url = element.FileURL;
97
+ files.push(file);
98
+ }
99
+ this.uploader.addToQueue(files);
100
+ console.log(this.uploader.queue);
101
+ }
102
+ else {
103
+ const element = this.options.Value;
104
+ var bytes = new Uint8Array(element.Bytes);
105
+ var base64 = btoa(String.fromCharCode(null, bytes));
106
+ this.FileLikeObject = {
107
+ name: element.NameWithExtension,
108
+ type: element.MimeType,
109
+ rawFile: base64,
110
+ };
111
+ this.file = element;
112
+ let file = this.FileLikeObject;
113
+ file.url = element.FileURL;
114
+ this.uploader.addToQueue([file]);
115
+ }
116
+ }
117
+ if (this.options.LabelKey != null && this.options.LabelKey != '')
118
+ this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
119
+ if (this.options.FileUploadAcceptsTypes != null &&
120
+ this.options.FileUploadAcceptsTypes.length > 0) {
121
+ for (let index = 0; index < this.options.FileUploadAcceptsTypes.length; index++) {
122
+ const Type = this.options.FileUploadAcceptsTypes[index];
123
+ this.AcceptedType = this.AcceptedType + Type + ',';
124
+ }
125
+ this.AcceptedTypeArray = this.AcceptedType.split(',');
126
+ for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
127
+ const element = this.AcceptedTypeArray[index];
128
+ for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
129
+ const element = this.AcceptedTypeArray[index];
130
+ switch (element) {
131
+ case 'application/pdf':
132
+ if (!this.ToolTipTypeArray.includes('PDF'))
133
+ this.ToolTipTypeArray.push('PDF');
134
+ break;
135
+ case 'application/msword':
136
+ if (!this.ToolTipTypeArray.includes('Word'))
137
+ this.ToolTipTypeArray.push('Word');
138
+ break;
139
+ case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
140
+ if (!this.ToolTipTypeArray.includes('Word'))
141
+ this.ToolTipTypeArray.push('Word');
142
+ break;
143
+ case 'application/vnd.ms-excel':
144
+ if (!this.ToolTipTypeArray.includes('Excel'))
145
+ this.ToolTipTypeArray.push('Excel');
146
+ break;
147
+ case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
148
+ if (!this.ToolTipTypeArray.includes('Excel'))
149
+ this.ToolTipTypeArray.push('Excel');
150
+ break;
151
+ case 'application/vnd.ms-powerpoint':
152
+ if (!this.ToolTipTypeArray.includes('PowerPoint'))
153
+ this.ToolTipTypeArray.push('PowerPoint');
154
+ break;
155
+ case 'applicationapplication/vnd.openxmlformats-officedocument.presentationml.presentation':
156
+ if (!this.ToolTipTypeArray.includes('PowerPoint'))
157
+ this.ToolTipTypeArray.push('PowerPoint');
158
+ break;
159
+ case "image/png":
160
+ if (!this.ToolTipTypeArray.includes('PNG'))
161
+ this.ToolTipTypeArray.push('PNG');
162
+ break;
163
+ case "image/bmp":
164
+ if (!this.ToolTipTypeArray.includes('BMP'))
165
+ this.ToolTipTypeArray.push('BMP');
166
+ break;
167
+ case "image/jpeg":
168
+ if (!this.ToolTipTypeArray.includes('JPEG'))
169
+ this.ToolTipTypeArray.push('JPEG');
170
+ break;
171
+ default:
172
+ break;
173
+ }
174
+ }
175
+ }
176
+ this.ValidationMessage =
177
+ this.ValidationMessage +
178
+ `${this.UtilityService.getResourceValue('Extensions')} (${this.ToolTipTypeArray}) `;
179
+ }
180
+ if (this.options.FileMaxSizeInMB > 0) {
181
+ this.ValidationMessage =
182
+ this.ValidationMessage +
183
+ `<br /> ${this.UtilityService.getResourceValue('FileMaxSizeInMB') + this.options.FileMaxSizeInMB} `;
184
+ }
185
+ if (this.options.MinNoOfFiles > 0) {
186
+ this.ValidationMessage =
187
+ this.ValidationMessage +
188
+ `<br /> ${this.UtilityService.getResourceValue("MinFileCountValidationKey") + this.options.MinNoOfFiles}`;
189
+ }
190
+ if (this.options.FileUploadAcceptsTypes != null &&
191
+ this.options.FileUploadAcceptsTypes.length > 0) {
192
+ }
193
+ this.group.addControl(this.options.Name, new FormControl(''));
194
+ this.fileUploadFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
195
+ if (this.options.CustomValidation.length > 0) {
196
+ let Validations = this.options.CustomValidation;
197
+ for (let index = 0; index < Validations.length; index++) {
198
+ const Validation = Validations[index];
199
+ this.validationRules.push(Validation.functionBody);
200
+ }
201
+ }
202
+ if (this.options.IsMultipleFile && this.options.MaxNoOfFiles > 0) {
203
+ this.ValidationCountMessage = `${this.UtilityService.getResourceValue('MaxFilesCount')} : ${this.options.MaxNoOfFiles}`;
204
+ }
205
+ if (this.options.IsRequired) {
206
+ this.validationRules.push(Validators.required);
207
+ }
208
+ this.fileUploadFormControl.setValidators(this.validationRules);
209
+ this.fileUploadFormControl.setAsyncValidators(this.validationRulesasync);
210
+ if (this.options.IsDisabled) {
211
+ this.fileUploadFormControl.disable();
212
+ }
213
+ this.MultipleFileUplaodControlHost.ngSubmit.subscribe((value) => {
214
+ this.group.markAllAsTouched();
215
+ this.markAllAsTouched = true;
216
+ });
217
+ this.fileUploadFormControl.setValue(this.options.Value);
218
+ }
219
+ ngAfterViewInit() {
220
+ if (this.options.AttributeList != null) {
221
+ var element = document.getElementById(this.options.Name);
222
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
223
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
224
+ }
225
+ }
226
+ }
227
+ showGlobalError() {
228
+ this.controlUtility.showGlobalError();
229
+ }
230
+ getErrorValidation(ErrorList) {
231
+ if (this.markAllAsTouched && this.group.invalid) {
232
+ this.showGlobalError();
233
+ this.markAllAsTouched = false;
234
+ }
235
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
236
+ }
237
+ fileOverAnother(event) {
238
+ this.hasAnotherDropZoneOver = event;
239
+ }
240
+ isHideInput() {
241
+ if (this.options.IsMultipleFile) {
242
+ if (this.options.MaxNoOfFiles != null &&
243
+ this.options.MaxNoOfFiles > 0 &&
244
+ this.options.MaxNoOfFiles == this.uploader.queue.length) {
245
+ return true;
246
+ }
247
+ }
248
+ else {
249
+ if (this.uploader.queue.length > 0) {
250
+ return true;
251
+ }
252
+ }
253
+ return false;
254
+ }
255
+ onFileChange() {
256
+ let FilesArray = [];
257
+ if (this.options.IsMultipleFile &&
258
+ this.options.MinNoOfFiles != null &&
259
+ this.options.MinNoOfFiles > 0 &&
260
+ this.options.MinNoOfFiles > this.uploader.queue.length) {
261
+ const formControl = this.fileUploadFormControl;
262
+ formControl.setErrors({
263
+ MinFileCountValidationKey: this.options.MinNoOfFiles,
264
+ });
265
+ formControl.markAsTouched();
266
+ this.uploader.queue = [];
267
+ return;
268
+ }
269
+ if (this.options.IsMultipleFile &&
270
+ this.options.MaxSizeForAllFilesInMB != null &&
271
+ this.options.MaxSizeForAllFilesInMB > 0) {
272
+ let AllSizeFile = 0;
273
+ for (let index = 0; index < this.uploader.queue.length; index++) {
274
+ const element = this.uploader.queue[index];
275
+ const file = element.file;
276
+ AllSizeFile = AllSizeFile + file.size;
277
+ }
278
+ const MaxSizeForAllFiles = this.options.MaxSizeForAllFilesInMB * 1000 * 1000;
279
+ if (AllSizeFile > MaxSizeForAllFiles) {
280
+ const formControl = this.fileUploadFormControl;
281
+ formControl.setErrors({
282
+ MaxSizeForAllFilesInMB: this.options.MaxSizeForAllFilesInMB + 'M',
283
+ });
284
+ formControl.markAsTouched();
285
+ this.uploader.queue = [];
286
+ return;
287
+ }
288
+ }
289
+ let AddedQueue = this.uploader.queue.filter((object) => object['some'].lastModified != null);
290
+ for (let index = 0; index < AddedQueue.length; index++) {
291
+ const element = AddedQueue[index];
292
+ const file = element.file;
293
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
294
+ if (file) {
295
+ const fileType = file.type;
296
+ if (file.size > maxFileSize) {
297
+ const formControl = this.fileUploadFormControl;
298
+ formControl.setErrors({
299
+ FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
300
+ });
301
+ formControl.markAsTouched();
302
+ this.uploader.queue = [];
303
+ return;
304
+ }
305
+ if (this.options.FileUploadAcceptsTypes != null &&
306
+ this.options.FileUploadAcceptsTypes.length > 0 &&
307
+ !(this.AcceptedTypeArray.includes(fileType.toUpperCase()) ||
308
+ this.AcceptedTypeArray.includes(fileType.toLowerCase()))) {
309
+ const formControl = this.fileUploadFormControl;
310
+ formControl.setErrors({ ToolTipTypeError: this.ToolTipTypeArray });
311
+ formControl.markAsTouched();
312
+ this.uploader.queue = [];
313
+ return;
314
+ }
315
+ let reader = new FileReader();
316
+ let fileObject = file.rawFile;
317
+ reader.readAsDataURL(fileObject);
318
+ reader.onload = () => {
319
+ let existingID_GUID = null;
320
+ if (!this.options.IsMultipleFile && this.file)
321
+ existingID_GUID =
322
+ this.file.NameWithExtension == file.name
323
+ ? this.file.ID_GUID
324
+ : null;
325
+ let AddedFile = {
326
+ FileName: file.name,
327
+ FileType: file.type,
328
+ FileBase64: reader.result.toString().split(',')[1],
329
+ FileSizeInMB: file.size / 1000 / 1000,
330
+ NameWithExtension: file.name,
331
+ ID_GUID: existingID_GUID,
332
+ };
333
+ if (this.options.IsMultipleFile == false) {
334
+ this.fileUploadModel = new FileUploadModel();
335
+ this.fileUploadModel.File = AddedFile;
336
+ this.fileUploadFormControl.setValue(this.fileUploadModel);
337
+ this.group.get(this.options.Name).setValue(this.fileUploadModel);
338
+ //Use this line to enable two way binding.
339
+ this.options.Value = this.fileUploadModel;
340
+ }
341
+ else {
342
+ FilesArray.push(AddedFile);
343
+ this.multipleFileUploadModel.UploadedFiles = FilesArray;
344
+ if (this.options.Value != null && this.options.Value != undefined) {
345
+ if (this.options.Value.CorrelationID_GUID == null) {
346
+ this.multipleFileUploadModel.RemovedFiles = [];
347
+ }
348
+ }
349
+ this.multipleFileUploadModel.CorrelationID_GUID = this.options.Value?.CorrelationID_GUID;
350
+ this.fileUploadFormControl.setValue(this.multipleFileUploadModel);
351
+ this.group
352
+ .get(this.options.Name)
353
+ .setValue(this.multipleFileUploadModel);
354
+ //Use this line to enable two way binding.
355
+ this.options.Value = this.multipleFileUploadModel;
356
+ }
357
+ };
358
+ let originalValue = this.group.get(this.options.Name).value;
359
+ if (this.options.PatchFunction &&
360
+ this.options.PatchPath &&
361
+ this.group.get(this.options.Name).valid) {
362
+ this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
363
+ }
364
+ this.OnChange.emit(originalValue);
365
+ }
366
+ }
367
+ }
368
+ removeFromControlValue(item) {
369
+ if (this.options.IsMultipleFile == false) {
370
+ this.fileUploadModel = null;
371
+ if (this.options.IsRequired == true) {
372
+ this.fileUploadFormControl.markAsTouched();
373
+ this.fileUploadFormControl.invalid;
374
+ }
375
+ this.group.get(this.options.Name).setValue(this.fileUploadModel);
376
+ this.options.Value = this.fileUploadModel;
377
+ }
378
+ else {
379
+ if (this.options.Value != null && this.options.Value != undefined) {
380
+ if (this.options.Value.CorrelationID_GUID == null) {
381
+ this.deletedFiles = [];
382
+ this.multipleFileUploadModel.RemovedFiles = [];
383
+ }
384
+ else {
385
+ if (this.multipleFileUploadModel.RemovedFiles.length == 0) {
386
+ let FileObject = item.file.rawFile;
387
+ let DeletedItem = this.multipleFileUploadModel.ExistingFiles.filter((Object) => Object.NameWithExtension == FileObject.name)[0];
388
+ this.multipleFileUploadModel.ExistingFiles =
389
+ this.multipleFileUploadModel.ExistingFiles.filter((Object) => Object.NameWithExtension != FileObject.name);
390
+ this.deletedFiles.push(DeletedItem);
391
+ this.multipleFileUploadModel.RemovedFiles.push(DeletedItem.ID_GUID);
392
+ }
393
+ else {
394
+ let FileObject = item.file.rawFile;
395
+ let deletedList = this.deletedFiles.filter((Object) => Object.NameWithExtension == FileObject.name);
396
+ if (deletedList.length == 0 || deletedList == undefined) {
397
+ let DeletedItem = this.multipleFileUploadModel.ExistingFiles.filter((Object) => Object.NameWithExtension == FileObject.name)[0];
398
+ this.multipleFileUploadModel.ExistingFiles =
399
+ this.multipleFileUploadModel.ExistingFiles.filter((Object) => Object.NameWithExtension != FileObject.name);
400
+ this.deletedFiles.push(DeletedItem);
401
+ this.multipleFileUploadModel.RemovedFiles.push(DeletedItem.ID_GUID);
402
+ }
403
+ }
404
+ }
405
+ }
406
+ else {
407
+ this.deletedFiles = [];
408
+ this.multipleFileUploadModel.RemovedFiles = [];
409
+ }
410
+ this.multipleFileUploadModel.UploadedFiles =
411
+ this.multipleFileUploadModel.UploadedFiles.filter((Object) => Object.NameWithExtension != item._file.name);
412
+ if ((this.multipleFileUploadModel.UploadedFiles == null ||
413
+ this.multipleFileUploadModel.UploadedFiles.length == 0) &&
414
+ this.options.IsRequired) {
415
+ const formControl = this.fileUploadFormControl;
416
+ formControl.setErrors({
417
+ MinFileCountValidationKey: this.options.MinNoOfFiles,
418
+ });
419
+ this.fileUploadFormControl.markAsTouched();
420
+ this.fileUploadFormControl.invalid;
421
+ }
422
+ this.multipleFileUploadModel.CorrelationID_GUID = this.options.Value?.CorrelationID_GUID;
423
+ this.fileUploadFormControl.setValue(this.multipleFileUploadModel);
424
+ this.group.get(this.options.Name).setValue(this.multipleFileUploadModel);
425
+ //Use this line to enable two way binding.
426
+ this.options.Value = this.multipleFileUploadModel;
427
+ }
428
+ }
429
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FileUploadComponent, deps: [{ token: i1.ControlContainer, optional: true }, { token: i1.FormGroupDirective }, { token: i2.ControlUtility }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
430
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: FileUploadComponent, selector: "BBSF-FileUplaod", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-file-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 ng2FileDrop class=\"bbsf-input-container {{options.ExtraClasses}}\"\r\n *ngIf=\"(options.IsDropZone)&&(!((options.IsMultipleFile==false)&&(uploader.queue.length)>0))&&!options.IsReadonly\"\r\n [ngClass]=\"{'another-file-over-class': hasAnotherDropZoneOver}\" (onFileDrop)=\"onFileChange()\" (fileOver)=\"fileOverAnother($event)\"\r\n [uploader]=\"uploader\" [accept]=\"AcceptedType\" (change)=\"onFileChange()\" id=\"{{options.Name}}\"\r\n multiple=\"{{options.IsMultipleFile?'multiple':''}}\" aria-describedby=\"email-error\" aria-invalid=\"true\" type=\"file\"\r\n formControlName=\"{{options.Name}}\" #fileInput [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n <div 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\"\r\n 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\"\r\n 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 text-center\">{{UtilityService.getResourceValue(\"DragAndDropHere\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"ValidationCountMessage &&options.IsMultipleFile &&options.MaxNoOfFiles>0\" [innerHTML]=\"ValidationCountMessage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"(!options.IsDropZone)&&!(isHideInput())&&!options.IsReadonly\" (click)=\"fileInput.click();\">\r\n <div 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\"\r\n 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\"\r\n 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 text-center\">{{UtilityService.getResourceValue(\"Upload\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"ValidationCountMessage &&options.IsMultipleFile &&options.MaxNoOfFiles>0\" [innerHTML]=\"ValidationCountMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"AcceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\" multiple=\"{{options.IsMultipleFile?'multiple':''}}\"\r\n name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\" (change)=\"onFileChange()\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\"\r\n id=\"{{options.Name}}\" aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.Name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly && !options.Value\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <a href=\"{{ item?.file?.rawFile }}\" class=\"btn btn-download-file btn-sm\" download>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\"></path>\r\n </svg>\r\n <span class=\"file-name\">{{ item?.file?.name }}</span>\r\n </a>\r\n <button *ngIf=\"!options.IsReadonly\" class=\"btn btn-download-file btn-sm btn-danger\" (click)=\"item.remove();removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(fileUploadFormControl.invalid && fileUploadFormControl.touched)\">\r\n {{getErrorValidation(fileUploadFormControl.errors|keyvalue)}}\r\n </div>\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\r\n</div>", 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: i6.FileDropDirective, selector: "[ng2FileDrop]", inputs: ["uploader"], outputs: ["fileOver", "onFileDrop"] }, { kind: "directive", type: i6.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }, { kind: "directive", type: i7.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }] }); }
431
+ }
432
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FileUploadComponent, decorators: [{
433
+ type: Component,
434
+ args: [{ selector: 'BBSF-FileUplaod', template: "<div class=\"form-group bbsf-control bbsf-file-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 ng2FileDrop class=\"bbsf-input-container {{options.ExtraClasses}}\"\r\n *ngIf=\"(options.IsDropZone)&&(!((options.IsMultipleFile==false)&&(uploader.queue.length)>0))&&!options.IsReadonly\"\r\n [ngClass]=\"{'another-file-over-class': hasAnotherDropZoneOver}\" (onFileDrop)=\"onFileChange()\" (fileOver)=\"fileOverAnother($event)\"\r\n [uploader]=\"uploader\" [accept]=\"AcceptedType\" (change)=\"onFileChange()\" id=\"{{options.Name}}\"\r\n multiple=\"{{options.IsMultipleFile?'multiple':''}}\" aria-describedby=\"email-error\" aria-invalid=\"true\" type=\"file\"\r\n formControlName=\"{{options.Name}}\" #fileInput [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n <div 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\"\r\n 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\"\r\n 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 text-center\">{{UtilityService.getResourceValue(\"DragAndDropHere\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"ValidationCountMessage &&options.IsMultipleFile &&options.MaxNoOfFiles>0\" [innerHTML]=\"ValidationCountMessage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"(!options.IsDropZone)&&!(isHideInput())&&!options.IsReadonly\" (click)=\"fileInput.click();\">\r\n <div 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\"\r\n 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\"\r\n 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 text-center\">{{UtilityService.getResourceValue(\"Upload\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"ValidationCountMessage &&options.IsMultipleFile &&options.MaxNoOfFiles>0\" [innerHTML]=\"ValidationCountMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"AcceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\" multiple=\"{{options.IsMultipleFile?'multiple':''}}\"\r\n name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\" (change)=\"onFileChange()\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\"\r\n id=\"{{options.Name}}\" aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.Name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly && !options.Value\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <a href=\"{{ item?.file?.rawFile }}\" class=\"btn btn-download-file btn-sm\" download>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\"></path>\r\n </svg>\r\n <span class=\"file-name\">{{ item?.file?.name }}</span>\r\n </a>\r\n <button *ngIf=\"!options.IsReadonly\" class=\"btn btn-download-file btn-sm btn-danger\" (click)=\"item.remove();removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(fileUploadFormControl.invalid && fileUploadFormControl.touched)\">\r\n {{getErrorValidation(fileUploadFormControl.errors|keyvalue)}}\r\n </div>\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\r\n</div>" }]
435
+ }], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
436
+ type: Optional
437
+ }] }, { type: i1.FormGroupDirective }, { type: i2.ControlUtility }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }], propDecorators: { fileInput: [{
438
+ type: ViewChild,
439
+ args: ['fileInput', { static: false }]
440
+ }], group: [{
441
+ type: Input
442
+ }], options: [{
443
+ type: Input
444
+ }], OnChange: [{
445
+ type: Output
446
+ }] } });
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVVwbGFvZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvRmlsZVVwbGFvZC9GaWxlVXBsYW9kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9GaWxlVXBsYW9kL0ZpbGVVcGxhb2QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFFVCxNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxHQUtYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLFlBQVksRUFBdUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7OztBQVl0RixNQUFNLE9BQU8sbUJBQW1CO2FBQ3ZCLDJCQUFzQixHQUFHLElBQUksQUFBUCxDQUFRO0lBMEJyQyxZQUNzQixnQkFBa0MsRUFDL0MsNkJBQWlELEVBQ2hELGNBQThCLEVBQy9CLGNBQThCLEVBQzdCLHdCQUFrRCxFQUNsRCxjQUE4QjtRQUxsQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQy9DLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBb0I7UUFDaEQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9CLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM3Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpCOUIsYUFB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S0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztTQUNuRDtJQUNILENBQUM7OEdBL2RVLG1CQUFtQjtrR0FBbkIsbUJBQW1CLGtQQ2xDaEMsdWxOQXNGTTs7MkZEcERPLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQStCeEIsUUFBUTt3TUF6QmdDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgVmFsaWRhdG9ycyxcclxuICBGb3JtR3JvdXAsXHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIENvbnRyb2xDb250YWluZXIsXHJcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZE9wdGlvbnMgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVVcGxvYWRPcHRpb25zJztcclxuaW1wb3J0IHsgQ29udHJvbFV0aWxpdHkgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvQ29udHJvbFV0aWxpdHknO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIsIEZpbGVMaWtlT2JqZWN0LCBGaWxlVXBsb2FkZXJPcHRpb25zIH0gZnJvbSAnbmcyLWZpbGUtdXBsb2FkJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZE1vZGVsIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9GaWxlVXBsb2FkTW9kZWwnO1xyXG5pbXBvcnQgeyBNdWx0aXBsZUZpbGVVcGxvYWRNb2RlbCB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvTXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICBVdGlsaXR5U2VydmljZSxcclxufSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9HbG9iYWxTZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaWxlRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9GaWxlRFRPJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLUZpbGVVcGxhb2QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9GaWxlVXBsYW9kLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyc3RhdGljID0gbnVsbDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcclxuXHJcbiAgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBGaWxlVXBsb2FkT3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGZpbGVVcGxvYWRGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIFZhbGlkYXRpb25NZXNzYWdlID0gJyc7XHJcbiAgVmFsaWRhdGlvbkNvdW50TWVzc2FnZSA9ICcnO1xyXG4gIHVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XHJcbiAgaGFzQW5vdGhlckRyb3Bab25lT3ZlcjogYm9vbGVhbjtcclxuICBBY2NlcHRlZFR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIEFjY2VwdGVkVHlwZUFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIFRvb2xUaXBUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgRmlsZUxpa2VPYmplY3Q6IEZpbGVMaWtlT2JqZWN0O1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2YWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG4gIGZpbGVVcGxvYWRNb2RlbDogRmlsZVVwbG9hZE1vZGVsO1xyXG4gIG11bHRpcGxlRmlsZVVwbG9hZE1vZGVsOiBNdWx0aXBsZUZpbGVVcGxvYWRNb2RlbDtcclxuICBmaWxlOiBhbnk7XHJcbiAgZGVsZXRlZEZpbGVzOiBGaWxlRFRPW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBwdWJsaWMgTXVsdGlwbGVGaWxlVXBsYW9kQ29udHJvbEhvc3Q6IEZvcm1Hcm91cERpcmVjdGl2ZSxcclxuICAgIHByaXZhdGUgY29udHJvbFV0aWxpdHk6IENvbnRyb2xVdGlsaXR5LFxyXG4gICAgcHVibGljIFV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlOiBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdsb2JhbFNldHRpbmdzOiBHbG9iYWxTZXR0aW5nc1xyXG4gICkge1xyXG4gICAgRmlsZVVwbG9hZENvbXBvbmVudC5jb250cm9sQ29udGFpbmVyc3RhdGljID0gdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICBkaXNhYmxlTXVsdGlwYXJ0OiBmYWxzZSwgLy8gJ0Rpc2FibGVNdWx0aXBhcnQnIG11c3QgYmUgJ3RydWUnIGZvciBmb3JtYXREYXRhRnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxyXG4gICAgfSBhcyBGaWxlVXBsb2FkZXJPcHRpb25zKTtcclxuICAgIHRoaXMuaGFzQW5vdGhlckRyb3Bab25lT3ZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRNb2RlbCA9IG5ldyBGaWxlVXBsb2FkTW9kZWwoKTtcclxuICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwgPSBuZXcgTXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwoKTtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLlZpZXdUeXBlKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuVmlld1R5cGUgPSB0aGlzLmdsb2JhbFNldHRpbmdzLlZpZXdUeXBlO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuVmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLklzTXVsdGlwbGVGaWxlID09IHRydWUpIHtcclxuICAgICAgICAvL3RoaXMub3B0aW9ucy5WYWx1ZT10aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcy5vcHRpb25zLlZhbHVlPXRoaXMuZmlsZVVwbG9hZE1vZGVsXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuSXNNdWx0aXBsZUZpbGUgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBmaWxlczogYW55W10gPSBbXTtcclxuICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLkV4aXN0aW5nRmlsZXMgPVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlLkV4aXN0aW5nRmlsZXM7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5VcGxvYWRlZEZpbGVzID0gW107XHJcbiAgICAgICAgZm9yIChcclxuICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICBpbmRleCA8IHRoaXMub3B0aW9ucy5WYWx1ZS5FeGlzdGluZ0ZpbGVzLmxlbmd0aDtcclxuICAgICAgICAgIGluZGV4KytcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuVmFsdWUuRXhpc3RpbmdGaWxlc1tpbmRleF07XHJcbiAgICAgICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShlbGVtZW50LkJ5dGVzKSBhcyBhbnk7XHJcbiAgICAgICAgICB2YXIgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKG51bGwsIGJ5dGVzKSk7XHJcbiAgICAgICAgICB0aGlzLkZpbGVMaWtlT2JqZWN0ID0gPEZpbGVMaWtlT2JqZWN0PntcclxuICAgICAgICAgICAgbmFtZTogZWxlbWVudC5OYW1lV2l0aEV4dGVuc2lvbixcclxuICAgICAgICAgICAgdHlwZTogZWxlbWVudC5NaW1lVHlwZSxcclxuICAgICAgICAgICAgcmF3RmlsZTogPGFueT5iYXNlNjRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICAvLyBsZXQgYmxvYjogYW55O1xyXG4gICAgICAgICAgLy8gYmxvYiA9IG5ldyBCbG9iKFsnJ10pIGFzIGFueTtcclxuICAgICAgICAgIC8vIGJsb2IubmFtZSA9IGVsZW1lbnQuRmlsZU5hbWU7XHJcbiAgICAgICAgICAvLyBibG9iLmxhc3RNb2RpZmllZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgLy8gYmxvYi53ZWJraXRSZWxhdGl2ZVBhdGggPSAnJztcclxuICAgICAgICAgIGxldCBmaWxlID0gdGhpcy5GaWxlTGlrZU9iamVjdCBhcyBhbnk7XHJcbiAgICAgICAgICBmaWxlLnVybCA9IGVsZW1lbnQuRmlsZVVSTDtcclxuICAgICAgICAgIGZpbGVzLnB1c2goZmlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBsb2FkZXIuYWRkVG9RdWV1ZShmaWxlcyk7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy51cGxvYWRlci5xdWV1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMub3B0aW9ucy5WYWx1ZTtcclxuICAgICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShlbGVtZW50LkJ5dGVzKSBhcyBhbnk7XHJcbiAgICAgICAgdmFyIGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZShudWxsLCBieXRlcykpO1xyXG4gICAgICAgIHRoaXMuRmlsZUxpa2VPYmplY3QgPSA8RmlsZUxpa2VPYmplY3Q+e1xyXG4gICAgICAgICAgbmFtZTogZWxlbWVudC5OYW1lV2l0aEV4dGVuc2lvbixcclxuICAgICAgICAgIHR5cGU6IGVsZW1lbnQuTWltZVR5cGUsXHJcbiAgICAgICAgICByYXdGaWxlOiA8YW55PmJhc2U2NCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZmlsZSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IGZpbGUgPSB0aGlzLkZpbGVMaWtlT2JqZWN0IGFzIGFueTtcclxuICAgICAgICBmaWxlLnVybCA9IGVsZW1lbnQuRmlsZVVSTDtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW2ZpbGUgYXMgYW55XSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkxhYmVsS2V5ICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkxhYmVsS2V5ICE9ICcnKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuTGFiZWxWYWx1ZSA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcclxuICAgICAgICB0aGlzLm9wdGlvbnMuTGFiZWxLZXlcclxuICAgICAgKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBpbmRleCA8IHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aDtcclxuICAgICAgICBpbmRleCsrXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IFR5cGUgPSB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy5BY2NlcHRlZFR5cGUgPSB0aGlzLkFjY2VwdGVkVHlwZSArIFR5cGUgKyAnLCc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5BY2NlcHRlZFR5cGVBcnJheSA9IHRoaXMuQWNjZXB0ZWRUeXBlLnNwbGl0KCcsJyk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLkFjY2VwdGVkVHlwZUFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLkFjY2VwdGVkVHlwZUFycmF5W2luZGV4XTtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5BY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLkFjY2VwdGVkVHlwZUFycmF5W2luZGV4XTtcclxuICAgICAgICAgIHN3aXRjaCAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9wZGYnOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5Ub29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdQREYnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKCdQREYnKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vbXN3b3JkJzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuVG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnV29yZCcpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Ub29sVGlwVHlwZUFycmF5LnB1c2goJ1dvcmQnKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5Ub29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdXb3JkJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLlRvb2xUaXBUeXBlQXJyYXkucHVzaCgnV29yZCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5Ub29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdFeGNlbCcpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Ub29sVGlwVHlwZUFycmF5LnB1c2goJ0V4Y2VsJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuVG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnRXhjZWwnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKCdFeGNlbCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCc6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLlRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ1Bvd2VyUG9pbnQnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKCdQb3dlclBvaW50Jyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbic6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLlRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ1Bvd2VyUG9pbnQnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKCdQb3dlclBvaW50Jyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZS9wbmdcIjpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuVG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnUE5HJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLlRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUE5HJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZS9ibXBcIjpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuVG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnQk1QJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLlRvb2xUaXBUeXBlQXJyYXkucHVzaCgnQk1QJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZS9qcGVnXCI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLlRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ0pQRUcnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKCdKUEVHJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgK1xyXG4gICAgICAgIGAke3RoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnRXh0ZW5zaW9ucycpfSAoJHt0aGlzLlRvb2xUaXBUeXBlQXJyYXlcclxuICAgICAgICB9KSBgO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUIgPiAwKSB7XHJcbiAgICAgIHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgK1xyXG4gICAgICAgIGA8YnIgLz4gICR7dGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdGaWxlTWF4U2l6ZUluTUInKSArIHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUJ9IGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5NaW5Ob09mRmlsZXMgPiAwKSB7XHJcbiAgICAgIHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgK1xyXG4gICAgICAgIGA8YnIgLz4gJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJNaW5GaWxlQ291bnRWYWxpZGF0aW9uS2V5XCIpICsgdGhpcy5vcHRpb25zLk1pbk5vT2ZGaWxlc31gO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMuTmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCA9IHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb247XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc011bHRpcGxlRmlsZSAmJiB0aGlzLm9wdGlvbnMuTWF4Tm9PZkZpbGVzID4gMCkge1xyXG4gICAgICB0aGlzLlZhbGlkYXRpb25Db3VudE1lc3NhZ2UgPSBgJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ01heEZpbGVzQ291bnQnKX0gOiAke3RoaXMub3B0aW9ucy5NYXhOb09mRmlsZXN9YDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGlvblJ1bGVzYXN5bmMpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLk11bHRpcGxlRmlsZVVwbGFvZENvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMuVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS5LZXksXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEVycm9yID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UucmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9O1xyXG5cclxuICBzaG93R2xvYmFsRXJyb3IoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnNob3dHbG9iYWxFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JWYWxpZGF0aW9uKEVycm9yTGlzdCkge1xyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbFV0aWxpdHkuZ2V0RXJyb3JWYWxpZGF0aW9uTWFzc2FnZShcclxuICAgICAgRXJyb3JMaXN0LFxyXG4gICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmaWxlT3ZlckFub3RoZXIoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNBbm90aGVyRHJvcFpvbmVPdmVyID0gZXZlbnQ7XHJcbiAgfVxyXG4gIGlzSGlkZUlucHV0KCkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc011bHRpcGxlRmlsZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLk1heE5vT2ZGaWxlcyAhPSBudWxsICYmXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLk1heE5vT2ZGaWxlcyA+IDAgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMuTWF4Tm9PZkZpbGVzID09IHRoaXMudXBsb2FkZXIucXVldWUubGVuZ3RoXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy51cGxvYWRlci5xdWV1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgb25GaWxlQ2hhbmdlKCkge1xyXG4gICAgbGV0IEZpbGVzQXJyYXkgPSBbXTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLklzTXVsdGlwbGVGaWxlICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5NaW5Ob09mRmlsZXMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuTWluTm9PZkZpbGVzID4gMCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuTWluTm9PZkZpbGVzID4gdGhpcy51cGxvYWRlci5xdWV1ZS5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xyXG4gICAgICAgIE1pbkZpbGVDb3VudFZhbGlkYXRpb25LZXk6IHRoaXMub3B0aW9ucy5NaW5Ob09mRmlsZXMsXHJcbiAgICAgIH0pO1xyXG4gICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMudXBsb2FkZXIucXVldWUgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLklzTXVsdGlwbGVGaWxlICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5NYXhTaXplRm9yQWxsRmlsZXNJbk1CICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLk1heFNpemVGb3JBbGxGaWxlc0luTUIgPiAwXHJcbiAgICApIHtcclxuICAgICAgbGV0IEFsbFNpemVGaWxlID0gMDtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudXBsb2FkZXIucXVldWUubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudXBsb2FkZXIucXVldWVbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBlbGVtZW50LmZpbGU7XHJcbiAgICAgICAgQWxsU2l6ZUZpbGUgPSBBbGxTaXplRmlsZSArIGZpbGUuc2l6ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBNYXhTaXplRm9yQWxsRmlsZXMgPVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5NYXhTaXplRm9yQWxsRmlsZXNJbk1CICogMTAwMCAqIDEwMDA7XHJcbiAgICAgIGlmIChBbGxTaXplRmlsZSA+IE1heFNpemVGb3JBbGxGaWxlcykge1xyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIE1heFNpemVGb3JBbGxGaWxlc0luTUI6IHRoaXMub3B0aW9ucy5NYXhTaXplRm9yQWxsRmlsZXNJbk1CICsgJ00nLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgQWRkZWRRdWV1ZSA9IHRoaXMudXBsb2FkZXIucXVldWUuZmlsdGVyKFxyXG4gICAgICAob2JqZWN0KSA9PiBvYmplY3RbJ3NvbWUnXS5sYXN0TW9kaWZpZWQgIT0gbnVsbFxyXG4gICAgKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBBZGRlZFF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gQWRkZWRRdWV1ZVtpbmRleF07XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBlbGVtZW50LmZpbGU7XHJcbiAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbDtcclxuICAgICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICAgIEZpbGVNYXhTaXplSW5NQjogdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiArICdNJyxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAhKFxyXG4gICAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvVXBwZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkuaW5jbHVkZXMoZmlsZVR5cGUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoeyBUb29sVGlwVHlwZUVycm9yOiB0aGlzLlRvb2xUaXBUeXBlQXJyYXkgfSk7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIGxldCBmaWxlT2JqZWN0ID0gZmlsZS5yYXdGaWxlIGFzIGFueTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlT2JqZWN0KTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGV4aXN0aW5nSURfR1VJRCA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5Jc011bHRpcGxlRmlsZSAmJiB0aGlzLmZpbGUpXHJcbiAgICAgICAgICAgIGV4aXN0aW5nSURfR1VJRCA9XHJcbiAgICAgICAgICAgICAgdGhpcy5maWxlLk5hbWVXaXRoRXh0ZW5zaW9uID09IGZpbGUubmFtZVxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmZpbGUuSURfR1VJRFxyXG4gICAgICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICAgIGxldCBBZGRlZEZpbGUgPSB7XHJcbiAgICAgICAgICAgIEZpbGVOYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgICAgICAgIEZpbGVUeXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgICAgIEZpbGVCYXNlNjQ6IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdLFxyXG4gICAgICAgICAgICBGaWxlU2l6ZUluTUI6IGZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgICBOYW1lV2l0aEV4dGVuc2lvbjogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICBJRF9HVUlEOiBleGlzdGluZ0lEX0dVSUQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5Jc011bHRpcGxlRmlsZSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRNb2RlbCA9IG5ldyBGaWxlVXBsb2FkTW9kZWwoKTtcclxuICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwuRmlsZSA9IEFkZGVkRmlsZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKHRoaXMuZmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgLy9Vc2UgdGhpcyBsaW5lIHRvIGVuYWJsZSB0d28gd2F5IGJpbmRpbmcuXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IHRoaXMuZmlsZVVwbG9hZE1vZGVsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgRmlsZXNBcnJheS5wdXNoKEFkZGVkRmlsZSk7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuVXBsb2FkZWRGaWxlcyA9IEZpbGVzQXJyYXk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuVmFsdWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuVmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZS5Db3JyZWxhdGlvbklEX0dVSUQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5SZW1vdmVkRmlsZXMgPSBbXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5Db3JyZWxhdGlvbklEX0dVSUQgPSB0aGlzLm9wdGlvbnMuVmFsdWU/LkNvcnJlbGF0aW9uSURfR1VJRFxyXG4gICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFxyXG4gICAgICAgICAgICAgIC5nZXQodGhpcy5vcHRpb25zLk5hbWUpXHJcbiAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uICYmXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoICYmXHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsaWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0Y2hDb250cm9sVmFsdWUoXHJcbiAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLk9uQ2hhbmdlLmVtaXQob3JpZ2luYWxWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShpdGVtKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLklzTXVsdGlwbGVGaWxlID09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZE1vZGVsID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkID09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUodGhpcy5maWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuVmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRNb2RlbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuVmFsdWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuVmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZS5Db3JyZWxhdGlvbklEX0dVSUQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVkRmlsZXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuUmVtb3ZlZEZpbGVzID0gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLlJlbW92ZWRGaWxlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBsZXQgRmlsZU9iamVjdCA9IGl0ZW0uZmlsZS5yYXdGaWxlO1xyXG4gICAgICAgICAgICBsZXQgRGVsZXRlZEl0ZW0gPSB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLkV4aXN0aW5nRmlsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChPYmplY3QpID0+IE9iamVjdC5OYW1lV2l0aEV4dGVuc2lvbiA9PSBGaWxlT2JqZWN0Lm5hbWVcclxuICAgICAgICAgICAgKVswXTtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5FeGlzdGluZ0ZpbGVzID1cclxuICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLkV4aXN0aW5nRmlsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgKE9iamVjdCkgPT4gT2JqZWN0Lk5hbWVXaXRoRXh0ZW5zaW9uICE9IEZpbGVPYmplY3QubmFtZVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZEZpbGVzLnB1c2goRGVsZXRlZEl0ZW0pO1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLlJlbW92ZWRGaWxlcy5wdXNoKERlbGV0ZWRJdGVtLklEX0dVSUQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IEZpbGVPYmplY3QgPSBpdGVtLmZpbGUucmF3RmlsZTtcclxuICAgICAgICAgICAgbGV0IGRlbGV0ZWRMaXN0ID0gdGhpcy5kZWxldGVkRmlsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChPYmplY3QpID0+IE9iamVjdC5OYW1lV2l0aEV4dGVuc2lvbiA9PSBGaWxlT2JqZWN0Lm5hbWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGRlbGV0ZWRMaXN0Lmxlbmd0aCA9PSAwIHx8IGRlbGV0ZWRMaXN0ID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIGxldCBEZWxldGVkSXRlbSA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLkV4aXN0aW5nRmlsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoT2JqZWN0KSA9PiBPYmplY3QuTmFtZVdpdGhFeHRlbnNpb24gPT0gRmlsZU9iamVjdC5uYW1lXHJcbiAgICAgICAgICAgICAgICApWzBdO1xyXG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuRXhpc3RpbmdGaWxlcyA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLkV4aXN0aW5nRmlsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoT2JqZWN0KSA9PiBPYmplY3QuTmFtZVdpdGhFeHRlbnNpb24gIT0gRmlsZU9iamVjdC5uYW1lXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGVsZXRlZEZpbGVzLnB1c2goRGVsZXRlZEl0ZW0pO1xyXG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuUmVtb3ZlZEZpbGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICBEZWxldGVkSXRlbS5JRF9HVUlEXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRlbGV0ZWRGaWxlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuUmVtb3ZlZEZpbGVzID0gW107XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5VcGxvYWRlZEZpbGVzID1cclxuICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLlVwbG9hZGVkRmlsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgKE9iamVjdCkgPT4gT2JqZWN0Lk5hbWVXaXRoRXh0ZW5zaW9uICE9IGl0ZW0uX2ZpbGUubmFtZVxyXG4gICAgICAgICk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAodGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5VcGxvYWRlZEZpbGVzID09IG51bGwgfHxcclxuICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuVXBsb2FkZWRGaWxlcy5sZW5ndGggPT0gMCkgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZFxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICBNaW5GaWxlQ291bnRWYWxpZGF0aW9uS2V5OiB0aGlzLm9wdGlvbnMuTWluTm9PZkZpbGVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuQ29ycmVsYXRpb25JRF9HVUlEID0gdGhpcy5vcHRpb25zLlZhbHVlPy5Db3JyZWxhdGlvbklEX0dVSURcclxuICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgLy9Vc2UgdGhpcyBsaW5lIHRvIGVuYWJsZSB0d28gd2F5IGJpbmRpbmcuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLFxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcyxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZFJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICBDdXN0b21WYWxpZGF0aW9uXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICBDdXN0b21WYWxpZGF0aW9uXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBJc1ZhbGlkID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Jc1ZhbGlkKHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sKTtcclxuICB9O1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGJic2YtY29udHJvbCBiYnNmLWZpbGUtdXBsb2FkXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMuVmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgPCEtLWxhYmVsLS0+XHJcbiAgICA8bGFiZWwgW2hpZGRlbl09XCJvcHRpb25zLkhpZGVMYWJlbFwiIGNsYXNzPVwiYmJzZi1sYWJlbCB7e29wdGlvbnMuTGFiZWxFeHRyYUNsYXNzZXN9fVwiPlxyXG4gICAgICB7e29wdGlvbnMuTGFiZWxWYWx1ZX19XHJcbiAgICAgIDwhLS1Bc3Rlcmlzay0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIigob3B0aW9ucy5TaG93QXN0ZXJpc2smJm9wdGlvbnMuSXNSZXF1aXJlZCl8fChvcHRpb25zLklzUmVxdWlyZWQpKSYmIW9wdGlvbnMuSXNSZWFkb25seVwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDwhLS1BbGxvdyBkcm9wWm9uZS0tPlxyXG4gICAgPGRpdiBuZzJGaWxlRHJvcCBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiXHJcbiAgICAgICpuZ0lmPVwiKG9wdGlvbnMuSXNEcm9wWm9uZSkmJighKChvcHRpb25zLklzTXVsdGlwbGVGaWxlPT1mYWxzZSkmJih1cGxvYWRlci5xdWV1ZS5sZW5ndGgpPjApKSYmIW9wdGlvbnMuSXNSZWFkb25seVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnYW5vdGhlci1maWxlLW92ZXItY2xhc3MnOiBoYXNBbm90aGVyRHJvcFpvbmVPdmVyfVwiIChvbkZpbGVEcm9wKT1cIm9uRmlsZUNoYW5nZSgpXCIgKGZpbGVPdmVyKT1cImZpbGVPdmVyQW5vdGhlcigkZXZlbnQpXCJcclxuICAgICAgW3VwbG9hZGVyXT1cInVwbG9hZGVyXCIgW2FjY2VwdF09XCJBY2NlcHRlZFR5cGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgpXCIgaWQ9XCJ7e29wdGlvbnMuTmFtZX19XCJcclxuICAgICAgbXVsdGlwbGU9XCJ7e29wdGlvbnMuSXNNdWx0aXBsZUZpbGU/J211bHRpcGxlJzonJ319XCIgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCIgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIHR5cGU9XCJmaWxlXCJcclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tvcHRpb25zLk5hbWV9fVwiICNmaWxlSW5wdXQgW2NsYXNzLmlzLWludmFsaWRdPVwiZmlsZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgZmlsZVVwbG9hZEZvcm1Db250cm9sLnRvdWNoZWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3B6b25lLWxhYmVsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN2Zy1hbmQtdmFsaWRhdGlvblwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4O1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBvcGFjaXR5PVwiMC4zXCJcclxuICAgICAgICAgICAgICBkPVwiTTUgMTZDMy4zIDE2IDIgMTQuNyAyIDEzQzIgMTEuMyAzLjMgMTAgNSAxMEg1LjFDNSA5LjcgNSA5LjMgNSA5QzUgNi4yIDcuMiA0IDEwIDRDMTEuOSA0IDEzLjUgNSAxNC4zIDYuNUMxNC44IDYuMiAxNS40IDYgMTYgNkMxNy43IDYgMTkgNy4zIDE5IDlDMTkgOS40IDE4LjkgOS43IDE4LjggMTBDMTguOSAxMCAxOC45IDEwIDE5IDEwQzIwLjcgMTAgMjIgMTEuMyAyMiAxM0MyMiAxNC43IDIwLjcgMTYgMTkgMTZINVpNOCAxMy42SDE2TDEyLjcgMTAuM0MxMi4zIDkuODk5OTkgMTEuNyA5Ljg5OTk5IDExLjMgMTAuM0w4IDEzLjZaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjYTFhMWExO1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMSAxMy42VjE5QzExIDE5LjYgMTEuNCAyMCAxMiAyMEMxMi42IDIwIDEzIDE5LjYgMTMgMTlWMTMuNkgxMVpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjOTg5ODk4O1wiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgdGV4dC1jZW50ZXJcIj57e1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEcmFnQW5kRHJvcEhlcmVcIil9fSA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnIHRleHQtY2VudGVyXCIgKm5nSWY9XCJWYWxpZGF0aW9uTWVzc2FnZVwiIFtpbm5lckhUTUxdPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnIG5nLXN0YXItaW5zZXJ0ZWQgdGV4dC1jZW50ZXIgdGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIlZhbGlkYXRpb25Db3VudE1lc3NhZ2UgJiZvcHRpb25zLklzTXVsdGlwbGVGaWxlICYmb3B0aW9ucy5NYXhOb09mRmlsZXM+MFwiIFtpbm5lckhUTUxdPVwiVmFsaWRhdGlvbkNvdW50TWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLU5vdCBhbGxvd2VkIGRyb3Bab25lLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cIighb3B0aW9ucy5Jc0Ryb3Bab25lKSYmIShpc0hpZGVJbnB1dCgpKSYmIW9wdGlvbnMuSXNSZWFkb25seVwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKTtcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3B6b25lLWxhYmVsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN2Zy1hbmQtdmFsaWRhdGlvblwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4O1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBvcGFjaXR5PVwiMC4zXCJcclxuICAgICAgICAgICAgICBkPVwiTTUgMTZDMy4zIDE2IDIgMTQuNyAyIDEzQzIgMTEuMyAzLjMgMTAgNSAxMEg1LjFDNSA5LjcgNSA5LjMgNSA5QzUgNi4yIDcuMiA0IDEwIDRDMTEuOSA0IDEzLjUgNSAxNC4zIDYuNUMxNC44IDYuMiAxNS40IDYgMTYgNkMxNy43IDYgMTkgNy4zIDE5IDlDMTkgOS40IDE4LjkgOS43IDE4LjggMTBDMTguOSAxMCAxOC45IDEwIDE5IDEwQzIwLjcgMTAgMjIgMTEuMyAyMiAxM0MyMiAxNC43IDIwLjcgMTYgMTkgMTZINVpNOCAxMy42SDE2TDEyLjcgMTAuM0MxMi4zIDkuODk5OTkgMTEuNyA5Ljg5OTk5IDExLjMgMTAuM0w4IDEzLjZaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjYTFhMWExO1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMSAxMy42VjE5QzExIDE5LjYgMTEuNCAyMCAxMiAyMEMxMi42IDIwIDEzIDE5LjYgMTMgMTlWMTMuNkgxMVpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjOTg5ODk4O1wiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgIHRleHQtY2VudGVyXCI+e3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiVXBsb2FkXCIpfX0gPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyAgdGV4dC1jZW50ZXJcIiAqbmdJZj1cIlZhbGlkYXRpb25NZXNzYWdlXCIgW2lubmVySFRNTF09XCJWYWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgbmctc3Rhci1pbnNlcnRlZCB0ZXh0LWNlbnRlciB0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiVmFsaWRhdGlvbkNvdW50TWVzc2FnZSAmJm9wdGlvbnMuSXNNdWx0aXBsZUZpbGUgJiZvcHRpb25zLk1heE5vT2ZGaWxlcz4wXCIgW2lubmVySFRNTF09XCJWYWxpZGF0aW9uQ291bnRNZXNzYWdlXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8aW5wdXQgbmcyRmlsZVNlbGVjdCBbdXBsb2FkZXJdPVwidXBsb2FkZXJcIiBbYWNjZXB0XT1cIkFjY2VwdGVkVHlwZVwiXHJcbiAgICAgICAgY2xhc3M9XCJmaWxlU2VsZWN0b3IgY3VzdG9tRmlsZVVwbG9hZFBsYWNtZW50IGhpZGRlbiAgdi1yZXF1aXJlZC1tdWx0aXBsZWZpbGVzIGQtbm9uZVwiIG11bHRpcGxlPVwie3tvcHRpb25zLklzTXVsdGlwbGVGaWxlPydtdWx0aXBsZSc6Jyd9fVwiXHJcbiAgICAgICAgbmFtZT1cImZpbGVcIiB0eXBlPVwiZmlsZVwiIHZhbHVlPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoKVwiIFtuZ0NsYXNzXT1cIihvcHRpb25zLlZpZXdUeXBlPT0xKT8nJzonY29sLW1kLTknXCJcclxuICAgICAgICBpZD1cInt7b3B0aW9ucy5OYW1lfX1cIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIiBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwie3tvcHRpb25zLk5hbWV9fVwiICNmaWxlSW5wdXRcclxuICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJmaWxlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmaWxlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIHJlYWRvbmx5IC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIm9wdGlvbnMuSXNSZWFkb25seSAmJiAhb3B0aW9ucy5WYWx1ZVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZpZXdcIj57e1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ05BJyl9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS1pdGVtcyB1cGxvYWRlZC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ1cGxvYWRlZC1pdGVtc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVwbG9hZGVyLnF1ZXVlXCI+XHJcbiAgICAgIDxhIGhyZWY9XCJ7eyBpdGVtPy5maWxlPy5yYXdGaWxlIH19XCIgY2xhc3M9XCJidG4gYnRuLWRvd25sb2FkLWZpbGUgYnRuLXNtXCIgZG93bmxvYWQ+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTIxIDIySDNDMi40IDIyIDIgMjEuNiAyIDIxQzIgMjAuNCAyLjQgMjAgMyAyMEgyMUMyMS42IDIwIDIyIDIwLjQgMjIgMjFDMjIgMjEuNiAyMS42IDIyIDIxIDIyWk0xMyAxMy40VjNDMTMgMi40IDEyLjYgMiAxMiAyQzExLjQgMiAxMSAyLjQgMTEgM1YxMy40SDEzWlwiXHJcbiAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk03IDEzLjRIMTdMMTIuNyAxNy43QzEyLjMgMTguMSAxMS43IDE4LjEgMTEuMyAxNy43TDcgMTMuNFpcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1uYW1lXCI+e3sgaXRlbT8uZmlsZT8ubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPC9hPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIW9wdGlvbnMuSXNSZWFkb25seVwiIGNsYXNzPVwiYnRuIGJ0bi1kb3dubG9hZC1maWxlIGJ0bi1zbSBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cIml0ZW0ucmVtb3ZlKCk7cmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShpdGVtKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMgcHgtMFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgIDwhLS0gcmVxdWlyZWQgdGV4dC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiICpuZ0lmPVwiKGZpbGVVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkICYmIGZpbGVVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkKVwiPlxyXG4gICAgICB7e2dldEVycm9yVmFsaWRhdGlvbihmaWxlVXBsb2FkRm9ybUNvbnRyb2wuZXJyb3JzfGtleXZhbHVlKX19XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gTGFiZWxEZXNjcmlwdGlvbi0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtY29udHJvbC1kZXNjXCIgKm5nSWY9XCJvcHRpb25zLkxhYmVsRGVzY3JpcHRpb24hPW51bGxcIj4ge3tvcHRpb25zLkxhYmVsRGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpIFwiPnt7cmVzZXRFcnJvcigpfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PiJdfQ==