@spicainternational/ngx-sds-components 8.8.1 → 9.0.0-beta.2

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 (396) hide show
  1. package/fesm2022/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +6 -6
  2. package/fesm2022/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +1 -1
  3. package/fesm2022/spicainternational-ngx-sds-components-src-lib-avatar.mjs +8 -8
  4. package/fesm2022/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +1 -1
  5. package/fesm2022/spicainternational-ngx-sds-components-src-lib-badge.mjs +7 -7
  6. package/fesm2022/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +1 -1
  7. package/fesm2022/spicainternational-ngx-sds-components-src-lib-callout.mjs +3 -3
  8. package/fesm2022/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +1 -1
  9. package/fesm2022/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +4 -4
  10. package/fesm2022/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +1 -1
  11. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +7 -7
  12. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +1 -1
  13. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +15 -15
  14. package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +1 -1
  15. package/fesm2022/spicainternational-ngx-sds-components-src-lib-drawer.mjs +3 -3
  16. package/fesm2022/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +1 -1
  17. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +7 -7
  18. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +1 -1
  19. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +3 -3
  20. package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +1 -1
  21. package/fesm2022/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +3 -3
  22. package/fesm2022/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +1 -1
  23. package/fesm2022/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +4 -4
  24. package/fesm2022/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +1 -1
  25. package/fesm2022/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +6 -6
  26. package/fesm2022/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +1 -1
  27. package/fesm2022/spicainternational-ngx-sds-components-src-lib-intersection.mjs +7 -8
  28. package/fesm2022/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +1 -1
  29. package/fesm2022/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +5 -6
  30. package/fesm2022/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +1 -1
  31. package/fesm2022/spicainternational-ngx-sds-components-src-lib-layout.mjs +20 -20
  32. package/fesm2022/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +1 -1
  33. package/fesm2022/spicainternational-ngx-sds-components-src-lib-message.mjs +4 -4
  34. package/fesm2022/spicainternational-ngx-sds-components-src-lib-message.mjs.map +1 -1
  35. package/fesm2022/spicainternational-ngx-sds-components-src-lib-modal.mjs +11 -11
  36. package/fesm2022/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +1 -1
  37. package/fesm2022/spicainternational-ngx-sds-components-src-lib-navigation.mjs +93 -93
  38. package/fesm2022/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +1 -1
  39. package/fesm2022/spicainternational-ngx-sds-components-src-lib-number-box.mjs +4 -4
  40. package/fesm2022/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +1 -1
  41. package/fesm2022/spicainternational-ngx-sds-components-src-lib-page-header.mjs +4 -4
  42. package/fesm2022/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +1 -1
  43. package/fesm2022/spicainternational-ngx-sds-components-src-lib-pane.mjs +4 -4
  44. package/fesm2022/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +1 -1
  45. package/fesm2022/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +4 -4
  46. package/fesm2022/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +1 -1
  47. package/fesm2022/spicainternational-ngx-sds-components-src-lib-ripple.mjs +3 -3
  48. package/fesm2022/spicainternational-ngx-sds-components-src-lib-ripple.mjs.map +1 -1
  49. package/fesm2022/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +9 -9
  50. package/fesm2022/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +1 -1
  51. package/fesm2022/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +6 -6
  52. package/fesm2022/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +1 -1
  53. package/fesm2022/spicainternational-ngx-sds-components-src-lib-static-value.mjs +4 -4
  54. package/fesm2022/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +1 -1
  55. package/fesm2022/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +5 -5
  56. package/fesm2022/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +1 -1
  57. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timeline.mjs +4 -4
  58. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +1 -1
  59. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timer.mjs +3 -3
  60. package/fesm2022/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +1 -1
  61. package/fesm2022/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +7 -7
  62. package/fesm2022/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +1 -1
  63. package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs.map +1 -1
  64. package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils.mjs.map +1 -1
  65. package/package.json +45 -113
  66. package/{src/lib/app-switcher/app-switcher.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-app-switcher.d.ts} +16 -4
  67. package/{src/lib/avatar/avatar.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-avatar.d.ts} +40 -3
  68. package/{src/lib/badge/badge.directive.d.ts → types/spicainternational-ngx-sds-components-src-lib-badge.d.ts} +9 -4
  69. package/{src/lib/callout/callout.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-callout.d.ts} +5 -2
  70. package/{src/lib/color-picker/color-picker.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-color-picker.d.ts} +8 -4
  71. package/{src/lib/date-picker/date-picker.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-date-picker.d.ts} +56 -10
  72. package/types/spicainternational-ngx-sds-components-src-lib-date-pipes.d.ts +82 -0
  73. package/{src/lib/drawer/drawer.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-drawer.d.ts} +5 -2
  74. package/{src/lib/duration-box/duration-box.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-duration-box.d.ts} +18 -5
  75. package/{src/lib/duration-pipe/duration-format.pipe.d.ts → types/spicainternational-ngx-sds-components-src-lib-duration-pipe.d.ts} +5 -2
  76. package/{src/lib/ellipsis/directives/ellipsis.directive.d.ts → types/spicainternational-ngx-sds-components-src-lib-ellipsis.d.ts} +5 -2
  77. package/{src/lib/expansion-panel/expansion-panel.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-expansion-panel.d.ts} +8 -3
  78. package/{src/lib/highlight-text/directives/highlight-text.directive.d.ts → types/spicainternational-ngx-sds-components-src-lib-highlight-text.d.ts} +15 -3
  79. package/types/spicainternational-ngx-sds-components-src-lib-intersection.d.ts +44 -0
  80. package/types/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.d.ts +20 -0
  81. package/types/spicainternational-ngx-sds-components-src-lib-layout.d.ts +39 -0
  82. package/{src/lib/message/message.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-message.d.ts} +6 -3
  83. package/types/spicainternational-ngx-sds-components-src-lib-modal.d.ts +127 -0
  84. package/types/spicainternational-ngx-sds-components-src-lib-navigation.d.ts +256 -0
  85. package/{src/lib/number-box/number-box.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-number-box.d.ts} +11 -7
  86. package/{src/lib/page-header/page-header.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-page-header.d.ts} +6 -3
  87. package/{src/lib/pane/pane.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-pane.d.ts} +17 -5
  88. package/{src/lib/quick-info/quick-info.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-quick-info.d.ts} +16 -4
  89. package/{src/lib/ripple/ripple.directive.d.ts → types/spicainternational-ngx-sds-components-src-lib-ripple.d.ts} +6 -3
  90. package/types/spicainternational-ngx-sds-components-src-lib-segmented-control.d.ts +45 -0
  91. package/types/spicainternational-ngx-sds-components-src-lib-side-bar.d.ts +33 -0
  92. package/{src/lib/static-value/static-value.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-static-value.d.ts} +5 -2
  93. package/{src/lib/table-actions/table-actions.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-table-actions.d.ts} +5 -2
  94. package/{src/lib/timeline/components/timeline.component.d.ts → types/spicainternational-ngx-sds-components-src-lib-timeline.d.ts} +47 -5
  95. package/types/spicainternational-ngx-sds-components-src-lib-timer.d.ts +143 -0
  96. package/{src/lib/tooltip/tooltip.directive.d.ts → types/spicainternational-ngx-sds-components-src-lib-tooltip.d.ts} +9 -4
  97. package/types/spicainternational-ngx-sds-components-src-lib-utils-date-time.d.ts +9 -0
  98. package/types/spicainternational-ngx-sds-components-src-lib-utils.d.ts +9 -0
  99. package/esm2022/public-api.mjs +0 -36
  100. package/esm2022/spicainternational-ngx-sds-components.mjs +0 -5
  101. package/esm2022/src/lib/app-switcher/app-switcher.component.mjs +0 -116
  102. package/esm2022/src/lib/app-switcher/app-switcher.model.mjs +0 -2
  103. package/esm2022/src/lib/app-switcher/public-api.mjs +0 -3
  104. package/esm2022/src/lib/app-switcher/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +0 -5
  105. package/esm2022/src/lib/avatar/avatar-group.component.mjs +0 -82
  106. package/esm2022/src/lib/avatar/avatar-group.model.mjs +0 -2
  107. package/esm2022/src/lib/avatar/avatar.component.mjs +0 -165
  108. package/esm2022/src/lib/avatar/public-api.mjs +0 -4
  109. package/esm2022/src/lib/avatar/spicainternational-ngx-sds-components-src-lib-avatar.mjs +0 -5
  110. package/esm2022/src/lib/badge/badge.directive.mjs +0 -90
  111. package/esm2022/src/lib/badge/badge.types.mjs +0 -2
  112. package/esm2022/src/lib/badge/components/badge.component.mjs +0 -59
  113. package/esm2022/src/lib/badge/public-api.mjs +0 -2
  114. package/esm2022/src/lib/badge/spicainternational-ngx-sds-components-src-lib-badge.mjs +0 -5
  115. package/esm2022/src/lib/callout/callout.component.mjs +0 -20
  116. package/esm2022/src/lib/callout/public-api.mjs +0 -2
  117. package/esm2022/src/lib/callout/spicainternational-ngx-sds-components-src-lib-callout.mjs +0 -5
  118. package/esm2022/src/lib/color-picker/color-picker.component.mjs +0 -82
  119. package/esm2022/src/lib/color-picker/public-api.mjs +0 -2
  120. package/esm2022/src/lib/color-picker/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +0 -5
  121. package/esm2022/src/lib/date-picker/date-picker.component.mjs +0 -893
  122. package/esm2022/src/lib/date-picker/date-picker.model.mjs +0 -71
  123. package/esm2022/src/lib/date-picker/public-api.mjs +0 -3
  124. package/esm2022/src/lib/date-picker/sds-date-picker.service.mjs +0 -90
  125. package/esm2022/src/lib/date-picker/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +0 -5
  126. package/esm2022/src/lib/date-pipes/date-compare.pipe.mjs +0 -32
  127. package/esm2022/src/lib/date-pipes/date-format.pipe.mjs +0 -31
  128. package/esm2022/src/lib/date-pipes/date-period-format.pipe.mjs +0 -49
  129. package/esm2022/src/lib/date-pipes/date-time-formats.constants.mjs +0 -156
  130. package/esm2022/src/lib/date-pipes/date-time-range-duration.pipe.mjs +0 -33
  131. package/esm2022/src/lib/date-pipes/date-time-range-format.pipe.mjs +0 -45
  132. package/esm2022/src/lib/date-pipes/public-api.mjs +0 -8
  133. package/esm2022/src/lib/date-pipes/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +0 -5
  134. package/esm2022/src/lib/drawer/drawer.component.mjs +0 -103
  135. package/esm2022/src/lib/drawer/public-api.mjs +0 -2
  136. package/esm2022/src/lib/drawer/spicainternational-ngx-sds-components-src-lib-drawer.mjs +0 -5
  137. package/esm2022/src/lib/duration-box/duration-box.component.mjs +0 -279
  138. package/esm2022/src/lib/duration-box/duration-box.types.mjs +0 -2
  139. package/esm2022/src/lib/duration-box/duration.service.mjs +0 -72
  140. package/esm2022/src/lib/duration-box/public-api.mjs +0 -2
  141. package/esm2022/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +0 -5
  142. package/esm2022/src/lib/duration-pipe/duration-format.pipe.mjs +0 -27
  143. package/esm2022/src/lib/duration-pipe/public-api.mjs +0 -2
  144. package/esm2022/src/lib/duration-pipe/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +0 -5
  145. package/esm2022/src/lib/ellipsis/directives/ellipsis.directive.mjs +0 -52
  146. package/esm2022/src/lib/ellipsis/public-api.mjs +0 -2
  147. package/esm2022/src/lib/ellipsis/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +0 -5
  148. package/esm2022/src/lib/expansion-panel/expansion-panel.component.mjs +0 -86
  149. package/esm2022/src/lib/expansion-panel/expansion-panel.types.mjs +0 -2
  150. package/esm2022/src/lib/expansion-panel/public-api.mjs +0 -2
  151. package/esm2022/src/lib/expansion-panel/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +0 -5
  152. package/esm2022/src/lib/highlight-text/directives/highlight-text.directive.mjs +0 -61
  153. package/esm2022/src/lib/highlight-text/directives/index.mjs +0 -2
  154. package/esm2022/src/lib/highlight-text/pipes/highlight-text.pipe.mjs +0 -30
  155. package/esm2022/src/lib/highlight-text/pipes/index.mjs +0 -2
  156. package/esm2022/src/lib/highlight-text/public-api.mjs +0 -3
  157. package/esm2022/src/lib/highlight-text/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +0 -5
  158. package/esm2022/src/lib/highlight-text/utils/highlight-text.utils.mjs +0 -97
  159. package/esm2022/src/lib/highlight-text/utils/index.mjs +0 -2
  160. package/esm2022/src/lib/intersection/directives/index.mjs +0 -2
  161. package/esm2022/src/lib/intersection/directives/intersection.directive.mjs +0 -52
  162. package/esm2022/src/lib/intersection/public-api.mjs +0 -3
  163. package/esm2022/src/lib/intersection/services/index.mjs +0 -2
  164. package/esm2022/src/lib/intersection/services/intersection.service.mjs +0 -54
  165. package/esm2022/src/lib/intersection/spicainternational-ngx-sds-components-src-lib-intersection.mjs +0 -5
  166. package/esm2022/src/lib/keyboard-shortcut/directives/index.mjs +0 -2
  167. package/esm2022/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.mjs +0 -47
  168. package/esm2022/src/lib/keyboard-shortcut/public-api.mjs +0 -2
  169. package/esm2022/src/lib/keyboard-shortcut/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +0 -5
  170. package/esm2022/src/lib/layout/default-layout/default-layout.component.mjs +0 -15
  171. package/esm2022/src/lib/layout/extra-large-layout/extra-large-layout.component.mjs +0 -15
  172. package/esm2022/src/lib/layout/fluid-layout/fluid-layout.component.mjs +0 -15
  173. package/esm2022/src/lib/layout/medium-layout/medium-layout.component.mjs +0 -15
  174. package/esm2022/src/lib/layout/public-api.mjs +0 -6
  175. package/esm2022/src/lib/layout/small-layout/small-layout.component.mjs +0 -15
  176. package/esm2022/src/lib/layout/spicainternational-ngx-sds-components-src-lib-layout.mjs +0 -5
  177. package/esm2022/src/lib/message/message.component.mjs +0 -60
  178. package/esm2022/src/lib/message/public-api.mjs +0 -2
  179. package/esm2022/src/lib/message/spicainternational-ngx-sds-components-src-lib-message.mjs +0 -5
  180. package/esm2022/src/lib/modal/dialog/dialog.component.mjs +0 -187
  181. package/esm2022/src/lib/modal/dialog/dialog.types.mjs +0 -2
  182. package/esm2022/src/lib/modal/modal.component.mjs +0 -159
  183. package/esm2022/src/lib/modal/modal.model.mjs +0 -2
  184. package/esm2022/src/lib/modal/public-api.mjs +0 -3
  185. package/esm2022/src/lib/modal/spicainternational-ngx-sds-components-src-lib-modal.mjs +0 -5
  186. package/esm2022/src/lib/navigation/models/navigation-models.mjs +0 -2
  187. package/esm2022/src/lib/navigation/navigation-collapsible-frame/navigation-collapsible-frame.component.mjs +0 -17
  188. package/esm2022/src/lib/navigation/navigation-container/navigation-container.component.mjs +0 -58
  189. package/esm2022/src/lib/navigation/navigation-external-link/navigation-external-link.component.mjs +0 -33
  190. package/esm2022/src/lib/navigation/navigation-group/navigation-group.component.mjs +0 -220
  191. package/esm2022/src/lib/navigation/navigation-header/navigation-header.component.mjs +0 -21
  192. package/esm2022/src/lib/navigation/navigation-route-link/navigation-route-link.component.mjs +0 -73
  193. package/esm2022/src/lib/navigation/navigation-separator/navigation-separator.component.mjs +0 -15
  194. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.mjs +0 -30
  195. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.mjs +0 -45
  196. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.types.mjs +0 -2
  197. package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.mjs +0 -25
  198. package/esm2022/src/lib/navigation/navigation-user-profile/navigation-profile.model.mjs +0 -2
  199. package/esm2022/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.mjs +0 -107
  200. package/esm2022/src/lib/navigation/pipes/active-route-pattern.pipe.mjs +0 -38
  201. package/esm2022/src/lib/navigation/product-home/product-home.component.mjs +0 -70
  202. package/esm2022/src/lib/navigation/public-api.mjs +0 -15
  203. package/esm2022/src/lib/navigation/spicainternational-ngx-sds-components-src-lib-navigation.mjs +0 -5
  204. package/esm2022/src/lib/navigation/utils/navigation.utils.mjs +0 -48
  205. package/esm2022/src/lib/number-box/number-box.component.mjs +0 -138
  206. package/esm2022/src/lib/number-box/public-api.mjs +0 -2
  207. package/esm2022/src/lib/number-box/spicainternational-ngx-sds-components-src-lib-number-box.mjs +0 -5
  208. package/esm2022/src/lib/page-header/page-header.component.mjs +0 -25
  209. package/esm2022/src/lib/page-header/public-api.mjs +0 -2
  210. package/esm2022/src/lib/page-header/spicainternational-ngx-sds-components-src-lib-page-header.mjs +0 -5
  211. package/esm2022/src/lib/pane/pane.component.mjs +0 -43
  212. package/esm2022/src/lib/pane/pane.model.mjs +0 -2
  213. package/esm2022/src/lib/pane/public-api.mjs +0 -3
  214. package/esm2022/src/lib/pane/spicainternational-ngx-sds-components-src-lib-pane.mjs +0 -5
  215. package/esm2022/src/lib/quick-info/public-api.mjs +0 -2
  216. package/esm2022/src/lib/quick-info/quick-info.component.mjs +0 -121
  217. package/esm2022/src/lib/quick-info/quick-info.model.mjs +0 -2
  218. package/esm2022/src/lib/quick-info/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +0 -5
  219. package/esm2022/src/lib/ripple/public-api.mjs +0 -2
  220. package/esm2022/src/lib/ripple/ripple.directive.mjs +0 -103
  221. package/esm2022/src/lib/ripple/spicainternational-ngx-sds-components-src-lib-ripple.mjs +0 -5
  222. package/esm2022/src/lib/segmented-control/public-api.mjs +0 -2
  223. package/esm2022/src/lib/segmented-control/segmented-control.component.mjs +0 -239
  224. package/esm2022/src/lib/segmented-control/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +0 -5
  225. package/esm2022/src/lib/side-bar/public-api.mjs +0 -2
  226. package/esm2022/src/lib/side-bar/side-bar.component.mjs +0 -45
  227. package/esm2022/src/lib/side-bar/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +0 -5
  228. package/esm2022/src/lib/static-value/public-api.mjs +0 -2
  229. package/esm2022/src/lib/static-value/spicainternational-ngx-sds-components-src-lib-static-value.mjs +0 -5
  230. package/esm2022/src/lib/static-value/static-value.component.mjs +0 -25
  231. package/esm2022/src/lib/table-actions/public-api.mjs +0 -2
  232. package/esm2022/src/lib/table-actions/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +0 -5
  233. package/esm2022/src/lib/table-actions/table-actions.component.mjs +0 -49
  234. package/esm2022/src/lib/timeline/components/timeline.component.mjs +0 -398
  235. package/esm2022/src/lib/timeline/models/timeline.model.mjs +0 -2
  236. package/esm2022/src/lib/timeline/public-api.mjs +0 -2
  237. package/esm2022/src/lib/timeline/services/timeline.service.mjs +0 -152
  238. package/esm2022/src/lib/timeline/spicainternational-ngx-sds-components-src-lib-timeline.mjs +0 -5
  239. package/esm2022/src/lib/timeline/types/timeline.types.mjs +0 -2
  240. package/esm2022/src/lib/timer/public-api.mjs +0 -3
  241. package/esm2022/src/lib/timer/services/index.mjs +0 -2
  242. package/esm2022/src/lib/timer/services/timer.service.mjs +0 -99
  243. package/esm2022/src/lib/timer/spicainternational-ngx-sds-components-src-lib-timer.mjs +0 -5
  244. package/esm2022/src/lib/timer/utils/index.mjs +0 -2
  245. package/esm2022/src/lib/timer/utils/timer.utils.mjs +0 -97
  246. package/esm2022/src/lib/tooltip/components/tooltip.component.mjs +0 -26
  247. package/esm2022/src/lib/tooltip/public-api.mjs +0 -2
  248. package/esm2022/src/lib/tooltip/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +0 -5
  249. package/esm2022/src/lib/tooltip/tooltip.directive.mjs +0 -192
  250. package/esm2022/src/lib/tooltip/tooltip.types.mjs +0 -2
  251. package/esm2022/src/lib/tooltip/utils/index.mjs +0 -2
  252. package/esm2022/src/lib/tooltip/utils/tooltip.utils.mjs +0 -17
  253. package/esm2022/src/lib/utils/date-time/date-time-format.function.mjs +0 -15
  254. package/esm2022/src/lib/utils/date-time/intl-date-time-format-options-presets.mjs +0 -29
  255. package/esm2022/src/lib/utils/date-time/public-api.mjs +0 -3
  256. package/esm2022/src/lib/utils/date-time/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs +0 -5
  257. package/esm2022/src/lib/utils/public-api.mjs +0 -2
  258. package/esm2022/src/lib/utils/spicainternational-ngx-sds-components-src-lib-utils.mjs +0 -5
  259. package/index.d.ts +0 -5
  260. package/src/lib/app-switcher/app-switcher.model.d.ts +0 -8
  261. package/src/lib/app-switcher/index.d.ts +0 -5
  262. package/src/lib/app-switcher/public-api.d.ts +0 -2
  263. package/src/lib/avatar/avatar-group.component.d.ts +0 -28
  264. package/src/lib/avatar/avatar-group.model.d.ts +0 -6
  265. package/src/lib/avatar/index.d.ts +0 -5
  266. package/src/lib/avatar/public-api.d.ts +0 -3
  267. package/src/lib/badge/badge.types.d.ts +0 -2
  268. package/src/lib/badge/components/badge.component.d.ts +0 -23
  269. package/src/lib/badge/index.d.ts +0 -5
  270. package/src/lib/badge/public-api.d.ts +0 -1
  271. package/src/lib/callout/index.d.ts +0 -5
  272. package/src/lib/callout/public-api.d.ts +0 -1
  273. package/src/lib/color-picker/index.d.ts +0 -5
  274. package/src/lib/color-picker/public-api.d.ts +0 -1
  275. package/src/lib/date-picker/date-picker.model.d.ts +0 -34
  276. package/src/lib/date-picker/index.d.ts +0 -5
  277. package/src/lib/date-picker/public-api.d.ts +0 -2
  278. package/src/lib/date-picker/sds-date-picker.service.d.ts +0 -9
  279. package/src/lib/date-pipes/date-compare.pipe.d.ts +0 -7
  280. package/src/lib/date-pipes/date-format.pipe.d.ts +0 -19
  281. package/src/lib/date-pipes/date-period-format.pipe.d.ts +0 -11
  282. package/src/lib/date-pipes/date-time-formats.constants.d.ts +0 -22
  283. package/src/lib/date-pipes/date-time-range-duration.pipe.d.ts +0 -7
  284. package/src/lib/date-pipes/date-time-range-format.pipe.d.ts +0 -15
  285. package/src/lib/date-pipes/index.d.ts +0 -5
  286. package/src/lib/date-pipes/public-api.d.ts +0 -7
  287. package/src/lib/drawer/index.d.ts +0 -5
  288. package/src/lib/drawer/public-api.d.ts +0 -1
  289. package/src/lib/duration-box/duration-box.types.d.ts +0 -1
  290. package/src/lib/duration-box/duration.service.d.ts +0 -10
  291. package/src/lib/duration-box/index.d.ts +0 -5
  292. package/src/lib/duration-box/public-api.d.ts +0 -1
  293. package/src/lib/duration-pipe/index.d.ts +0 -5
  294. package/src/lib/duration-pipe/public-api.d.ts +0 -1
  295. package/src/lib/ellipsis/index.d.ts +0 -5
  296. package/src/lib/ellipsis/public-api.d.ts +0 -1
  297. package/src/lib/expansion-panel/expansion-panel.types.d.ts +0 -2
  298. package/src/lib/expansion-panel/index.d.ts +0 -5
  299. package/src/lib/expansion-panel/public-api.d.ts +0 -1
  300. package/src/lib/highlight-text/directives/index.d.ts +0 -1
  301. package/src/lib/highlight-text/index.d.ts +0 -5
  302. package/src/lib/highlight-text/pipes/highlight-text.pipe.d.ts +0 -11
  303. package/src/lib/highlight-text/pipes/index.d.ts +0 -1
  304. package/src/lib/highlight-text/public-api.d.ts +0 -2
  305. package/src/lib/highlight-text/utils/highlight-text.utils.d.ts +0 -23
  306. package/src/lib/highlight-text/utils/index.d.ts +0 -1
  307. package/src/lib/intersection/directives/index.d.ts +0 -1
  308. package/src/lib/intersection/directives/intersection.directive.d.ts +0 -24
  309. package/src/lib/intersection/index.d.ts +0 -5
  310. package/src/lib/intersection/public-api.d.ts +0 -2
  311. package/src/lib/intersection/services/index.d.ts +0 -1
  312. package/src/lib/intersection/services/intersection.service.d.ts +0 -19
  313. package/src/lib/keyboard-shortcut/directives/index.d.ts +0 -1
  314. package/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.d.ts +0 -17
  315. package/src/lib/keyboard-shortcut/index.d.ts +0 -5
  316. package/src/lib/keyboard-shortcut/public-api.d.ts +0 -1
  317. package/src/lib/layout/default-layout/default-layout.component.d.ts +0 -8
  318. package/src/lib/layout/extra-large-layout/extra-large-layout.component.d.ts +0 -8
  319. package/src/lib/layout/fluid-layout/fluid-layout.component.d.ts +0 -8
  320. package/src/lib/layout/index.d.ts +0 -5
  321. package/src/lib/layout/medium-layout/medium-layout.component.d.ts +0 -8
  322. package/src/lib/layout/public-api.d.ts +0 -5
  323. package/src/lib/layout/small-layout/small-layout.component.d.ts +0 -8
  324. package/src/lib/message/index.d.ts +0 -5
  325. package/src/lib/message/public-api.d.ts +0 -1
  326. package/src/lib/modal/dialog/dialog.component.d.ts +0 -61
  327. package/src/lib/modal/dialog/dialog.types.d.ts +0 -1
  328. package/src/lib/modal/index.d.ts +0 -5
  329. package/src/lib/modal/modal.component.d.ts +0 -60
  330. package/src/lib/modal/modal.model.d.ts +0 -3
  331. package/src/lib/modal/public-api.d.ts +0 -2
  332. package/src/lib/navigation/index.d.ts +0 -5
  333. package/src/lib/navigation/models/navigation-models.d.ts +0 -4
  334. package/src/lib/navigation/navigation-collapsible-frame/navigation-collapsible-frame.component.d.ts +0 -7
  335. package/src/lib/navigation/navigation-container/navigation-container.component.d.ts +0 -25
  336. package/src/lib/navigation/navigation-external-link/navigation-external-link.component.d.ts +0 -13
  337. package/src/lib/navigation/navigation-group/navigation-group.component.d.ts +0 -65
  338. package/src/lib/navigation/navigation-header/navigation-header.component.d.ts +0 -11
  339. package/src/lib/navigation/navigation-route-link/navigation-route-link.component.d.ts +0 -31
  340. package/src/lib/navigation/navigation-separator/navigation-separator.component.d.ts +0 -10
  341. package/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.d.ts +0 -11
  342. package/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.d.ts +0 -17
  343. package/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.types.d.ts +0 -1
  344. package/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.d.ts +0 -9
  345. package/src/lib/navigation/navigation-user-profile/navigation-profile.model.d.ts +0 -6
  346. package/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.d.ts +0 -34
  347. package/src/lib/navigation/pipes/active-route-pattern.pipe.d.ts +0 -21
  348. package/src/lib/navigation/product-home/product-home.component.d.ts +0 -31
  349. package/src/lib/navigation/public-api.d.ts +0 -14
  350. package/src/lib/navigation/utils/navigation.utils.d.ts +0 -2
  351. package/src/lib/number-box/index.d.ts +0 -5
  352. package/src/lib/number-box/public-api.d.ts +0 -1
  353. package/src/lib/page-header/index.d.ts +0 -5
  354. package/src/lib/page-header/public-api.d.ts +0 -1
  355. package/src/lib/pane/index.d.ts +0 -5
  356. package/src/lib/pane/pane.model.d.ts +0 -8
  357. package/src/lib/pane/public-api.d.ts +0 -2
  358. package/src/lib/quick-info/index.d.ts +0 -5
  359. package/src/lib/quick-info/public-api.d.ts +0 -1
  360. package/src/lib/quick-info/quick-info.model.d.ts +0 -9
  361. package/src/lib/ripple/index.d.ts +0 -5
  362. package/src/lib/ripple/public-api.d.ts +0 -1
  363. package/src/lib/segmented-control/index.d.ts +0 -5
  364. package/src/lib/segmented-control/public-api.d.ts +0 -1
  365. package/src/lib/segmented-control/segmented-control.component.d.ts +0 -42
  366. package/src/lib/side-bar/index.d.ts +0 -5
  367. package/src/lib/side-bar/public-api.d.ts +0 -1
  368. package/src/lib/side-bar/side-bar.component.d.ts +0 -30
  369. package/src/lib/static-value/index.d.ts +0 -5
  370. package/src/lib/static-value/public-api.d.ts +0 -1
  371. package/src/lib/table-actions/index.d.ts +0 -5
  372. package/src/lib/table-actions/public-api.d.ts +0 -1
  373. package/src/lib/timeline/index.d.ts +0 -5
  374. package/src/lib/timeline/models/timeline.model.d.ts +0 -38
  375. package/src/lib/timeline/public-api.d.ts +0 -1
  376. package/src/lib/timeline/services/timeline.service.d.ts +0 -24
  377. package/src/lib/timeline/types/timeline.types.d.ts +0 -2
  378. package/src/lib/timer/index.d.ts +0 -5
  379. package/src/lib/timer/public-api.d.ts +0 -2
  380. package/src/lib/timer/services/index.d.ts +0 -1
  381. package/src/lib/timer/services/timer.service.d.ts +0 -78
  382. package/src/lib/timer/utils/index.d.ts +0 -1
  383. package/src/lib/timer/utils/timer.utils.d.ts +0 -61
  384. package/src/lib/tooltip/components/tooltip.component.d.ts +0 -18
  385. package/src/lib/tooltip/index.d.ts +0 -5
  386. package/src/lib/tooltip/public-api.d.ts +0 -1
  387. package/src/lib/tooltip/tooltip.types.d.ts +0 -2
  388. package/src/lib/tooltip/utils/index.d.ts +0 -1
  389. package/src/lib/tooltip/utils/tooltip.utils.d.ts +0 -5
  390. package/src/lib/utils/date-time/date-time-format.function.d.ts +0 -2
  391. package/src/lib/utils/date-time/index.d.ts +0 -5
  392. package/src/lib/utils/date-time/intl-date-time-format-options-presets.d.ts +0 -4
  393. package/src/lib/utils/date-time/public-api.d.ts +0 -2
  394. package/src/lib/utils/index.d.ts +0 -5
  395. package/src/lib/utils/public-api.d.ts +0 -1
  396. /package/{public-api.d.ts → types/spicainternational-ngx-sds-components.d.ts} +0 -0
@@ -1,893 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { locale } from "devextreme/localization";
3
- import { isSameDay, isSameYear, isSameMonth, startOfDay, startOfMonth, endOfMonth, isAfter, isBefore, add, } from 'date-fns';
4
- import { faAngleLeft, faAngleRight, faCalendar, faLock } from '@fortawesome/pro-regular-svg-icons';
5
- import { faArrowRight } from '@fortawesome/pro-light-svg-icons';
6
- import { PeriodPickerDateRange, } from './date-picker.model';
7
- import { DxDateBoxModule, DxCalendarModule } from 'devextreme-angular';
8
- import { DxScrollViewModule } from 'devextreme-angular/ui/scroll-view';
9
- import { DxoAnimationModule, DxoShowModule, DxoHideModule, DxoPositionModule } from 'devextreme-angular/ui/nested';
10
- import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
11
- import { DxTemplateModule } from 'devextreme-angular/core';
12
- import { DxPopoverModule } from 'devextreme-angular/ui/popover';
13
- import { NgIf, NgFor } from '@angular/common';
14
- import { CdkTrapFocus } from '@angular/cdk/a11y';
15
- import { SdsDateComparePipe } from '@spicainternational/ngx-sds-components/src/lib/date-pipes';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "./sds-date-picker.service";
18
- import * as i2 from "@fortawesome/angular-fontawesome";
19
- import * as i3 from "devextreme-angular/ui/popover";
20
- import * as i4 from "devextreme-angular/ui/nested";
21
- import * as i5 from "devextreme-angular/core";
22
- import * as i6 from "devextreme-angular/ui/scroll-view";
23
- import * as i7 from "devextreme-angular";
24
- // import { faLock } from '@fortawesome/pro-solid-svg-icons';
25
- export class SdsDatePickerComponent {
26
- get showDatepicker() {
27
- return this._showDatepicker;
28
- }
29
- set showDatepicker(value) {
30
- this._showDatepicker = value;
31
- this.calendarVisibleChange.emit(value);
32
- }
33
- // public methods
34
- constructor(changeRef, datePickerService) {
35
- this.changeRef = changeRef;
36
- this.datePickerService = datePickerService;
37
- this.displayContent = undefined;
38
- // public interface
39
- this.selectionKind = 'period';
40
- this.dateRangeDefinitions = [];
41
- // single date selector
42
- this.selectedDate = new Date();
43
- this.selectedDateChange = new EventEmitter();
44
- this.selectedDateStartChange = new EventEmitter();
45
- // format function for displaying date when single date is selected
46
- this.singleDayFormatFn = undefined;
47
- // format function for displaying each date when date range is selected
48
- this.dateRangeFormatFn = undefined;
49
- this.selectedDateEndChange = new EventEmitter();
50
- this.periodChange = new EventEmitter();
51
- /**
52
- * Emits when the user selects a predefined date range from the dropdown.
53
- * Does not emit when the 'Custom' option is selected.
54
- */
55
- this.predefinedRangeSelected = new EventEmitter();
56
- /**
57
- * Emits whenever the calendar popover visibility changes.
58
- * Emits `true` when the popover opens and `false` when it closes.
59
- */
60
- this.calendarVisibleChange = new EventEmitter();
61
- this.disabled = false;
62
- this.validationError = '';
63
- this.isValid = true;
64
- this.disabledDates = [];
65
- this.applyText = 'close';
66
- this.cancelText = 'close';
67
- this.firstDayOfWeek = 1;
68
- this.dateRangeDefinitionsWidth = '11rem';
69
- this.showPreviousAndNextButtons = true;
70
- this.width = '30rem';
71
- this.dropdownWrapperClass = '';
72
- this.dropdownWrapperId = '';
73
- this.getPreviousDateCallback = this.getPreviousDay;
74
- this.getNextDateCallback = this.getNextDay;
75
- this.getPreviousRangeCallback = this.getPreviousRange;
76
- this.getNextRangeCallback = this.getNextRange;
77
- this.useCustomDisplayContent = false;
78
- this.displayPredefinedDateRangeName = false;
79
- this.style = 'classic';
80
- this.compactStyleDisplay = 'predefinedRange';
81
- this.dateInputDisplayFormat = 'shortDate';
82
- // #region Aria inputs
83
- /**
84
- * @description
85
- * Component aria-label. Defaults to 'Date picker'
86
- */
87
- this.componentAriaLabel = 'Date picker';
88
- /**
89
- * @description
90
- * Predefined date range definitions dropdown button aria-label. Defaults to 'Open predefined date ranges pane'
91
- */
92
- this.openDateRangeDefinitionsAriaLabel = 'Open predefined date ranges pane';
93
- /**
94
- * @description
95
- * Next period button aria-label. Default to 'Next period'
96
- */
97
- this.nextPeriodAriaLabel = 'Next period';
98
- /**
99
- * @description
100
- * Previous period button aria-label. Defaults to 'Previous period'
101
- */
102
- this.previousPeriodAriaLabel = 'Previous period';
103
- this.previousButtonDisabled = false;
104
- this.nextButtonDisabled = false;
105
- // public properties
106
- this.previousPeriodIcon = faAngleLeft;
107
- this.nextPeriodIcon = faAngleRight;
108
- this.calendarIcon = faCalendar;
109
- this.toIcon = faArrowRight;
110
- this.lockIcon = faLock;
111
- this.predefinedDateRanges = [];
112
- this.predefinedDateRangesGeneratedDate = undefined;
113
- this.dateRanges = [];
114
- this.selectedDateRangeName = '';
115
- this.selectedDateRangeTextSegment1 = '';
116
- this.selectedDateRangeTextSegment2 = '';
117
- this.selectedDateCalendar = new Date();
118
- this.selectedDateInternal = new Date();
119
- this.dateStartOld = '';
120
- this.dateStart = '';
121
- this.dateEndOld = '';
122
- this.dateEnd = '';
123
- this._showDatepicker = false;
124
- this.showPredefinedOptionsSelector = false;
125
- this.hidingConfirmedDate = false;
126
- this.isSettingNotPreprocessedDate = false;
127
- this.isSelectedPredefinedPeriod = false;
128
- this.selectedDateFocus = true;
129
- this.elementUUID = 'sds-as-' + crypto.randomUUID();
130
- this.initCalendarValue = true;
131
- this.singleDatePickerBox = undefined;
132
- this.selectedDateStartBox = undefined;
133
- this.selectedDateEndBox = undefined;
134
- this.calendar = undefined;
135
- this._selectedDateRangeButton = undefined;
136
- this.randomIdReference = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
137
- this.isDateDisabled = (args) => {
138
- if (this.lockBeforeDate && isBefore(args.date, this.lockBeforeDate)) {
139
- return true;
140
- }
141
- return this.disabledDates.some((day) => isSameDay(args.date, day));
142
- };
143
- this.dateRangeDefinitions = [];
144
- this.minDateDefault = new Date(1900, 1, 1);
145
- this.maxDateDefault = add(startOfDay(new Date()), { years: 50 });
146
- this.showDatepicker = false;
147
- this.translations = {
148
- cancel: 'Cancel',
149
- apply: 'Apply',
150
- custom: 'Custom',
151
- presets: 'Presets',
152
- };
153
- this.customDateRange = new PeriodPickerDateRange(this.translations.custom, undefined, undefined);
154
- this.selectedDateRange = this.customDateRange;
155
- this.selectedDateInternal = startOfDay(new Date());
156
- this.selectedDateStart = startOfMonth(new Date());
157
- this.selectedDateEnd = startOfDay(endOfMonth(new Date()));
158
- this.setSelectedDateRangeText();
159
- }
160
- ngOnInit() { }
161
- ngOnChanges(changes) {
162
- if (changes['dateRangeDefinitions']) {
163
- this.generateDateRanges(true);
164
- }
165
- if (changes['selectionKind']) {
166
- if (this.selectionKind == 'single') {
167
- const date = new Date(this.selectedDateInternal);
168
- this.matchDateRange(date, date);
169
- this.setDateRangeText(date, date);
170
- }
171
- else {
172
- const date1 = new Date(this.selectedDateStart);
173
- const date2 = new Date(this.selectedDateEnd);
174
- this.matchDateRange(date1, date2);
175
- this.setDateRangeText(date1, date2);
176
- }
177
- }
178
- if (changes['translations']) {
179
- this.updateCustomText();
180
- }
181
- if (changes['locales']) {
182
- this.handleLocalesChange();
183
- }
184
- if (changes['selectedDateStart'] || changes['selectedDateEnd']) {
185
- this.dateStartOld = this.selectedDateStart;
186
- this.dateEndOld = this.selectedDateEnd;
187
- }
188
- if (changes['selectedDate']) {
189
- const value = new Date(changes['selectedDate'].currentValue);
190
- this.selectedDateInternal = startOfDay(value);
191
- if (this.selectionKind == 'single') {
192
- this.dateStart = this.selectedDateInternal;
193
- this.dateEnd = this.selectedDateInternal;
194
- this.matchDateRange(this.selectedDateInternal, this.selectedDateInternal);
195
- this.setDateRangeText(this.selectedDateInternal, this.selectedDateInternal);
196
- }
197
- this.changeRef.detectChanges();
198
- }
199
- if (changes['selectedDateStart']) {
200
- const value = changes['selectedDateStart'].currentValue;
201
- const selectedValue = value instanceof Date ? value : new Date();
202
- if (this.selectionKind == 'period') {
203
- if (this.isSettingNotPreprocessedDate && this.showDatepicker) {
204
- this.dateStart = selectedValue;
205
- this.selectedDateInternal = selectedValue;
206
- this.isSettingNotPreprocessedDate = false;
207
- }
208
- else if (!this.isSelectedPredefinedPeriod &&
209
- this.showDatepicker) {
210
- if (this.selectedDateStartFocus) {
211
- this.dateStart = selectedValue;
212
- this.selectedDateInternal = selectedValue;
213
- if (this.dateEnd instanceof Date &&
214
- (isSameDay(selectedValue, this.dateEnd) ||
215
- isAfter(selectedValue, this.dateEnd))) {
216
- this.dateEnd = selectedValue;
217
- }
218
- }
219
- }
220
- else {
221
- this.dateStart = selectedValue;
222
- this.selectedDateFocus = false;
223
- }
224
- this.calendar?.instance?.repaint();
225
- this.removeDxDefaultCalendarFocus();
226
- if (this.selectedDateStart instanceof Date &&
227
- this.selectedDateEnd instanceof Date) {
228
- this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
229
- this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
230
- }
231
- }
232
- this.changeRef.detectChanges();
233
- }
234
- if (changes['selectedDateEnd']) {
235
- const value = changes['selectedDateEnd'].currentValue;
236
- const selectedValue = value instanceof Date ? value : new Date();
237
- if (this.selectionKind == 'period') {
238
- if (!this.isSelectedPredefinedPeriod) {
239
- if (this.selectedDateEndFocus) {
240
- this.dateEnd = selectedValue;
241
- this.selectedDateInternal = selectedValue;
242
- if (this.dateStart instanceof Date &&
243
- (isSameDay(selectedValue, this.dateStart) ||
244
- isAfter(this.dateStart, selectedValue))) {
245
- this.dateStart = selectedValue;
246
- }
247
- }
248
- }
249
- else {
250
- this.dateEnd = selectedValue;
251
- this.selectedDateInternal = selectedValue;
252
- }
253
- this.removeDxDefaultCalendarFocus();
254
- if (this.selectedDateStart instanceof Date &&
255
- this.selectedDateEnd instanceof Date) {
256
- this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
257
- this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
258
- }
259
- }
260
- }
261
- if (changes['firstDayOfWeek']) {
262
- this.generateDateRanges(true);
263
- }
264
- }
265
- setDateRangeDefinitions(definitions) {
266
- this.dateRangeDefinitions = definitions;
267
- this.generateDateRanges(true);
268
- }
269
- setTranslations(translations) {
270
- this.translations = translations;
271
- this.updateCustomText();
272
- }
273
- setLocales(locales) {
274
- this.locales = locales;
275
- this.handleLocalesChange();
276
- }
277
- get selectedDateStartFocus() {
278
- return this.selectedDateFocus;
279
- }
280
- get selectedDateEndFocus() {
281
- return !this.selectedDateFocus;
282
- }
283
- get isMinimumLimit() {
284
- if (this.minDate instanceof Date &&
285
- this.selectedDateInternal instanceof Date) {
286
- return (isSameDay(this.selectedDateInternal, this.minDate) ||
287
- isBefore(this.selectedDateInternal, this.minDate));
288
- }
289
- return false;
290
- }
291
- get isMaximumLimit() {
292
- if (this.maxDate instanceof Date &&
293
- this.selectedDateInternal instanceof Date) {
294
- return (isSameDay(this.selectedDateInternal, this.maxDate) ||
295
- isAfter(this.selectedDateInternal, this.maxDate));
296
- }
297
- return false;
298
- }
299
- onDateChange(event) {
300
- let selectedDateFromEvent = new Date(event.value);
301
- if (this.selectionKind == 'period') {
302
- const interactiveChange = event.event;
303
- if (interactiveChange) {
304
- if (this.selectedDateStartFocus) {
305
- this.handleStartDateChange(selectedDateFromEvent);
306
- }
307
- else if (this.selectedDateEndFocus) {
308
- this.handleEndDateChange(selectedDateFromEvent);
309
- }
310
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
311
- }
312
- }
313
- else if (this.selectionKind == 'single') {
314
- this.showDatepicker = false;
315
- this.selectedDateInternal = selectedDateFromEvent;
316
- }
317
- }
318
- handleStartDateChange(newDate) {
319
- this.selectedDateStart = newDate;
320
- this.selectedDateCalendar = newDate;
321
- if (!this.initCalendarValue) {
322
- this.selectedDateFocus = false;
323
- if (isAfter(newDate, this.selectedDateEnd)) {
324
- this.selectedDateEnd = newDate;
325
- }
326
- else {
327
- this.selectedDateCalendar = new Date(this.selectedDateEnd);
328
- }
329
- }
330
- }
331
- handleEndDateChange(newDate) {
332
- this.selectedDateEnd = newDate;
333
- this.selectedDateCalendar = newDate;
334
- if (
335
- // selected date is before start date -> set start date
336
- isBefore(newDate, this.selectedDateStart)) {
337
- this.selectedDateFocus = true;
338
- this.selectedDateStart = newDate;
339
- this.selectedDateFocus = false;
340
- }
341
- }
342
- onStartDateChange(event) {
343
- this.handleStartDateChange(event.value);
344
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
345
- }
346
- onEndDateChange(event) {
347
- this.handleEndDateChange(event.value);
348
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
349
- }
350
- onRangeKeyReleased(event, range) {
351
- if (event.key === 'Enter') {
352
- this.changDateRange(range);
353
- }
354
- }
355
- onStartDateFocus() {
356
- this.initCalendarValue = true;
357
- this.selectedDateFocus = true;
358
- if (this.selectedDateStart) {
359
- this.selectedDateInternal = new Date(this.selectedDateStart);
360
- this.selectedDateCalendar = new Date(this.selectedDateStart);
361
- }
362
- setTimeout(() => {
363
- this.initCalendarValue = false;
364
- });
365
- }
366
- onEndDateFocus() {
367
- this.selectedDateFocus = false;
368
- if (this.selectedDateEnd) {
369
- this.selectedDateInternal = new Date(this.selectedDateEnd);
370
- this.selectedDateCalendar = new Date(this.selectedDateEnd);
371
- }
372
- }
373
- applyPeriodPicker() {
374
- this.hidingConfirmedDate = true;
375
- this.showDatepicker = false;
376
- }
377
- onShowingCalendarPopover() {
378
- this.hidingConfirmedDate = false;
379
- if (this.selectionKind == 'single') {
380
- setTimeout(() => {
381
- this.singleDatePickerBox?.instance.focus();
382
- });
383
- }
384
- else {
385
- this.dateStartOld = this.selectedDateStart;
386
- this.dateEndOld = this.selectedDateEnd;
387
- this.isSettingNotPreprocessedDate = true;
388
- setTimeout(() => {
389
- this.selectedDateStartBox?.instance.focus();
390
- this.onStartDateFocus();
391
- });
392
- }
393
- }
394
- closeDatepickerPopup(emitChange = true) {
395
- // if (this.showDatepicker) {
396
- // this.showDatepicker = false;
397
- if (this.selectionKind == 'single') {
398
- this.setSelectedDate(this.selectedDateInternal, this.selectedDateInternal, emitChange);
399
- }
400
- else {
401
- if (this.hidingConfirmedDate) {
402
- this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, true);
403
- }
404
- else {
405
- // this.setSelectedDate(this.dateStartOld, this.dateEndOld, true);
406
- this.setSelectedDate(this.dateStartOld, this.dateEndOld, false);
407
- }
408
- // this.hidingConfirmedDate = false;
409
- }
410
- if (this._selectedDateRangeButton) {
411
- this._selectedDateRangeButton.nativeElement.focus({ focusVisible: false });
412
- }
413
- // }
414
- }
415
- onHiddenCalendarPopover() {
416
- this.closeDatepickerPopup();
417
- }
418
- setSelectedDate(dateStart, dateEnd, emitChange = true) {
419
- this.selectedDateStart = dateStart;
420
- this.selectedDateEnd = dateEnd;
421
- this.selectedDateInternal = this.selectionKind === 'single' ? dateStart : dateEnd;
422
- this.isSelectedPredefinedPeriod = false;
423
- if (emitChange) {
424
- if (this.selectionKind == 'single') {
425
- this.selectedDate = new Date(this.selectedDateInternal);
426
- this.selectedDateChange.emit(this.selectedDateInternal);
427
- }
428
- else {
429
- const dateStartNew = new Date(this.selectedDateStart);
430
- const dateEndNew = new Date(this.selectedDateEnd);
431
- const startDateChanged = (this.dateStartOld instanceof Date && !isSameDay(this.dateStartOld, dateStartNew)) ||
432
- (typeof this.dateStartOld === 'string' && this.dateStartOld === '');
433
- const endDateChanged = (this.dateEndOld instanceof Date && !isSameDay(this.dateEndOld, dateEndNew)) ||
434
- (typeof this.dateEndOld === 'string' && this.dateEndOld === '');
435
- if (startDateChanged) {
436
- this.dateStartOld = new Date(this.selectedDateStart);
437
- this.selectedDateStartChange.emit(this.selectedDateStart);
438
- }
439
- if (endDateChanged) {
440
- this.dateEndOld = new Date(this.selectedDateEnd);
441
- this.selectedDateEndChange.emit(this.selectedDateEnd);
442
- }
443
- if (startDateChanged || endDateChanged) {
444
- this.periodChange.emit([
445
- this.selectedDateStart,
446
- this.selectedDateEnd,
447
- ]);
448
- }
449
- }
450
- if (this.selectedDateStart instanceof Date &&
451
- this.selectedDateEnd instanceof Date) {
452
- this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
453
- this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
454
- }
455
- }
456
- this.changeRef.detectChanges();
457
- }
458
- goToNextDate() {
459
- if (this.selectionKind == 'single') {
460
- const newDate = this.getNextDateCallback(this.selectedDateInternal);
461
- this.selectedDateInternal = new Date(newDate);
462
- this.setSelectedDate(newDate, newDate);
463
- }
464
- else {
465
- if (!(this.selectedDateStart instanceof Date) || !(this.selectedDateEnd instanceof Date)) {
466
- return;
467
- }
468
- const range = this.getNextRangeCallback(this.selectedDateStart, this.selectedDateEnd);
469
- this.setSelectedDate(range[0], range[1]);
470
- }
471
- }
472
- goToPreviousDate() {
473
- if (this.selectionKind == 'single') {
474
- const newDate = this.getPreviousDateCallback(this.selectedDateInternal);
475
- this.selectedDateInternal = new Date(newDate);
476
- this.setSelectedDate(newDate, newDate);
477
- }
478
- else {
479
- if (!(this.selectedDateStart instanceof Date) || !(this.selectedDateEnd instanceof Date)) {
480
- return;
481
- }
482
- const range = this.getPreviousRangeCallback(this.selectedDateStart, this.selectedDateEnd);
483
- this.setSelectedDate(range[0], range[1]);
484
- }
485
- }
486
- // public setNextPreviousDay(setNext: any) {
487
- // this.isSelectedPredefinedPeriod = true;
488
- // let newDate = setNext
489
- // ? add(this.selectedDateInternal as Date, { days: 1 })
490
- // : add(this.selectedDateInternal as Date, { days: -1 });
491
- // this.selectedDateInternal = new Date(newDate);
492
- // this.setSelectedDate(newDate, newDate);
493
- // }
494
- getNextDay(currentDate) {
495
- this.isSelectedPredefinedPeriod = true;
496
- return add(this.selectedDateInternal, { days: 1 });
497
- }
498
- getPreviousDay(currentDate) {
499
- this.isSelectedPredefinedPeriod = true;
500
- return add(this.selectedDateInternal, { days: -1 });
501
- }
502
- getNextRange(currentStartDate, currentEndDate) {
503
- this.isSelectedPredefinedPeriod = true;
504
- return this.datePickerService.getRange(new Date(currentStartDate), new Date(currentEndDate), 'next');
505
- }
506
- getPreviousRange(currentStartDate, currentEndDate) {
507
- this.isSelectedPredefinedPeriod = true;
508
- return this.datePickerService.getRange(new Date(currentStartDate), new Date(currentEndDate), 'previous');
509
- }
510
- setNextPreviousRange(setNext) {
511
- this.isSelectedPredefinedPeriod = true;
512
- if (!(this.selectedDateStart instanceof Date) ||
513
- !(this.selectedDateEnd instanceof Date)) {
514
- return;
515
- }
516
- const range = this.datePickerService.getRange(this.selectedDateStart, this.selectedDateEnd, setNext ? 'next' : 'previous');
517
- this.setSelectedDate(range[0], range[1]);
518
- }
519
- getCellCssClass(date) {
520
- const calendarDate = new Date(date);
521
- let css = '';
522
- if (this.selectionKind == 'period') {
523
- const selectedDateStartAsDate = new Date(this.selectedDateStart);
524
- const selectedDateEndAsDate = new Date(this.selectedDateEnd);
525
- if (isAfter(calendarDate, startOfDay(selectedDateStartAsDate)) &&
526
- isBefore(calendarDate, startOfDay(selectedDateEndAsDate)) &&
527
- !this.disabledDates.some((day) => isSameDay(calendarDate, day))) {
528
- css += ' bg-primary-light text-dark rounded-0';
529
- }
530
- else {
531
- if (isSameDay(calendarDate, selectedDateStartAsDate)) {
532
- css += ' bg-primary text-white rounded-start';
533
- }
534
- if (isSameDay(calendarDate, selectedDateEndAsDate)) {
535
- css += ' bg-primary text-white rounded-end';
536
- }
537
- }
538
- }
539
- return css;
540
- }
541
- selectEndDate(event) {
542
- if (this.selectionKind == "period" && this.selectedDateStartFocus && this.calendarCellClicked(event)) {
543
- this.selectedDateFocus = false;
544
- this.selectedDateCalendar = new Date(this.selectedDateEnd);
545
- }
546
- }
547
- onKeydown(event) {
548
- if (this.showDatepicker) {
549
- if (event.code === 'Escape') {
550
- this.showDatepicker = false;
551
- event.stopImmediatePropagation();
552
- }
553
- else if (event.code === 'Enter' || event.code === 'NumpadEnter') {
554
- if (!this.disabled) {
555
- this.applyPeriodPicker();
556
- }
557
- event.stopImmediatePropagation();
558
- }
559
- }
560
- }
561
- calendarCellClicked(event) {
562
- // This check is tightly coupled with current DX implementation so it
563
- // must be re-checked after each major update of the DX components
564
- // Also check if dx-calendar provides info about clicked element by
565
- // design.
566
- const targetParentClassList = event.target?.offsetParent?.classList;
567
- if (!targetParentClassList) {
568
- return false;
569
- }
570
- const isCalendarCell = [...targetParentClassList].includes('dx-calendar-cell');
571
- return isCalendarCell;
572
- }
573
- handleLocalesChange() {
574
- // apply new locale to DX
575
- // if array of locales was provided use first one
576
- if (typeof this.locales === 'string') {
577
- locale(this.locales);
578
- }
579
- else if (Array.isArray(this.locales) && this.locales.length > 0) {
580
- locale(this.locales[0]);
581
- }
582
- ;
583
- this.selectedDateStartBox?.instance.repaint();
584
- this.selectedDateEndBox?.instance.repaint();
585
- this.singleDatePickerBox?.instance.repaint();
586
- this.calendar?.instance.repaint();
587
- this.setSelectedDateRangeText();
588
- }
589
- updateCustomText() {
590
- this.customDateRange.name = this.translations?.custom
591
- ? this.translations.custom
592
- : '';
593
- }
594
- removeDxDefaultCalendarFocus() {
595
- const element = document.querySelector('#datepickercomponent .dx-calendar-selected-date');
596
- if (element &&
597
- element?.classList?.contains('dx-calendar-selected-date')) {
598
- element?.classList?.remove('dx-calendar-selected-date');
599
- }
600
- }
601
- setSelectedDateRangeText() {
602
- if (this.selectionKind == 'single') {
603
- this.matchDateRange(new Date(this.selectedDateInternal), new Date(this.selectedDateInternal));
604
- this.setDateRangeText(new Date(this.selectedDateInternal), new Date(this.selectedDateInternal));
605
- }
606
- else {
607
- this.matchDateRange(new Date(this.selectedDateStart), new Date(this.selectedDateEnd));
608
- this.setDateRangeText(new Date(this.selectedDateStart), new Date(this.selectedDateEnd));
609
- }
610
- }
611
- toggleDateRangeSelectorVisibility() {
612
- if (!this.showPredefinedOptionsSelector) {
613
- this.generateDateRanges();
614
- }
615
- this.showPredefinedOptionsSelector =
616
- !this.showPredefinedOptionsSelector;
617
- }
618
- changDateRange(range) {
619
- this.showPredefinedOptionsSelector = false;
620
- this.showDatepicker = false;
621
- this.selectedDateRange = range;
622
- if (range === this.customDateRange) {
623
- // this.openDatepickerPopup();
624
- this.showDatepicker = true;
625
- }
626
- else {
627
- this.dateStart = range.dateFrom
628
- ? range.dateFrom
629
- : startOfDay(new Date());
630
- this.dateEnd = range.dateTo ? range.dateTo : startOfDay(new Date());
631
- this.predefinedRangeSelected.emit(range);
632
- this.setSelectedDate(this.dateStart, this.dateEnd, true);
633
- }
634
- }
635
- matchDateRange(dateFrom, dateTo) {
636
- if (!dateFrom || !dateTo) {
637
- this.selectedDateRange = this.customDateRange;
638
- return;
639
- }
640
- this.generateDateRanges();
641
- const dateRange = this.predefinedDateRanges.filter((x) => isSameDay(x.dateFrom, dateFrom) &&
642
- isSameDay(x.dateTo, dateTo));
643
- if (dateRange.length) {
644
- this.selectedDateRange = dateRange[0];
645
- }
646
- else {
647
- this.selectedDateRange = this.customDateRange;
648
- }
649
- }
650
- setDateRangeText(dateFrom, dateTo) {
651
- const today = new Date();
652
- this.selectedDateRangeName = '';
653
- this.selectedDateRangeTextSegment1 = '';
654
- this.selectedDateRangeTextSegment2 = '';
655
- if (!(dateFrom instanceof Date) || !(dateTo instanceof Date)) {
656
- return;
657
- }
658
- // RESOLVE PERIOD
659
- // one day
660
- if (isSameDay(dateFrom, dateTo)) {
661
- if (typeof this.singleDayFormatFn !== 'undefined') {
662
- this.selectedDateRangeTextSegment1 = this.singleDayFormatFn(dateFrom);
663
- }
664
- else {
665
- if (this.style == 'compact' && this.compactStyleDisplay == 'both' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
666
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom); //skip day name, as we have custom text.
667
- }
668
- else {
669
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, 'day-long');
670
- }
671
- }
672
- }
673
- // date range
674
- else {
675
- // date range - use provided dateRange format function (if defined)
676
- if (typeof this.dateRangeFormatFn !== 'undefined') {
677
- this.selectedDateRangeTextSegment1 = this.dateRangeFormatFn(dateFrom);
678
- this.selectedDateRangeTextSegment2 = this.dateRangeFormatFn(dateTo);
679
- }
680
- // full month
681
- else if (isSameDay(dateFrom, startOfMonth(dateFrom)) &&
682
- isSameDay(dateTo, endOfMonth(dateTo)) &&
683
- isSameMonth(dateFrom, dateTo)) {
684
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, 'month');
685
- }
686
- // date range - use default date format function
687
- else {
688
- this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, isSameYear(dateFrom, today) ? 'day-short' : 'day');
689
- this.selectedDateRangeTextSegment2 = this.formatDate(dateTo, isSameYear(dateTo, today) ? 'day-short' : 'day');
690
- }
691
- }
692
- if (this.style == 'compact' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
693
- if (this.compactStyleDisplay == 'predefinedRange') {
694
- this.selectedDateRangeName = this.selectedDateRange.name;
695
- this.selectedDateRangeTextSegment1 = '';
696
- this.selectedDateRangeTextSegment2 = '';
697
- }
698
- if (this.compactStyleDisplay == 'both') {
699
- this.selectedDateRangeName = this.selectedDateRange.name + ', ';
700
- }
701
- }
702
- // @Input() public style: 'classic' | 'compact' = 'classic';
703
- // @Input() public compactStyleDisplay: 'date' | 'predefinedRange' | 'both' = 'predefinedRange';
704
- // if (this.style == 'compact' && this.compactStyleDisplay == 'predefinedRange' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
705
- // this.selectedDateRangeTextSegment1 = this.selectedDateRange.name;
706
- // this.selectedDateRangeTextSegment2 = '';
707
- // return;
708
- // }
709
- // if (this.style == 'compact' && this.compactStyleDisplay == 'both' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
710
- // this.selectedDateRangeTextSegment1 = this.selectedDateRange.name;
711
- // this.selectedDateRangeTextSegment2 = '';
712
- // return;
713
- // }
714
- }
715
- formatDate(date, type) {
716
- switch (type) {
717
- case 'month':
718
- return date.toLocaleDateString(this.locales, {
719
- month: 'long',
720
- year: 'numeric',
721
- day: undefined,
722
- });
723
- case 'day-long':
724
- return date.toLocaleDateString(this.locales, {
725
- day: 'numeric',
726
- month: 'numeric',
727
- year: 'numeric',
728
- weekday: 'long',
729
- });
730
- case 'day-short':
731
- return date.toLocaleDateString(this.locales, {
732
- day: 'numeric',
733
- month: 'short',
734
- });
735
- case 'day':
736
- return date.toLocaleDateString(this.locales, {
737
- day: 'numeric',
738
- month: 'short',
739
- year: 'numeric',
740
- });
741
- default:
742
- return date.toLocaleDateString(this.locales, {
743
- day: 'numeric',
744
- month: 'numeric',
745
- year: 'numeric',
746
- });
747
- }
748
- }
749
- generateDateRanges(force) {
750
- const today = startOfDay(new Date());
751
- if (force ||
752
- !this.predefinedDateRangesGeneratedDate ||
753
- !isSameDay(this.predefinedDateRangesGeneratedDate, today)) {
754
- this.predefinedDateRangesGeneratedDate = today;
755
- this.predefinedDateRanges =
756
- this.datePickerService.getPredefinedDateRanges(this.dateRangeDefinitions, today, this.firstDayOfWeek);
757
- this.dateRanges = [...this.predefinedDateRanges];
758
- this.dateRanges.push(this.customDateRange);
759
- }
760
- }
761
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SdsDatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SdsDatePickerService }], target: i0.ɵɵFactoryTarget.Component }); }
762
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SdsDatePickerComponent, isStandalone: true, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", singleDayFormatFn: "singleDayFormatFn", dateRangeFormatFn: "dateRangeFormatFn", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", disabledDates: "disabledDates", applyText: "applyText", cancelText: "cancelText", translations: "translations", firstDayOfWeek: "firstDayOfWeek", dateRangeDefinitionsWidth: "dateRangeDefinitionsWidth", showPreviousAndNextButtons: "showPreviousAndNextButtons", width: "width", dropdownWrapperClass: "dropdownWrapperClass", dropdownWrapperId: "dropdownWrapperId", getPreviousDateCallback: "getPreviousDateCallback", getNextDateCallback: "getNextDateCallback", getPreviousRangeCallback: "getPreviousRangeCallback", getNextRangeCallback: "getNextRangeCallback", useCustomDisplayContent: "useCustomDisplayContent", displayPredefinedDateRangeName: "displayPredefinedDateRangeName", style: "style", compactStyleDisplay: "compactStyleDisplay", dateInputDisplayFormat: "dateInputDisplayFormat", componentAriaLabel: "componentAriaLabel", openDateRangeDefinitionsAriaLabel: "openDateRangeDefinitionsAriaLabel", nextPeriodAriaLabel: "nextPeriodAriaLabel", previousPeriodAriaLabel: "previousPeriodAriaLabel", lockBeforeDate: "lockBeforeDate", lockBeforeDateHint: "lockBeforeDateHint", previousButtonDisabled: "previousButtonDisabled", nextButtonDisabled: "nextButtonDisabled" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange", predefinedRangeSelected: "predefinedRangeSelected", calendarVisibleChange: "calendarVisibleChange" }, queries: [{ propertyName: "displayContent", first: true, predicate: ["display"], descendants: true }], viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "selectedDateEndBox", first: true, predicate: ["selectedDateEndBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "_selectedDateRangeButton", first: true, predicate: ["selectedDateRangeButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <div id=\"datepickerbuttons\"> -->\n <div\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\n role=\"group\"\n [attr.aria-label]=\"componentAriaLabel\"\n [style.width]=\"width\"\n >\n\n <ng-container *ngIf=\"style == 'classic'\">\n <div\n class=\"btn-group\"\n role=\"group\"\n >\n <button\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\n type=\"button\"\n class=\"\n btn btn-white\n border\n rounded-start\n border-end\n p-0\n sds-fw-400\"\n [disabled]=\"disabled\"\n [style.width]=\"dateRangeDefinitionsWidth\"\n (click)=\"toggleDateRangeSelectorVisibility()\"\n >\n <div class=\"d-flex align-items-center\">\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\n {{selectedDateRange.name}}\n </div>\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\n <span class=\"dropdown-toggle\"></span>\n </button>\n </div>\n\n </button>\n\n <dx-popover\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\n position=\"bottom\"\n [(visible)]=\"showPredefinedOptionsSelector\"\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\n [minWidth]=\"dateRangeDefinitionsWidth\"\n\n >\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\n <div *ngFor=\"let range of dateRanges\">\n <div\n role=\"button\"\n tabindex=\"0\"\n class=\"predefined-date-range px-3 py-2 w-100\"\n [class.selected]=\"range === selectedDateRange\"\n (click)=\"changDateRange(range)\"\n (keydown)=\"onRangeKeyReleased($event, range)\"\n >\n {{range.name}}\n </div>\n </div>\n </div>\n </dx-popover>\n </div>\n </ng-container>\n\n\n <button\n *ngIf=\"showPreviousAndNextButtons\"\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\n type=\"button\"\n [attr.aria-label]=\"previousPeriodAriaLabel\"\n [disabled]=\"isMinimumLimit || disabled || previousButtonDisabled\"\n (click)=\"goToPreviousDate()\"\n >\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\n\n </button>\n\n <button\n #selectedDateRangeButton\n id=\"pickerDropdown{{ randomIdReference }}\"\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\n [class.border-end] = \"!showPreviousAndNextButtons\"\n [disabled]=\"disabled\"\n type=\"button\"\n (click)=\"showDatepicker = !showDatepicker\"\n >\n\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\n <div *ngIf=\"!useCustomDisplayContent\"\n class=\"d-flex justify-content-center align-items-center\">\n <!-- <div class=\"mx-1\">\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\n </div> -->\n <div class=\"mx-1 text-truncate\">\n <span>{{selectedDateRangeName}}</span>\n <span>{{selectedDateRangeTextSegment1}}</span>\n <fa-icon\n *ngIf=\"selectedDateRangeTextSegment2\"\n class=\"mx-2\"\n [icon]=\"toIcon\"\n size=\"sm\"\n ></fa-icon>\n <span>{{selectedDateRangeTextSegment2}}</span>\n </div>\n </div>\n </button>\n\n <button\n *ngIf=\"showPreviousAndNextButtons\"\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\n type=\"button\"\n [attr.aria-label]=\"nextPeriodAriaLabel\"\n [disabled]=\"isMaximumLimit || disabled || nextButtonDisabled\"\n (click)=\"goToNextDate()\"\n >\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\n </button>\n </div>\n\n <div class=\"sds-print-only h-100\">\n\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\n <div *ngIf=\"!useCustomDisplayContent\"\n class=\"d-flex justify-content-center align-items-center\">\n <!-- <div class=\"mx-1\">\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\n </div> -->\n <div class=\"mx-1 text-truncate\">\n <span>{{selectedDateRangeTextSegment1}}</span>\n <fa-icon\n *ngIf=\"selectedDateRangeTextSegment2\"\n class=\"mx-2\"\n [icon]=\"toIcon\"\n size=\"sm\"\n ></fa-icon>\n <span>{{selectedDateRangeTextSegment2}}</span>\n </div>\n </div>\n </div>\n\n<dx-popover\n target=\"#pickerDropdown{{ randomIdReference }}\"\n position=\"bottom\"\n [(visible)]=\"showDatepicker\"\n (onHiding)=\"onHiddenCalendarPopover()\"\n (onShowing)=\"onShowingCalendarPopover()\"\n class=\"m-0 p-0\"\n [wrapperAttr]=\"{\n class: 'sds-datepicker-popover sds-dx-popup-no-arrow ' + dropdownWrapperClass,\n id: dropdownWrapperId\n }\"\n>\n <dxo-animation>\n <dxo-show\n type=\"pop\"\n [from]=\"{ scale: 0.9 }\"\n [to]=\"{ scale: 1 }\"\n ></dxo-show>\n <dxo-hide\n type=\"fade\"\n [from]=\"1\"\n [to]=\"0\"\n ></dxo-hide>\n </dxo-animation>\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\n <dx-scroll-view>\n <div class=\"d-flex flex-row\">\n\n <div\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\n class=\"compact-mode-date-ranges-container d-flex flex-column p-3 bg-gray-100\"\n style=\"border-right: 1px solid var(--bs-gray-200)\"\n >\n <div\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\n <label>{{ translations.presets }}</label>\n </div>\n <div *ngFor=\"let range of dateRanges\">\n <div\n class=\"predefined-date-range px-3 py-2 w-100\"\n [class.selected]=\"range === selectedDateRange\"\n (click)=\"changDateRange(range)\"\n >\n {{range.name}}\n </div>\n </div>\n </div>\n\n\n <div id=\"datepickercomponent\">\n <div\n *ngIf=\"this.selectionKind == 'period'\"\n id=\"date-inputs\"\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\n >\n <div class=\"d-flex justify-content-between align-items-center\">\n <dx-date-box\n #selectedDateStartBox\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\n [class.activeInput]=\"selectedDateFocus\"\n [showClearButton]=\"false\"\n [showDropDownButton]=\"false\"\n [useMaskBehavior]=\"true\"\n [displayFormat]=\"dateInputDisplayFormat\"\n type=\"date\"\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [value]=\"selectedDateStart\"\n (onValueChanged)=\"onStartDateChange($event)\"\n (onFocusIn)=\"onStartDateFocus()\"\n >\n </dx-date-box>\n </div>\n\n <div class=\"d-flex justify-content-center align-items-center px-2\">\n <fa-icon [icon]=\"toIcon\"></fa-icon>\n </div>\n\n <div class=\"d-flex justify-content-center align-items-center\">\n <dx-date-box\n #selectedDateEndBox\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\n [class.activeInput]=\"!selectedDateFocus\"\n [showClearButton]=\"false\"\n [showDropDownButton]=\"false\"\n [useMaskBehavior]=\"true\"\n [displayFormat]=\"dateInputDisplayFormat\"\n type=\"date\"\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [value]=\"selectedDateEnd\"\n (onValueChanged)=\"onEndDateChange($event)\"\n (onFocusIn)=\"onEndDateFocus()\"\n >\n </dx-date-box>\n </div>\n </div>\n\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\n <div\n *ngIf=\"this.selectionKind == 'single'\"\n id=\"date-inputs\"\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\n >\n <div class=\"d-flex justify-content-center align-items-center\">\n <dx-date-box\n #singleDatePickerBox\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\n [class.activeInput]=\"true\"\n [showClearButton]=\"false\"\n [showDropDownButton]=\"false\"\n [useMaskBehavior]=\"true\"\n [displayFormat]=\"dateInputDisplayFormat\"\n type=\"date\"\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [(value)]=\"selectedDateInternal\"\n >\n </dx-date-box>\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\n </div>\n </div>\n\n <div\n class=\"d-flex justify-content-center align-items-center\"\n (click)=\"selectEndDate($event)\">\n\n <dx-calendar\n #calendar\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [disabledDates]=\"isDateDisabled\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\n (onValueChanged)=\"onDateChange($event)\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n >\n <div\n *dxTemplate=\"let cellData of 'cell'\"\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\n [style.line-height.px]=\"23\"\n\n >\n\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\n <ng-template #thenLockBlock>\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\n </ng-template>\n <ng-template #elseDefaultBlock>\n {{ cellData.text }}\n </ng-template>\n </div>\n </dx-calendar>\n </div>\n </div>\n\n <div\n *ngIf=\"this.selectionKind == 'period'\"\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\n >\n <button\n class=\"sds-btn-secondary sds-fw-400\"\n [disabled]=\"disabled\"\n (click)=\"showDatepicker = false\"\n type=\"button\"\n >\n {{ translations.cancel}}\n </button>\n <!-- (click)=\"closeDatepickerPopup()\" -->\n <button\n class=\"sds-btn-primary ms-1 sds-fw-400\"\n [disabled]=\"disabled\"\n (click)=\"applyPeriodPicker()\"\n type=\"button\"\n >\n {{ translations.apply}}\n </button>\n </div>\n </div>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>\n<!-- </div> -->\n\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content .compact-mode-date-ranges-container{border-top-left-radius:6px;border-bottom-left-radius:6px}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: SdsDateComparePipe, name: "sdsDateCompare" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "ngmodule", type: DxPopoverModule }, { kind: "component", type: i3.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "deferRendering", "disabled", "enableBodyScroll", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "deferRenderingChange", "disabledChange", "enableBodyScrollChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i4.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i4.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i4.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "directive", type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "ngmodule", type: DxTemplateModule }, { kind: "ngmodule", type: DxoAnimationModule }, { kind: "ngmodule", type: DxoShowModule }, { kind: "ngmodule", type: DxoHideModule }, { kind: "ngmodule", type: DxoPositionModule }, { kind: "ngmodule", type: DxScrollViewModule }, { kind: "component", type: i6.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "ngmodule", type: DxDateBoxModule }, { kind: "component", type: i7.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isDirty", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "todayButtonText", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isDirtyChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "todayButtonTextChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "ngmodule", type: DxCalendarModule }, { kind: "component", type: i7.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isDirty", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "selectionMode", "selectWeekOnClick", "showTodayButton", "showWeekNumbers", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "weekNumberRule", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isDirtyChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "selectionModeChange", "selectWeekOnClickChange", "showTodayButtonChange", "showWeekNumbersChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "weekNumberRuleChange", "widthChange", "zoomLevelChange", "onBlur"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
763
- }
764
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SdsDatePickerComponent, decorators: [{
765
- type: Component,
766
- args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
767
- NgFor,
768
- NgIf,
769
- SdsDateComparePipe,
770
- CdkTrapFocus,
771
- FontAwesomeModule,
772
- DxPopoverModule,
773
- DxTemplateModule,
774
- DxoAnimationModule,
775
- DxoShowModule,
776
- DxoHideModule,
777
- DxoPositionModule,
778
- DxScrollViewModule,
779
- DxDateBoxModule,
780
- DxCalendarModule,
781
- ], template: "<!-- <div id=\"datepickerbuttons\"> -->\n <div\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\n role=\"group\"\n [attr.aria-label]=\"componentAriaLabel\"\n [style.width]=\"width\"\n >\n\n <ng-container *ngIf=\"style == 'classic'\">\n <div\n class=\"btn-group\"\n role=\"group\"\n >\n <button\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\n type=\"button\"\n class=\"\n btn btn-white\n border\n rounded-start\n border-end\n p-0\n sds-fw-400\"\n [disabled]=\"disabled\"\n [style.width]=\"dateRangeDefinitionsWidth\"\n (click)=\"toggleDateRangeSelectorVisibility()\"\n >\n <div class=\"d-flex align-items-center\">\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\n {{selectedDateRange.name}}\n </div>\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\n <span class=\"dropdown-toggle\"></span>\n </button>\n </div>\n\n </button>\n\n <dx-popover\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\n position=\"bottom\"\n [(visible)]=\"showPredefinedOptionsSelector\"\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\n [minWidth]=\"dateRangeDefinitionsWidth\"\n\n >\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\n <div *ngFor=\"let range of dateRanges\">\n <div\n role=\"button\"\n tabindex=\"0\"\n class=\"predefined-date-range px-3 py-2 w-100\"\n [class.selected]=\"range === selectedDateRange\"\n (click)=\"changDateRange(range)\"\n (keydown)=\"onRangeKeyReleased($event, range)\"\n >\n {{range.name}}\n </div>\n </div>\n </div>\n </dx-popover>\n </div>\n </ng-container>\n\n\n <button\n *ngIf=\"showPreviousAndNextButtons\"\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\n type=\"button\"\n [attr.aria-label]=\"previousPeriodAriaLabel\"\n [disabled]=\"isMinimumLimit || disabled || previousButtonDisabled\"\n (click)=\"goToPreviousDate()\"\n >\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\n\n </button>\n\n <button\n #selectedDateRangeButton\n id=\"pickerDropdown{{ randomIdReference }}\"\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\n [class.border-end] = \"!showPreviousAndNextButtons\"\n [disabled]=\"disabled\"\n type=\"button\"\n (click)=\"showDatepicker = !showDatepicker\"\n >\n\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\n <div *ngIf=\"!useCustomDisplayContent\"\n class=\"d-flex justify-content-center align-items-center\">\n <!-- <div class=\"mx-1\">\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\n </div> -->\n <div class=\"mx-1 text-truncate\">\n <span>{{selectedDateRangeName}}</span>\n <span>{{selectedDateRangeTextSegment1}}</span>\n <fa-icon\n *ngIf=\"selectedDateRangeTextSegment2\"\n class=\"mx-2\"\n [icon]=\"toIcon\"\n size=\"sm\"\n ></fa-icon>\n <span>{{selectedDateRangeTextSegment2}}</span>\n </div>\n </div>\n </button>\n\n <button\n *ngIf=\"showPreviousAndNextButtons\"\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\n type=\"button\"\n [attr.aria-label]=\"nextPeriodAriaLabel\"\n [disabled]=\"isMaximumLimit || disabled || nextButtonDisabled\"\n (click)=\"goToNextDate()\"\n >\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\n </button>\n </div>\n\n <div class=\"sds-print-only h-100\">\n\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\n <div *ngIf=\"!useCustomDisplayContent\"\n class=\"d-flex justify-content-center align-items-center\">\n <!-- <div class=\"mx-1\">\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\n </div> -->\n <div class=\"mx-1 text-truncate\">\n <span>{{selectedDateRangeTextSegment1}}</span>\n <fa-icon\n *ngIf=\"selectedDateRangeTextSegment2\"\n class=\"mx-2\"\n [icon]=\"toIcon\"\n size=\"sm\"\n ></fa-icon>\n <span>{{selectedDateRangeTextSegment2}}</span>\n </div>\n </div>\n </div>\n\n<dx-popover\n target=\"#pickerDropdown{{ randomIdReference }}\"\n position=\"bottom\"\n [(visible)]=\"showDatepicker\"\n (onHiding)=\"onHiddenCalendarPopover()\"\n (onShowing)=\"onShowingCalendarPopover()\"\n class=\"m-0 p-0\"\n [wrapperAttr]=\"{\n class: 'sds-datepicker-popover sds-dx-popup-no-arrow ' + dropdownWrapperClass,\n id: dropdownWrapperId\n }\"\n>\n <dxo-animation>\n <dxo-show\n type=\"pop\"\n [from]=\"{ scale: 0.9 }\"\n [to]=\"{ scale: 1 }\"\n ></dxo-show>\n <dxo-hide\n type=\"fade\"\n [from]=\"1\"\n [to]=\"0\"\n ></dxo-hide>\n </dxo-animation>\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\n <dx-scroll-view>\n <div class=\"d-flex flex-row\">\n\n <div\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\n class=\"compact-mode-date-ranges-container d-flex flex-column p-3 bg-gray-100\"\n style=\"border-right: 1px solid var(--bs-gray-200)\"\n >\n <div\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\n <label>{{ translations.presets }}</label>\n </div>\n <div *ngFor=\"let range of dateRanges\">\n <div\n class=\"predefined-date-range px-3 py-2 w-100\"\n [class.selected]=\"range === selectedDateRange\"\n (click)=\"changDateRange(range)\"\n >\n {{range.name}}\n </div>\n </div>\n </div>\n\n\n <div id=\"datepickercomponent\">\n <div\n *ngIf=\"this.selectionKind == 'period'\"\n id=\"date-inputs\"\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\n >\n <div class=\"d-flex justify-content-between align-items-center\">\n <dx-date-box\n #selectedDateStartBox\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\n [class.activeInput]=\"selectedDateFocus\"\n [showClearButton]=\"false\"\n [showDropDownButton]=\"false\"\n [useMaskBehavior]=\"true\"\n [displayFormat]=\"dateInputDisplayFormat\"\n type=\"date\"\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [value]=\"selectedDateStart\"\n (onValueChanged)=\"onStartDateChange($event)\"\n (onFocusIn)=\"onStartDateFocus()\"\n >\n </dx-date-box>\n </div>\n\n <div class=\"d-flex justify-content-center align-items-center px-2\">\n <fa-icon [icon]=\"toIcon\"></fa-icon>\n </div>\n\n <div class=\"d-flex justify-content-center align-items-center\">\n <dx-date-box\n #selectedDateEndBox\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\n [class.activeInput]=\"!selectedDateFocus\"\n [showClearButton]=\"false\"\n [showDropDownButton]=\"false\"\n [useMaskBehavior]=\"true\"\n [displayFormat]=\"dateInputDisplayFormat\"\n type=\"date\"\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [value]=\"selectedDateEnd\"\n (onValueChanged)=\"onEndDateChange($event)\"\n (onFocusIn)=\"onEndDateFocus()\"\n >\n </dx-date-box>\n </div>\n </div>\n\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\n <div\n *ngIf=\"this.selectionKind == 'single'\"\n id=\"date-inputs\"\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\n >\n <div class=\"d-flex justify-content-center align-items-center\">\n <dx-date-box\n #singleDatePickerBox\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\n [class.activeInput]=\"true\"\n [showClearButton]=\"false\"\n [showDropDownButton]=\"false\"\n [useMaskBehavior]=\"true\"\n [displayFormat]=\"dateInputDisplayFormat\"\n type=\"date\"\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [(value)]=\"selectedDateInternal\"\n >\n </dx-date-box>\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\n </div>\n </div>\n\n <div\n class=\"d-flex justify-content-center align-items-center\"\n (click)=\"selectEndDate($event)\">\n\n <dx-calendar\n #calendar\n [min]=\"minDate || minDateDefault\"\n [max]=\"maxDate || maxDateDefault\"\n [disabledDates]=\"isDateDisabled\"\n [isValid]=\"isValid\"\n [validationError]=\"validationError\"\n [disabled]=\"disabled\"\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\n (onValueChanged)=\"onDateChange($event)\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n >\n <div\n *dxTemplate=\"let cellData of 'cell'\"\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\n [style.line-height.px]=\"23\"\n\n >\n\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\n <ng-template #thenLockBlock>\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\n </ng-template>\n <ng-template #elseDefaultBlock>\n {{ cellData.text }}\n </ng-template>\n </div>\n </dx-calendar>\n </div>\n </div>\n\n <div\n *ngIf=\"this.selectionKind == 'period'\"\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\n >\n <button\n class=\"sds-btn-secondary sds-fw-400\"\n [disabled]=\"disabled\"\n (click)=\"showDatepicker = false\"\n type=\"button\"\n >\n {{ translations.cancel}}\n </button>\n <!-- (click)=\"closeDatepickerPopup()\" -->\n <button\n class=\"sds-btn-primary ms-1 sds-fw-400\"\n [disabled]=\"disabled\"\n (click)=\"applyPeriodPicker()\"\n type=\"button\"\n >\n {{ translations.apply}}\n </button>\n </div>\n </div>\n </div>\n </dx-scroll-view>\n </div>\n</dx-popover>\n<!-- </div> -->\n\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content .compact-mode-date-ranges-container{border-top-left-radius:6px;border-bottom-left-radius:6px}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"] }]
782
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SdsDatePickerService }], propDecorators: { displayContent: [{
783
- type: ContentChild,
784
- args: ['display']
785
- }], selectionKind: [{
786
- type: Input
787
- }], dateRangeDefinitions: [{
788
- type: Input
789
- }], selectedDate: [{
790
- type: Input
791
- }], selectedDateChange: [{
792
- type: Output
793
- }], selectedDateStart: [{
794
- type: Input
795
- }], selectedDateStartChange: [{
796
- type: Output
797
- }], singleDayFormatFn: [{
798
- type: Input
799
- }], dateRangeFormatFn: [{
800
- type: Input
801
- }], selectedDateEnd: [{
802
- type: Input
803
- }], selectedDateEndChange: [{
804
- type: Output
805
- }], periodChange: [{
806
- type: Output
807
- }], predefinedRangeSelected: [{
808
- type: Output
809
- }], calendarVisibleChange: [{
810
- type: Output
811
- }], minDate: [{
812
- type: Input
813
- }], maxDate: [{
814
- type: Input
815
- }], locales: [{
816
- type: Input
817
- }], disabled: [{
818
- type: Input
819
- }], validationError: [{
820
- type: Input
821
- }], isValid: [{
822
- type: Input
823
- }], disabledDates: [{
824
- type: Input
825
- }], applyText: [{
826
- type: Input
827
- }], cancelText: [{
828
- type: Input
829
- }], translations: [{
830
- type: Input
831
- }], firstDayOfWeek: [{
832
- type: Input
833
- }], dateRangeDefinitionsWidth: [{
834
- type: Input
835
- }], showPreviousAndNextButtons: [{
836
- type: Input
837
- }], width: [{
838
- type: Input
839
- }], dropdownWrapperClass: [{
840
- type: Input
841
- }], dropdownWrapperId: [{
842
- type: Input
843
- }], getPreviousDateCallback: [{
844
- type: Input
845
- }], getNextDateCallback: [{
846
- type: Input
847
- }], getPreviousRangeCallback: [{
848
- type: Input
849
- }], getNextRangeCallback: [{
850
- type: Input
851
- }], useCustomDisplayContent: [{
852
- type: Input
853
- }], displayPredefinedDateRangeName: [{
854
- type: Input
855
- }], style: [{
856
- type: Input
857
- }], compactStyleDisplay: [{
858
- type: Input
859
- }], dateInputDisplayFormat: [{
860
- type: Input
861
- }], componentAriaLabel: [{
862
- type: Input
863
- }], openDateRangeDefinitionsAriaLabel: [{
864
- type: Input
865
- }], nextPeriodAriaLabel: [{
866
- type: Input
867
- }], previousPeriodAriaLabel: [{
868
- type: Input
869
- }], lockBeforeDate: [{
870
- type: Input
871
- }], lockBeforeDateHint: [{
872
- type: Input
873
- }], previousButtonDisabled: [{
874
- type: Input
875
- }], nextButtonDisabled: [{
876
- type: Input
877
- }], singleDatePickerBox: [{
878
- type: ViewChild,
879
- args: ['singleDatePickerBox', { static: false }]
880
- }], selectedDateStartBox: [{
881
- type: ViewChild,
882
- args: ['selectedDateStartBox', { static: false }]
883
- }], selectedDateEndBox: [{
884
- type: ViewChild,
885
- args: ['selectedDateEndBox', { static: false }]
886
- }], calendar: [{
887
- type: ViewChild,
888
- args: ['calendar', { static: false }]
889
- }], _selectedDateRangeButton: [{
890
- type: ViewChild,
891
- args: ['selectedDateRangeButton', { static: true }]
892
- }] } });
893
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxHQUNOLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEUsT0FBTyxFQUNILHFCQUFxQixHQUd4QixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25ILE9B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QUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER4Q2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvY2FsZW5kYXInO1xuaW1wb3J0IHsgRHhEYXRlQm94Q29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2RhdGUtYm94JztcbmltcG9ydCB7IGxvY2FsZSB9IGZyb20gXCJkZXZleHRyZW1lL2xvY2FsaXphdGlvblwiO1xuXG5pbXBvcnQge1xuICAgIGlzU2FtZURheSxcbiAgICBpc1NhbWVZZWFyLFxuICAgIGlzU2FtZU1vbnRoLFxuICAgIHN0YXJ0T2ZEYXksXG4gICAgc3RhcnRPZk1vbnRoLFxuICAgIGVuZE9mTW9udGgsXG4gICAgaXNBZnRlcixcbiAgICBpc0JlZm9yZSxcbiAgICBhZGQsXG59IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHtcbiAgICBmYUFuZ2xlTGVmdCxcbiAgICBmYUFuZ2xlUmlnaHQsXG4gICAgZmFDYWxlbmRhcixcbiAgICBmYUxvY2tcbn0gZnJvbSAnQGZvcnRhd2Vzb21lL3Byby1yZWd1bGFyLXN2Zy1pY29ucyc7XG5cbmltcG9ydCB7IGZhQXJyb3dSaWdodCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tbGlnaHQtc3ZnLWljb25zJztcblxuaW1wb3J0IHtcbiAgICBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UsXG4gICAgUGVyaW9kUGlja2VyRGF0ZVJhbmdlRGVmaW5pdGlvbixcbiAgICBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnMsXG59IGZyb20gJy4vZGF0ZS1waWNrZXIubW9kZWwnO1xuaW1wb3J0IHsgU2RzRGF0ZVBpY2tlclNlcnZpY2UgfSBmcm9tICcuL3Nkcy1kYXRlLXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IER4RGF0ZUJveE1vZHVsZSwgRHhDYWxlbmRhck1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgeyBEeFNjcm9sbFZpZXdNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvc2Nyb2xsLXZpZXcnO1xuaW1wb3J0IHsgRHhvQW5pbWF0aW9uTW9kdWxlLCBEeG9TaG93TW9kdWxlLCBEeG9IaWRlTW9kdWxlLCBEeG9Qb3NpdGlvbk1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xuaW1wb3J0IHsgRm9udEF3ZXNvbWVNb2R1bGUgfSBmcm9tICdAZm9ydGF3ZXNvbWUvYW5ndWxhci1mb250YXdlc29tZSc7XG5pbXBvcnQgeyBEeFRlbXBsYXRlTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHhQb3BvdmVyTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL3BvcG92ZXInO1xuaW1wb3J0IHsgTmdJZiwgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgU2RzRGF0ZUNvbXBhcmVQaXBlIH0gZnJvbSAnQHNwaWNhaW50ZXJuYXRpb25hbC9uZ3gtc2RzLWNvbXBvbmVudHMvc3JjL2xpYi9kYXRlLXBpcGVzJztcblxuLy8gaW1wb3J0IHsgZmFMb2NrIH0gZnJvbSAnQGZvcnRhd2Vzb21lL3Byby1zb2xpZC1zdmctaWNvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Nkcy1kYXRlLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0ZvcixcbiAgICAgICAgTmdJZixcblxuICAgICAgICBTZHNEYXRlQ29tcGFyZVBpcGUsXG5cbiAgICAgICAgQ2RrVHJhcEZvY3VzLFxuICAgICAgICBGb250QXdlc29tZU1vZHVsZSxcblxuICAgICAgICBEeFBvcG92ZXJNb2R1bGUsXG4gICAgICAgIER4VGVtcGxhdGVNb2R1bGUsXG4gICAgICAgIER4b0FuaW1hdGlvbk1vZHVsZSxcbiAgICAgICAgRHhvU2hvd01vZHVsZSxcbiAgICAgICAgRHhvSGlkZU1vZHVsZSxcbiAgICAgICAgRHhvUG9zaXRpb25Nb2R1bGUsXG4gICAgICAgIER4U2Nyb2xsVmlld01vZHVsZSxcbiAgICAgICAgRHhEYXRlQm94TW9kdWxlLFxuICAgICAgICBEeENhbGVuZGFyTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNkc0RhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQENvbnRlbnRDaGlsZCgnZGlzcGxheScpIGRpc3BsYXlDb250ZW50OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBwdWJsaWMgaW50ZXJmYWNlXG4gICAgQElucHV0KCkgc2VsZWN0aW9uS2luZDogJ3BlcmlvZCcgfCAnc2luZ2xlJyA9ICdwZXJpb2QnO1xuXG4gICAgQElucHV0KCkgZGF0ZVJhbmdlRGVmaW5pdGlvbnM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24+ID0gW107XG5cbiAgICAvLyBzaW5nbGUgZGF0ZSBzZWxlY3RvclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvLyBwZXJpb2Qgc2VsZWN0b3JcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVTdGFydDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWREYXRlU3RhcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvLyBmb3JtYXQgZnVuY3Rpb24gZm9yIGRpc3BsYXlpbmcgZGF0ZSB3aGVuIHNpbmdsZSBkYXRlIGlzIHNlbGVjdGVkXG4gICAgQElucHV0KCkgc2luZ2xlRGF5Rm9ybWF0Rm46ICgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nICkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLy8gZm9ybWF0IGZ1bmN0aW9uIGZvciBkaXNwbGF5aW5nIGVhY2ggZGF0ZSB3aGVuIGRhdGUgcmFuZ2UgaXMgc2VsZWN0ZWRcbiAgICBASW5wdXQoKSBkYXRlUmFuZ2VGb3JtYXRGbjogKChkYXRlOiBEYXRlKSA9PiBzdHJpbmcgKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWREYXRlRW5kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwZXJpb2RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgLyoqXG4gICAgICogRW1pdHMgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgcHJlZGVmaW5lZCBkYXRlIHJhbmdlIGZyb20gdGhlIGRyb3Bkb3duLlxuICAgICAqIERvZXMgbm90IGVtaXQgd2hlbiB0aGUgJ0N1c3RvbScgb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwcmVkZWZpbmVkUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UGVyaW9kUGlja2VyRGF0ZVJhbmdlPigpO1xuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW5ldmVyIHRoZSBjYWxlbmRhciBwb3BvdmVyIHZpc2liaWxpdHkgY2hhbmdlcy5cbiAgICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgcG9wb3ZlciBvcGVucyBhbmQgYGZhbHNlYCB3aGVuIGl0IGNsb3Nlcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgY2FsZW5kYXJWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XG4gICAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XG5cbiAgICBASW5wdXQoKSBsb2NhbGVzPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHZhbGlkYXRpb25FcnJvcjogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgaXNWYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBhcHBseVRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjYW5jZWxUZXh0Pzogc3RyaW5nID0gJ2Nsb3NlJztcblxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cmFuc2xhdGlvbnM6IFBlcmlvZFBpY2tlclRyYW5zbGF0aW9ucztcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBmaXJzdERheU9mV2VlazogMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiA9IDE7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0ZVJhbmdlRGVmaW5pdGlvbnNXaWR0aDogc3RyaW5nID0gJzExcmVtJztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KCkgcHVibGljIHdpZHRoOiBzdHJpbmcgPSAnMzByZW0nO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRyb3Bkb3duV3JhcHBlckNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25XcmFwcGVySWQ6IHN0cmluZyA9ICcnO1xuXG4gICAgQElucHV0KCkgcHVibGljIGdldFByZXZpb3VzRGF0ZUNhbGxiYWNrOiAoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSB0aGlzLmdldFByZXZpb3VzRGF5O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXROZXh0RGF0ZUNhbGxiYWNrOiAoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSB0aGlzLmdldE5leHREYXk7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0UHJldmlvdXNSYW5nZUNhbGxiYWNrOiAoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IFtzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBzdHJpbmcgfCBudW1iZXIgfCBEYXRlXSA9IHRoaXMuZ2V0UHJldmlvdXNSYW5nZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0TmV4dFJhbmdlQ2FsbGJhY2s6IChjdXJyZW50U3RhcnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBjdXJyZW50RW5kRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPT4gW3N0cmluZyB8IG51bWJlciB8IERhdGUsIHN0cmluZyB8IG51bWJlciB8IERhdGVdID0gdGhpcy5nZXROZXh0UmFuZ2U7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlQ3VzdG9tRGlzcGxheUNvbnRlbnQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5UHJlZGVmaW5lZERhdGVSYW5nZU5hbWUgPSBmYWxzZVxuXG4gICAgQElucHV0KCkgcHVibGljIHN0eWxlOiAnY2xhc3NpYycgfCAnY29tcGFjdCcgPSAnY2xhc3NpYyc7XG4gICAgQElucHV0KCkgcHVibGljIGNvbXBhY3RTdHlsZURpc3BsYXk6ICdkYXRlJyB8ICdwcmVkZWZpbmVkUmFuZ2UnIHwgJ2JvdGgnID0gJ3ByZWRlZmluZWRSYW5nZSc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0ZUlucHV0RGlzcGxheUZvcm1hdDogc3RyaW5nID0gJ3Nob3J0RGF0ZSc7XG5cbiAgICAvLyAjcmVnaW9uIEFyaWEgaW5wdXRzXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQ29tcG9uZW50IGFyaWEtbGFiZWwuIERlZmF1bHRzIHRvICdEYXRlIHBpY2tlcidcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgY29tcG9uZW50QXJpYUxhYmVsID0gJ0RhdGUgcGlja2VyJ1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUHJlZGVmaW5lZCBkYXRlIHJhbmdlIGRlZmluaXRpb25zIGRyb3Bkb3duIGJ1dHRvbiBhcmlhLWxhYmVsLiBEZWZhdWx0cyB0byAnT3BlbiBwcmVkZWZpbmVkIGRhdGUgcmFuZ2VzIHBhbmUnXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG9wZW5EYXRlUmFuZ2VEZWZpbml0aW9uc0FyaWFMYWJlbCA9ICdPcGVuIHByZWRlZmluZWQgZGF0ZSByYW5nZXMgcGFuZSdcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIE5leHQgcGVyaW9kIGJ1dHRvbiBhcmlhLWxhYmVsLiBEZWZhdWx0IHRvICdOZXh0IHBlcmlvZCdcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbmV4dFBlcmlvZEFyaWFMYWJlbCA9ICdOZXh0IHBlcmlvZCdcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFByZXZpb3VzIHBlcmlvZCBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdHMgdG8gJ1ByZXZpb3VzIHBlcmlvZCdcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcHJldmlvdXNQZXJpb2RBcmlhTGFiZWwgPSAnUHJldmlvdXMgcGVyaW9kJ1xuXG4gICAgLy8gI2VuZHJlZ2lvbiBBUklBIGlucHV0c1xuXG4gICAgQElucHV0KCkgcHVibGljIGxvY2tCZWZvcmVEYXRlPzogRGF0ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9ja0JlZm9yZURhdGVIaW50Pzogc3RyaW5nO1xuXG4gICAgQElucHV0KCkgcHVibGljIHByZXZpb3VzQnV0dG9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbmV4dEJ1dHRvbkRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cblxuICAgIC8vIHB1YmxpYyBwcm9wZXJ0aWVzXG4gICAgcHJldmlvdXNQZXJpb2RJY29uID0gZmFBbmdsZUxlZnQ7XG4gICAgbmV4dFBlcmlvZEljb24gPSBmYUFuZ2xlUmlnaHQ7XG4gICAgY2FsZW5kYXJJY29uID0gZmFDYWxlbmRhcjtcbiAgICB0b0ljb24gPSBmYUFycm93UmlnaHQ7XG4gICAgbG9ja0ljb24gPSBmYUxvY2s7XG5cbiAgICBwcmVkZWZpbmVkRGF0ZVJhbmdlczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlPiA9IFtdO1xuICAgIHByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzZWxlY3RlZERhdGVSYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlO1xuICAgIGRhdGVSYW5nZXM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZT4gPSBbXTtcblxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDE6IHN0cmluZyA9ICcnO1xuICAgIHNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyOiBzdHJpbmcgPSAnJztcblxuICAgIG1pbkRhdGVEZWZhdWx0OiBEYXRlO1xuICAgIG1heERhdGVEZWZhdWx0OiBEYXRlO1xuXG4gICAgc2VsZWN0ZWREYXRlQ2FsZW5kYXI6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHNlbGVjdGVkRGF0ZUludGVybmFsOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gbmV3IERhdGUoKTtcblxuICAgIGRhdGVTdGFydE9sZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xuICAgIGRhdGVTdGFydDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xuICAgIGRhdGVFbmRPbGQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcbiAgICBkYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XG5cbiAgICBwcml2YXRlIF9zaG93RGF0ZXBpY2tlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBnZXQgc2hvd0RhdGVwaWNrZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93RGF0ZXBpY2tlcjtcbiAgICB9XG4gICAgcHVibGljIHNldCBzaG93RGF0ZXBpY2tlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zaG93RGF0ZXBpY2tlciA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNhbGVuZGFyVmlzaWJsZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBzaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaGlkaW5nQ29uZmlybWVkRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2VsZWN0ZWREYXRlRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRVVUlEID0gJ3Nkcy1hcy0nICsgY3J5cHRvLnJhbmRvbVVVSUQoKTtcblxuICAgIC8vIHByaXZhdGUgZmllbGRzXG4gICAgcHJpdmF0ZSBjdXN0b21EYXRlUmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZTtcbiAgICBwcml2YXRlIGluaXRDYWxlbmRhclZhbHVlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBWaWV3Q2hpbGQoJ3NpbmdsZURhdGVQaWNrZXJCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwcml2YXRlIHNpbmdsZURhdGVQaWNrZXJCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVTdGFydEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIHByaXZhdGUgc2VsZWN0ZWREYXRlU3RhcnRCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVFbmRCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwcml2YXRlIHNlbGVjdGVkRGF0ZUVuZEJveDogRHhEYXRlQm94Q29tcG9uZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgQFZpZXdDaGlsZCgnY2FsZW5kYXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBjYWxlbmRhcjpcbiAgICAgICAgfCBEeENhbGVuZGFyQ29tcG9uZW50XG4gICAgICAgIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZX0pXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b246IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNoYW5nZVJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZGF0ZVBpY2tlclNlcnZpY2U6IFNkc0RhdGVQaWNrZXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRGVmaW5pdGlvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLm1pbkRhdGVEZWZhdWx0ID0gbmV3IERhdGUoMTkwMCwgMSwgMSk7XG4gICAgICAgIHRoaXMubWF4RGF0ZURlZmF1bHQgPSBhZGQoc3RhcnRPZkRheShuZXcgRGF0ZSgpKSwgeyB5ZWFyczogNTAgfSk7XG5cbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25zID0ge1xuICAgICAgICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgICAgICAgIGFwcGx5OiAnQXBwbHknLFxuICAgICAgICAgICAgY3VzdG9tOiAnQ3VzdG9tJyxcbiAgICAgICAgICAgIHByZXNldHM6ICdQcmVzZXRzJyxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmN1c3RvbURhdGVSYW5nZSA9IG5ldyBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UoXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b20sXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IHN0YXJ0T2ZNb250aChuZXcgRGF0ZSgpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzdGFydE9mRGF5KGVuZE9mTW9udGgobmV3IERhdGUoKSkpO1xuXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlUmFuZ2VUZXh0KCk7XG5cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHt9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkYXRlUmFuZ2VEZWZpbml0aW9ucyddKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3Rpb25LaW5kJ10pe1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShkYXRlLCBkYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQoZGF0ZSwgZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUxID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZTIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKGRhdGUxLCBkYXRlMik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KGRhdGUxLCBkYXRlMik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWyd0cmFuc2xhdGlvbnMnXSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDdXN0b21UZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlcyddKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUxvY2FsZXNDaGFuZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVTdGFydCddIHx8IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVTdGFydE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQ7XG4gICAgICAgICAgICB0aGlzLmRhdGVFbmRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZUVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShjaGFuZ2VzWydzZWxlY3RlZERhdGUnXS5jdXJyZW50VmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc3RhcnRPZkRheSh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbDtcblxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgJiYgdGhpcy5zaG93RGF0ZXBpY2tlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTYW1lRGF5KHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZUVuZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcihzZWxlY3RlZFZhbHVlLCB0aGlzLmRhdGVFbmQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXI/Lmluc3RhbmNlPy5yZXBhaW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEeERlZmF1bHRDYWxlbmRhckZvY3VzKCk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dCh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZUVuZEZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTYW1lRGF5KHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZVN0YXJ0KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FmdGVyKHRoaXMuZGF0ZVN0YXJ0LCBzZWxlY3RlZFZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHNlbGVjdGVkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydmaXJzdERheU9mV2VlayddKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIHJhbmRvbUlkUmVmZXJlbmNlOiBudW1iZXIgPSBNYXRoLmZsb29yKFxuICAgICAgICBNYXRoLnJhbmRvbSgpICogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICApO1xuXG4gICAgcHVibGljIHNldERhdGVSYW5nZURlZmluaXRpb25zKGRlZmluaXRpb25zOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uPik6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGVSYW5nZURlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOiBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VzdG9tVGV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2NhbGVzKGxvY2FsZXM6IHN0cmluZyB8IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2NhbGVzID0gbG9jYWxlcztcbiAgICAgICAgdGhpcy5oYW5kbGVMb2NhbGVzQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZERhdGVTdGFydEZvY3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVGb2N1cztcbiAgICB9XG4gICAgcHVibGljIGdldCBzZWxlY3RlZERhdGVFbmRGb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNNaW5pbXVtTGltaXQoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKSB8fFxuICAgICAgICAgICAgICAgIGlzQmVmb3JlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWluRGF0ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNNYXhpbXVtTGltaXQoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubWF4RGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5tYXhEYXRlKSB8fFxuICAgICAgICAgICAgICAgIGlzQWZ0ZXIodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5tYXhEYXRlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGF0ZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZERhdGVGcm9tRXZlbnQgPSBuZXcgRGF0ZShldmVudC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDaGFuZ2UgPSBldmVudC5ldmVudDtcblxuICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0YXJ0RGF0ZUNoYW5nZShzZWxlY3RlZERhdGVGcm9tRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmRGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVuZERhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlRnJvbUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlU3RhcnREYXRlQ2hhbmdlKG5ld0RhdGU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IG5ld0RhdGU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXdEYXRlO1xuXG4gICAgICAgIGlmICghdGhpcy5pbml0Q2FsZW5kYXJWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoaXNBZnRlcihuZXdEYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBhcyBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gbmV3RGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVFbmREYXRlQ2hhbmdlKG5ld0RhdGU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBuZXdEYXRlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3RGF0ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBkYXRlIGlzIGJlZm9yZSBzdGFydCBkYXRlIC0+IHNldCBzdGFydCBkYXRlXG4gICAgICAgICAgICBpc0JlZm9yZShuZXdEYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGFzIERhdGUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gbmV3RGF0ZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblN0YXJ0RGF0ZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU3RhcnREYXRlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcblxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRW5kRGF0ZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShldmVudC52YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJhbmdlS2V5UmVsZWFzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ0RhdGVSYW5nZShyYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TdGFydERhdGVGb2N1cygpIHtcbiAgICAgICAgdGhpcy5pbml0Q2FsZW5kYXJWYWx1ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENhbGVuZGFyVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRW5kRGF0ZUZvY3VzKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseVBlcmlvZFBpY2tlcigpIHtcbiAgICAgICAgdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNob3dpbmdDYWxlbmRhclBvcG92ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlkaW5nQ29uZmlybWVkRGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlRGF0ZVBpY2tlckJveD8uaW5zdGFuY2UuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkID0gdGhpcy5zZWxlY3RlZERhdGVFbmQ7XG4gICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydEJveD8uaW5zdGFuY2UuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uU3RhcnREYXRlRm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VEYXRlcGlja2VyUG9wdXAoZW1pdENoYW5nZSA9IHRydWUpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuc2hvd0RhdGVwaWNrZXIpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCxcbiAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnRPbGQsIHRoaXMuZGF0ZUVuZE9sZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHRoaXMuZGF0ZVN0YXJ0T2xkLCB0aGlzLmRhdGVFbmRPbGQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERhdGVSYW5nZUJ1dHRvbil7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cyh7Zm9jdXNWaXNpYmxlOiBmYWxzZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGlkZGVuQ2FsZW5kYXJQb3BvdmVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsb3NlRGF0ZXBpY2tlclBvcHVwKClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2VsZWN0ZWREYXRlKFxuICAgICAgICBkYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXG4gICAgICAgIGRhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXG4gICAgICAgIGVtaXRDaGFuZ2UgPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBkYXRlU3RhcnQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gZGF0ZUVuZDtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gdGhpcy5zZWxlY3Rpb25LaW5kID09PSAnc2luZ2xlJyA/IGRhdGVTdGFydCA6IGRhdGVFbmQ7XG5cbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChlbWl0Q2hhbmdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RhcnROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlRW5kTmV3ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmRhdGVTdGFydE9sZCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzU2FtZURheSh0aGlzLmRhdGVTdGFydE9sZCwgZGF0ZVN0YXJ0TmV3KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGVTdGFydE9sZCA9PT0gJ3N0cmluZycgJiYgdGhpcy5kYXRlU3RhcnRPbGQgPT09ICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmRhdGVFbmRPbGQgaW5zdGFuY2VvZiBEYXRlICYmICFpc1NhbWVEYXkodGhpcy5kYXRlRW5kT2xkLCBkYXRlRW5kTmV3KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGVFbmRPbGQgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0ZUVuZE9sZCA9PT0gJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlbmREYXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmRPbGQgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGVDaGFuZ2VkIHx8IGVuZERhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQ2hhbmdlLmVtaXQoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ29Ub05leHREYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5nZXROZXh0RGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUobmV3RGF0ZSwgbmV3RGF0ZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fCAhKHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXROZXh0UmFuZ2VDYWxsYmFjayhcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnb1RvUHJldmlvdXNEYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5nZXRQcmV2aW91c0RhdGVDYWxsYmFjayh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUpIHx8ICEodGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFByZXZpb3VzUmFuZ2VDYWxsYmFjayhcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHB1YmxpYyBzZXROZXh0UHJldmlvdXNEYXkoc2V0TmV4dDogYW55KSB7XG4gICAgLy8gICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xuICAgIC8vICAgICBsZXQgbmV3RGF0ZSA9IHNldE5leHRcbiAgICAvLyAgICAgICAgID8gYWRkKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgYXMgRGF0ZSwgeyBkYXlzOiAxIH0pXG4gICAgLy8gICAgICAgICA6IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XG5cbiAgICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKG5ld0RhdGUpO1xuICAgIC8vICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShuZXdEYXRlLCBuZXdEYXRlKTtcbiAgICAvLyB9XG5cbiAgICBwdWJsaWMgZ2V0TmV4dERheShjdXJyZW50RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IHN0cmluZyB8IG51bWJlciB8IERhdGUge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogMSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJldmlvdXNEYXkoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhZGQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBhcyBEYXRlLCB7IGRheXM6IC0xIH0pO1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldE5leHRSYW5nZShjdXJyZW50U3RhcnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBjdXJyZW50RW5kRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IFtzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBzdHJpbmcgfCBudW1iZXIgfCBEYXRlXSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcbiAgICAgICAgICAgIG5ldyBEYXRlKGN1cnJlbnRTdGFydERhdGUpLFxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudEVuZERhdGUpLFxuICAgICAgICAgICAgJ25leHQnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFByZXZpb3VzUmFuZ2UoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0ge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UmFuZ2UoXG4gICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50U3RhcnREYXRlKSxcbiAgICAgICAgICAgIG5ldyBEYXRlKGN1cnJlbnRFbmREYXRlKSxcbiAgICAgICAgICAgICdwcmV2aW91cydcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TmV4dFByZXZpb3VzUmFuZ2Uoc2V0TmV4dDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgISh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSkgfHxcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcbiAgICAgICAgICAgIHNldE5leHQgPyAnbmV4dCcgOiAncHJldmlvdXMnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENlbGxDc3NDbGFzcyhkYXRlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIGxldCBjc3MgPSAnJztcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlRW5kQXNEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNBZnRlcihjYWxlbmRhckRhdGUsIHN0YXJ0T2ZEYXkoc2VsZWN0ZWREYXRlU3RhcnRBc0RhdGUpKSAmJlxuICAgICAgICAgICAgICAgIGlzQmVmb3JlKGNhbGVuZGFyRGF0ZSwgc3RhcnRPZkRheShzZWxlY3RlZERhdGVFbmRBc0RhdGUpKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBkYXkpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeS1saWdodCB0ZXh0LWRhcmsgcm91bmRlZC0wJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZURheShjYWxlbmRhckRhdGUsIHNlbGVjdGVkRGF0ZVN0YXJ0QXNEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1zdGFydCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBzZWxlY3RlZERhdGVFbmRBc0RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLWVuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjc3M7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEVuZERhdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09IFwicGVyaW9kXCIgJiYgdGhpcy5zZWxlY3RlZERhdGVTdGFydEZvY3VzICYmIHRoaXMuY2FsZW5kYXJDZWxsQ2xpY2tlZChldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KXtcblxuICAgICAgICBpZiAodGhpcy5zaG93RGF0ZXBpY2tlcikge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jb2RlID09PSAnRW50ZXInIHx8IGV2ZW50LmNvZGUgPT09ICdOdW1wYWRFbnRlcicpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVBlcmlvZFBpY2tlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsZW5kYXJDZWxsQ2xpY2tlZChldmVudDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggY3VycmVudCBEWCBpbXBsZW1lbnRhdGlvbiBzbyBpdFxuICAgICAgICAvLyBtdXN0IGJlIHJlLWNoZWNrZWQgYWZ0ZXIgZWFjaCBtYWpvciB1cGRhdGUgb2YgdGhlIERYIGNvbXBvbmVudHNcbiAgICAgICAgLy8gQWxzbyBjaGVjayBpZiBkeC1jYWxlbmRhciBwcm92aWRlcyBpbmZvIGFib3V0IGNsaWNrZWQgZWxlbWVudCBieVxuICAgICAgICAvLyBkZXNpZ24uXG4gICAgICAgIGNvbnN0IHRhcmdldFBhcmVudENsYXNzTGlzdCA9IGV2ZW50LnRhcmdldD8ub2Zmc2V0UGFyZW50Py5jbGFzc0xpc3Q7XG4gICAgICAgIGlmICghdGFyZ2V0UGFyZW50Q2xhc3NMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNDYWxlbmRhckNlbGwgPSBbLi4udGFyZ2V0UGFyZW50Q2xhc3NMaXN0XS5pbmNsdWRlcygnZHgtY2FsZW5kYXItY2VsbCcpO1xuICAgICAgICByZXR1cm4gaXNDYWxlbmRhckNlbGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVMb2NhbGVzQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyBhcHBseSBuZXcgbG9jYWxlIHRvIERYXG4gICAgICAgIC8vIGlmIGFycmF5IG9mIGxvY2FsZXMgd2FzIHByb3ZpZGVkIHVzZSBmaXJzdCBvbmVcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2FsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMubG9jYWxlcykgJiYgdGhpcy5sb2NhbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvY2FsZSh0aGlzLmxvY2FsZXNbMF0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Qm94Py5pbnN0YW5jZS5yZXBhaW50KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kQm94Py5pbnN0YW5jZS5yZXBhaW50KCk7XG4gICAgICAgIHRoaXMuc2luZ2xlRGF0ZVBpY2tlckJveD8uaW5zdGFuY2UucmVwYWludCgpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyPy5pbnN0YW5jZS5yZXBhaW50KCk7XG5cbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUN1c3RvbVRleHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VzdG9tRGF0ZVJhbmdlLm5hbWUgPSB0aGlzLnRyYW5zbGF0aW9ucz8uY3VzdG9tXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRpb25zLmN1c3RvbVxuICAgICAgICAgICAgOiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgJyNkYXRlcGlja2VyY29tcG9uZW50IC5keC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkeC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LnJlbW92ZSgnZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKXtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKSwgbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCkpO1xuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkpO1xuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZURhdGVSYW5nZVNlbGVjdG9yVmlzaWJpbGl0eSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9XG4gICAgICAgICAgICAhdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdEYXRlUmFuZ2UocmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZSkge1xuICAgICAgICB0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHJhbmdlO1xuXG4gICAgICAgIGlmIChyYW5nZSA9PT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMub3BlbkRhdGVwaWNrZXJQb3B1cCgpO1xuICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHJhbmdlLmRhdGVGcm9tXG4gICAgICAgICAgICAgICAgPyByYW5nZS5kYXRlRnJvbVxuICAgICAgICAgICAgICAgIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHJhbmdlLmRhdGVUbyA/IHJhbmdlLmRhdGVUbyA6IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XG4gICAgICAgICAgICB0aGlzLnByZWRlZmluZWRSYW5nZVNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnQsIHRoaXMuZGF0ZUVuZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNEYXRlRGlzYWJsZWQgPSAoYXJnczogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvY2tCZWZvcmVEYXRlICYmIGlzQmVmb3JlKGFyZ3MuZGF0ZSwgdGhpcy5sb2NrQmVmb3JlRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoYXJncy5kYXRlLCBkYXkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hdGNoRGF0ZVJhbmdlKGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGVGcm9tIHx8ICFkYXRlVG8pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB0aGlzLmN1c3RvbURhdGVSYW5nZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKCk7XG5cbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlcy5maWx0ZXIoXG4gICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoeC5kYXRlRnJvbSBhcyBEYXRlLCBkYXRlRnJvbSkgJiZcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoeC5kYXRlVG8gYXMgRGF0ZSwgZGF0ZVRvKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IGRhdGVSYW5nZVswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB0aGlzLmN1c3RvbURhdGVSYW5nZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGF0ZVJhbmdlVGV4dChkYXRlRnJvbT86IERhdGUsIGRhdGVUbz86IERhdGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gJyc7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcblxuICAgICAgICBpZiAoIShkYXRlRnJvbSBpbnN0YW5jZW9mIERhdGUpIHx8ICEoZGF0ZVRvIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJFU09MVkUgUEVSSU9EXG4gICAgICAgIC8vIG9uZSBkYXlcbiAgICAgICAgaWYgKGlzU2FtZURheShkYXRlRnJvbSwgZGF0ZVRvKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpbmdsZURheUZvcm1hdEZuICE9PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuc2luZ2xlRGF5Rm9ybWF0Rm4oZGF0ZUZyb20pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdib3RoJyAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgIT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlRnJvbSk7ICAvL3NraXAgZGF5IG5hbWUsIGFzIHdlIGhhdmUgY3VzdG9tIHRleHQuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlRnJvbSwgJ2RheS1sb25nJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRhdGUgcmFuZ2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIC0gdXNlIHByb3ZpZGVkIGRhdGVSYW5nZSBmb3JtYXQgZnVuY3Rpb24gKGlmIGRlZmluZWQpXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0ZVJhbmdlRm9ybWF0Rm4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZGF0ZVJhbmdlRm9ybWF0Rm4oZGF0ZUZyb20pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSB0aGlzLmRhdGVSYW5nZUZvcm1hdEZuKGRhdGVUbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmdWxsIG1vbnRoXG4gICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZUZyb20sIHN0YXJ0T2ZNb250aChkYXRlRnJvbSkpICYmXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KGRhdGVUbywgZW5kT2ZNb250aChkYXRlVG8pKSAmJlxuICAgICAgICAgICAgICAgIGlzU2FtZU1vbnRoKGRhdGVGcm9tLCBkYXRlVG8pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5mb3JtYXREYXRlKFxuICAgICAgICAgICAgICAgICAgICBkYXRlRnJvbSxcbiAgICAgICAgICAgICAgICAgICAgJ21vbnRoJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIC0gdXNlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgZnVuY3Rpb25cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVZZWFyKGRhdGVGcm9tLCB0b2RheSkgPyAnZGF5LXNob3J0JyA6ICdkYXknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5mb3JtYXREYXRlKFxuICAgICAgICAgICAgICAgICAgICBkYXRlVG8sXG4gICAgICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZVRvLCB0b2RheSkgPyAnZGF5LXNob3J0JyA6ICdkYXknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlID09ICdjb21wYWN0JyAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgIT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RTdHlsZURpc3BsYXkgPT0gJ3ByZWRlZmluZWRSYW5nZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UubmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MiA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdib3RoJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VOYW1lID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lICsgJywgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgc3R5bGU6ICdjbGFzc2ljJyB8ICdjb21wYWN0JyA9ICdjbGFzc2ljJztcbiAgICAgICAgLy8gQElucHV0KCkgcHVibGljIGNvbXBhY3RTdHlsZURpc3BsYXk6ICdkYXRlJyB8ICdwcmVkZWZpbmVkUmFuZ2UnIHwgJ2JvdGgnID0gJ3ByZWRlZmluZWRSYW5nZSc7XG4gICAgICAgIC8vIGlmICh0aGlzLnN0eWxlID09ICdjb21wYWN0JyAmJiB0aGlzLmNvbXBhY3RTdHlsZURpc3BsYXkgPT0gJ3ByZWRlZmluZWRSYW5nZScgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lO1xuICAgICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MiA9ICcnO1xuICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmICh0aGlzLnN0eWxlID09ICdjb21wYWN0JyAmJiB0aGlzLmNvbXBhY3RTdHlsZURpc3BsYXkgPT0gJ2JvdGgnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xuICAgICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UubmFtZTtcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcbiAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0RGF0ZShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgdHlwZT86ICdtb250aCcgfCAnZGF5JyB8ICdkYXktbG9uZycgfCAnZGF5LXNob3J0JyB8IHVuZGVmaW5lZFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICBkYXk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ2RheS1sb25nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICBtb250aDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ2RheS1zaG9ydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xuICAgICAgICAgICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVEYXRlUmFuZ2VzKGZvcmNlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCB0b2RheSA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZm9yY2UgfHxcbiAgICAgICAgICAgICF0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSB8fFxuICAgICAgICAgICAgIWlzU2FtZURheSh0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSwgdG9kYXkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUgPSB0b2RheTtcblxuICAgICAgICAgICAgdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlcyA9XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRQcmVkZWZpbmVkRGF0ZVJhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgdG9kYXksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REYXlPZldlZWtcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZXMgPSBbLi4udGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc107XG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZXMucHVzaCh0aGlzLmN1c3RvbURhdGVSYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIG1ldGhvZHNcbn1cbiIsIjwhLS0gPGRpdiBpZD1cImRhdGVwaWNrZXJidXR0b25zXCI+IC0tPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyIGQtaW5saW5lLWZsZXggYmctd2hpdGUgc2RzLW5vLXByaW50XCJcbiAgICAgICAgcm9sZT1cImdyb3VwXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb21wb25lbnRBcmlhTGFiZWxcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgID5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGUgPT0gJ2NsYXNzaWMnXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZ3JvdXBcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cInBpY2tlclByZWRlZmluZWRSYW5nZURyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ0biBidG4td2hpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRlZC1zdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgcC0wXG4gICAgICAgICAgICAgICAgICAgICAgICBzZHMtZnctNDAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcy0yIG1zLTEgbWUtMSBkYXRlLXJhbmdlLXRleHQgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWREYXRlUmFuZ2UubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBkYXRlLXJhbmdlLWRyb3Bkb3duLWJ1dHRvbiBzZHMtZnctNDAwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJvcGVuRGF0ZVJhbmdlRGVmaW5pdGlvbnNBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJlbGVtZW50VVVJRCArICdfcHJlZGVmaW5lZF9wZXJpb2RzX2Ryb3Bkb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8ZHgtcG9wb3ZlclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZWxlbWVudFVVSUQgKyAnX3ByZWRlZmluZWRfcGVyaW9kc19kcm9wZG93bidcIlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCIjcGlja2VyUHJlZGVmaW5lZFJhbmdlRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICAgICAgWyh2aXNpYmxlKV09XCJzaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICAgIFt3cmFwcGVyQXR0cl09XCJ7IGNsYXNzOiAnc2RzLWRhdGVwaWNrZXItcmFuZ2VzLXBvcG92ZXIgc2RzLWR4LXBvcHVwLW5vLWFycm93JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgW21pbldpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCIgY2RrVHJhcEZvY3VzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmFuZ2Ugb2YgZGF0ZVJhbmdlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJlZGVmaW5lZC1kYXRlLXJhbmdlIHB4LTMgcHktMiB3LTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdEYXRlUmFuZ2UocmFuZ2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25SYW5nZUtleVJlbGVhc2VkKCRldmVudCwgcmFuZ2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyYW5nZS5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2R4LXBvcG92ZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgYm9yZGVyLWVuZC0wIHBlLTIgc2RzLWZ3LTQwMFwiXG4gICAgICAgICAgICBbY2xhc3Mucm91bmRlZC1zdGFydF0gPSBcInN0eWxlID09ICdjb21wYWN0JyB8fCAoIWRhdGVSYW5nZURlZmluaXRpb25zIHx8IGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMClcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zdGFydC0wXSA9IFwic3R5bGUgPT0gJ2NsYXNzaWMnICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInByZXZpb3VzUGVyaW9kQXJpYUxhYmVsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01pbmltdW1MaW1pdCB8fCBkaXNhYmxlZCB8fCBwcmV2aW91c0J1dHRvbkRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNEYXRlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcmV2aW91c1BlcmlvZEljb25cIj48L2ZhLWljb24+XG5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uXG4gICAgICAgICAgICBpZD1cInBpY2tlckRyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGJvcmRlci10b3AgYm9yZGVyLWJvdHRvbSB0ZXh0LXRydW5jYXRlIHB4LTAgc2VsZWN0ZWQtcGVyaW9kIHNkcy1mdy00MDBcIlxuICAgICAgICAgICAgW2NsYXNzLnJvdW5kZWQtc3RhcnRdID0gXCIoIWRhdGVSYW5nZURlZmluaXRpb25zIHx8IGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMCkgJiYgIXNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc3RhcnRdID0gXCIoIWRhdGVSYW5nZURlZmluaXRpb25zIHx8IGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMCkgJiYgIXNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcbiAgICAgICAgICAgIFtjbGFzcy5yb3VuZGVkLWVuZF0gPSBcIiFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWVuZF0gPSBcIiFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVwaWNrZXIgPSAhc2hvd0RhdGVwaWNrZXJcIlxuICAgICAgICA+XG5cbiAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwidXNlQ3VzdG9tRGlzcGxheUNvbnRlbnRcIiBzZWxlY3Q9XCJkaXNwbGF5XCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiF1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImNhbGVuZGFySWNvblwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTEgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlTmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXgtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ0b0ljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGJvcmRlciByb3VuZGVkLWVuZCBib3JkZXItc3RhcnQtMCBwcy0yIHNkcy1mdy00MDBcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5leHRQZXJpb2RBcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWF4aW11bUxpbWl0IHx8IGRpc2FibGVkIHx8IG5leHRCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHREYXRlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJuZXh0UGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2RzLXByaW50LW9ubHkgaC0xMDBcIj5cblxuICAgICAgICA8bmctY29udGVudCAqbmdJZj1cInVzZUN1c3RvbURpc3BsYXlDb250ZW50XCIgc2VsZWN0PVwiZGlzcGxheVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiF1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiXG4gICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXgtMVwiPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImNhbGVuZGFySWNvblwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0xIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGZhLWljb25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MlwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXgtMlwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInRvSWNvblwiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjxkeC1wb3BvdmVyXG4gICAgdGFyZ2V0PVwiI3BpY2tlckRyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxuICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICBbKHZpc2libGUpXT1cInNob3dEYXRlcGlja2VyXCJcbiAgICAob25IaWRpbmcpPVwib25IaWRkZW5DYWxlbmRhclBvcG92ZXIoKVwiXG4gICAgKG9uU2hvd2luZyk9XCJvblNob3dpbmdDYWxlbmRhclBvcG92ZXIoKVwiXG4gICAgY2xhc3M9XCJtLTAgcC0wXCJcbiAgICBbd3JhcHBlckF0dHJdPVwie1xuICAgICAgICBjbGFzczogJ3Nkcy1kYXRlcGlja2VyLXBvcG92ZXIgc2RzLWR4LXBvcHVwLW5vLWFycm93ICcgKyBkcm9wZG93bldyYXBwZXJDbGFzcyxcbiAgICAgICAgaWQ6IGRyb3Bkb3duV3JhcHBlcklkXG4gICAgfVwiXG4+XG4gICAgPGR4by1hbmltYXRpb24+XG4gICAgICAgIDxkeG8tc2hvd1xuICAgICAgICAgICAgdHlwZT1cInBvcFwiXG4gICAgICAgICAgICBbZnJvbV09XCJ7IHNjYWxlOiAwLjkgfVwiXG4gICAgICAgICAgICBbdG9dPVwieyBzY2FsZTogMSB9XCJcbiAgICAgICAgPjwvZHhvLXNob3c+XG4gICAgICAgIDxkeG8taGlkZVxuICAgICAgICAgICAgdHlwZT1cImZhZGVcIlxuICAgICAgICAgICAgW2Zyb21dPVwiMVwiXG4gICAgICAgICAgICBbdG9dPVwiMFwiXG4gICAgICAgID48L2R4by1oaWRlPlxuICAgIDwvZHhvLWFuaW1hdGlvbj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCIgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIiB0YWJpbmRleD1cIjFcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0eWxlID09ICdjb21wYWN0JyAmJiBkYXRlUmFuZ2VzLmxlbmd0aCA+IDFcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbXBhY3QtbW9kZS1kYXRlLXJhbmdlcy1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1ncmF5LTEwMFwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tYnMtZ3JheS0yMDApXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRyYW5zbGF0aW9ucy5wcmVzZXRzXCIgY2xhc3M9XCJweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyB0cmFuc2xhdGlvbnMucHJlc2V0cyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByYW5nZSBvZiBkYXRlUmFuZ2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcmVkZWZpbmVkLWRhdGUtcmFuZ2UgcHgtMyBweS0yIHctMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicmFuZ2UgPT09IHNlbGVjdGVkRGF0ZVJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdEYXRlUmFuZ2UocmFuZ2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7cmFuZ2UubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJkYXRlcGlja2VyY29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZGF0ZS1pbnB1dHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHB4LTMgcHQtMyBwYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVN0YXJ0Qm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cInNlbGVjdGVkRGF0ZUZvY3VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlTWFza0JlaGF2aW9yXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJkYXRlSW5wdXREaXNwbGF5Rm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGUgfHwgbWluRGF0ZURlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWREYXRlU3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25TdGFydERhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzSW4pPVwib25TdGFydERhdGVGb2N1cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ0b0ljb25cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1kYXRlLWJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlRW5kQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cIiFzZWxlY3RlZERhdGVGb2N1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUlucHV0RGlzcGxheUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRGF0ZUVuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkVuZERhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzSW4pPVwib25FbmREYXRlRm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLXdoaXRlIG14LTIgcHgtMiBweS0yIGRhdGUtcGlja2VyLWRhdGUtc2VsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZGF0ZS1pbnB1dHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2luZ2xlRGF0ZVBpY2tlckJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkIGRhdGVwaWNrZXItaW5wdXQgZGF0ZXBpY2tlci1pbnB1dC1sYXJnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImRhdGVJbnB1dERpc3BsYXlGb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4RGF0ZSB8fCBtYXhEYXRlRGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWxlY3RlZERhdGVJbnRlcm5hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAob25WYWx1ZUNoYW5nZWQpPVwiIGNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RFbmREYXRlKCRldmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZXNdPVwiaXNEYXRlRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnID8gc2VsZWN0ZWREYXRlQ2FsZW5kYXIgOiBzZWxlY3RlZERhdGVJbnRlcm5hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkRhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaXJzdERheU9mV2Vla109XCJmaXJzdERheU9mV2Vla1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHhUZW1wbGF0ZT1cImxldCBjZWxsRGF0YSBvZiAnY2VsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidoLTEwMCBwdC0xJyArIGdldENlbGxDc3NDbGFzcyhjZWxsRGF0YS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGluZS1oZWlnaHQucHhdPVwiMjNcIlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9ja0JlZm9yZURhdGUgJiYgKGNlbGxEYXRhLmRhdGUgfCBzZHNEYXRlQ29tcGFyZTogbG9ja0JlZm9yZURhdGUgOiAnbHRlJyk7IHRoZW4gdGhlbkxvY2tCbG9jayBlbHNlIGVsc2VEZWZhdWx0QmxvY2tcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGhlbkxvY2tCbG9jaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbdGl0bGVdPVwibG9ja0JlZm9yZURhdGVIaW50XCIgW2ljb25dPVwibG9ja0ljb25cIiAgY2xhc3M9XCJsb2NrZWQtZGF5IHBvc2l0aW9uLWFic29sdXRlLXhcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlRGVmYXVsdEJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGxEYXRhLnRleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtMyBwdC0yIHBiLTNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZHMtYnRuLXNlY29uZGFyeSBzZHMtZnctNDAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZXBpY2tlciA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbnMuY2FuY2VsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoY2xpY2spPVwiY2xvc2VEYXRlcGlja2VyUG9wdXAoKVwiIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RzLWJ0bi1wcmltYXJ5IG1zLTEgc2RzLWZ3LTQwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQZXJpb2RQaWNrZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25zLmFwcGx5fX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3BvdmVyPlxuPCEtLSA8L2Rpdj4gLS0+XG5cbiJdfQ==