@wavemaker/app-ng-runtime 11.8.0-next.24904 → 11.8.0-next.27301

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 (346) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +5 -5
  2. app-ng-runtime/build-task/esm2022/basic/progress/progress-bar/progress-bar.build.mjs +1 -1
  3. app-ng-runtime/build-task/esm2022/page/page.build.mjs +3 -2
  4. app-ng-runtime/build-task/fesm2022/index.mjs +2 -1
  5. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  6. app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +5 -5
  7. app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +3 -2
  8. app-ng-runtime/components/advanced/carousel/esm2022/carousel.directive.mjs +1 -1
  9. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +2 -1
  10. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
  11. app-ng-runtime/components/advanced/login/bundles/index.umd.js +6 -6
  12. app-ng-runtime/components/advanced/login/esm2022/login.component.mjs +4 -3
  13. app-ng-runtime/components/advanced/login/fesm2022/index.mjs +3 -2
  14. app-ng-runtime/components/advanced/login/fesm2022/index.mjs.map +1 -1
  15. app-ng-runtime/components/base/bundles/index.umd.js +203 -171
  16. app-ng-runtime/components/base/esm2022/directives/show-in-device.directive.mjs +1 -1
  17. app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +12 -11
  18. app-ng-runtime/components/base/esm2022/pipes/wm-pipe.mjs +3 -2
  19. app-ng-runtime/components/base/esm2022/utils/data-utils.mjs +30 -29
  20. app-ng-runtime/components/base/esm2022/utils/form-utils.mjs +47 -41
  21. app-ng-runtime/components/base/esm2022/utils/live-utils.mjs +8 -7
  22. app-ng-runtime/components/base/esm2022/utils/widget-utils.mjs +28 -27
  23. app-ng-runtime/components/base/esm2022/widgets/common/base/base-container.component.mjs +4 -3
  24. app-ng-runtime/components/base/esm2022/widgets/common/base/base-field-validations.mjs +24 -21
  25. app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +12 -11
  26. app-ng-runtime/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +40 -14
  27. app-ng-runtime/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +3 -2
  28. app-ng-runtime/components/base/esm2022/widgets/common/dialog/dialog.service.mjs +3 -2
  29. app-ng-runtime/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +1 -1
  30. app-ng-runtime/components/base/esm2022/widgets/common/partial/partial.directive.mjs +3 -2
  31. app-ng-runtime/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +3 -2
  32. app-ng-runtime/components/base/esm2022/widgets/common/smooth-scroll/smooth-scroll.directive.mjs +6 -5
  33. app-ng-runtime/components/base/esm2022/widgets/framework/deviceview.mjs +1 -1
  34. app-ng-runtime/components/base/esm2022/widgets/framework/property-change-handler.mjs +3 -2
  35. app-ng-runtime/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +4 -3
  36. app-ng-runtime/components/base/fesm2022/index.mjs +206 -173
  37. app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
  38. app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
  39. app-ng-runtime/components/base/utils/data-utils.d.ts +0 -1
  40. app-ng-runtime/components/base/utils/widget-utils.d.ts +2 -2
  41. app-ng-runtime/components/base/widgets/common/base/base-field-validations.d.ts +1 -1
  42. app-ng-runtime/components/base/widgets/common/base/partial-container.directive.d.ts +1 -1
  43. app-ng-runtime/components/basic/default/bundles/index.umd.js +10 -10
  44. app-ng-runtime/components/basic/default/esm2022/label/label.directive.mjs +4 -3
  45. app-ng-runtime/components/basic/default/esm2022/spinner/spinner.component.mjs +6 -5
  46. app-ng-runtime/components/basic/default/fesm2022/index.mjs +7 -6
  47. app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
  48. app-ng-runtime/components/basic/progress/bundles/index.umd.js +13 -13
  49. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +5 -4
  50. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +6 -5
  51. app-ng-runtime/components/basic/progress/esm2022/utils.mjs +3 -3
  52. app-ng-runtime/components/basic/progress/fesm2022/index.mjs +10 -9
  53. app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
  54. app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +15 -10
  55. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +14 -8
  56. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +13 -7
  57. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  58. app-ng-runtime/components/basic/rich-text-editor/rich-text-editor.component.d.ts +2 -2
  59. app-ng-runtime/components/basic/search/bundles/index.umd.js +67 -65
  60. app-ng-runtime/components/basic/search/esm2022/data-provider/data-provider.mjs +1 -1
  61. app-ng-runtime/components/basic/search/esm2022/data-provider/local-data-provider.mjs +26 -23
  62. app-ng-runtime/components/basic/search/esm2022/data-provider/remote-data-provider.mjs +12 -11
  63. app-ng-runtime/components/basic/search/esm2022/search.component.mjs +31 -30
  64. app-ng-runtime/components/basic/search/fesm2022/index.mjs +66 -63
  65. app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
  66. app-ng-runtime/components/basic/tree/bundles/index.umd.js +9 -9
  67. app-ng-runtime/components/basic/tree/esm2022/tree.component.mjs +7 -6
  68. app-ng-runtime/components/basic/tree/fesm2022/index.mjs +6 -5
  69. app-ng-runtime/components/basic/tree/fesm2022/index.mjs.map +1 -1
  70. app-ng-runtime/components/chart/bundles/index.umd.js +72 -63
  71. app-ng-runtime/components/chart/chart.component.d.ts +1 -1
  72. app-ng-runtime/components/chart/chart.utils.d.ts +3 -3
  73. app-ng-runtime/components/chart/esm2022/chart.component.mjs +58 -48
  74. app-ng-runtime/components/chart/esm2022/chart.utils.mjs +14 -13
  75. app-ng-runtime/components/chart/fesm2022/index.mjs +69 -59
  76. app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
  77. app-ng-runtime/components/containers/accordion/bundles/index.umd.js +16 -16
  78. app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +14 -13
  79. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +13 -12
  80. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
  81. app-ng-runtime/components/containers/panel/bundles/index.umd.js +5 -5
  82. app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +3 -2
  83. app-ng-runtime/components/containers/panel/fesm2022/index.mjs +2 -1
  84. app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
  85. app-ng-runtime/components/containers/panel/panel.component.d.ts +1 -1
  86. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +17 -17
  87. app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +15 -14
  88. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +14 -13
  89. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  90. app-ng-runtime/components/data/form/bundles/index.umd.js +75 -75
  91. app-ng-runtime/components/data/form/esm2022/form-action/form-action.directive.mjs +3 -2
  92. app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +10 -9
  93. app-ng-runtime/components/data/form/esm2022/form.component.mjs +54 -53
  94. app-ng-runtime/components/data/form/esm2022/live-filter/live-filter.directive.mjs +3 -2
  95. app-ng-runtime/components/data/form/esm2022/live-form/live-form.directive.mjs +11 -10
  96. app-ng-runtime/components/data/form/fesm2022/index.mjs +77 -76
  97. app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
  98. app-ng-runtime/components/data/form/form.component.d.ts +2 -2
  99. app-ng-runtime/components/data/form/live-form/live-form.directive.d.ts +1 -1
  100. app-ng-runtime/components/data/list/bundles/index.umd.js +692 -687
  101. app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +1 -1
  102. app-ng-runtime/components/data/list/esm2022/list.animator.mjs +5 -3
  103. app-ng-runtime/components/data/list/esm2022/list.component.mjs +687 -682
  104. app-ng-runtime/components/data/list/fesm2022/index.mjs +690 -684
  105. app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
  106. app-ng-runtime/components/data/list/list.component.d.ts +53 -53
  107. app-ng-runtime/components/data/live-table/bundles/index.umd.js +1 -1
  108. app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +2 -2
  109. app-ng-runtime/components/data/live-table/fesm2022/index.mjs +1 -1
  110. app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
  111. app-ng-runtime/components/data/pagination/bundles/index.umd.js +14 -14
  112. app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +12 -11
  113. app-ng-runtime/components/data/pagination/fesm2022/index.mjs +11 -10
  114. app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
  115. app-ng-runtime/components/data/table/bundles/index.umd.js +175 -172
  116. app-ng-runtime/components/data/table/esm2022/table-action/table-action.directive.mjs +3 -2
  117. app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +19 -18
  118. app-ng-runtime/components/data/table/esm2022/table-cud.directive.mjs +7 -6
  119. app-ng-runtime/components/data/table/esm2022/table-filter.directive.mjs +53 -55
  120. app-ng-runtime/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +3 -2
  121. app-ng-runtime/components/data/table/esm2022/table.component.mjs +98 -91
  122. app-ng-runtime/components/data/table/fesm2022/index.mjs +172 -168
  123. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  124. app-ng-runtime/components/data/table/table-column/table-column.directive.d.ts +6 -6
  125. app-ng-runtime/components/data/table/table.component.d.ts +2 -2
  126. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +2 -2
  127. app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +3 -3
  128. app-ng-runtime/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +1 -1
  129. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +1 -1
  130. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  131. app-ng-runtime/components/input/calendar/bundles/index.umd.js +33 -31
  132. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +31 -28
  133. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +30 -27
  134. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  135. app-ng-runtime/components/input/chips/bundles/index.umd.js +29 -28
  136. app-ng-runtime/components/input/chips/chips.component.d.ts +1 -1
  137. app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +27 -25
  138. app-ng-runtime/components/input/chips/fesm2022/index.mjs +26 -24
  139. app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
  140. app-ng-runtime/components/input/default/base-form.component.d.ts +3 -3
  141. app-ng-runtime/components/input/default/bundles/index.umd.js +75 -62
  142. app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +1 -0
  143. app-ng-runtime/components/input/default/dataset-aware-form.component.d.ts +4 -4
  144. app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +14 -8
  145. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +3 -2
  146. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +2 -2
  147. app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +6 -4
  148. app-ng-runtime/components/input/default/esm2022/dataset-aware-form.component.mjs +29 -23
  149. app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +4 -3
  150. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +4 -3
  151. app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +6 -5
  152. app-ng-runtime/components/input/default/esm2022/text/base/base-input.mjs +4 -3
  153. app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +20 -18
  154. app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +2 -2
  155. app-ng-runtime/components/input/default/fesm2022/index.mjs +75 -62
  156. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  157. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +1 -1
  158. app-ng-runtime/components/input/epoch/bundles/index.umd.js +53 -51
  159. app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +34 -31
  160. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +5 -4
  161. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +5 -4
  162. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +7 -6
  163. app-ng-runtime/components/input/epoch/esm2022/picker/picker.component.mjs +1 -1
  164. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +6 -5
  165. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +48 -45
  166. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  167. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +15 -15
  168. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +13 -12
  169. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +12 -11
  170. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  171. app-ng-runtime/components/input/rating/bundles/index.umd.js +12 -12
  172. app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +10 -9
  173. app-ng-runtime/components/input/rating/fesm2022/index.mjs +9 -8
  174. app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
  175. app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +1 -1
  176. app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +2 -2
  177. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +1 -1
  178. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
  179. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +23 -22
  180. app-ng-runtime/components/navigation/menu/esm2022/menu-adapator.component.mjs +3 -2
  181. app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +6 -5
  182. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +8 -7
  183. app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +10 -8
  184. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +20 -18
  185. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  186. app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +12 -1
  187. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +1 -1
  188. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  189. app-ng-runtime/components/prefab/bundles/index.umd.js +6 -6
  190. app-ng-runtime/components/prefab/esm2022/prefab-container/prefab-container.directive.mjs +3 -2
  191. app-ng-runtime/components/prefab/esm2022/prefab.directive.mjs +3 -2
  192. app-ng-runtime/components/prefab/fesm2022/index.mjs +3 -2
  193. app-ng-runtime/components/prefab/fesm2022/index.mjs.map +1 -1
  194. app-ng-runtime/core/bundles/index.umd.js +119 -130
  195. app-ng-runtime/core/esm2022/public_api.mjs +2 -2
  196. app-ng-runtime/core/esm2022/services/field-type.service.mjs +3 -2
  197. app-ng-runtime/core/esm2022/services/field-widget.service.mjs +3 -2
  198. app-ng-runtime/core/esm2022/services/pagination.service.mjs +7 -6
  199. app-ng-runtime/core/esm2022/services/state-persistence.service.mjs +17 -16
  200. app-ng-runtime/core/esm2022/services/utils.service.mjs +3 -2
  201. app-ng-runtime/core/esm2022/services/viewport.service.mjs +3 -2
  202. app-ng-runtime/core/esm2022/utils/build-utils.mjs +5 -4
  203. app-ng-runtime/core/esm2022/utils/expression-parser.mjs +5 -4
  204. app-ng-runtime/core/esm2022/utils/lru-cache.mjs +3 -2
  205. app-ng-runtime/core/esm2022/utils/utils.mjs +79 -82
  206. app-ng-runtime/core/esm2022/utils/watcher.mjs +9 -7
  207. app-ng-runtime/core/fesm2022/index.mjs +117 -123
  208. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  209. app-ng-runtime/core/public_api.d.ts +1 -1
  210. app-ng-runtime/core/services/pagination.service.d.ts +1 -1
  211. app-ng-runtime/core/utils/utils.d.ts +5 -9
  212. app-ng-runtime/http/bundles/index.umd.js +7 -7
  213. app-ng-runtime/http/esm2022/http.service.mjs +5 -4
  214. app-ng-runtime/http/esm2022/wm-http-request.mjs +1 -1
  215. app-ng-runtime/http/esm2022/wm-http-response.mjs +1 -1
  216. app-ng-runtime/http/fesm2022/index.mjs +4 -3
  217. app-ng-runtime/http/fesm2022/index.mjs.map +1 -1
  218. app-ng-runtime/mobile/components/basic/default/bundles/index.umd.js +24 -20
  219. app-ng-runtime/mobile/components/basic/default/esm2022/anchor/anchor.directive.mjs +5 -4
  220. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +12 -8
  221. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-selector.service.mjs +5 -3
  222. app-ng-runtime/mobile/components/basic/default/esm2022/image-cache/image-cache.directive.mjs +3 -2
  223. app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +5 -4
  224. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs +21 -16
  225. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
  226. app-ng-runtime/mobile/components/containers/segmented-control/bundles/index.umd.js +7 -7
  227. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +2 -2
  228. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +4 -3
  229. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs +4 -3
  230. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
  231. app-ng-runtime/mobile/components/data/media-list/bundles/index.umd.js +8 -8
  232. app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.component.mjs +4 -3
  233. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs +3 -2
  234. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
  235. app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +5 -5
  236. app-ng-runtime/mobile/components/page/default/esm2022/page.directive.mjs +3 -2
  237. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs +2 -1
  238. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs.map +1 -1
  239. app-ng-runtime/mobile/components/page/tab-bar/bundles/index.umd.js +9 -9
  240. app-ng-runtime/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +7 -6
  241. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs +6 -5
  242. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
  243. app-ng-runtime/mobile/core/bundles/index.umd.js +25 -25
  244. app-ng-runtime/mobile/core/esm2022/services/device-file-download.service.mjs +5 -4
  245. app-ng-runtime/mobile/core/esm2022/services/device-file-opener.service.mjs +3 -2
  246. app-ng-runtime/mobile/core/esm2022/services/device-file-upload.service.mjs +4 -3
  247. app-ng-runtime/mobile/core/esm2022/services/device-file.service.mjs +6 -5
  248. app-ng-runtime/mobile/core/esm2022/services/device.service.mjs +3 -2
  249. app-ng-runtime/mobile/core/esm2022/services/ext-app-message.service.mjs +5 -4
  250. app-ng-runtime/mobile/core/esm2022/services/network.service.mjs +9 -8
  251. app-ng-runtime/mobile/core/fesm2022/index.mjs +22 -21
  252. app-ng-runtime/mobile/core/fesm2022/index.mjs.map +1 -1
  253. app-ng-runtime/mobile/core/services/ext-app-message.service.d.ts +1 -1
  254. app-ng-runtime/mobile/core/services/network.service.d.ts +7 -1
  255. app-ng-runtime/mobile/offline/bundles/index.umd.js +161 -144
  256. app-ng-runtime/mobile/offline/esm2022/models/local-db-store.mjs +23 -21
  257. app-ng-runtime/mobile/offline/esm2022/services/change-log.service.mjs +7 -6
  258. app-ng-runtime/mobile/offline/esm2022/services/local-db-data-pull.service.mjs +37 -35
  259. app-ng-runtime/mobile/offline/esm2022/services/local-db-management.service.mjs +54 -45
  260. app-ng-runtime/mobile/offline/esm2022/services/local-db.service.mjs +5 -4
  261. app-ng-runtime/mobile/offline/esm2022/services/workers/error-blocker.mjs +4 -3
  262. app-ng-runtime/mobile/offline/esm2022/services/workers/file-handler.mjs +18 -13
  263. app-ng-runtime/mobile/offline/esm2022/services/workers/multi-part-param-transformer.mjs +9 -5
  264. app-ng-runtime/mobile/offline/esm2022/utils/live-variable.utils.mjs +12 -11
  265. app-ng-runtime/mobile/offline/esm2022/utils/query-executor.utils.mjs +5 -4
  266. app-ng-runtime/mobile/offline/esm2022/utils/security.utils.mjs +3 -2
  267. app-ng-runtime/mobile/offline/fesm2022/index.mjs +156 -138
  268. app-ng-runtime/mobile/offline/fesm2022/index.mjs.map +1 -1
  269. app-ng-runtime/mobile/runtime/bundles/index.umd.js +11 -8
  270. app-ng-runtime/mobile/runtime/esm2022/mobile-runtime.module.mjs +3 -2
  271. app-ng-runtime/mobile/runtime/esm2022/services/cookie.service.mjs +6 -2
  272. app-ng-runtime/mobile/runtime/esm2022/services/http-interceptor.service.mjs +4 -3
  273. app-ng-runtime/mobile/runtime/fesm2022/index.mjs +8 -4
  274. app-ng-runtime/mobile/runtime/fesm2022/index.mjs.map +1 -1
  275. app-ng-runtime/mobile/runtime-dynamic/bundles/index.umd.js +2 -2
  276. app-ng-runtime/mobile/runtime-dynamic/esm2022/services/live-sync.service.mjs +3 -3
  277. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs +2 -2
  278. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs.map +1 -1
  279. app-ng-runtime/mobile/variables/bundles/index.umd.js +23 -16
  280. app-ng-runtime/mobile/variables/esm2022/services/camera-service.mjs +2 -2
  281. app-ng-runtime/mobile/variables/esm2022/services/datasync-service.mjs +10 -9
  282. app-ng-runtime/mobile/variables/esm2022/services/file-service.mjs +11 -3
  283. app-ng-runtime/mobile/variables/fesm2022/index.mjs +19 -11
  284. app-ng-runtime/mobile/variables/fesm2022/index.mjs.map +1 -1
  285. app-ng-runtime/oAuth/bundles/index.umd.js +12 -12
  286. app-ng-runtime/oAuth/esm2022/oAuth.service.mjs +4 -3
  287. app-ng-runtime/oAuth/esm2022/oAuth.utils.mjs +8 -7
  288. app-ng-runtime/oAuth/fesm2022/index.mjs +9 -8
  289. app-ng-runtime/oAuth/fesm2022/index.mjs.map +1 -1
  290. app-ng-runtime/package.json +1 -1
  291. app-ng-runtime/runtime/base/bundles/index.umd.js +121 -120
  292. app-ng-runtime/runtime/base/esm2022/components/base-layout.component.mjs +4 -3
  293. app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +14 -13
  294. app-ng-runtime/runtime/base/esm2022/components/base-partial.component.mjs +13 -12
  295. app-ng-runtime/runtime/base/esm2022/components/base-prefab.component.mjs +15 -14
  296. app-ng-runtime/runtime/base/esm2022/components/base-spa-page.component.mjs +14 -13
  297. app-ng-runtime/runtime/base/esm2022/components/custom-toaster.component.mjs +6 -5
  298. app-ng-runtime/runtime/base/esm2022/directives/accessroles.directive.mjs +11 -10
  299. app-ng-runtime/runtime/base/esm2022/guards/page-not-found.guard.mjs +1 -1
  300. app-ng-runtime/runtime/base/esm2022/guards/role.guard.mjs +3 -2
  301. app-ng-runtime/runtime/base/esm2022/services/app-defaults.service.mjs +1 -1
  302. app-ng-runtime/runtime/base/esm2022/services/app.manager.service.mjs +17 -14
  303. app-ng-runtime/runtime/base/esm2022/services/app.service.mjs +7 -6
  304. app-ng-runtime/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +3 -2
  305. app-ng-runtime/runtime/base/esm2022/services/http-interceptor.services.mjs +4 -3
  306. app-ng-runtime/runtime/base/esm2022/services/i18n.service.mjs +12 -10
  307. app-ng-runtime/runtime/base/esm2022/services/navigation.service.mjs +8 -7
  308. app-ng-runtime/runtime/base/esm2022/services/prefab-manager.service.mjs +3 -2
  309. app-ng-runtime/runtime/base/esm2022/services/spinner.service.mjs +7 -6
  310. app-ng-runtime/runtime/base/esm2022/services/toaster.service.mjs +6 -5
  311. app-ng-runtime/runtime/base/esm2022/util/wm-route-reuse-strategy.mjs +6 -7
  312. app-ng-runtime/runtime/base/fesm2022/index.mjs +119 -117
  313. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  314. app-ng-runtime/runtime/base/services/i18n.service.d.ts +1 -1
  315. app-ng-runtime/runtime/dynamic/bundles/index.umd.js +7 -7
  316. app-ng-runtime/runtime/dynamic/esm2022/app/services/component-ref-provider.service.mjs +4 -3
  317. app-ng-runtime/runtime/dynamic/esm2022/main.mjs +3 -2
  318. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs +4 -3
  319. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  320. app-ng-runtime/scripts/jquery-ui/ui/widgets/droppable.js +7 -7
  321. app-ng-runtime/scripts/jquery-ui/ui/widgets/resizable.js +13 -10
  322. app-ng-runtime/scripts/jquery-ui/ui/widgets/sortable.js +7 -7
  323. app-ng-runtime/security/bundles/index.umd.js +14 -14
  324. app-ng-runtime/security/esm2022/security.service.mjs +12 -11
  325. app-ng-runtime/security/fesm2022/index.mjs +11 -10
  326. app-ng-runtime/security/fesm2022/index.mjs.map +1 -1
  327. app-ng-runtime/security/security.service.d.ts +1 -1
  328. app-ng-runtime/swipey/esm2022/swipe.animation.mjs +1 -1
  329. app-ng-runtime/swipey/fesm2022/index.mjs.map +1 -1
  330. app-ng-runtime/transpiler/bundles/index.umd.js +10 -9
  331. app-ng-runtime/transpiler/esm2022/build.mjs +8 -6
  332. app-ng-runtime/transpiler/fesm2022/index.mjs +7 -5
  333. app-ng-runtime/transpiler/fesm2022/index.mjs.map +1 -1
  334. app-ng-runtime/variables/bundles/index.umd.js +155 -145
  335. app-ng-runtime/variables/esm2022/manager/action/login-action.manager.mjs +15 -14
  336. app-ng-runtime/variables/esm2022/manager/action/notification-action.manager.mjs +9 -8
  337. app-ng-runtime/variables/esm2022/manager/variable/base-variable.manager.mjs +3 -2
  338. app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +11 -10
  339. app-ng-runtime/variables/esm2022/service/variables.service.mjs +7 -6
  340. app-ng-runtime/variables/esm2022/util/action/navigation-action.utils.mjs +4 -4
  341. app-ng-runtime/variables/esm2022/util/variable/pagination.utils.mjs +30 -23
  342. app-ng-runtime/variables/esm2022/util/variable/service-variable.utils.mjs +29 -28
  343. app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +75 -70
  344. app-ng-runtime/variables/fesm2022/index.mjs +169 -158
  345. app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
  346. app-ng-runtime/variables/util/variable/service-variable.utils.d.ts +1 -1
@@ -1,17 +1,17 @@
1
1
  /*!
2
- * jQuery UI Resizable 1.13.2
3
- * http://jqueryui.com
2
+ * jQuery UI Resizable 1.13.3
3
+ * https://jqueryui.com
4
4
  *
5
- * Copyright jQuery Foundation and other contributors
5
+ * Copyright OpenJS Foundation and other contributors
6
6
  * Released under the MIT license.
7
- * http://jquery.org/license
7
+ * https://jquery.org/license
8
8
  */
9
9
 
10
10
  //>>label: Resizable
11
11
  //>>group: Interactions
12
12
  //>>description: Enables resize functionality for any element.
13
- //>>docs: http://api.jqueryui.com/resizable/
14
- //>>demos: http://jqueryui.com/resizable/
13
+ //>>docs: https://api.jqueryui.com/resizable/
14
+ //>>demos: https://jqueryui.com/resizable/
15
15
  //>>css.structure: ../../themes/base/core.css
16
16
  //>>css.structure: ../../themes/base/resizable.css
17
17
  //>>css.theme: ../../themes/base/theme.css
@@ -39,7 +39,7 @@
39
39
  "use strict";
40
40
 
41
41
  $.widget( "ui.resizable", $.ui.mouse, {
42
- version: "1.13.2",
42
+ version: "1.13.3",
43
43
  widgetEventPrefix: "resize",
44
44
  options: {
45
45
  alsoResize: false,
@@ -533,15 +533,18 @@ $.widget( "ui.resizable", $.ui.mouse, {
533
533
  if ( this.position.left !== this.prevPosition.left ) {
534
534
  props.left = this.position.left + "px";
535
535
  }
536
+
537
+ this.helper.css( props );
538
+
536
539
  if ( this.size.width !== this.prevSize.width ) {
537
540
  props.width = this.size.width + "px";
541
+ this.helper.width( props.width );
538
542
  }
539
543
  if ( this.size.height !== this.prevSize.height ) {
540
544
  props.height = this.size.height + "px";
545
+ this.helper.height( props.height );
541
546
  }
542
547
 
543
- this.helper.css( props );
544
-
545
548
  return props;
546
549
  },
547
550
 
@@ -1048,7 +1051,7 @@ $.ui.plugin.add( "resizable", "alsoResize", {
1048
1051
  $( o.alsoResize ).each( function() {
1049
1052
  var el = $( this );
1050
1053
  el.data( "ui-resizable-alsoresize", {
1051
- width: parseFloat( el.width() ), height: parseFloat( el.height() ),
1054
+ width: parseFloat( el.css( "width" ) ), height: parseFloat( el.css( "height" ) ),
1052
1055
  left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
1053
1056
  } );
1054
1057
  } );
@@ -1,17 +1,17 @@
1
1
  /*!
2
- * jQuery UI Sortable 1.13.2
3
- * http://jqueryui.com
2
+ * jQuery UI Sortable 1.13.3
3
+ * https://jqueryui.com
4
4
  *
5
- * Copyright jQuery Foundation and other contributors
5
+ * Copyright OpenJS Foundation and other contributors
6
6
  * Released under the MIT license.
7
- * http://jquery.org/license
7
+ * https://jquery.org/license
8
8
  */
9
9
 
10
10
  //>>label: Sortable
11
11
  //>>group: Interactions
12
12
  //>>description: Enables items in a list to be sorted using the mouse.
13
- //>>docs: http://api.jqueryui.com/sortable/
14
- //>>demos: http://jqueryui.com/sortable/
13
+ //>>docs: https://api.jqueryui.com/sortable/
14
+ //>>demos: https://jqueryui.com/sortable/
15
15
  //>>css.structure: ../../themes/base/sortable.css
16
16
 
17
17
  ( function( factory ) {
@@ -38,7 +38,7 @@
38
38
  "use strict";
39
39
 
40
40
  return $.widget( "ui.sortable", $.ui.mouse, {
41
- version: "1.13.2",
41
+ version: "1.13.3",
42
42
  widgetEventPrefix: "sort",
43
43
  ready: false,
44
44
  options: {
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/router'), require('@wm/core')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@angular/core', '@angular/common', '@angular/router', '@wm/core'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.wm = global.wm || {}, global.wm.security = {}), global.ng.core, global.ng.common, global.ng.router, global.wm.core));
5
- })(this, (function (exports, i0, i3, i2, i1) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/router'), require('@wm/core'), require('lodash-es')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@angular/core', '@angular/common', '@angular/router', '@wm/core', 'lodash-es'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.wm = global.wm || {}, global.wm.security = {}), global.ng.core, global.ng.common, global.ng.router, global.wm.core, global._));
5
+ })(this, (function (exports, i0, i3, i2, i1, lodashEs) { 'use strict';
6
6
 
7
7
  function _interopNamespaceDefault(e) {
8
8
  var n = Object.create(null);
@@ -87,7 +87,7 @@
87
87
  */
88
88
  getConfig(successCallback, failureCallback) {
89
89
  function invokeQueuedCallbacks(id, method, data) {
90
- _.forEach(this.requestQueue[id], fn => i1.triggerFn(fn[method], data));
90
+ lodashEs.forEach(this.requestQueue[id], fn => i1.triggerFn(fn[method], data));
91
91
  this.requestQueue[id] = null;
92
92
  }
93
93
  function onSuccess(config) {
@@ -174,7 +174,7 @@
174
174
  return paramVal;
175
175
  }
176
176
  isNoPageLoaded() {
177
- return !_.isEmpty(this.getCurrentRoutePage());
177
+ return !lodashEs.isEmpty(this.getCurrentRoutePage());
178
178
  }
179
179
  getPageByLoggedInUser() {
180
180
  const that = this;
@@ -237,7 +237,7 @@
237
237
  * @returns {any|string}
238
238
  */
239
239
  getRedirectPage(config, page) {
240
- const homePage = i1.getWmProjectProperties().homePage, loginPage = _.get(config, 'loginConfig.pageName');
240
+ const homePage = i1.getWmProjectProperties().homePage, loginPage = lodashEs.get(config, 'loginConfig.pageName');
241
241
  let prevRedirectPage, redirectPage = page || this.getCurrentRoutePage();
242
242
  // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined
243
243
  if (redirectPage === homePage || redirectPage === loginPage) {
@@ -249,7 +249,7 @@
249
249
  * in this case, redirectTo page should be 'page' and not undefined
250
250
  */
251
251
  prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');
252
- redirectPage = !_.isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;
252
+ redirectPage = !lodashEs.isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;
253
253
  }
254
254
  return redirectPage;
255
255
  }
@@ -259,7 +259,7 @@
259
259
  getRedirectedRouteQueryParams() {
260
260
  let queryParams = {};
261
261
  this.activatedRoute.queryParams.subscribe((paramVal) => {
262
- _.forEach(paramVal, (val, key) => {
262
+ lodashEs.forEach(paramVal, (val, key) => {
263
263
  queryParams[key] = val;
264
264
  });
265
265
  });
@@ -268,15 +268,15 @@
268
268
  // accepts query object like {a:1, b:2} and returns a=1&b=2 string
269
269
  getQueryString(queryObject) {
270
270
  const params = [];
271
- _.forEach(queryObject, function (value, key) {
271
+ lodashEs.forEach(queryObject, function (value, key) {
272
272
  params.push(key + '=' + value);
273
273
  });
274
- return _.join(params, '&');
274
+ return lodashEs.join(params, '&');
275
275
  }
276
276
  appLogin(params, successCallback, failureCallback) {
277
277
  let payload = '';
278
278
  // encode all parameters
279
- _.each(params, function (value, name) {
279
+ lodashEs.each(params, function (value, name) {
280
280
  payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);
281
281
  });
282
282
  return this.$http.send({
@@ -324,8 +324,8 @@
324
324
  responseType: 'text',
325
325
  byPassResult: true
326
326
  }).then((response) => {
327
- _.set(this.get(), 'authenticated', false);
328
- _.set(this.get(), 'userInfo', null);
327
+ lodashEs.set(this.get(), 'authenticated', false);
328
+ lodashEs.set(this.get(), 'userInfo', null);
329
329
  /*if (CONSTANTS.hasCordova) {
330
330
  localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');
331
331
  }*/
@@ -2,6 +2,7 @@ import { Injectable, Injector } from '@angular/core';
2
2
  import { Location } from '@angular/common';
3
3
  import { ActivatedRoute, Router } from '@angular/router';
4
4
  import { AbstractHttpService, App, getClonedObject, getWmProjectProperties, hasCordova, triggerFn } from '@wm/core';
5
+ import { each, forEach, get, isEmpty, join, set } from "lodash-es";
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@wm/core";
7
8
  import * as i2 from "@angular/router";
@@ -67,7 +68,7 @@ export class SecurityService {
67
68
  */
68
69
  getConfig(successCallback, failureCallback) {
69
70
  function invokeQueuedCallbacks(id, method, data) {
70
- _.forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));
71
+ forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));
71
72
  this.requestQueue[id] = null;
72
73
  }
73
74
  function onSuccess(config) {
@@ -157,7 +158,7 @@ export class SecurityService {
157
158
  return paramVal;
158
159
  }
159
160
  isNoPageLoaded() {
160
- return !_.isEmpty(this.getCurrentRoutePage());
161
+ return !isEmpty(this.getCurrentRoutePage());
161
162
  }
162
163
  getPageByLoggedInUser() {
163
164
  const that = this;
@@ -229,7 +230,7 @@ export class SecurityService {
229
230
  * @returns {any|string}
230
231
  */
231
232
  getRedirectPage(config, page) {
232
- const homePage = getWmProjectProperties().homePage, loginPage = _.get(config, 'loginConfig.pageName');
233
+ const homePage = getWmProjectProperties().homePage, loginPage = get(config, 'loginConfig.pageName');
233
234
  let prevRedirectPage, redirectPage = page || this.getCurrentRoutePage();
234
235
  // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined
235
236
  if (redirectPage === homePage || redirectPage === loginPage) {
@@ -241,7 +242,7 @@ export class SecurityService {
241
242
  * in this case, redirectTo page should be 'page' and not undefined
242
243
  */
243
244
  prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');
244
- redirectPage = !_.isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;
245
+ redirectPage = !isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;
245
246
  }
246
247
  return redirectPage;
247
248
  }
@@ -251,7 +252,7 @@ export class SecurityService {
251
252
  getRedirectedRouteQueryParams() {
252
253
  let queryParams = {};
253
254
  this.activatedRoute.queryParams.subscribe((paramVal) => {
254
- _.forEach(paramVal, (val, key) => {
255
+ forEach(paramVal, (val, key) => {
255
256
  queryParams[key] = val;
256
257
  });
257
258
  });
@@ -260,15 +261,15 @@ export class SecurityService {
260
261
  // accepts query object like {a:1, b:2} and returns a=1&b=2 string
261
262
  getQueryString(queryObject) {
262
263
  const params = [];
263
- _.forEach(queryObject, function (value, key) {
264
+ forEach(queryObject, function (value, key) {
264
265
  params.push(key + '=' + value);
265
266
  });
266
- return _.join(params, '&');
267
+ return join(params, '&');
267
268
  }
268
269
  appLogin(params, successCallback, failureCallback) {
269
270
  let payload = '';
270
271
  // encode all parameters
271
- _.each(params, function (value, name) {
272
+ each(params, function (value, name) {
272
273
  payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);
273
274
  });
274
275
  return this.$http.send({
@@ -316,8 +317,8 @@ export class SecurityService {
316
317
  responseType: 'text',
317
318
  byPassResult: true
318
319
  }).then((response) => {
319
- _.set(this.get(), 'authenticated', false);
320
- _.set(this.get(), 'userInfo', null);
320
+ set(this.get(), 'authenticated', false);
321
+ set(this.get(), 'userInfo', null);
321
322
  /*if (CONSTANTS.hasCordova) {
322
323
  localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');
323
324
  }*/
@@ -401,4 +402,4 @@ export class SecurityService {
401
402
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SecurityService, [{
402
403
  type: Injectable
403
404
  }], () => [{ type: i0.Injector }, { type: i1.AbstractHttpService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.Location }], null); })();
404
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NlY3VyaXR5L3NyYy9zZWN1cml0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsR0FBRyxFQUNILGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFNBQVMsRUFDWixNQUFNLFVBQVUsQ0FBQzs7Ozs7QUFJbEIsdURBQXVEO0FBQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxFQUNwQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFHN0IsTUFBTSxPQUFPLGVBQWU7SUFPeEIsWUFDWSxRQUFrQixFQUNsQixLQUEwQixFQUMxQixhQUFxQixFQUNyQixjQUE4QixFQUM5QixTQUFtQjtRQUpuQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFVBQUssR0FBTCxLQUFLLENBQXFCO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQ3JCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBUC9CLGlCQUFZLEdBQVEsRUFBRSxDQUFDO0lBUXBCLENBQUM7SUFFSixRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxHQUFHO1FBQ0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBbUI7UUFDcEIsSUFBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBQSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFBQSxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUEsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUFBLENBQUM7UUFDckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDcEYsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDekMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRTtnQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUUsRUFBRTtnQkFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDYixnQ0FBZ0M7WUFDaEMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMvQixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLEVBQUU7YUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxlQUFlLEVBQUUsZUFBZTtRQUN0QyxTQUFTLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSTtZQUMzQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDakMsQ0FBQztRQUVELFNBQVMsU0FBUyxDQUFDLE1BQU07WUFDckIsTUFBTSxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIseUZBQXlGO2dCQUN6RiwwREFBMEQ7WUFDOUQsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNwQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLEtBQUs7WUFDbEI7Ozs7Ozs7Ozt1QkFTVztZQUNYLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRCxJQUFJO1FBQ1IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDYixnQ0FBZ0M7WUFDaEMsU0FBUyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxPQUFPO1FBQ1gsQ0FBQztRQUVELGlGQUFpRjtRQUNqRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLEtBQUssRUFBRSxlQUFlO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDaEIsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNEOzs7Ozs7Ozs7Ozs7Ozs7O1lBZ0JJO0lBQ1IsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUI7UUFDZixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsMEJBQTBCO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsU0FBUztRQUMvQixJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxxQkFBcUI7UUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQztZQUNULElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO29CQUN4QixJQUFJLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ3RCLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ2pELElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzt3QkFDeEUsNkZBQTZGO3dCQUM3RixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDOzRCQUN2QixvREFBb0Q7NEJBQ3BELDhEQUE4RDt3QkFDbEUsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxHQUFHLHNCQUFzQixFQUFFLENBQUMsUUFBUSxDQUFDO29CQUM3QyxDQUFDO29CQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxFQUFFO29CQUNDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGtCQUFrQixDQUFDLGFBQWM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUN6Qyx5RUFBeUU7Z0JBQ3pFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3JDLE1BQU0sQ0FBQyxRQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlO1FBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSztRQUN6QixNQUFNLFFBQVEsR0FBRyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsRUFDOUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDdEQsSUFBSSxnQkFBZ0IsRUFDaEIsWUFBWSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUV0RCxvSEFBb0g7UUFDcEgsSUFBSSxZQUFZLEtBQUssUUFBUSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxRDs7Ozs7O2VBTUc7WUFDSCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCw2QkFBNkI7UUFDekIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ25ELENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUM3QixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLGNBQWMsQ0FBQyxXQUFXO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxVQUFVLEtBQUssRUFBRSxHQUFHO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWU7UUFDN0MsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWpCLHdCQUF3QjtRQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssRUFBRSxJQUFJO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakcsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ25CLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNMLGNBQWMsRUFBRSxtQ0FBbUM7YUFDdEQ7WUFDRCxHQUFHLEVBQUUseUJBQXlCO1lBQzlCLE1BQU0sRUFBRSxPQUFPO1NBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqQixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUU3RSw2RkFBNkY7WUFDN0YsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO29CQUNmLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO1lBQ0wsQ0FBQztZQUNELDZGQUE2RjtZQUM3RixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGVBQWUsQ0FBQyxlQUFlLEVBQUUsZUFBZTtRQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsTUFBTTtZQUMzQixTQUFTLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRCxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLGVBQWUsRUFBRSxlQUFlO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDbkIsTUFBTSxFQUFFLFVBQVU7WUFDbEIsR0FBRyxFQUFFLDBCQUEwQjtZQUMvQixNQUFNLEVBQUUsTUFBTTtZQUNkLFlBQVksRUFBRSxNQUFNO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqQixDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDOztlQUVHO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxTQUFTLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxJQUFJO1FBQ2hCLDJDQUEyQztRQUMzQyxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDVCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDZixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVc7UUFDZCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN6QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDdkIsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFOzRCQUN0RSxPQUFPLEVBQUUsQ0FBQzs0QkFDVixXQUFXLEVBQUUsQ0FBQzt3QkFDbEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osT0FBTyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQztZQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNYLE9BQU8sSUFBSSxPQUFPLENBQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN0QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLEVBQUUsQ0FBQztnQkFDYixDQUFDO1lBQ0wsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDVCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNyRSxDQUFDO2dGQWhhUSxlQUFlO3VFQUFmLGVBQWUsV0FBZixlQUFlOztpRkFBZixlQUFlO2NBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gICAgQWJzdHJhY3RIdHRwU2VydmljZSxcbiAgICBBcHAsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldFdtUHJvamVjdFByb3BlcnRpZXMsXG4gICAgaGFzQ29yZG92YSxcbiAgICB0cmlnZ2VyRm5cbn0gZnJvbSAnQHdtL2NvcmUnO1xuXG5kZWNsYXJlIGNvbnN0IF87XG5cbi8vIFRvZG9bU2h1YmhhbV06IE1vdmUgYmVsb3cgY29uc3RhbnRzIHRvIGEgY29tbW9uIGZpbGVcbmNvbnN0IFhTUkZfQ09PS0lFX05BTUUgPSAnd21feHNyZl90b2tlbicsXG4gICAgaXNBcHBsaWNhdGlvblR5cGUgPSB0cnVlO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlTZXJ2aWNlIHtcbiAgICBjb25maWc7XG4gICAgbGFzdExvZ2dlZEluVXNlcjtcbiAgICBsb2dnZWRJblVzZXI7XG4gICAgbG9hZFByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICByZXF1ZXN0UXVldWU6IGFueSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlICRodHRwOiBBYnN0cmFjdEh0dHBTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlclNlcnZpY2U6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgX2xvY2F0aW9uOiBMb2NhdGlvblxuICAgICkge31cblxuICAgIGlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgbG9hZChmb3JjZUZsYWc/OiBib29sZWFuKSB7XG4gICAgICAgIGlmKHRoaXMubG9hZFByb21pc2UpIHtyZXR1cm4gdGhpcy5sb2FkUHJvbWlzZTt9XG4gICAgICAgIGlmICghZm9yY2VGbGFnICYmIHRoaXMuY29uZmlnKSB7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmNvbmZpZyk7fVxuICAgICAgICB0aGlzLmxvYWRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuc2VuZCh7J3VybCc6ICcuL3NlcnZpY2VzL3NlY3VyaXR5L2luZm8nLCAnbWV0aG9kJzogJ0dFVCd9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdExvZ2dlZEluVXNlciA9IGdldENsb25lZE9iamVjdCh0aGlzLmxvZ2dlZEluVXNlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyID0gdGhpcy5jb25maWcudXNlckluZm87XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuYm9keSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycik9PntcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSkuZmluYWxseSgoKT0+e1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRQcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldHMgdGhlIHNlY3VyaXR5IGNvbmZpZyBmcm9tIHRoZSBkZXBsb3llZCBhcHAgKGJhY2tlbmQgY2FsbClcbiAgICAgKiBAcGFyYW0gc3VjY2Vzc1xuICAgICAqIEBwYXJhbSBlcnJvclxuICAgICAqL1xuICAgIGdldFdlYkNvbmZpZyhzdWNjZXNzLCBlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5nZXQoKSkge1xuICAgICAgICAgICAgLy8gaWYgYWxyZWFkeSBmZXRjaGVkLCByZXR1cm4gaXRcbiAgICAgICAgICAgIHRyaWdnZXJGbihzdWNjZXNzLCB0aGlzLmdldCgpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWQoKVxuICAgICAgICAgICAgLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2VzcywgY29uZmlnKTtcbiAgICAgICAgICAgIH0sIGVycm9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHNlY3VyaXR5IGNvbmZpZ1xuICAgICAqIEBwYXJhbSBzdWNjZXNzQ2FsbGJhY2tcbiAgICAgKiBAcGFyYW0gZmFpbHVyZUNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q29uZmlnKHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgICAgIGZ1bmN0aW9uIGludm9rZVF1ZXVlZENhbGxiYWNrcyhpZCwgbWV0aG9kLCBkYXRhKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5yZXF1ZXN0UXVldWVbaWRdLCBmbiA9PiB0cmlnZ2VyRm4oZm5bbWV0aG9kXSwgZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UXVldWVbaWRdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9uU3VjY2Vzcyhjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5ob21lUGFnZSA9IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZTtcbiAgICAgICAgICAgIGlmIChjb25maWcudXNlckluZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIHJldHVybnMgbGFuZGluZ1BhZ2UgaW5zdGVhZCBvZiBob21lUGFnZSwgaGVuY2UgdGhpcyBzdGF0ZW1lbnQoZm9yIGNvbnNpc3RlbmN5KVxuICAgICAgICAgICAgICAgIC8vIGNvbmZpZy51c2VySW5mby5ob21lUGFnZSA9IGNvbmZpZy51c2VySW5mby5sYW5kaW5nUGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5sYXN0TG9nZ2VkSW5Vc2VyID0gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMubG9nZ2VkSW5Vc2VyKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyID0gY29uZmlnLnVzZXJJbmZvO1xuICAgICAgICAgICAgaW52b2tlUXVldWVkQ2FsbGJhY2tzLmNhbGwodGhpcywgJ2NvbmZpZycsICdzdWNjZXNzJywgdGhpcy5nZXQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgICAgICAvKmlmICgkcm9vdFNjb3BlLmlzTW9iaWxlQXBwbGljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICAgJ3NlY3VyaXR5RW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAgICAgICdhdXRoZW50aWNhdGVkJzogZmFsc2UsXG4gICAgICAgICAgICAgJ2hvbWVQYWdlJzogX1dNX0FQUF9QUk9QRVJUSUVTLmhvbWVQYWdlLFxuICAgICAgICAgICAgICd1c2VySW5mbyc6IG51bGwsXG4gICAgICAgICAgICAgJ2xvZ2luJzogbnVsbFxuICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgaW52b2tlUXVldWVkQ2FsbGJhY2tzKCdjb25maWcnLCAnc3VjY2VzcycsIHRoaXMuZ2V0KCkpO1xuICAgICAgICAgICAgIH0gZWxzZSB7Ki9cbiAgICAgICAgICAgIGludm9rZVF1ZXVlZENhbGxiYWNrcy5jYWxsKHRoaXMsICdjb25maWcnLCAnZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nZXQoKSkge1xuICAgICAgICAgICAgLy8gaWYgYWxyZWFkeSBmZXRjaGVkLCByZXR1cm4gaXRcbiAgICAgICAgICAgIHRyaWdnZXJGbihzdWNjZXNzQ2FsbGJhY2ssIHRoaXMuZ2V0KCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgY2hlY2ssIGlmIHNhbWUgcXVldWUgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgZG8gbm90IHNlbmQgYW5vdGhlciByZXF1ZXN0XG4gICAgICAgIHRoaXMucmVxdWVzdFF1ZXVlLmNvbmZpZyA9IHRoaXMucmVxdWVzdFF1ZXVlLmNvbmZpZyB8fCBbXTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnLnB1c2goe1xuICAgICAgICAgICAgc3VjY2Vzczogc3VjY2Vzc0NhbGxiYWNrLFxuICAgICAgICAgICAgZXJyb3I6IGZhaWx1cmVDYWxsYmFja1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdFF1ZXVlLmNvbmZpZy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc0NvcmRvdmEoKSkge1xuICAgICAgICAgICAgLy8gZm9yIHdlYiBwcm9qZWN0LCByZXR1cm4gY29uZmlnIHJldHVybmVkIGZyb20gYmFja2VuZCBBUEkgY2FsbC5cbiAgICAgICAgICAgIHRoaXMuZ2V0V2ViQ29uZmlnKG9uU3VjY2Vzcy5iaW5kKHRoaXMpLCBvbkVycm9yLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGVsc2Uge1xuICAgICAgICAgLyEqXG4gICAgICAgICAqIGZvciBtb2JpbGUgYXBwLCBmaXJzdCBnZXQgdGhlIG1vYmlsZSBjb25maWcgKHNhdmVkIGluIHRoZSBhcGspXG4gICAgICAgICAqIC0gaWYgc2VjdXJpdHkgbm90IGVuYWJsZWQsIGp1c3QgcmV0dXJuIG1vYmlsZSBjb25maWcgKG5vIGJhY2tlbmQgY2FsbCByZXF1aXJlZClcbiAgICAgICAgICogLSBlbHNlLCBnZXQgV2ViIGNvbmZpZyAod2lsbCBiZSAgdGhlIHNhbWUgQVBJIGhpdCBmb3IgbG9naW4pIGFuZCBtZXJnZSB0aGUgY29uZmlnIHdpdGggX21vYmlsZWNvbmZpZ1xuICAgICAgICAgKiEvXG4gICAgICAgICBnZXRNb2JpbGVDb25maWcoZnVuY3Rpb24gKG1vYmlsZWNvbmZpZykge1xuICAgICAgICAgaWYgKCFtb2JpbGVjb25maWcuc2VjdXJpdHlFbmFibGVkKSB7XG4gICAgICAgICBvblN1Y2Nlc3MobW9iaWxlY29uZmlnKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICBnZXRXZWJDb25maWcoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgY29uZmlnID0gbWVyZ2VXZWJBbmRNb2JpbGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgIG9uU3VjY2Vzcyhjb25maWcpO1xuICAgICAgICAgfSwgZnVuY3Rpb24gKCkge29uU3VjY2Vzcyhtb2JpbGVjb25maWcpOyB9KTtcbiAgICAgICAgIH1cbiAgICAgICAgIH0sIG9uRXJyb3IpO1xuICAgICAgICAgfSovXG4gICAgfVxuXG4gICAgZ2V0TGFzdExvZ2dlZEluVXNlcm5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RMb2dnZWRJblVzZXIgJiYgdGhpcy5sYXN0TG9nZ2VkSW5Vc2VyLnVzZXJOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSBuYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDdXJyZW50Um91dGVQYWdlKCkge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5fbG9jYXRpb24ucGF0aCgpO1xuICAgICAgICBsZXQgbEluZGV4ID0gcC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGxJbmRleCA9IGxJbmRleCA9PT0gLTEgPyBwLmxlbmd0aCA6IGxJbmRleCAtIDE7XG4gICAgICAgIHJldHVybiBwLnN1YnN0cigxLCBsSW5kZXgpOyAvLyBpZ25vcmUgdGhlIHF1ZXJ5IHBhcmFtc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgUXVlcnkgcGFyYW1zIGZvciBzcGVjaWZpZWQgcGFyYW0gbmFtZSBpbiBjdXJyZW50IFJvdXRlXG4gICAgICogQHBhcmFtIHBhcmFtTmFtZSwgdGhlIHBhcmFtIG5hbWUgd2hvc2UgcXVlcnkgcGFyYW0gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBnZXRDdXJyZW50Um91dGVRdWVyeVBhcmFtKHBhcmFtTmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1WYWw7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgICAgICBwYXJhbVZhbCA9IHBhcmFtc1twYXJhbU5hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhcmFtVmFsO1xuICAgIH1cblxuICAgIGlzTm9QYWdlTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gIV8uaXNFbXB0eSh0aGlzLmdldEN1cnJlbnRSb3V0ZVBhZ2UoKSk7XG4gICAgfVxuXG4gICAgZ2V0UGFnZUJ5TG9nZ2VkSW5Vc2VyKCkge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGFnZTtcbiAgICAgICAgICAgIGlmICghaXNBcHBsaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5pc05vUGFnZUxvYWRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGF0LmdldENvbmZpZygoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc2VjdXJpdHlFbmFibGVkICYmIGNvbmZpZy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gY29uZmlnLnVzZXJJbmZvLmxhbmRpbmdQYWdlIHx8IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHhzcmYgY29va2llIG5hbWUgYW5kIHhzcmYgaGVhZGVyIG5hbWVzIHdpdGggV2F2ZU1ha2VyIHNwZWNpZmljIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy4kaHR0cC5kZWZhdWx0cy54c3JmQ29va2llTmFtZSA9IFhTUkZfQ09PS0lFO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJGh0dHAuZGVmYXVsdHMueHNyZkhlYWRlck5hbWUgPSBjb25maWcuY3NyZkhlYWRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBBcHAgcGFnZSBhcyBmb2xsb3dzOlxuICAgICAqIFNlY3VyaXR5IGRpc2FibGVkOlxuICAgICAqICAgICAgLSBIb21lIHBhZ2VcbiAgICAgKiBTZWN1cml0eSBlbmFibGVkOlxuICAgICAqICAgICAgLSBVc2VyIGlzIGxvZ2dlZCBpbiwgcmVzcGVjdGl2ZSBsYW5kaW5nIHBhZ2UgaXMgbG9hZGVkXG4gICAgICogICAgICAtIE5vdCBsb2dnZWQgaW46XG4gICAgICogICAgICAgICAgLSBIb21lIHBhZ2UgaXMgcHVibGljLCBsb2FkcyB0aGUgaG9tZSBwYWdlXG4gICAgICogICAgICAgICAgLSBIb21lIHBhZ2Ugbm90IHB1YmxpYywgTG9naW4gcGFnZShpbiBjb25maWcpIGlzIGxvYWRlZFxuICAgICAqIEBwYXJhbSBmb3JjZVBhZ2VMb2FkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8VD59XG4gICAgICovXG4gICAgbG9hZFBhZ2VCeVVzZXJSb2xlKGZvcmNlUGFnZUxvYWQ/KSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlMb2dnZWRJblVzZXIoKS50aGVuKHBhZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKHRoYXQuaXNOb1BhZ2VMb2FkZWQoKSB8fCBmb3JjZVBhZ2VMb2FkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwYWdlIHdoZW4gY3VycmVudCBwYWdlIGFuZCBwb3N0IGxvZ2luIGxhbmRpbmcgcGFnZSBhcmUgc2FtZVxuICAgICAgICAgICAgICAgIGlmICh0aGF0LmdldEN1cnJlbnRSb3V0ZVBhZ2UoKSA9PT0gcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAod2luZG93LmxvY2F0aW9uIGFzIGFueSkucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5yb3V0ZXJTZXJ2aWNlLm5hdmlnYXRlKFtgLyR7cGFnZX1gXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWVQYWdlIGJhc2VkIG9uIHRoZSBjb25maWcgaW4gU2VjdXJpdHlTZXJ2aWNlXG4gICAgICogQXNzdW1wdGlvbiBpcyB0aGUgU2VjdXJpdHlTZXJ2aWNlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHNlY3VyaXR5IGNvbmZpZyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gdGhpcyBmdW5jdGlvblxuICAgICAqL1xuICAgIG5hdmlnYXRlT25Mb2dpbigpIHtcbiAgICAgICAgdGhpcy5sb2FkUGFnZUJ5VXNlclJvbGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFnZSB3aGljaCBuZWVkcyB0byBiZSByZWRpcmVjdGVkIHRvIG9uIHN1Y2Nlc3NmdWwgbG9naW5cbiAgICAgKiBAcGFyYW0gY29uZmlnLFxuICAgICAqIEBwYXJhbSBwYWdlLCBwYWdlIG5hbWUgZm9yIHJlZGlyZWN0aW9uXG4gICAgICogQHJldHVybnMge2FueXxzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UmVkaXJlY3RQYWdlKGNvbmZpZywgcGFnZT8pIHtcbiAgICAgICAgY29uc3QgaG9tZVBhZ2UgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2UsXG4gICAgICAgICAgICBsb2dpblBhZ2UgPSBfLmdldChjb25maWcsICdsb2dpbkNvbmZpZy5wYWdlTmFtZScpO1xuICAgICAgICBsZXQgcHJldlJlZGlyZWN0UGFnZSxcbiAgICAgICAgICAgIHJlZGlyZWN0UGFnZSA9IHBhZ2UgfHwgdGhpcy5nZXRDdXJyZW50Um91dGVQYWdlKCk7XG5cbiAgICAgICAgLy8gaWYgdXNlciBpcyBhbHJlYWR5IG9uIEhvbWUgcGFnZSBvciBMb2dpbiBwYWdlLCB0aGV5IHNob3VsZCBub3QgYmUgcmVkaXJlY3RlZCB0byB0aGF0IHBhZ2UsIGhlbmNlIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgaWYgKHJlZGlyZWN0UGFnZSA9PT0gaG9tZVBhZ2UgfHwgcmVkaXJlY3RQYWdlID09PSBsb2dpblBhZ2UpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBmaW5kIHByZXZpb3VzIHJlZGlyZWN0IHBhZ2UgZnJvbSBVUkwsIGlmIGV4aXN0cywgdXNlciBzaG91bGQgcmVkaXJlY3QgdG8gdGhhdCBwYWdlLlxuICAgICAgICAgICAgICogVVNFIENBU0U6XG4gICAgICAgICAgICAgKiAgdXNlciBpcyBvbiBodHRwOi8vbG9jYWxob3N0OjgwODAvYXBwLyMvTG9naW4/cmVkaXJlY3RUbz1wYWdlXG4gICAgICAgICAgICAgKiAgYSB2YXJpYWJsZSBjYWxsIGZhaWxzIHJlc3VsdGluZyA0MDFcbiAgICAgICAgICAgICAqICBpbiB0aGlzIGNhc2UsIHJlZGlyZWN0VG8gcGFnZSBzaG91bGQgYmUgJ3BhZ2UnIGFuZCBub3QgdW5kZWZpbmVkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByZXZSZWRpcmVjdFBhZ2UgPSB0aGlzLmdldEN1cnJlbnRSb3V0ZVF1ZXJ5UGFyYW0oJ3JlZGlyZWN0VG8nKTtcbiAgICAgICAgICAgIHJlZGlyZWN0UGFnZSA9ICFfLmlzRW1wdHkocHJldlJlZGlyZWN0UGFnZSkgPyBwcmV2UmVkaXJlY3RQYWdlIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZGlyZWN0UGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgcXVlcnkgcGFyYW1zKGluY2x1ZGluZyBwYWdlIHBhcmFtcyBhbmQgcmVkaXJlY3QgdG8gcGFyYW1zKSBhc3NvY2lhdGVkIHdpdGggcmVkaXJlY3RlZCBwYWdlXG4gICAgICovXG4gICAgZ2V0UmVkaXJlY3RlZFJvdXRlUXVlcnlQYXJhbXMoKSB7XG4gICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IHt9O1xuICAgICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1WYWwpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChwYXJhbVZhbCwgKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xuICAgIH1cblxuICAgIC8vIGFjY2VwdHMgcXVlcnkgb2JqZWN0IGxpa2Uge2E6MSwgYjoyfSBhbmQgcmV0dXJucyBhPTEmYj0yIHN0cmluZ1xuICAgIGdldFF1ZXJ5U3RyaW5nKHF1ZXJ5T2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgICAgICBfLmZvckVhY2gocXVlcnlPYmplY3QsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICBwYXJhbXMucHVzaChrZXkgKyAnPScgKyB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gXy5qb2luKHBhcmFtcywgJyYnKTtcbiAgICB9XG5cbiAgICBhcHBMb2dpbihwYXJhbXMsIHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBwYXlsb2FkID0gJyc7XG5cbiAgICAgICAgLy8gZW5jb2RlIGFsbCBwYXJhbWV0ZXJzXG4gICAgICAgIF8uZWFjaChwYXJhbXMsIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICAgICAgcGF5bG9hZCArPSAocGF5bG9hZCA/ICcmJyA6ICcnKSArIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiRodHRwLnNlbmQoe1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXJsOiAnal9zcHJpbmdfc2VjdXJpdHlfY2hlY2snLFxuICAgICAgICAgICAgJ2RhdGEnOiBwYXlsb2FkXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4c3JmQ29va2llVmFsdWUgPSByZXNwb25zZS5ib2R5ID8gcmVzcG9uc2UuYm9keVtYU1JGX0NPT0tJRV9OQU1FXSA6ICcnO1xuXG4gICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCB4c3JmIGNvb2tpZSBuYW1lIGFuZCB4c3JmIGhlYWRlciBuYW1lcyB3aXRoIFdhdmVNYWtlciBzcGVjaWZpYyB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh4c3JmQ29va2llVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFhTUkZfQ09PS0lFX05BTUUsIHhzcmZDb29raWVWYWx1ZSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgbG9naW4gaW4gZGV2aWNlLCB0aGlzIGZ1bmN0aW9uIHRyaWdnZXJzIHRoZSBwZW5kaW5nIG9uTG9naW5DYWxsYmFja3MuXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLmdldChBcHApLm5vdGlmeSgndXNlckxvZ2dlZEluJywge30pO1xuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgcmVzcG9uc2UpO1xuICAgICAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIGluIHRoZSBSVU4gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3NDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gc3VjY2Vzc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZhaWx1cmVDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gZmFpbHVyZVxuICAgICAqL1xuICAgIGlzQXV0aGVudGljYXRlZChzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldENvbmZpZyhmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzc0NhbGxiYWNrLCBjb25maWcuYXV0aGVudGljYXRlZCk7XG4gICAgICAgIH0sIGZhaWx1cmVDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBpcyB1c2VkIHRvIGxvZ291dCBvZiB0aGUgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VjY2Vzc0NhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBzdWNjZXNzXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZmFpbHVyZUNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBmYWlsdXJlXG4gICAgICovXG4gICAgYXBwTG9nb3V0KHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRodHRwLnNlbmQoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnU2VjdXJpdHknLFxuICAgICAgICAgICAgdXJsOiAnal9zcHJpbmdfc2VjdXJpdHlfbG9nb3V0JyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgICAgICBieVBhc3NSZXN1bHQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIF8uc2V0KHRoaXMuZ2V0KCksICdhdXRoZW50aWNhdGVkJywgZmFsc2UpO1xuICAgICAgICAgICAgXy5zZXQodGhpcy5nZXQoKSwgJ3VzZXJJbmZvJywgbnVsbCk7XG4gICAgICAgICAgICAvKmlmIChDT05TVEFOVFMuaGFzQ29yZG92YSkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENPTlNUQU5UUy5YU1JGX0NPT0tJRV9OQU1FLCAnJyk7XG4gICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KEFwcCkubm90aWZ5KCd1c2VyTG9nZ2VkT3V0Jywge30pO1xuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgcmVzcG9uc2UpO1xuICAgICAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBhbmQgcmV0dXJuIHRoZSBjb29raWVcbiAgICAgKiBAcGFyYW0gbmFtZSwgY29va2llIGtleVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Q29va2llQnlOYW1lKG5hbWUpIHtcbiAgICAgICAgLy8gVG9kbzogU2h1YmhhbSBJbXBsZW1lbnQgY29va2llIG5hdGl2ZSBqc1xuICAgICAgICByZXR1cm4gJ2Nvb2tpZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb29raWVWYWx1ZSBpZiB4c3JmIGlzIGVuYWJsZWQuXG4gICAgICogSW4gZGV2aWNlLCB4c3JmIGNvb2tpZSBpcyBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICAgICAqIEByZXR1cm5zIHhzcmYgY29va2llIHZhbHVlXG4gICAgICovXG4gICAgaXNYc3JmRW5hYmxlZCgpIHtcbiAgICAgICAgaWYgKGhhc0NvcmRvdmEoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFhTUkZfQ09PS0lFX05BTUUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvb2tpZUJ5TmFtZShYU1JGX0NPT0tJRV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLiBQcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gc2VjdXJpdHkgaXNcbiAgICAgKiAxLiBkaXNhYmxlZFxuICAgICAqIDIuIGVuYWJsZWQgYW5kIHVzZXIgaXMgYXV0aGVudGljYXRlZFxuICAgICAqIDMuIGVuYWJsZWQgYW5kIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQsIHRoZW4gcHJvbWlzZSBpcyByZXNvbHZlZCBvbiB1c2VyIGxvZ2luXG4gICAgICogQHJldHVybnMgeyp9IHByb21pc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Vc2VyTG9naW4oKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29uZmlnKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFwcCkuc3Vic2NyaWJlKCd1c2VyTG9nZ2VkSW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGxvZ2dlZC1pbi11c2VyXG4gICAgICovXG4gICAgZ2V0TG9nZ2VkSW5Vc2VyKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldENvbmZpZygoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcudXNlckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb25maWcudXNlckluZm8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgZm9yIG1vYmlsZSBhcHBzIHRvIGF1dGhlbnRpY2F0ZSB2aWEgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGFmdGVyIGxvZ2luXG4gICAgICovXG4gICAgYXV0aEluQnJvd3NlcigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1RoaXMgYXV0aEluQnJvd3NlciBzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH1cbn1cbiJdfQ==
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NlY3VyaXR5L3NyYy9zZWN1cml0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsR0FBRyxFQUNILGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFNBQVMsRUFDWixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7O0FBRWpFLHVEQUF1RDtBQUN2RCxNQUFNLGdCQUFnQixHQUFHLGVBQWUsRUFDcEMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBRzdCLE1BQU0sT0FBTyxlQUFlO0lBT3hCLFlBQ1ksUUFBa0IsRUFDbEIsS0FBMEIsRUFDMUIsYUFBcUIsRUFDckIsY0FBOEIsRUFDOUIsU0FBbUI7UUFKbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQVAvQixpQkFBWSxHQUFRLEVBQUUsQ0FBQztJQVFwQixDQUFDO0lBRUosUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsR0FBRztRQUNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQW1CO1FBQ3BCLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQUEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQUEsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFBLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFBQSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3BGLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFFLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSztRQUN2QixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2IsZ0NBQWdDO1lBQ2hDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFO2FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ1gsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsZUFBZSxFQUFFLGVBQWU7UUFDdEMsU0FBUyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUk7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDakMsQ0FBQztRQUVELFNBQVMsU0FBUyxDQUFDLE1BQU07WUFDckIsTUFBTSxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIseUZBQXlGO2dCQUN6RiwwREFBMEQ7WUFDOUQsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNwQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLEtBQUs7WUFDbEI7Ozs7Ozs7Ozt1QkFTVztZQUNYLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRCxJQUFJO1FBQ1IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDYixnQ0FBZ0M7WUFDaEMsU0FBUyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxPQUFPO1FBQ1gsQ0FBQztRQUVELGlGQUFpRjtRQUNqRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLEtBQUssRUFBRSxlQUFlO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDaEIsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNEOzs7Ozs7Ozs7Ozs7Ozs7O1lBZ0JJO0lBQ1IsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUI7UUFDZixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsMEJBQTBCO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsU0FBUztRQUMvQixJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDO1lBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7b0JBQ3hCLElBQUksR0FBRyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDdEIsSUFBSSxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDakQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLHNCQUFzQixFQUFFLENBQUMsUUFBUSxDQUFDO3dCQUN4RSw2RkFBNkY7d0JBQzdGLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7NEJBQ3ZCLG9EQUFvRDs0QkFDcEQsOERBQThEO3dCQUNsRSxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixJQUFJLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQzdDLENBQUM7b0JBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixDQUFDLEVBQUU7b0JBQ0MsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsa0JBQWtCLENBQUMsYUFBYztRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ3pDLHlFQUF5RTtnQkFDekUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDckMsTUFBTSxDQUFDLFFBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWU7UUFDWCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFLO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixFQUFFLENBQUMsUUFBUSxFQUM5QyxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksZ0JBQWdCLEVBQ2hCLFlBQVksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFdEQsb0hBQW9IO1FBQ3BILElBQUksWUFBWSxLQUFLLFFBQVEsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUQ7Ozs7OztlQU1HO1lBQ0gsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLFlBQVksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdFLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCw2QkFBNkI7UUFDekIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ25ELE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsY0FBYyxDQUFDLFdBQVc7UUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsVUFBVSxLQUFLLEVBQUUsR0FBRztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWU7UUFDN0MsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWpCLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxFQUFFLElBQUk7WUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDbkIsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ0wsY0FBYyxFQUFFLG1DQUFtQzthQUN0RDtZQUNELEdBQUcsRUFBRSx5QkFBeUI7WUFDOUIsTUFBTSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRTdFLDZGQUE2RjtZQUM3RixJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7b0JBQ2YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7WUFDTCxDQUFDO1lBQ0QsNkZBQTZGO1lBQzdGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsU0FBUyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLGVBQWUsRUFBRSxlQUFlO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxNQUFNO1lBQzNCLFNBQVMsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsZUFBZSxFQUFFLGVBQWU7UUFDdEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNuQixNQUFNLEVBQUUsVUFBVTtZQUNsQixHQUFHLEVBQUUsMEJBQTBCO1lBQy9CLE1BQU0sRUFBRSxNQUFNO1lBQ2QsWUFBWSxFQUFFLE1BQU07WUFDcEIsWUFBWSxFQUFFLElBQUk7U0FDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xDOztlQUVHO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxTQUFTLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxJQUFJO1FBQ2hCLDJDQUEyQztRQUMzQyxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDVCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDZixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVc7UUFDZCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN6QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDdkIsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFOzRCQUN0RSxPQUFPLEVBQUUsQ0FBQzs0QkFDVixXQUFXLEVBQUUsQ0FBQzt3QkFDbEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osT0FBTyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQztZQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNYLE9BQU8sSUFBSSxPQUFPLENBQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN0QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLEVBQUUsQ0FBQztnQkFDYixDQUFDO1lBQ0wsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDVCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNyRSxDQUFDO2dGQWhhUSxlQUFlO3VFQUFmLGVBQWUsV0FBZixlQUFlOztpRkFBZixlQUFlO2NBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gICAgQWJzdHJhY3RIdHRwU2VydmljZSxcbiAgICBBcHAsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldFdtUHJvamVjdFByb3BlcnRpZXMsXG4gICAgaGFzQ29yZG92YSxcbiAgICB0cmlnZ2VyRm5cbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHtlYWNoLCBmb3JFYWNoLCBnZXQsIGlzRW1wdHksIGpvaW4sIHNldH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG4vLyBUb2RvW1NodWJoYW1dOiBNb3ZlIGJlbG93IGNvbnN0YW50cyB0byBhIGNvbW1vbiBmaWxlXG5jb25zdCBYU1JGX0NPT0tJRV9OQU1FID0gJ3dtX3hzcmZfdG9rZW4nLFxuICAgIGlzQXBwbGljYXRpb25UeXBlID0gdHJ1ZTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5U2VydmljZSB7XG4gICAgY29uZmlnO1xuICAgIGxhc3RMb2dnZWRJblVzZXI7XG4gICAgbG9nZ2VkSW5Vc2VyO1xuICAgIGxvYWRQcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgcmVxdWVzdFF1ZXVlOiBhbnkgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSAkaHR0cDogQWJzdHJhY3RIdHRwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXJTZXJ2aWNlOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb25cbiAgICApIHt9XG5cbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cblxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cblxuICAgIGxvYWQoZm9yY2VGbGFnPzogYm9vbGVhbikge1xuICAgICAgICBpZih0aGlzLmxvYWRQcm9taXNlKSB7cmV0dXJuIHRoaXMubG9hZFByb21pc2U7fVxuICAgICAgICBpZiAoIWZvcmNlRmxhZyAmJiB0aGlzLmNvbmZpZykge3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5jb25maWcpO31cbiAgICAgICAgdGhpcy5sb2FkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLnNlbmQoeyd1cmwnOiAnLi9zZXJ2aWNlcy9zZWN1cml0eS9pbmZvJywgJ21ldGhvZCc6ICdHRVQnfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcgPSByZXNwb25zZS5ib2R5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RMb2dnZWRJblVzZXIgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5sb2dnZWRJblVzZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZEluVXNlciA9IHRoaXMuY29uZmlnLnVzZXJJbmZvO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpPT57XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRzIHRoZSBzZWN1cml0eSBjb25maWcgZnJvbSB0aGUgZGVwbG95ZWQgYXBwIChiYWNrZW5kIGNhbGwpXG4gICAgICogQHBhcmFtIHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0gZXJyb3JcbiAgICAgKi9cbiAgICBnZXRXZWJDb25maWcoc3VjY2VzcywgZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KCkpIHtcbiAgICAgICAgICAgIC8vIGlmIGFscmVhZHkgZmV0Y2hlZCwgcmV0dXJuIGl0XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2VzcywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkKClcbiAgICAgICAgICAgIC50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MsIGNvbmZpZyk7XG4gICAgICAgICAgICB9LCBlcnJvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzZWN1cml0eSBjb25maWdcbiAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrXG4gICAgICogQHBhcmFtIGZhaWx1cmVDYWxsYmFja1xuICAgICAqL1xuICAgIGdldENvbmZpZyhzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICBmdW5jdGlvbiBpbnZva2VRdWV1ZWRDYWxsYmFja3MoaWQsIG1ldGhvZCwgZGF0YSkge1xuICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnJlcXVlc3RRdWV1ZVtpZF0sIGZuID0+IHRyaWdnZXJGbihmblttZXRob2RdLCBkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZVtpZF0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLmhvbWVQYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy51c2VySW5mbykge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tlbmQgcmV0dXJucyBsYW5kaW5nUGFnZSBpbnN0ZWFkIG9mIGhvbWVQYWdlLCBoZW5jZSB0aGlzIHN0YXRlbWVudChmb3IgY29uc2lzdGVuY3kpXG4gICAgICAgICAgICAgICAgLy8gY29uZmlnLnVzZXJJbmZvLmhvbWVQYWdlID0gY29uZmlnLnVzZXJJbmZvLmxhbmRpbmdQYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmxhc3RMb2dnZWRJblVzZXIgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5sb2dnZWRJblVzZXIpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSBjb25maWcudXNlckluZm87XG4gICAgICAgICAgICBpbnZva2VRdWV1ZWRDYWxsYmFja3MuY2FsbCh0aGlzLCAnY29uZmlnJywgJ3N1Y2Nlc3MnLCB0aGlzLmdldCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgICAgIC8qaWYgKCRyb290U2NvcGUuaXNNb2JpbGVBcHBsaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgICAnc2VjdXJpdHlFbmFibGVkJzogZmFsc2UsXG4gICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZWQnOiBmYWxzZSxcbiAgICAgICAgICAgICAnaG9tZVBhZ2UnOiBfV01fQVBQX1BST1BFUlRJRVMuaG9tZVBhZ2UsXG4gICAgICAgICAgICAgJ3VzZXJJbmZvJzogbnVsbCxcbiAgICAgICAgICAgICAnbG9naW4nOiBudWxsXG4gICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICBpbnZva2VRdWV1ZWRDYWxsYmFja3MoJ2NvbmZpZycsICdzdWNjZXNzJywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICAgfSBlbHNlIHsqL1xuICAgICAgICAgICAgaW52b2tlUXVldWVkQ2FsbGJhY2tzLmNhbGwodGhpcywgJ2NvbmZpZycsICdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdldCgpKSB7XG4gICAgICAgICAgICAvLyBpZiBhbHJlYWR5IGZldGNoZWQsIHJldHVybiBpdFxuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWV1ZSBjaGVjaywgaWYgc2FtZSBxdWV1ZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBkbyBub3Qgc2VuZCBhbm90aGVyIHJlcXVlc3RcbiAgICAgICAgdGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnID0gdGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnIHx8IFtdO1xuICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZS5jb25maWcucHVzaCh7XG4gICAgICAgICAgICBzdWNjZXNzOiBzdWNjZXNzQ2FsbGJhY2ssXG4gICAgICAgICAgICBlcnJvcjogZmFpbHVyZUNhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICAvLyBmb3Igd2ViIHByb2plY3QsIHJldHVybiBjb25maWcgcmV0dXJuZWQgZnJvbSBiYWNrZW5kIEFQSSBjYWxsLlxuICAgICAgICAgICAgdGhpcy5nZXRXZWJDb25maWcob25TdWNjZXNzLmJpbmQodGhpcyksIG9uRXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZWxzZSB7XG4gICAgICAgICAvISpcbiAgICAgICAgICogZm9yIG1vYmlsZSBhcHAsIGZpcnN0IGdldCB0aGUgbW9iaWxlIGNvbmZpZyAoc2F2ZWQgaW4gdGhlIGFwaylcbiAgICAgICAgICogLSBpZiBzZWN1cml0eSBub3QgZW5hYmxlZCwganVzdCByZXR1cm4gbW9iaWxlIGNvbmZpZyAobm8gYmFja2VuZCBjYWxsIHJlcXVpcmVkKVxuICAgICAgICAgKiAtIGVsc2UsIGdldCBXZWIgY29uZmlnICh3aWxsIGJlICB0aGUgc2FtZSBBUEkgaGl0IGZvciBsb2dpbikgYW5kIG1lcmdlIHRoZSBjb25maWcgd2l0aCBfbW9iaWxlY29uZmlnXG4gICAgICAgICAqIS9cbiAgICAgICAgIGdldE1vYmlsZUNvbmZpZyhmdW5jdGlvbiAobW9iaWxlY29uZmlnKSB7XG4gICAgICAgICBpZiAoIW1vYmlsZWNvbmZpZy5zZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgIG9uU3VjY2Vzcyhtb2JpbGVjb25maWcpO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGdldFdlYkNvbmZpZyhmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICBjb25maWcgPSBtZXJnZVdlYkFuZE1vYmlsZUNvbmZpZyhjb25maWcpO1xuICAgICAgICAgb25TdWNjZXNzKGNvbmZpZyk7XG4gICAgICAgICB9LCBmdW5jdGlvbiAoKSB7b25TdWNjZXNzKG1vYmlsZWNvbmZpZyk7IH0pO1xuICAgICAgICAgfVxuICAgICAgICAgfSwgb25FcnJvcik7XG4gICAgICAgICB9Ki9cbiAgICB9XG5cbiAgICBnZXRMYXN0TG9nZ2VkSW5Vc2VybmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdExvZ2dlZEluVXNlciAmJiB0aGlzLmxhc3RMb2dnZWRJblVzZXIudXNlck5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIG5hbWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRSb3V0ZVBhZ2UoKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLl9sb2NhdGlvbi5wYXRoKCk7XG4gICAgICAgIGxldCBsSW5kZXggPSBwLmluZGV4T2YoJz8nKTtcbiAgICAgICAgbEluZGV4ID0gbEluZGV4ID09PSAtMSA/IHAubGVuZ3RoIDogbEluZGV4IC0gMTtcbiAgICAgICAgcmV0dXJuIHAuc3Vic3RyKDEsIGxJbmRleCk7IC8vIGlnbm9yZSB0aGUgcXVlcnkgcGFyYW1zXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBRdWVyeSBwYXJhbXMgZm9yIHNwZWNpZmllZCBwYXJhbSBuYW1lIGluIGN1cnJlbnQgUm91dGVcbiAgICAgKiBAcGFyYW0gcGFyYW1OYW1lLCB0aGUgcGFyYW0gbmFtZSB3aG9zZSBxdWVyeSBwYXJhbSB2YWx1ZSBpcyB0byBiZSByZXRyaWV2ZWRcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRSb3V0ZVF1ZXJ5UGFyYW0ocGFyYW1OYW1lKSB7XG4gICAgICAgIGxldCBwYXJhbVZhbDtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgICAgIHBhcmFtVmFsID0gcGFyYW1zW3BhcmFtTmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyYW1WYWw7XG4gICAgfVxuXG4gICAgaXNOb1BhZ2VMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiAhaXNFbXB0eSh0aGlzLmdldEN1cnJlbnRSb3V0ZVBhZ2UoKSk7XG4gICAgfVxuXG4gICAgZ2V0UGFnZUJ5TG9nZ2VkSW5Vc2VyKCkge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGFnZTtcbiAgICAgICAgICAgIGlmICghaXNBcHBsaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5pc05vUGFnZUxvYWRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGF0LmdldENvbmZpZygoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc2VjdXJpdHlFbmFibGVkICYmIGNvbmZpZy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gY29uZmlnLnVzZXJJbmZvLmxhbmRpbmdQYWdlIHx8IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHhzcmYgY29va2llIG5hbWUgYW5kIHhzcmYgaGVhZGVyIG5hbWVzIHdpdGggV2F2ZU1ha2VyIHNwZWNpZmljIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy4kaHR0cC5kZWZhdWx0cy54c3JmQ29va2llTmFtZSA9IFhTUkZfQ09PS0lFO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJGh0dHAuZGVmYXVsdHMueHNyZkhlYWRlck5hbWUgPSBjb25maWcuY3NyZkhlYWRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBBcHAgcGFnZSBhcyBmb2xsb3dzOlxuICAgICAqIFNlY3VyaXR5IGRpc2FibGVkOlxuICAgICAqICAgICAgLSBIb21lIHBhZ2VcbiAgICAgKiBTZWN1cml0eSBlbmFibGVkOlxuICAgICAqICAgICAgLSBVc2VyIGlzIGxvZ2dlZCBpbiwgcmVzcGVjdGl2ZSBsYW5kaW5nIHBhZ2UgaXMgbG9hZGVkXG4gICAgICogICAgICAtIE5vdCBsb2dnZWQgaW46XG4gICAgICogICAgICAgICAgLSBIb21lIHBhZ2UgaXMgcHVibGljLCBsb2FkcyB0aGUgaG9tZSBwYWdlXG4gICAgICogICAgICAgICAgLSBIb21lIHBhZ2Ugbm90IHB1YmxpYywgTG9naW4gcGFnZShpbiBjb25maWcpIGlzIGxvYWRlZFxuICAgICAqIEBwYXJhbSBmb3JjZVBhZ2VMb2FkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8VD59XG4gICAgICovXG4gICAgbG9hZFBhZ2VCeVVzZXJSb2xlKGZvcmNlUGFnZUxvYWQ/KSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlMb2dnZWRJblVzZXIoKS50aGVuKHBhZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKHRoYXQuaXNOb1BhZ2VMb2FkZWQoKSB8fCBmb3JjZVBhZ2VMb2FkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwYWdlIHdoZW4gY3VycmVudCBwYWdlIGFuZCBwb3N0IGxvZ2luIGxhbmRpbmcgcGFnZSBhcmUgc2FtZVxuICAgICAgICAgICAgICAgIGlmICh0aGF0LmdldEN1cnJlbnRSb3V0ZVBhZ2UoKSA9PT0gcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAod2luZG93LmxvY2F0aW9uIGFzIGFueSkucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5yb3V0ZXJTZXJ2aWNlLm5hdmlnYXRlKFtgLyR7cGFnZX1gXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWVQYWdlIGJhc2VkIG9uIHRoZSBjb25maWcgaW4gU2VjdXJpdHlTZXJ2aWNlXG4gICAgICogQXNzdW1wdGlvbiBpcyB0aGUgU2VjdXJpdHlTZXJ2aWNlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHNlY3VyaXR5IGNvbmZpZyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gdGhpcyBmdW5jdGlvblxuICAgICAqL1xuICAgIG5hdmlnYXRlT25Mb2dpbigpIHtcbiAgICAgICAgdGhpcy5sb2FkUGFnZUJ5VXNlclJvbGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFnZSB3aGljaCBuZWVkcyB0byBiZSByZWRpcmVjdGVkIHRvIG9uIHN1Y2Nlc3NmdWwgbG9naW5cbiAgICAgKiBAcGFyYW0gY29uZmlnLFxuICAgICAqIEBwYXJhbSBwYWdlLCBwYWdlIG5hbWUgZm9yIHJlZGlyZWN0aW9uXG4gICAgICogQHJldHVybnMge2FueXxzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UmVkaXJlY3RQYWdlKGNvbmZpZywgcGFnZT8pIHtcbiAgICAgICAgY29uc3QgaG9tZVBhZ2UgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2UsXG4gICAgICAgICAgICBsb2dpblBhZ2UgPSBnZXQoY29uZmlnLCAnbG9naW5Db25maWcucGFnZU5hbWUnKTtcbiAgICAgICAgbGV0IHByZXZSZWRpcmVjdFBhZ2UsXG4gICAgICAgICAgICByZWRpcmVjdFBhZ2UgPSBwYWdlIHx8IHRoaXMuZ2V0Q3VycmVudFJvdXRlUGFnZSgpO1xuXG4gICAgICAgIC8vIGlmIHVzZXIgaXMgYWxyZWFkeSBvbiBIb21lIHBhZ2Ugb3IgTG9naW4gcGFnZSwgdGhleSBzaG91bGQgbm90IGJlIHJlZGlyZWN0ZWQgdG8gdGhhdCBwYWdlLCBoZW5jZSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIGlmIChyZWRpcmVjdFBhZ2UgPT09IGhvbWVQYWdlIHx8IHJlZGlyZWN0UGFnZSA9PT0gbG9naW5QYWdlKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogZmluZCBwcmV2aW91cyByZWRpcmVjdCBwYWdlIGZyb20gVVJMLCBpZiBleGlzdHMsIHVzZXIgc2hvdWxkIHJlZGlyZWN0IHRvIHRoYXQgcGFnZS5cbiAgICAgICAgICAgICAqIFVTRSBDQVNFOlxuICAgICAgICAgICAgICogIHVzZXIgaXMgb24gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwcC8jL0xvZ2luP3JlZGlyZWN0VG89cGFnZVxuICAgICAgICAgICAgICogIGEgdmFyaWFibGUgY2FsbCBmYWlscyByZXN1bHRpbmcgNDAxXG4gICAgICAgICAgICAgKiAgaW4gdGhpcyBjYXNlLCByZWRpcmVjdFRvIHBhZ2Ugc2hvdWxkIGJlICdwYWdlJyBhbmQgbm90IHVuZGVmaW5lZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBwcmV2UmVkaXJlY3RQYWdlID0gdGhpcy5nZXRDdXJyZW50Um91dGVRdWVyeVBhcmFtKCdyZWRpcmVjdFRvJyk7XG4gICAgICAgICAgICByZWRpcmVjdFBhZ2UgPSAhaXNFbXB0eShwcmV2UmVkaXJlY3RQYWdlKSA/IHByZXZSZWRpcmVjdFBhZ2UgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVkaXJlY3RQYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHRoZSBxdWVyeSBwYXJhbXMoaW5jbHVkaW5nIHBhZ2UgcGFyYW1zIGFuZCByZWRpcmVjdCB0byBwYXJhbXMpIGFzc29jaWF0ZWQgd2l0aCByZWRpcmVjdGVkIHBhZ2VcbiAgICAgKi9cbiAgICBnZXRSZWRpcmVjdGVkUm91dGVRdWVyeVBhcmFtcygpIHtcbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0ge307XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbVZhbCkgPT4ge1xuICAgICAgICAgICAgZm9yRWFjaChwYXJhbVZhbCwgKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xuICAgIH1cblxuICAgIC8vIGFjY2VwdHMgcXVlcnkgb2JqZWN0IGxpa2Uge2E6MSwgYjoyfSBhbmQgcmV0dXJucyBhPTEmYj0yIHN0cmluZ1xuICAgIGdldFF1ZXJ5U3RyaW5nKHF1ZXJ5T2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgICAgICBmb3JFYWNoKHF1ZXJ5T2JqZWN0LCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcGFyYW1zLnB1c2goa2V5ICsgJz0nICsgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGpvaW4ocGFyYW1zLCAnJicpO1xuICAgIH1cblxuICAgIGFwcExvZ2luKHBhcmFtcywgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHBheWxvYWQgPSAnJztcblxuICAgICAgICAvLyBlbmNvZGUgYWxsIHBhcmFtZXRlcnNcbiAgICAgICAgZWFjaChwYXJhbXMsIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICAgICAgcGF5bG9hZCArPSAocGF5bG9hZCA/ICcmJyA6ICcnKSArIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiRodHRwLnNlbmQoe1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXJsOiAnal9zcHJpbmdfc2VjdXJpdHlfY2hlY2snLFxuICAgICAgICAgICAgJ2RhdGEnOiBwYXlsb2FkXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4c3JmQ29va2llVmFsdWUgPSByZXNwb25zZS5ib2R5ID8gcmVzcG9uc2UuYm9keVtYU1JGX0NPT0tJRV9OQU1FXSA6ICcnO1xuXG4gICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCB4c3JmIGNvb2tpZSBuYW1lIGFuZCB4c3JmIGhlYWRlciBuYW1lcyB3aXRoIFdhdmVNYWtlciBzcGVjaWZpYyB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh4c3JmQ29va2llVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFhTUkZfQ09PS0lFX05BTUUsIHhzcmZDb29raWVWYWx1ZSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgbG9naW4gaW4gZGV2aWNlLCB0aGlzIGZ1bmN0aW9uIHRyaWdnZXJzIHRoZSBwZW5kaW5nIG9uTG9naW5DYWxsYmFja3MuXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLmdldChBcHApLm5vdGlmeSgndXNlckxvZ2dlZEluJywge30pO1xuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgcmVzcG9uc2UpO1xuICAgICAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIGluIHRoZSBSVU4gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3NDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gc3VjY2Vzc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZhaWx1cmVDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gZmFpbHVyZVxuICAgICAqL1xuICAgIGlzQXV0aGVudGljYXRlZChzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldENvbmZpZyhmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzc0NhbGxiYWNrLCBjb25maWcuYXV0aGVudGljYXRlZCk7XG4gICAgICAgIH0sIGZhaWx1cmVDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBpcyB1c2VkIHRvIGxvZ291dCBvZiB0aGUgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VjY2Vzc0NhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBzdWNjZXNzXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZmFpbHVyZUNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBmYWlsdXJlXG4gICAgICovXG4gICAgYXBwTG9nb3V0KHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRodHRwLnNlbmQoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnU2VjdXJpdHknLFxuICAgICAgICAgICAgdXJsOiAnal9zcHJpbmdfc2VjdXJpdHlfbG9nb3V0JyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgICAgICBieVBhc3NSZXN1bHQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHNldCh0aGlzLmdldCgpLCAnYXV0aGVudGljYXRlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIHNldCh0aGlzLmdldCgpLCAndXNlckluZm8nLCBudWxsKTtcbiAgICAgICAgICAgIC8qaWYgKENPTlNUQU5UUy5oYXNDb3Jkb3ZhKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ09OU1RBTlRTLlhTUkZfQ09PS0lFX05BTUUsICcnKTtcbiAgICAgICAgICAgIH0qL1xuICAgICAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQXBwKS5ub3RpZnkoJ3VzZXJMb2dnZWRPdXQnLCB7fSk7XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzc0NhbGxiYWNrLCByZXNwb25zZSk7XG4gICAgICAgIH0sIGZhaWx1cmVDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGFuZCByZXR1cm4gdGhlIGNvb2tpZVxuICAgICAqIEBwYXJhbSBuYW1lLCBjb29raWUga2V5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDb29raWVCeU5hbWUobmFtZSkge1xuICAgICAgICAvLyBUb2RvOiBTaHViaGFtIEltcGxlbWVudCBjb29raWUgbmF0aXZlIGpzXG4gICAgICAgIHJldHVybiAnY29va2llJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvb2tpZVZhbHVlIGlmIHhzcmYgaXMgZW5hYmxlZC5cbiAgICAgKiBJbiBkZXZpY2UsIHhzcmYgY29va2llIGlzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gICAgICogQHJldHVybnMgeHNyZiBjb29raWUgdmFsdWVcbiAgICAgKi9cbiAgICBpc1hzcmZFbmFibGVkKCkge1xuICAgICAgICBpZiAoaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oWFNSRl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29va2llQnlOYW1lKFhTUkZfQ09PS0lFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UuIFByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBzZWN1cml0eSBpc1xuICAgICAqIDEuIGRpc2FibGVkXG4gICAgICogMi4gZW5hYmxlZCBhbmQgdXNlciBpcyBhdXRoZW50aWNhdGVkXG4gICAgICogMy4gZW5hYmxlZCBhbmQgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCwgdGhlbiBwcm9taXNlIGlzIHJlc29sdmVkIG9uIHVzZXIgbG9naW5cbiAgICAgKiBAcmV0dXJucyB7Kn0gcHJvbWlzZVxuICAgICAqL1xuICAgIHB1YmxpYyBvblVzZXJMb2dpbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRDb25maWcoY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnNlY3VyaXR5RW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwKS5zdWJzY3JpYmUoJ3VzZXJMb2dnZWRJbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggbG9nZ2VkLWluLXVzZXJcbiAgICAgKi9cbiAgICBnZXRMb2dnZWRJblVzZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29uZmlnKChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy51c2VySW5mbykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZy51c2VySW5mbyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBmb3IgbW9iaWxlIGFwcHMgdG8gYXV0aGVudGljYXRlIHZpYSBicm93c2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgYWZ0ZXIgbG9naW5cbiAgICAgKi9cbiAgICBhdXRoSW5Ccm93c2VyKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnVGhpcyBhdXRoSW5Ccm93c2VyIHNob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfVxufVxuIl19
@@ -4,6 +4,7 @@ import * as i3 from '@angular/common';
4
4
  import * as i2 from '@angular/router';
5
5
  import * as i1 from '@wm/core';
6
6
  import { getClonedObject, triggerFn, getWmProjectProperties, hasCordova, App } from '@wm/core';
7
+ import { forEach, isEmpty, get, join, each, set } from 'lodash-es';
7
8
 
8
9
  // Todo[Shubham]: Move below constants to a common file
9
10
  const XSRF_COOKIE_NAME = 'wm_xsrf_token', isApplicationType = true;
@@ -66,7 +67,7 @@ class SecurityService {
66
67
  */
67
68
  getConfig(successCallback, failureCallback) {
68
69
  function invokeQueuedCallbacks(id, method, data) {
69
- _.forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));
70
+ forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));
70
71
  this.requestQueue[id] = null;
71
72
  }
72
73
  function onSuccess(config) {
@@ -156,7 +157,7 @@ class SecurityService {
156
157
  return paramVal;
157
158
  }
158
159
  isNoPageLoaded() {
159
- return !_.isEmpty(this.getCurrentRoutePage());
160
+ return !isEmpty(this.getCurrentRoutePage());
160
161
  }
161
162
  getPageByLoggedInUser() {
162
163
  const that = this;
@@ -228,7 +229,7 @@ class SecurityService {
228
229
  * @returns {any|string}
229
230
  */
230
231
  getRedirectPage(config, page) {
231
- const homePage = getWmProjectProperties().homePage, loginPage = _.get(config, 'loginConfig.pageName');
232
+ const homePage = getWmProjectProperties().homePage, loginPage = get(config, 'loginConfig.pageName');
232
233
  let prevRedirectPage, redirectPage = page || this.getCurrentRoutePage();
233
234
  // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined
234
235
  if (redirectPage === homePage || redirectPage === loginPage) {
@@ -240,7 +241,7 @@ class SecurityService {
240
241
  * in this case, redirectTo page should be 'page' and not undefined
241
242
  */
242
243
  prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');
243
- redirectPage = !_.isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;
244
+ redirectPage = !isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;
244
245
  }
245
246
  return redirectPage;
246
247
  }
@@ -250,7 +251,7 @@ class SecurityService {
250
251
  getRedirectedRouteQueryParams() {
251
252
  let queryParams = {};
252
253
  this.activatedRoute.queryParams.subscribe((paramVal) => {
253
- _.forEach(paramVal, (val, key) => {
254
+ forEach(paramVal, (val, key) => {
254
255
  queryParams[key] = val;
255
256
  });
256
257
  });
@@ -259,15 +260,15 @@ class SecurityService {
259
260
  // accepts query object like {a:1, b:2} and returns a=1&b=2 string
260
261
  getQueryString(queryObject) {
261
262
  const params = [];
262
- _.forEach(queryObject, function (value, key) {
263
+ forEach(queryObject, function (value, key) {
263
264
  params.push(key + '=' + value);
264
265
  });
265
- return _.join(params, '&');
266
+ return join(params, '&');
266
267
  }
267
268
  appLogin(params, successCallback, failureCallback) {
268
269
  let payload = '';
269
270
  // encode all parameters
270
- _.each(params, function (value, name) {
271
+ each(params, function (value, name) {
271
272
  payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);
272
273
  });
273
274
  return this.$http.send({
@@ -315,8 +316,8 @@ class SecurityService {
315
316
  responseType: 'text',
316
317
  byPassResult: true
317
318
  }).then((response) => {
318
- _.set(this.get(), 'authenticated', false);
319
- _.set(this.get(), 'userInfo', null);
319
+ set(this.get(), 'authenticated', false);
320
+ set(this.get(), 'userInfo', null);
320
321
  /*if (CONSTANTS.hasCordova) {
321
322
  localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');
322
323
  }*/
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../projects/security/src/security.service.ts","../../../projects/security/src/security.module.ts","../../../projects/security/src/index.ts"],"sourcesContent":["import { Injectable, Injector } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport {\n AbstractHttpService,\n App,\n getClonedObject,\n getWmProjectProperties,\n hasCordova,\n triggerFn\n} from '@wm/core';\n\ndeclare const _;\n\n// Todo[Shubham]: Move below constants to a common file\nconst XSRF_COOKIE_NAME = 'wm_xsrf_token',\n isApplicationType = true;\n\n@Injectable()\nexport class SecurityService {\n config;\n lastLoggedInUser;\n loggedInUser;\n loadPromise: Promise<any>;\n requestQueue: any = {};\n\n constructor(\n private injector: Injector,\n private $http: AbstractHttpService,\n private routerService: Router,\n private activatedRoute: ActivatedRoute,\n private _location: Location\n ) {}\n\n isLoaded() {\n return this.config;\n }\n\n get() {\n return this.config;\n }\n\n load(forceFlag?: boolean) {\n if(this.loadPromise) {return this.loadPromise;}\n if (!forceFlag && this.config) {return Promise.resolve(this.config);}\n this.loadPromise = new Promise((resolve, reject) => {\n this.$http.send({'url': './services/security/info', 'method': 'GET'}).then((response) => {\n this.config = response.body;\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = this.config.userInfo;\n resolve(response.body);\n }).catch((err)=>{\n reject(err);\n }).finally(()=>{\n this.loadPromise = null;\n });\n });\n return this.loadPromise;\n }\n\n /**\n * gets the security config from the deployed app (backend call)\n * @param success\n * @param error\n */\n getWebConfig(success, error) {\n if (this.get()) {\n // if already fetched, return it\n triggerFn(success, this.get());\n return;\n }\n this.load()\n .then(config => {\n triggerFn(success, config);\n }, error);\n }\n\n /**\n * Returns security config\n * @param successCallback\n * @param failureCallback\n */\n getConfig(successCallback, failureCallback) {\n function invokeQueuedCallbacks(id, method, data) {\n _.forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));\n this.requestQueue[id] = null;\n }\n\n function onSuccess(config) {\n config.homePage = getWmProjectProperties().homePage;\n if (config.userInfo) {\n // Backend returns landingPage instead of homePage, hence this statement(for consistency)\n // config.userInfo.homePage = config.userInfo.landingPage;\n }\n this.config = config;\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = config.userInfo;\n invokeQueuedCallbacks.call(this, 'config', 'success', this.get());\n }\n\n function onError(error) {\n /*if ($rootScope.isMobileApplicationType) {\n this.config = {\n 'securityEnabled': false,\n 'authenticated': false,\n 'homePage': _WM_APP_PROPERTIES.homePage,\n 'userInfo': null,\n 'login': null\n };\n invokeQueuedCallbacks('config', 'success', this.get());\n } else {*/\n invokeQueuedCallbacks.call(this, 'config', 'error', error);\n // }\n }\n\n if (this.get()) {\n // if already fetched, return it\n triggerFn(successCallback, this.get());\n return;\n }\n\n // Queue check, if same queue is already in progress, do not send another request\n this.requestQueue.config = this.requestQueue.config || [];\n this.requestQueue.config.push({\n success: successCallback,\n error: failureCallback\n });\n if (this.requestQueue.config.length > 1) {\n return;\n }\n\n if (!hasCordova()) {\n // for web project, return config returned from backend API call.\n this.getWebConfig(onSuccess.bind(this), onError.bind(this));\n }\n /* else {\n /!*\n * for mobile app, first get the mobile config (saved in the apk)\n * - if security not enabled, just return mobile config (no backend call required)\n * - else, get Web config (will be the same API hit for login) and merge the config with _mobileconfig\n *!/\n getMobileConfig(function (mobileconfig) {\n if (!mobileconfig.securityEnabled) {\n onSuccess(mobileconfig);\n } else {\n getWebConfig(function (config) {\n config = mergeWebAndMobileConfig(config);\n onSuccess(config);\n }, function () {onSuccess(mobileconfig); });\n }\n }, onError);\n }*/\n }\n\n getLastLoggedInUsername() {\n return this.lastLoggedInUser && this.lastLoggedInUser.userName;\n }\n\n /**\n * Returns the current page name\n * @returns {string}\n */\n getCurrentRoutePage() {\n const p = this._location.path();\n let lIndex = p.indexOf('?');\n lIndex = lIndex === -1 ? p.length : lIndex - 1;\n return p.substr(1, lIndex); // ignore the query params\n }\n\n /**\n * Returns Query params for specified param name in current Route\n * @param paramName, the param name whose query param value is to be retrieved\n * @returns {any}\n */\n getCurrentRouteQueryParam(paramName) {\n let paramVal;\n this.activatedRoute.queryParams.subscribe(params => {\n paramVal = params[paramName];\n });\n return paramVal;\n }\n\n isNoPageLoaded() {\n return !_.isEmpty(this.getCurrentRoutePage());\n }\n\n getPageByLoggedInUser() {\n const that = this;\n return new Promise((resolve) => {\n let page;\n if (!isApplicationType) {\n if (that.isNoPageLoaded()) {\n page = getWmProjectProperties().homePage;\n resolve(page);\n }\n } else {\n that.getConfig((config) => {\n if (config.securityEnabled && config.authenticated) {\n page = config.userInfo.landingPage || getWmProjectProperties().homePage;\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (that.isXsrfEnabled()) {\n // this.$http.defaults.xsrfCookieName = XSRF_COOKIE;\n // this.$http.defaults.xsrfHeaderName = config.csrfHeaderName;\n }\n } else {\n page = getWmProjectProperties().homePage;\n }\n resolve(page);\n }, function () {\n resolve(getWmProjectProperties().homePage);\n });\n }\n });\n }\n\n /**\n * Loads the App page as follows:\n * Security disabled:\n * - Home page\n * Security enabled:\n * - User is logged in, respective landing page is loaded\n * - Not logged in:\n * - Home page is public, loads the home page\n * - Home page not public, Login page(in config) is loaded\n * @param forcePageLoad\n * @returns {Promise<T>}\n */\n loadPageByUserRole(forcePageLoad?) {\n const that = this;\n return this.getPageByLoggedInUser().then(page => {\n if (that.isNoPageLoaded() || forcePageLoad) {\n // Reload the page when current page and post login landing page are same\n if (that.getCurrentRoutePage() === page) {\n (window.location as any).reload();\n } else {\n that.routerService.navigate([`/${page}`]);\n }\n }\n });\n }\n\n /**\n * Navigates to the current user's homePage based on the config in SecurityService\n * Assumption is the SecurityService is updated with the latest security config before making call to this function\n */\n navigateOnLogin() {\n this.loadPageByUserRole(true);\n }\n\n /**\n * Gets the page which needs to be redirected to on successful login\n * @param config,\n * @param page, page name for redirection\n * @returns {any|string}\n */\n getRedirectPage(config, page?) {\n const homePage = getWmProjectProperties().homePage,\n loginPage = _.get(config, 'loginConfig.pageName');\n let prevRedirectPage,\n redirectPage = page || this.getCurrentRoutePage();\n\n // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined\n if (redirectPage === homePage || redirectPage === loginPage) {\n /*\n * find previous redirect page from URL, if exists, user should redirect to that page.\n * USE CASE:\n * user is on http://localhost:8080/app/#/Login?redirectTo=page\n * a variable call fails resulting 401\n * in this case, redirectTo page should be 'page' and not undefined\n */\n prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');\n redirectPage = !_.isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;\n }\n\n return redirectPage;\n }\n\n /**\n * Returns all the query params(including page params and redirect to params) associated with redirected page\n */\n getRedirectedRouteQueryParams() {\n let queryParams = {};\n this.activatedRoute.queryParams.subscribe((paramVal) => {\n _.forEach(paramVal, (val, key) => {\n queryParams[key] = val;\n });\n });\n return queryParams;\n }\n\n // accepts query object like {a:1, b:2} and returns a=1&b=2 string\n getQueryString(queryObject) {\n const params = [];\n _.forEach(queryObject, function (value, key) {\n params.push(key + '=' + value);\n });\n return _.join(params, '&');\n }\n\n appLogin(params, successCallback, failureCallback) {\n let payload = '';\n\n // encode all parameters\n _.each(params, function (value, name) {\n payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);\n });\n\n return this.$http.send({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n url: 'j_spring_security_check',\n 'data': payload\n }).then((response) => {\n const xsrfCookieValue = response.body ? response.body[XSRF_COOKIE_NAME] : '';\n\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (xsrfCookieValue) {\n if (hasCordova()) {\n localStorage.setItem(XSRF_COOKIE_NAME, xsrfCookieValue || '');\n }\n }\n // After the successful login in device, this function triggers the pending onLoginCallbacks.\n this.injector.get(App).notify('userLoggedIn', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * The API is used to check if the user is authenticated in the RUN mode.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n isAuthenticated(successCallback, failureCallback) {\n this.getConfig(function (config) {\n triggerFn(successCallback, config.authenticated);\n }, failureCallback);\n }\n\n /**\n * The API is used to logout of the app.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n appLogout(successCallback, failureCallback) {\n return this.$http.send({\n target: 'Security',\n url: 'j_spring_security_logout',\n method: 'POST',\n responseType: 'text',\n byPassResult: true\n }).then((response) => {\n _.set(this.get(), 'authenticated', false);\n _.set(this.get(), 'userInfo', null);\n /*if (CONSTANTS.hasCordova) {\n localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');\n }*/\n this.injector.get(App).notify('userLoggedOut', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * Checks and return the cookie\n * @param name, cookie key\n * @returns {string}\n */\n getCookieByName(name) {\n // Todo: Shubham Implement cookie native js\n return 'cookie';\n }\n\n /**\n * This function returns the cookieValue if xsrf is enabled.\n * In device, xsrf cookie is stored in localStorage.\n * @returns xsrf cookie value\n */\n isXsrfEnabled() {\n if (hasCordova()) {\n return localStorage.getItem(XSRF_COOKIE_NAME);\n }\n return this.getCookieByName(XSRF_COOKIE_NAME);\n }\n\n /**\n * This function returns a promise. Promise is resolved when security is\n * 1. disabled\n * 2. enabled and user is authenticated\n * 3. enabled and user is not authenticated, then promise is resolved on user login\n * @returns {*} promise\n */\n public onUserLogin(): Promise<any> {\n return new Promise<void>((resolve, reject) => {\n this.getConfig(config => {\n if (config.securityEnabled) {\n if (config.authenticated) {\n resolve();\n } else {\n const unsubscribe = this.injector.get(App).subscribe('userLoggedIn', () => {\n resolve();\n unsubscribe();\n });\n }\n } else {\n resolve();\n }\n }, reject);\n });\n }\n\n /**\n * @returns a promise that is resolved with logged-in-user\n */\n getLoggedInUser() {\n return new Promise<any>((resolve, reject) => {\n this.getConfig((config) => {\n if (config && config.userInfo) {\n resolve(config.userInfo);\n } else {\n reject();\n }\n }, reject);\n });\n }\n\n /**\n * This is for mobile apps to authenticate via browser.\n *\n * @returns a promise that is resolved after login\n */\n authInBrowser(): Promise<any> {\n return Promise.reject('This authInBrowser should not be called');\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { SecurityService } from './security.service';\n\n@NgModule({})\nexport class SecurityModule {\n static forRoot(): ModuleWithProviders<SecurityModule> {\n return {\n ngModule: SecurityModule,\n providers: [SecurityService]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../projects/security/src/security.service.ts","../../../projects/security/src/security.module.ts","../../../projects/security/src/index.ts"],"sourcesContent":["import { Injectable, Injector } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport {\n AbstractHttpService,\n App,\n getClonedObject,\n getWmProjectProperties,\n hasCordova,\n triggerFn\n} from '@wm/core';\nimport {each, forEach, get, isEmpty, join, set} from \"lodash-es\";\n\n// Todo[Shubham]: Move below constants to a common file\nconst XSRF_COOKIE_NAME = 'wm_xsrf_token',\n isApplicationType = true;\n\n@Injectable()\nexport class SecurityService {\n config;\n lastLoggedInUser;\n loggedInUser;\n loadPromise: Promise<any>;\n requestQueue: any = {};\n\n constructor(\n private injector: Injector,\n private $http: AbstractHttpService,\n private routerService: Router,\n private activatedRoute: ActivatedRoute,\n private _location: Location\n ) {}\n\n isLoaded() {\n return this.config;\n }\n\n get() {\n return this.config;\n }\n\n load(forceFlag?: boolean) {\n if(this.loadPromise) {return this.loadPromise;}\n if (!forceFlag && this.config) {return Promise.resolve(this.config);}\n this.loadPromise = new Promise((resolve, reject) => {\n this.$http.send({'url': './services/security/info', 'method': 'GET'}).then((response) => {\n this.config = response.body;\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = this.config.userInfo;\n resolve(response.body);\n }).catch((err)=>{\n reject(err);\n }).finally(()=>{\n this.loadPromise = null;\n });\n });\n return this.loadPromise;\n }\n\n /**\n * gets the security config from the deployed app (backend call)\n * @param success\n * @param error\n */\n getWebConfig(success, error) {\n if (this.get()) {\n // if already fetched, return it\n triggerFn(success, this.get());\n return;\n }\n this.load()\n .then(config => {\n triggerFn(success, config);\n }, error);\n }\n\n /**\n * Returns security config\n * @param successCallback\n * @param failureCallback\n */\n getConfig(successCallback, failureCallback) {\n function invokeQueuedCallbacks(id, method, data) {\n forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));\n this.requestQueue[id] = null;\n }\n\n function onSuccess(config) {\n config.homePage = getWmProjectProperties().homePage;\n if (config.userInfo) {\n // Backend returns landingPage instead of homePage, hence this statement(for consistency)\n // config.userInfo.homePage = config.userInfo.landingPage;\n }\n this.config = config;\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = config.userInfo;\n invokeQueuedCallbacks.call(this, 'config', 'success', this.get());\n }\n\n function onError(error) {\n /*if ($rootScope.isMobileApplicationType) {\n this.config = {\n 'securityEnabled': false,\n 'authenticated': false,\n 'homePage': _WM_APP_PROPERTIES.homePage,\n 'userInfo': null,\n 'login': null\n };\n invokeQueuedCallbacks('config', 'success', this.get());\n } else {*/\n invokeQueuedCallbacks.call(this, 'config', 'error', error);\n // }\n }\n\n if (this.get()) {\n // if already fetched, return it\n triggerFn(successCallback, this.get());\n return;\n }\n\n // Queue check, if same queue is already in progress, do not send another request\n this.requestQueue.config = this.requestQueue.config || [];\n this.requestQueue.config.push({\n success: successCallback,\n error: failureCallback\n });\n if (this.requestQueue.config.length > 1) {\n return;\n }\n\n if (!hasCordova()) {\n // for web project, return config returned from backend API call.\n this.getWebConfig(onSuccess.bind(this), onError.bind(this));\n }\n /* else {\n /!*\n * for mobile app, first get the mobile config (saved in the apk)\n * - if security not enabled, just return mobile config (no backend call required)\n * - else, get Web config (will be the same API hit for login) and merge the config with _mobileconfig\n *!/\n getMobileConfig(function (mobileconfig) {\n if (!mobileconfig.securityEnabled) {\n onSuccess(mobileconfig);\n } else {\n getWebConfig(function (config) {\n config = mergeWebAndMobileConfig(config);\n onSuccess(config);\n }, function () {onSuccess(mobileconfig); });\n }\n }, onError);\n }*/\n }\n\n getLastLoggedInUsername() {\n return this.lastLoggedInUser && this.lastLoggedInUser.userName;\n }\n\n /**\n * Returns the current page name\n * @returns {string}\n */\n getCurrentRoutePage() {\n const p = this._location.path();\n let lIndex = p.indexOf('?');\n lIndex = lIndex === -1 ? p.length : lIndex - 1;\n return p.substr(1, lIndex); // ignore the query params\n }\n\n /**\n * Returns Query params for specified param name in current Route\n * @param paramName, the param name whose query param value is to be retrieved\n * @returns {any}\n */\n getCurrentRouteQueryParam(paramName) {\n let paramVal;\n this.activatedRoute.queryParams.subscribe(params => {\n paramVal = params[paramName];\n });\n return paramVal;\n }\n\n isNoPageLoaded() {\n return !isEmpty(this.getCurrentRoutePage());\n }\n\n getPageByLoggedInUser() {\n const that = this;\n return new Promise((resolve) => {\n let page;\n if (!isApplicationType) {\n if (that.isNoPageLoaded()) {\n page = getWmProjectProperties().homePage;\n resolve(page);\n }\n } else {\n that.getConfig((config) => {\n if (config.securityEnabled && config.authenticated) {\n page = config.userInfo.landingPage || getWmProjectProperties().homePage;\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (that.isXsrfEnabled()) {\n // this.$http.defaults.xsrfCookieName = XSRF_COOKIE;\n // this.$http.defaults.xsrfHeaderName = config.csrfHeaderName;\n }\n } else {\n page = getWmProjectProperties().homePage;\n }\n resolve(page);\n }, function () {\n resolve(getWmProjectProperties().homePage);\n });\n }\n });\n }\n\n /**\n * Loads the App page as follows:\n * Security disabled:\n * - Home page\n * Security enabled:\n * - User is logged in, respective landing page is loaded\n * - Not logged in:\n * - Home page is public, loads the home page\n * - Home page not public, Login page(in config) is loaded\n * @param forcePageLoad\n * @returns {Promise<T>}\n */\n loadPageByUserRole(forcePageLoad?) {\n const that = this;\n return this.getPageByLoggedInUser().then(page => {\n if (that.isNoPageLoaded() || forcePageLoad) {\n // Reload the page when current page and post login landing page are same\n if (that.getCurrentRoutePage() === page) {\n (window.location as any).reload();\n } else {\n that.routerService.navigate([`/${page}`]);\n }\n }\n });\n }\n\n /**\n * Navigates to the current user's homePage based on the config in SecurityService\n * Assumption is the SecurityService is updated with the latest security config before making call to this function\n */\n navigateOnLogin() {\n this.loadPageByUserRole(true);\n }\n\n /**\n * Gets the page which needs to be redirected to on successful login\n * @param config,\n * @param page, page name for redirection\n * @returns {any|string}\n */\n getRedirectPage(config, page?) {\n const homePage = getWmProjectProperties().homePage,\n loginPage = get(config, 'loginConfig.pageName');\n let prevRedirectPage,\n redirectPage = page || this.getCurrentRoutePage();\n\n // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined\n if (redirectPage === homePage || redirectPage === loginPage) {\n /*\n * find previous redirect page from URL, if exists, user should redirect to that page.\n * USE CASE:\n * user is on http://localhost:8080/app/#/Login?redirectTo=page\n * a variable call fails resulting 401\n * in this case, redirectTo page should be 'page' and not undefined\n */\n prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');\n redirectPage = !isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;\n }\n\n return redirectPage;\n }\n\n /**\n * Returns all the query params(including page params and redirect to params) associated with redirected page\n */\n getRedirectedRouteQueryParams() {\n let queryParams = {};\n this.activatedRoute.queryParams.subscribe((paramVal) => {\n forEach(paramVal, (val, key) => {\n queryParams[key] = val;\n });\n });\n return queryParams;\n }\n\n // accepts query object like {a:1, b:2} and returns a=1&b=2 string\n getQueryString(queryObject) {\n const params = [];\n forEach(queryObject, function (value, key) {\n params.push(key + '=' + value);\n });\n return join(params, '&');\n }\n\n appLogin(params, successCallback, failureCallback) {\n let payload = '';\n\n // encode all parameters\n each(params, function (value, name) {\n payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);\n });\n\n return this.$http.send({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n url: 'j_spring_security_check',\n 'data': payload\n }).then((response) => {\n const xsrfCookieValue = response.body ? response.body[XSRF_COOKIE_NAME] : '';\n\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (xsrfCookieValue) {\n if (hasCordova()) {\n localStorage.setItem(XSRF_COOKIE_NAME, xsrfCookieValue || '');\n }\n }\n // After the successful login in device, this function triggers the pending onLoginCallbacks.\n this.injector.get(App).notify('userLoggedIn', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * The API is used to check if the user is authenticated in the RUN mode.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n isAuthenticated(successCallback, failureCallback) {\n this.getConfig(function (config) {\n triggerFn(successCallback, config.authenticated);\n }, failureCallback);\n }\n\n /**\n * The API is used to logout of the app.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n appLogout(successCallback, failureCallback) {\n return this.$http.send({\n target: 'Security',\n url: 'j_spring_security_logout',\n method: 'POST',\n responseType: 'text',\n byPassResult: true\n }).then((response) => {\n set(this.get(), 'authenticated', false);\n set(this.get(), 'userInfo', null);\n /*if (CONSTANTS.hasCordova) {\n localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');\n }*/\n this.injector.get(App).notify('userLoggedOut', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * Checks and return the cookie\n * @param name, cookie key\n * @returns {string}\n */\n getCookieByName(name) {\n // Todo: Shubham Implement cookie native js\n return 'cookie';\n }\n\n /**\n * This function returns the cookieValue if xsrf is enabled.\n * In device, xsrf cookie is stored in localStorage.\n * @returns xsrf cookie value\n */\n isXsrfEnabled() {\n if (hasCordova()) {\n return localStorage.getItem(XSRF_COOKIE_NAME);\n }\n return this.getCookieByName(XSRF_COOKIE_NAME);\n }\n\n /**\n * This function returns a promise. Promise is resolved when security is\n * 1. disabled\n * 2. enabled and user is authenticated\n * 3. enabled and user is not authenticated, then promise is resolved on user login\n * @returns {*} promise\n */\n public onUserLogin(): Promise<any> {\n return new Promise<void>((resolve, reject) => {\n this.getConfig(config => {\n if (config.securityEnabled) {\n if (config.authenticated) {\n resolve();\n } else {\n const unsubscribe = this.injector.get(App).subscribe('userLoggedIn', () => {\n resolve();\n unsubscribe();\n });\n }\n } else {\n resolve();\n }\n }, reject);\n });\n }\n\n /**\n * @returns a promise that is resolved with logged-in-user\n */\n getLoggedInUser() {\n return new Promise<any>((resolve, reject) => {\n this.getConfig((config) => {\n if (config && config.userInfo) {\n resolve(config.userInfo);\n } else {\n reject();\n }\n }, reject);\n });\n }\n\n /**\n * This is for mobile apps to authenticate via browser.\n *\n * @returns a promise that is resolved after login\n */\n authInBrowser(): Promise<any> {\n return Promise.reject('This authInBrowser should not be called');\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { SecurityService } from './security.service';\n\n@NgModule({})\nexport class SecurityModule {\n static forRoot(): ModuleWithProviders<SecurityModule> {\n return {\n ngModule: SecurityModule,\n providers: [SecurityService]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}