@messaia/cdk 18.2.3 → 19.0.0-rc01

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 (659) hide show
  1. package/fesm2022/messaia-cdk.mjs +1147 -932
  2. package/fesm2022/messaia-cdk.mjs.map +1 -1
  3. package/lib/base/components/base.component.d.ts +1 -1
  4. package/lib/base/components/generic-embedded-list.component.d.ts +1 -1
  5. package/lib/base/components/generic-form-base.component.d.ts +1 -1
  6. package/lib/base/components/generic-form.component.d.ts +1 -1
  7. package/lib/base/components/generic-list.component.d.ts +7 -3
  8. package/lib/base/components/generic-reactive-form.component.d.ts +1 -1
  9. package/lib/base/helpers/auth-helper.d.ts +1 -1
  10. package/lib/chips/components/chips.component.d.ts +5 -16
  11. package/lib/common/functions/utils.d.ts +1 -1
  12. package/lib/common/helpers/app-storage.d.ts +1 -1
  13. package/lib/common/styles/_layout.scss +1 -1
  14. package/lib/common/styles/_variables.scss +4 -25
  15. package/lib/common/styles/colors/_colors-dark.scss +2 -0
  16. package/lib/common/styles/colors/_colors.scss +4 -4
  17. package/lib/common/styles/core/_button.scss +7 -21
  18. package/lib/common/styles/core/_card.scss +13 -97
  19. package/lib/common/styles/core/_core.scss +8 -21
  20. package/lib/common/styles/core/_sidenav.scss +9 -7
  21. package/lib/common/styles/core/_structure.scss +4 -11
  22. package/lib/common/styles/font/_font.scss +5 -13
  23. package/lib/common/styles/m2/_common-theme.scss +10 -10
  24. package/lib/common/styles/m3/_common-theme.scss +27 -10
  25. package/lib/common/styles/platform.scss +10 -8
  26. package/lib/common/styles/utilities/_general.scss +55 -51
  27. package/lib/common/styles/utilities/_pull.scss +23 -30
  28. package/lib/common/styles/utilities/_push.scss +23 -30
  29. package/lib/common/styles/utilities/_size.scss +3 -3
  30. package/lib/common/styles/utilities/_utilities.scss +14 -14
  31. package/lib/common/theming/_m2-all-theme.scss +4 -11
  32. package/lib/common/theming/_m3-all-theme.scss +18 -0
  33. package/lib/form-validators/directives/base-directive.d.ts +1 -1
  34. package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +1 -1
  35. package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +1 -1
  36. package/lib/form-validators/services/rx-form-array.d.ts +2 -2
  37. package/lib/form-validators/util/reset-form.d.ts +3 -3
  38. package/lib/forms/directives/mat-form-field-editor.directive.d.ts +31 -28
  39. package/lib/forms/helpers/abstract-mat-form-field.d.ts +147 -91
  40. package/lib/forms/helpers/abstract-select-form-field.component.d.ts +144 -67
  41. package/lib/forms/helpers/value-accessor-base.d.ts +1 -1
  42. package/lib/layout/_m2-layout-theme.scss +14 -50
  43. package/lib/layout/layout-toggle.class.d.ts +1 -1
  44. package/lib/list/components/list.component.d.ts +3 -15
  45. package/lib/select/components/select.component.d.ts +3 -16
  46. package/lib/table/components/filter-select/filter-select.component.d.ts +2 -3
  47. package/package.json +3 -5
  48. package/esm2022/lib/base/base.module.mjs +0 -114
  49. package/esm2022/lib/base/components/base.component.mjs +0 -904
  50. package/esm2022/lib/base/components/dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.mjs +0 -123
  51. package/esm2022/lib/base/components/generic-embedded-list.component.mjs +0 -197
  52. package/esm2022/lib/base/components/generic-form-base.component.mjs +0 -891
  53. package/esm2022/lib/base/components/generic-form.component.mjs +0 -44
  54. package/esm2022/lib/base/components/generic-list.component.mjs +0 -966
  55. package/esm2022/lib/base/components/generic-reactive-form.component.mjs +0 -101
  56. package/esm2022/lib/base/components/task-dialog/task-dialog.component.mjs +0 -147
  57. package/esm2022/lib/base/constants/common.mjs +0 -92
  58. package/esm2022/lib/base/constants/global-roles.mjs +0 -9
  59. package/esm2022/lib/base/enums/message-type.mjs +0 -7
  60. package/esm2022/lib/base/helpers/auth-helper.mjs +0 -53
  61. package/esm2022/lib/base/interceptors/base.interceptor.mjs +0 -168
  62. package/esm2022/lib/base/interceptors/caching-interceptor.mjs +0 -67
  63. package/esm2022/lib/base/interceptors/loading.interceptor.mjs +0 -64
  64. package/esm2022/lib/base/interfaces/ibase-component.mjs +0 -2
  65. package/esm2022/lib/base/interfaces/igeneric-form-base.mjs +0 -2
  66. package/esm2022/lib/base/interfaces/igeneric-list-component.mjs +0 -2
  67. package/esm2022/lib/base/interfaces/igeneric-reactive-form-base.mjs +0 -2
  68. package/esm2022/lib/base/models/auth-user.mjs +0 -18
  69. package/esm2022/lib/base/models/task-dialog-data.mjs +0 -85
  70. package/esm2022/lib/base/public_api.mjs +0 -2
  71. package/esm2022/lib/base/services/file.service.mjs +0 -18
  72. package/esm2022/lib/base/services/loading-screen.service.mjs +0 -45
  73. package/esm2022/lib/base/services/print.service.mjs +0 -41
  74. package/esm2022/lib/chips/chips.module.mjs +0 -77
  75. package/esm2022/lib/chips/components/chips.component.mjs +0 -702
  76. package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +0 -18
  77. package/esm2022/lib/chips/directives/chip.directive.mjs +0 -18
  78. package/esm2022/lib/chips/public_api.mjs +0 -3
  79. package/esm2022/lib/common/animations/collapse/collapse.animation.mjs +0 -33
  80. package/esm2022/lib/common/animations/common/interfaces.mjs +0 -2
  81. package/esm2022/lib/common/behaviors/constructor.mjs +0 -2
  82. package/esm2022/lib/common/behaviors/control-value-accesor.mixin.mjs +0 -41
  83. package/esm2022/lib/common/behaviors/disabled.mixin.mjs +0 -24
  84. package/esm2022/lib/common/common.module.mjs +0 -176
  85. package/esm2022/lib/common/constants/constants.mjs +0 -3
  86. package/esm2022/lib/common/directives/autofocus.directive.mjs +0 -62
  87. package/esm2022/lib/common/directives/delayed-hover.directive.mjs +0 -133
  88. package/esm2022/lib/common/directives/disable-control.directive.mjs +0 -35
  89. package/esm2022/lib/common/enums/app-event-type.mjs +0 -6
  90. package/esm2022/lib/common/enums/filter-glue.mjs +0 -16
  91. package/esm2022/lib/common/enums/filter-operator.mjs +0 -15
  92. package/esm2022/lib/common/enums/salutation.mjs +0 -7
  93. package/esm2022/lib/common/functions/decorators.mjs +0 -22
  94. package/esm2022/lib/common/functions/functions.mjs +0 -22
  95. package/esm2022/lib/common/functions/utils.mjs +0 -271
  96. package/esm2022/lib/common/helpers/app-storage.mjs +0 -77
  97. package/esm2022/lib/common/helpers/delegate.mjs +0 -2
  98. package/esm2022/lib/common/helpers/dynamic-builder.mjs +0 -52
  99. package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +0 -11
  100. package/esm2022/lib/common/models/action-item.mjs +0 -77
  101. package/esm2022/lib/common/models/app-event.mjs +0 -21
  102. package/esm2022/lib/common/models/app-setting.mjs +0 -92
  103. package/esm2022/lib/common/models/audit-entity.mjs +0 -53
  104. package/esm2022/lib/common/models/audit-user.mjs +0 -24
  105. package/esm2022/lib/common/models/base-entity.mjs +0 -40
  106. package/esm2022/lib/common/models/common-error.mjs +0 -29
  107. package/esm2022/lib/common/models/common-handler-context.mjs +0 -45
  108. package/esm2022/lib/common/models/displayname-number-projection.mjs +0 -56
  109. package/esm2022/lib/common/models/displayname-projection.mjs +0 -38
  110. package/esm2022/lib/common/models/entity.mjs +0 -2
  111. package/esm2022/lib/common/models/enum-item.mjs +0 -2
  112. package/esm2022/lib/common/models/enum-metadata.mjs +0 -44
  113. package/esm2022/lib/common/models/filter-field.mjs +0 -2
  114. package/esm2022/lib/common/models/filter.mjs +0 -2
  115. package/esm2022/lib/common/models/icommon-handler-context.mjs +0 -2
  116. package/esm2022/lib/common/models/icon.mjs +0 -42
  117. package/esm2022/lib/common/models/key-value.mjs +0 -11
  118. package/esm2022/lib/common/models/modifiable-entity.mjs +0 -22
  119. package/esm2022/lib/common/models/name-number-projection.mjs +0 -35
  120. package/esm2022/lib/common/models/name-projection.mjs +0 -25
  121. package/esm2022/lib/common/models/permission.mjs +0 -29
  122. package/esm2022/lib/common/models/save-action.mjs +0 -7
  123. package/esm2022/lib/common/models/suffix-button.mjs +0 -15
  124. package/esm2022/lib/common/models/title-projection.mjs +0 -25
  125. package/esm2022/lib/common/pipes/bind.mjs +0 -31
  126. package/esm2022/lib/common/pipes/data-source.pipe.mjs +0 -15
  127. package/esm2022/lib/common/pipes/enum.pipe.mjs +0 -41
  128. package/esm2022/lib/common/pipes/file-size.pipe.mjs +0 -35
  129. package/esm2022/lib/common/pipes/filter.pipe.mjs +0 -54
  130. package/esm2022/lib/common/pipes/first-letter.mjs +0 -24
  131. package/esm2022/lib/common/pipes/form-array.pipe.mjs +0 -14
  132. package/esm2022/lib/common/pipes/form-control.pipe.mjs +0 -14
  133. package/esm2022/lib/common/pipes/form-group.pipe.mjs +0 -14
  134. package/esm2022/lib/common/pipes/func.pipe.mjs +0 -14
  135. package/esm2022/lib/common/pipes/join.pipe.mjs +0 -26
  136. package/esm2022/lib/common/pipes/keys.mjs +0 -18
  137. package/esm2022/lib/common/pipes/map.pipe.mjs +0 -48
  138. package/esm2022/lib/common/pipes/month-name.pipe.mjs +0 -25
  139. package/esm2022/lib/common/pipes/nested-property.mjs +0 -29
  140. package/esm2022/lib/common/pipes/only-number.mjs +0 -58
  141. package/esm2022/lib/common/pipes/order.pipe.mjs +0 -269
  142. package/esm2022/lib/common/pipes/placeholder.pipe.mjs +0 -26
  143. package/esm2022/lib/common/pipes/property-join.pipe.mjs +0 -27
  144. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +0 -32
  145. package/esm2022/lib/common/pipes/split.pipe.mjs +0 -25
  146. package/esm2022/lib/common/pipes/time.pipe.mjs +0 -21
  147. package/esm2022/lib/common/pipes/titlecase.pipe.mjs +0 -14
  148. package/esm2022/lib/common/pipes/truncate.pipe.mjs +0 -15
  149. package/esm2022/lib/common/pipes/values.mjs +0 -14
  150. package/esm2022/lib/common/public_api.mjs +0 -41
  151. package/esm2022/lib/common/services/base.service.mjs +0 -19
  152. package/esm2022/lib/common/services/context-helper.mjs +0 -17
  153. package/esm2022/lib/common/services/enum.service.mjs +0 -81
  154. package/esm2022/lib/common/services/event-queue.service.mjs +0 -31
  155. package/esm2022/lib/common/services/service-locator.mjs +0 -25
  156. package/esm2022/lib/common/templates/templates.mjs +0 -87
  157. package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +0 -46
  158. package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -60
  159. package/esm2022/lib/dialogs/dialog.component.mjs +0 -59
  160. package/esm2022/lib/dialogs/dialogs.module.mjs +0 -72
  161. package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +0 -44
  162. package/esm2022/lib/dialogs/public_api.mjs +0 -2
  163. package/esm2022/lib/dialogs/services/dialog.service.mjs +0 -154
  164. package/esm2022/lib/file/file-input.component.mjs +0 -334
  165. package/esm2022/lib/file/file.module.mjs +0 -37
  166. package/esm2022/lib/file/public_api.mjs +0 -2
  167. package/esm2022/lib/form-validators/abstract/typed-form.mjs +0 -13
  168. package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +0 -33
  169. package/esm2022/lib/form-validators/const/app-validators.const.mjs +0 -68
  170. package/esm2022/lib/form-validators/const/app.const.mjs +0 -65
  171. package/esm2022/lib/form-validators/const/config-names.const.mjs +0 -33
  172. package/esm2022/lib/form-validators/const/config-required-fields.const.mjs +0 -35
  173. package/esm2022/lib/form-validators/const/decorators.const.mjs +0 -23
  174. package/esm2022/lib/form-validators/const/events.const.mjs +0 -53
  175. package/esm2022/lib/form-validators/const/html-elements.const.mjs +0 -25
  176. package/esm2022/lib/form-validators/const/iban-country-wise-regex.const.mjs +0 -80
  177. package/esm2022/lib/form-validators/const/index.mjs +0 -6
  178. package/esm2022/lib/form-validators/const/operators.const.mjs +0 -7
  179. package/esm2022/lib/form-validators/const/validation-alphabet-locale.const.mjs +0 -9
  180. package/esm2022/lib/form-validators/const/validator.const.mjs +0 -29
  181. package/esm2022/lib/form-validators/core/annotation-types.mjs +0 -75
  182. package/esm2022/lib/form-validators/core/default-container.mjs +0 -500
  183. package/esm2022/lib/form-validators/decorators/allOf.decorator.mjs +0 -10
  184. package/esm2022/lib/form-validators/decorators/alpha.decorator.mjs +0 -10
  185. package/esm2022/lib/form-validators/decorators/alphaNumeric.decorator.mjs +0 -10
  186. package/esm2022/lib/form-validators/decorators/and.decorator.mjs +0 -6
  187. package/esm2022/lib/form-validators/decorators/ascii.decorator.mjs +0 -6
  188. package/esm2022/lib/form-validators/decorators/async.decorator.mjs +0 -6
  189. package/esm2022/lib/form-validators/decorators/base-decorator.function.mjs +0 -7
  190. package/esm2022/lib/form-validators/decorators/choice.decorator.mjs +0 -10
  191. package/esm2022/lib/form-validators/decorators/compare.decorator.mjs +0 -6
  192. package/esm2022/lib/form-validators/decorators/compose.decorator.mjs +0 -6
  193. package/esm2022/lib/form-validators/decorators/contains.decorator.mjs +0 -10
  194. package/esm2022/lib/form-validators/decorators/credit-card.decorator.mjs +0 -10
  195. package/esm2022/lib/form-validators/decorators/cusip.decorator.mjs +0 -6
  196. package/esm2022/lib/form-validators/decorators/custom.decorator.mjs +0 -10
  197. package/esm2022/lib/form-validators/decorators/dataUri.decorator.mjs +0 -6
  198. package/esm2022/lib/form-validators/decorators/date.decorator.mjs +0 -10
  199. package/esm2022/lib/form-validators/decorators/different.decorator.mjs +0 -6
  200. package/esm2022/lib/form-validators/decorators/digit.decorator.mjs +0 -6
  201. package/esm2022/lib/form-validators/decorators/email.decorator.mjs +0 -6
  202. package/esm2022/lib/form-validators/decorators/endsWith.decorator.mjs +0 -10
  203. package/esm2022/lib/form-validators/decorators/even.decorator.mjs +0 -6
  204. package/esm2022/lib/form-validators/decorators/extension.decorator.mjs +0 -10
  205. package/esm2022/lib/form-validators/decorators/factor.decorator.mjs +0 -10
  206. package/esm2022/lib/form-validators/decorators/file.decorator.mjs +0 -10
  207. package/esm2022/lib/form-validators/decorators/fileSize.decorator.mjs +0 -10
  208. package/esm2022/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +0 -10
  209. package/esm2022/lib/form-validators/decorators/greater-than.decorator.mjs +0 -10
  210. package/esm2022/lib/form-validators/decorators/grid.decorator.mjs +0 -6
  211. package/esm2022/lib/form-validators/decorators/hexColor.decorator.mjs +0 -6
  212. package/esm2022/lib/form-validators/decorators/image.decorator.mjs +0 -10
  213. package/esm2022/lib/form-validators/decorators/index.mjs +0 -93
  214. package/esm2022/lib/form-validators/decorators/json.decorator.mjs +0 -6
  215. package/esm2022/lib/form-validators/decorators/latLong.decorator.mjs +0 -6
  216. package/esm2022/lib/form-validators/decorators/latitude.decorator.mjs +0 -6
  217. package/esm2022/lib/form-validators/decorators/leapYear.decorator.mjs +0 -6
  218. package/esm2022/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +0 -10
  219. package/esm2022/lib/form-validators/decorators/less-than.decorator.mjs +0 -10
  220. package/esm2022/lib/form-validators/decorators/longitude.decorator.mjs +0 -6
  221. package/esm2022/lib/form-validators/decorators/lowercase.decorator.mjs +0 -6
  222. package/esm2022/lib/form-validators/decorators/mac.decorator.mjs +0 -6
  223. package/esm2022/lib/form-validators/decorators/mask.decorator.mjs +0 -6
  224. package/esm2022/lib/form-validators/decorators/maxDate.decorator.mjs +0 -10
  225. package/esm2022/lib/form-validators/decorators/maxLength.decorator.mjs +0 -10
  226. package/esm2022/lib/form-validators/decorators/maxNumber.decorator.mjs +0 -10
  227. package/esm2022/lib/form-validators/decorators/maxTime.decorator.mjs +0 -10
  228. package/esm2022/lib/form-validators/decorators/minDate.decorator.mjs +0 -10
  229. package/esm2022/lib/form-validators/decorators/minLength.decorator.mjs +0 -10
  230. package/esm2022/lib/form-validators/decorators/minNumber.decorator.mjs +0 -10
  231. package/esm2022/lib/form-validators/decorators/minTime.decorator.mjs +0 -10
  232. package/esm2022/lib/form-validators/decorators/model.decorator.mjs +0 -7
  233. package/esm2022/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +0 -8
  234. package/esm2022/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +0 -8
  235. package/esm2022/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +0 -8
  236. package/esm2022/lib/form-validators/decorators/non-validation-decorators/update-on.decorator.mjs +0 -6
  237. package/esm2022/lib/form-validators/decorators/noneOf.decorator.mjs +0 -10
  238. package/esm2022/lib/form-validators/decorators/not.decorator.mjs +0 -6
  239. package/esm2022/lib/form-validators/decorators/notEmpty.decorator.mjs +0 -6
  240. package/esm2022/lib/form-validators/decorators/numeric.decorator.mjs +0 -10
  241. package/esm2022/lib/form-validators/decorators/odd.decorator.mjs +0 -6
  242. package/esm2022/lib/form-validators/decorators/oneOf.decorator.mjs +0 -10
  243. package/esm2022/lib/form-validators/decorators/or.decorator.mjs +0 -6
  244. package/esm2022/lib/form-validators/decorators/password.decorator.mjs +0 -10
  245. package/esm2022/lib/form-validators/decorators/pattern.decorator.mjs +0 -10
  246. package/esm2022/lib/form-validators/decorators/port.decorator.mjs +0 -6
  247. package/esm2022/lib/form-validators/decorators/primeNumber.decorator.mjs +0 -6
  248. package/esm2022/lib/form-validators/decorators/prop-array.decorator.mjs +0 -18
  249. package/esm2022/lib/form-validators/decorators/prop-object.decorator.mjs +0 -8
  250. package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +0 -18
  251. package/esm2022/lib/form-validators/decorators/range.decorator.mjs +0 -10
  252. package/esm2022/lib/form-validators/decorators/required.decorator.mjs +0 -6
  253. package/esm2022/lib/form-validators/decorators/requiredTrue.decorator.mjs +0 -6
  254. package/esm2022/lib/form-validators/decorators/rule.decorator.mjs +0 -6
  255. package/esm2022/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +0 -8
  256. package/esm2022/lib/form-validators/decorators/sanitize/escape.decorator.mjs +0 -8
  257. package/esm2022/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +0 -8
  258. package/esm2022/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +0 -8
  259. package/esm2022/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +0 -8
  260. package/esm2022/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +0 -8
  261. package/esm2022/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +0 -8
  262. package/esm2022/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +0 -8
  263. package/esm2022/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +0 -8
  264. package/esm2022/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +0 -8
  265. package/esm2022/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +0 -8
  266. package/esm2022/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +0 -8
  267. package/esm2022/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +0 -8
  268. package/esm2022/lib/form-validators/decorators/sanitize/toString.decorator.mjs +0 -8
  269. package/esm2022/lib/form-validators/decorators/sanitize/trim.decorator.mjs +0 -8
  270. package/esm2022/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +0 -8
  271. package/esm2022/lib/form-validators/decorators/startsWith.decorator.mjs +0 -10
  272. package/esm2022/lib/form-validators/decorators/time.decorator.mjs +0 -10
  273. package/esm2022/lib/form-validators/decorators/unique.decorator.mjs +0 -6
  274. package/esm2022/lib/form-validators/decorators/uppercase.decorator.mjs +0 -6
  275. package/esm2022/lib/form-validators/decorators/url.decorator.mjs +0 -10
  276. package/esm2022/lib/form-validators/directives/base-directive.mjs +0 -75
  277. package/esm2022/lib/form-validators/directives/control-host.directive.mjs +0 -55
  278. package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +0 -36
  279. package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +0 -234
  280. package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +0 -40
  281. package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +0 -76
  282. package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +0 -60
  283. package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +0 -122
  284. package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +0 -74
  285. package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +0 -394
  286. package/esm2022/lib/form-validators/domain/disable-provider.mjs +0 -198
  287. package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +0 -134
  288. package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +0 -453
  289. package/esm2022/lib/form-validators/domain/form-data.mjs +0 -93
  290. package/esm2022/lib/form-validators/enums/error-message-binding-strategy.mjs +0 -11
  291. package/esm2022/lib/form-validators/enums/index.mjs +0 -5
  292. package/esm2022/lib/form-validators/enums/ip-version.mjs +0 -7
  293. package/esm2022/lib/form-validators/enums/numeric-value-type.mjs +0 -7
  294. package/esm2022/lib/form-validators/enums/reset-type.mjs +0 -10
  295. package/esm2022/lib/form-validators/enums/url-validation-type.mjs +0 -7
  296. package/esm2022/lib/form-validators/models/config/alpha-config.mjs +0 -2
  297. package/esm2022/lib/form-validators/models/config/array-config.mjs +0 -2
  298. package/esm2022/lib/form-validators/models/config/base-config-fn.mjs +0 -2
  299. package/esm2022/lib/form-validators/models/config/base-config.mjs +0 -2
  300. package/esm2022/lib/form-validators/models/config/base-date-config.mjs +0 -2
  301. package/esm2022/lib/form-validators/models/config/choice-config.mjs +0 -2
  302. package/esm2022/lib/form-validators/models/config/compare-config.mjs +0 -2
  303. package/esm2022/lib/form-validators/models/config/component-config.mjs +0 -2
  304. package/esm2022/lib/form-validators/models/config/compose-config.mjs +0 -2
  305. package/esm2022/lib/form-validators/models/config/contains-config.mjs +0 -2
  306. package/esm2022/lib/form-validators/models/config/credit-card-config.mjs +0 -2
  307. package/esm2022/lib/form-validators/models/config/custom-config.mjs +0 -2
  308. package/esm2022/lib/form-validators/models/config/date-config.mjs +0 -2
  309. package/esm2022/lib/form-validators/models/config/default-config.mjs +0 -2
  310. package/esm2022/lib/form-validators/models/config/digit-config.mjs +0 -2
  311. package/esm2022/lib/form-validators/models/config/disable-config.mjs +0 -2
  312. package/esm2022/lib/form-validators/models/config/element-class-config.mjs +0 -2
  313. package/esm2022/lib/form-validators/models/config/email-config.mjs +0 -2
  314. package/esm2022/lib/form-validators/models/config/error-config.mjs +0 -2
  315. package/esm2022/lib/form-validators/models/config/extension-config.mjs +0 -2
  316. package/esm2022/lib/form-validators/models/config/factor-config.mjs +0 -2
  317. package/esm2022/lib/form-validators/models/config/field-config.mjs +0 -2
  318. package/esm2022/lib/form-validators/models/config/file-config.mjs +0 -2
  319. package/esm2022/lib/form-validators/models/config/hex-color-config.mjs +0 -2
  320. package/esm2022/lib/form-validators/models/config/iban-config.mjs +0 -2
  321. package/esm2022/lib/form-validators/models/config/image-config.mjs +0 -2
  322. package/esm2022/lib/form-validators/models/config/index.mjs +0 -35
  323. package/esm2022/lib/form-validators/models/config/ip-config.mjs +0 -2
  324. package/esm2022/lib/form-validators/models/config/logical-operator-config.mjs +0 -2
  325. package/esm2022/lib/form-validators/models/config/mask-config.mjs +0 -2
  326. package/esm2022/lib/form-validators/models/config/max-date-config.mjs +0 -2
  327. package/esm2022/lib/form-validators/models/config/message-config.mjs +0 -2
  328. package/esm2022/lib/form-validators/models/config/min-date-config.mjs +0 -2
  329. package/esm2022/lib/form-validators/models/config/model-config.mjs +0 -2
  330. package/esm2022/lib/form-validators/models/config/number-config.mjs +0 -2
  331. package/esm2022/lib/form-validators/models/config/numeric-config.mjs +0 -2
  332. package/esm2022/lib/form-validators/models/config/password-config.mjs +0 -2
  333. package/esm2022/lib/form-validators/models/config/pattern-config.mjs +0 -2
  334. package/esm2022/lib/form-validators/models/config/prop-config.mjs +0 -2
  335. package/esm2022/lib/form-validators/models/config/props-config.mjs +0 -2
  336. package/esm2022/lib/form-validators/models/config/range-config.mjs +0 -2
  337. package/esm2022/lib/form-validators/models/config/relational-operator-config.mjs +0 -2
  338. package/esm2022/lib/form-validators/models/config/required-config.mjs +0 -2
  339. package/esm2022/lib/form-validators/models/config/rule-config.mjs +0 -2
  340. package/esm2022/lib/form-validators/models/config/sanitize-config.mjs +0 -2
  341. package/esm2022/lib/form-validators/models/config/size-config.mjs +0 -2
  342. package/esm2022/lib/form-validators/models/config/string-comparison-config.mjs +0 -2
  343. package/esm2022/lib/form-validators/models/config/string-value-config.mjs +0 -2
  344. package/esm2022/lib/form-validators/models/config/time-config.mjs +0 -2
  345. package/esm2022/lib/form-validators/models/config/todate-config.mjs +0 -2
  346. package/esm2022/lib/form-validators/models/config/unique-config.mjs +0 -2
  347. package/esm2022/lib/form-validators/models/config/update-on-config.mjs +0 -2
  348. package/esm2022/lib/form-validators/models/config/url-config.mjs +0 -2
  349. package/esm2022/lib/form-validators/models/control-info.mjs +0 -2
  350. package/esm2022/lib/form-validators/models/data-sanitizer.mjs +0 -2
  351. package/esm2022/lib/form-validators/models/decorator-configuration.mjs +0 -2
  352. package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +0 -58
  353. package/esm2022/lib/form-validators/models/index.mjs +0 -3
  354. package/esm2022/lib/form-validators/models/instance-container.mjs +0 -2
  355. package/esm2022/lib/form-validators/models/interface/array-prop-instance-config.interface.mjs +0 -2
  356. package/esm2022/lib/form-validators/models/interface/auto-instance-config.interface.mjs +0 -2
  357. package/esm2022/lib/form-validators/models/interface/form-data-config.mjs +0 -2
  358. package/esm2022/lib/form-validators/models/interface/i-abstract-control.mjs +0 -30
  359. package/esm2022/lib/form-validators/models/interface/i-form-group.mjs +0 -2
  360. package/esm2022/lib/form-validators/models/interface/instance-argument.interface.mjs +0 -2
  361. package/esm2022/lib/form-validators/models/interface/object-prop-instance-config.interface.mjs +0 -2
  362. package/esm2022/lib/form-validators/models/interface/options.mjs +0 -2
  363. package/esm2022/lib/form-validators/models/password-validation.model.mjs +0 -2
  364. package/esm2022/lib/form-validators/models/prop-validation-config.mjs +0 -2
  365. package/esm2022/lib/form-validators/models/property-info.mjs +0 -2
  366. package/esm2022/lib/form-validators/public_api.mjs +0 -26
  367. package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +0 -33
  368. package/esm2022/lib/form-validators/reactive-form-validators/alpha.validator.mjs +0 -15
  369. package/esm2022/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +0 -15
  370. package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +0 -38
  371. package/esm2022/lib/form-validators/reactive-form-validators/ascii.validator.mjs +0 -15
  372. package/esm2022/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +0 -45
  373. package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +0 -31
  374. package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +0 -32
  375. package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +0 -34
  376. package/esm2022/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +0 -63
  377. package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +0 -22
  378. package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +0 -48
  379. package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +0 -38
  380. package/esm2022/lib/form-validators/reactive-form-validators/custom.validator.mjs +0 -25
  381. package/esm2022/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +0 -9
  382. package/esm2022/lib/form-validators/reactive-form-validators/date.validator.mjs +0 -8
  383. package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +0 -19
  384. package/esm2022/lib/form-validators/reactive-form-validators/digit.validator.mjs +0 -9
  385. package/esm2022/lib/form-validators/reactive-form-validators/email.validator.mjs +0 -9
  386. package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +0 -23
  387. package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +0 -15
  388. package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +0 -40
  389. package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +0 -37
  390. package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +0 -26
  391. package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +0 -34
  392. package/esm2022/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +0 -8
  393. package/esm2022/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +0 -8
  394. package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +0 -31
  395. package/esm2022/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +0 -9
  396. package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +0 -28
  397. package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +0 -52
  398. package/esm2022/lib/form-validators/reactive-form-validators/index.mjs +0 -66
  399. package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +0 -28
  400. package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +0 -26
  401. package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +0 -18
  402. package/esm2022/lib/form-validators/reactive-form-validators/latitude.validator.mjs +0 -9
  403. package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +0 -16
  404. package/esm2022/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +0 -8
  405. package/esm2022/lib/form-validators/reactive-form-validators/less-than.validator.mjs +0 -8
  406. package/esm2022/lib/form-validators/reactive-form-validators/longitude.validator.mjs +0 -9
  407. package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +0 -15
  408. package/esm2022/lib/form-validators/reactive-form-validators/mac.validator.mjs +0 -9
  409. package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +0 -14
  410. package/esm2022/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +0 -8
  411. package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +0 -17
  412. package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +0 -17
  413. package/esm2022/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +0 -8
  414. package/esm2022/lib/form-validators/reactive-form-validators/minDate.validator.mjs +0 -8
  415. package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +0 -16
  416. package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +0 -16
  417. package/esm2022/lib/form-validators/reactive-form-validators/minTime.validator.mjs +0 -8
  418. package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +0 -24
  419. package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +0 -25
  420. package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +0 -17
  421. package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +0 -22
  422. package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +0 -17
  423. package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +0 -26
  424. package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +0 -25
  425. package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +0 -35
  426. package/esm2022/lib/form-validators/reactive-form-validators/pattern.validator.mjs +0 -19
  427. package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +0 -19
  428. package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +0 -27
  429. package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +0 -17
  430. package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +0 -17
  431. package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +0 -16
  432. package/esm2022/lib/form-validators/reactive-form-validators/rule.validator.mjs +0 -22
  433. package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +0 -25
  434. package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +0 -19
  435. package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +0 -77
  436. package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +0 -16
  437. package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +0 -28
  438. package/esm2022/lib/form-validators/services/base-form-builder.mjs +0 -220
  439. package/esm2022/lib/form-validators/services/entity.service.mjs +0 -76
  440. package/esm2022/lib/form-validators/services/form-control.mjs +0 -370
  441. package/esm2022/lib/form-validators/services/form-group.mjs +0 -2
  442. package/esm2022/lib/form-validators/services/reactive-form.module.mjs +0 -52
  443. package/esm2022/lib/form-validators/services/rx-form-array.mjs +0 -114
  444. package/esm2022/lib/form-validators/services/rx-form-builder.mjs +0 -1035
  445. package/esm2022/lib/form-validators/services/rx-form-group.mjs +0 -451
  446. package/esm2022/lib/form-validators/services/typed-form-builder.mjs +0 -25
  447. package/esm2022/lib/form-validators/util/alphabet-regex.locale.mjs +0 -29
  448. package/esm2022/lib/form-validators/util/app-util.mjs +0 -161
  449. package/esm2022/lib/form-validators/util/check-length.mjs +0 -11
  450. package/esm2022/lib/form-validators/util/config-provider.mjs +0 -37
  451. package/esm2022/lib/form-validators/util/date-checker.function.mjs +0 -52
  452. package/esm2022/lib/form-validators/util/date-provider.mjs +0 -108
  453. package/esm2022/lib/form-validators/util/form-const.mjs +0 -3
  454. package/esm2022/lib/form-validators/util/form-provider.mjs +0 -87
  455. package/esm2022/lib/form-validators/util/index.mjs +0 -7
  456. package/esm2022/lib/form-validators/util/instance-provider.function.mjs +0 -63
  457. package/esm2022/lib/form-validators/util/ip-checker.mjs +0 -19
  458. package/esm2022/lib/form-validators/util/linq.mjs +0 -157
  459. package/esm2022/lib/form-validators/util/object-maker.mjs +0 -68
  460. package/esm2022/lib/form-validators/util/reactive-form-config.mjs +0 -25
  461. package/esm2022/lib/form-validators/util/regex-rules.mjs +0 -37
  462. package/esm2022/lib/form-validators/util/regex-validator.mjs +0 -74
  463. package/esm2022/lib/form-validators/util/relational-checker.function.mjs +0 -92
  464. package/esm2022/lib/form-validators/util/reset-form.mjs +0 -57
  465. package/esm2022/lib/form-validators/util/sanitizers.mjs +0 -140
  466. package/esm2022/lib/form-validators/util/time-checker.function.mjs +0 -50
  467. package/esm2022/lib/form-validators/util/type.mjs +0 -2
  468. package/esm2022/lib/form-validators/util/validator-value-checker.mjs +0 -21
  469. package/esm2022/lib/form-validators/validators-extension/allOf-validator.extension.mjs +0 -11
  470. package/esm2022/lib/form-validators/validators-extension/alpha-validator.extension.mjs +0 -11
  471. package/esm2022/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +0 -11
  472. package/esm2022/lib/form-validators/validators-extension/and-validator.extension.mjs +0 -7
  473. package/esm2022/lib/form-validators/validators-extension/ascii-validator.extension.mjs +0 -7
  474. package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +0 -34
  475. package/esm2022/lib/form-validators/validators-extension/choice-validator.extension.mjs +0 -11
  476. package/esm2022/lib/form-validators/validators-extension/compare-validator.extension.mjs +0 -7
  477. package/esm2022/lib/form-validators/validators-extension/compose-validator.extension.mjs +0 -7
  478. package/esm2022/lib/form-validators/validators-extension/contains-validator.extension.mjs +0 -11
  479. package/esm2022/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +0 -11
  480. package/esm2022/lib/form-validators/validators-extension/cusip-validator.extension.mjs +0 -7
  481. package/esm2022/lib/form-validators/validators-extension/custom-validator.extension.mjs +0 -11
  482. package/esm2022/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +0 -7
  483. package/esm2022/lib/form-validators/validators-extension/date-validator.extension.mjs +0 -11
  484. package/esm2022/lib/form-validators/validators-extension/different-validator.extension.mjs +0 -7
  485. package/esm2022/lib/form-validators/validators-extension/digit-validator.extension.mjs +0 -7
  486. package/esm2022/lib/form-validators/validators-extension/email-validator.extension.mjs +0 -7
  487. package/esm2022/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +0 -11
  488. package/esm2022/lib/form-validators/validators-extension/even-validator.extension.mjs +0 -7
  489. package/esm2022/lib/form-validators/validators-extension/extension-validator.extension.mjs +0 -10
  490. package/esm2022/lib/form-validators/validators-extension/factor-validator.extension.mjs +0 -11
  491. package/esm2022/lib/form-validators/validators-extension/file-validator.extension.mjs +0 -10
  492. package/esm2022/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +0 -10
  493. package/esm2022/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +0 -11
  494. package/esm2022/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +0 -11
  495. package/esm2022/lib/form-validators/validators-extension/grid-validator.extension.mjs +0 -7
  496. package/esm2022/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +0 -7
  497. package/esm2022/lib/form-validators/validators-extension/iban-validator.extension.mjs +0 -11
  498. package/esm2022/lib/form-validators/validators-extension/image-validator.extension.mjs +0 -10
  499. package/esm2022/lib/form-validators/validators-extension/index.mjs +0 -68
  500. package/esm2022/lib/form-validators/validators-extension/ip-validator.extension.mjs +0 -11
  501. package/esm2022/lib/form-validators/validators-extension/json-validator.extension.mjs +0 -7
  502. package/esm2022/lib/form-validators/validators-extension/latLong-validator.extension.mjs +0 -7
  503. package/esm2022/lib/form-validators/validators-extension/latitude-validator.extension.mjs +0 -7
  504. package/esm2022/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +0 -7
  505. package/esm2022/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +0 -11
  506. package/esm2022/lib/form-validators/validators-extension/less-than-validator.extension.mjs +0 -11
  507. package/esm2022/lib/form-validators/validators-extension/longitude-validator.extension.mjs +0 -7
  508. package/esm2022/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +0 -7
  509. package/esm2022/lib/form-validators/validators-extension/mac-validator.extension.mjs +0 -7
  510. package/esm2022/lib/form-validators/validators-extension/mask-validator.extension.mjs +0 -7
  511. package/esm2022/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +0 -11
  512. package/esm2022/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +0 -11
  513. package/esm2022/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +0 -11
  514. package/esm2022/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +0 -11
  515. package/esm2022/lib/form-validators/validators-extension/minDate-validator.extension.mjs +0 -11
  516. package/esm2022/lib/form-validators/validators-extension/minLength-validator.extension.mjs +0 -11
  517. package/esm2022/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +0 -11
  518. package/esm2022/lib/form-validators/validators-extension/minTime-validator.extension.mjs +0 -11
  519. package/esm2022/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +0 -11
  520. package/esm2022/lib/form-validators/validators-extension/not-validator.extension.mjs +0 -7
  521. package/esm2022/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +0 -7
  522. package/esm2022/lib/form-validators/validators-extension/numeric-validator.extension.mjs +0 -11
  523. package/esm2022/lib/form-validators/validators-extension/odd-validator.extension.mjs +0 -7
  524. package/esm2022/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +0 -11
  525. package/esm2022/lib/form-validators/validators-extension/or-validator.extension.mjs +0 -7
  526. package/esm2022/lib/form-validators/validators-extension/password-validator.extension.mjs +0 -11
  527. package/esm2022/lib/form-validators/validators-extension/pattern-validator.extension.mjs +0 -11
  528. package/esm2022/lib/form-validators/validators-extension/port-validator.extension.mjs +0 -7
  529. package/esm2022/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +0 -7
  530. package/esm2022/lib/form-validators/validators-extension/range-validator.extension.mjs +0 -11
  531. package/esm2022/lib/form-validators/validators-extension/required-validator.extension.mjs +0 -7
  532. package/esm2022/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +0 -7
  533. package/esm2022/lib/form-validators/validators-extension/rxweb-validators.mjs +0 -108
  534. package/esm2022/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +0 -11
  535. package/esm2022/lib/form-validators/validators-extension/time-validator.extension.mjs +0 -11
  536. package/esm2022/lib/form-validators/validators-extension/unique-validator.extension.mjs +0 -7
  537. package/esm2022/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +0 -7
  538. package/esm2022/lib/form-validators/validators-extension/url-validator.extension.mjs +0 -11
  539. package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +0 -71
  540. package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +0 -33
  541. package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +0 -84
  542. package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +0 -602
  543. package/esm2022/lib/forms/constants/constants.mjs +0 -4
  544. package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +0 -197
  545. package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +0 -34
  546. package/esm2022/lib/forms/directives/parse-decimal-directive.mjs +0 -87
  547. package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +0 -35
  548. package/esm2022/lib/forms/enums/form-field-type.mjs +0 -23
  549. package/esm2022/lib/forms/forms.module.mjs +0 -168
  550. package/esm2022/lib/forms/functions/decorators.mjs +0 -136
  551. package/esm2022/lib/forms/functions/functions.mjs +0 -72
  552. package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +0 -308
  553. package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +0 -492
  554. package/esm2022/lib/forms/helpers/value-accessor-base.mjs +0 -146
  555. package/esm2022/lib/forms/models/form-definition.mjs +0 -63
  556. package/esm2022/lib/forms/models/form-field-definition.mjs +0 -468
  557. package/esm2022/lib/forms/models/form-field-group-definition.mjs +0 -55
  558. package/esm2022/lib/forms/pipes/field-func.pipe.mjs +0 -23
  559. package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +0 -34
  560. package/esm2022/lib/forms/public_api.mjs +0 -5
  561. package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +0 -25
  562. package/esm2022/lib/forms/validators/equal-validator.directive.mjs +0 -69
  563. package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +0 -41
  564. package/esm2022/lib/forms/validators/unique-validator-directive.mjs +0 -88
  565. package/esm2022/lib/http/http.module.mjs +0 -15
  566. package/esm2022/lib/http/models/response.mjs +0 -24
  567. package/esm2022/lib/http/public_api.mjs +0 -2
  568. package/esm2022/lib/http/services/generic.service.mjs +0 -331
  569. package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +0 -103
  570. package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +0 -49
  571. package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +0 -193
  572. package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +0 -37
  573. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +0 -150
  574. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +0 -108
  575. package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +0 -146
  576. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +0 -141
  577. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +0 -105
  578. package/esm2022/lib/layout/layout-toggle.class.mjs +0 -89
  579. package/esm2022/lib/layout/layout.component.mjs +0 -230
  580. package/esm2022/lib/layout/layout.directives.mjs +0 -81
  581. package/esm2022/lib/layout/layout.module.mjs +0 -144
  582. package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +0 -47
  583. package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +0 -275
  584. package/esm2022/lib/layout/public_api.mjs +0 -2
  585. package/esm2022/lib/list/components/list.component.mjs +0 -78
  586. package/esm2022/lib/list/directives/vd-list-option.directive.mjs +0 -23
  587. package/esm2022/lib/list/list.module.mjs +0 -36
  588. package/esm2022/lib/list/public_api.mjs +0 -3
  589. package/esm2022/lib/media/directives/media-toggle.directive.mjs +0 -154
  590. package/esm2022/lib/media/media.module.mjs +0 -35
  591. package/esm2022/lib/media/public_api.mjs +0 -2
  592. package/esm2022/lib/media/services/media.service.mjs +0 -110
  593. package/esm2022/lib/menu/components/menu.component.mjs +0 -95
  594. package/esm2022/lib/menu/enums/menu-scope.mjs +0 -6
  595. package/esm2022/lib/menu/menu.module.mjs +0 -64
  596. package/esm2022/lib/menu/models/menu-client.mjs +0 -39
  597. package/esm2022/lib/menu/models/menu-department.mjs +0 -39
  598. package/esm2022/lib/menu/models/menu-item-client.mjs +0 -39
  599. package/esm2022/lib/menu/models/menu-item-department.mjs +0 -39
  600. package/esm2022/lib/menu/models/menu-item.mjs +0 -351
  601. package/esm2022/lib/menu/models/menu-settings.mjs +0 -13
  602. package/esm2022/lib/menu/models/menu.mjs +0 -224
  603. package/esm2022/lib/menu/public_api.mjs +0 -3
  604. package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +0 -50
  605. package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +0 -50
  606. package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +0 -51
  607. package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +0 -24
  608. package/esm2022/lib/menu/services/menu-items.service.mjs +0 -19
  609. package/esm2022/lib/menu/services/menu.resolve.mjs +0 -68
  610. package/esm2022/lib/menu/services/menu.service.mjs +0 -19
  611. package/esm2022/lib/search/public_api.mjs +0 -2
  612. package/esm2022/lib/search/search.module.mjs +0 -33
  613. package/esm2022/lib/select/components/select.component.mjs +0 -215
  614. package/esm2022/lib/select/directives/vd-select-option.directive.mjs +0 -23
  615. package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +0 -23
  616. package/esm2022/lib/select/public_api.mjs +0 -4
  617. package/esm2022/lib/select/select.module.mjs +0 -48
  618. package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +0 -810
  619. package/esm2022/lib/table/components/filter-clear/filter-clear.component.mjs +0 -36
  620. package/esm2022/lib/table/components/filter-date/filter-date.component.mjs +0 -146
  621. package/esm2022/lib/table/components/filter-input/filter-input.component.mjs +0 -198
  622. package/esm2022/lib/table/components/filter-select/filter-select.component.mjs +0 -375
  623. package/esm2022/lib/table/constants/constants.mjs +0 -3
  624. package/esm2022/lib/table/directives/data-source-filter.directive.mjs +0 -49
  625. package/esm2022/lib/table/directives/vd-table-field.directive.mjs +0 -35
  626. package/esm2022/lib/table/enums/grid.mjs +0 -12
  627. package/esm2022/lib/table/enums/table-column-type.mjs +0 -17
  628. package/esm2022/lib/table/functions/decorators.mjs +0 -163
  629. package/esm2022/lib/table/functions/functions.mjs +0 -28
  630. package/esm2022/lib/table/models/facet-value.mjs +0 -47
  631. package/esm2022/lib/table/models/facet.mjs +0 -48
  632. package/esm2022/lib/table/models/pagination.mjs +0 -27
  633. package/esm2022/lib/table/models/table-column-config.mjs +0 -128
  634. package/esm2022/lib/table/models/table-column.mjs +0 -270
  635. package/esm2022/lib/table/models/table-config.mjs +0 -41
  636. package/esm2022/lib/table/models/table-definition.mjs +0 -110
  637. package/esm2022/lib/table/models/table-query-config.mjs +0 -26
  638. package/esm2022/lib/table/paginator-intl.mjs +0 -41
  639. package/esm2022/lib/table/public_api.mjs +0 -2
  640. package/esm2022/lib/table/table.data-source.mjs +0 -326
  641. package/esm2022/lib/table/table.module.mjs +0 -165
  642. package/esm2022/lib/table/table.static-data-source.mjs +0 -198
  643. package/esm2022/messaia-cdk.mjs +0 -5
  644. package/esm2022/public_api.mjs +0 -19
  645. package/lib/common/styles/_elevation.scss +0 -147
  646. package/lib/common/styles/_rtl.scss +0 -28
  647. package/lib/common/styles/_styles.scss +0 -12
  648. package/lib/common/styles/_theme-functions.scss +0 -4
  649. package/lib/common/styles/_typography.scss +0 -76
  650. package/lib/common/styles/core/_content.scss +0 -42
  651. package/lib/common/styles/core/_divider.scss +0 -14
  652. package/lib/common/styles/core/_icons.scss +0 -27
  653. package/lib/common/styles/core/_list.scss +0 -8
  654. package/lib/common/styles/core/_toolbar.scss +0 -31
  655. package/lib/common/styles/core/_whiteframe.scss +0 -111
  656. package/lib/common/styles/m2/_theme-functions.scss +0 -21
  657. package/lib/common/styles/m3/_theme-functions.scss +0 -21
  658. package/lib/common/theming/_all-theme.scss +0 -27
  659. package/lib/common/typography/_all-typography.scss +0 -33
@@ -1,904 +0,0 @@
1
- import { Location } from '@angular/common';
2
- import { HttpHeaders } from '@angular/common/http';
3
- import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output, QueryList, ViewChildren } from '@angular/core';
4
- import { MatDialog } from '@angular/material/dialog';
5
- import { MatExpansionPanel } from '@angular/material/expansion';
6
- import { MatSnackBar } from '@angular/material/snack-bar';
7
- import { Title } from '@angular/platform-browser';
8
- import { ActivatedRoute, Router } from '@angular/router';
9
- import { map, of } from 'rxjs';
10
- import { ContextHelper } from '../../common/common.module';
11
- import { AppSetting } from '../../common/models/app-setting';
12
- import { ServiceLocator } from '../../common/services/service-locator';
13
- import { VdDialogService } from '../../dialogs/services/dialog.service';
14
- import { VdMediaService } from '../../media/services/media.service';
15
- import { TaskDialogData } from '../base.module';
16
- import { Common } from '../constants/common';
17
- import { GlobalRoles } from '../constants/global-roles';
18
- import { MessageType } from '../enums/message-type';
19
- import { AuthHelper } from '../helpers/auth-helper';
20
- import { VdTaskDialogComponent } from './task-dialog/task-dialog.component';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "@angular/router";
23
- /**
24
- * A base list component for components with pagination support.
25
- */
26
- // @dynamic
27
- export class BaseComponent {
28
- route;
29
- changeDetectorRef;
30
- /**
31
- * Application settings.
32
- */
33
- appSetting;
34
- /**
35
- * General configuration settings, with a flexible type to accommodate different configurations.
36
- */
37
- settings = {};
38
- /**
39
- * Menu items for navigation.
40
- */
41
- menu;
42
- /**
43
- * Name of the project, used for display or logging purposes.
44
- */
45
- projectName;
46
- /**
47
- * Title of the current page, displayed in the page header.
48
- */
49
- title;
50
- /**
51
- * Subtitle of the current outlet, used for additional page context.
52
- */
53
- subtitle;
54
- /**
55
- * If true, dummy data is used for testing, and debug logs are enabled.
56
- */
57
- debug = false;
58
- /**
59
- * Indicates whether a loading process is active, often used to show a loading spinner.
60
- */
61
- isLoading = false;
62
- /**
63
- * Determines whether to handle changes in expansion panels.
64
- */
65
- handleExpansionPanelChanges = true;
66
- /**
67
- * Indicates whether a save operation is currently in progress.
68
- */
69
- _isSaving = false;
70
- get isSaving() { return this._isSaving || this.isLoading; }
71
- set isSaving(isSaving) { this.isLoading = this._isSaving = isSaving; }
72
- /**
73
- * Indicates whether the editor has been initialized.
74
- */
75
- isEditorInitialized = false;
76
- /**
77
- * Stores any errors encountered during requests or operations.
78
- */
79
- errors = new Array();
80
- /**
81
- * Utility to evaluate media queries based on the current screen or window size.
82
- */
83
- media;
84
- /**
85
- * List of permitted file extensions for upload or selection.
86
- */
87
- allowedExtensions = Common.allowedExtensions;
88
- /**
89
- * Plugins enabled in the TinyMCE editor.
90
- */
91
- editorPlugins = Common.editorPlugins;
92
- /**
93
- * Toolbar configuration for TinyMCE editor.
94
- */
95
- editorToolbar = Common.editorToolbar;
96
- /**
97
- * Additional configuration settings for the editor.
98
- */
99
- editorConfig = {};
100
- /**
101
- * Service for navigation and URL manipulation.
102
- */
103
- router;
104
- /**
105
- * Optional hash value appended to URLs for bookmarking or state management.
106
- */
107
- urlHash;
108
- /**
109
- * CSS class name(s) applied to the component.
110
- */
111
- className;
112
- /**
113
- * Permission flag for creating new entries.
114
- */
115
- canCreate = false;
116
- /**
117
- * Permission flag for reading new entries.
118
- */
119
- canRead = false;
120
- /**
121
- * Permission flag for updating existing entries.
122
- */
123
- canUpdate = false;
124
- /**
125
- * Permission flag for deleting entries.
126
- */
127
- canDelete = false;
128
- /**
129
- * Full path of the current route.
130
- */
131
- currentRoute;
132
- /**
133
- * Base path of the current route, excluding specific parameters or sub-paths.
134
- */
135
- currentBaseRoute;
136
- /**
137
- * URL to navigate back to after saving changes.
138
- */
139
- returnUrl;
140
- /**
141
- * Object representing the current authenticated user.
142
- */
143
- currentUser = AuthHelper.user;
144
- /**
145
- * Indicates if the current user has admin privileges.
146
- */
147
- isAdmin = AuthHelper.hasRole(GlobalRoles.Administrator);
148
- /**
149
- * Indicates if the current user has client admin privileges.
150
- */
151
- isClientAdmin = AuthHelper.hasRole(GlobalRoles.ClientAdministrator);
152
- /**
153
- * Indicates if the current user has department admin privileges.
154
- */
155
- isDepartmentAdmin = AuthHelper.hasRole(GlobalRoles.DepartmentAdministrator);
156
- /**
157
- * Event emitter for reload actions, useful for refreshing data.
158
- */
159
- reload = new EventEmitter();
160
- /**
161
- * Service for setting the document's title.
162
- */
163
- titleService;
164
- /**
165
- * Service for displaying snack bar notifications.
166
- */
167
- snackBarService;
168
- /**
169
- * Service for displaying confirmation and prompt dialogs.
170
- */
171
- dialogService;
172
- /**
173
- * Service for opening modal dialogs.
174
- */
175
- dialog;
176
- /**
177
- * Service for managing browser location and history.
178
- */
179
- location;
180
- /**
181
- * If true, sets a URL hash for navigation state.
182
- */
183
- setUrlHash = true;
184
- /**
185
- * Query list for accessing expansion panel elements as DOM references.
186
- */
187
- matExpansionPanelElementQueryList;
188
- /**
189
- * Query list for accessing MatExpansionPanel component references.
190
- */
191
- matExpansionPanelQueryList;
192
- /**
193
- * Subscriptions for expansion panel changes, managed to avoid memory leaks.
194
- */
195
- matExpansionPanelSubscriptions = [];
196
- /**
197
- * Create a beep audio object and load a sound file from a data URL.
198
- */
199
- beepAudio = new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");
200
- /**
201
- * Create a warn audio object and load a sound file from a data URL.
202
- */
203
- warnAudio = new Audio("data:audio/mp3;base64,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");
204
- /**
205
- * Initializes services and application settings, sets up context helpers,
206
- * and initializes the editor with default configurations.
207
- *
208
- * @param route - ActivatedRoute instance for accessing route parameters and data.
209
- * @param changeDetectorRef - ChangeDetectorRef instance for manually triggering change detection.
210
- */
211
- constructor(route, changeDetectorRef) {
212
- this.route = route;
213
- this.changeDetectorRef = changeDetectorRef;
214
- /* Initialize the Title service */
215
- this.titleService = this.getService(Title);
216
- /* Initialize the dialog service for showing modals */
217
- this.dialogService = this.getService(VdDialogService);
218
- /* Initialize the Material dialog for managing dialogs */
219
- this.dialog = this.getService(MatDialog);
220
- /* Initialize the media service for media queries and broadcast */
221
- this.media = this.getService(VdMediaService);
222
- /* Initialize the snackbar service for notifications */
223
- this.snackBarService = this.getService(MatSnackBar);
224
- /* Initialize the router service for navigation */
225
- this.router = this.getService(Router);
226
- /* Initialize the application settings */
227
- this.appSetting = this.getService(AppSetting);
228
- /* Initialize the location service for URL manipulation */
229
- this.location = this.getService(Location);
230
- /* Set up context helpers with route and application settings */
231
- ContextHelper.activatedRoute = route;
232
- ContextHelper.router = this.router;
233
- ContextHelper.appSetting = this.appSetting;
234
- /* Initialize the editor with default configurations */
235
- this.initEditor();
236
- }
237
- /**
238
- * Lifecycle hook that is called after data-bound properties of a directive are initialized
239
- */
240
- ngOnInit() {
241
- /* Get menu items from route snapshot */
242
- var mainRoute = this.getMainRoute(this.route.snapshot);
243
- if (mainRoute) {
244
- this.menu = mainRoute.data.menu;
245
- this.setTitles();
246
- }
247
- /* Set project name & debug mode */
248
- this.projectName = this.appSetting.projectName;
249
- this.debug = this.appSetting.debug ?? false;
250
- /* Check if the user has permission to create, update, and delete */
251
- this.canCreate ||= AuthHelper.isPermitted('Create');
252
- this.canUpdate ||= AuthHelper.isPermitted('Update');
253
- this.canDelete ||= AuthHelper.isPermitted('Delete');
254
- /* Get the hash from the URL */
255
- this.route.fragment.subscribe((fragment) => this.urlHash = fragment);
256
- /* Check permissions based on the route */
257
- if (this.route.parent) {
258
- this.route.parent.url.subscribe((url) => {
259
- this.className ??= url.length ? url[0].path.replace(/(.*)s$/, '$1').replace(/^./, (url[0].path[0] || '').toUpperCase()) : '';
260
- this.canCreate = AuthHelper.isPermitted(`Create${this.className}`);
261
- this.canUpdate = AuthHelper.isPermitted(`Update${this.className}`);
262
- this.canDelete = AuthHelper.isPermitted(`Delete${this.className}`);
263
- });
264
- }
265
- /* Set the current route and base route */
266
- this.currentRoute = window.btoa(this.router.url);
267
- this.currentBaseRoute = this.router.url?.split('?')[0]?.split(';')[0];
268
- /**
269
- * Set the page title based on the navigation end event
270
- */
271
- this.router.events.subscribe(x => {
272
- let navigationEnd = x?.routerEvent;
273
- if (navigationEnd) {
274
- this.setTitles();
275
- this.currentRoute = window.btoa(navigationEnd.url);
276
- }
277
- });
278
- /* Retrieve the return URL if any from the query parameters */
279
- this.route.queryParams.subscribe(x => this.setReturnUrl(x.returnUrl));
280
- }
281
- /**
282
- * Lifecycle hook that is called after a component's view has been fully initialized
283
- */
284
- ngAfterViewInit() {
285
- /* Broadcast to all listener observables when loading the page */
286
- this.media.broadcast();
287
- /* Set page titles */
288
- this.setTitles();
289
- /*
290
- * Force a new change detection cycle since change detections
291
- * have finished when `ngAfterViewInit` is executed
292
- */
293
- this.changeDetectorRef.detectChanges();
294
- /* Listen for expansion panel changes if enabled */
295
- if (this.handleExpansionPanelChanges) {
296
- this.onExpansionPanelChanges();
297
- }
298
- }
299
- /**
300
- * Reloads the current page or component.
301
- *
302
- * This method navigates temporarily to the root URL and then
303
- * navigates back to the current URL to effectively refresh the page or component.
304
- *
305
- * @param callback - A function to be called after the navigation is successful,
306
- * receives the current URL as an argument.
307
- */
308
- reloadPage(callback) {
309
- let currentUrl = this.router.url;
310
- this.router.navigateByUrl('/', { replaceUrl: true }).then(() => {
311
- this.router.navigateByUrl(currentUrl, { replaceUrl: true }).then(() => {
312
- /* Execute the callback if provided */
313
- if (callback) {
314
- callback(currentUrl);
315
- }
316
- });
317
- });
318
- }
319
- /**
320
- * Navigates back to the return URL if it exists.
321
- */
322
- navigateToReturnUrl() {
323
- if (this.returnUrl) {
324
- /* Parse the return URL into a UrlTree object */
325
- let urlTree = this.router.parseUrl(this.returnUrl);
326
- /* Navigate to the return URL */
327
- this.router.navigateByUrl(urlTree.toString());
328
- }
329
- }
330
- /*
331
- * Forces a new change detection cycle since change detections
332
- * have finished when `ngAfterViewInit` is executed.
333
- */
334
- detectChanges() {
335
- /* Trigger change detection */
336
- this.changeDetectorRef.detectChanges();
337
- }
338
- /**
339
- * Sets the return URL after decoding it.
340
- *
341
- * @param returnUrl - The encoded return URL to set.
342
- */
343
- setReturnUrl(returnUrl) {
344
- try {
345
- /* Decode and set the return URL, handling potential errors */
346
- this.returnUrl = returnUrl ? decodeURIComponent(atob(returnUrl)) : undefined;
347
- }
348
- catch (error) {
349
- /* Handle error silently */
350
- }
351
- }
352
- /**
353
- * Listen for expansion panel changes
354
- */
355
- onExpansionPanelChanges() {
356
- /* Listen for expansion panel changes */
357
- this.matExpansionPanelQueryList?.changes.subscribe(_ => {
358
- /* Unsubscribe from old 'opened' and 'closed' subscriptions */
359
- this.matExpansionPanelSubscriptions.forEach(x => x.unsubscribe());
360
- /* Detect changes */
361
- this.changeDetectorRef.detectChanges();
362
- /* Get the panel ends with the ID 'new' */
363
- var newExpansionPanelIndex = this.matExpansionPanelElementQueryList?.toArray()?.findIndex(x => x.nativeElement?.id?.endsWith('.new')) ?? -1;
364
- if (newExpansionPanelIndex >= 0) {
365
- /* Close all panels */
366
- this.matExpansionPanelQueryList?.first?.accordion?.closeAll();
367
- /* Open the new panel */
368
- this.matExpansionPanelQueryList?.toArray()[newExpansionPanelIndex]?.open();
369
- /* Detect changes */
370
- this.changeDetectorRef.detectChanges();
371
- }
372
- else {
373
- /* Find the index of the panel with the specified element ID */
374
- this.urlHash?.split('.')
375
- ?.reduce((accumulator, currentValue, index) => accumulator.concat((index > 0 ? (accumulator.slice(-1).join('.') + '.') : '') + currentValue), [])
376
- ?.forEach((hash) => {
377
- var expansionPanelIndex = this.matExpansionPanelElementQueryList?.toArray()?.findIndex(x => x.nativeElement.id == hash) ?? -1;
378
- if (expansionPanelIndex >= 0) {
379
- this.matExpansionPanelQueryList?.toArray()[expansionPanelIndex]?.open();
380
- this.changeDetectorRef.detectChanges();
381
- }
382
- });
383
- }
384
- /* Detect changes for opened panels */
385
- this.matExpansionPanelQueryList?.forEach(y => {
386
- this.matExpansionPanelSubscriptions.push(y.opened.subscribe(_ => {
387
- if (this.setUrlHash) {
388
- /* Get the id of the current opened panel */
389
- var currentPanelId = y['_viewContainerRef']?.element?.nativeElement?.id;
390
- /* If the panel ID is set, set it as url segment (hash) */
391
- if (currentPanelId) {
392
- this.router.navigate([], { fragment: currentPanelId, replaceUrl: true });
393
- }
394
- /* Otherwise remove the segment from the url */
395
- else {
396
- this.router.navigate([], { replaceUrl: true });
397
- }
398
- }
399
- /* Detect changes */
400
- this.changeDetectorRef.detectChanges();
401
- }));
402
- /* Detect changes for closed panels */
403
- this.matExpansionPanelSubscriptions.push(y.closed.subscribe(_ => {
404
- if (this.setUrlHash) {
405
- /* Get the id of the current opened panel */
406
- var currentPanelIdParts = y['_viewContainerRef']?.element?.nativeElement?.id?.split('.');
407
- /* If the panel ID is set, set it as url segment (hash) */
408
- if (currentPanelIdParts.length > 1) {
409
- this.router.navigate([], { fragment: currentPanelIdParts.slice(0, -1).join('.'), replaceUrl: true });
410
- }
411
- }
412
- /* Detect changes */
413
- this.changeDetectorRef.detectChanges();
414
- }));
415
- });
416
- });
417
- /* Notify expansion panel list changes */
418
- if (this.matExpansionPanelQueryList) {
419
- this.matExpansionPanelQueryList.notifyOnChanges();
420
- }
421
- }
422
- /**
423
- * Retrieves an instance from the injector based on the provided token.
424
- * If not found:
425
- * - Throws {@link NoProviderError} if no `notFoundValue` that is not equal to
426
- * Injector.THROW_IF_NOT_FOUND is given
427
- * - Returns the `notFoundValue` otherwise
428
- */
429
- getService(token) {
430
- return ServiceLocator.getService(token);
431
- }
432
- /**
433
- * Gets the main route from the given snapshot by traversing up to the parent routes
434
- * if the current snapshot does not have a menu defined.
435
- *
436
- * @param snapshot - The activated route snapshot to evaluate.
437
- * @returns The main route snapshot that has a menu defined.
438
- */
439
- getMainRoute(snapshot) {
440
- if (snapshot && snapshot.parent && !snapshot.data.menu) {
441
- /* Recursively call to get the main route from the parent snapshot */
442
- return this.getMainRoute(snapshot.parent);
443
- }
444
- return snapshot;
445
- }
446
- /**
447
- * Shows a confirm dialog to delete a single item.
448
- *
449
- * @returns An observable that emits the result of the dialog after it is closed.
450
- */
451
- showDeleteItemDialog() {
452
- return this.dialogService.openConfirm({
453
- message: $localize `:@@dialog.message.delete.one:Are you sure you want to delete this item?`,
454
- title: $localize `:@@dialog.title.delete:Confirm Delete`,
455
- cancelButton: $localize `:@@cancel:Cancel`,
456
- acceptButton: $localize `:@@delete:Delete`,
457
- }).afterClosed();
458
- }
459
- /**
460
- * Shows a confirm dialog to delete multiple selected items.
461
- *
462
- * @returns An observable that emits the result of the dialog after it is closed.
463
- */
464
- showDeleteItemsDialog() {
465
- return this.dialogService.openConfirm({
466
- message: $localize `:@@dialog.message.delete.list:Are you sure you want to delete the selected items?`,
467
- title: $localize `:@@dialog.title.delete:Confirm Delete`,
468
- cancelButton: $localize `:@@cancel:Cancel`,
469
- acceptButton: $localize `:@@delete:Delete`,
470
- }).afterClosed();
471
- }
472
- /**
473
- * Shows a confirmation dialog to send some data.
474
- *
475
- * @param message - The message to display in the dialog.
476
- * @param observable - The observable instance to handle the data.
477
- * @param successCallback - Optional callback to be invoked on successful operation.
478
- * @param errorCallback - Optional callback to be invoked on an error.
479
- * @param acceptButtonText - Optional text for the accept button.
480
- * @param cancelButtonText - Optional text for the cancel button.
481
- */
482
- showConfirmationDialog(message, observabe, successCallback, errorCallback, acceptButtonText, cancelButtonText, dialogConfig) {
483
- this.dialogService
484
- .openConfirm({
485
- message: message,
486
- title: $localize `:@@dialog.title.confirm:Confirm`,
487
- cancelButton: cancelButtonText ?? $localize `:@@cancel:Cancel`,
488
- acceptButton: acceptButtonText ?? $localize `:@@yes:Yes`,
489
- }, dialogConfig ?? { maxWidth: 480 })
490
- .afterClosed().subscribe((accept) => {
491
- if (accept) {
492
- observabe.subscribe({
493
- next: (x) => {
494
- this.showMessage($localize `:@@snackbar.send.success:Data sent successfully.`);
495
- if (successCallback) {
496
- successCallback(x);
497
- }
498
- }, error: (errors) => {
499
- this.isSaving = false;
500
- if (errorCallback) {
501
- errorCallback(errors);
502
- }
503
- }
504
- });
505
- }
506
- });
507
- }
508
- /**
509
- * Opens a task dialog with the specified configuration.
510
- *
511
- * @typeparam TResult - The type of the result returned from the dialog.
512
- * @param {Partial<TaskDialogData<TResult>>} config - Configuration options for the task dialog, including messages, callbacks, and observable tasks.
513
- *
514
- * @example
515
- * // Example of how to call showTaskDialog
516
- * this.showTaskDialog({
517
- * title: 'Processing Task',
518
- * inProgressMessage: 'Your task is currently in progress...',
519
- * successMessage: 'Task completed successfully!',
520
- * errorMessage: 'An error occurred while processing your task.',
521
- * task: this.someObservableTask(), // Your observable task goes here
522
- * successButtonClick: (result, dr) => {
523
- * console.log('Success button clicked!', result);
524
- * // Optionally handle the dialog reference here
525
- * dr.close(result); // Close the dialog with the result
526
- * },
527
- * successCallback: (result) => {
528
- * console.log('Success!', result);
529
- * },
530
- * errorCallback: (errors) => {
531
- * console.error('Error!', errors);
532
- * },
533
- * cancelCallback: () => {
534
- * console.log('Task was canceled.');
535
- * },
536
- * });
537
- */
538
- showTaskDialog(config, dialogConfig) {
539
- return this.openDialog(VdTaskDialogComponent, Object.assign(dialogConfig ?? {}, {
540
- data: new TaskDialogData(config),
541
- disableClose: true
542
- }));
543
- }
544
- /**
545
- * Opens a dialog of the specified type with the provided configuration.
546
- *
547
- * @typeparam T - The type of the component to be opened as a dialog.
548
- * @typeparam D - The type of the data passed to the dialog (default is any).
549
- * @param {Type<T>} dialogType - The component type to open as a dialog.
550
- * @param {MatDialogConfig<D>} config - The configuration options for the dialog, such as data and styles.
551
- * @param {Function} [callback] - Optional callback function to execute after the dialog is closed.
552
- *
553
- * @returns {MatDialogRef<T, D>} A reference to the opened dialog.
554
- *
555
- * @example
556
- * // Example of how to use openDialog
557
- * const dialogRef = this.openDialog(MyDialogComponent, {
558
- * data: { dialog data here },
559
- * width: '800px',
560
- * panelClass: 'custom-dialog-class'
561
- * }, () => {
562
- * console.log('Dialog closed.');
563
- * });
564
- *
565
- * // Handling the result from the dialog
566
- * dialogRef.afterClosed().subscribe(result => {
567
- * if (result) {
568
- * console.log('Dialog result:', result);
569
- * }
570
- * });
571
- */
572
- openDialog(dialogType, config, callback) {
573
- /* Open the dialog with specified type and configuration */
574
- var dialogRef = this.dialog.open(dialogType, Object.assign({
575
- width: '650px', /* Default width for the dialog */
576
- data: {}, /* Default data passed to the dialog */
577
- panelClass: ['dialog-full-screen'] /* Class for the dialog panel */
578
- }, config)); /* Merge user-defined config with defaults */
579
- /* If a callback is provided, subscribe to the dialog's afterClosed event */
580
- if (callback) {
581
- /* Execute callback after the dialog is closed */
582
- dialogRef.afterClosed().subscribe(_ => callback());
583
- }
584
- /* Return the reference to the opened dialog */
585
- return dialogRef;
586
- }
587
- /**
588
- * Displays a message using the snack bar service.
589
- *
590
- * @param message The message to display (optional, defaults to a success message if not provided)
591
- * @param type The type of the message (Success, Warning, or Error). Defaults to Success.
592
- * @param duration The duration (in milliseconds) to show the message. Defaults to 3000ms.
593
- * @param actionLabel The label for the action button. Defaults to 'OK'.
594
- * @param playSound A flag indicating whether to play a warning sound when the message type is Warning. Defaults to false.
595
- * @returns An observable that emits when the action button is clicked.
596
- */
597
- showMessage(message, type = MessageType.Success, duration = 3000, actionLabel = $localize `:@@ok:OK`, playSound = false) {
598
- /* Default snack bar class to 'primary' (for success messages) */
599
- let snackBarClass = 'primary';
600
- /* Determine the appropriate CSS class based on the message type */
601
- switch (type) {
602
- case MessageType.Success:
603
- snackBarClass = 'primary';
604
- break;
605
- case MessageType.Warning:
606
- snackBarClass = 'warn';
607
- /* Play the warning sound if the playSound flag is true */
608
- if (playSound) {
609
- this.playWarnSound();
610
- }
611
- break;
612
- case MessageType.Error:
613
- snackBarClass = 'error';
614
- /* Play the warning sound if the playSound flag is true */
615
- if (playSound) {
616
- this.playWarnSound();
617
- }
618
- break;
619
- default:
620
- break;
621
- }
622
- /* Display the message in the snack bar, with specified duration and CSS class */
623
- const snackBarRef = this.snackBarService.open(message, actionLabel, {
624
- duration: duration,
625
- panelClass: [snackBarClass]
626
- });
627
- /* Emits when the action button is clicked */
628
- return snackBarRef.onAction().pipe(map(() => { }));
629
- }
630
- /**
631
- * Initializes the TinyMCE editor with custom configuration.
632
- *
633
- * @param editorConfig Optional configuration to override default editor settings
634
- */
635
- initEditor(editorConfig = {}) {
636
- /* Merge the provided editor configuration with default settings */
637
- Object.assign(this.editorConfig, {
638
- /* Disable promotions in the editor */
639
- promotion: false,
640
- /* Use the minimized version of TinyMCE */
641
- suffix: '.min',
642
- /* Disable default TinyMCE skin */
643
- skin: false,
644
- /* Set editor height to 170px */
645
- height: '170px',
646
- /* Disable loading external CSS for editor content */
647
- content_css: false,
648
- /* Set the plugins to be used in the editor */
649
- plugins: this.editorPlugins,
650
- /* Set the toolbar configuration */
651
- toolbar: this.editorToolbar,
652
- /* Always paste content as plain text */
653
- paste_as_text: true,
654
- /* Set the editor language to German */
655
- language: 'de',
656
- /* Specify the URL to load the German language file */
657
- language_url: '/assets/tinymce/langs/de.js',
658
- /* Set the base URL for documents/files used in the editor */
659
- document_base_url: `${this.appSetting.apiUrl}file/`,
660
- /* Enable automatic uploads for file inputs */
661
- automatic_uploads: true,
662
- /* Use relative URLs for links and images */
663
- relative_urls: true,
664
- /* Disable automatic conversion of relative URLs to absolute URLs */
665
- convert_urls: false,
666
- /* Extend valid HTML elements to allow specific attributes */
667
- extended_valid_elements: 'span[id|class|style],+@[data-options]',
668
- /* Allow HTML in named anchors */
669
- allow_html_in_named_anchor: true
670
- }, editorConfig);
671
- /* Mark the editor as initialized */
672
- this.isEditorInitialized = true;
673
- }
674
- /**
675
- * Sets the title and subtitle based on the current menu and route
676
- */
677
- setTitles() {
678
- /* Check if the menu object is available */
679
- if (this.menu) {
680
- /* Set the browser tab title using the menu title, if available */
681
- this.titleService.setTitle(this.menu.title ?? '');
682
- /* Update the local title variable from the title service */
683
- this.title = this.titleService.getTitle();
684
- /* If there are no submenu items, exit the method */
685
- if (!this.menu.items) {
686
- return;
687
- }
688
- /* Try to retrieve the subtitle from the URL parameters */
689
- var subtitle = this.route?.snapshot?.paramMap?.get('subtitle');
690
- if (subtitle) {
691
- /* Attempt to decode the subtitle if it's Base64 encoded */
692
- try {
693
- this.subtitle = window.atob(subtitle);
694
- }
695
- catch (e) {
696
- /* If decoding fails, use the raw subtitle */
697
- this.subtitle = subtitle;
698
- }
699
- }
700
- else {
701
- /* Get the current route path, excluding query parameters and matrix parameters */
702
- let currentRoute = this.router.url.split('?')[0]?.split(';')[0];
703
- /* Ensure the route doesn't have a trailing slash */
704
- currentRoute = currentRoute.endsWith('/') ? currentRoute.substring(0, -1) : currentRoute;
705
- /* Find the submenu item that matches the current route */
706
- var submenu = this.menu.items.filter(x => x.path == currentRoute)[0];
707
- if (submenu) {
708
- /* Set the subtitle to the matching submenu's title */
709
- this.subtitle = submenu.title;
710
- }
711
- }
712
- }
713
- }
714
- /**
715
- * Navigate based on the provided array of commands and a starting point.
716
- * @param commands Array of commands representing the route to navigate to
717
- * @param queryParams Optional query parameters to append to the URL
718
- * @param fragment Optional fragment (anchor) to append to the URL
719
- * @param preserveFragment Whether to preserve the current fragment in the URL
720
- */
721
- navigate(commands, queryParams, fragment, preserveFragment) {
722
- this.router.navigate(commands, {
723
- /* Merge any additional query parameters with a default returnUrl */
724
- queryParams: Object.assign({ returnUrl: this.currentRoute }, queryParams || {}),
725
- /* Set the fragment, if provided */
726
- fragment: fragment,
727
- /* Preserve the fragment from the previous URL if specified */
728
- preserveFragment: preserveFragment,
729
- /* Make the route relative to the current route if applicable */
730
- relativeTo: this.route
731
- });
732
- }
733
- /**
734
- * Plays a short beep sound using an embedded audio file in base64 format.
735
- * The method loads and plays the audio file immediately upon calling.
736
- */
737
- playBeepSound() {
738
- try {
739
- this.beepAudio.play();
740
- }
741
- catch (error) { }
742
- }
743
- /**
744
- * Plays a short warning sound using an embedded audio file in base64 format.
745
- * The method loads and plays the audio file immediately upon calling.
746
- */
747
- playWarnSound() {
748
- try {
749
- this.warnAudio.play();
750
- }
751
- catch (error) { }
752
- }
753
- /**
754
- * Logs a message to the console if debug mode is enabled
755
- * @param message The message to log
756
- * @param optionalParams Optional parameters for the log
757
- */
758
- log(message, ...optionalParams) {
759
- /* Check if debug mode is enabled */
760
- if (this.debug) {
761
- /* Log the message and optional parameters to the console */
762
- console.log(message, optionalParams);
763
- }
764
- }
765
- /**
766
- * Logs a warning message to the console if debug mode is enabled
767
- * @param message The warning message to log
768
- * @param optionalParams Optional parameters for the warning
769
- */
770
- warn(message, ...optionalParams) {
771
- /* Check if debug mode is enabled */
772
- if (this.debug) {
773
- /* Log the warning message and optional parameters to the console */
774
- console.warn(message, optionalParams);
775
- }
776
- }
777
- /**
778
- * Convert an object to HttpHeaders.
779
- *
780
- * @param body The object whose properties will be converted into headers
781
- * @returns HttpHeaders object containing the key-value pairs from the body
782
- */
783
- toHttpHeaders(body) {
784
- /* If the body is null or undefined, return empty headers */
785
- if (!body) {
786
- return new HttpHeaders();
787
- }
788
- /* Convert the object's properties to HttpHeaders, filtering out null or empty values */
789
- return Object.getOwnPropertyNames(body)
790
- .filter(key => body[key] != null && body[key] != '')
791
- .reduce((p, key) => p.set(key, body[key]), new HttpHeaders());
792
- }
793
- /**
794
- * Parses and formats HTTP response errors.
795
- * @param errors The error object returned from the HTTP response
796
- */
797
- parseErrors(errors) {
798
- /* Initialize the errors array and reset loading/saving indicators */
799
- this.errors = [];
800
- this.isLoading = false;
801
- this.isSaving = false;
802
- /* If there are errors, iterate through them and add them to the errors array */
803
- if (errors) {
804
- Object.keys(errors).forEach(el => {
805
- let error = errors[el];
806
- /* If the error is an array, iterate over the array and add each error */
807
- if (Array.isArray(error)) {
808
- error.forEach(err => {
809
- this.errors.push(err);
810
- });
811
- }
812
- else if (typeof error === "string") {
813
- /* If the error is a string, add it directly to the errors array */
814
- this.errors.push(error);
815
- }
816
- });
817
- }
818
- }
819
- /**
820
- * Handle Http operation that failed.
821
- * Let the app continue.
822
- * @param operation - name of the operation that failed
823
- * @param result - optional value to return as the observable result
824
- */
825
- handleError(operation = 'operation', result) {
826
- return (error) => {
827
- /* Parse the error messages */
828
- this.parseErrors(error);
829
- /* Log to console */
830
- this.warn(`${operation} failed: ${error.message}`);
831
- /* Let the app keep running by returning an empty result */
832
- return of(result);
833
- };
834
- }
835
- /**
836
- * Cleans the object by removing properties that are null, undefined, or empty strings
837
- * @param obj The object to clean
838
- * @returns The cleaned object
839
- */
840
- clean(obj) {
841
- try {
842
- /* Iterate through all properties of the object */
843
- for (var propName in obj) {
844
- /* If the property value is null, undefined, or an empty string, delete it */
845
- if (obj[propName] === null || obj[propName] === undefined || obj[propName] === "") {
846
- delete obj[propName];
847
- }
848
- }
849
- }
850
- catch (error) {
851
- /* Error handling can be done here if necessary */
852
- }
853
- /* Return the cleaned object */
854
- return obj;
855
- }
856
- /**
857
- * Sanitizes the specified object by removing falsy values and converting string numbers to numbers
858
- * @param obj The object to sanitize
859
- * @param ignore Properties to ignore during the sanitization
860
- * @returns The sanitized object
861
- */
862
- sanitizeObject(obj, ...ignore) {
863
- /* Iterate over object keys and filter out falsy values */
864
- return Object.keys(obj)
865
- .filter(x => obj[x])
866
- /* Ignore properties that are in the ignore list (case insensitive) */
867
- .filter(x => !(ignore || []).map(x => x.toLowerCase()).includes(x.toLowerCase()))
868
- /* Convert string numbers to actual numbers */
869
- .reduce((result, key) => {
870
- result[key] = isNaN(+obj[key]) ? obj[key] : +obj[key];
871
- return result;
872
- }, {});
873
- }
874
- /**
875
- * Checks if the user has selected any text in the document
876
- * @returns True if text is selected, otherwise false
877
- */
878
- isTextSelected = () =>
879
- /* Use the window.getSelection API to check if text is selected */
880
- (window?.getSelection()?.toString()?.length ?? 0) > 0;
881
- /**
882
- * A callback used for any custom cleanup that needs to occur when the instance is destroyed
883
- */
884
- ngOnDestroy() {
885
- /* Unsubscribe from all MatExpansionPanel subscriptions */
886
- this.matExpansionPanelSubscriptions.forEach(x => x.unsubscribe());
887
- }
888
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: BaseComponent, deps: [{ token: i1.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
889
- /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: BaseComponent, inputs: { handleExpansionPanelChanges: "handleExpansionPanelChanges" }, outputs: { reload: "reload" }, viewQueries: [{ propertyName: "matExpansionPanelElementQueryList", predicate: MatExpansionPanel, descendants: true, read: ElementRef }, { propertyName: "matExpansionPanelQueryList", predicate: MatExpansionPanel, descendants: true }], ngImport: i0 });
890
- }
891
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: BaseComponent, decorators: [{
892
- type: Directive
893
- }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { handleExpansionPanelChanges: [{
894
- type: Input
895
- }], reload: [{
896
- type: Output
897
- }], matExpansionPanelElementQueryList: [{
898
- type: ViewChildren,
899
- args: [MatExpansionPanel, { read: ElementRef }]
900
- }], matExpansionPanelQueryList: [{
901
- type: ViewChildren,
902
- args: [MatExpansionPanel]
903
- }] } });
904
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9iYXNlL2NvbXBvbmVudHMvYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFRLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SixPQUFPLEVBQUUsU0FBUyxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBeUMsTUFBTSxFQUErQixNQUFNLGlCQUFpQixDQUFDO0FBQzdILE9BQU8sRUFBNEIsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0Is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QUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDOzBIQXQrQm9CLGFBQWE7OEdBQWIsYUFBYSx1TEFzTXBCLGlCQUFpQiwyQkFBVSxVQUFVLDZEQU1yQyxpQkFBaUI7OzJGQTVNVixhQUFhO2tCQURsQyxTQUFTO21IQThDRiwyQkFBMkI7c0JBRGpDLEtBQUs7Z0JBdUhDLE1BQU07c0JBRFosTUFBTTtnQkFxQ0csaUNBQWlDO3NCQUQxQyxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFPM0MsMEJBQTBCO3NCQURuQyxZQUFZO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFR5cGUsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uUGFuZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIsIFNjcm9sbCwgVXJsU2VnbWVudCwgVXJsVHJlZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb250ZXh0SGVscGVyIH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5pbXBvcnQgeyBBcHBTZXR0aW5nIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9hcHAtc2V0dGluZyc7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2NhdG9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3NlcnZpY2UtbG9jYXRvcic7XHJcbmltcG9ydCB7IFZkRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL2RpYWxvZ3Mvc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWZE1lZGlhU2VydmljZSB9IGZyb20gJy4uLy4uL21lZGlhL3NlcnZpY2VzL21lZGlhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51IH0gZnJvbSAnLi4vLi4vbWVudS9tb2RlbHMvbWVudSc7XHJcbmltcG9ydCB7IFRhc2tEaWFsb2dEYXRhIH0gZnJvbSAnLi4vYmFzZS5tb2R1bGUnO1xyXG5pbXBvcnQgeyBDb21tb24gfSBmcm9tICcuLi9jb25zdGFudHMvY29tbW9uJztcclxuaW1wb3J0IHsgR2xvYmFsUm9sZXMgfSBmcm9tICcuLi9jb25zdGFudHMvZ2xvYmFsLXJvbGVzJztcclxuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9tZXNzYWdlLXR5cGUnO1xyXG5pbXBvcnQgeyBBdXRoSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9hdXRoLWhlbHBlcic7XHJcbmltcG9ydCB7IElCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pYmFzZS1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBdXRoVXNlciB9IGZyb20gJy4uL21vZGVscy9hdXRoLXVzZXInO1xyXG5pbXBvcnQgeyBWZFRhc2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3Rhc2stZGlhbG9nL3Rhc2stZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQSBiYXNlIGxpc3QgY29tcG9uZW50IGZvciBjb21wb25lbnRzIHdpdGggcGFnaW5hdGlvbiBzdXBwb3J0LlxyXG4gKi9cclxuLy8gQGR5bmFtaWNcclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSUJhc2VDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0LyoqXHJcblx0ICogQXBwbGljYXRpb24gc2V0dGluZ3MuXHJcblx0ICovXHJcblx0cHVibGljIGFwcFNldHRpbmc6IEFwcFNldHRpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgd2l0aCBhIGZsZXhpYmxlIHR5cGUgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXR0aW5nczogYW55ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1lbnUgaXRlbXMgZm9yIG5hdmlnYXRpb24uXHJcblx0ICovXHJcblx0cHVibGljIG1lbnU/OiBNZW51O1xyXG5cclxuXHQvKipcclxuXHQgKiBOYW1lIG9mIHRoZSBwcm9qZWN0LCB1c2VkIGZvciBkaXNwbGF5IG9yIGxvZ2dpbmcgcHVycG9zZXMuXHJcblx0ICovXHJcblx0cHVibGljIHByb2plY3ROYW1lPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaXRsZSBvZiB0aGUgY3VycmVudCBwYWdlLCBkaXNwbGF5ZWQgaW4gdGhlIHBhZ2UgaGVhZGVyLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0aXRsZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3VidGl0bGUgb2YgdGhlIGN1cnJlbnQgb3V0bGV0LCB1c2VkIGZvciBhZGRpdGlvbmFsIHBhZ2UgY29udGV4dC5cclxuXHQgKi9cclxuXHRwdWJsaWMgc3VidGl0bGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIGR1bW15IGRhdGEgaXMgdXNlZCBmb3IgdGVzdGluZywgYW5kIGRlYnVnIGxvZ3MgYXJlIGVuYWJsZWQuXHJcblx0ICovXHJcblx0cHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlx0IFxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGEgbG9hZGluZyBwcm9jZXNzIGlzIGFjdGl2ZSwgb2Z0ZW4gdXNlZCB0byBzaG93IGEgbG9hZGluZyBzcGlubmVyLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGhhbmRsZSBjaGFuZ2VzIGluIGV4cGFuc2lvbiBwYW5lbHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgaGFuZGxlRXhwYW5zaW9uUGFuZWxDaGFuZ2VzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgYSBzYXZlIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXHJcblx0ICovXHJcblx0cHVibGljIF9pc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHB1YmxpYyBnZXQgaXNTYXZpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc1NhdmluZyB8fCB0aGlzLmlzTG9hZGluZzsgfVxyXG5cdHB1YmxpYyBzZXQgaXNTYXZpbmcoaXNTYXZpbmc6IGJvb2xlYW4pIHsgdGhpcy5pc0xvYWRpbmcgPSB0aGlzLl9pc1NhdmluZyA9IGlzU2F2aW5nOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZGl0b3IgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0cHVibGljIGlzRWRpdG9ySW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogU3RvcmVzIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJlcXVlc3RzIG9yIG9wZXJhdGlvbnMuXHJcblx0ICovXHJcblx0cHVibGljIGVycm9yczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpdHkgdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzY3JlZW4gb3Igd2luZG93IHNpemUuXHJcblx0ICovXHJcblx0cHVibGljIG1lZGlhOiBWZE1lZGlhU2VydmljZTtcclxuXHJcblx0LyoqXHJcblx0ICogTGlzdCBvZiBwZXJtaXR0ZWQgZmlsZSBleHRlbnNpb25zIGZvciB1cGxvYWQgb3Igc2VsZWN0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhbGxvd2VkRXh0ZW5zaW9uczogc3RyaW5nW10gPSBDb21tb24uYWxsb3dlZEV4dGVuc2lvbnM7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBsdWdpbnMgZW5hYmxlZCBpbiB0aGUgVGlueU1DRSBlZGl0b3IuXHJcblx0ICovXHJcblx0cHVibGljIGVkaXRvclBsdWdpbnM6IHN0cmluZyA9IENvbW1vbi5lZGl0b3JQbHVnaW5zO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIGNvbmZpZ3VyYXRpb24gZm9yIFRpbnlNQ0UgZWRpdG9yLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0b3JUb29sYmFyOiBzdHJpbmcgPSBDb21tb24uZWRpdG9yVG9vbGJhcjtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZWRpdG9yLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0b3JDb25maWc6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJ2aWNlIGZvciBuYXZpZ2F0aW9uIGFuZCBVUkwgbWFuaXB1bGF0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByb3V0ZXI6IFJvdXRlcjtcclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW9uYWwgaGFzaCB2YWx1ZSBhcHBlbmRlZCB0byBVUkxzIGZvciBib29rbWFya2luZyBvciBzdGF0ZSBtYW5hZ2VtZW50LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB1cmxIYXNoPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBDU1MgY2xhc3MgbmFtZShzKSBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXHJcblx0ICovXHJcblx0cHVibGljIGNsYXNzTmFtZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogUGVybWlzc2lvbiBmbGFnIGZvciBjcmVhdGluZyBuZXcgZW50cmllcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgY2FuQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcm1pc3Npb24gZmxhZyBmb3IgcmVhZGluZyBuZXcgZW50cmllcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgY2FuUmVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQZXJtaXNzaW9uIGZsYWcgZm9yIHVwZGF0aW5nIGV4aXN0aW5nIGVudHJpZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNhblVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQZXJtaXNzaW9uIGZsYWcgZm9yIGRlbGV0aW5nIGVudHJpZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNhbkRlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBGdWxsIHBhdGggb2YgdGhlIGN1cnJlbnQgcm91dGUuXHJcblx0ICovXHJcblx0cHVibGljIGN1cnJlbnRSb3V0ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQmFzZSBwYXRoIG9mIHRoZSBjdXJyZW50IHJvdXRlLCBleGNsdWRpbmcgc3BlY2lmaWMgcGFyYW1ldGVycyBvciBzdWItcGF0aHMuXHJcblx0ICovXHJcblx0cHVibGljIGN1cnJlbnRCYXNlUm91dGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVSTCB0byBuYXZpZ2F0ZSBiYWNrIHRvIGFmdGVyIHNhdmluZyBjaGFuZ2VzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZXR1cm5Vcmw/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRlZCB1c2VyLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjdXJyZW50VXNlcjogQXV0aFVzZXIgPSBBdXRoSGVscGVyLnVzZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyBhZG1pbiBwcml2aWxlZ2VzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0FkbWluID0gQXV0aEhlbHBlci5oYXNSb2xlKEdsb2JhbFJvbGVzLkFkbWluaXN0cmF0b3IpO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgY2xpZW50IGFkbWluIHByaXZpbGVnZXMuXHJcblx0ICovXHJcblx0cHVibGljIGlzQ2xpZW50QWRtaW4gPSBBdXRoSGVscGVyLmhhc1JvbGUoR2xvYmFsUm9sZXMuQ2xpZW50QWRtaW5pc3RyYXRvcik7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyBkZXBhcnRtZW50IGFkbWluIHByaXZpbGVnZXMuXHJcblx0ICovXHJcblx0cHVibGljIGlzRGVwYXJ0bWVudEFkbWluID0gQXV0aEhlbHBlci5oYXNSb2xlKEdsb2JhbFJvbGVzLkRlcGFydG1lbnRBZG1pbmlzdHJhdG9yKTtcclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlciBmb3IgcmVsb2FkIGFjdGlvbnMsIHVzZWZ1bCBmb3IgcmVmcmVzaGluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyByZWxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgZm9yIHNldHRpbmcgdGhlIGRvY3VtZW50J3MgdGl0bGUuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHRpdGxlU2VydmljZTogVGl0bGU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgZm9yIGRpc3BsYXlpbmcgc25hY2sgYmFyIG5vdGlmaWNhdGlvbnMuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNuYWNrQmFyU2VydmljZTogTWF0U25hY2tCYXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgZm9yIGRpc3BsYXlpbmcgY29uZmlybWF0aW9uIGFuZCBwcm9tcHQgZGlhbG9ncy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogVmREaWFsb2dTZXJ2aWNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJ2aWNlIGZvciBvcGVuaW5nIG1vZGFsIGRpYWxvZ3MuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGRpYWxvZzogTWF0RGlhbG9nO1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJ2aWNlIGZvciBtYW5hZ2luZyBicm93c2VyIGxvY2F0aW9uIGFuZCBoaXN0b3J5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBsb2NhdGlvbjogTG9jYXRpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIHNldHMgYSBVUkwgaGFzaCBmb3IgbmF2aWdhdGlvbiBzdGF0ZS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2V0VXJsSGFzaDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFF1ZXJ5IGxpc3QgZm9yIGFjY2Vzc2luZyBleHBhbnNpb24gcGFuZWwgZWxlbWVudHMgYXMgRE9NIHJlZmVyZW5jZXMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZHJlbihNYXRFeHBhbnNpb25QYW5lbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pXHJcblx0cHJvdGVjdGVkIG1hdEV4cGFuc2lvblBhbmVsRWxlbWVudFF1ZXJ5TGlzdD86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnkgbGlzdCBmb3IgYWNjZXNzaW5nIE1hdEV4cGFuc2lvblBhbmVsIGNvbXBvbmVudCByZWZlcmVuY2VzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0RXhwYW5zaW9uUGFuZWwpXHJcblx0cHJvdGVjdGVkIG1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0PzogUXVlcnlMaXN0PE1hdEV4cGFuc2lvblBhbmVsPjtcclxuXHJcblx0LyoqXHJcblx0ICogU3Vic2NyaXB0aW9ucyBmb3IgZXhwYW5zaW9uIHBhbmVsIGNoYW5nZXMsIG1hbmFnZWQgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBtYXRFeHBhbnNpb25QYW5lbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZSBhIGJlZXAgYXVkaW8gb2JqZWN0IGFuZCBsb2FkIGEgc291bmQgZmlsZSBmcm9tIGEgZGF0YSBVUkwuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGJlZXBBdWRpbyA9IG5ldyBBdWRpbyhcImRhdGE6YXVkaW8vd2F2O2Jhc2U2NCwvL3VRUkFBQUFXTVNMd1VJWUFBc1lrWGdvUXdBRWFZTFdma1dnQUkwd1dzL0l0QUFBR0RnWXRBZ0F5TitRV2FBQWlod01XbTRHOFFRUkRpTWNDQmNIM0NjK0NEdi83eEE0VHZoOVJ6L3k4UUFEQndNV2dRQVpHL0lMTkFBUlE0R0xUY0RlSUlJaHhHT0JBdUQ3aE9mQkIzLzk0Z2NKM3crbzUvNWVJQUlBQUFWd1dnUUFWUTJPUmFJUXdFTUFKaURnOTVHNG5RTDdtUVZXSTZHd1JjZnNaQWNzS2tKdnhneEVqekZVZ2ZIb1NROVFxN0tOd3FId3VCMTNNQTRhMXEvRG1CckhnUGNtamlHb2gvL0V3QzVuR1BFbVM0UmNma1ZLT2hKZitXT2dveEpjbEZ6M2tnbi8vZEJBK3lhMUdodXJObjh6Yi8vOU5OdXROdWh6MzFmLy8vLzl2dC8vL3orSWRBRUFBQUs0TFFJQUtvYkhJdEVJWUNHQUV4QndlOGpjVG9GOXpJS3JFZERZSXVQMk1nT1dGU0UzNHdZaVI1aXFRUGowSkllb1ZkbEc0VkQ0WEE2N21BY05hMWZoekExandIdVRSeERVUS8vaVlCY3pqSGlUSmNJdVB5S2xIUWt2L0xIUVVZa3VTaTU3eVFULy91Z2dmWk5halEzVm16K1p0Ly8rbW0zV20zUTU3NnYvLy8vKzMyLy8vNS9FT2dBQUFEVmdoUUFBQUFBLy91UVpBVUFCMVdJMFBadWdBQUFBQW9Rd0FBQUVrM25SZDJxQUFBQUFDaURnQUFBQUFBQUJDcUVFUVJMQ2d3cEJHTWxKa0l6OGpLaEd2ajRrNmp6Um5xYXNOS0llb2g1Z0k3QkphQzFBMUFvTkJqSmdieUFwVlM0SURsWmdEVTVXVUF4RUtETm1tQUxIelpwMEZrejFGTVRtR0ZsMUZNRXlvZElhdmNDQVVIRFdyS0FJQTRhYTJvQ2dJTEVCdXBaZ0h2QWhFQmNaNmpvUUJ4Uzc2QWdjY3JGbGN6QnZLTEMwUUkyY0JvQ0Z2ZlREQW83ZW9PUUlucURQQnR2ckRFWkJOWU41eHdOd3hRUmZ3OFpRNXdRVkx2TzhPWVUrbUh2RkxsRGgwNU1kZzdCVDZZclJQcENCem5NQjJyLy94S0pqeXlPaCtjSW1yMi80ZG9zY3dENm5lWmp1WlI0QWdBQUJZQUFBQUJ5MXhjZFF0eFlCWVlaZGlma1VEZ3p6WGFYbjk4WjBvaTlJTFU1bUJqRkFObVJ3bFZKMy82allEQW14YWlERzMvNnhqUVFDQ0trUmIvNmtnL3dXK2tTSjUvL3JMb2JrTFNpS21xUC8waWtKdURhU2FTZi82SmlMWUxFWW5XLytrWGcxV1JWSkwvOUVtUTFZWklzdi82UXp3eTVxazcvK3RFVTBua2xzMy96SVVNUEtOWC82eVpMZitrRmdBZmdHeUxGQVV3WS8vdVFaQVVBQmNkNVVpTlBWWEFBQUFwQUFBQUFFMFZaUUt3OUlTQUFBQ2dBQUFBQVZRSXlnSUVsVnJGa0JTK0poaStFQXV1K2xLQWtZVUVJc21FQUVvTWVEbUNFVE12ZlNIVEdrRjVSV0g3a3ovRVNIV1BBcS9rY0NSaHFCdE1kb2tQZE03dmlsN1JHOThBMnNjN3pPNlp2VGRNN3BtT1VBWlRuSlcrTlh4cW1kNDFkcUo2bUxUWHhyUHBuVjhhdmFJZjVTdkw3cG5kUHZQcG5kSlI5S3V1OGZlUHZ1aXVob3JnV2pwN01mL1BSanhjRkNQRGtXMzFzcmlvQ0V4aXZ2OWxjd0tFYUhzZi83b3cyRmwxVC85UmtYZ0VoWUVsQW9DTEZ0TUFyeHdpdkRKSitiUjFIVEtKZGxFb1RFTENJcWdFd1ZHU1EraEltME5iSzhXWGNURUkwVVBvYTJOYkc0eTJLMDBKRVdiWmF2SlhrWWFxbzlDUkhTNTVGY1pUaktFazNOS29DWVVuU1Ewcld4clpiRktiS0loT0tQWmUxY0pLelpTYVFySXlVTEhEWm1WNUs0eHlTc0RSS1dPcnVhbkd0akxKWEZFbXdhSWJETFgwaElQQlVRUFZGVmtRa0RvVU5mU29EZ1FHS1Bla294ZUd6QTREVXZubjRieHpjWnJ0SnlpcEtmUE55NXcrOWxuWHdncXNpeUhOZVNWcGVtdzRiV2I5cHNZZXEvL3VRWkJvQUJRdDR5TVZ4WUFJQUFBa1FvQUFBSHZZcEw1bTZBQWdBQUNYREFBQUFENTlqYmxUaXJRZTl1cEZzbVpicE11ZHk3THoxWDFEWXN4T09TV3BmUHFOWDJXcWt0SzBETXZ1R3dsYk5qNDRUbGVMUFErR3NmYitHT1dPS0pvSXJXYjNjSU1lZU9ONmx6MnVtVHFNWFY4TWozMHlXUHBqb1NhOXVqSzhTeWVKUDV5NW1PVzFENmh2TGVwZXZlRUFFRG8wbWdDUkNsT0VnQU52M0I5YTZmaWtnVVN1L0RtQU1BVHJHeDdubmc1cDVpaW1QTlpzZlFMWUIyc0RMSWt6UktaT0hHQWFVeURjcEZCU0xHOU1DUUFMZ0FJZ1FzMll1bk9zekxTQXlRWVBWQzJZZEdHZUhEMmRUZEprMXBBSEdBV0RqbmtjTEtGeW1TM1JRWlRJbnp5U29Cd01HMFF1ZUMzZ01zQ0VZeFVxbHJjeEs2azFMUVFjc215WWVRUGRDMllmdUdQQVNDQmtjVk1RUXFwVkpzaHVpMXRrWFFKUVYwT1hHQVpNWFNPRUVCUmlyWGJWUlFXN3VncTdJTTdyUFdTWnlEbE0zSXVORWt4ekNPSjBueTJUaE5reVJhaTFiNmV2Ly8zZHpOR3pOYi8vNHVBdkhUNXNVUmNaQ0ZjdUtMaE9GczhtTEFBRUF0NFVXQUFJQUJBQUFBQUI0cWJIbzB0SWpWa1VVLy91UVpBd0FCZlNGejNacVFBQUFBQW5nd0FBQUUxSGpNcDJxQUFBQUFDWkRnQUFBRDVVa1RFMVVnWkVVRXhxWXluTjFxWnZxSU9SRUVGbUJjSlFrd2R4aUZ0dzBxRU9rR1lmUkRpZkJ1aTlNUWc0UUFIQXFXdEFXSG9DeHUxWWY0VmZXTFBJTTJtSERGc2JRRVZHd3lxUW9RY3duZkhlSWtOdDlZbmtpYVMxb2l6eWNxSnJ4NEtPUWphaFp4V2JjWmd6dGoyYzQ5bktta0lkNDRTNzFqMGM4ZVY5eURLNnVQUnp4NVgxOGVEdmp2UTZ5S285WlNTNmwvLzhlbGVQSy9MZi8vSUluck9GL0Z2RG9BRFlBR0JNR2I3RnRFcm01TVhNbG1QQUpRVmdXdGE3WngyZ28rOHhKMFVpQ2I4TEhIZGZ0V3lMSkUwUUlBSXNJK1ViWHU2N2RaTWptZ0RHQ0dsMUgrdnBGNE5TRGNrU0lrazdWZCtzeEVoQlFNUlU4ai8xMlVJUmh6U2FVZFErclFVNWtHZUZ4bStoYjFvaDZwV1dtdjN1dm1SZURsMFVudnRhcFZhSXpvMWpaYmYvcEQ2RWxMcVNYK3JVbU9RTnBKRmEvcitzYTRlL3BCbEFBQm9BQUFBQTNDVWdTaExkR0l4c1k3QVVBQlBScmdDQUJkRHVRNUdDN0RxUFFDZ2JiSlVBb1JTVWorTklFaWcwWWZ5V1VobzFWQkJCQS8vdVFaQjRBQlp4NXpmTWFrZUFBQUFtd0FBQUFGNUYzUDB3OUd0QUFBQ2ZBQUFBQXdMaE1EbUFZV01nVkVHMVUwRklHQ0JnWEJYQXRmTUgxMDAwMEVFRUVFRUNVQllsbjAzVFRUZE5CRFpvcG9wWXZyVFRkTmEzMjVtSW1OZzNUVFBWOXEzcG1ZMHhvTzZidjNyMDB5K0lER2lkLzlhYWFaVEdNdWo5bXB1OU1waW8xZFhycjVIRVJUWlNtcVUzNkEzQ3Vtek4vOVJvYnYvWHg0djlpamtTUlNOTFFoQVd1bWFwODJXUlNCVXFYU3RWL1ljUytYVkxuU1MrV0xEcm9xQXJGa01Fc0FTK2VXbXJVenJPMG9FbUU0MFJsTVo1K09ESWtBeUtBR1V3WjNtVkttY2FtY0puTVcyNk1SUGdVdzZqK0xraHlIR1ZHWWpTVVVLTnB1SlVRb09JQXlEdkV5RzhTNXlmSzZkaFpjMFR4MUtJL2d2aUtMNnF2dkZzMStiV3RhejU4dVVObnJ5cTZrdDVSek9Da1BXbFZxVlgyYS9FRUJVZFUxS3JYTGY0MEdvaWlGWEsvLy9xcG9pRFhyT2dxRFIzOEpCMGJ3N1NvTCtaQjlvMVJDa1FqUTJDQllaS2QvK1ZKeFpSUlpscVNrS2l3czBXRnhVeUN3c0tpTXk3aFVWRmhJYUNyTlFzS2tUSXNMaXZ3S0tpZ3NqOFhZbHd0L1dLaTJONGQvL3VRUkNTQUFqVVJOSUhwTVpCR1lpYVFQU1l5QUFBQkxBQUFBQUFBQUNXQUFBQUFwVUYvTWcrMGFvaFNJUm9iQkFzTWxPLy9LazRzb29zeTFKU0ZSWVdhTEM0cVpCWVdGUkdaZHdxS2l3a05CVm1vV0ZTSmtXRnhYNEZGUlFXUitMc1M0Vy9yRlJiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVkVGSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFVMjkxYm1SaWIza3VaR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1qQXdOR2gwZEhBNkx5OTNkM2N1YzI5MWJtUmliM2t1WkdVQUFBQUFBQUFBQUNVPVwiKTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlIGEgd2FybiBhdWRpbyBvYmplY3QgYW5kIGxvYWQgYSBzb3VuZCBmaWxlIGZyb20gYSBkYXRhIFVSTC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgd2FybkF1ZGlvID0gbmV3IEF1ZGlvKFwiZGF0YTphdWRpby9tcDM7YmFzZTY0LC8vdVF4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFXR2x1WndBQUFBOEFBQUFIQUFBS1l3QXBLU2twS1NrcEtTa3BLU2twS1UxTlRVMU5UVTFOVFUxTlRVMU5kM2QzZDNkM2QzZDNkM2QzZDNlQ2dvS0Nnb0tDZ29LQ2dvS0Nnb0t5c3JLeXNyS3lzckt5c3JLeXN0YlcxdGJXMXRiVzF0YlcxdGJXLy8vLy8vLy8vLy8vLy8vLy8vOEFBQUE1VEVGTlJUTXVNVEF3QXFVQUFBQUFMbjRBQUJSR0pBTWZRZ0FBUmdBQUNtT0tsdVFiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvL3VBeEFBQUNWUkxaTlNSZ0FQQ1FpejNNMEFBQUlBQXJBbUNaUHBBQ0FBQVFNVkRQTkdqUnpML2lJZ0dMZit1NGdFSFJBRDRQNE9BZ0dNSHdmQi9VQ0FZNFBoL2dnNzBjUUEvd2NER29Idy9sQVFkeE8vaUIzQjhQNmdRZC96NEFBQUJhTFVrbGVLWUFBQUFBQ1J3Rnd3RVpYQzg1UmkrbytaWEowT3VDWGdvQlVEUVhQQys0WkdCUTBiaVVEd25vQ293TDZqZkFxUkxvZ29CaWtocUpSSlFESkJCT3prOEJrdzZSWUU4Z09HRGhTQk1FQTRDTGxJMDhWd2NhSlJBbVFLRVFiTkRMRE1rQUUrSkpDOExwRGc0RlRCMUMwVG9MQkNlSmtRaUVHTXNuU1hVa1FPa000ZnFITWRSSkZ5WkQyV2tWRWliT2tSZXRaMGQyZElOTkdMQkJEVlJSS2hxc29sdEpJdnJSbGtySUZsQjJKWG1oYmthdEpaTWtna3Nta01uMldpY1NtWlBzbzZsY21YeVpQTFVjYWlWRWxGWlNLaVhaRXNGeEZpaWd0U1JVLy8vL2FvdGYvLy9vcUxMcXFZQVJtQkJESFFBYTYvN0RYSmxJSnpYTEZXY3c4MXFMUDFaZW1uLyszREVEZ0JRWWExcDNaYUFDakUxclBxdzBBRmRFU0FNUmdTNmVxU01wZ0pFVGsxV2dtcGE2eCtDeEtObmRXdEVIa3YwbHV6b0pvQ3FHMlNLQ0wxWGRBUzhsVHkxTDlGUTZIdjZNa1Q2THQxSnFKeGRSLzBCL01mOWxsQkJmN09lUmIrc3lLSnJiNjVXZGR2cm5UUlNtL1RMNkxmN2xoNyt1WXJXZ3dBemNFUUZsZ1prZHR1RGNEb2tKTzc3Ynl1SDRiamNEdnhVWGdYUkVzRG5qalROanRURjhCVW5WdTYxWFRZUWdOc2hwM3V0Und1QW5BWDgyWjEzc2NNUWhqWk5kMTNTY0xhUGRicnF2UUtpUk4xL1ZZYUhSdXU2NlJ3WlpzdjFVcFJMOTEreWxFRk5sMzFXSGNidC9ZNFh6Njc2OWlRVGQyWDJVc2dJLzF5NlozWDlSa2FtNi9xc1ZLYnFBQUFKSUJsTVk0VUFBQUFyQ0I5S2lDc1hYTWU2SHFXSXNLMGh1dHlDQUNNcHdxaGJjd0FzRmdTeEJBMUJzeUxlLy91QXhCZ0FIdklSWTVtcUFBR1JER3Fqbm1BQUZqQUdrVEdJWHpBNG9FTkpFMkFJQWpxSHdMU0JtU0JTUHFBS2FsUWNBM0ErWXRFVkQ4Z1VUa3NjVUxXRGM0cElrRUYrTENSRWk1TkJ2WnFaQzBEYkdjRS9MaUtEYUY4aWZKd1VrUzV4UW5vbUVUZ3llT1dTMlBDQmdMTlBWakxGUlVneDVJcERUTHhqTWhtYzZRS1R6R0l5ekptSXpKdkhVVENKa1E5RlN4OUZ5U2hmeC81ZkxTWlNJa2ZNQjBteG9tUUVxcEdRN3k4b3ZNeVJIaytrbVJ4aGs2ZnlCSlR4TlpZSjgzUklFZlRVT2FpbzRSWFVSSTJNajVoLy8vL25TVy8vLy9RblNSUUNwQUFrU0xhTGFKcVMxWlA0VzROVVhGWVR5SEljcms4Y3gxWURBSkp5SkdlMWVTSkhEaVUvL3NjREFKRmlTUWRMQlFHandLZ3JnclBZTkEwb0dnNlZCYkVvS3ZCWGtsQTFxUEZRM2xRVldDdkJXRFFkNnpzU2dyaVdXRG1vR3A3N3ZMQnkvLzh0ZmwwWmw3LzlmLy8vLy8vLy8zMHk3Y3lacWVGbDF5WVVaUUV3dUdOYUlFLy8vLy8vLy8vLy8vLy8reERFRmdQRVZiRVFBQVIreUtRMFlnS0FJQUgvL3QzcC83cysxV1JPbjlmLy8vL3ZYNlZkamxiYzdUbEtzamhsRWtBb2xZalFjRGdZNWs4RlFRVUFRU0FMdE1BUWNkSUFJRW1PZURCSUZEQUFzd2RBWnNwYlpLeEh5RURBU1pJRmgyQk80TmpoRGYvN2tNUVpnQitxRVZ1NXVwQVN3VFhzTTdNUUFRTWFCRUFZQW9NNEJ3YkRMNHNRR0hqNEIwUXpBTUxZbkNxWGlDRUVGQ0EzZ0tvQVFCQy93R2NVbUF3SFI0SXVvMFRGd0V5Uk5NdmhmRURBUWpBSUVBeDRnRHFRUEptNXVYR0lJWWgrUU1DNUFSY29qSUZnei9JbVN3eTVYSXViR2dmNEc4b0dFZ0FDd0dSSFVCZ2tILzhuR2NxRjgzTDV1d2RrWEtROENBQkx3cElQWkRha2YvdWhOQ2JJbU9lVDdrVFVvZFFXS0RHa0ZERmlpYUhLQzlCRWYvL1FXYm1aZmN2cE0yczNhTlVjU0tJM3lrWGlMaWwyU0tJNUgvLy8vdVgwa1AvLy96WlF2aWRRQWJnQUNFQUJqS2FqdElJanRJQ1dXdXU1REVQUHRLczQ5cFJNSTJGd2tzek9zNHFVQUl3VVJaZzZLUzAyaU1SQVlpeHN0MGw1cTRhT1V6VkEyT3FjMFNMSWFrR05DZ1hqR3RDaXh3UjJUcFZkYXJzcFprSi9ObHBYWlNNekhna2lkcloyclFNUmhGNU83S1d0ak1aVW4wazJwVkp5SEVSS0tGS3BkMkc0WDJkbEx1eXlIRjh2c2t5azZLU3h5REkyWlNyT3RSaVNCYVdxenJVaVlFNGJsYWh1eTFKRHdYVkx2V3AwQ2VLQnFJWHdEVEJrSkNBRGRhMGZhVTFVVnBzTnVQLzdjTVFJZ0ZKZHJXV05QVytLVGJZczhyRFFBT0M4OHRvNVBLcC9TMlM2QjNIMWFMVEVLU3NNR2VmVnE2Kzk0eGhoRGNnNXp2Vk1XMVVlQmp1dm5QMzg1akVUZk9lN21kVUJ5UTYxUkhkekpXSUpySS82cEFVcVdxSStxWVVxSS9mUDB3V1B1N21QcktoL1VqdTVudXg3ZTI3LzRsdzFvUkZWVXp1TTJIdWZxb2hoQ24yUjFYOGtxbDdtZTdpRkRwNjUvKzNrRENuUUNsRVFSMzMzdHVnd0FIdERWdS9BOUM1Ylc2V3pSWU93SlJHSERsa3V0YWFaaW1hQVRVWlp1YnBLdXVnSjRGVlY5U25TQkxJSGtqQkIzVXc3d1I4TmxBNm5aYTF1WkIwUG1qTDlsazhlQ2xLc3ZZNk9NOGgrcEE2Tmh4VjZ1WmxNMWRtWHVwVGtJNnUvWFFKVXUyWmRtWE15V092NjEySkZUdXBkdFJnaWc2cjFYU0swRGQxZTZqQTNQTFhaU3JxTUhOR1ZBQXdRUVlpQUFBQUFBQUFpUWd6Lys0REVCd0FkWmRsZldhbUFBVkVVbzVlWVVBQ0pqbUZ3TUJjQVcxYUNKNEtJRm5uaWJFRG4waEdWS2cwakFVMHNRMFVtUTRkd3FBRHZGNExxdzRZeEJqVVRWYVFMalBsY09qQXRnWk5qRTRPY1dRYUVBMFBITks0ZkFGL0FWRUlTRFBuQ0JGWXlKNFJVYWFUQ25DcUQyeGNTNDRoaUZGRnBpaFdIL0t0WTJTNFJnajArUlF4RXBFMG92RjR5TmxrekxZcHVpSkl4ZU16VVZzY0p3ZlJPbW5SWW1wa1hwSGp1VkYxdU9rbHlLRHBMU0p1THBNd0lJUG9ta2t0R3RqS3FvV2hMRytjbmlCWmtOczBJb1Z6VkV2anlVeXdPUVRKTUdob1JZeVUraXkwVExNbFhrb1MzLy8vNWZNU2VSLy9hQ29Fb0JhTWo2RXhKcXdRZ0pLQkNBa0ZUWkpQWURKZ0dBSURDeWlJZEsvME1hWjFLVkJJUE1KQjR5bFpETVlXTS8vME5US1dZUE1EUThOQTBBZ2EvNEtsZzREU3pvaVVIZitkTEhrM0NLZS93VmNvOXhFcE1RVTFGTXk0eE1EQ3FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxZz09XCIpO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXplcyBzZXJ2aWNlcyBhbmQgYXBwbGljYXRpb24gc2V0dGluZ3MsIHNldHMgdXAgY29udGV4dCBoZWxwZXJzLCBcclxuXHQgKiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGVkaXRvciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcm91dGUgLSBBY3RpdmF0ZWRSb3V0ZSBpbnN0YW5jZSBmb3IgYWNjZXNzaW5nIHJvdXRlIHBhcmFtZXRlcnMgYW5kIGRhdGEuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIC0gQ2hhbmdlRGV0ZWN0b3JSZWYgaW5zdGFuY2UgZm9yIG1hbnVhbGx5IHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBUaXRsZSBzZXJ2aWNlICovXHJcblx0XHR0aGlzLnRpdGxlU2VydmljZSA9IHRoaXMuZ2V0U2VydmljZShUaXRsZSk7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgZGlhbG9nIHNlcnZpY2UgZm9yIHNob3dpbmcgbW9kYWxzICovXHJcblx0XHR0aGlzLmRpYWxvZ1NlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UoVmREaWFsb2dTZXJ2aWNlKTtcclxuXHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBNYXRlcmlhbCBkaWFsb2cgZm9yIG1hbmFnaW5nIGRpYWxvZ3MgKi9cclxuXHRcdHRoaXMuZGlhbG9nID0gdGhpcy5nZXRTZXJ2aWNlKE1hdERpYWxvZyk7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgbWVkaWEgc2VydmljZSBmb3IgbWVkaWEgcXVlcmllcyBhbmQgYnJvYWRjYXN0ICovXHJcblx0XHR0aGlzLm1lZGlhID0gdGhpcy5nZXRTZXJ2aWNlKFZkTWVkaWFTZXJ2aWNlKTtcclxuXHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBzbmFja2JhciBzZXJ2aWNlIGZvciBub3RpZmljYXRpb25zICovXHJcblx0XHR0aGlzLnNuYWNrQmFyU2VydmljZSA9IHRoaXMuZ2V0U2VydmljZShNYXRTbmFja0Jhcik7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgcm91dGVyIHNlcnZpY2UgZm9yIG5hdmlnYXRpb24gKi9cclxuXHRcdHRoaXMucm91dGVyID0gdGhpcy5nZXRTZXJ2aWNlKFJvdXRlcik7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MgKi9cclxuXHRcdHRoaXMuYXBwU2V0dGluZyA9IHRoaXMuZ2V0U2VydmljZShBcHBTZXR0aW5nKTtcclxuXHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBsb2NhdGlvbiBzZXJ2aWNlIGZvciBVUkwgbWFuaXB1bGF0aW9uICovXHJcblx0XHR0aGlzLmxvY2F0aW9uID0gdGhpcy5nZXRTZXJ2aWNlKExvY2F0aW9uKTtcclxuXHJcblx0XHQvKiBTZXQgdXAgY29udGV4dCBoZWxwZXJzIHdpdGggcm91dGUgYW5kIGFwcGxpY2F0aW9uIHNldHRpbmdzICovXHJcblx0XHRDb250ZXh0SGVscGVyLmFjdGl2YXRlZFJvdXRlID0gcm91dGU7XHJcblx0XHRDb250ZXh0SGVscGVyLnJvdXRlciA9IHRoaXMucm91dGVyO1xyXG5cdFx0Q29udGV4dEhlbHBlci5hcHBTZXR0aW5nID0gdGhpcy5hcHBTZXR0aW5nO1xyXG5cclxuXHRcdC8qIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi9cclxuXHRcdHRoaXMuaW5pdEVkaXRvcigpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIG9mIGEgZGlyZWN0aXZlIGFyZSBpbml0aWFsaXplZFxyXG5cdCAqL1xyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0LyogR2V0IG1lbnUgaXRlbXMgZnJvbSByb3V0ZSBzbmFwc2hvdCAqL1xyXG5cdFx0dmFyIG1haW5Sb3V0ZSA9IHRoaXMuZ2V0TWFpblJvdXRlKHRoaXMucm91dGUuc25hcHNob3QpO1xyXG5cdFx0aWYgKG1haW5Sb3V0ZSkge1xyXG5cdFx0XHR0aGlzLm1lbnUgPSBtYWluUm91dGUuZGF0YS5tZW51O1xyXG5cdFx0XHR0aGlzLnNldFRpdGxlcygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBwcm9qZWN0IG5hbWUgJiBkZWJ1ZyBtb2RlICovXHJcblx0XHR0aGlzLnByb2plY3ROYW1lID0gdGhpcy5hcHBTZXR0aW5nLnByb2plY3ROYW1lO1xyXG5cdFx0dGhpcy5kZWJ1ZyA9IHRoaXMuYXBwU2V0dGluZy5kZWJ1ZyA/PyBmYWxzZTtcclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjcmVhdGUsIHVwZGF0ZSwgYW5kIGRlbGV0ZSAqL1xyXG5cdFx0dGhpcy5jYW5DcmVhdGUgfHw9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoJ0NyZWF0ZScpO1xyXG5cdFx0dGhpcy5jYW5VcGRhdGUgfHw9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoJ1VwZGF0ZScpO1xyXG5cdFx0dGhpcy5jYW5EZWxldGUgfHw9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoJ0RlbGV0ZScpO1xyXG5cclxuXHRcdC8qIEdldCB0aGUgaGFzaCBmcm9tIHRoZSBVUkwgKi9cclxuXHRcdHRoaXMucm91dGUuZnJhZ21lbnQuc3Vic2NyaWJlKChmcmFnbWVudDogc3RyaW5nIHwgYW55KSA9PiB0aGlzLnVybEhhc2ggPSBmcmFnbWVudCk7XHJcblxyXG5cdFx0LyogQ2hlY2sgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIHJvdXRlICovXHJcblx0XHRpZiAodGhpcy5yb3V0ZS5wYXJlbnQpIHtcclxuXHRcdFx0dGhpcy5yb3V0ZS5wYXJlbnQudXJsLnN1YnNjcmliZSgodXJsOiBVcmxTZWdtZW50W10pID0+IHtcclxuXHRcdFx0XHR0aGlzLmNsYXNzTmFtZSA/Pz0gdXJsLmxlbmd0aCA/IHVybFswXS5wYXRoLnJlcGxhY2UoLyguKilzJC8sICckMScpLnJlcGxhY2UoL14uLywgKHVybFswXS5wYXRoWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSA6ICcnO1xyXG5cdFx0XHRcdHRoaXMuY2FuQ3JlYXRlID0gQXV0aEhlbHBlci5pc1Blcm1pdHRlZChgQ3JlYXRlJHt0aGlzLmNsYXNzTmFtZX1gKTtcclxuXHRcdFx0XHR0aGlzLmNhblVwZGF0ZSA9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoYFVwZGF0ZSR7dGhpcy5jbGFzc05hbWV9YCk7XHJcblx0XHRcdFx0dGhpcy5jYW5EZWxldGUgPSBBdXRoSGVscGVyLmlzUGVybWl0dGVkKGBEZWxldGUke3RoaXMuY2xhc3NOYW1lfWApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBTZXQgdGhlIGN1cnJlbnQgcm91dGUgYW5kIGJhc2Ugcm91dGUgKi9cclxuXHRcdHRoaXMuY3VycmVudFJvdXRlID0gd2luZG93LmJ0b2EodGhpcy5yb3V0ZXIudXJsKTtcclxuXHRcdHRoaXMuY3VycmVudEJhc2VSb3V0ZSA9IHRoaXMucm91dGVyLnVybD8uc3BsaXQoJz8nKVswXT8uc3BsaXQoJzsnKVswXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCB0aGUgcGFnZSB0aXRsZSBiYXNlZCBvbiB0aGUgbmF2aWdhdGlvbiBlbmQgZXZlbnRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSh4ID0+IHtcclxuXHRcdFx0bGV0IG5hdmlnYXRpb25FbmQgPSAoeCBhcyBTY3JvbGwpPy5yb3V0ZXJFdmVudCBhcyBOYXZpZ2F0aW9uRW5kO1xyXG5cdFx0XHRpZiAobmF2aWdhdGlvbkVuZCkge1xyXG5cdFx0XHRcdHRoaXMuc2V0VGl0bGVzKCk7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50Um91dGUgPSB3aW5kb3cuYnRvYShuYXZpZ2F0aW9uRW5kLnVybCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIFJldHJpZXZlIHRoZSByZXR1cm4gVVJMIGlmIGFueSBmcm9tIHRoZSBxdWVyeSBwYXJhbWV0ZXJzICovXHJcblx0XHR0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSh4ID0+IHRoaXMuc2V0UmV0dXJuVXJsKHgucmV0dXJuVXJsKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBhIGNvbXBvbmVudCdzIHZpZXcgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWRcclxuXHQgKi9cclxuXHRuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHQvKiBCcm9hZGNhc3QgdG8gYWxsIGxpc3RlbmVyIG9ic2VydmFibGVzIHdoZW4gbG9hZGluZyB0aGUgcGFnZSAqL1xyXG5cdFx0dGhpcy5tZWRpYS5icm9hZGNhc3QoKTtcclxuXHJcblx0XHQvKiBTZXQgcGFnZSB0aXRsZXMgKi9cclxuXHRcdHRoaXMuc2V0VGl0bGVzKCk7XHJcblxyXG5cdFx0LyogXHJcblx0XHQgKiBGb3JjZSBhIG5ldyBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIHNpbmNlIGNoYW5nZSBkZXRlY3Rpb25zIFxyXG5cdFx0ICogaGF2ZSBmaW5pc2hlZCB3aGVuIGBuZ0FmdGVyVmlld0luaXRgIGlzIGV4ZWN1dGVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdC8qIExpc3RlbiBmb3IgZXhwYW5zaW9uIHBhbmVsIGNoYW5nZXMgaWYgZW5hYmxlZCAqL1xyXG5cdFx0aWYgKHRoaXMuaGFuZGxlRXhwYW5zaW9uUGFuZWxDaGFuZ2VzKSB7XHJcblx0XHRcdHRoaXMub25FeHBhbnNpb25QYW5lbENoYW5nZXMoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbG9hZHMgdGhlIGN1cnJlbnQgcGFnZSBvciBjb21wb25lbnQuXHJcblx0ICogXHJcblx0ICogVGhpcyBtZXRob2QgbmF2aWdhdGVzIHRlbXBvcmFyaWx5IHRvIHRoZSByb290IFVSTCBhbmQgdGhlbiBcclxuXHQgKiBuYXZpZ2F0ZXMgYmFjayB0byB0aGUgY3VycmVudCBVUkwgdG8gZWZmZWN0aXZlbHkgcmVmcmVzaCB0aGUgcGFnZSBvciBjb21wb25lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgbmF2aWdhdGlvbiBpcyBzdWNjZXNzZnVsLFxyXG5cdCAqICAgICAgICAgICAgICAgICAgIHJlY2VpdmVzIHRoZSBjdXJyZW50IFVSTCBhcyBhbiBhcmd1bWVudC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcmVsb2FkUGFnZShjYWxsYmFjaz86IChjdXJyZW50VXJsOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuXHRcdGxldCBjdXJyZW50VXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG5cdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KS50aGVuKCgpID0+IHtcclxuXHRcdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsLCB7IHJlcGxhY2VVcmw6IHRydWUgfSkudGhlbigoKSA9PiB7XHJcblx0XHRcdFx0LyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgaWYgcHJvdmlkZWQgKi9cclxuXHRcdFx0XHRpZiAoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGNhbGxiYWNrKGN1cnJlbnRVcmwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlcyBiYWNrIHRvIHRoZSByZXR1cm4gVVJMIGlmIGl0IGV4aXN0cy5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmF2aWdhdGVUb1JldHVyblVybCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnJldHVyblVybCkge1xyXG5cdFx0XHQvKiBQYXJzZSB0aGUgcmV0dXJuIFVSTCBpbnRvIGEgVXJsVHJlZSBvYmplY3QgKi9cclxuXHRcdFx0bGV0IHVybFRyZWU6IFVybFRyZWUgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh0aGlzLnJldHVyblVybCk7XHJcblxyXG5cdFx0XHQvKiBOYXZpZ2F0ZSB0byB0aGUgcmV0dXJuIFVSTCAqL1xyXG5cdFx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHVybFRyZWUudG9TdHJpbmcoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiBcclxuXHQgKiBGb3JjZXMgYSBuZXcgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBzaW5jZSBjaGFuZ2UgZGV0ZWN0aW9ucyBcclxuXHQgKiBoYXZlIGZpbmlzaGVkIHdoZW4gYG5nQWZ0ZXJWaWV3SW5pdGAgaXMgZXhlY3V0ZWQuXHJcblx0ICovXHJcblx0cHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmV0dXJuIFVSTCBhZnRlciBkZWNvZGluZyBpdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSByZXR1cm5VcmwgLSBUaGUgZW5jb2RlZCByZXR1cm4gVVJMIHRvIHNldC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2V0UmV0dXJuVXJsKHJldHVyblVybDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvKiBEZWNvZGUgYW5kIHNldCB0aGUgcmV0dXJuIFVSTCwgaGFuZGxpbmcgcG90ZW50aWFsIGVycm9ycyAqL1xyXG5cdFx0XHR0aGlzLnJldHVyblVybCA9IHJldHVyblVybCA/IGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHJldHVyblVybCkpIDogdW5kZWZpbmVkO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0LyogSGFuZGxlIGVycm9yIHNpbGVudGx5ICovXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaXN0ZW4gZm9yIGV4cGFuc2lvbiBwYW5lbCBjaGFuZ2VzXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uRXhwYW5zaW9uUGFuZWxDaGFuZ2VzKCk6IHZvaWQge1xyXG5cdFx0LyogTGlzdGVuIGZvciBleHBhbnNpb24gcGFuZWwgY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5tYXRFeHBhbnNpb25QYW5lbFF1ZXJ5TGlzdD8uY2hhbmdlcy5zdWJzY3JpYmUoXyA9PiB7XHJcblx0XHRcdC8qIFVuc3Vic2NyaWJlIGZyb20gb2xkICdvcGVuZWQnIGFuZCAnY2xvc2VkJyBzdWJzY3JpcHRpb25zICovXHJcblx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxTdWJzY3JpcHRpb25zLmZvckVhY2goeCA9PiB4LnVuc3Vic2NyaWJlKCkpO1xyXG5cclxuXHRcdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG5cdFx0XHQvKiBHZXQgdGhlIHBhbmVsIGVuZHMgd2l0aCB0aGUgSUQgJ25ldycgKi9cclxuXHRcdFx0dmFyIG5ld0V4cGFuc2lvblBhbmVsSW5kZXggPSB0aGlzLm1hdEV4cGFuc2lvblBhbmVsRWxlbWVudFF1ZXJ5TGlzdD8udG9BcnJheSgpPy5maW5kSW5kZXgoeCA9PiB4Lm5hdGl2ZUVsZW1lbnQ/LmlkPy5lbmRzV2l0aCgnLm5ldycpKSA/PyAtMTtcclxuXHRcdFx0aWYgKG5ld0V4cGFuc2lvblBhbmVsSW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdC8qIENsb3NlIGFsbCBwYW5lbHMgKi9cclxuXHRcdFx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0Py5maXJzdD8uYWNjb3JkaW9uPy5jbG9zZUFsbCgpO1xyXG5cclxuXHRcdFx0XHQvKiBPcGVuIHRoZSBuZXcgcGFuZWwgKi9cclxuXHRcdFx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0Py50b0FycmF5KClbbmV3RXhwYW5zaW9uUGFuZWxJbmRleF0/Lm9wZW4oKTtcclxuXHJcblx0XHRcdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvKiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgcGFuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgSUQgKi9cclxuXHRcdFx0XHR0aGlzLnVybEhhc2g/LnNwbGl0KCcuJylcclxuXHRcdFx0XHRcdD8ucmVkdWNlKChhY2N1bXVsYXRvcjogYW55LCBjdXJyZW50VmFsdWUsIGluZGV4KSA9PiBhY2N1bXVsYXRvci5jb25jYXQoKGluZGV4ID4gMCA/IChhY2N1bXVsYXRvci5zbGljZSgtMSkuam9pbignLicpICsgJy4nKSA6ICcnKSArIGN1cnJlbnRWYWx1ZSksIFtdKVxyXG5cdFx0XHRcdFx0Py5mb3JFYWNoKChoYXNoOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIGV4cGFuc2lvblBhbmVsSW5kZXggPSB0aGlzLm1hdEV4cGFuc2lvblBhbmVsRWxlbWVudFF1ZXJ5TGlzdD8udG9BcnJheSgpPy5maW5kSW5kZXgoeCA9PiB4Lm5hdGl2ZUVsZW1lbnQuaWQgPT0gaGFzaCkgPz8gLTE7XHJcblx0XHRcdFx0XHRcdGlmIChleHBhbnNpb25QYW5lbEluZGV4ID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0Py50b0FycmF5KClbZXhwYW5zaW9uUGFuZWxJbmRleF0/Lm9wZW4oKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIERldGVjdCBjaGFuZ2VzIGZvciBvcGVuZWQgcGFuZWxzICovXHJcblx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxRdWVyeUxpc3Q/LmZvckVhY2goeSA9PiB7XHJcblx0XHRcdFx0dGhpcy5tYXRFeHBhbnNpb25QYW5lbFN1YnNjcmlwdGlvbnMucHVzaCh5Lm9wZW5lZC5zdWJzY3JpYmUoXyA9PiB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXRVcmxIYXNoKSB7XHJcblx0XHRcdFx0XHRcdC8qIEdldCB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgb3BlbmVkIHBhbmVsICovXHJcblx0XHRcdFx0XHRcdHZhciBjdXJyZW50UGFuZWxJZCA9IHlbJ192aWV3Q29udGFpbmVyUmVmJ10/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LmlkO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHBhbmVsIElEIGlzIHNldCwgc2V0IGl0IGFzIHVybCBzZWdtZW50IChoYXNoKSAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudFBhbmVsSWQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyBmcmFnbWVudDogY3VycmVudFBhbmVsSWQsIHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIE90aGVyd2lzZSByZW1vdmUgdGhlIHNlZ21lbnQgZnJvbSB0aGUgdXJsICovXHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBEZXRlY3QgY2hhbmdlcyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdFx0XHQvKiBEZXRlY3QgY2hhbmdlcyBmb3IgY2xvc2VkIHBhbmVscyAqL1xyXG5cdFx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxTdWJzY3JpcHRpb25zLnB1c2goeS5jbG9zZWQuc3Vic2NyaWJlKF8gPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0VXJsSGFzaCkge1xyXG5cdFx0XHRcdFx0XHQvKiBHZXQgdGhlIGlkIG9mIHRoZSBjdXJyZW50IG9wZW5lZCBwYW5lbCAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgY3VycmVudFBhbmVsSWRQYXJ0cyA9IHlbJ192aWV3Q29udGFpbmVyUmVmJ10/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LmlkPy5zcGxpdCgnLicpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHBhbmVsIElEIGlzIHNldCwgc2V0IGl0IGFzIHVybCBzZWdtZW50IChoYXNoKSAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudFBhbmVsSWRQYXJ0cy5sZW5ndGggPiAxKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHsgZnJhZ21lbnQ6IGN1cnJlbnRQYW5lbElkUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKSwgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIERldGVjdCBjaGFuZ2VzICovXHJcblx0XHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogTm90aWZ5IGV4cGFuc2lvbiBwYW5lbCBsaXN0IGNoYW5nZXMgKi9cclxuXHRcdGlmICh0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0KSB7XHJcblx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxRdWVyeUxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgZnJvbSB0aGUgaW5qZWN0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRva2VuLlxyXG5cdCAqIElmIG5vdCBmb3VuZDpcclxuXHQgKiAtIFRocm93cyB7QGxpbmsgTm9Qcm92aWRlckVycm9yfSBpZiBubyBgbm90Rm91bmRWYWx1ZWAgdGhhdCBpcyBub3QgZXF1YWwgdG9cclxuXHQgKiBJbmplY3Rvci5USFJPV19JRl9OT1RfRk9VTkQgaXMgZ2l2ZW5cclxuXHQgKiAtIFJldHVybnMgdGhlIGBub3RGb3VuZFZhbHVlYCBvdGhlcndpc2VcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZ2V0U2VydmljZTxUPih0b2tlbjogVHlwZTxUPik6IFQge1xyXG5cdFx0cmV0dXJuIFNlcnZpY2VMb2NhdG9yLmdldFNlcnZpY2UodG9rZW4pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgbWFpbiByb3V0ZSBmcm9tIHRoZSBnaXZlbiBzbmFwc2hvdCBieSB0cmF2ZXJzaW5nIHVwIHRvIHRoZSBwYXJlbnQgcm91dGVzXHJcblx0ICogaWYgdGhlIGN1cnJlbnQgc25hcHNob3QgZG9lcyBub3QgaGF2ZSBhIG1lbnUgZGVmaW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBzbmFwc2hvdCAtIFRoZSBhY3RpdmF0ZWQgcm91dGUgc25hcHNob3QgdG8gZXZhbHVhdGUuXHJcblx0ICogQHJldHVybnMgVGhlIG1haW4gcm91dGUgc25hcHNob3QgdGhhdCBoYXMgYSBtZW51IGRlZmluZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldE1haW5Sb3V0ZShzbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xyXG5cdFx0aWYgKHNuYXBzaG90ICYmIHNuYXBzaG90IS5wYXJlbnQgJiYgIXNuYXBzaG90LmRhdGEubWVudSkge1xyXG5cdFx0XHQvKiBSZWN1cnNpdmVseSBjYWxsIHRvIGdldCB0aGUgbWFpbiByb3V0ZSBmcm9tIHRoZSBwYXJlbnQgc25hcHNob3QgKi9cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0TWFpblJvdXRlKHNuYXBzaG90IS5wYXJlbnQhKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25hcHNob3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93cyBhIGNvbmZpcm0gZGlhbG9nIHRvIGRlbGV0ZSBhIHNpbmdsZSBpdGVtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGRpYWxvZyBhZnRlciBpdCBpcyBjbG9zZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dEZWxldGVJdGVtRGlhbG9nKCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Db25maXJtKHtcclxuXHRcdFx0bWVzc2FnZTogJGxvY2FsaXplYDpAQGRpYWxvZy5tZXNzYWdlLmRlbGV0ZS5vbmU6QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGl0ZW0/YCxcclxuXHRcdFx0dGl0bGU6ICRsb2NhbGl6ZWA6QEBkaWFsb2cudGl0bGUuZGVsZXRlOkNvbmZpcm0gRGVsZXRlYCxcclxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAkbG9jYWxpemVgOkBAY2FuY2VsOkNhbmNlbGAsXHJcblx0XHRcdGFjY2VwdEJ1dHRvbjogJGxvY2FsaXplYDpAQGRlbGV0ZTpEZWxldGVgLFxyXG5cdFx0fSkuYWZ0ZXJDbG9zZWQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIGEgY29uZmlybSBkaWFsb2cgdG8gZGVsZXRlIG11bHRpcGxlIHNlbGVjdGVkIGl0ZW1zLlxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGRpYWxvZyBhZnRlciBpdCBpcyBjbG9zZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dEZWxldGVJdGVtc0RpYWxvZygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuQ29uZmlybSh7XHJcblx0XHRcdG1lc3NhZ2U6ICRsb2NhbGl6ZWA6QEBkaWFsb2cubWVzc2FnZS5kZWxldGUubGlzdDpBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCBpdGVtcz9gLFxyXG5cdFx0XHR0aXRsZTogJGxvY2FsaXplYDpAQGRpYWxvZy50aXRsZS5kZWxldGU6Q29uZmlybSBEZWxldGVgLFxyXG5cdFx0XHRjYW5jZWxCdXR0b246ICRsb2NhbGl6ZWA6QEBjYW5jZWw6Q2FuY2VsYCxcclxuXHRcdFx0YWNjZXB0QnV0dG9uOiAkbG9jYWxpemVgOkBAZGVsZXRlOkRlbGV0ZWAsXHJcblx0XHR9KS5hZnRlckNsb3NlZCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIHNlbmQgc29tZSBkYXRhLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiB0aGUgZGlhbG9nLlxyXG5cdCAqIEBwYXJhbSBvYnNlcnZhYmxlIC0gVGhlIG9ic2VydmFibGUgaW5zdGFuY2UgdG8gaGFuZGxlIHRoZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSBzdWNjZXNzQ2FsbGJhY2sgLSBPcHRpb25hbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLlxyXG5cdCAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBhbiBlcnJvci5cclxuXHQgKiBAcGFyYW0gYWNjZXB0QnV0dG9uVGV4dCAtIE9wdGlvbmFsIHRleHQgZm9yIHRoZSBhY2NlcHQgYnV0dG9uLlxyXG5cdCAqIEBwYXJhbSBjYW5jZWxCdXR0b25UZXh0IC0gT3B0aW9uYWwgdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b24uXHJcblx0ICovXHJcblx0cHVibGljIHNob3dDb25maXJtYXRpb25EaWFsb2coXHJcblx0XHRtZXNzYWdlOiBzdHJpbmcsXHJcblx0XHRvYnNlcnZhYmU6IE9ic2VydmFibGU8YW55PixcclxuXHRcdHN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLFxyXG5cdFx0ZXJyb3JDYWxsYmFjaz86IEZ1bmN0aW9uLFxyXG5cdFx0YWNjZXB0QnV0dG9uVGV4dD86IHN0cmluZyxcclxuXHRcdGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmcsXHJcblx0XHRkaWFsb2dDb25maWc/OiBNYXREaWFsb2dDb25maWdcclxuXHQpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlhbG9nU2VydmljZVxyXG5cdFx0XHQub3BlbkNvbmZpcm0oe1xyXG5cdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2UsXHJcblx0XHRcdFx0dGl0bGU6ICRsb2NhbGl6ZWA6QEBkaWFsb2cudGl0bGUuY29uZmlybTpDb25maXJtYCxcclxuXHRcdFx0XHRjYW5jZWxCdXR0b246IGNhbmNlbEJ1dHRvblRleHQgPz8gJGxvY2FsaXplYDpAQGNhbmNlbDpDYW5jZWxgLFxyXG5cdFx0XHRcdGFjY2VwdEJ1dHRvbjogYWNjZXB0QnV0dG9uVGV4dCA/PyAkbG9jYWxpemVgOkBAeWVzOlllc2AsXHJcblx0XHRcdH0sIGRpYWxvZ0NvbmZpZyA/PyAoPE1hdERpYWxvZ0NvbmZpZz57IG1heFdpZHRoOiA0ODAgfSkpXHJcblx0XHRcdC5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoYWNjZXB0OiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0aWYgKGFjY2VwdCkge1xyXG5cdFx0XHRcdFx0b2JzZXJ2YWJlLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0XHRcdG5leHQ6ICh4KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zaG93TWVzc2FnZSgkbG9jYWxpemVgOkBAc25hY2tiYXIuc2VuZC5zdWNjZXNzOkRhdGEgc2VudCBzdWNjZXNzZnVsbHkuYCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3VjY2Vzc0NhbGxiYWNrKHgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSwgZXJyb3I6IChlcnJvcnMpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGVycm9yQ2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soZXJyb3JzKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPcGVucyBhIHRhc2sgZGlhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLlxyXG5cdCAqIFxyXG5cdCAqIEB0eXBlcGFyYW0gVFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgcmV0dXJuZWQgZnJvbSB0aGUgZGlhbG9nLlxyXG5cdCAqIEBwYXJhbSB7UGFydGlhbDxUYXNrRGlhbG9nRGF0YTxUUmVzdWx0Pj59IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHRhc2sgZGlhbG9nLCBpbmNsdWRpbmcgbWVzc2FnZXMsIGNhbGxiYWNrcywgYW5kIG9ic2VydmFibGUgdGFza3MuXHJcblx0ICogXHJcblx0ICogQGV4YW1wbGUgXHJcblx0ICogLy8gRXhhbXBsZSBvZiBob3cgdG8gY2FsbCBzaG93VGFza0RpYWxvZ1xyXG5cdCAqIHRoaXMuc2hvd1Rhc2tEaWFsb2coe1xyXG5cdCAqICAgICB0aXRsZTogJ1Byb2Nlc3NpbmcgVGFzaycsXHJcblx0ICogICAgIGluUHJvZ3Jlc3NNZXNzYWdlOiAnWW91ciB0YXNrIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy4uLicsXHJcblx0ICogICAgIHN1Y2Nlc3NNZXNzYWdlOiAnVGFzayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScsXHJcblx0ICogICAgIGVycm9yTWVzc2FnZTogJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgeW91ciB0YXNrLicsXHJcblx0ICogICAgIHRhc2s6IHRoaXMuc29tZU9ic2VydmFibGVUYXNrKCksIC8vIFlvdXIgb2JzZXJ2YWJsZSB0YXNrIGdvZXMgaGVyZVxyXG5cdCAqICAgICBzdWNjZXNzQnV0dG9uQ2xpY2s6IChyZXN1bHQsIGRyKSA9PiB7XHJcblx0ICogICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzcyBidXR0b24gY2xpY2tlZCEnLCByZXN1bHQpO1xyXG5cdCAqICAgICAgICAgLy8gT3B0aW9uYWxseSBoYW5kbGUgdGhlIGRpYWxvZyByZWZlcmVuY2UgaGVyZVxyXG5cdCAqICAgICAgICAgZHIuY2xvc2UocmVzdWx0KTsgLy8gQ2xvc2UgdGhlIGRpYWxvZyB3aXRoIHRoZSByZXN1bHRcclxuXHQgKiAgICAgfSxcclxuXHQgKiAgICAgc3VjY2Vzc0NhbGxiYWNrOiAocmVzdWx0KSA9PiB7XHJcblx0ICogICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzcyEnLCByZXN1bHQpO1xyXG5cdCAqICAgICB9LFxyXG5cdCAqICAgICBlcnJvckNhbGxiYWNrOiAoZXJyb3JzKSA9PiB7XHJcblx0ICogICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciEnLCBlcnJvcnMpO1xyXG5cdCAqICAgICB9LFxyXG5cdCAqICAgICBjYW5jZWxDYWxsYmFjazogKCkgPT4ge1xyXG5cdCAqICAgICAgICAgY29uc29sZS5sb2coJ1Rhc2sgd2FzIGNhbmNlbGVkLicpO1xyXG5cdCAqICAgICB9LFxyXG5cdCAqIH0pO1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBzaG93VGFza0RpYWxvZzxUUmVzdWx0ID0gYW55Pihjb25maWc6IFBhcnRpYWw8VGFza0RpYWxvZ0RhdGE8VFJlc3VsdD4+LCBkaWFsb2dDb25maWc/OiBNYXREaWFsb2dDb25maWc8VFJlc3VsdD4pOiBNYXREaWFsb2dSZWY8VmRUYXNrRGlhbG9nQ29tcG9uZW50LCBUUmVzdWx0PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcGVuRGlhbG9nPFZkVGFza0RpYWxvZ0NvbXBvbmVudD4oVmRUYXNrRGlhbG9nQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKGRpYWxvZ0NvbmZpZyA/PyB7fSwgPE1hdERpYWxvZ0NvbmZpZz57XHJcblx0XHRcdGRhdGE6IG5ldyBUYXNrRGlhbG9nRGF0YShjb25maWcpLFxyXG5cdFx0XHRkaXNhYmxlQ2xvc2U6IHRydWVcclxuXHRcdH0pKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9wZW5zIGEgZGlhbG9nIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGVwYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBvcGVuZWQgYXMgYSBkaWFsb2cuXHJcblx0ICogQHR5cGVwYXJhbSBEIC0gVGhlIHR5cGUgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZSBkaWFsb2cgKGRlZmF1bHQgaXMgYW55KS5cclxuXHQgKiBAcGFyYW0ge1R5cGU8VD59IGRpYWxvZ1R5cGUgLSBUaGUgY29tcG9uZW50IHR5cGUgdG8gb3BlbiBhcyBhIGRpYWxvZy5cclxuXHQgKiBAcGFyYW0ge01hdERpYWxvZ0NvbmZpZzxEPn0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGRpYWxvZywgc3VjaCBhcyBkYXRhIGFuZCBzdHlsZXMuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuXHJcblx0ICogXHJcblx0ICogQHJldHVybnMge01hdERpYWxvZ1JlZjxULCBEPn0gQSByZWZlcmVuY2UgdG8gdGhlIG9wZW5lZCBkaWFsb2cuXHJcblx0ICogXHJcblx0ICogQGV4YW1wbGVcclxuXHQgKiAvLyBFeGFtcGxlIG9mIGhvdyB0byB1c2Ugb3BlbkRpYWxvZ1xyXG5cdCAqIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMub3BlbkRpYWxvZyhNeURpYWxvZ0NvbXBvbmVudCwge1xyXG5cdCAqICAgICBkYXRhOiB7IGRpYWxvZyBkYXRhIGhlcmUgfSxcclxuXHQgKiAgICAgd2lkdGg6ICc4MDBweCcsXHJcblx0ICogICAgIHBhbmVsQ2xhc3M6ICdjdXN0b20tZGlhbG9nLWNsYXNzJ1xyXG5cdCAqIH0sICgpID0+IHtcclxuXHQgKiAgICAgY29uc29sZS5sb2coJ0RpYWxvZyBjbG9zZWQuJyk7XHJcblx0ICogfSk7XHJcblx0ICogXHJcblx0ICogLy8gSGFuZGxpbmcgdGhlIHJlc3VsdCBmcm9tIHRoZSBkaWFsb2dcclxuXHQgKiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHQgKiAgICAgaWYgKHJlc3VsdCkge1xyXG5cdCAqICAgICAgICAgY29uc29sZS5sb2coJ0RpYWxvZyByZXN1bHQ6JywgcmVzdWx0KTtcclxuXHQgKiAgICAgfVxyXG5cdCAqIH0pO1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBvcGVuRGlhbG9nPFQsIEQgPSBhbnk+KGRpYWxvZ1R5cGU6IFR5cGU8VD4sIGNvbmZpZzogTWF0RGlhbG9nQ29uZmlnPEQ+LCBjYWxsYmFjaz86IEZ1bmN0aW9uKTogTWF0RGlhbG9nUmVmPFQsIEQ+IHtcclxuXHRcdC8qIE9wZW4gdGhlIGRpYWxvZyB3aXRoIHNwZWNpZmllZCB0eXBlIGFuZCBjb25maWd1cmF0aW9uICovXHJcblx0XHR2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihkaWFsb2dUeXBlLCBPYmplY3QuYXNzaWduKHtcclxuXHRcdFx0d2lkdGg6ICc2NTBweCcsIC8qIERlZmF1bHQgd2lkdGggZm9yIHRoZSBkaWFsb2cgKi9cclxuXHRcdFx0ZGF0YToge30sIC8qIERlZmF1bHQgZGF0YSBwYXNzZWQgdG8gdGhlIGRpYWxvZyAqL1xyXG5cdFx0XHRwYW5lbENsYXNzOiBbJ2RpYWxvZy1mdWxsLXNjcmVlbiddIC8qIENsYXNzIGZvciB0aGUgZGlhbG9nIHBhbmVsICovXHJcblx0XHR9LCBjb25maWcpKTsgLyogTWVyZ2UgdXNlci1kZWZpbmVkIGNvbmZpZyB3aXRoIGRlZmF1bHRzICovXHJcblxyXG5cdFx0LyogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgc3Vic2NyaWJlIHRvIHRoZSBkaWFsb2cncyBhZnRlckNsb3NlZCBldmVudCAqL1xyXG5cdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdC8qIEV4ZWN1dGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQgKi9cclxuXHRcdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKF8gPT4gY2FsbGJhY2soKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogUmV0dXJuIHRoZSByZWZlcmVuY2UgdG8gdGhlIG9wZW5lZCBkaWFsb2cgKi9cclxuXHRcdHJldHVybiBkaWFsb2dSZWY7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwbGF5cyBhIG1lc3NhZ2UgdXNpbmcgdGhlIHNuYWNrIGJhciBzZXJ2aWNlLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBhIHN1Y2Nlc3MgbWVzc2FnZSBpZiBub3QgcHJvdmlkZWQpXHJcblx0ICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UgKFN1Y2Nlc3MsIFdhcm5pbmcsIG9yIEVycm9yKS4gRGVmYXVsdHMgdG8gU3VjY2Vzcy5cclxuXHQgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIHRvIHNob3cgdGhlIG1lc3NhZ2UuIERlZmF1bHRzIHRvIDMwMDBtcy5cclxuXHQgKiBAcGFyYW0gYWN0aW9uTGFiZWwgVGhlIGxhYmVsIGZvciB0aGUgYWN0aW9uIGJ1dHRvbi4gRGVmYXVsdHMgdG8gJ09LJy5cclxuXHQgKiBAcGFyYW0gcGxheVNvdW5kIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGxheSBhIHdhcm5pbmcgc291bmQgd2hlbiB0aGUgbWVzc2FnZSB0eXBlIGlzIFdhcm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLlxyXG5cdCAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIHRoZSBhY3Rpb24gYnV0dG9uIGlzIGNsaWNrZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dNZXNzYWdlKFxyXG5cdFx0bWVzc2FnZTogc3RyaW5nLFxyXG5cdFx0dHlwZTogTWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZS5TdWNjZXNzLFxyXG5cdFx0ZHVyYXRpb246IG51bWJlciA9IDMwMDAsXHJcblx0XHRhY3Rpb25MYWJlbDogc3RyaW5nID0gJGxvY2FsaXplYDpAQG9rOk9LYCxcclxuXHRcdHBsYXlTb3VuZDogYm9vbGVhbiA9IGZhbHNlXHJcblx0KTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcblx0XHQvKiBEZWZhdWx0IHNuYWNrIGJhciBjbGFzcyB0byAncHJpbWFyeScgKGZvciBzdWNjZXNzIG1lc3NhZ2VzKSAqL1xyXG5cdFx0bGV0IHNuYWNrQmFyQ2xhc3MgPSAncHJpbWFyeSc7XHJcblxyXG5cdFx0LyogRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBDU1MgY2xhc3MgYmFzZWQgb24gdGhlIG1lc3NhZ2UgdHlwZSAqL1xyXG5cdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdGNhc2UgTWVzc2FnZVR5cGUuU3VjY2VzczpcclxuXHRcdFx0XHRzbmFja0JhckNsYXNzID0gJ3ByaW1hcnknO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNZXNzYWdlVHlwZS5XYXJuaW5nOlxyXG5cdFx0XHRcdHNuYWNrQmFyQ2xhc3MgPSAnd2Fybic7XHJcblxyXG5cdFx0XHRcdC8qIFBsYXkgdGhlIHdhcm5pbmcgc291bmQgaWYgdGhlIHBsYXlTb3VuZCBmbGFnIGlzIHRydWUgKi9cclxuXHRcdFx0XHRpZiAocGxheVNvdW5kKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBsYXlXYXJuU291bmQoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNZXNzYWdlVHlwZS5FcnJvcjpcclxuXHRcdFx0XHRzbmFja0JhckNsYXNzID0gJ2Vycm9yJztcclxuXHJcblx0XHRcdFx0LyogUGxheSB0aGUgd2FybmluZyBzb3VuZCBpZiB0aGUgcGxheVNvdW5kIGZsYWcgaXMgdHJ1ZSAqL1xyXG5cdFx0XHRcdGlmIChwbGF5U291bmQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGxheVdhcm5Tb3VuZCgpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIERpc3BsYXkgdGhlIG1lc3NhZ2UgaW4gdGhlIHNuYWNrIGJhciwgd2l0aCBzcGVjaWZpZWQgZHVyYXRpb24gYW5kIENTUyBjbGFzcyAqL1xyXG5cdFx0Y29uc3Qgc25hY2tCYXJSZWYgPSB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKFxyXG5cdFx0XHRtZXNzYWdlLFxyXG5cdFx0XHRhY3Rpb25MYWJlbCxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGR1cmF0aW9uOiBkdXJhdGlvbixcclxuXHRcdFx0XHRwYW5lbENsYXNzOiBbc25hY2tCYXJDbGFzc11cclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHQvKiBFbWl0cyB3aGVuIHRoZSBhY3Rpb24gYnV0dG9uIGlzIGNsaWNrZWQgKi9cclxuXHRcdHJldHVybiBzbmFja0JhclJlZi5vbkFjdGlvbigpLnBpcGUobWFwKCgpID0+IHsgfSkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIFRpbnlNQ0UgZWRpdG9yIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGVkaXRvckNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIGRlZmF1bHQgZWRpdG9yIHNldHRpbmdzXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGluaXRFZGl0b3IoZWRpdG9yQ29uZmlnOiBhbnkgPSB7fSkge1xyXG5cdFx0LyogTWVyZ2UgdGhlIHByb3ZpZGVkIGVkaXRvciBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdCBzZXR0aW5ncyAqL1xyXG5cdFx0T2JqZWN0LmFzc2lnbih0aGlzLmVkaXRvckNvbmZpZywge1xyXG5cdFx0XHQvKiBEaXNhYmxlIHByb21vdGlvbnMgaW4gdGhlIGVkaXRvciAqL1xyXG5cdFx0XHRwcm9tb3Rpb246IGZhbHNlLFxyXG5cdFx0XHQvKiBVc2UgdGhlIG1pbmltaXplZCB2ZXJzaW9uIG9mIFRpbnlNQ0UgKi9cclxuXHRcdFx0c3VmZml4OiAnLm1pbicsXHJcblx0XHRcdC8qIERpc2FibGUgZGVmYXVsdCBUaW55TUNFIHNraW4gKi9cclxuXHRcdFx0c2tpbjogZmFsc2UsXHJcblx0XHRcdC8qIFNldCBlZGl0b3IgaGVpZ2h0IHRvIDE3MHB4ICovXHJcblx0XHRcdGhlaWdodDogJzE3MHB4JyxcclxuXHRcdFx0LyogRGlzYWJsZSBsb2FkaW5nIGV4dGVybmFsIENTUyBmb3IgZWRpdG9yIGNvbnRlbnQgKi9cclxuXHRcdFx0Y29udGVudF9jc3M6IGZhbHNlLFxyXG5cdFx0XHQvKiBTZXQgdGhlIHBsdWdpbnMgdG8gYmUgdXNlZCBpbiB0aGUgZWRpdG9yICovXHJcblx0XHRcdHBsdWdpbnM6IHRoaXMuZWRpdG9yUGx1Z2lucyxcclxuXHRcdFx0LyogU2V0IHRoZSB0b29sYmFyIGNvbmZpZ3VyYXRpb24gKi9cclxuXHRcdFx0dG9vbGJhcjogdGhpcy5lZGl0b3JUb29sYmFyLFxyXG5cdFx0XHQvKiBBbHdheXMgcGFzdGUgY29udGVudCBhcyBwbGFpbiB0ZXh0ICovXHJcblx0XHRcdHBhc3RlX2FzX3RleHQ6IHRydWUsXHJcblx0XHRcdC8qIFNldCB0aGUgZWRpdG9yIGxhbmd1YWdlIHRvIEdlcm1hbiAqL1xyXG5cdFx0XHRsYW5ndWFnZTogJ2RlJyxcclxuXHRcdFx0LyogU3BlY2lmeSB0aGUgVVJMIHRvIGxvYWQgdGhlIEdlcm1hbiBsYW5ndWFnZSBmaWxlICovXHJcblx0XHRcdGxhbmd1YWdlX3VybDogJy9hc3NldHMvdGlueW1jZS9sYW5ncy9kZS5qcycsXHJcblx0XHRcdC8qIFNldCB0aGUgYmFzZSBVUkwgZm9yIGRvY3VtZW50cy9maWxlcyB1c2VkIGluIHRoZSBlZGl0b3IgKi9cclxuXHRcdFx0ZG9jdW1lbnRfYmFzZV91cmw6IGAke3RoaXMuYXBwU2V0dGluZy5hcGlVcmx9ZmlsZS9gLFxyXG5cdFx0XHQvKiBFbmFibGUgYXV0b21hdGljIHVwbG9hZHMgZm9yIGZpbGUgaW5wdXRzICovXHJcblx0XHRcdGF1dG9tYXRpY191cGxvYWRzOiB0cnVlLFxyXG5cdFx0XHQvKiBVc2UgcmVsYXRpdmUgVVJMcyBmb3IgbGlua3MgYW5kIGltYWdlcyAqL1xyXG5cdFx0XHRyZWxhdGl2ZV91cmxzOiB0cnVlLFxyXG5cdFx0XHQvKiBEaXNhYmxlIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHJlbGF0aXZlIFVSTHMgdG8gYWJzb2x1dGUgVVJMcyAqL1xyXG5cdFx0XHRjb252ZXJ0X3VybHM6IGZhbHNlLFxyXG5cdFx0XHQvKiBFeHRlbmQgdmFsaWQgSFRNTCBlbGVtZW50cyB0byBhbGxvdyBzcGVjaWZpYyBhdHRyaWJ1dGVzICovXHJcblx0XHRcdGV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzOiAnc3BhbltpZHxjbGFzc3xzdHlsZV0sK0BbZGF0YS1vcHRpb25zXScsXHJcblx0XHRcdC8qIEFsbG93IEhUTUwgaW4gbmFtZWQgYW5jaG9ycyAqL1xyXG5cdFx0XHRhbGxvd19odG1sX2luX25hbWVkX2FuY2hvcjogdHJ1ZVxyXG5cdFx0fSwgZWRpdG9yQ29uZmlnKTtcclxuXHJcblx0XHQvKiBNYXJrIHRoZSBlZGl0b3IgYXMgaW5pdGlhbGl6ZWQgKi9cclxuXHRcdHRoaXMuaXNFZGl0b3JJbml0aWFsaXplZCA9IHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgbWVudSBhbmQgcm91dGVcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2V0VGl0bGVzKCk6IHZvaWQge1xyXG5cdFx0LyogQ2hlY2sgaWYgdGhlIG1lbnUgb2JqZWN0IGlzIGF2YWlsYWJsZSAqL1xyXG5cdFx0aWYgKHRoaXMubWVudSkge1xyXG5cdFx0XHQvKiBTZXQgdGhlIGJyb3dzZXIgdGFiIHRpdGxlIHVzaW5nIHRoZSBtZW51IHRpdGxlLCBpZiBhdmFpbGFibGUgKi9cclxuXHRcdFx0dGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGhpcy5tZW51LnRpdGxlID8/ICcnKTtcclxuXHRcdFx0LyogVXBkYXRlIHRoZSBsb2NhbCB0aXRsZSB2YXJpYWJsZSBmcm9tIHRoZSB0aXRsZSBzZXJ2aWNlICovXHJcblx0XHRcdHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlU2VydmljZS5nZXRUaXRsZSgpO1xyXG5cclxuXHRcdFx0LyogSWYgdGhlcmUgYXJlIG5vIHN1Ym1lbnUgaXRlbXMsIGV4aXQgdGhlIG1ldGhvZCAqL1xyXG5cdFx0XHRpZiAoIXRoaXMubWVudS5pdGVtcykge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogVHJ5IHRvIHJldHJpZXZlIHRoZSBzdWJ0aXRsZSBmcm9tIHRoZSBVUkwgcGFyYW1ldGVycyAqL1xyXG5cdFx0XHR2YXIgc3VidGl0bGUgPSB0aGlzLnJvdXRlPy5zbmFwc2hvdD8ucGFyYW1NYXA/LmdldCgnc3VidGl0bGUnKTtcclxuXHRcdFx0aWYgKHN1YnRpdGxlKSB7XHJcblx0XHRcdFx0LyogQXR0ZW1wdCB0byBkZWNvZGUgdGhlIHN1YnRpdGxlIGlmIGl0J3MgQmFzZTY0IGVuY29kZWQgKi9cclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0dGhpcy5zdWJ0aXRsZSA9IHdpbmRvdy5hdG9iKHN1YnRpdGxlKTtcclxuXHRcdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0XHQvKiBJZiBkZWNvZGluZyBmYWlscywgdXNlIHRoZSByYXcgc3VidGl0bGUgKi9cclxuXHRcdFx0XHRcdHRoaXMuc3VidGl0bGUgPSBzdWJ0aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0LyogR2V0IHRoZSBjdXJyZW50IHJvdXRlIHBhdGgsIGV4Y2x1ZGluZyBxdWVyeSBwYXJhbWV0ZXJzIGFuZCBtYXRyaXggcGFyYW1ldGVycyAqL1xyXG5cdFx0XHRcdGxldCBjdXJyZW50Um91dGUgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXT8uc3BsaXQoJzsnKVswXTtcclxuXHJcblx0XHRcdFx0LyogRW5zdXJlIHRoZSByb3V0ZSBkb2Vzbid0IGhhdmUgYSB0cmFpbGluZyBzbGFzaCAqL1xyXG5cdFx0XHRcdGN1cnJlbnRSb3V0ZSA9IGN1cnJlbnRSb3V0ZS5lbmRzV2l0aCgnLycpID8gY3VycmVudFJvdXRlLnN1YnN0cmluZygwLCAtMSkgOiBjdXJyZW50Um91dGU7XHJcblxyXG5cdFx0XHRcdC8qIEZpbmQgdGhlIHN1Ym1lbnUgaXRlbSB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcm91dGUgKi9cclxuXHRcdFx0XHR2YXIgc3VibWVudSA9IHRoaXMubWVudS5pdGVtcy5maWx0ZXIoeCA9PiB4LnBhdGggPT0gY3VycmVudFJvdXRlKVswXTtcclxuXHRcdFx0XHRpZiAoc3VibWVudSkge1xyXG5cdFx0XHRcdFx0LyogU2V0IHRoZSBzdWJ0aXRsZSB0byB0aGUgbWF0Y2hpbmcgc3VibWVudSdzIHRpdGxlICovXHJcblx0XHRcdFx0XHR0aGlzLnN1YnRpdGxlID0gc3VibWVudS50aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcnJheSBvZiBjb21tYW5kcyBhbmQgYSBzdGFydGluZyBwb2ludC5cclxuXHQgKiBAcGFyYW0gY29tbWFuZHMgQXJyYXkgb2YgY29tbWFuZHMgcmVwcmVzZW50aW5nIHRoZSByb3V0ZSB0byBuYXZpZ2F0ZSB0b1xyXG5cdCAqIEBwYXJhbSBxdWVyeVBhcmFtcyBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgVVJMXHJcblx0ICogQHBhcmFtIGZyYWdtZW50IE9wdGlvbmFsIGZyYWdtZW50IChhbmNob3IpIHRvIGFwcGVuZCB0byB0aGUgVVJMXHJcblx0ICogQHBhcmFtIHByZXNlcnZlRnJhZ21lbnQgV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgY3VycmVudCBmcmFnbWVudCBpbiB0aGUgVVJMXHJcblx0ICovXHJcblx0cHVibGljIG5hdmlnYXRlKGNvbW1hbmRzOiBhbnlbXSwgcXVlcnlQYXJhbXM/OiBhbnksIGZyYWdtZW50Pzogc3RyaW5nLCBwcmVzZXJ2ZUZyYWdtZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIHtcclxuXHRcdFx0LyogTWVyZ2UgYW55IGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyB3aXRoIGEgZGVmYXVsdCByZXR1cm5VcmwgKi9cclxuXHRcdFx0cXVlcnlQYXJhbXM6IE9iamVjdC5hc3NpZ24oeyByZXR1cm5Vcmw6IHRoaXMuY3VycmVudFJvdXRlIH0sIHF1ZXJ5UGFyYW1zIHx8IHt9KSxcclxuXHRcdFx0LyogU2V0IHRoZSBmcmFnbWVudCwgaWYgcHJvdmlkZWQgKi9cclxuXHRcdFx0ZnJhZ21lbnQ6IGZyYWdtZW50LFxyXG5cdFx0XHQvKiBQcmVzZXJ2ZSB0aGUgZnJhZ21lbnQgZnJvbSB0aGUgcHJldmlvdXMgVVJMIGlmIHNwZWNpZmllZCAqL1xyXG5cdFx0XHRwcmVzZXJ2ZUZyYWdtZW50OiBwcmVzZXJ2ZUZyYWdtZW50LFxyXG5cdFx0XHQvKiBNYWtlIHRoZSByb3V0ZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCByb3V0ZSBpZiBhcHBsaWNhYmxlICovXHJcblx0XHRcdHJlbGF0aXZlVG86IHRoaXMucm91dGVcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGxheXMgYSBzaG9ydCBiZWVwIHNvdW5kIHVzaW5nIGFuIGVtYmVkZGVkIGF1ZGlvIGZpbGUgaW4gYmFzZTY0IGZvcm1hdC5cclxuXHQgKiBUaGUgbWV0aG9kIGxvYWRzIGFuZCBwbGF5cyB0aGUgYXVkaW8gZmlsZSBpbW1lZGlhdGVseSB1cG9uIGNhbGxpbmcuXHJcblx0ICovXHJcblx0cHVibGljIHBsYXlCZWVwU291bmQoKTogdm9pZCB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aGlzLmJlZXBBdWRpby5wbGF5KCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikgeyB9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQbGF5cyBhIHNob3J0IHdhcm5pbmcgc291bmQgdXNpbmcgYW4gZW1iZWRkZWQgYXVkaW8gZmlsZSBpbiBiYXNlNjQgZm9ybWF0LlxyXG5cdCAqIFRoZSBtZXRob2QgbG9hZHMgYW5kIHBsYXlzIHRoZSBhdWRpbyBmaWxlIGltbWVkaWF0ZWx5IHVwb24gY2FsbGluZy5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGxheVdhcm5Tb3VuZCgpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRoaXMud2FybkF1ZGlvLnBsYXkoKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIGlmIGRlYnVnIG1vZGUgaXMgZW5hYmxlZFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZ1xyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgbG9nXHJcblx0ICovXHJcblx0cHVibGljIGxvZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xyXG5cdFx0LyogQ2hlY2sgaWYgZGVidWcgbW9kZSBpcyBlbmFibGVkICovXHJcblx0XHRpZiAodGhpcy5kZWJ1Zykge1xyXG5cdFx0XHQvKiBMb2cgdGhlIG1lc3NhZ2UgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnNvbGUgKi9cclxuXHRcdFx0Y29uc29sZS5sb2cobWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9ncyBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY29uc29sZSBpZiBkZWJ1ZyBtb2RlIGlzIGVuYWJsZWRcclxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlIHRvIGxvZ1xyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgd2FybmluZ1xyXG5cdCAqL1xyXG5cdHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcblx0XHQvKiBDaGVjayBpZiBkZWJ1ZyBtb2RlIGlzIGVuYWJsZWQgKi9cclxuXHRcdGlmICh0aGlzLmRlYnVnKSB7XHJcblx0XHRcdC8qIExvZyB0aGUgd2FybmluZyBtZXNzYWdlIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBjb25zb2xlICovXHJcblx0XHRcdGNvbnNvbGUud2FybihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IGFuIG9iamVjdCB0byBIdHRwSGVhZGVycy5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gYm9keSBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBoZWFkZXJzXHJcblx0ICogQHJldHVybnMgSHR0cEhlYWRlcnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleS12YWx1ZSBwYWlycyBmcm9tIHRoZSBib2R5XHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHRvSHR0cEhlYWRlcnMoYm9keTogYW55KTogSHR0cEhlYWRlcnMge1xyXG5cdFx0LyogSWYgdGhlIGJvZHkgaXMgbnVsbCBvciB1bmRlZmluZWQsIHJldHVybiBlbXB0eSBoZWFkZXJzICovXHJcblx0XHRpZiAoIWJvZHkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBIdHRwSGVhZGVycygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIENvbnZlcnQgdGhlIG9iamVjdCdzIHByb3BlcnRpZXMgdG8gSHR0cEhlYWRlcnMsIGZpbHRlcmluZyBvdXQgbnVsbCBvciBlbXB0eSB2YWx1ZXMgKi9cclxuXHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhib2R5KVxyXG5cdFx0XHQuZmlsdGVyKGtleSA9PiBib2R5W2tleV0gIT0gbnVsbCAmJiBib2R5W2tleV0gIT0gJycpXHJcblx0XHRcdC5yZWR1Y2UoKHAsIGtleSkgPT4gcC5zZXQoa2V5LCBib2R5W2tleV0pLCBuZXcgSHR0cEhlYWRlcnMoKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgYW5kIGZvcm1hdHMgSFRUUCByZXNwb25zZSBlcnJvcnMuXHJcblx0ICogQHBhcmFtIGVycm9ycyBUaGUgZXJyb3Igb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIEhUVFAgcmVzcG9uc2VcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgcGFyc2VFcnJvcnMoZXJyb3JzOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEluaXRpYWxpemUgdGhlIGVycm9ycyBhcnJheSBhbmQgcmVzZXQgbG9hZGluZy9zYXZpbmcgaW5kaWNhdG9ycyAqL1xyXG5cdFx0dGhpcy5lcnJvcnMgPSBbXTtcclxuXHRcdHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcblx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyogSWYgdGhlcmUgYXJlIGVycm9ycywgaXRlcmF0ZSB0aHJvdWdoIHRoZW0gYW5kIGFkZCB0aGVtIHRvIHRoZSBlcnJvcnMgYXJyYXkgKi9cclxuXHRcdGlmIChlcnJvcnMpIHtcclxuXHRcdFx0T2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKGVsID0+IHtcclxuXHRcdFx0XHRsZXQgZXJyb3IgPSBlcnJvcnNbZWxdO1xyXG5cdFx0XHRcdC8qIElmIHRoZSBlcnJvciBpcyBhbiBhcnJheSwgaXRlcmF0ZSBvdmVyIHRoZSBhcnJheSBhbmQgYWRkIGVhY2ggZXJyb3IgKi9cclxuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShlcnJvcikpIHtcclxuXHRcdFx0XHRcdGVycm9yLmZvckVhY2goZXJyID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvcnMucHVzaChlcnIpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRcdC8qIElmIHRoZSBlcnJvciBpcyBhIHN0cmluZywgYWRkIGl0IGRpcmVjdGx5IHRvIHRoZSBlcnJvcnMgYXJyYXkgKi9cclxuXHRcdFx0XHRcdHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGUgSHR0cCBvcGVyYXRpb24gdGhhdCBmYWlsZWQuXHJcblx0ICogTGV0IHRoZSBhcHAgY29udGludWUuXHJcblx0ICogQHBhcmFtIG9wZXJhdGlvbiAtIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IGZhaWxlZFxyXG5cdCAqIEBwYXJhbSByZXN1bHQgLSBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gYXMgdGhlIG9ic2VydmFibGUgcmVzdWx0XHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGhhbmRsZUVycm9yPFQ+KG9wZXJhdGlvbiA9ICdvcGVyYXRpb24nLCByZXN1bHQ/OiBUKSB7XHJcblx0XHRyZXR1cm4gKGVycm9yOiBhbnkpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuXHJcblx0XHRcdC8qIFBhcnNlIHRoZSBlcnJvciBtZXNzYWdlcyAqL1xyXG5cdFx0XHR0aGlzLnBhcnNlRXJyb3JzKGVycm9yKTtcclxuXHJcblx0XHRcdC8qIExvZyB0byBjb25zb2xlICovXHJcblx0XHRcdHRoaXMud2FybihgJHtvcGVyYXRpb259IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xyXG5cclxuXHRcdFx0LyogTGV0IHRoZSBhcHAga2VlcCBydW5uaW5nIGJ5IHJldHVybmluZyBhbiBlbXB0eSByZXN1bHQgKi9cclxuXHRcdFx0cmV0dXJuIG9mKHJlc3VsdCBhcyBUKTtcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhbnMgdGhlIG9iamVjdCBieSByZW1vdmluZyBwcm9wZXJ0aWVzIHRoYXQgYXJlIG51bGwsIHVuZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nc1xyXG5cdCAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjbGVhblxyXG5cdCAqIEByZXR1cm5zIFRoZSBjbGVhbmVkIG9iamVjdFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBjbGVhbihvYmo6IGFueSk6IGFueSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCAqL1xyXG5cdFx0XHRmb3IgKHZhciBwcm9wTmFtZSBpbiBvYmopIHtcclxuXHRcdFx0XHQvKiBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkLCBvciBhbiBlbXB0eSBzdHJpbmcsIGRlbGV0ZSBpdCAqL1xyXG5cdFx0XHRcdGlmIChvYmpbcHJvcE5hbWVdID09PSBudWxsIHx8IG9ialtwcm9wTmFtZV0gPT09IHVuZGVmaW5lZCB8fCBvYmpbcHJvcE5hbWVdID09PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRkZWxldGUgb2JqW3Byb3BOYW1lXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdC8qIEVycm9yIGhhbmRsaW5nIGNhbiBiZSBkb25lIGhlcmUgaWYgbmVjZXNzYXJ5ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LyogUmV0dXJuIHRoZSBjbGVhbmVkIG9iamVjdCAqL1xyXG5cdFx0cmV0dXJuIG9iajtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbml0aXplcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBieSByZW1vdmluZyBmYWxzeSB2YWx1ZXMgYW5kIGNvbnZlcnRpbmcgc3RyaW5nIG51bWJlcnMgdG8gbnVtYmVyc1xyXG5cdCAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBzYW5pdGl6ZVxyXG5cdCAqIEBwYXJhbSBpZ25vcmUgUHJvcGVydGllcyB0byBpZ25vcmUgZHVyaW5nIHRoZSBzYW5pdGl6YXRpb25cclxuXHQgKiBAcmV0dXJucyBUaGUgc2FuaXRpemVkIG9iamVjdFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBzYW5pdGl6ZU9iamVjdChvYmo6IGFueSwgLi4uaWdub3JlOiBzdHJpbmdbXSk6IGFueSB7XHJcblx0XHQvKiBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXMgYW5kIGZpbHRlciBvdXQgZmFsc3kgdmFsdWVzICovXHJcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMob2JqKVxyXG5cdFx0XHQuZmlsdGVyKHggPT4gb2JqW3hdKVxyXG5cdFx0XHQvKiBJZ25vcmUgcHJvcGVydGllcyB0aGF0IGFyZSBpbiB0aGUgaWdub3JlIGxpc3QgKGNhc2UgaW5zZW5zaXRpdmUpICovXHJcblx0XHRcdC5maWx0ZXIoeCA9PiAhKGlnbm9yZSB8fCBbXSkubWFwKHggPT4geC50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyh4LnRvTG93ZXJDYXNlKCkpKVxyXG5cdFx0XHQvKiBDb252ZXJ0IHN0cmluZyBudW1iZXJzIHRvIGFjdHVhbCBudW1iZXJzICovXHJcblx0XHRcdC5yZWR1Y2UoKHJlc3VsdDogYW55LCBrZXkpID0+IHtcclxuXHRcdFx0XHRyZXN1bHRba2V5XSA9IGlzTmFOKCtvYmpba2V5XSkgPyBvYmpba2V5XSA6ICtvYmpba2V5XTtcclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0XHR9LCB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGFueSB0ZXh0IGluIHRoZSBkb2N1bWVudFxyXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGV4dCBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIGZhbHNlXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGlzVGV4dFNlbGVjdGVkID0gKCk6IGJvb2xlYW4gPT5cclxuXHRcdC8qIFVzZSB0aGUgd2luZG93LmdldFNlbGVjdGlvbiBBUEkgdG8gY2hlY2sgaWYgdGV4dCBpcyBzZWxlY3RlZCAqL1xyXG5cdFx0KHdpbmRvdz8uZ2V0U2VsZWN0aW9uKCk/LnRvU3RyaW5nKCk/Lmxlbmd0aCA/PyAwKSA+IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgdXNlZCBmb3IgYW55IGN1c3RvbSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gb2NjdXIgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkXHJcblx0ICovXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHQvKiBVbnN1YnNjcmliZSBmcm9tIGFsbCBNYXRFeHBhbnNpb25QYW5lbCBzdWJzY3JpcHRpb25zICovXHJcblx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHggPT4geC51bnN1YnNjcmliZSgpKTtcclxuXHR9XHJcbn0iXX0=