@ethlete/cdk 4.48.0 → 4.49.0

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 (657) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/fesm2022/ethlete-cdk.mjs +964 -880
  3. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  4. package/lib/components/bracket/components/new-bracket/bracket-new.d.ts +1620 -0
  5. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_DOUBLE_SYNC.d.ts +149 -0
  6. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_SINGLE.d.ts +184 -0
  7. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_SWISS.d.ts +214 -0
  8. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATE_DOUBLE_ASYNC.d.ts +149 -0
  9. package/lib/components/bracket/stories/dummy-data/FIFA_DUMMY_DATA_DOUBLE.d.ts +1640 -0
  10. package/lib/components/bracket/stories/dummy-data/FIFA_DUMMY_DATA_SINGLE.d.ts +2388 -0
  11. package/lib/components/bracket/stories/dummy-data/index.d.ts +6 -0
  12. package/lib/components/forms/utils/decorated-form-field.base.d.ts +1 -1
  13. package/lib/components/forms/utils/decorated-input.base.d.ts +1 -1
  14. package/lib/components/forms/utils/input.base.d.ts +1 -1
  15. package/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.d.ts +1 -1
  16. package/lib/components/overlay/components/dialog/services/dialog-base.service.d.ts +1 -1
  17. package/lib/components/query-error/directives/query-error/query-error.directive.d.ts +1 -1
  18. package/lib/components/tabs/utils/paginated-tab-header.directive.d.ts +1 -1
  19. package/package.json +8 -10
  20. package/esm2022/ethlete-cdk.mjs +0 -5
  21. package/esm2022/index.mjs +0 -24
  22. package/esm2022/lib/components/accordion/accordion.imports.mjs +0 -15
  23. package/esm2022/lib/components/accordion/components/accordion/accordion.component.animations.mjs +0 -9
  24. package/esm2022/lib/components/accordion/components/accordion/accordion.component.constants.mjs +0 -3
  25. package/esm2022/lib/components/accordion/components/accordion/accordion.component.mjs +0 -76
  26. package/esm2022/lib/components/accordion/components/accordion/index.mjs +0 -4
  27. package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +0 -53
  28. package/esm2022/lib/components/accordion/components/accordion-group/index.mjs +0 -2
  29. package/esm2022/lib/components/accordion/partials/accordion-hint/accordion-hint.directive.mjs +0 -17
  30. package/esm2022/lib/components/accordion/partials/accordion-hint/index.mjs +0 -2
  31. package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.constants.mjs +0 -3
  32. package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.mjs +0 -20
  33. package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/index.mjs +0 -3
  34. package/esm2022/lib/components/accordion/partials/accordion-label/accordion-label.directive.mjs +0 -17
  35. package/esm2022/lib/components/accordion/partials/accordion-label/index.mjs +0 -2
  36. package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.constants.mjs +0 -3
  37. package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.mjs +0 -20
  38. package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/index.mjs +0 -3
  39. package/esm2022/lib/components/accordion/public-api/index.mjs +0 -8
  40. package/esm2022/lib/components/bracket/bracket.imports.mjs +0 -5
  41. package/esm2022/lib/components/bracket/components/bracket/bracket.component.mjs +0 -333
  42. package/esm2022/lib/components/bracket/components/bracket/bracket.component.types.mjs +0 -2
  43. package/esm2022/lib/components/bracket/components/bracket/index.mjs +0 -3
  44. package/esm2022/lib/components/bracket/components/new-bracket/bracket-new.mjs +0 -942
  45. package/esm2022/lib/components/bracket/components/new-bracket/draw-man.mjs +0 -197
  46. package/esm2022/lib/components/bracket/components/new-bracket/grid-definitions.mjs +0 -47
  47. package/esm2022/lib/components/bracket/components/new-bracket/grid-placements.mjs +0 -105
  48. package/esm2022/lib/components/bracket/components/new-bracket/index.mjs +0 -8
  49. package/esm2022/lib/components/bracket/components/new-bracket/journey-highlight.mjs +0 -18
  50. package/esm2022/lib/components/bracket/components/new-bracket/new-bracket-default-match.component.mjs +0 -17
  51. package/esm2022/lib/components/bracket/components/new-bracket/new-bracket-default-round-header.component.mjs +0 -16
  52. package/esm2022/lib/components/bracket/components/new-bracket/new-bracket.component.mjs +0 -107
  53. package/esm2022/lib/components/bracket/constants/bracket.constants.mjs +0 -12
  54. package/esm2022/lib/components/bracket/constants/index.mjs +0 -2
  55. package/esm2022/lib/components/bracket/directives/bracket-match/bracket-match.directive.mjs +0 -19
  56. package/esm2022/lib/components/bracket/directives/bracket-match/index.mjs +0 -2
  57. package/esm2022/lib/components/bracket/directives/bracket-round/bracket-round.directive.mjs +0 -19
  58. package/esm2022/lib/components/bracket/directives/bracket-round/index.mjs +0 -2
  59. package/esm2022/lib/components/bracket/partials/bracket-match/bracket-match.component.mjs +0 -19
  60. package/esm2022/lib/components/bracket/partials/bracket-match/index.mjs +0 -2
  61. package/esm2022/lib/components/bracket/partials/bracket-round-header/bracket-round-header.component.mjs +0 -19
  62. package/esm2022/lib/components/bracket/partials/bracket-round-header/index.mjs +0 -2
  63. package/esm2022/lib/components/bracket/public-api/index.mjs +0 -14
  64. package/esm2022/lib/components/bracket/types/bracket-config.types.mjs +0 -2
  65. package/esm2022/lib/components/bracket/types/bracket.types.mjs +0 -2
  66. package/esm2022/lib/components/bracket/types/index.mjs +0 -3
  67. package/esm2022/lib/components/bracket/utils/bracket-config.utils.mjs +0 -13
  68. package/esm2022/lib/components/bracket/utils/bracket.utils.mjs +0 -339
  69. package/esm2022/lib/components/bracket/utils/index.mjs +0 -3
  70. package/esm2022/lib/components/button/button.imports.mjs +0 -4
  71. package/esm2022/lib/components/button/components/button/button.component.mjs +0 -18
  72. package/esm2022/lib/components/button/components/button/index.mjs +0 -2
  73. package/esm2022/lib/components/button/components/query-button/index.mjs +0 -2
  74. package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +0 -26
  75. package/esm2022/lib/components/button/directives/button/button.directive.mjs +0 -69
  76. package/esm2022/lib/components/button/directives/button/index.mjs +0 -2
  77. package/esm2022/lib/components/button/directives/query-button/index.mjs +0 -2
  78. package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +0 -136
  79. package/esm2022/lib/components/button/public-api/index.mjs +0 -6
  80. package/esm2022/lib/components/carousel/carousel.component.mjs +0 -51
  81. package/esm2022/lib/components/carousel/carousel.directive.mjs +0 -150
  82. package/esm2022/lib/components/carousel/carousel.imports.mjs +0 -12
  83. package/esm2022/lib/components/carousel/controls/carousel-item-nav.component.mjs +0 -64
  84. package/esm2022/lib/components/carousel/controls/carousel-item-nav.directive.mjs +0 -34
  85. package/esm2022/lib/components/carousel/controls/carousel-next-button.directive.mjs +0 -45
  86. package/esm2022/lib/components/carousel/controls/carousel-previous-button.directive.mjs +0 -45
  87. package/esm2022/lib/components/carousel/controls/carousel-toggle-auto-play-button.directive.mjs +0 -43
  88. package/esm2022/lib/components/carousel/controls/index.mjs +0 -6
  89. package/esm2022/lib/components/carousel/et-carousel-item.component.mjs +0 -24
  90. package/esm2022/lib/components/carousel/et-carousel-item.directive.mjs +0 -46
  91. package/esm2022/lib/components/carousel/public-api/index.mjs +0 -7
  92. package/esm2022/lib/components/filter/public-api/index.mjs +0 -7
  93. package/esm2022/lib/components/filter/rich-filter/components/rich-filter-host/index.mjs +0 -2
  94. package/esm2022/lib/components/filter/rich-filter/components/rich-filter-host/rich-filter-host.component.mjs +0 -70
  95. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button/index.mjs +0 -2
  96. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button/rich-filter-button.directive.mjs +0 -32
  97. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button-slot/index.mjs +0 -2
  98. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button-slot/rich-filter-button-slot.directive.mjs +0 -32
  99. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-content/index.mjs +0 -2
  100. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-content/rich-filter-content.directive.mjs +0 -32
  101. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-top/index.mjs +0 -2
  102. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-top/rich-filter-top.directive.mjs +0 -29
  103. package/esm2022/lib/components/filter/rich-filter/rich-filter.imports.mjs +0 -13
  104. package/esm2022/lib/components/forms/components/checkbox/checkbox.imports.mjs +0 -13
  105. package/esm2022/lib/components/forms/components/checkbox/components/checkbox/checkbox.component.mjs +0 -24
  106. package/esm2022/lib/components/forms/components/checkbox/components/checkbox/index.mjs +0 -2
  107. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/checkbox-field.component.mjs +0 -47
  108. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/index.mjs +0 -2
  109. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +0 -17
  110. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/index.mjs +0 -2
  111. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +0 -40
  112. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/index.mjs +0 -2
  113. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +0 -39
  114. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/index.mjs +0 -2
  115. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +0 -83
  116. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/index.mjs +0 -2
  117. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +0 -31
  118. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/index.mjs +0 -2
  119. package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +0 -55
  120. package/esm2022/lib/components/forms/components/error/components/error/index.mjs +0 -2
  121. package/esm2022/lib/components/forms/components/input/components/color-input/color-input.component.mjs +0 -24
  122. package/esm2022/lib/components/forms/components/input/components/color-input/index.mjs +0 -2
  123. package/esm2022/lib/components/forms/components/input/components/date-input/date-input.component.mjs +0 -27
  124. package/esm2022/lib/components/forms/components/input/components/date-input/index.mjs +0 -2
  125. package/esm2022/lib/components/forms/components/input/components/date-time-input/date-time-input.component.mjs +0 -27
  126. package/esm2022/lib/components/forms/components/input/components/date-time-input/index.mjs +0 -2
  127. package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +0 -24
  128. package/esm2022/lib/components/forms/components/input/components/email-input/index.mjs +0 -2
  129. package/esm2022/lib/components/forms/components/input/components/input-field/index.mjs +0 -2
  130. package/esm2022/lib/components/forms/components/input/components/input-field/input-field.component.mjs +0 -55
  131. package/esm2022/lib/components/forms/components/input/components/number-input/index.mjs +0 -2
  132. package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +0 -27
  133. package/esm2022/lib/components/forms/components/input/components/password-input/index.mjs +0 -2
  134. package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +0 -24
  135. package/esm2022/lib/components/forms/components/input/components/search-input/index.mjs +0 -2
  136. package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +0 -24
  137. package/esm2022/lib/components/forms/components/input/components/tel-input/index.mjs +0 -2
  138. package/esm2022/lib/components/forms/components/input/components/tel-input/tel-input.component.mjs +0 -24
  139. package/esm2022/lib/components/forms/components/input/components/text-input/index.mjs +0 -2
  140. package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +0 -24
  141. package/esm2022/lib/components/forms/components/input/components/textarea-input/index.mjs +0 -2
  142. package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +0 -32
  143. package/esm2022/lib/components/forms/components/input/components/time-input/index.mjs +0 -2
  144. package/esm2022/lib/components/forms/components/input/components/time-input/time-input.component.mjs +0 -24
  145. package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +0 -51
  146. package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/index.mjs +0 -2
  147. package/esm2022/lib/components/forms/components/input/directives/color-input/color-input.directive.mjs +0 -50
  148. package/esm2022/lib/components/forms/components/input/directives/color-input/index.mjs +0 -2
  149. package/esm2022/lib/components/forms/components/input/directives/date-input/date-input.directive.mjs +0 -61
  150. package/esm2022/lib/components/forms/components/input/directives/date-input/index.mjs +0 -2
  151. package/esm2022/lib/components/forms/components/input/directives/date-time-input/date-time-input.directive.mjs +0 -61
  152. package/esm2022/lib/components/forms/components/input/directives/date-time-input/index.mjs +0 -2
  153. package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +0 -50
  154. package/esm2022/lib/components/forms/components/input/directives/email-input/index.mjs +0 -2
  155. package/esm2022/lib/components/forms/components/input/directives/if-supports-show-picker/if-supports-show-picker.directive.mjs +0 -78
  156. package/esm2022/lib/components/forms/components/input/directives/if-supports-show-picker/index.mjs +0 -2
  157. package/esm2022/lib/components/forms/components/input/directives/number-input/index.mjs +0 -2
  158. package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +0 -51
  159. package/esm2022/lib/components/forms/components/input/directives/password-input/index.mjs +0 -2
  160. package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +0 -54
  161. package/esm2022/lib/components/forms/components/input/directives/search-input/index.mjs +0 -2
  162. package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +0 -58
  163. package/esm2022/lib/components/forms/components/input/directives/show-picker-trigger/index.mjs +0 -2
  164. package/esm2022/lib/components/forms/components/input/directives/show-picker-trigger/show-picker-trigger.directive.mjs +0 -42
  165. package/esm2022/lib/components/forms/components/input/directives/tel-input/index.mjs +0 -2
  166. package/esm2022/lib/components/forms/components/input/directives/tel-input/tel-input.directive.mjs +0 -50
  167. package/esm2022/lib/components/forms/components/input/directives/text-input/index.mjs +0 -2
  168. package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +0 -50
  169. package/esm2022/lib/components/forms/components/input/directives/textarea-input/index.mjs +0 -2
  170. package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +0 -50
  171. package/esm2022/lib/components/forms/components/input/directives/time-input/index.mjs +0 -2
  172. package/esm2022/lib/components/forms/components/input/directives/time-input/time-input.directive.mjs +0 -61
  173. package/esm2022/lib/components/forms/components/input/input.imports.mjs +0 -47
  174. package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/index.mjs +0 -2
  175. package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/password-input-toggle.component.mjs +0 -22
  176. package/esm2022/lib/components/forms/components/input/partials/search-input-clear/index.mjs +0 -2
  177. package/esm2022/lib/components/forms/components/input/partials/search-input-clear/search-input-clear.component.mjs +0 -22
  178. package/esm2022/lib/components/forms/components/label/components/label/index.mjs +0 -2
  179. package/esm2022/lib/components/forms/components/label/components/label/label.component.mjs +0 -51
  180. package/esm2022/lib/components/forms/components/label/directives/label-suffix/index.mjs +0 -2
  181. package/esm2022/lib/components/forms/components/label/directives/label-suffix/label-suffix.directive.mjs +0 -27
  182. package/esm2022/lib/components/forms/components/label/label.imports.mjs +0 -4
  183. package/esm2022/lib/components/forms/components/radio/components/radio/index.mjs +0 -2
  184. package/esm2022/lib/components/forms/components/radio/components/radio/radio.component.mjs +0 -29
  185. package/esm2022/lib/components/forms/components/radio/components/radio-field/index.mjs +0 -2
  186. package/esm2022/lib/components/forms/components/radio/components/radio-field/radio-field.component.mjs +0 -27
  187. package/esm2022/lib/components/forms/components/radio/components/radio-group/index.mjs +0 -2
  188. package/esm2022/lib/components/forms/components/radio/components/radio-group/radio-group.component.mjs +0 -45
  189. package/esm2022/lib/components/forms/components/radio/directives/radio/index.mjs +0 -2
  190. package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +0 -60
  191. package/esm2022/lib/components/forms/components/radio/directives/radio-field/index.mjs +0 -2
  192. package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +0 -36
  193. package/esm2022/lib/components/forms/components/radio/directives/radio-group/index.mjs +0 -2
  194. package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +0 -30
  195. package/esm2022/lib/components/forms/components/radio/radio.imports.mjs +0 -6
  196. package/esm2022/lib/components/forms/components/radio/types/index.mjs +0 -2
  197. package/esm2022/lib/components/forms/components/radio/types/radio.types.mjs +0 -2
  198. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/index.mjs +0 -2
  199. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/segmented-button.component.mjs +0 -38
  200. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/index.mjs +0 -2
  201. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/segmented-button-field.component.mjs +0 -25
  202. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/index.mjs +0 -2
  203. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/segmented-button-group.component.mjs +0 -51
  204. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/index.mjs +0 -2
  205. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +0 -70
  206. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/index.mjs +0 -2
  207. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +0 -36
  208. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/index.mjs +0 -2
  209. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +0 -63
  210. package/esm2022/lib/components/forms/components/segmented-button/segmented-button.imports.mjs +0 -9
  211. package/esm2022/lib/components/forms/components/select/components/combobox/combobox.imports.mjs +0 -23
  212. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +0 -78
  213. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/index.mjs +0 -2
  214. package/esm2022/lib/components/forms/components/select/components/combobox/constants/combobox.constants.mjs +0 -6
  215. package/esm2022/lib/components/forms/components/select/components/combobox/constants/index.mjs +0 -2
  216. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +0 -658
  217. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/index.mjs +0 -2
  218. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-empty-template/combobox-body-empty-template.directive.mjs +0 -30
  219. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-empty-template/index.mjs +0 -2
  220. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-error-template/combobox-body-error-template.directive.mjs +0 -30
  221. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-error-template/index.mjs +0 -2
  222. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-loading-template/combobox-body-loading-template.directive.mjs +0 -30
  223. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-loading-template/index.mjs +0 -2
  224. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-more-items-hint-template/combobox-body-more-items-hint-template.directive.mjs +0 -30
  225. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-more-items-hint-template/index.mjs +0 -2
  226. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/combobox-option-template.directive.mjs +0 -30
  227. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/index.mjs +0 -2
  228. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/combobox-selected-option-template.directive.mjs +0 -30
  229. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/index.mjs +0 -2
  230. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +0 -78
  231. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/index.mjs +0 -2
  232. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +0 -71
  233. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/index.mjs +0 -2
  234. package/esm2022/lib/components/forms/components/select/components/combobox/private/combobox.private.errors.mjs +0 -22
  235. package/esm2022/lib/components/forms/components/select/components/combobox/private/combobox.private.types.mjs +0 -5
  236. package/esm2022/lib/components/forms/components/select/components/combobox/private/index.mjs +0 -3
  237. package/esm2022/lib/components/forms/components/select/components/combobox/types/combobox.types.mjs +0 -2
  238. package/esm2022/lib/components/forms/components/select/components/combobox/types/index.mjs +0 -2
  239. package/esm2022/lib/components/forms/components/select/components/combobox/utils/combobox-config.utils.mjs +0 -13
  240. package/esm2022/lib/components/forms/components/select/components/combobox/utils/index.mjs +0 -2
  241. package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/index.mjs +0 -2
  242. package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +0 -24
  243. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/index.mjs +0 -2
  244. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +0 -58
  245. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/index.mjs +0 -2
  246. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/native-select-option.directive.mjs +0 -45
  247. package/esm2022/lib/components/forms/components/select/components/native-select/native-select.imports.mjs +0 -19
  248. package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/index.mjs +0 -2
  249. package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/native-select-option.component.mjs +0 -32
  250. package/esm2022/lib/components/forms/components/select/components/native-select/types/index.mjs +0 -2
  251. package/esm2022/lib/components/forms/components/select/components/native-select/types/select.types.mjs +0 -2
  252. package/esm2022/lib/components/forms/components/select/components/select/components/select/index.mjs +0 -2
  253. package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +0 -37
  254. package/esm2022/lib/components/forms/components/select/components/select/directives/select/index.mjs +0 -2
  255. package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +0 -303
  256. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/index.mjs +0 -2
  257. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +0 -53
  258. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/index.mjs +0 -2
  259. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +0 -106
  260. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/index.mjs +0 -2
  261. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +0 -41
  262. package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/index.mjs +0 -2
  263. package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.mjs +0 -28
  264. package/esm2022/lib/components/forms/components/select/components/select/private/index.mjs +0 -2
  265. package/esm2022/lib/components/forms/components/select/components/select/private/select.private.types.mjs +0 -2
  266. package/esm2022/lib/components/forms/components/select/components/select/select.imports.mjs +0 -15
  267. package/esm2022/lib/components/forms/components/select/components/select-field/index.mjs +0 -2
  268. package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +0 -58
  269. package/esm2022/lib/components/forms/components/select/directives/select-field/index.mjs +0 -2
  270. package/esm2022/lib/components/forms/components/select/directives/select-field/select-field.directive.mjs +0 -19
  271. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-field/index.mjs +0 -2
  272. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-field/selection-list-field.component.mjs +0 -40
  273. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-option/index.mjs +0 -2
  274. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-option/selection-list-option.component.mjs +0 -29
  275. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-field/index.mjs +0 -2
  276. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-field/selection-list-field.directive.mjs +0 -125
  277. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-option/index.mjs +0 -2
  278. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-option/selection-list-option.directive.mjs +0 -110
  279. package/esm2022/lib/components/forms/components/selection-list/selection-list.imports.mjs +0 -4
  280. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/index.mjs +0 -2
  281. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/slide-toggle.component.mjs +0 -24
  282. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/index.mjs +0 -2
  283. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/slide-toggle-field.component.mjs +0 -53
  284. package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/index.mjs +0 -2
  285. package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.mjs +0 -38
  286. package/esm2022/lib/components/forms/components/slide-toggle/slide-toggle.imports.mjs +0 -5
  287. package/esm2022/lib/components/forms/components/slider/components/slider/index.mjs +0 -2
  288. package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +0 -331
  289. package/esm2022/lib/components/forms/components/slider/components/slider-field/index.mjs +0 -2
  290. package/esm2022/lib/components/forms/components/slider/components/slider-field/slider-field.component.mjs +0 -53
  291. package/esm2022/lib/components/forms/components/slider/slider.imports.mjs +0 -5
  292. package/esm2022/lib/components/forms/directives/dynamic-form-field/dynamic-form-field.directive.mjs +0 -41
  293. package/esm2022/lib/components/forms/directives/dynamic-form-field/index.mjs +0 -2
  294. package/esm2022/lib/components/forms/directives/dynamic-form-group/dynamic-form-group.directive.mjs +0 -41
  295. package/esm2022/lib/components/forms/directives/dynamic-form-group/index.mjs +0 -2
  296. package/esm2022/lib/components/forms/directives/expose-input-vars/expose-input-vars.directive.mjs +0 -83
  297. package/esm2022/lib/components/forms/directives/expose-input-vars/index.mjs +0 -2
  298. package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +0 -40
  299. package/esm2022/lib/components/forms/directives/if-input-empty/index.mjs +0 -2
  300. package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +0 -40
  301. package/esm2022/lib/components/forms/directives/if-input-filled/index.mjs +0 -2
  302. package/esm2022/lib/components/forms/directives/input/index.mjs +0 -2
  303. package/esm2022/lib/components/forms/directives/input/input.directive.mjs +0 -314
  304. package/esm2022/lib/components/forms/directives/input-prefix/index.mjs +0 -2
  305. package/esm2022/lib/components/forms/directives/input-prefix/input-prefix.directive.mjs +0 -30
  306. package/esm2022/lib/components/forms/directives/input-suffix/index.mjs +0 -2
  307. package/esm2022/lib/components/forms/directives/input-suffix/input-suffix.directive.mjs +0 -30
  308. package/esm2022/lib/components/forms/directives/native-input-ref/index.mjs +0 -2
  309. package/esm2022/lib/components/forms/directives/native-input-ref/native-input-ref.directive.mjs +0 -19
  310. package/esm2022/lib/components/forms/directives/static-form-field/index.mjs +0 -2
  311. package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +0 -76
  312. package/esm2022/lib/components/forms/directives/static-form-group/index.mjs +0 -2
  313. package/esm2022/lib/components/forms/directives/static-form-group/static-form-group.directive.mjs +0 -29
  314. package/esm2022/lib/components/forms/directives/writeable-input/index.mjs +0 -2
  315. package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +0 -57
  316. package/esm2022/lib/components/forms/public-api/index.mjs +0 -113
  317. package/esm2022/lib/components/forms/services/default-validator-errors.service.mjs +0 -54
  318. package/esm2022/lib/components/forms/services/form-field-state.service.mjs +0 -32
  319. package/esm2022/lib/components/forms/services/form-group-state.service.mjs +0 -21
  320. package/esm2022/lib/components/forms/services/index.mjs +0 -5
  321. package/esm2022/lib/components/forms/services/input-state.service.mjs +0 -72
  322. package/esm2022/lib/components/forms/types/index.mjs +0 -2
  323. package/esm2022/lib/components/forms/types/input.types.mjs +0 -2
  324. package/esm2022/lib/components/forms/utils/decorated-form-field.base.mjs +0 -19
  325. package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +0 -48
  326. package/esm2022/lib/components/forms/utils/form-changes-tracker.util.mjs +0 -31
  327. package/esm2022/lib/components/forms/utils/index.mjs +0 -5
  328. package/esm2022/lib/components/forms/utils/input.base.mjs +0 -27
  329. package/esm2022/lib/components/icons/chevron-icon/chevron-icon.component.mjs +0 -37
  330. package/esm2022/lib/components/icons/chevron-icon/index.mjs +0 -2
  331. package/esm2022/lib/components/icons/icon.imports.mjs +0 -4
  332. package/esm2022/lib/components/icons/public-api/index.mjs +0 -4
  333. package/esm2022/lib/components/icons/times-icon/index.mjs +0 -2
  334. package/esm2022/lib/components/icons/times-icon/times-icon.component.mjs +0 -37
  335. package/esm2022/lib/components/masonry/components/masonry/index.mjs +0 -2
  336. package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +0 -213
  337. package/esm2022/lib/components/masonry/masonry.imports.mjs +0 -4
  338. package/esm2022/lib/components/masonry/partials/masonry-item/index.mjs +0 -2
  339. package/esm2022/lib/components/masonry/partials/masonry-item/masonry-item.component.mjs +0 -74
  340. package/esm2022/lib/components/masonry/public-api/index.mjs +0 -5
  341. package/esm2022/lib/components/masonry/types/index.mjs +0 -2
  342. package/esm2022/lib/components/masonry/types/masonry.types.mjs +0 -2
  343. package/esm2022/lib/components/overlay/components/bottom-sheet/bottom-sheet.imports.mjs +0 -21
  344. package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/bottom-sheet-container.component.mjs +0 -54
  345. package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/index.mjs +0 -2
  346. package/esm2022/lib/components/overlay/components/bottom-sheet/constants/bottom-sheet.constants.mjs +0 -56
  347. package/esm2022/lib/components/overlay/components/bottom-sheet/constants/index.mjs +0 -2
  348. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +0 -46
  349. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/index.mjs +0 -2
  350. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +0 -115
  351. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/index.mjs +0 -2
  352. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/bottom-sheet-title.directive.mjs +0 -42
  353. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/index.mjs +0 -2
  354. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.mjs +0 -117
  355. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-swipe-handler.service.mjs +0 -57
  356. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet.service.mjs +0 -34
  357. package/esm2022/lib/components/overlay/components/bottom-sheet/services/index.mjs +0 -4
  358. package/esm2022/lib/components/overlay/components/bottom-sheet/types/bottom-sheet.types.mjs +0 -2
  359. package/esm2022/lib/components/overlay/components/bottom-sheet/types/index.mjs +0 -2
  360. package/esm2022/lib/components/overlay/components/bottom-sheet/utils/bottom-sheet-config.mjs +0 -10
  361. package/esm2022/lib/components/overlay/components/bottom-sheet/utils/bottom-sheet-ref.mjs +0 -96
  362. package/esm2022/lib/components/overlay/components/bottom-sheet/utils/bottom-sheet.utils.mjs +0 -22
  363. package/esm2022/lib/components/overlay/components/bottom-sheet/utils/index.mjs +0 -4
  364. package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/dialog-container.component.mjs +0 -54
  365. package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/index.mjs +0 -2
  366. package/esm2022/lib/components/overlay/components/dialog/constants/dialog.constants.mjs +0 -52
  367. package/esm2022/lib/components/overlay/components/dialog/constants/index.mjs +0 -2
  368. package/esm2022/lib/components/overlay/components/dialog/dialog.imports.mjs +0 -17
  369. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/dialog-close.directive.mjs +0 -67
  370. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/index.mjs +0 -2
  371. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +0 -46
  372. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/index.mjs +0 -2
  373. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/dialog-title.directive.mjs +0 -42
  374. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/index.mjs +0 -2
  375. package/esm2022/lib/components/overlay/components/dialog/services/dialog-base.service.mjs +0 -112
  376. package/esm2022/lib/components/overlay/components/dialog/services/dialog.service.mjs +0 -34
  377. package/esm2022/lib/components/overlay/components/dialog/services/index.mjs +0 -3
  378. package/esm2022/lib/components/overlay/components/dialog/types/dialog.types.mjs +0 -2
  379. package/esm2022/lib/components/overlay/components/dialog/types/index.mjs +0 -2
  380. package/esm2022/lib/components/overlay/components/dialog/utils/dialog-config.mjs +0 -10
  381. package/esm2022/lib/components/overlay/components/dialog/utils/dialog-ref.mjs +0 -127
  382. package/esm2022/lib/components/overlay/components/dialog/utils/dialog.utils.mjs +0 -22
  383. package/esm2022/lib/components/overlay/components/dialog/utils/index.mjs +0 -4
  384. package/esm2022/lib/components/overlay/components/menu/components/menu/index.mjs +0 -2
  385. package/esm2022/lib/components/overlay/components/menu/components/menu/menu.component.mjs +0 -202
  386. package/esm2022/lib/components/overlay/components/menu/components/menu-checkbox-item/index.mjs +0 -2
  387. package/esm2022/lib/components/overlay/components/menu/components/menu-checkbox-item/menu-checkbox-item.component.mjs +0 -86
  388. package/esm2022/lib/components/overlay/components/menu/components/menu-container/index.mjs +0 -2
  389. package/esm2022/lib/components/overlay/components/menu/components/menu-container/menu-container.component.mjs +0 -47
  390. package/esm2022/lib/components/overlay/components/menu/components/menu-radio-item/index.mjs +0 -2
  391. package/esm2022/lib/components/overlay/components/menu/components/menu-radio-item/menu-radio-item.component.mjs +0 -77
  392. package/esm2022/lib/components/overlay/components/menu/directives/menu-checkbox-group/index.mjs +0 -2
  393. package/esm2022/lib/components/overlay/components/menu/directives/menu-checkbox-group/menu-checkbox-group.directive.mjs +0 -31
  394. package/esm2022/lib/components/overlay/components/menu/directives/menu-group/index.mjs +0 -2
  395. package/esm2022/lib/components/overlay/components/menu/directives/menu-group/menu-group.directive.mjs +0 -43
  396. package/esm2022/lib/components/overlay/components/menu/directives/menu-group-title/index.mjs +0 -2
  397. package/esm2022/lib/components/overlay/components/menu/directives/menu-group-title/menu-group-title.directive.mjs +0 -41
  398. package/esm2022/lib/components/overlay/components/menu/directives/menu-item/index.mjs +0 -2
  399. package/esm2022/lib/components/overlay/components/menu/directives/menu-item/menu-item.directive.mjs +0 -98
  400. package/esm2022/lib/components/overlay/components/menu/directives/menu-radio-group/index.mjs +0 -2
  401. package/esm2022/lib/components/overlay/components/menu/directives/menu-radio-group/menu-radio-group.directive.mjs +0 -45
  402. package/esm2022/lib/components/overlay/components/menu/directives/menu-search-template/index.mjs +0 -2
  403. package/esm2022/lib/components/overlay/components/menu/directives/menu-search-template/menu-search-template.directive.mjs +0 -29
  404. package/esm2022/lib/components/overlay/components/menu/directives/menu-trigger/index.mjs +0 -2
  405. package/esm2022/lib/components/overlay/components/menu/directives/menu-trigger/menu-trigger.directive.mjs +0 -183
  406. package/esm2022/lib/components/overlay/components/menu/menu.imports.mjs +0 -23
  407. package/esm2022/lib/components/overlay/components/menu-deprecated/context-menu-trigger.mjs +0 -165
  408. package/esm2022/lib/components/overlay/components/menu-deprecated/index.mjs +0 -17
  409. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-aim.mjs +0 -136
  410. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-bar.mjs +0 -112
  411. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-base.mjs +0 -171
  412. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-errors.mjs +0 -7
  413. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-group.mjs +0 -25
  414. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-interface.mjs +0 -3
  415. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item-checkbox.mjs +0 -38
  416. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item-radio.mjs +0 -55
  417. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item-selectable.mjs +0 -38
  418. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item.mjs +0 -212
  419. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-module.mjs +0 -58
  420. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-stack.mjs +0 -99
  421. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-trigger-base.mjs +0 -80
  422. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-trigger.mjs +0 -250
  423. package/esm2022/lib/components/overlay/components/menu-deprecated/menu.mjs +0 -115
  424. package/esm2022/lib/components/overlay/components/menu-deprecated/pointer-focus-tracker.mjs +0 -29
  425. package/esm2022/lib/components/overlay/components/overlay/components/overlay-container/index.mjs +0 -2
  426. package/esm2022/lib/components/overlay/components/overlay/components/overlay-container/overlay-container.component.mjs +0 -287
  427. package/esm2022/lib/components/overlay/components/overlay/constants/index.mjs +0 -2
  428. package/esm2022/lib/components/overlay/components/overlay/constants/overlay.constants.mjs +0 -26
  429. package/esm2022/lib/components/overlay/components/overlay/overlay.imports.mjs +0 -40
  430. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-back-or-close/index.mjs +0 -2
  431. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-back-or-close/overlay-back-or-close.directive.mjs +0 -43
  432. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-body/index.mjs +0 -2
  433. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-body/overlay-body.component.mjs +0 -134
  434. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-close/index.mjs +0 -2
  435. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-close/overlay-close.directive.mjs +0 -61
  436. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-footer/index.mjs +0 -2
  437. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-footer/overlay-footer.directive.mjs +0 -45
  438. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-header/index.mjs +0 -2
  439. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-header/overlay-header.directive.mjs +0 -45
  440. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-header-template/index.mjs +0 -2
  441. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-header-template/overlay-header-template.directive.mjs +0 -50
  442. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-main/index.mjs +0 -2
  443. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-main/overlay-main.directive.mjs +0 -53
  444. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-route-header-template-outlet/index.mjs +0 -2
  445. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-route-header-template-outlet/overlay-route-header-template-outlet.component.mjs +0 -41
  446. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-link/index.mjs +0 -2
  447. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-link/overlay-router-link.directive.mjs +0 -46
  448. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-outlet/index.mjs +0 -2
  449. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-outlet/overlay-router-outlet.component.mjs +0 -137
  450. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-outlet-disabled-template/index.mjs +0 -2
  451. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-outlet-disabled-template/overlay-router-outlet-disabled-template.directive.mjs +0 -26
  452. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-shared-route-template/index.mjs +0 -2
  453. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-shared-route-template/overlay-shared-route-template.directive.mjs +0 -26
  454. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-shared-route-template-outlet/index.mjs +0 -2
  455. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-shared-route-template-outlet/overlay-shared-route-template-outlet.component.mjs +0 -26
  456. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-sidebar/index.mjs +0 -2
  457. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-sidebar/overlay-sidebar.component.mjs +0 -54
  458. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-sidebar-page/index.mjs +0 -2
  459. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-sidebar-page/overlay-sidebar-page.component.mjs +0 -52
  460. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-title/index.mjs +0 -2
  461. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-title/overlay-title.directive.mjs +0 -39
  462. package/esm2022/lib/components/overlay/components/overlay/services/index.mjs +0 -2
  463. package/esm2022/lib/components/overlay/components/overlay/services/overlay.service.mjs +0 -313
  464. package/esm2022/lib/components/overlay/components/overlay/types/index.mjs +0 -2
  465. package/esm2022/lib/components/overlay/components/overlay/types/overlay.types.mjs +0 -6
  466. package/esm2022/lib/components/overlay/components/overlay/utils/filter-overlay.mjs +0 -124
  467. package/esm2022/lib/components/overlay/components/overlay/utils/index.mjs +0 -10
  468. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-config.mjs +0 -7
  469. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-handler-link.directive.mjs +0 -33
  470. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-handler.mjs +0 -159
  471. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-position-builder.mjs +0 -224
  472. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-ref.mjs +0 -173
  473. package/esm2022/lib/components/overlay/components/overlay/utils/overlay-router.mjs +0 -190
  474. package/esm2022/lib/components/overlay/components/overlay/utils/overlay.utils.mjs +0 -13
  475. package/esm2022/lib/components/overlay/components/overlay/utils/sidebar-overlay.mjs +0 -54
  476. package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/index.mjs +0 -2
  477. package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/toggletip.component.mjs +0 -69
  478. package/esm2022/lib/components/overlay/components/toggletip/constants/index.mjs +0 -2
  479. package/esm2022/lib/components/overlay/components/toggletip/constants/toggletip.constants.mjs +0 -12
  480. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/index.mjs +0 -2
  481. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +0 -136
  482. package/esm2022/lib/components/overlay/components/toggletip/partials/toggletip-close/index.mjs +0 -2
  483. package/esm2022/lib/components/overlay/components/toggletip/partials/toggletip-close/toggletip-close.directive.mjs +0 -25
  484. package/esm2022/lib/components/overlay/components/toggletip/toggletip.imports.mjs +0 -3
  485. package/esm2022/lib/components/overlay/components/toggletip/types/index.mjs +0 -2
  486. package/esm2022/lib/components/overlay/components/toggletip/types/toggletip.types.mjs +0 -2
  487. package/esm2022/lib/components/overlay/components/toggletip/utils/index.mjs +0 -3
  488. package/esm2022/lib/components/overlay/components/toggletip/utils/toggletip-config.mjs +0 -6
  489. package/esm2022/lib/components/overlay/components/toggletip/utils/toggletip.util.mjs +0 -6
  490. package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/index.mjs +0 -2
  491. package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/tooltip.component.mjs +0 -67
  492. package/esm2022/lib/components/overlay/components/tooltip/constants/index.mjs +0 -2
  493. package/esm2022/lib/components/overlay/components/tooltip/constants/tooltip.constants.mjs +0 -12
  494. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/index.mjs +0 -2
  495. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +0 -171
  496. package/esm2022/lib/components/overlay/components/tooltip/tooltip.imports.mjs +0 -3
  497. package/esm2022/lib/components/overlay/components/tooltip/types/index.mjs +0 -2
  498. package/esm2022/lib/components/overlay/components/tooltip/types/tooltip.types.mjs +0 -2
  499. package/esm2022/lib/components/overlay/components/tooltip/utils/index.mjs +0 -3
  500. package/esm2022/lib/components/overlay/components/tooltip/utils/tooltip-config.mjs +0 -6
  501. package/esm2022/lib/components/overlay/components/tooltip/utils/tooltip.util.mjs +0 -6
  502. package/esm2022/lib/components/overlay/directives/dynamic-overlay-title/dynamic-overlay-title.directive.mjs +0 -49
  503. package/esm2022/lib/components/overlay/directives/dynamic-overlay-title/index.mjs +0 -2
  504. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/index.mjs +0 -2
  505. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/overlay-close-auto-blocker.directive.mjs +0 -51
  506. package/esm2022/lib/components/overlay/public-api/index.mjs +0 -72
  507. package/esm2022/lib/components/overlay/services/dynamic-overlay.service.mjs +0 -31
  508. package/esm2022/lib/components/overlay/services/index.mjs +0 -2
  509. package/esm2022/lib/components/overlay/types/dynamic-overlay.types.mjs +0 -2
  510. package/esm2022/lib/components/overlay/types/index.mjs +0 -2
  511. package/esm2022/lib/components/overlay/utils/index.mjs +0 -2
  512. package/esm2022/lib/components/overlay/utils/overlay-dismiss-checker.util.mjs +0 -105
  513. package/esm2022/lib/components/pagination/components/pagination/index.mjs +0 -2
  514. package/esm2022/lib/components/pagination/components/pagination/pagination.component.mjs +0 -110
  515. package/esm2022/lib/components/pagination/pagination.imports.mjs +0 -3
  516. package/esm2022/lib/components/pagination/partials/pagination-link/index.mjs +0 -2
  517. package/esm2022/lib/components/pagination/partials/pagination-link/pagination-link.directive.mjs +0 -32
  518. package/esm2022/lib/components/pagination/public-api/index.mjs +0 -7
  519. package/esm2022/lib/components/pagination/services/index.mjs +0 -2
  520. package/esm2022/lib/components/pagination/services/pagination-head.service.mjs +0 -74
  521. package/esm2022/lib/components/pagination/types/index.mjs +0 -2
  522. package/esm2022/lib/components/pagination/types/pagination.types.mjs +0 -2
  523. package/esm2022/lib/components/pagination/utils/index.mjs +0 -2
  524. package/esm2022/lib/components/pagination/utils/pagination.util.mjs +0 -98
  525. package/esm2022/lib/components/picture/components/picture/index.mjs +0 -2
  526. package/esm2022/lib/components/picture/components/picture/picture.component.mjs +0 -56
  527. package/esm2022/lib/components/picture/public-api/index.mjs +0 -4
  528. package/esm2022/lib/components/picture/types/picture.types.mjs +0 -2
  529. package/esm2022/lib/components/picture/utils/picture.utils.mjs +0 -31
  530. package/esm2022/lib/components/progress-spinner/index.mjs +0 -2
  531. package/esm2022/lib/components/progress-spinner/progress-spinner.component.mjs +0 -94
  532. package/esm2022/lib/components/query-error/components/query-error/index.mjs +0 -2
  533. package/esm2022/lib/components/query-error/components/query-error/query-error.component.mjs +0 -27
  534. package/esm2022/lib/components/query-error/directives/query-error/index.mjs +0 -2
  535. package/esm2022/lib/components/query-error/directives/query-error/query-error.directive.mjs +0 -432
  536. package/esm2022/lib/components/query-error/public-api/index.mjs +0 -4
  537. package/esm2022/lib/components/query-error/types/index.mjs +0 -2
  538. package/esm2022/lib/components/query-error/types/query-error.types.mjs +0 -2
  539. package/esm2022/lib/components/scrollable/components/scrollable/index.mjs +0 -2
  540. package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +0 -510
  541. package/esm2022/lib/components/scrollable/components/scrollable-placeholder/index.mjs +0 -2
  542. package/esm2022/lib/components/scrollable/components/scrollable-placeholder/scrollable-placeholder.component.mjs +0 -26
  543. package/esm2022/lib/components/scrollable/directives/scrollable-ignore-child/index.mjs +0 -2
  544. package/esm2022/lib/components/scrollable/directives/scrollable-ignore-child/scrollable-ignore-child.directive.mjs +0 -44
  545. package/esm2022/lib/components/scrollable/directives/scrollable-is-active-child/index.mjs +0 -2
  546. package/esm2022/lib/components/scrollable/directives/scrollable-is-active-child/scrollable-is-active-child.directive.mjs +0 -45
  547. package/esm2022/lib/components/scrollable/directives/scrollable-loading-template/index.mjs +0 -2
  548. package/esm2022/lib/components/scrollable/directives/scrollable-loading-template/scrollable-loading-template.directive.mjs +0 -31
  549. package/esm2022/lib/components/scrollable/directives/scrollable-placeholder-item-template/index.mjs +0 -2
  550. package/esm2022/lib/components/scrollable/directives/scrollable-placeholder-item-template/scrollable-placeholder-item-template.directive.mjs +0 -26
  551. package/esm2022/lib/components/scrollable/directives/scrollable-placeholder-overlay-template/index.mjs +0 -2
  552. package/esm2022/lib/components/scrollable/directives/scrollable-placeholder-overlay-template/scrollable-placeholder-overlay-template.directive.mjs +0 -26
  553. package/esm2022/lib/components/scrollable/public-api/index.mjs +0 -10
  554. package/esm2022/lib/components/scrollable/scrollable.imports.mjs +0 -17
  555. package/esm2022/lib/components/scrollable/types/index.mjs +0 -2
  556. package/esm2022/lib/components/scrollable/types/scrollable.types.mjs +0 -2
  557. package/esm2022/lib/components/skeleton/components/skeleton/index.mjs +0 -2
  558. package/esm2022/lib/components/skeleton/components/skeleton/skeleton.component.mjs +0 -25
  559. package/esm2022/lib/components/skeleton/partials/skeleton-item/index.mjs +0 -2
  560. package/esm2022/lib/components/skeleton/partials/skeleton-item/skeleton-item.component.mjs +0 -19
  561. package/esm2022/lib/components/skeleton/public-api/index.mjs +0 -4
  562. package/esm2022/lib/components/skeleton/skeleton.imports.mjs +0 -4
  563. package/esm2022/lib/components/sort/components/sort-header/index.mjs +0 -3
  564. package/esm2022/lib/components/sort/components/sort-header/sort-header.component.mjs +0 -198
  565. package/esm2022/lib/components/sort/components/sort-header/sort-header.types.mjs +0 -2
  566. package/esm2022/lib/components/sort/partials/sort/index.mjs +0 -3
  567. package/esm2022/lib/components/sort/partials/sort/sort.directive.mjs +0 -184
  568. package/esm2022/lib/components/sort/partials/sort/sort.types.mjs +0 -2
  569. package/esm2022/lib/components/sort/public-api/index.mjs +0 -6
  570. package/esm2022/lib/components/sort/services/index.mjs +0 -2
  571. package/esm2022/lib/components/sort/services/sort-header-intl.mjs +0 -23
  572. package/esm2022/lib/components/sort/sort.imports.mjs +0 -8
  573. package/esm2022/lib/components/sort/types/index.mjs +0 -2
  574. package/esm2022/lib/components/sort/types/sort-direction.mjs +0 -2
  575. package/esm2022/lib/components/table/components/table/index.mjs +0 -2
  576. package/esm2022/lib/components/table/components/table/table.component.mjs +0 -145
  577. package/esm2022/lib/components/table/constants/index.mjs +0 -2
  578. package/esm2022/lib/components/table/constants/table-data-source.constants.mjs +0 -2
  579. package/esm2022/lib/components/table/partials/cells/cell/cell.directive.mjs +0 -18
  580. package/esm2022/lib/components/table/partials/cells/cell/index.mjs +0 -2
  581. package/esm2022/lib/components/table/partials/cells/cell-def/cell-def.directive.mjs +0 -16
  582. package/esm2022/lib/components/table/partials/cells/cell-def/index.mjs +0 -2
  583. package/esm2022/lib/components/table/partials/cells/column-def/column-def.directive.mjs +0 -44
  584. package/esm2022/lib/components/table/partials/cells/column-def/index.mjs +0 -2
  585. package/esm2022/lib/components/table/partials/cells/footer-cell/footer-cell.directive.mjs +0 -18
  586. package/esm2022/lib/components/table/partials/cells/footer-cell/index.mjs +0 -2
  587. package/esm2022/lib/components/table/partials/cells/footer-cell-def/footer-cell-def.directive.mjs +0 -16
  588. package/esm2022/lib/components/table/partials/cells/footer-cell-def/index.mjs +0 -2
  589. package/esm2022/lib/components/table/partials/cells/header-cell/header-cell.directive.mjs +0 -19
  590. package/esm2022/lib/components/table/partials/cells/header-cell/index.mjs +0 -2
  591. package/esm2022/lib/components/table/partials/cells/header-cell-def/header-cell-def.directive.mjs +0 -16
  592. package/esm2022/lib/components/table/partials/cells/header-cell-def/index.mjs +0 -2
  593. package/esm2022/lib/components/table/partials/cells/text-column/index.mjs +0 -2
  594. package/esm2022/lib/components/table/partials/cells/text-column/text-column.component.mjs +0 -53
  595. package/esm2022/lib/components/table/partials/rows/footer-row/footer-row.component.mjs +0 -26
  596. package/esm2022/lib/components/table/partials/rows/footer-row/index.mjs +0 -2
  597. package/esm2022/lib/components/table/partials/rows/footer-row-def/footer-row-def.directive.mjs +0 -26
  598. package/esm2022/lib/components/table/partials/rows/footer-row-def/index.mjs +0 -2
  599. package/esm2022/lib/components/table/partials/rows/header-row/header-row.component.mjs +0 -26
  600. package/esm2022/lib/components/table/partials/rows/header-row/index.mjs +0 -2
  601. package/esm2022/lib/components/table/partials/rows/header-row-def/header-row-def.directive.mjs +0 -26
  602. package/esm2022/lib/components/table/partials/rows/header-row-def/index.mjs +0 -2
  603. package/esm2022/lib/components/table/partials/rows/no-data-row/index.mjs +0 -2
  604. package/esm2022/lib/components/table/partials/rows/no-data-row/no-data-row.directive.mjs +0 -20
  605. package/esm2022/lib/components/table/partials/rows/recycle-rows/index.mjs +0 -2
  606. package/esm2022/lib/components/table/partials/rows/recycle-rows/recycle-rows.directive.mjs +0 -16
  607. package/esm2022/lib/components/table/partials/rows/row/index.mjs +0 -2
  608. package/esm2022/lib/components/table/partials/rows/row/row.component.mjs +0 -26
  609. package/esm2022/lib/components/table/partials/rows/row-def/index.mjs +0 -2
  610. package/esm2022/lib/components/table/partials/rows/row-def/row-def.directive.mjs +0 -26
  611. package/esm2022/lib/components/table/partials/table-busy/index.mjs +0 -2
  612. package/esm2022/lib/components/table/partials/table-busy/table-busy.directive.mjs +0 -18
  613. package/esm2022/lib/components/table/partials/table-busy-outlet/index.mjs +0 -2
  614. package/esm2022/lib/components/table/partials/table-busy-outlet/table-busy-outlet.directive.mjs +0 -15
  615. package/esm2022/lib/components/table/public-api/index.mjs +0 -24
  616. package/esm2022/lib/components/table/table.imports.mjs +0 -39
  617. package/esm2022/lib/components/table/types/index.mjs +0 -2
  618. package/esm2022/lib/components/table/types/table-data-source.types.mjs +0 -2
  619. package/esm2022/lib/components/table/utils/index.mjs +0 -2
  620. package/esm2022/lib/components/table/utils/table-data-source.mjs +0 -168
  621. package/esm2022/lib/components/tabs/animations/index.mjs +0 -2
  622. package/esm2022/lib/components/tabs/animations/tabs.animations.mjs +0 -26
  623. package/esm2022/lib/components/tabs/components/inline-tabs/index.mjs +0 -2
  624. package/esm2022/lib/components/tabs/components/inline-tabs/inline-tabs.component.mjs +0 -257
  625. package/esm2022/lib/components/tabs/components/nav-tabs/index.mjs +0 -2
  626. package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +0 -82
  627. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/index.mjs +0 -2
  628. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/inline-tab.component.mjs +0 -88
  629. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/index.mjs +0 -2
  630. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/inline-tab-body.component.mjs +0 -133
  631. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/index.mjs +0 -2
  632. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/inline-tab-body-host.directive.mjs +0 -25
  633. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/index.mjs +0 -2
  634. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/inline-tab-content.directive.mjs +0 -22
  635. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/index.mjs +0 -2
  636. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +0 -34
  637. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/index.mjs +0 -2
  638. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/inline-tab-label.directive.mjs +0 -30
  639. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/index.mjs +0 -2
  640. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/inline-tab-label-wrapper.directive.mjs +0 -42
  641. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/index.mjs +0 -2
  642. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/nav-tab-link.directive.mjs +0 -177
  643. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/index.mjs +0 -2
  644. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/nav-tabs-outlet.component.mjs +0 -37
  645. package/esm2022/lib/components/tabs/public-api/index.mjs +0 -16
  646. package/esm2022/lib/components/tabs/tab.imports.mjs +0 -25
  647. package/esm2022/lib/components/tabs/types/index.mjs +0 -2
  648. package/esm2022/lib/components/tabs/types/tab-config.types.mjs +0 -3
  649. package/esm2022/lib/components/tabs/utils/active-tab-underline.util.mjs +0 -112
  650. package/esm2022/lib/components/tabs/utils/index.mjs +0 -3
  651. package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +0 -272
  652. package/esm2022/lib/services/index.mjs +0 -2
  653. package/esm2022/lib/services/swipe-handler.service.mjs +0 -102
  654. package/esm2022/lib/types/index.mjs +0 -2
  655. package/esm2022/lib/types/swipe.types.mjs +0 -2
  656. package/esm2022/lib/utils/floating-ui.utils.mjs +0 -15
  657. package/esm2022/lib/utils/index.mjs +0 -2
@@ -1,942 +0,0 @@
1
- export const FALLBACK_MATCH_POSITION = -1;
2
- export const TOURNAMENT_MODE = {
3
- SINGLE_ELIMINATION: 'single-elimination',
4
- DOUBLE_ELIMINATION: 'double-elimination',
5
- GROUP: 'group',
6
- SWISS: 'swiss',
7
- SWISS_WITH_ELIMINATION: 'swiss-with-elimination',
8
- };
9
- export const COMMON_BRACKET_ROUND_TYPE = {
10
- THIRD_PLACE: 'third-place',
11
- FINAL: 'final',
12
- };
13
- export const SINGLE_ELIMINATION_BRACKET_ROUND_TYPE = {
14
- SINGLE_ELIMINATION_BRACKET: 'single-elimination-bracket',
15
- };
16
- export const DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE = {
17
- UPPER_BRACKET: 'upper-bracket',
18
- LOWER_BRACKET: 'lower-bracket',
19
- REVERSE_FINAL: 'reverse-final',
20
- };
21
- export const SWISS_BRACKET_ROUND_TYPE = {
22
- SWISS: 'swiss',
23
- };
24
- export const GROUP_BRACKET_ROUND_TYPE = {
25
- GROUP: 'group',
26
- };
27
- export const BRACKET_ROUND_MIRROR_TYPE = {
28
- LEFT: 'left',
29
- RIGHT: 'right',
30
- };
31
- export const generateRoundTypeFromEthleteRoundType = (type, tournamentMode, roundMatchCount) => {
32
- switch (type) {
33
- case 'normal':
34
- switch (tournamentMode) {
35
- case 'single-elimination':
36
- // This might break if the single elimination contains a 3rd place match + round
37
- if (roundMatchCount === 1) {
38
- return COMMON_BRACKET_ROUND_TYPE.FINAL;
39
- }
40
- else {
41
- return SINGLE_ELIMINATION_BRACKET_ROUND_TYPE.SINGLE_ELIMINATION_BRACKET;
42
- }
43
- case 'group':
44
- return GROUP_BRACKET_ROUND_TYPE.GROUP;
45
- case 'swiss':
46
- return SWISS_BRACKET_ROUND_TYPE.SWISS;
47
- default:
48
- throw new Error(`Unsupported tournament mode for a normal type round: ${tournamentMode}`);
49
- }
50
- case 'third_place':
51
- return COMMON_BRACKET_ROUND_TYPE.THIRD_PLACE;
52
- case 'final':
53
- return COMMON_BRACKET_ROUND_TYPE.FINAL;
54
- case 'reverse_final':
55
- return DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL;
56
- case 'winner_bracket':
57
- return DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET;
58
- case 'loser_bracket':
59
- return DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET;
60
- }
61
- };
62
- export const generateTournamentModeFormEthleteRounds = (source) => {
63
- const firstRound = source[0];
64
- const firstMatch = firstRound?.matches[0];
65
- if (!firstRound)
66
- throw new Error('No rounds found');
67
- if (!firstMatch)
68
- throw new Error('No matches found');
69
- switch (firstMatch.matchType) {
70
- case 'groups':
71
- return TOURNAMENT_MODE.GROUP;
72
- case 'fifa_swiss': {
73
- const lastRound = source[source.length - 1];
74
- if (!lastRound)
75
- throw new Error('No last round found');
76
- if (lastRound.matches.length !== firstRound.matches.length) {
77
- return TOURNAMENT_MODE.SWISS_WITH_ELIMINATION;
78
- }
79
- else {
80
- return TOURNAMENT_MODE.SWISS;
81
- }
82
- }
83
- case 'double_elimination':
84
- return TOURNAMENT_MODE.DOUBLE_ELIMINATION;
85
- case 'single_elimination':
86
- return TOURNAMENT_MODE.SINGLE_ELIMINATION;
87
- default:
88
- throw new Error(`Unsupported tournament mode: ${firstMatch.matchType}`);
89
- }
90
- };
91
- export const canRenderLayoutInTournamentMode = (layout, mode) => {
92
- switch (mode) {
93
- case TOURNAMENT_MODE.SINGLE_ELIMINATION:
94
- return layout === BRACKET_DATA_LAYOUT.LEFT_TO_RIGHT || layout === BRACKET_DATA_LAYOUT.MIRRORED;
95
- default:
96
- return layout === BRACKET_DATA_LAYOUT.LEFT_TO_RIGHT;
97
- }
98
- };
99
- export const BRACKET_DATA_LAYOUT = {
100
- LEFT_TO_RIGHT: 'left-to-right',
101
- // Currently only supported in single elimination brackets. Will throw an error if used in other bracket types
102
- MIRRORED: 'mirrored',
103
- };
104
- export const FIRST_ROUNDS_TYPE = {
105
- SINGLE: 'single',
106
- DOUBLE: 'double',
107
- };
108
- export const getFirstRounds = (bracketData, roundTypeMap) => {
109
- if (bracketData.mode === TOURNAMENT_MODE.DOUBLE_ELIMINATION) {
110
- const upper = roundTypeMap.get(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET)?.values().next().value;
111
- const lower = roundTypeMap.get(DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET)?.values().next().value;
112
- if (!upper || !lower)
113
- throw new Error('Upper or lower bracket is null');
114
- return {
115
- type: FIRST_ROUNDS_TYPE.DOUBLE,
116
- upper,
117
- lower,
118
- };
119
- }
120
- const first = bracketData.rounds.values().next().value;
121
- if (!first)
122
- throw new Error('First round is null');
123
- return {
124
- type: FIRST_ROUNDS_TYPE.SINGLE,
125
- first,
126
- };
127
- };
128
- export const generateMatchPositionMaps = (bracketData) => {
129
- const matchPositionMaps = new Map();
130
- for (const round of bracketData.rounds.values()) {
131
- const matchMap = new Map([...round.matches.values()].map((m) => [m.position, m]));
132
- matchPositionMaps.set(round.id, matchMap);
133
- }
134
- return matchPositionMaps;
135
- };
136
- export const generateBracketRoundTypeMap = (bracketData) => {
137
- const roundAmountMap = new Map();
138
- for (const round of bracketData.rounds.values()) {
139
- if (!roundAmountMap.has(round.type)) {
140
- roundAmountMap.set(round.type, new Map([[round.id, round]]));
141
- }
142
- else {
143
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
144
- roundAmountMap.set(round.type, roundAmountMap.get(round.type).set(round.id, round));
145
- }
146
- }
147
- return roundAmountMap;
148
- };
149
- export const generateRoundRelations = (bracketData) => {
150
- const roundRelations = new Map();
151
- const allRounds = bracketData.roundIds.map((id) => bracketData.rounds.get(id)).filter((r) => !!r);
152
- const upperRounds = allRounds.filter((r) => r.type !== DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET);
153
- const lowerRounds = allRounds.filter((r) => r.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET);
154
- const firstUpperRound = upperRounds[0] || null;
155
- const firstLowerRound = lowerRounds[0] || null;
156
- if (!firstUpperRound)
157
- throw new Error('firstUpperRound is null');
158
- const hasLowerRounds = lowerRounds.length > 0;
159
- const lastLowerRound = lowerRounds[lowerRounds.length - 1] || null;
160
- for (const [currentUpperRoundIndex, currentUpperRound] of upperRounds.entries()) {
161
- const isLeftToRight = currentUpperRound.mirrorRoundType === null ||
162
- currentUpperRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.LEFT;
163
- const relativePreviousUpperRound = upperRounds[currentUpperRoundIndex - 1] || null;
164
- const relativeNextUpperRound = upperRounds[currentUpperRoundIndex + 1] || null;
165
- const previousUpperRound = isLeftToRight ? relativePreviousUpperRound : relativeNextUpperRound;
166
- const nextUpperRound = isLeftToRight ? relativeNextUpperRound : relativePreviousUpperRound;
167
- const currentLowerRound = lowerRounds[currentUpperRoundIndex] || null;
168
- const previousLowerRound = lowerRounds[currentUpperRoundIndex - 1] || null;
169
- const nextLowerRound = lowerRounds[currentUpperRoundIndex + 1] || null;
170
- const isLastUpperRound = !nextUpperRound ||
171
- (nextUpperRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT &&
172
- currentUpperRound.mirrorRoundType === null);
173
- const isFinal = currentUpperRound.type === COMMON_BRACKET_ROUND_TYPE.FINAL;
174
- if (isFinal && hasLowerRounds) {
175
- // two to one relation
176
- if (!lastLowerRound || !currentLowerRound || !previousUpperRound)
177
- throw new Error('lastLowerRound or currentLowerRound or previousUpperRound is null');
178
- // in a sync double elimination bracket, the final round has the same index as the last lower round
179
- // in an async one, there is always one more round in the lower bracket since we only display a section of the whole tournament
180
- const isAsyncBracket = currentLowerRound.id !== lastLowerRound.id;
181
- const finalLowerRound = isAsyncBracket ? nextLowerRound : currentLowerRound;
182
- if (!finalLowerRound)
183
- throw new Error('finalLowerRound is null');
184
- if (!firstLowerRound)
185
- throw new Error('firstLowerRound is null');
186
- if (finalLowerRound.id !== lastLowerRound.id)
187
- throw new Error('finalLowerRound is not the last lower round');
188
- // if we have a reverse final
189
- if (nextUpperRound) {
190
- // for the final
191
- roundRelations.set(currentUpperRound.id, {
192
- type: 'two-to-one',
193
- previousUpperRound: previousUpperRound,
194
- previousLowerRound: finalLowerRound,
195
- nextRound: nextUpperRound,
196
- currentRound: currentUpperRound,
197
- nextRoundMatchFactor: nextUpperRound.matchCount / currentUpperRound.matchCount,
198
- previousUpperRoundMatchFactor: previousUpperRound.matchCount / currentUpperRound.matchCount,
199
- previousLowerRoundMatchFactor: finalLowerRound.matchCount / currentUpperRound.matchCount,
200
- upperRootRoundMatchFactor: firstUpperRound.matchCount / currentUpperRound.matchCount,
201
- lowerRootRoundMatchFactor: firstLowerRound.matchCount / currentUpperRound.matchCount,
202
- });
203
- }
204
- else {
205
- // no reverse final means the final is the last round
206
- // for the final
207
- roundRelations.set(currentUpperRound.id, {
208
- type: 'two-to-nothing',
209
- previousUpperRound: previousUpperRound,
210
- previousLowerRound: finalLowerRound,
211
- currentRound: currentUpperRound,
212
- previousLowerRoundMatchFactor: finalLowerRound.matchCount / currentUpperRound.matchCount,
213
- previousUpperRoundMatchFactor: previousUpperRound.matchCount / currentUpperRound.matchCount,
214
- lowerRootRoundMatchFactor: firstLowerRound.matchCount / currentUpperRound.matchCount,
215
- upperRootRoundMatchFactor: firstUpperRound.matchCount / currentUpperRound.matchCount,
216
- });
217
- }
218
- if (isAsyncBracket) {
219
- // if this is an async bracket, we need to set the relations for the 2 last lower rounds since they will be skipped by the default one to one logic
220
- const preFinalLowerRound = lowerRounds[lowerRounds.length - 2] || null;
221
- const prePreFinalLowerRound = lowerRounds[lowerRounds.length - 3] || null;
222
- if (!preFinalLowerRound)
223
- throw new Error('preFinalLowerRound is null');
224
- if (!firstLowerRound)
225
- throw new Error('firstLowerRound is null');
226
- // for the last lower round
227
- roundRelations.set(finalLowerRound.id, {
228
- type: 'one-to-one',
229
- previousRound: preFinalLowerRound,
230
- nextRound: currentUpperRound,
231
- currentRound: finalLowerRound,
232
- nextRoundMatchFactor: currentUpperRound.matchCount / finalLowerRound.matchCount,
233
- previousRoundMatchFactor: preFinalLowerRound.matchCount / finalLowerRound.matchCount,
234
- rootRoundMatchFactor: firstLowerRound.matchCount / finalLowerRound.matchCount,
235
- });
236
- if (prePreFinalLowerRound) {
237
- // for the pre final lower round
238
- roundRelations.set(preFinalLowerRound.id, {
239
- type: 'one-to-one',
240
- previousRound: prePreFinalLowerRound,
241
- nextRound: finalLowerRound,
242
- currentRound: preFinalLowerRound,
243
- nextRoundMatchFactor: finalLowerRound.matchCount / preFinalLowerRound.matchCount,
244
- previousRoundMatchFactor: prePreFinalLowerRound.matchCount / preFinalLowerRound.matchCount,
245
- rootRoundMatchFactor: firstLowerRound.matchCount / preFinalLowerRound.matchCount,
246
- });
247
- }
248
- else {
249
- // for the first lower round
250
- roundRelations.set(preFinalLowerRound.id, {
251
- type: 'nothing-to-one',
252
- nextRound: finalLowerRound,
253
- currentRound: preFinalLowerRound,
254
- nextRoundMatchFactor: finalLowerRound.matchCount / preFinalLowerRound.matchCount,
255
- });
256
- }
257
- }
258
- else {
259
- // this is a sync bracket, we only need to set the relation for the last lower round
260
- if (!previousLowerRound)
261
- throw new Error('previousLowerRound is null');
262
- if (!firstLowerRound)
263
- throw new Error('firstLowerRound is null');
264
- // for the last lower round
265
- roundRelations.set(finalLowerRound.id, {
266
- type: 'one-to-one',
267
- previousRound: previousLowerRound,
268
- nextRound: currentUpperRound,
269
- currentRound: finalLowerRound,
270
- nextRoundMatchFactor: currentUpperRound.matchCount / finalLowerRound.matchCount,
271
- previousRoundMatchFactor: previousLowerRound.matchCount / finalLowerRound.matchCount,
272
- rootRoundMatchFactor: firstLowerRound.matchCount / finalLowerRound.matchCount,
273
- });
274
- }
275
- }
276
- else if (isLastUpperRound) {
277
- // one to nothing relation
278
- if (!previousUpperRound)
279
- throw new Error('previousUpperRound is null');
280
- roundRelations.set(currentUpperRound.id, {
281
- type: 'one-to-nothing',
282
- previousRound: previousUpperRound,
283
- currentRound: currentUpperRound,
284
- previousRoundMatchFactor: previousUpperRound.matchCount / currentUpperRound.matchCount,
285
- rootRoundMatchFactor: firstUpperRound.matchCount / currentUpperRound.matchCount,
286
- });
287
- }
288
- else if (currentUpperRound.isFirstRound) {
289
- // nothing to one relation
290
- if (!nextUpperRound)
291
- throw new Error('nextUpperRound is null');
292
- roundRelations.set(currentUpperRound.id, {
293
- type: 'nothing-to-one',
294
- nextRound: nextUpperRound,
295
- currentRound: currentUpperRound,
296
- nextRoundMatchFactor: nextUpperRound.matchCount / currentUpperRound.matchCount,
297
- });
298
- if (currentLowerRound) {
299
- if (!nextLowerRound)
300
- throw new Error('nextLowerRound is null');
301
- roundRelations.set(currentLowerRound.id, {
302
- type: 'nothing-to-one',
303
- nextRound: nextLowerRound,
304
- currentRound: currentLowerRound,
305
- nextRoundMatchFactor: nextLowerRound.matchCount / currentLowerRound.matchCount,
306
- });
307
- }
308
- }
309
- else {
310
- // one to one relation
311
- if (!previousUpperRound)
312
- throw new Error('previousUpperRound is null');
313
- if (!nextUpperRound)
314
- throw new Error('nextUpperRound is null');
315
- roundRelations.set(currentUpperRound.id, {
316
- type: 'one-to-one',
317
- previousRound: previousUpperRound,
318
- nextRound: nextUpperRound,
319
- currentRound: currentUpperRound,
320
- nextRoundMatchFactor: nextUpperRound.matchCount / currentUpperRound.matchCount,
321
- previousRoundMatchFactor: previousUpperRound.matchCount / currentUpperRound.matchCount,
322
- rootRoundMatchFactor: firstUpperRound.matchCount / currentUpperRound.matchCount,
323
- });
324
- // we only want to set lower rounds here until the special merging point of the final.
325
- // lower bracket rounds after and including the final will be set in the final round block
326
- if (currentLowerRound && currentUpperRound.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET) {
327
- if (!previousLowerRound)
328
- throw new Error('previousLowerRound is null');
329
- if (!nextLowerRound)
330
- throw new Error('nextLowerRound is null');
331
- if (!firstLowerRound)
332
- throw new Error('firstLowerRound is null');
333
- roundRelations.set(currentLowerRound.id, {
334
- type: 'one-to-one',
335
- previousRound: previousLowerRound,
336
- nextRound: nextLowerRound,
337
- currentRound: currentLowerRound,
338
- nextRoundMatchFactor: nextLowerRound.matchCount / currentLowerRound.matchCount,
339
- previousRoundMatchFactor: previousLowerRound.matchCount / currentLowerRound.matchCount,
340
- rootRoundMatchFactor: firstLowerRound.matchCount / currentLowerRound.matchCount,
341
- });
342
- }
343
- }
344
- }
345
- return roundRelations;
346
- };
347
- export const generateMatchRelations = (bracketData, roundRelations, matchPositionMaps) => {
348
- const matchRelations = new Map();
349
- for (const match of bracketData.matches.values()) {
350
- const currentRelation = roundRelations.get(match.round.id);
351
- if (!currentRelation)
352
- throw new Error('Match round not found');
353
- const { nextRoundMatchPosition, previousLowerRoundMatchPosition, previousUpperRoundMatchPosition } = generateMatchRelationPositions(currentRelation, match);
354
- switch (currentRelation.type) {
355
- case 'nothing-to-one': {
356
- const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextRoundMatchPosition);
357
- if (!nextMatch)
358
- throw new Error('Next round match not found');
359
- // means left is nothing. right is one
360
- matchRelations.set(match.id, {
361
- type: 'nothing-to-one',
362
- currentMatch: match,
363
- currentRound: currentRelation.currentRound,
364
- nextRound: currentRelation.nextRound,
365
- nextMatch,
366
- });
367
- break;
368
- }
369
- case 'one-to-nothing': {
370
- const previousUpperMatch = matchPositionMaps
371
- .get(currentRelation.previousRound.id)
372
- ?.get(previousUpperRoundMatchPosition);
373
- const previousLowerMatch = matchPositionMaps
374
- .get(currentRelation.previousRound.id)
375
- ?.get(previousLowerRoundMatchPosition);
376
- if (!previousUpperMatch)
377
- throw new Error('Previous round match not found');
378
- if (previousUpperRoundMatchPosition !== previousLowerRoundMatchPosition) {
379
- // means left is two. right is one
380
- if (!previousLowerMatch)
381
- throw new Error('Previous lower round match not found');
382
- matchRelations.set(match.id, {
383
- type: 'two-to-nothing',
384
- currentMatch: match,
385
- currentRound: currentRelation.currentRound,
386
- previousUpperMatch,
387
- previousUpperRound: currentRelation.previousRound,
388
- previousLowerMatch,
389
- previousLowerRound: currentRelation.previousRound,
390
- });
391
- }
392
- else {
393
- // means left is one. right is nothing
394
- matchRelations.set(match.id, {
395
- type: 'one-to-nothing',
396
- currentMatch: match,
397
- currentRound: currentRelation.currentRound,
398
- previousMatch: previousUpperMatch,
399
- previousRound: currentRelation.previousRound,
400
- });
401
- }
402
- break;
403
- }
404
- case 'one-to-one': {
405
- const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextRoundMatchPosition);
406
- const previousUpperMatch = matchPositionMaps
407
- .get(currentRelation.previousRound.id)
408
- ?.get(previousUpperRoundMatchPosition);
409
- const previousLowerMatch = matchPositionMaps
410
- .get(currentRelation.previousRound.id)
411
- ?.get(previousLowerRoundMatchPosition);
412
- if (!nextMatch)
413
- throw new Error('Next round match not found');
414
- if (!previousUpperMatch)
415
- throw new Error(`Previous upper round match not found`);
416
- if (!previousLowerMatch)
417
- throw new Error('Previous lower round match not found');
418
- // can be either one to one or two to one
419
- const isLeftOne = previousUpperRoundMatchPosition === previousLowerRoundMatchPosition;
420
- if (isLeftOne) {
421
- // one-to-one
422
- matchRelations.set(match.id, {
423
- type: 'one-to-one',
424
- currentMatch: match,
425
- currentRound: currentRelation.currentRound,
426
- previousMatch: previousUpperMatch,
427
- previousRound: currentRelation.previousRound,
428
- nextMatch,
429
- nextRound: currentRelation.nextRound,
430
- });
431
- }
432
- else {
433
- // two-to-one
434
- matchRelations.set(match.id, {
435
- type: 'two-to-one',
436
- currentMatch: match,
437
- currentRound: currentRelation.currentRound,
438
- previousUpperMatch,
439
- previousUpperRound: currentRelation.previousRound,
440
- previousLowerMatch,
441
- previousLowerRound: currentRelation.previousRound,
442
- nextMatch,
443
- nextRound: currentRelation.nextRound,
444
- });
445
- }
446
- break;
447
- }
448
- case 'two-to-one': {
449
- const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextRoundMatchPosition);
450
- const previousUpperMatch = matchPositionMaps
451
- .get(currentRelation.previousUpperRound.id)
452
- ?.get(previousUpperRoundMatchPosition);
453
- const previousLowerMatch = matchPositionMaps
454
- .get(currentRelation.previousLowerRound.id)
455
- ?.get(previousLowerRoundMatchPosition);
456
- if (!nextMatch)
457
- throw new Error('Next round match not found');
458
- if (!previousUpperMatch)
459
- throw new Error(`Previous upper round match not found`);
460
- if (!previousLowerMatch)
461
- throw new Error('Previous lower round match not found');
462
- matchRelations.set(match.id, {
463
- type: 'two-to-one',
464
- currentMatch: match,
465
- currentRound: currentRelation.currentRound,
466
- previousUpperMatch,
467
- previousUpperRound: currentRelation.previousUpperRound,
468
- previousLowerMatch,
469
- previousLowerRound: currentRelation.previousLowerRound,
470
- nextMatch,
471
- nextRound: currentRelation.nextRound,
472
- });
473
- break;
474
- }
475
- case 'two-to-nothing': {
476
- const previousUpperMatch = matchPositionMaps
477
- .get(currentRelation.previousUpperRound.id)
478
- ?.get(previousUpperRoundMatchPosition);
479
- const previousLowerMatch = matchPositionMaps
480
- .get(currentRelation.previousUpperRound.id)
481
- ?.get(previousLowerRoundMatchPosition);
482
- if (!previousUpperMatch)
483
- throw new Error(`Previous upper round match not found`);
484
- if (!previousLowerMatch)
485
- throw new Error('Previous lower round match not found');
486
- matchRelations.set(match.id, {
487
- type: 'two-to-nothing',
488
- currentMatch: match,
489
- currentRound: currentRelation.currentRound,
490
- previousUpperMatch,
491
- previousUpperRound: currentRelation.previousUpperRound,
492
- previousLowerMatch,
493
- previousLowerRound: currentRelation.previousUpperRound,
494
- });
495
- break;
496
- }
497
- }
498
- }
499
- return matchRelations;
500
- };
501
- export const generateMatchRelationPositions = (currentRelation, match) => {
502
- switch (currentRelation.type) {
503
- case 'nothing-to-one': {
504
- return {
505
- nextRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
506
- previousUpperRoundMatchPosition: FALLBACK_MATCH_POSITION,
507
- previousLowerRoundMatchPosition: FALLBACK_MATCH_POSITION,
508
- };
509
- }
510
- case 'one-to-nothing': {
511
- const previousRoundHasDoubleTheMatchCount = currentRelation.previousRoundMatchFactor === 2;
512
- const doubleUpperMatchCountShift = previousRoundHasDoubleTheMatchCount ? 1 : 0;
513
- return {
514
- nextRoundMatchPosition: FALLBACK_MATCH_POSITION,
515
- previousUpperRoundMatchPosition: (generateMatchPosition(match, currentRelation.previousRoundMatchFactor) -
516
- doubleUpperMatchCountShift),
517
- previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousRoundMatchFactor),
518
- };
519
- }
520
- case 'one-to-one': {
521
- const previousRoundHasDoubleTheMatchCount = currentRelation.previousRoundMatchFactor === 2;
522
- const doubleUpperMatchCountShift = previousRoundHasDoubleTheMatchCount ? 1 : 0;
523
- return {
524
- nextRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
525
- previousUpperRoundMatchPosition: (generateMatchPosition(match, currentRelation.previousRoundMatchFactor) -
526
- doubleUpperMatchCountShift),
527
- previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousRoundMatchFactor),
528
- };
529
- }
530
- case 'two-to-one': {
531
- return {
532
- nextRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
533
- previousUpperRoundMatchPosition: generateMatchPosition(match, currentRelation.previousUpperRoundMatchFactor),
534
- previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousLowerRoundMatchFactor),
535
- };
536
- }
537
- case 'two-to-nothing': {
538
- return {
539
- nextRoundMatchPosition: FALLBACK_MATCH_POSITION,
540
- previousUpperRoundMatchPosition: generateMatchPosition(match, currentRelation.previousUpperRoundMatchFactor),
541
- previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousLowerRoundMatchFactor),
542
- };
543
- }
544
- }
545
- };
546
- export const generateMatchPosition = (match, factor) => {
547
- return Math.ceil(match.position * factor);
548
- };
549
- export const logRoundRelations = (roundRelations, bracketData) => {
550
- for (const [roundId, relation] of roundRelations.entries()) {
551
- const round = bracketData.rounds.get(roundId);
552
- if (!round) {
553
- console.error(`Round with id ${roundId} not found in bracket data. The bracket will be malformed.`);
554
- continue;
555
- }
556
- switch (relation.type) {
557
- case 'nothing-to-one':
558
- console.log(`START: ${round.name} -> ${relation.nextRound.name} (F: ${relation.nextRoundMatchFactor})`);
559
- break;
560
- case 'one-to-nothing':
561
- console.log(`${relation.previousRound.name} (F: ${relation.previousRoundMatchFactor}) <- ENDING: ${round.name}`);
562
- break;
563
- case 'one-to-one':
564
- console.log(`${relation.previousRound.name} (F: ${relation.previousRoundMatchFactor}) <- ${round.name} -> ${relation.nextRound.name} (F: ${relation.nextRoundMatchFactor})`);
565
- break;
566
- case 'two-to-one':
567
- console.log(`MERGER: ${relation.previousUpperRound.name} (F: ${relation.previousUpperRoundMatchFactor}) AND ${relation.previousLowerRound.name} (F: ${relation.previousLowerRoundMatchFactor}) <- ${round.name} -> ${relation.nextRound.name} (F: ${relation.nextRoundMatchFactor})`);
568
- break;
569
- case 'two-to-nothing':
570
- console.log(`MERGER: ${relation.previousUpperRound.name} (F: ${relation.previousUpperRoundMatchFactor}) AND ${relation.previousLowerRound.name} (F: ${relation.previousLowerRoundMatchFactor}) <- ENDING: ${round.name}`);
571
- break;
572
- }
573
- }
574
- };
575
- export const generateMatchParticipantMap = (bracketData) => {
576
- const matchParticipantMap = new Map();
577
- const hasElimination = bracketData.mode === TOURNAMENT_MODE.SINGLE_ELIMINATION ||
578
- bracketData.mode === TOURNAMENT_MODE.DOUBLE_ELIMINATION ||
579
- bracketData.mode === TOURNAMENT_MODE.SWISS_WITH_ELIMINATION;
580
- for (const participant of bracketData.participants.values()) {
581
- let winsTilNow = 0;
582
- let lossesTilNow = 0;
583
- let tiesTilNow = 0;
584
- for (const matchParticipantMatch of participant.matches.values()) {
585
- const isWinner = matchParticipantMatch.bracketMatch.winnerSide === matchParticipantMatch.side;
586
- const isLooser = matchParticipantMatch.bracketMatch.winnerSide &&
587
- matchParticipantMatch.bracketMatch.winnerSide !== matchParticipantMatch.side;
588
- const isTie = matchParticipantMatch.bracketMatch.status === 'completed' && !matchParticipantMatch.bracketMatch.winner;
589
- if (isWinner) {
590
- winsTilNow++;
591
- }
592
- else if (isLooser) {
593
- lossesTilNow++;
594
- }
595
- else if (isTie) {
596
- tiesTilNow++;
597
- }
598
- let isEliminated = false;
599
- let isEliminationMatch = false;
600
- if (hasElimination) {
601
- // TODO: Implement elimination logic
602
- // Means the current match is loss and it's the last match of the participant
603
- isEliminated = false;
604
- // Always true for single elimination, never for e.g. groups, depends on the round for double elimination, depends on the loss count for swiss with elimination
605
- isEliminationMatch = false;
606
- }
607
- // TODO: Implement round logic
608
- // true if its the first round of the bracket
609
- const isFirstRound = false;
610
- // true if its the last round of the bracket (eg. final for single elimination)
611
- const isLastRound = false;
612
- const participantMatchData = {
613
- bracketMatch: matchParticipantMatch.bracketMatch,
614
- result: isWinner ? 'win' : isLooser ? 'loss' : isTie ? 'tie' : null,
615
- isEliminated,
616
- isEliminationMatch,
617
- isFirstRound,
618
- isLastRound,
619
- tieCount: tiesTilNow,
620
- winCount: winsTilNow,
621
- lossCount: lossesTilNow,
622
- };
623
- if (!matchParticipantMap.has(participant.id)) {
624
- matchParticipantMap.set(participant.id, {
625
- id: participant.id,
626
- name: participant.name,
627
- matches: new Map(),
628
- });
629
- }
630
- const participantData = matchParticipantMap.get(participant.id);
631
- participantData.matches.set(matchParticipantMatch.bracketMatch.id, participantMatchData);
632
- }
633
- }
634
- return matchParticipantMap;
635
- };
636
- const factorialCache = new Map();
637
- export const getAvailableSwissGroupsForRound = (roundNumber, totalMatchesInRound) => {
638
- const ADVANCE_WINS = 3;
639
- const ELIMINATE_LOSSES = 3;
640
- // Cache factorial calculations
641
- const getFactorial = (n) => {
642
- if (n <= 1)
643
- return 1;
644
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
645
- if (factorialCache.has(n))
646
- return factorialCache.get(n);
647
- const result = n * getFactorial(n - 1);
648
- factorialCache.set(n, result);
649
- return result;
650
- };
651
- // Pre-calculate roundFactorial
652
- const roundFact = getFactorial(roundNumber);
653
- let totalCombinations = 0;
654
- const validGroups = [];
655
- // Single loop to gather valid groups and total combinations
656
- for (let wins = roundNumber; wins >= 0; wins--) {
657
- const losses = roundNumber - wins;
658
- const remainingGames = ADVANCE_WINS + ELIMINATE_LOSSES - (wins + losses) - 1;
659
- const notYetEliminated = losses < ELIMINATE_LOSSES;
660
- const canStillAdvance = wins < ADVANCE_WINS && remainingGames >= 0;
661
- if (!canStillAdvance || !notYetEliminated)
662
- continue;
663
- const combinations = roundFact / (getFactorial(wins) * getFactorial(losses));
664
- totalCombinations += combinations;
665
- validGroups.push({ wins, losses, combinations });
666
- }
667
- // Create final groups with calculated proportions
668
- return validGroups.map(({ wins, losses, combinations }) => ({
669
- id: `${wins}-${losses}`,
670
- name: `${wins}-${losses}`,
671
- matchesInGroup: Math.round((combinations / totalCombinations) * totalMatchesInRound),
672
- }));
673
- };
674
- export const generateBracketRoundSwissGroupMaps = (bracketData, matchParticipantMap) => {
675
- if (bracketData.mode !== TOURNAMENT_MODE.SWISS_WITH_ELIMINATION) {
676
- return null;
677
- }
678
- const roundsWithSwissGroups = new Map();
679
- let roundNumber = 0;
680
- for (const bracketRound of bracketData.rounds.values()) {
681
- const availableGroups = getAvailableSwissGroupsForRound(roundNumber, bracketRound.matchCount);
682
- const roundSwissData = {
683
- groups: new Map(),
684
- };
685
- for (const group of availableGroups) {
686
- const subGroup = {
687
- id: group.id,
688
- name: group.name,
689
- matches: new Map(),
690
- allowedMatchCount: group.matchesInGroup,
691
- };
692
- roundSwissData.groups.set(group.id, subGroup);
693
- }
694
- const emptyMatchIds = [];
695
- for (const match of bracketRound.matches.values()) {
696
- const participantHome = match.home ? (matchParticipantMap.get(match.home.id) ?? null) : null;
697
- const participantAway = match.away ? (matchParticipantMap.get(match.away.id) ?? null) : null;
698
- const anyParticipant = participantHome || participantAway;
699
- if (!anyParticipant) {
700
- emptyMatchIds.push(match.id);
701
- continue;
702
- }
703
- const matchParticipantMatch = anyParticipant.matches.get(match.id);
704
- if (!matchParticipantMatch)
705
- throw new Error('Match participant match not found');
706
- const wins = matchParticipantMatch.winCount;
707
- const losses = matchParticipantMatch.lossCount;
708
- const group = roundSwissData.groups.get(`${wins}-${losses}`);
709
- if (!group)
710
- throw new Error('Group not found for match: ' + match.id);
711
- group.matches.set(match.id, match);
712
- }
713
- for (const emptyMatchId of emptyMatchIds) {
714
- const match = bracketRound.matches.get(emptyMatchId);
715
- if (!match)
716
- throw new Error('Empty match not found');
717
- let groupFound = false;
718
- for (const group of roundSwissData.groups.values()) {
719
- if (group.matches.size < group.allowedMatchCount) {
720
- group.matches.set(match.id, match);
721
- groupFound = true;
722
- break;
723
- }
724
- }
725
- if (!groupFound) {
726
- throw new Error('No group found for empty match');
727
- }
728
- }
729
- roundNumber++;
730
- }
731
- return roundsWithSwissGroups;
732
- };
733
- export const generateBracketDataForEthlete = (source) => {
734
- const tournamentMode = generateTournamentModeFormEthleteRounds(source);
735
- const bracketData = {
736
- rounds: [],
737
- matches: [],
738
- mode: tournamentMode,
739
- };
740
- for (const currentItem of source) {
741
- if (bracketData.rounds.some((r) => r.id === currentItem.round.id)) {
742
- throw new Error(`Round with id ${currentItem.round.id} already exists in the bracket data.`);
743
- }
744
- const roundType = generateRoundTypeFromEthleteRoundType(currentItem.round.type, tournamentMode, currentItem.matches.length);
745
- const bracketRound = {
746
- type: roundType,
747
- id: currentItem.round.id,
748
- data: currentItem.round,
749
- name: currentItem.round.name || currentItem.round.type,
750
- };
751
- bracketData.rounds.push(bracketRound);
752
- for (const match of currentItem.matches) {
753
- if (bracketData.matches.some((m) => m.id === match.id)) {
754
- throw new Error(`Match with id ${match.id} already exists in the bracket data.`);
755
- }
756
- const bracketMatch = {
757
- id: match.id,
758
- data: match,
759
- roundId: currentItem.round.id,
760
- home: match.home?.id || null,
761
- away: match.away?.id || null,
762
- winner: match.winningSide,
763
- status: match.status === 'published' ? 'completed' : 'pending',
764
- };
765
- bracketData.matches.push(bracketMatch);
766
- }
767
- }
768
- return bracketData;
769
- };
770
- const generateAndSetBracketMatchWithParticipants = (match, options) => {
771
- const matchId = match.id;
772
- const { bracketData, bracketRound, currentIndexInRound, participantCounter } = options;
773
- let localParticipantCounter = participantCounter;
774
- const bracketMatch = {
775
- id: matchId,
776
- indexInRound: currentIndexInRound,
777
- position: (currentIndexInRound + 1),
778
- data: match.data,
779
- round: bracketRound,
780
- home: null,
781
- away: null,
782
- status: match.status,
783
- winnerSide: match.winner,
784
- winner: null,
785
- };
786
- bracketData.matches.set(matchId, bracketMatch);
787
- bracketRound.matches.set(matchId, bracketMatch);
788
- const participantIds = [match.home, match.away];
789
- for (const [participantIndex, participantId] of participantIds.entries()) {
790
- if (!participantId)
791
- continue;
792
- const side = participantIndex === 0 ? 'home' : 'away';
793
- if (!bracketData.participants.has(participantId)) {
794
- bracketData.participants.set(participantId, {
795
- id: participantId,
796
- shortId: `p${localParticipantCounter++}`,
797
- name: `${side} ${currentIndexInRound}`,
798
- matches: new Map(),
799
- });
800
- }
801
- const participantData = bracketData.participants.get(participantId);
802
- if (!participantData.matches.has(bracketMatch.id)) {
803
- participantData.matches.set(bracketMatch.id, {
804
- side: match.home === participantId ? 'home' : 'away',
805
- bracketMatch,
806
- });
807
- }
808
- bracketMatch[side] = participantData;
809
- if (bracketMatch.winnerSide === side) {
810
- bracketMatch.winner = participantData;
811
- }
812
- }
813
- return bracketMatch;
814
- };
815
- export const generateBracketData = (source, options) => {
816
- if (!canRenderLayoutInTournamentMode(options.layout, source.mode)) {
817
- throw new Error(`Cannot render layout ${options.layout} in mode ${source.mode}`);
818
- }
819
- const shouldSplitRoundsInTwo = options.layout === BRACKET_DATA_LAYOUT.MIRRORED;
820
- const bracketData = {
821
- matches: new Map(),
822
- mode: source.mode,
823
- participants: new Map(),
824
- rounds: new Map(),
825
- roundIds: [],
826
- matchIds: [],
827
- };
828
- let currentUpperBracketIndex = 0;
829
- let currentLowerBracketIndex = 0;
830
- const splitRoundsRest = [];
831
- for (const [roundIndex, round] of source.rounds.entries()) {
832
- const isLowerBracket = round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET;
833
- const matches = source.matches.filter((m) => m.roundId === round.id);
834
- const roundId = round.id;
835
- const shouldSplitRound = shouldSplitRoundsInTwo && matches.length % 2 === 0;
836
- const isFirstRound = roundIndex === 0;
837
- if (shouldSplitRound) {
838
- const firstHalfMatchesMaxIndex = matches.length / 2 - 1;
839
- const firstHalfRoundId = `${roundId}--half-1`;
840
- const secondHalfRoundId = `${roundId}--half-2`;
841
- const bracketRoundFirstHalf = {
842
- type: round.type,
843
- id: firstHalfRoundId,
844
- index: isLowerBracket ? currentLowerBracketIndex : currentUpperBracketIndex,
845
- data: round.data,
846
- position: ((isLowerBracket ? currentLowerBracketIndex : currentUpperBracketIndex) + 1),
847
- name: round.name,
848
- matchCount: matches.length / 2,
849
- matches: new Map(),
850
- mirrorRoundType: BRACKET_ROUND_MIRROR_TYPE.LEFT,
851
- isFirstRound,
852
- };
853
- const bracketRoundSecondHalf = {
854
- type: round.type,
855
- id: secondHalfRoundId,
856
- index: -1,
857
- data: round.data,
858
- position: -1,
859
- name: round.name,
860
- matchCount: matches.length / 2,
861
- matches: new Map(),
862
- mirrorRoundType: BRACKET_ROUND_MIRROR_TYPE.RIGHT,
863
- isFirstRound,
864
- };
865
- bracketData.roundIds.push(firstHalfRoundId);
866
- bracketData.rounds.set(firstHalfRoundId, bracketRoundFirstHalf);
867
- splitRoundsRest.unshift(bracketRoundSecondHalf);
868
- for (let index = 0; index <= firstHalfMatchesMaxIndex; index++) {
869
- const matchFirst = matches[index];
870
- const matchSecond = matches[firstHalfMatchesMaxIndex + 1 + index];
871
- if (!matchFirst || !matchSecond)
872
- throw new Error('Match not found');
873
- const participantCounter = bracketData.participants.size;
874
- const bracketMatchFirst = generateAndSetBracketMatchWithParticipants(matchFirst, {
875
- bracketData,
876
- bracketRound: bracketRoundFirstHalf,
877
- currentIndexInRound: index,
878
- participantCounter,
879
- });
880
- // The participant counter might have changed after the first half
881
- const updatedParticipantCounter = bracketData.participants.size;
882
- const bracketMatchSecond = generateAndSetBracketMatchWithParticipants(matchSecond, {
883
- bracketData,
884
- bracketRound: bracketRoundSecondHalf,
885
- currentIndexInRound: index,
886
- participantCounter: updatedParticipantCounter,
887
- });
888
- bracketData.matchIds.push(bracketMatchFirst.id, bracketMatchSecond.id);
889
- }
890
- }
891
- else {
892
- const bracketRound = {
893
- type: round.type,
894
- id: roundId,
895
- index: isLowerBracket ? currentLowerBracketIndex : currentUpperBracketIndex,
896
- data: round.data,
897
- position: ((isLowerBracket ? currentLowerBracketIndex : currentUpperBracketIndex) + 1),
898
- name: round.name,
899
- matchCount: matches.length,
900
- matches: new Map(),
901
- mirrorRoundType: null,
902
- isFirstRound,
903
- };
904
- bracketData.roundIds.push(roundId);
905
- bracketData.rounds.set(roundId, bracketRound);
906
- let currentIndexInRound = 0;
907
- for (const match of matches) {
908
- const participantCounter = bracketData.participants.size;
909
- const bracketMatch = generateAndSetBracketMatchWithParticipants(match, {
910
- bracketData,
911
- bracketRound,
912
- currentIndexInRound,
913
- participantCounter,
914
- });
915
- bracketData.matchIds.push(bracketMatch.id);
916
- currentIndexInRound++;
917
- }
918
- }
919
- if (isLowerBracket) {
920
- currentLowerBracketIndex++;
921
- }
922
- else {
923
- currentUpperBracketIndex++;
924
- }
925
- }
926
- if (splitRoundsRest.length) {
927
- const lastRoundId = bracketData.roundIds[bracketData.roundIds.length - 1];
928
- if (!lastRoundId)
929
- throw new Error('Last round id not found');
930
- const lastRound = bracketData.rounds.get(lastRoundId);
931
- if (!lastRound)
932
- throw new Error('Last round not found');
933
- for (const [splitRoundIndex, splitRound] of splitRoundsRest.entries()) {
934
- splitRound.index = lastRound.index + splitRoundIndex + 1;
935
- splitRound.position = (lastRound.position + splitRoundIndex + 1);
936
- bracketData.rounds.set(splitRound.id, splitRound);
937
- bracketData.roundIds.push(splitRound.id);
938
- }
939
- }
940
- return bracketData;
941
- };
942
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhY2tldC1uZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvYnJhY2tldC9jb21wb25lbnRzL25ldy1icmFja2V0L2JyYWNrZXQtbmV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQXlCLENBQUM7QUFFbEUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLHNCQUFzQixFQUFFLHdCQUF3QjtDQUN4QyxDQUFDO0FBSVgsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsV0FBVyxFQUFFLGFBQWE7SUFDMUIsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUc7SUFDbkQsMEJBQTBCLEVBQUUsNEJBQTRCO0NBQ2hELENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxxQ0FBcUMsR0FBRztJQUNuRCxhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtDQUN0QixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBeUJYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHO0lBQ3ZDLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBNlFYLE1BQU0sQ0FBQyxNQUFNLHFDQUFxQyxHQUFHLENB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N0IsQ0FBQzthQUFNLENBQUM7WUFDTix3QkFBd0IsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMsV0FBVztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUU3RCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUV4RCxLQUFLLE1BQU0sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdEUsVUFBVSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDekQsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsZUFBZSxHQUFHLENBQUMsQ0FBeUIsQ0FBQztZQUN6RixXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE1hdGNoTGlzdFZpZXdVbmlvbixcbiAgT3Bwb25lbnRTaWRlLFxuICBSb3VuZFN0YWdlU3RydWN0dXJlVmlldyxcbiAgUm91bmRTdGFnZVN0cnVjdHVyZVdpdGhNYXRjaGVzVmlldyxcbiAgUm91bmRUeXBlLFxufSBmcm9tICdAZXRobGV0ZS90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZElkID0gc3RyaW5nICYgeyBfX2JyYW5kOiAnQnJhY2tldFJvdW5kSWQnIH07XG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hJZCA9IHN0cmluZyAmIHsgX19icmFuZDogJ0JyYWNrZXRNYXRjaElkJyB9O1xuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUG9zaXRpb24gPSBudW1iZXIgJiB7IF9fYnJhbmQ6ICdCcmFja2V0Um91bmRQb3NpdGlvbicgfTtcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFBvc2l0aW9uID0gbnVtYmVyICYgeyBfX2JyYW5kOiAnQnJhY2tldE1hdGNoUG9zaXRpb24nIH07XG5leHBvcnQgdHlwZSBNYXRjaFBhcnRpY2lwYW50SWQgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6ICdNYXRjaFBhcnRpY2lwYW50SWQnIH07XG5leHBvcnQgdHlwZSBNYXRjaFBhcnRpY2lwYW50U2hvcnRJZCA9IHN0cmluZyAmIHsgX19icmFuZDogJ01hdGNoUGFydGljaXBhbnRTaG9ydElkJyB9O1xuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kU3dpc3NHcm91cElkID0gc3RyaW5nICYgeyBfX2JyYW5kOiAnQnJhY2tldFJvdW5kU3dpc3NHcm91cElkJyB9O1xuXG4vLyBXaWxsIHVzdWFsbHkgYmUgMC41LCAxIG9yIDIuIEluIFN3aXNzIHRoaXMgdmFsdWUgd2lsbCBiZSBnaWJiZXJpc2hcbmV4cG9ydCB0eXBlIE1hdGNoRmFjdG9yID0gbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfTUFUQ0hfUE9TSVRJT04gPSAtMSBhcyBCcmFja2V0TWF0Y2hQb3NpdGlvbjtcblxuZXhwb3J0IGNvbnN0IFRPVVJOQU1FTlRfTU9ERSA9IHtcbiAgU0lOR0xFX0VMSU1JTkFUSU9OOiAnc2luZ2xlLWVsaW1pbmF0aW9uJyxcbiAgRE9VQkxFX0VMSU1JTkFUSU9OOiAnZG91YmxlLWVsaW1pbmF0aW9uJyxcbiAgR1JPVVA6ICdncm91cCcsXG4gIFNXSVNTOiAnc3dpc3MnLFxuICBTV0lTU19XSVRIX0VMSU1JTkFUSU9OOiAnc3dpc3Mtd2l0aC1lbGltaW5hdGlvbicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUb3VybmFtZW50TW9kZSA9ICh0eXBlb2YgVE9VUk5BTUVOVF9NT0RFKVtrZXlvZiB0eXBlb2YgVE9VUk5BTUVOVF9NT0RFXTtcblxuZXhwb3J0IGNvbnN0IENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUgPSB7XG4gIFRISVJEX1BMQUNFOiAndGhpcmQtcGxhY2UnLFxuICBGSU5BTDogJ2ZpbmFsJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFID0ge1xuICBTSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVDogJ3NpbmdsZS1lbGltaW5hdGlvbi1icmFja2V0Jyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFID0ge1xuICBVUFBFUl9CUkFDS0VUOiAndXBwZXItYnJhY2tldCcsXG4gIExPV0VSX0JSQUNLRVQ6ICdsb3dlci1icmFja2V0JyxcbiAgUkVWRVJTRV9GSU5BTDogJ3JldmVyc2UtZmluYWwnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNXSVNTX0JSQUNLRVRfUk9VTkRfVFlQRSA9IHtcbiAgU1dJU1M6ICdzd2lzcycsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgR1JPVVBfQlJBQ0tFVF9ST1VORF9UWVBFID0ge1xuICBHUk9VUDogJ2dyb3VwJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIENvbW1vbkJyYWNrZXRSb3VuZFR5cGUgPSAodHlwZW9mIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUpW2tleW9mIHR5cGVvZiBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFXTtcbmV4cG9ydCB0eXBlIFNpbmdsZUVsaW1pbmF0aW9uQnJhY2tldFJvdW5kVHlwZSA9XG4gIHwgQ29tbW9uQnJhY2tldFJvdW5kVHlwZVxuICB8ICh0eXBlb2YgU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRSlba2V5b2YgdHlwZW9mIFNJTkdMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEVdO1xuZXhwb3J0IHR5cGUgRG91YmxlRWxpbWluYXRpb25CcmFja2V0Um91bmRUeXBlID1cbiAgfCBDb21tb25CcmFja2V0Um91bmRUeXBlXG4gIHwgKHR5cGVvZiBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFKVtrZXlvZiB0eXBlb2YgRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRV07XG5leHBvcnQgdHlwZSBTd2lzc0JyYWNrZXRSb3VuZFR5cGUgPSAodHlwZW9mIFNXSVNTX0JSQUNLRVRfUk9VTkRfVFlQRSlba2V5b2YgdHlwZW9mIFNXSVNTX0JSQUNLRVRfUk9VTkRfVFlQRV07XG5leHBvcnQgdHlwZSBHcm91cEJyYWNrZXRSb3VuZFR5cGUgPSAodHlwZW9mIEdST1VQX0JSQUNLRVRfUk9VTkRfVFlQRSlba2V5b2YgdHlwZW9mIEdST1VQX0JSQUNLRVRfUk9VTkRfVFlQRV07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFR5cGUgPVxuICB8IFNpbmdsZUVsaW1pbmF0aW9uQnJhY2tldFJvdW5kVHlwZVxuICB8IERvdWJsZUVsaW1pbmF0aW9uQnJhY2tldFJvdW5kVHlwZVxuICB8IFN3aXNzQnJhY2tldFJvdW5kVHlwZVxuICB8IEdyb3VwQnJhY2tldFJvdW5kVHlwZTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kU291cmNlPFRSb3VuZERhdGE+ID0ge1xuICB0eXBlOiBCcmFja2V0Um91bmRUeXBlO1xuICBpZDogc3RyaW5nO1xuICBkYXRhOiBUUm91bmREYXRhO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgQlJBQ0tFVF9ST1VORF9NSVJST1JfVFlQRSA9IHtcbiAgTEVGVDogJ2xlZnQnLFxuICBSSUdIVDogJ3JpZ2h0Jyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZE1pcnJvclR5cGUgPSAodHlwZW9mIEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUpW2tleW9mIHR5cGVvZiBCUkFDS0VUX1JPVU5EX01JUlJPUl9UWVBFXTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAvLyBOT1RFOiBUaGlzIGlzIHRoZSBsb2dpY2FsIGluZGV4IGluc2lkZSB0aGUgYnJhY2tldC5cbiAgLy8gSW4gYSBkb3VibGUgZWxpbWluYXRpb24gYnJhY2tldCwgdGhlIGZpcnN0IHJvdW5kIG9mIHRoZSBsb3dlciBicmFja2V0IHdpbGwgaGF2ZSB0aGUgc2FtZSBpbmRleCBhcyB0aGUgZmluYWwgcm91bmQgb2YgdGhlIHVwcGVyIGJyYWNrZXRcbiAgaW5kZXg6IG51bWJlcjtcbiAgdHlwZTogQnJhY2tldFJvdW5kVHlwZTtcbiAgaWQ6IEJyYWNrZXRSb3VuZElkO1xuICBkYXRhOiBUUm91bmREYXRhO1xuICBwb3NpdGlvbjogQnJhY2tldFJvdW5kUG9zaXRpb247XG4gIG5hbWU6IHN0cmluZztcbiAgbWF0Y2hDb3VudDogbnVtYmVyO1xuICBtYXRjaGVzOiBCcmFja2V0TWF0Y2hNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG1pcnJvclJvdW5kVHlwZTogQnJhY2tldFJvdW5kTWlycm9yVHlwZSB8IG51bGw7XG4gIGlzRmlyc3RSb3VuZDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFN0YXR1cyA9ICdjb21wbGV0ZWQnIHwgJ3BlbmRpbmcnO1xuXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIGRhdGE6IFRNYXRjaERhdGE7XG4gIGluZGV4SW5Sb3VuZDogbnVtYmVyO1xuICBpZDogQnJhY2tldE1hdGNoSWQ7XG4gIHJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHBvc2l0aW9uOiBCcmFja2V0TWF0Y2hQb3NpdGlvbjtcbiAgaG9tZTogQnJhY2tldFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+IHwgbnVsbDtcbiAgYXdheTogQnJhY2tldFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+IHwgbnVsbDtcbiAgd2lubmVyU2lkZTogT3Bwb25lbnRTaWRlIHwgbnVsbDtcbiAgd2lubmVyOiBCcmFja2V0UGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gfCBudWxsO1xuICBzdGF0dXM6IEJyYWNrZXRNYXRjaFN0YXR1cztcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFNvdXJjZTxUTWF0Y2hEYXRhPiA9IHtcbiAgZGF0YTogVE1hdGNoRGF0YTtcbiAgaWQ6IHN0cmluZztcbiAgcm91bmRJZDogc3RyaW5nO1xuICBob21lOiBzdHJpbmcgfCBudWxsO1xuICBhd2F5OiBzdHJpbmcgfCBudWxsO1xuICB3aW5uZXI6IE9wcG9uZW50U2lkZSB8IG51bGw7XG4gIHN0YXR1czogQnJhY2tldE1hdGNoU3RhdHVzO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPEJyYWNrZXRSb3VuZElkLCBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4+O1xuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPEJyYWNrZXRNYXRjaElkLCBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4+O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgcm91bmRzOiBCcmFja2V0Um91bmRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHJvdW5kSWRzOiBCcmFja2V0Um91bmRJZFtdO1xuICBtYXRjaGVzOiBCcmFja2V0TWF0Y2hNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG1hdGNoSWRzOiBCcmFja2V0TWF0Y2hJZFtdO1xuICBwYXJ0aWNpcGFudHM6IEJyYWNrZXRQYXJ0aWNpcGFudE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbW9kZTogVG91cm5hbWVudE1vZGU7XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0RGF0YVNvdXJjZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgcm91bmRzOiBCcmFja2V0Um91bmRTb3VyY2U8VFJvdW5kRGF0YT5bXTtcbiAgbWF0Y2hlczogQnJhY2tldE1hdGNoU291cmNlPFRNYXRjaERhdGE+W107XG4gIG1vZGU6IFRvdXJuYW1lbnRNb2RlO1xufTtcblxuZXhwb3J0IHR5cGUgQW55QnJhY2tldERhdGEgPSBCcmFja2V0RGF0YTx1bmtub3duLCB1bmtub3duPjtcblxuLy8gT25lIG1hdGNoIGhhcyBvbmUgcHJldmlvdXMgbWF0Y2ggYW5kIG9uZSBuZXh0IG1hdGNoICh0aGlzIHdvdWxkIGJlIHRoZSBjYXNlLCBpZiBhIGdyb3VwIHRvdXJuYW1lbnQgaXMgYmVpbmcgZGlzcGxheWVkIHZpYSBhIGJyYWNrZXQpXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hSZWxhdGlvbk9uZVRvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW9uZSc7XG4gIGN1cnJlbnRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1JvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbi8vIFRoZSBtYXRjaCBoYXMgbm8gcHJldmlvdXMgbWF0Y2ggYnV0IGEgc2luZ2xlIG5leHQgbWF0Y2ggKGVnLiB0aGUgc3RhcnQgb2YgdGhlIGJyYWNrZXQpXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ25vdGhpbmctdG8tb25lJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG59O1xuXG4vLyBUaGUgbWF0Y2ggaGFzIG5vIG5leHQgbWF0Y2ggYnV0IGEgc2luZ2xlIHByZXZpb3VzIG1hdGNoIChlZy4gcmV2ZXJzZSBmaW5hbHMpXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hSZWxhdGlvbk9uZVRvTm90aGluZzxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ29uZS10by1ub3RoaW5nJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c01hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbi8vIFRoZSBtYXRjaCBoYXMgdHdvIHByZXZpb3VzIG1hdGNoZXMgYW5kIG9uZSBuZXh0IG1hdGNoIChlZy4gYSBub3JtYWwgbWF0Y2ggaW4gdGhlIGJyYWNrZXQgdGhhdCBpcyBuZWl0aGVyIHRoZSBzdGFydCBub3IgdGhlIGVuZClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uVHdvVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICd0d28tdG8tb25lJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNVcHBlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c0xvd2VyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuLy8gVGhlIG1hdGNoIGhhcyB0d28gcHJldmlvdXMgbWF0Y2hlcyBhbmQgbm8gbmV4dCBtYXRjaCAoZWcuIHRoZSBmaW5hbHMgaW4gYSBzaW5nbGUgZWxpbWluYXRpb24gYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uVHdvVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAndHdvLXRvLW5vdGhpbmcnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzVXBwZXJNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlck1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoUmVsYXRpb248VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPVxuICB8IEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0TWF0Y2hSZWxhdGlvblR3b1RvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldE1hdGNoUmVsYXRpb25Ob3RoaW5nVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0TWF0Y2hSZWxhdGlvbk9uZVRvTm90aGluZzxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRNYXRjaFJlbGF0aW9uVHdvVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hSZWxhdGlvbnNNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIEJyYWNrZXRNYXRjaElkLFxuICBCcmFja2V0TWF0Y2hSZWxhdGlvbjxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuLy8gT25lIHJvdW5kIGhhcyBvbmUgbmV4dCByb3VuZCAodGhlIGZpcnN0IHJvdW5kIG9mIHRoZSBicmFja2V0KVxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25Ob3RoaW5nVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICdub3RoaW5nLXRvLW9uZSc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgb25lIHByZXZpb3VzIHJvdW5kIChlZy4gdGhlIGZpbmFscyByb3VuZCBvZiB0aGUgYnJhY2tldCBpbiBjYXNlIG9mIGEgc2luZ2xlIGVsaW1pbmF0aW9uIGJyYWNrZXQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvbk9uZVRvTm90aGluZzxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ29uZS10by1ub3RoaW5nJztcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIHJvb3RSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG59O1xuXG4vLyBPbmUgcm91bmQgaGFzIG9uZSBwcmV2aW91cyByb3VuZCBhbmQgb25lIG5leHQgcm91bmQgKGVnLiBhIG5vcm1hbCByb3VuZCBpbiB0aGUgYnJhY2tldCB0aGF0IGlzIG5laXRoZXIgdGhlIHN0YXJ0IG5vciB0aGUgZW5kKVxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25PbmVUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ29uZS10by1vbmUnO1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIHJvb3RSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG59O1xuXG4vLyBPbmUgcm91bmQgaGFzIHR3byBwcmV2aW91cyByb3VuZHMgYW5kIG9uZSBuZXh0IHJvdW5kIChlZy4gdGhlIGZpbmFscyByb3VuZCBpbiBhIGRvdWJsZSBlbGltaW5hdGlvbiBicmFja2V0IHdoZW4gdGhlIHJldmVyc2UgZmluYWxzIGlzIGFsc28gYmVpbmcgcGxheWVkKVxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25Ud29Ub09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ3R3by10by1vbmUnO1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNVcHBlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcHJldmlvdXNMb3dlclJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgdXBwZXJSb290Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBsb3dlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG59O1xuXG4vLyBPbmUgcm91bmQgaGFzIHR3byBwcmV2aW91cyByb3VuZHMgYW5kIG5vIG5leHQgcm91bmQgKGVnLiB0aGUgZmluYWxzIHJvdW5kIGluIGEgZG91YmxlIGVsaW1pbmF0aW9uIGJyYWNrZXQgd2hlbiB0aGUgcmV2ZXJzZSBmaW5hbHMgaXMgbm90IGJlaW5nIHBsYXllZClcbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFJlbGF0aW9uVHdvVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAndHdvLXRvLW5vdGhpbmcnO1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNVcHBlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICB1cHBlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIGxvd2VyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFJlbGF0aW9uPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID1cbiAgfCBCcmFja2V0Um91bmRSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRSb3VuZFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldFJvdW5kUmVsYXRpb25PbmVUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRSb3VuZFJlbGF0aW9uVHdvVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0Um91bmRSZWxhdGlvblR3b1RvTm90aGluZzxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25zPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBCcmFja2V0Um91bmRJZCxcbiAgQnJhY2tldFJvdW5kUmVsYXRpb248VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIE1hdGNoUG9zaXRpb25NYXBzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBCcmFja2V0Um91bmRJZCxcbiAgTWFwPEJyYWNrZXRNYXRjaFBvc2l0aW9uLCBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4+XG4+O1xuXG5leHBvcnQgdHlwZSBQYXJ0aWNpcGFudE1hdGNoUmVzdWx0ID0gJ3dpbicgfCAnbG9zcycgfCAndGllJztcbmV4cG9ydCB0eXBlIFBhcnRpY2lwYW50TWF0Y2hUeXBlID0gQnJhY2tldFJvdW5kVHlwZTtcblxuZXhwb3J0IHR5cGUgTWF0Y2hQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICBicmFja2V0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcmVzdWx0OiBQYXJ0aWNpcGFudE1hdGNoUmVzdWx0IHwgbnVsbDtcbiAgaXNFbGltaW5hdGVkOiBib29sZWFuO1xuICBpc0VsaW1pbmF0aW9uTWF0Y2g6IGJvb2xlYW47XG4gIGlzRmlyc3RSb3VuZDogYm9vbGVhbjtcbiAgaXNMYXN0Um91bmQ6IGJvb2xlYW47XG4gIHRpZUNvdW50OiBudW1iZXI7XG4gIHdpbkNvdW50OiBudW1iZXI7XG4gIGxvc3NDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWF0Y2hQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgaWQ6IE1hdGNoUGFydGljaXBhbnRJZDtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaGVzOiBNYXA8QnJhY2tldE1hdGNoSWQsIE1hdGNoUGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0UGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgc2lkZTogT3Bwb25lbnRTaWRlO1xuICBicmFja2V0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgaWQ6IE1hdGNoUGFydGljaXBhbnRJZDtcbiAgc2hvcnRJZDogTWF0Y2hQYXJ0aWNpcGFudFNob3J0SWQ7XG4gIG5hbWU6IHN0cmluZztcbiAgbWF0Y2hlczogTWFwPEJyYWNrZXRNYXRjaElkLCBCcmFja2V0UGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0UGFydGljaXBhbnRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIE1hdGNoUGFydGljaXBhbnRJZCxcbiAgQnJhY2tldFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4+O1xuXG5leHBvcnQgdHlwZSBNYXRjaFBhcnRpY2lwYW50TWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBNYXRjaFBhcnRpY2lwYW50SWQsXG4gIE1hdGNoUGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFN3aXNzR3JvdXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIGlkOiBCcmFja2V0Um91bmRTd2lzc0dyb3VwSWQ7XG4gIG5hbWU6IHN0cmluZztcbiAgbWF0Y2hlczogQnJhY2tldE1hdGNoTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBhbGxvd2VkTWF0Y2hDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kU3dpc3NHcm91cE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldFJvdW5kU3dpc3NHcm91cElkLFxuICBCcmFja2V0Um91bmRTd2lzc0dyb3VwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4+O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRTd2lzc0RhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIGdyb3VwczogQnJhY2tldFJvdW5kU3dpc3NHcm91cE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZE1hcFdpdGhTd2lzc0RhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIEJyYWNrZXRSb3VuZElkLFxuICBCcmFja2V0Um91bmRTd2lzc0RhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFR5cGVNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIEJyYWNrZXRSb3VuZFR5cGUsXG4gIEJyYWNrZXRSb3VuZE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91bmRUeXBlRnJvbUV0aGxldGVSb3VuZFR5cGUgPSAoXG4gIHR5cGU6IFJvdW5kVHlwZSxcbiAgdG91cm5hbWVudE1vZGU6IFRvdXJuYW1lbnRNb2RlLFxuICByb3VuZE1hdGNoQ291bnQ6IG51bWJlcixcbik6IEJyYWNrZXRSb3VuZFR5cGUgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdub3JtYWwnOlxuICAgICAgc3dpdGNoICh0b3VybmFtZW50TW9kZSkge1xuICAgICAgICBjYXNlICdzaW5nbGUtZWxpbWluYXRpb24nOlxuICAgICAgICAgIC8vIFRoaXMgbWlnaHQgYnJlYWsgaWYgdGhlIHNpbmdsZSBlbGltaW5hdGlvbiBjb250YWlucyBhIDNyZCBwbGFjZSBtYXRjaCArIHJvdW5kXG4gICAgICAgICAgaWYgKHJvdW5kTWF0Y2hDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUuRklOQUw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLlNJTkdMRV9FTElNSU5BVElPTl9CUkFDS0VUO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgIHJldHVybiBHUk9VUF9CUkFDS0VUX1JPVU5EX1RZUEUuR1JPVVA7XG4gICAgICAgIGNhc2UgJ3N3aXNzJzpcbiAgICAgICAgICByZXR1cm4gU1dJU1NfQlJBQ0tFVF9ST1VORF9UWVBFLlNXSVNTO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdG91cm5hbWVudCBtb2RlIGZvciBhIG5vcm1hbCB0eXBlIHJvdW5kOiAke3RvdXJuYW1lbnRNb2RlfWApO1xuICAgICAgfVxuICAgIGNhc2UgJ3RoaXJkX3BsYWNlJzpcbiAgICAgIHJldHVybiBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFLlRISVJEX1BMQUNFO1xuICAgIGNhc2UgJ2ZpbmFsJzpcbiAgICAgIHJldHVybiBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFLkZJTkFMO1xuICAgIGNhc2UgJ3JldmVyc2VfZmluYWwnOlxuICAgICAgcmV0dXJuIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuUkVWRVJTRV9GSU5BTDtcbiAgICBjYXNlICd3aW5uZXJfYnJhY2tldCc6XG4gICAgICByZXR1cm4gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5VUFBFUl9CUkFDS0VUO1xuICAgIGNhc2UgJ2xvc2VyX2JyYWNrZXQnOlxuICAgICAgcmV0dXJuIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVG91cm5hbWVudE1vZGVGb3JtRXRobGV0ZVJvdW5kcyA9IChcbiAgc291cmNlOiBSb3VuZFN0YWdlU3RydWN0dXJlV2l0aE1hdGNoZXNWaWV3W10sXG4pOiBUb3VybmFtZW50TW9kZSA9PiB7XG4gIGNvbnN0IGZpcnN0Um91bmQgPSBzb3VyY2VbMF07XG4gIGNvbnN0IGZpcnN0TWF0Y2ggPSBmaXJzdFJvdW5kPy5tYXRjaGVzWzBdO1xuXG4gIGlmICghZmlyc3RSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdObyByb3VuZHMgZm91bmQnKTtcbiAgaWYgKCFmaXJzdE1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ05vIG1hdGNoZXMgZm91bmQnKTtcblxuICBzd2l0Y2ggKGZpcnN0TWF0Y2gubWF0Y2hUeXBlKSB7XG4gICAgY2FzZSAnZ3JvdXBzJzpcbiAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuR1JPVVA7XG4gICAgY2FzZSAnZmlmYV9zd2lzcyc6IHtcbiAgICAgIGNvbnN0IGxhc3RSb3VuZCA9IHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmICghbGFzdFJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGxhc3Qgcm91bmQgZm91bmQnKTtcblxuICAgICAgaWYgKGxhc3RSb3VuZC5tYXRjaGVzLmxlbmd0aCAhPT0gZmlyc3RSb3VuZC5tYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLlNXSVNTX1dJVEhfRUxJTUlOQVRJT047XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLlNXSVNTO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdkb3VibGVfZWxpbWluYXRpb24nOlxuICAgICAgcmV0dXJuIFRPVVJOQU1FTlRfTU9ERS5ET1VCTEVfRUxJTUlOQVRJT047XG4gICAgY2FzZSAnc2luZ2xlX2VsaW1pbmF0aW9uJzpcbiAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuU0lOR0xFX0VMSU1JTkFUSU9OO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRvdXJuYW1lbnQgbW9kZTogJHtmaXJzdE1hdGNoLm1hdGNoVHlwZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNhblJlbmRlckxheW91dEluVG91cm5hbWVudE1vZGUgPSAobGF5b3V0OiBCcmFja2V0RGF0YUxheW91dCwgbW9kZTogVG91cm5hbWVudE1vZGUpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBUT1VSTkFNRU5UX01PREUuU0lOR0xFX0VMSU1JTkFUSU9OOlxuICAgICAgcmV0dXJuIGxheW91dCA9PT0gQlJBQ0tFVF9EQVRBX0xBWU9VVC5MRUZUX1RPX1JJR0hUIHx8IGxheW91dCA9PT0gQlJBQ0tFVF9EQVRBX0xBWU9VVC5NSVJST1JFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGxheW91dCA9PT0gQlJBQ0tFVF9EQVRBX0xBWU9VVC5MRUZUX1RPX1JJR0hUO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgQlJBQ0tFVF9EQVRBX0xBWU9VVCA9IHtcbiAgTEVGVF9UT19SSUdIVDogJ2xlZnQtdG8tcmlnaHQnLFxuXG4gIC8vIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBpbiBzaW5nbGUgZWxpbWluYXRpb24gYnJhY2tldHMuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdXNlZCBpbiBvdGhlciBicmFja2V0IHR5cGVzXG4gIE1JUlJPUkVEOiAnbWlycm9yZWQnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQnJhY2tldERhdGFMYXlvdXQgPSAodHlwZW9mIEJSQUNLRVRfREFUQV9MQVlPVVQpW2tleW9mIHR5cGVvZiBCUkFDS0VUX0RBVEFfTEFZT1VUXTtcblxuZXhwb3J0IGNvbnN0IEZJUlNUX1JPVU5EU19UWVBFID0ge1xuICBTSU5HTEU6ICdzaW5nbGUnLFxuICBET1VCTEU6ICdkb3VibGUnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRmlyc3RSb3VuZHNUeXBlID0gKHR5cGVvZiBGSVJTVF9ST1VORFNfVFlQRSlba2V5b2YgdHlwZW9mIEZJUlNUX1JPVU5EU19UWVBFXTtcblxuZXhwb3J0IHR5cGUgRmlyc3RTaW5nbGVSb3VuZHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6IHR5cGVvZiBGSVJTVF9ST1VORFNfVFlQRS5TSU5HTEU7XG4gIGZpcnN0OiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG59O1xuXG5leHBvcnQgdHlwZSBGaXJzdERvdWJsZVJvdW5kczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogdHlwZW9mIEZJUlNUX1JPVU5EU19UWVBFLkRPVUJMRTtcbiAgdXBwZXI6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbG93ZXI6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpcnN0Um91bmRzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID1cbiAgfCBGaXJzdFNpbmdsZVJvdW5kczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEZpcnN0RG91YmxlUm91bmRzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RSb3VuZHMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbiAgcm91bmRUeXBlTWFwOiBCcmFja2V0Um91bmRUeXBlTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKTogRmlyc3RSb3VuZHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPT4ge1xuICBpZiAoYnJhY2tldERhdGEubW9kZSA9PT0gVE9VUk5BTUVOVF9NT0RFLkRPVUJMRV9FTElNSU5BVElPTikge1xuICAgIGNvbnN0IHVwcGVyID0gcm91bmRUeXBlTWFwLmdldChET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLlVQUEVSX0JSQUNLRVQpPy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgY29uc3QgbG93ZXIgPSByb3VuZFR5cGVNYXAuZ2V0KERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVCk/LnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGlmICghdXBwZXIgfHwgIWxvd2VyKSB0aHJvdyBuZXcgRXJyb3IoJ1VwcGVyIG9yIGxvd2VyIGJyYWNrZXQgaXMgbnVsbCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEZJUlNUX1JPVU5EU19UWVBFLkRPVUJMRSxcbiAgICAgIHVwcGVyLFxuICAgICAgbG93ZXIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0ID0gYnJhY2tldERhdGEucm91bmRzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICBpZiAoIWZpcnN0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IHJvdW5kIGlzIG51bGwnKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6IEZJUlNUX1JPVU5EU19UWVBFLlNJTkdMRSxcbiAgICBmaXJzdCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU1hdGNoUG9zaXRpb25NYXBzID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPikgPT4ge1xuICBjb25zdCBtYXRjaFBvc2l0aW9uTWFwczogTWF0Y2hQb3NpdGlvbk1hcHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCByb3VuZCBvZiBicmFja2V0RGF0YS5yb3VuZHMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBtYXRjaE1hcCA9IG5ldyBNYXAoWy4uLnJvdW5kLm1hdGNoZXMudmFsdWVzKCldLm1hcCgobSkgPT4gW20ucG9zaXRpb24sIG1dKSk7XG5cbiAgICBtYXRjaFBvc2l0aW9uTWFwcy5zZXQocm91bmQuaWQsIG1hdGNoTWFwKTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaFBvc2l0aW9uTWFwcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXRSb3VuZFR5cGVNYXAgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbikgPT4ge1xuICBjb25zdCByb3VuZEFtb3VudE1hcDogQnJhY2tldFJvdW5kVHlwZU1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IHJvdW5kIG9mIGJyYWNrZXREYXRhLnJvdW5kcy52YWx1ZXMoKSkge1xuICAgIGlmICghcm91bmRBbW91bnRNYXAuaGFzKHJvdW5kLnR5cGUpKSB7XG4gICAgICByb3VuZEFtb3VudE1hcC5zZXQocm91bmQudHlwZSwgbmV3IE1hcChbW3JvdW5kLmlkLCByb3VuZF1dKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICByb3VuZEFtb3VudE1hcC5zZXQocm91bmQudHlwZSwgcm91bmRBbW91bnRNYXAuZ2V0KHJvdW5kLnR5cGUpIS5zZXQocm91bmQuaWQsIHJvdW5kKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvdW5kQW1vdW50TWFwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91bmRSZWxhdGlvbnMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KSA9PiB7XG4gIGNvbnN0IHJvdW5kUmVsYXRpb25zOiBCcmFja2V0Um91bmRSZWxhdGlvbnM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgYWxsUm91bmRzID0gYnJhY2tldERhdGEucm91bmRJZHMubWFwKChpZCkgPT4gYnJhY2tldERhdGEucm91bmRzLmdldChpZCkpLmZpbHRlcigocikgPT4gISFyKTtcbiAgY29uc3QgdXBwZXJSb3VuZHMgPSBhbGxSb3VuZHMuZmlsdGVyKChyKSA9PiByLnR5cGUgIT09IERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVCk7XG4gIGNvbnN0IGxvd2VyUm91bmRzID0gYWxsUm91bmRzLmZpbHRlcigocikgPT4gci50eXBlID09PSBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLkxPV0VSX0JSQUNLRVQpO1xuXG4gIGNvbnN0IGZpcnN0VXBwZXJSb3VuZCA9IHVwcGVyUm91bmRzWzBdIHx8IG51bGw7XG4gIGNvbnN0IGZpcnN0TG93ZXJSb3VuZCA9IGxvd2VyUm91bmRzWzBdIHx8IG51bGw7XG5cbiAgaWYgKCFmaXJzdFVwcGVyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RVcHBlclJvdW5kIGlzIG51bGwnKTtcblxuICBjb25zdCBoYXNMb3dlclJvdW5kcyA9IGxvd2VyUm91bmRzLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGxhc3RMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbbG93ZXJSb3VuZHMubGVuZ3RoIC0gMV0gfHwgbnVsbDtcblxuICBmb3IgKGNvbnN0IFtjdXJyZW50VXBwZXJSb3VuZEluZGV4LCBjdXJyZW50VXBwZXJSb3VuZF0gb2YgdXBwZXJSb3VuZHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgaXNMZWZ0VG9SaWdodCA9XG4gICAgICBjdXJyZW50VXBwZXJSb3VuZC5taXJyb3JSb3VuZFR5cGUgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnRVcHBlclJvdW5kLm1pcnJvclJvdW5kVHlwZSA9PT0gQlJBQ0tFVF9ST1VORF9NSVJST1JfVFlQRS5MRUZUO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQcmV2aW91c1VwcGVyUm91bmQgPSB1cHBlclJvdW5kc1tjdXJyZW50VXBwZXJSb3VuZEluZGV4IC0gMV0gfHwgbnVsbDtcbiAgICBjb25zdCByZWxhdGl2ZU5leHRVcHBlclJvdW5kID0gdXBwZXJSb3VuZHNbY3VycmVudFVwcGVyUm91bmRJbmRleCArIDFdIHx8IG51bGw7XG5cbiAgICBjb25zdCBwcmV2aW91c1VwcGVyUm91bmQgPSBpc0xlZnRUb1JpZ2h0ID8gcmVsYXRpdmVQcmV2aW91c1VwcGVyUm91bmQgOiByZWxhdGl2ZU5leHRVcHBlclJvdW5kO1xuICAgIGNvbnN0IG5leHRVcHBlclJvdW5kID0gaXNMZWZ0VG9SaWdodCA/IHJlbGF0aXZlTmV4dFVwcGVyUm91bmQgOiByZWxhdGl2ZVByZXZpb3VzVXBwZXJSb3VuZDtcblxuICAgIGNvbnN0IGN1cnJlbnRMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbY3VycmVudFVwcGVyUm91bmRJbmRleF0gfHwgbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c0xvd2VyUm91bmQgPSBsb3dlclJvdW5kc1tjdXJyZW50VXBwZXJSb3VuZEluZGV4IC0gMV0gfHwgbnVsbDtcbiAgICBjb25zdCBuZXh0TG93ZXJSb3VuZCA9IGxvd2VyUm91bmRzW2N1cnJlbnRVcHBlclJvdW5kSW5kZXggKyAxXSB8fCBudWxsO1xuXG4gICAgY29uc3QgaXNMYXN0VXBwZXJSb3VuZCA9XG4gICAgICAhbmV4dFVwcGVyUm91bmQgfHxcbiAgICAgIChuZXh0VXBwZXJSb3VuZC5taXJyb3JSb3VuZFR5cGUgPT09IEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUuUklHSFQgJiZcbiAgICAgICAgY3VycmVudFVwcGVyUm91bmQubWlycm9yUm91bmRUeXBlID09PSBudWxsKTtcblxuICAgIGNvbnN0IGlzRmluYWwgPSBjdXJyZW50VXBwZXJSb3VuZC50eXBlID09PSBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFLkZJTkFMO1xuXG4gICAgaWYgKGlzRmluYWwgJiYgaGFzTG93ZXJSb3VuZHMpIHtcbiAgICAgIC8vIHR3byB0byBvbmUgcmVsYXRpb25cblxuICAgICAgaWYgKCFsYXN0TG93ZXJSb3VuZCB8fCAhY3VycmVudExvd2VyUm91bmQgfHwgIXByZXZpb3VzVXBwZXJSb3VuZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYXN0TG93ZXJSb3VuZCBvciBjdXJyZW50TG93ZXJSb3VuZCBvciBwcmV2aW91c1VwcGVyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAvLyBpbiBhIHN5bmMgZG91YmxlIGVsaW1pbmF0aW9uIGJyYWNrZXQsIHRoZSBmaW5hbCByb3VuZCBoYXMgdGhlIHNhbWUgaW5kZXggYXMgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgIC8vIGluIGFuIGFzeW5jIG9uZSwgdGhlcmUgaXMgYWx3YXlzIG9uZSBtb3JlIHJvdW5kIGluIHRoZSBsb3dlciBicmFja2V0IHNpbmNlIHdlIG9ubHkgZGlzcGxheSBhIHNlY3Rpb24gb2YgdGhlIHdob2xlIHRvdXJuYW1lbnRcbiAgICAgIGNvbnN0IGlzQXN5bmNCcmFja2V0ID0gY3VycmVudExvd2VyUm91bmQuaWQgIT09IGxhc3RMb3dlclJvdW5kLmlkO1xuICAgICAgY29uc3QgZmluYWxMb3dlclJvdW5kID0gaXNBc3luY0JyYWNrZXQgPyBuZXh0TG93ZXJSb3VuZCA6IGN1cnJlbnRMb3dlclJvdW5kO1xuXG4gICAgICBpZiAoIWZpbmFsTG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaW5hbExvd2VyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgaWYgKCFmaXJzdExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RMb3dlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgaWYgKGZpbmFsTG93ZXJSb3VuZC5pZCAhPT0gbGFzdExvd2VyUm91bmQuaWQpIHRocm93IG5ldyBFcnJvcignZmluYWxMb3dlclJvdW5kIGlzIG5vdCB0aGUgbGFzdCBsb3dlciByb3VuZCcpO1xuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGEgcmV2ZXJzZSBmaW5hbFxuICAgICAgaWYgKG5leHRVcHBlclJvdW5kKSB7XG4gICAgICAgIC8vIGZvciB0aGUgZmluYWxcbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRVcHBlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ3R3by10by1vbmUnLFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZDogcHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogZmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZDogbmV4dFVwcGVyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbmV4dFVwcGVyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHVwcGVyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBsb3dlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm8gcmV2ZXJzZSBmaW5hbCBtZWFucyB0aGUgZmluYWwgaXMgdGhlIGxhc3Qgcm91bmRcblxuICAgICAgICAvLyBmb3IgdGhlIGZpbmFsXG4gICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50VXBwZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICd0d28tdG8tbm90aGluZycsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBwcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yOiBwcmV2aW91c1VwcGVyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgbG93ZXJSb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHVwcGVyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FzeW5jQnJhY2tldCkge1xuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFzeW5jIGJyYWNrZXQsIHdlIG5lZWQgdG8gc2V0IHRoZSByZWxhdGlvbnMgZm9yIHRoZSAyIGxhc3QgbG93ZXIgcm91bmRzIHNpbmNlIHRoZXkgd2lsbCBiZSBza2lwcGVkIGJ5IHRoZSBkZWZhdWx0IG9uZSB0byBvbmUgbG9naWNcbiAgICAgICAgY29uc3QgcHJlRmluYWxMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbbG93ZXJSb3VuZHMubGVuZ3RoIC0gMl0gfHwgbnVsbDtcbiAgICAgICAgY29uc3QgcHJlUHJlRmluYWxMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbbG93ZXJSb3VuZHMubGVuZ3RoIC0gM10gfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXByZUZpbmFsTG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmVGaW5hbExvd2VyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAgIGlmICghZmlyc3RMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0TG93ZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgICAgLy8gZm9yIHRoZSBsYXN0IGxvd2VyIHJvdW5kXG4gICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChmaW5hbExvd2VyUm91bmQuaWQsIHtcbiAgICAgICAgICB0eXBlOiAnb25lLXRvLW9uZScsXG4gICAgICAgICAgcHJldmlvdXNSb3VuZDogcHJlRmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFVwcGVyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50IC8gZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0TG93ZXJSb3VuZC5tYXRjaENvdW50IC8gZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcmVQcmVGaW5hbExvd2VyUm91bmQpIHtcbiAgICAgICAgICAvLyBmb3IgdGhlIHByZSBmaW5hbCBsb3dlciByb3VuZFxuICAgICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChwcmVGaW5hbExvd2VyUm91bmQuaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICAgIHByZXZpb3VzUm91bmQ6IHByZVByZUZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICAgIG5leHRSb3VuZDogZmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBwcmVGaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBwcmVGaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJlUHJlRmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBwcmVGaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICAgIHJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZvciB0aGUgZmlyc3QgbG93ZXIgcm91bmRcbiAgICAgICAgICByb3VuZFJlbGF0aW9ucy5zZXQocHJlRmluYWxMb3dlclJvdW5kLmlkLCB7XG4gICAgICAgICAgICB0eXBlOiAnbm90aGluZy10by1vbmUnLFxuICAgICAgICAgICAgbmV4dFJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IHByZUZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCAvIHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIGEgc3luYyBicmFja2V0LCB3ZSBvbmx5IG5lZWQgdG8gc2V0IHRoZSByZWxhdGlvbiBmb3IgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcigncHJldmlvdXNMb3dlclJvdW5kIGlzIG51bGwnKTtcbiAgICAgICAgaWYgKCFmaXJzdExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RMb3dlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgICAvLyBmb3IgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGZpbmFsTG93ZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kOiBwcmV2aW91c0xvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCAvIGZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJldmlvdXNMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0xhc3RVcHBlclJvdW5kKSB7XG4gICAgICAvLyBvbmUgdG8gbm90aGluZyByZWxhdGlvblxuXG4gICAgICBpZiAoIXByZXZpb3VzVXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmV2aW91c1VwcGVyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICByb3VuZFJlbGF0aW9ucy5zZXQoY3VycmVudFVwcGVyUm91bmQuaWQsIHtcbiAgICAgICAgdHlwZTogJ29uZS10by1ub3RoaW5nJyxcbiAgICAgICAgcHJldmlvdXNSb3VuZDogcHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRVcHBlclJvdW5kLFxuICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFVwcGVyUm91bmQuaXNGaXJzdFJvdW5kKSB7XG4gICAgICAvLyBub3RoaW5nIHRvIG9uZSByZWxhdGlvblxuXG4gICAgICBpZiAoIW5leHRVcHBlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ25leHRVcHBlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRVcHBlclJvdW5kLmlkLCB7XG4gICAgICAgIHR5cGU6ICdub3RoaW5nLXRvLW9uZScsXG4gICAgICAgIG5leHRSb3VuZDogbmV4dFVwcGVyUm91bmQsXG4gICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFVwcGVyUm91bmQsXG4gICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBuZXh0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY3VycmVudExvd2VyUm91bmQpIHtcbiAgICAgICAgaWYgKCFuZXh0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCduZXh0TG93ZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRMb3dlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ25vdGhpbmctdG8tb25lJyxcbiAgICAgICAgICBuZXh0Um91bmQ6IG5leHRMb3dlclJvdW5kLFxuICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG5leHRMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50TG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25lIHRvIG9uZSByZWxhdGlvblxuXG4gICAgICBpZiAoIXByZXZpb3VzVXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmV2aW91c1VwcGVyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgaWYgKCFuZXh0VXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCduZXh0VXBwZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50VXBwZXJSb3VuZC5pZCwge1xuICAgICAgICB0eXBlOiAnb25lLXRvLW9uZScsXG4gICAgICAgIHByZXZpb3VzUm91bmQ6IHByZXZpb3VzVXBwZXJSb3VuZCxcbiAgICAgICAgbmV4dFJvdW5kOiBuZXh0VXBwZXJSb3VuZCxcbiAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG5leHRVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gc2V0IGxvd2VyIHJvdW5kcyBoZXJlIHVudGlsIHRoZSBzcGVjaWFsIG1lcmdpbmcgcG9pbnQgb2YgdGhlIGZpbmFsLlxuICAgICAgLy8gbG93ZXIgYnJhY2tldCByb3VuZHMgYWZ0ZXIgYW5kIGluY2x1ZGluZyB0aGUgZmluYWwgd2lsbCBiZSBzZXQgaW4gdGhlIGZpbmFsIHJvdW5kIGJsb2NrXG4gICAgICBpZiAoY3VycmVudExvd2VyUm91bmQgJiYgY3VycmVudFVwcGVyUm91bmQudHlwZSA9PT0gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5VUFBFUl9CUkFDS0VUKSB7XG4gICAgICAgIGlmICghcHJldmlvdXNMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ3ByZXZpb3VzTG93ZXJSb3VuZCBpcyBudWxsJyk7XG4gICAgICAgIGlmICghbmV4dExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignbmV4dExvd2VyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgICBpZiAoIWZpcnN0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaXJzdExvd2VyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50TG93ZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kOiBwcmV2aW91c0xvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBuZXh0TG93ZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBuZXh0TG93ZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzTG93ZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50TG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm91bmRSZWxhdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNYXRjaFJlbGF0aW9ucyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICByb3VuZFJlbGF0aW9uczogQnJhY2tldFJvdW5kUmVsYXRpb25zPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBtYXRjaFBvc2l0aW9uTWFwczogTWF0Y2hQb3NpdGlvbk1hcHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pID0+IHtcbiAgY29uc3QgbWF0Y2hSZWxhdGlvbnM6IEJyYWNrZXRNYXRjaFJlbGF0aW9uc01hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIGJyYWNrZXREYXRhLm1hdGNoZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRpb24gPSByb3VuZFJlbGF0aW9ucy5nZXQobWF0Y2gucm91bmQuaWQpO1xuXG4gICAgaWYgKCFjdXJyZW50UmVsYXRpb24pIHRocm93IG5ldyBFcnJvcignTWF0Y2ggcm91bmQgbm90IGZvdW5kJyk7XG5cbiAgICBjb25zdCB7IG5leHRSb3VuZE1hdGNoUG9zaXRpb24sIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24sIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24gfSA9XG4gICAgICBnZW5lcmF0ZU1hdGNoUmVsYXRpb25Qb3NpdGlvbnMoY3VycmVudFJlbGF0aW9uLCBtYXRjaCk7XG5cbiAgICBzd2l0Y2ggKGN1cnJlbnRSZWxhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdub3RoaW5nLXRvLW9uZSc6IHtcbiAgICAgICAgY29uc3QgbmV4dE1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHMuZ2V0KGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmQuaWQpPy5nZXQobmV4dFJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFuZXh0TWF0Y2gpIHRocm93IG5ldyBFcnJvcignTmV4dCByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICAvLyBtZWFucyBsZWZ0IGlzIG5vdGhpbmcuIHJpZ2h0IGlzIG9uZVxuICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICB0eXBlOiAnbm90aGluZy10by1vbmUnLFxuICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZCxcbiAgICAgICAgICBuZXh0TWF0Y2gsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnb25lLXRvLW5vdGhpbmcnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVXBwZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMb3dlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgIGlmICghcHJldmlvdXNVcHBlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpb3VzIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uICE9PSBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gbWVhbnMgbGVmdCBpcyB0d28uIHJpZ2h0IGlzIG9uZVxuXG4gICAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyTWF0Y2gpIHRocm93IG5ldyBFcnJvcignUHJldmlvdXMgbG93ZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG5cbiAgICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICd0d28tdG8tbm90aGluZycsXG4gICAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICAgIHByZXZpb3VzTG93ZXJNYXRjaCxcbiAgICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbWVhbnMgbGVmdCBpcyBvbmUuIHJpZ2h0IGlzIG5vdGhpbmdcbiAgICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdvbmUtdG8tbm90aGluZycsXG4gICAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNNYXRjaDogcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnb25lLXRvLW9uZSc6IHtcbiAgICAgICAgY29uc3QgbmV4dE1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHMuZ2V0KGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmQuaWQpPy5nZXQobmV4dFJvdW5kTWF0Y2hQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVXBwZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMb3dlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgIGlmICghbmV4dE1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ05leHQgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG4gICAgICAgIGlmICghcHJldmlvdXNVcHBlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoYFByZXZpb3VzIHVwcGVyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZGApO1xuICAgICAgICBpZiAoIXByZXZpb3VzTG93ZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdQcmV2aW91cyBsb3dlciByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICAvLyBjYW4gYmUgZWl0aGVyIG9uZSB0byBvbmUgb3IgdHdvIHRvIG9uZVxuICAgICAgICBjb25zdCBpc0xlZnRPbmUgPSBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uID09PSBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChpc0xlZnRPbmUpIHtcbiAgICAgICAgICAvLyBvbmUtdG8tb25lXG4gICAgICAgICAgbWF0Y2hSZWxhdGlvbnMuc2V0KG1hdGNoLmlkLCB7XG4gICAgICAgICAgICB0eXBlOiAnb25lLXRvLW9uZScsXG4gICAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNNYXRjaDogcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgICBuZXh0TWF0Y2gsXG4gICAgICAgICAgICBuZXh0Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdHdvLXRvLW9uZVxuICAgICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgICAgdHlwZTogJ3R3by10by1vbmUnLFxuICAgICAgICAgICAgY3VycmVudE1hdGNoOiBtYXRjaCxcbiAgICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFJlbGF0aW9uLmN1cnJlbnRSb3VuZCxcbiAgICAgICAgICAgIHByZXZpb3VzVXBwZXJNYXRjaCxcbiAgICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgICBwcmV2aW91c0xvd2VyTWF0Y2gsXG4gICAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLFxuICAgICAgICAgICAgbmV4dE1hdGNoLFxuICAgICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0d28tdG8tb25lJzoge1xuICAgICAgICBjb25zdCBuZXh0TWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwcy5nZXQoY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZC5pZCk/LmdldChuZXh0Um91bmRNYXRjaFBvc2l0aW9uKTtcblxuICAgICAgICBjb25zdCBwcmV2aW91c1VwcGVyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMb3dlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFuZXh0TWF0Y2gpIHRocm93IG5ldyBFcnJvcignTmV4dCByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1VwcGVyTWF0Y2gpIHRocm93IG5ldyBFcnJvcihgUHJldmlvdXMgdXBwZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kYCk7XG4gICAgICAgIGlmICghcHJldmlvdXNMb3dlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpb3VzIGxvd2VyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgIHR5cGU6ICd0d28tdG8tb25lJyxcbiAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFJlbGF0aW9uLmN1cnJlbnRSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c1VwcGVyTWF0Y2gsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJNYXRjaCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dE1hdGNoLFxuICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0d28tdG8tbm90aGluZyc6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNVcHBlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTG93ZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgIGlmICghcHJldmlvdXNVcHBlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoYFByZXZpb3VzIHVwcGVyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZGApO1xuICAgICAgICBpZiAoIXByZXZpb3VzTG93ZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdQcmV2aW91cyBsb3dlciByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICB0eXBlOiAndHdvLXRvLW5vdGhpbmcnLFxuICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJNYXRjaCxcbiAgICAgICAgICBwcmV2aW91c1VwcGVyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgICAgcHJldmlvdXNMb3dlck1hdGNoLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoUmVsYXRpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTWF0Y2hSZWxhdGlvblBvc2l0aW9ucyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgY3VycmVudFJlbGF0aW9uOiBCcmFja2V0Um91bmRSZWxhdGlvbjxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbiAgbWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbikgPT4ge1xuICBzd2l0Y2ggKGN1cnJlbnRSZWxhdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnbm90aGluZy10by1vbmUnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0Um91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3RvciksXG4gICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBGQUxMQkFDS19NQVRDSF9QT1NJVElPTixcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ29uZS10by1ub3RoaW5nJzoge1xuICAgICAgY29uc3QgcHJldmlvdXNSb3VuZEhhc0RvdWJsZVRoZU1hdGNoQ291bnQgPSBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yID09PSAyO1xuICAgICAgY29uc3QgZG91YmxlVXBwZXJNYXRjaENvdW50U2hpZnQgPSBwcmV2aW91c1JvdW5kSGFzRG91YmxlVGhlTWF0Y2hDb3VudCA/IDEgOiAwO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0Um91bmRNYXRjaFBvc2l0aW9uOiBGQUxMQkFDS19NQVRDSF9QT1NJVElPTixcbiAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogKGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3RvcikgLVxuICAgICAgICAgIGRvdWJsZVVwcGVyTWF0Y2hDb3VudFNoaWZ0KSBhcyBCcmFja2V0TWF0Y2hQb3NpdGlvbixcbiAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ29uZS10by1vbmUnOiB7XG4gICAgICBjb25zdCBwcmV2aW91c1JvdW5kSGFzRG91YmxlVGhlTWF0Y2hDb3VudCA9IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3IgPT09IDI7XG4gICAgICBjb25zdCBkb3VibGVVcHBlck1hdGNoQ291bnRTaGlmdCA9IHByZXZpb3VzUm91bmRIYXNEb3VibGVUaGVNYXRjaENvdW50ID8gMSA6IDA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHRSb3VuZE1hdGNoUG9zaXRpb246IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogKGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3RvcikgLVxuICAgICAgICAgIGRvdWJsZVVwcGVyTWF0Y2hDb3VudFNoaWZ0KSBhcyBCcmFja2V0TWF0Y2hQb3NpdGlvbixcbiAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3R3by10by1vbmUnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0Um91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3RvciksXG4gICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb246IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAndHdvLXRvLW5vdGhpbmcnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0Um91bmRNYXRjaFBvc2l0aW9uOiBGQUxMQkFDS19NQVRDSF9QT1NJVElPTixcbiAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvciksXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbiA9IChtYXRjaDogQnJhY2tldE1hdGNoPHVua25vd24sIHVua25vd24+LCBmYWN0b3I6IE1hdGNoRmFjdG9yKSA9PiB7XG4gIHJldHVybiBNYXRoLmNlaWwobWF0Y2gucG9zaXRpb24gKiBmYWN0b3IpIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvZ1JvdW5kUmVsYXRpb25zID0gKFxuICByb3VuZFJlbGF0aW9uczogQnJhY2tldFJvdW5kUmVsYXRpb25zPHVua25vd24sIHVua25vd24+LFxuICBicmFja2V0RGF0YTogQnJhY2tldERhdGE8dW5rbm93biwgdW5rbm93bj4sXG4pID0+IHtcbiAgZm9yIChjb25zdCBbcm91bmRJZCwgcmVsYXRpb25dIG9mIHJvdW5kUmVsYXRpb25zLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJvdW5kID0gYnJhY2tldERhdGEucm91bmRzLmdldChyb3VuZElkKTtcblxuICAgIGlmICghcm91bmQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJvdW5kIHdpdGggaWQgJHtyb3VuZElkfSBub3QgZm91bmQgaW4gYnJhY2tldCBkYXRhLiBUaGUgYnJhY2tldCB3aWxsIGJlIG1hbGZvcm1lZC5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVsYXRpb24udHlwZSkge1xuICAgICAgY2FzZSAnbm90aGluZy10by1vbmUnOlxuICAgICAgICBjb25zb2xlLmxvZyhgU1RBUlQ6ICR7cm91bmQubmFtZX0gLT4gJHtyZWxhdGlvbi5uZXh0Um91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3J9KWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29uZS10by1ub3RoaW5nJzpcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCR7cmVsYXRpb24ucHJldmlvdXNSb3VuZC5uYW1lfSAoRjogJHtyZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3J9KSA8LSBFTkRJTkc6ICR7cm91bmQubmFtZX1gLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29uZS10by1vbmUnOlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgJHtyZWxhdGlvbi5wcmV2aW91c1JvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3Rvcn0pIDwtICR7cm91bmQubmFtZX0gLT4gJHtyZWxhdGlvbi5uZXh0Um91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3J9KWAsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHdvLXRvLW9uZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBNRVJHRVI6ICR7cmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yfSkgQU5EICR7cmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yfSkgPC0gJHtyb3VuZC5uYW1lfSAtPiAke3JlbGF0aW9uLm5leHRSb3VuZC5uYW1lfSAoRjogJHtyZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3Rvcn0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0d28tdG8tbm90aGluZyc6XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBNRVJHRVI6ICR7cmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yfSkgQU5EICR7cmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yfSkgPC0gRU5ESU5HOiAke3JvdW5kLm5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNYXRjaFBhcnRpY2lwYW50TWFwID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBicmFja2V0RGF0YTogQnJhY2tldERhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pID0+IHtcbiAgY29uc3QgbWF0Y2hQYXJ0aWNpcGFudE1hcDogTWF0Y2hQYXJ0aWNpcGFudE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBoYXNFbGltaW5hdGlvbiA9XG4gICAgYnJhY2tldERhdGEubW9kZSA9PT0gVE9VUk5BTUVOVF9NT0RFLlNJTkdMRV9FTElNSU5BVElPTiB8fFxuICAgIGJyYWNrZXREYXRhLm1vZGUgPT09IFRPVVJOQU1FTlRfTU9ERS5ET1VCTEVfRUxJTUlOQVRJT04gfHxcbiAgICBicmFja2V0RGF0YS5tb2RlID09PSBUT1VSTkFNRU5UX01PREUuU1dJU1NfV0lUSF9FTElNSU5BVElPTjtcblxuICBmb3IgKGNvbnN0IHBhcnRpY2lwYW50IG9mIGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy52YWx1ZXMoKSkge1xuICAgIGxldCB3aW5zVGlsTm93ID0gMDtcbiAgICBsZXQgbG9zc2VzVGlsTm93ID0gMDtcbiAgICBsZXQgdGllc1RpbE5vdyA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoUGFydGljaXBhbnRNYXRjaCBvZiBwYXJ0aWNpcGFudC5tYXRjaGVzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBpc1dpbm5lciA9IG1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gud2lubmVyU2lkZSA9PT0gbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLnNpZGU7XG4gICAgICBjb25zdCBpc0xvb3NlciA9XG4gICAgICAgIG1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gud2lubmVyU2lkZSAmJlxuICAgICAgICBtYXRjaFBhcnRpY2lwYW50TWF0Y2guYnJhY2tldE1hdGNoLndpbm5lclNpZGUgIT09IG1hdGNoUGFydGljaXBhbnRNYXRjaC5zaWRlO1xuICAgICAgY29uc3QgaXNUaWUgPVxuICAgICAgICBtYXRjaFBhcnRpY2lwYW50TWF0Y2guYnJhY2tldE1hdGNoLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYgIW1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gud2lubmVyO1xuXG4gICAgICBpZiAoaXNXaW5uZXIpIHtcbiAgICAgICAgd2luc1RpbE5vdysrO1xuICAgICAgfSBlbHNlIGlmIChpc0xvb3Nlcikge1xuICAgICAgICBsb3NzZXNUaWxOb3crKztcbiAgICAgIH0gZWxzZSBpZiAoaXNUaWUpIHtcbiAgICAgICAgdGllc1RpbE5vdysrO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNFbGltaW5hdGVkID0gZmFsc2U7XG4gICAgICBsZXQgaXNFbGltaW5hdGlvbk1hdGNoID0gZmFsc2U7XG5cbiAgICAgIGlmIChoYXNFbGltaW5hdGlvbikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgZWxpbWluYXRpb24gbG9naWNcblxuICAgICAgICAvLyBNZWFucyB0aGUgY3VycmVudCBtYXRjaCBpcyBsb3NzIGFuZCBpdCdzIHRoZSBsYXN0IG1hdGNoIG9mIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgICBpc0VsaW1pbmF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBbHdheXMgdHJ1ZSBmb3Igc2luZ2xlIGVsaW1pbmF0aW9uLCBuZXZlciBmb3IgZS5nLiBncm91cHMsIGRlcGVuZHMgb24gdGhlIHJvdW5kIGZvciBkb3VibGUgZWxpbWluYXRpb24sIGRlcGVuZHMgb24gdGhlIGxvc3MgY291bnQgZm9yIHN3aXNzIHdpdGggZWxpbWluYXRpb25cbiAgICAgICAgaXNFbGltaW5hdGlvbk1hdGNoID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IEltcGxlbWVudCByb3VuZCBsb2dpY1xuICAgICAgLy8gdHJ1ZSBpZiBpdHMgdGhlIGZpcnN0IHJvdW5kIG9mIHRoZSBicmFja2V0XG4gICAgICBjb25zdCBpc0ZpcnN0Um91bmQgPSBmYWxzZTtcblxuICAgICAgLy8gdHJ1ZSBpZiBpdHMgdGhlIGxhc3Qgcm91bmQgb2YgdGhlIGJyYWNrZXQgKGVnLiBmaW5hbCBmb3Igc2luZ2xlIGVsaW1pbmF0aW9uKVxuICAgICAgY29uc3QgaXNMYXN0Um91bmQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgcGFydGljaXBhbnRNYXRjaERhdGE6IE1hdGNoUGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICAgICAgYnJhY2tldE1hdGNoOiBtYXRjaFBhcnRpY2lwYW50TWF0Y2guYnJhY2tldE1hdGNoLFxuICAgICAgICByZXN1bHQ6IGlzV2lubmVyID8gJ3dpbicgOiBpc0xvb3NlciA/ICdsb3NzJyA6IGlzVGllID8gJ3RpZScgOiBudWxsLFxuICAgICAgICBpc0VsaW1pbmF0ZWQsXG4gICAgICAgIGlzRWxpbWluYXRpb25NYXRjaCxcbiAgICAgICAgaXNGaXJzdFJvdW5kLFxuICAgICAgICBpc0xhc3RSb3VuZCxcbiAgICAgICAgdGllQ291bnQ6IHRpZXNUaWxOb3csXG4gICAgICAgIHdpbkNvdW50OiB3aW5zVGlsTm93LFxuICAgICAgICBsb3NzQ291bnQ6IGxvc3Nlc1RpbE5vdyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghbWF0Y2hQYXJ0aWNpcGFudE1hcC5oYXMocGFydGljaXBhbnQuaWQpKSB7XG4gICAgICAgIG1hdGNoUGFydGljaXBhbnRNYXAuc2V0KHBhcnRpY2lwYW50LmlkLCB7XG4gICAgICAgICAgaWQ6IHBhcnRpY2lwYW50LmlkLFxuICAgICAgICAgIG5hbWU6IHBhcnRpY2lwYW50Lm5hbWUsXG4gICAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFydGljaXBhbnREYXRhID0gbWF0Y2hQYXJ0aWNpcGFudE1hcC5nZXQocGFydGljaXBhbnQuaWQpIGFzIE1hdGNoUGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gICAgICBwYXJ0aWNpcGFudERhdGEubWF0Y2hlcy5zZXQobWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC5pZCwgcGFydGljaXBhbnRNYXRjaERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaFBhcnRpY2lwYW50TWFwO1xufTtcblxuY29uc3QgZmFjdG9yaWFsQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG5leHBvcnQgY29uc3QgZ2V0QXZhaWxhYmxlU3dpc3NHcm91cHNGb3JSb3VuZCA9IChyb3VuZE51bWJlcjogbnVtYmVyLCB0b3RhbE1hdGNoZXNJblJvdW5kOiBudW1iZXIpID0+IHtcbiAgY29uc3QgQURWQU5DRV9XSU5TID0gMztcbiAgY29uc3QgRUxJTUlOQVRFX0xPU1NFUyA9IDM7XG5cbiAgLy8gQ2FjaGUgZmFjdG9yaWFsIGNhbGN1bGF0aW9uc1xuICBjb25zdCBnZXRGYWN0b3JpYWwgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBpZiAobiA8PSAxKSByZXR1cm4gMTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIGlmIChmYWN0b3JpYWxDYWNoZS5oYXMobikpIHJldHVybiBmYWN0b3JpYWxDYWNoZS5nZXQobikhO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbiAqIGdldEZhY3RvcmlhbChuIC0gMSk7XG4gICAgZmFjdG9yaWFsQ2FjaGUuc2V0KG4sIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBQcmUtY2FsY3VsYXRlIHJvdW5kRmFjdG9yaWFsXG4gIGNvbnN0IHJvdW5kRmFjdCA9IGdldEZhY3RvcmlhbChyb3VuZE51bWJlcik7XG5cbiAgbGV0IHRvdGFsQ29tYmluYXRpb25zID0gMDtcbiAgY29uc3QgdmFsaWRHcm91cHM6IHsgd2luczogbnVtYmVyOyBsb3NzZXM6IG51bWJlcjsgY29tYmluYXRpb25zOiBudW1iZXIgfVtdID0gW107XG5cbiAgLy8gU2luZ2xlIGxvb3AgdG8gZ2F0aGVyIHZhbGlkIGdyb3VwcyBhbmQgdG90YWwgY29tYmluYXRpb25zXG4gIGZvciAobGV0IHdpbnMgPSByb3VuZE51bWJlcjsgd2lucyA+PSAwOyB3aW5zLS0pIHtcbiAgICBjb25zdCBsb3NzZXMgPSByb3VuZE51bWJlciAtIHdpbnM7XG4gICAgY29uc3QgcmVtYWluaW5nR2FtZXMgPSBBRFZBTkNFX1dJTlMgKyBFTElNSU5BVEVfTE9TU0VTIC0gKHdpbnMgKyBsb3NzZXMpIC0gMTtcbiAgICBjb25zdCBub3RZZXRFbGltaW5hdGVkID0gbG9zc2VzIDwgRUxJTUlOQVRFX0xPU1NFUztcbiAgICBjb25zdCBjYW5TdGlsbEFkdmFuY2UgPSB3aW5zIDwgQURWQU5DRV9XSU5TICYmIHJlbWFpbmluZ0dhbWVzID49IDA7XG5cbiAgICBpZiAoIWNhblN0aWxsQWR2YW5jZSB8fCAhbm90WWV0RWxpbWluYXRlZCkgY29udGludWU7XG5cbiAgICBjb25zdCBjb21iaW5hdGlvbnMgPSByb3VuZEZhY3QgLyAoZ2V0RmFjdG9yaWFsKHdpbnMpICogZ2V0RmFjdG9yaWFsKGxvc3NlcykpO1xuICAgIHRvdGFsQ29tYmluYXRpb25zICs9IGNvbWJpbmF0aW9ucztcbiAgICB2YWxpZEdyb3Vwcy5wdXNoKHsgd2lucywgbG9zc2VzLCBjb21iaW5hdGlvbnMgfSk7XG4gIH1cblxuICAvLyBDcmVhdGUgZmluYWwgZ3JvdXBzIHdpdGggY2FsY3VsYXRlZCBwcm9wb3J0aW9uc1xuICByZXR1cm4gdmFsaWRHcm91cHMubWFwKCh7IHdpbnMsIGxvc3NlcywgY29tYmluYXRpb25zIH0pID0+ICh7XG4gICAgaWQ6IGAke3dpbnN9LSR7bG9zc2VzfWAgYXMgQnJhY2tldFJvdW5kU3dpc3NHcm91cElkLFxuICAgIG5hbWU6IGAke3dpbnN9LSR7bG9zc2VzfWAsXG4gICAgbWF0Y2hlc0luR3JvdXA6IE1hdGgucm91bmQoKGNvbWJpbmF0aW9ucyAvIHRvdGFsQ29tYmluYXRpb25zKSAqIHRvdGFsTWF0Y2hlc0luUm91bmQpLFxuICB9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVCcmFja2V0Um91bmRTd2lzc0dyb3VwTWFwcyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBtYXRjaFBhcnRpY2lwYW50TWFwOiBNYXRjaFBhcnRpY2lwYW50TWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKSA9PiB7XG4gIGlmIChicmFja2V0RGF0YS5tb2RlICE9PSBUT1VSTkFNRU5UX01PREUuU1dJU1NfV0lUSF9FTElNSU5BVElPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgcm91bmRzV2l0aFN3aXNzR3JvdXBzOiBCcmFja2V0Um91bmRNYXBXaXRoU3dpc3NEYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gbmV3IE1hcCgpO1xuXG4gIGxldCByb3VuZE51bWJlciA9IDA7XG4gIGZvciAoY29uc3QgYnJhY2tldFJvdW5kIG9mIGJyYWNrZXREYXRhLnJvdW5kcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZUdyb3VwcyA9IGdldEF2YWlsYWJsZVN3aXNzR3JvdXBzRm9yUm91bmQocm91bmROdW1iZXIsIGJyYWNrZXRSb3VuZC5tYXRjaENvdW50KTtcblxuICAgIGNvbnN0IHJvdW5kU3dpc3NEYXRhOiBCcmFja2V0Um91bmRTd2lzc0RhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICBncm91cHM6IG5ldyBNYXAoKSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBhdmFpbGFibGVHcm91cHMpIHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwOiBCcmFja2V0Um91bmRTd2lzc0dyb3VwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICBpZDogZ3JvdXAuaWQsXG4gICAgICAgIG5hbWU6IGdyb3VwLm5hbWUsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgICAgYWxsb3dlZE1hdGNoQ291bnQ6IGdyb3VwLm1hdGNoZXNJbkdyb3VwLFxuICAgICAgfTtcblxuICAgICAgcm91bmRTd2lzc0RhdGEuZ3JvdXBzLnNldChncm91cC5pZCwgc3ViR3JvdXApO1xuICAgIH1cblxuICAgIGNvbnN0IGVtcHR5TWF0Y2hJZHM6IEJyYWNrZXRNYXRjaElkW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgYnJhY2tldFJvdW5kLm1hdGNoZXMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SG9tZSA9IG1hdGNoLmhvbWUgPyAobWF0Y2hQYXJ0aWNpcGFudE1hcC5nZXQobWF0Y2guaG9tZS5pZCkgPz8gbnVsbCkgOiBudWxsO1xuICAgICAgY29uc3QgcGFydGljaXBhbnRBd2F5ID0gbWF0Y2guYXdheSA/IChtYXRjaFBhcnRpY2lwYW50TWFwLmdldChtYXRjaC5hd2F5LmlkKSA/PyBudWxsKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IGFueVBhcnRpY2lwYW50ID0gcGFydGljaXBhbnRIb21lIHx8IHBhcnRpY2lwYW50QXdheTtcblxuICAgICAgaWYgKCFhbnlQYXJ0aWNpcGFudCkge1xuICAgICAgICBlbXB0eU1hdGNoSWRzLnB1c2gobWF0Y2guaWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2hQYXJ0aWNpcGFudE1hdGNoID0gYW55UGFydGljaXBhbnQubWF0Y2hlcy5nZXQobWF0Y2guaWQpO1xuXG4gICAgICBpZiAoIW1hdGNoUGFydGljaXBhbnRNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdNYXRjaCBwYXJ0aWNpcGFudCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgY29uc3Qgd2lucyA9IG1hdGNoUGFydGljaXBhbnRNYXRjaC53aW5Db3VudDtcbiAgICAgIGNvbnN0IGxvc3NlcyA9IG1hdGNoUGFydGljaXBhbnRNYXRjaC5sb3NzQ291bnQ7XG5cbiAgICAgIGNvbnN0IGdyb3VwID0gcm91bmRTd2lzc0RhdGEuZ3JvdXBzLmdldChgJHt3aW5zfS0ke2xvc3Nlc31gIGFzIEJyYWNrZXRSb3VuZFN3aXNzR3JvdXBJZCk7XG5cbiAgICAgIGlmICghZ3JvdXApIHRocm93IG5ldyBFcnJvcignR3JvdXAgbm90IGZvdW5kIGZvciBtYXRjaDogJyArIG1hdGNoLmlkKTtcblxuICAgICAgZ3JvdXAubWF0Y2hlcy5zZXQobWF0Y2guaWQsIG1hdGNoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVtcHR5TWF0Y2hJZCBvZiBlbXB0eU1hdGNoSWRzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGJyYWNrZXRSb3VuZC5tYXRjaGVzLmdldChlbXB0eU1hdGNoSWQpO1xuXG4gICAgICBpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICBsZXQgZ3JvdXBGb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiByb3VuZFN3aXNzRGF0YS5ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGdyb3VwLm1hdGNoZXMuc2l6ZSA8IGdyb3VwLmFsbG93ZWRNYXRjaENvdW50KSB7XG4gICAgICAgICAgZ3JvdXAubWF0Y2hlcy5zZXQobWF0Y2guaWQsIG1hdGNoKTtcbiAgICAgICAgICBncm91cEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWdyb3VwRm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBncm91cCBmb3VuZCBmb3IgZW1wdHkgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3VuZE51bWJlcisrO1xuICB9XG5cbiAgcmV0dXJuIHJvdW5kc1dpdGhTd2lzc0dyb3Vwcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXREYXRhRm9yRXRobGV0ZSA9IChzb3VyY2U6IFJvdW5kU3RhZ2VTdHJ1Y3R1cmVXaXRoTWF0Y2hlc1ZpZXdbXSkgPT4ge1xuICBjb25zdCB0b3VybmFtZW50TW9kZSA9IGdlbmVyYXRlVG91cm5hbWVudE1vZGVGb3JtRXRobGV0ZVJvdW5kcyhzb3VyY2UpO1xuXG4gIGNvbnN0IGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YVNvdXJjZTxSb3VuZFN0YWdlU3RydWN0dXJlVmlldywgTWF0Y2hMaXN0Vmlld1VuaW9uPiA9IHtcbiAgICByb3VuZHM6IFtdLFxuICAgIG1hdGNoZXM6IFtdLFxuICAgIG1vZGU6IHRvdXJuYW1lbnRNb2RlLFxuICB9O1xuXG4gIGZvciAoY29uc3QgY3VycmVudEl0ZW0gb2Ygc291cmNlKSB7XG4gICAgaWYgKGJyYWNrZXREYXRhLnJvdW5kcy5zb21lKChyKSA9PiByLmlkID09PSBjdXJyZW50SXRlbS5yb3VuZC5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm91bmQgd2l0aCBpZCAke2N1cnJlbnRJdGVtLnJvdW5kLmlkfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYnJhY2tldCBkYXRhLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdW5kVHlwZSA9IGdlbmVyYXRlUm91bmRUeXBlRnJvbUV0aGxldGVSb3VuZFR5cGUoXG4gICAgICBjdXJyZW50SXRlbS5yb3VuZC50eXBlLFxuICAgICAgdG91cm5hbWVudE1vZGUsXG4gICAgICBjdXJyZW50SXRlbS5tYXRjaGVzLmxlbmd0aCxcbiAgICApO1xuXG4gICAgY29uc3QgYnJhY2tldFJvdW5kOiBCcmFja2V0Um91bmRTb3VyY2U8Um91bmRTdGFnZVN0cnVjdHVyZVZpZXc+ID0ge1xuICAgICAgdHlwZTogcm91bmRUeXBlLFxuICAgICAgaWQ6IGN1cnJlbnRJdGVtLnJvdW5kLmlkLFxuICAgICAgZGF0YTogY3VycmVudEl0ZW0ucm91bmQsXG4gICAgICBuYW1lOiBjdXJyZW50SXRlbS5yb3VuZC5uYW1lIHx8IGN1cnJlbnRJdGVtLnJvdW5kLnR5cGUsXG4gICAgfTtcblxuICAgIGJyYWNrZXREYXRhLnJvdW5kcy5wdXNoKGJyYWNrZXRSb3VuZCk7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGN1cnJlbnRJdGVtLm1hdGNoZXMpIHtcbiAgICAgIGlmIChicmFja2V0RGF0YS5tYXRjaGVzLnNvbWUoKG0pID0+IG0uaWQgPT09IG1hdGNoLmlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoIHdpdGggaWQgJHttYXRjaC5pZH0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGJyYWNrZXQgZGF0YS5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnJhY2tldE1hdGNoOiBCcmFja2V0TWF0Y2hTb3VyY2U8TWF0Y2hMaXN0Vmlld1VuaW9uPiA9IHtcbiAgICAgICAgaWQ6IG1hdGNoLmlkLFxuICAgICAgICBkYXRhOiBtYXRjaCxcbiAgICAgICAgcm91bmRJZDogY3VycmVudEl0ZW0ucm91bmQuaWQsXG4gICAgICAgIGhvbWU6IG1hdGNoLmhvbWU/LmlkIHx8IG51bGwsXG4gICAgICAgIGF3YXk6IG1hdGNoLmF3YXk/LmlkIHx8IG51bGwsXG4gICAgICAgIHdpbm5lcjogbWF0Y2gud2lubmluZ1NpZGUsXG4gICAgICAgIHN0YXR1czogbWF0Y2guc3RhdHVzID09PSAncHVibGlzaGVkJyA/ICdjb21wbGV0ZWQnIDogJ3BlbmRpbmcnLFxuICAgICAgfTtcblxuICAgICAgYnJhY2tldERhdGEubWF0Y2hlcy5wdXNoKGJyYWNrZXRNYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJyYWNrZXREYXRhO1xufTtcblxudHlwZSBHZW5lcmF0ZUJyYWNrZXRNYXRjaE9wdGlvbnM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgYnJhY2tldFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRJbmRleEluUm91bmQ6IG51bWJlcjtcbiAgcGFydGljaXBhbnRDb3VudGVyOiBudW1iZXI7XG59O1xuXG5jb25zdCBnZW5lcmF0ZUFuZFNldEJyYWNrZXRNYXRjaFdpdGhQYXJ0aWNpcGFudHMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIG1hdGNoOiBCcmFja2V0TWF0Y2hTb3VyY2U8VE1hdGNoRGF0YT4sXG4gIG9wdGlvbnM6IEdlbmVyYXRlQnJhY2tldE1hdGNoT3B0aW9uczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbikgPT4ge1xuICBjb25zdCBtYXRjaElkID0gbWF0Y2guaWQgYXMgQnJhY2tldE1hdGNoSWQ7XG4gIGNvbnN0IHsgYnJhY2tldERhdGEsIGJyYWNrZXRSb3VuZCwgY3VycmVudEluZGV4SW5Sb3VuZCwgcGFydGljaXBhbnRDb3VudGVyIH0gPSBvcHRpb25zO1xuXG4gIGxldCBsb2NhbFBhcnRpY2lwYW50Q291bnRlciA9IHBhcnRpY2lwYW50Q291bnRlcjtcblxuICBjb25zdCBicmFja2V0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICBpZDogbWF0Y2hJZCxcbiAgICBpbmRleEluUm91bmQ6IGN1cnJlbnRJbmRleEluUm91bmQsXG4gICAgcG9zaXRpb246IChjdXJyZW50SW5kZXhJblJvdW5kICsgMSkgYXMgQnJhY2tldE1hdGNoUG9zaXRpb24sXG4gICAgZGF0YTogbWF0Y2guZGF0YSxcbiAgICByb3VuZDogYnJhY2tldFJvdW5kLFxuICAgIGhvbWU6IG51bGwsXG4gICAgYXdheTogbnVsbCxcbiAgICBzdGF0dXM6IG1hdGNoLnN0YXR1cyxcbiAgICB3aW5uZXJTaWRlOiBtYXRjaC53aW5uZXIsXG4gICAgd2lubmVyOiBudWxsLFxuICB9O1xuXG4gIGJyYWNrZXREYXRhLm1hdGNoZXMuc2V0KG1hdGNoSWQsIGJyYWNrZXRNYXRjaCk7XG4gIGJyYWNrZXRSb3VuZC5tYXRjaGVzLnNldChtYXRjaElkLCBicmFja2V0TWF0Y2gpO1xuXG4gIGNvbnN0IHBhcnRpY2lwYW50SWRzID0gW21hdGNoLmhvbWUsIG1hdGNoLmF3YXldIGFzIChNYXRjaFBhcnRpY2lwYW50SWQgfCBudWxsKVtdO1xuXG4gIGZvciAoY29uc3QgW3BhcnRpY2lwYW50SW5kZXgsIHBhcnRpY2lwYW50SWRdIG9mIHBhcnRpY2lwYW50SWRzLmVudHJpZXMoKSkge1xuICAgIGlmICghcGFydGljaXBhbnRJZCkgY29udGludWU7XG5cbiAgICBjb25zdCBzaWRlOiBPcHBvbmVudFNpZGUgPSBwYXJ0aWNpcGFudEluZGV4ID09PSAwID8gJ2hvbWUnIDogJ2F3YXknO1xuXG4gICAgaWYgKCFicmFja2V0RGF0YS5wYXJ0aWNpcGFudHMuaGFzKHBhcnRpY2lwYW50SWQpKSB7XG4gICAgICBicmFja2V0RGF0YS5wYXJ0aWNpcGFudHMuc2V0KHBhcnRpY2lwYW50SWQsIHtcbiAgICAgICAgaWQ6IHBhcnRpY2lwYW50SWQsXG4gICAgICAgIHNob3J0SWQ6IGBwJHtsb2NhbFBhcnRpY2lwYW50Q291bnRlcisrfWAgYXMgTWF0Y2hQYXJ0aWNpcGFudFNob3J0SWQsXG4gICAgICAgIG5hbWU6IGAke3NpZGV9ICR7Y3VycmVudEluZGV4SW5Sb3VuZH1gLFxuICAgICAgICBtYXRjaGVzOiBuZXcgTWFwKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudERhdGEgPSBicmFja2V0RGF0YS5wYXJ0aWNpcGFudHMuZ2V0KHBhcnRpY2lwYW50SWQpIGFzIEJyYWNrZXRQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcblxuICAgIGlmICghcGFydGljaXBhbnREYXRhLm1hdGNoZXMuaGFzKGJyYWNrZXRNYXRjaC5pZCkpIHtcbiAgICAgIHBhcnRpY2lwYW50RGF0YS5tYXRjaGVzLnNldChicmFja2V0TWF0Y2guaWQsIHtcbiAgICAgICAgc2lkZTogbWF0Y2guaG9tZSA9PT0gcGFydGljaXBhbnRJZCA/ICdob21lJyA6ICdhd2F5JyxcbiAgICAgICAgYnJhY2tldE1hdGNoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYnJhY2tldE1hdGNoW3NpZGVdID0gcGFydGljaXBhbnREYXRhO1xuXG4gICAgaWYgKGJyYWNrZXRNYXRjaC53aW5uZXJTaWRlID09PSBzaWRlKSB7XG4gICAgICBicmFja2V0TWF0Y2gud2lubmVyID0gcGFydGljaXBhbnREYXRhO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBicmFja2V0TWF0Y2g7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZUJyYWNrZXREYXRhT3B0aW9ucyA9IHtcbiAgbGF5b3V0OiBCcmFja2V0RGF0YUxheW91dDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXREYXRhID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBzb3VyY2U6IEJyYWNrZXREYXRhU291cmNlPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBvcHRpb25zOiBHZW5lcmF0ZUJyYWNrZXREYXRhT3B0aW9ucyxcbikgPT4ge1xuICBpZiAoIWNhblJlbmRlckxheW91dEluVG91cm5hbWVudE1vZGUob3B0aW9ucy5sYXlvdXQsIHNvdXJjZS5tb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbmRlciBsYXlvdXQgJHtvcHRpb25zLmxheW91dH0gaW4gbW9kZSAke3NvdXJjZS5tb2RlfWApO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkU3BsaXRSb3VuZHNJblR3byA9IG9wdGlvbnMubGF5b3V0ID09PSBCUkFDS0VUX0RBVEFfTEFZT1VULk1JUlJPUkVEO1xuXG4gIGNvbnN0IGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICBtYXRjaGVzOiBuZXcgTWFwKCksXG4gICAgbW9kZTogc291cmNlLm1vZGUsXG4gICAgcGFydGljaXBhbnRzOiBuZXcgTWFwKCksXG4gICAgcm91bmRzOiBuZXcgTWFwKCksXG4gICAgcm91bmRJZHM6IFtdLFxuICAgIG1hdGNoSWRzOiBbXSxcbiAgfTtcblxuICBsZXQgY3VycmVudFVwcGVyQnJhY2tldEluZGV4ID0gMDtcbiAgbGV0IGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCA9IDA7XG5cbiAgY29uc3Qgc3BsaXRSb3VuZHNSZXN0OiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW3JvdW5kSW5kZXgsIHJvdW5kXSBvZiBzb3VyY2Uucm91bmRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGlzTG93ZXJCcmFja2V0ID0gcm91bmQudHlwZSA9PT0gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5MT1dFUl9CUkFDS0VUO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBzb3VyY2UubWF0Y2hlcy5maWx0ZXIoKG0pID0+IG0ucm91bmRJZCA9PT0gcm91bmQuaWQpO1xuICAgIGNvbnN0IHJvdW5kSWQgPSByb3VuZC5pZCBhcyBCcmFja2V0Um91bmRJZDtcbiAgICBjb25zdCBzaG91bGRTcGxpdFJvdW5kID0gc2hvdWxkU3BsaXRSb3VuZHNJblR3byAmJiBtYXRjaGVzLmxlbmd0aCAlIDIgPT09IDA7XG4gICAgY29uc3QgaXNGaXJzdFJvdW5kID0gcm91bmRJbmRleCA9PT0gMDtcblxuICAgIGlmIChzaG91bGRTcGxpdFJvdW5kKSB7XG4gICAgICBjb25zdCBmaXJzdEhhbGZNYXRjaGVzTWF4SW5kZXggPSBtYXRjaGVzLmxlbmd0aCAvIDIgLSAxO1xuXG4gICAgICBjb25zdCBmaXJzdEhhbGZSb3VuZElkID0gYCR7cm91bmRJZH0tLWhhbGYtMWAgYXMgQnJhY2tldFJvdW5kSWQ7XG4gICAgICBjb25zdCBzZWNvbmRIYWxmUm91bmRJZCA9IGAke3JvdW5kSWR9LS1oYWxmLTJgIGFzIEJyYWNrZXRSb3VuZElkO1xuXG4gICAgICBjb25zdCBicmFja2V0Um91bmRGaXJzdEhhbGY6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICAgICAgdHlwZTogcm91bmQudHlwZSxcbiAgICAgICAgaWQ6IGZpcnN0SGFsZlJvdW5kSWQsXG4gICAgICAgIGluZGV4OiBpc0xvd2VyQnJhY2tldCA/IGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCA6IGN1cnJlbnRVcHBlckJyYWNrZXRJbmRleCxcbiAgICAgICAgZGF0YTogcm91bmQuZGF0YSxcbiAgICAgICAgcG9zaXRpb246ICgoaXNMb3dlckJyYWNrZXQgPyBjdXJyZW50TG93ZXJCcmFja2V0SW5kZXggOiBjdXJyZW50VXBwZXJCcmFja2V0SW5kZXgpICsgMSkgYXMgQnJhY2tldFJvdW5kUG9zaXRpb24sXG4gICAgICAgIG5hbWU6IHJvdW5kLm5hbWUsXG4gICAgICAgIG1hdGNoQ291bnQ6IG1hdGNoZXMubGVuZ3RoIC8gMixcbiAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICBtaXJyb3JSb3VuZFR5cGU6IEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUuTEVGVCxcbiAgICAgICAgaXNGaXJzdFJvdW5kLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYnJhY2tldFJvdW5kU2Vjb25kSGFsZjogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICB0eXBlOiByb3VuZC50eXBlLFxuICAgICAgICBpZDogc2Vjb25kSGFsZlJvdW5kSWQsXG4gICAgICAgIGluZGV4OiAtMSxcbiAgICAgICAgZGF0YTogcm91bmQuZGF0YSxcbiAgICAgICAgcG9zaXRpb246IC0xIGFzIEJyYWNrZXRSb3VuZFBvc2l0aW9uLFxuICAgICAgICBuYW1lOiByb3VuZC5uYW1lLFxuICAgICAgICBtYXRjaENvdW50OiBtYXRjaGVzLmxlbmd0aCAvIDIsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgICAgbWlycm9yUm91bmRUeXBlOiBCUkFDS0VUX1JPVU5EX01JUlJPUl9UWVBFLlJJR0hULFxuICAgICAgICBpc0ZpcnN0Um91bmQsXG4gICAgICB9O1xuXG4gICAgICBicmFja2V0RGF0YS5yb3VuZElkcy5wdXNoKGZpcnN0SGFsZlJvdW5kSWQpO1xuICAgICAgYnJhY2tldERhdGEucm91bmRzLnNldChmaXJzdEhhbGZSb3VuZElkLCBicmFja2V0Um91bmRGaXJzdEhhbGYpO1xuICAgICAgc3BsaXRSb3VuZHNSZXN0LnVuc2hpZnQoYnJhY2tldFJvdW5kU2Vjb25kSGFsZik7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gZmlyc3RIYWxmTWF0Y2hlc01heEluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoRmlyc3QgPSBtYXRjaGVzW2luZGV4XTtcbiAgICAgICAgY29uc3QgbWF0Y2hTZWNvbmQgPSBtYXRjaGVzW2ZpcnN0SGFsZk1hdGNoZXNNYXhJbmRleCArIDEgKyBpbmRleF07XG5cbiAgICAgICAgaWYgKCFtYXRjaEZpcnN0IHx8ICFtYXRjaFNlY29uZCkgdGhyb3cgbmV3IEVycm9yKCdNYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICBjb25zdCBwYXJ0aWNpcGFudENvdW50ZXIgPSBicmFja2V0RGF0YS5wYXJ0aWNpcGFudHMuc2l6ZTtcblxuICAgICAgICBjb25zdCBicmFja2V0TWF0Y2hGaXJzdCA9IGdlbmVyYXRlQW5kU2V0QnJhY2tldE1hdGNoV2l0aFBhcnRpY2lwYW50cyhtYXRjaEZpcnN0LCB7XG4gICAgICAgICAgYnJhY2tldERhdGEsXG4gICAgICAgICAgYnJhY2tldFJvdW5kOiBicmFja2V0Um91bmRGaXJzdEhhbGYsXG4gICAgICAgICAgY3VycmVudEluZGV4SW5Sb3VuZDogaW5kZXgsXG4gICAgICAgICAgcGFydGljaXBhbnRDb3VudGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGUgcGFydGljaXBhbnQgY291bnRlciBtaWdodCBoYXZlIGNoYW5nZWQgYWZ0ZXIgdGhlIGZpcnN0IGhhbGZcbiAgICAgICAgY29uc3QgdXBkYXRlZFBhcnRpY2lwYW50Q291bnRlciA9IGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5zaXplO1xuXG4gICAgICAgIGNvbnN0IGJyYWNrZXRNYXRjaFNlY29uZCA9IGdlbmVyYXRlQW5kU2V0QnJhY2tldE1hdGNoV2l0aFBhcnRpY2lwYW50cyhtYXRjaFNlY29uZCwge1xuICAgICAgICAgIGJyYWNrZXREYXRhLFxuICAgICAgICAgIGJyYWNrZXRSb3VuZDogYnJhY2tldFJvdW5kU2Vjb25kSGFsZixcbiAgICAgICAgICBjdXJyZW50SW5kZXhJblJvdW5kOiBpbmRleCxcbiAgICAgICAgICBwYXJ0aWNpcGFudENvdW50ZXI6IHVwZGF0ZWRQYXJ0aWNpcGFudENvdW50ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyYWNrZXREYXRhLm1hdGNoSWRzLnB1c2goYnJhY2tldE1hdGNoRmlyc3QuaWQsIGJyYWNrZXRNYXRjaFNlY29uZC5pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJyYWNrZXRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICB0eXBlOiByb3VuZC50eXBlLFxuICAgICAgICBpZDogcm91bmRJZCxcbiAgICAgICAgaW5kZXg6IGlzTG93ZXJCcmFja2V0ID8gY3VycmVudExvd2VyQnJhY2tldEluZGV4IDogY3VycmVudFVwcGVyQnJhY2tldEluZGV4LFxuICAgICAgICBkYXRhOiByb3VuZC5kYXRhLFxuICAgICAgICBwb3NpdGlvbjogKChpc0xvd2VyQnJhY2tldCA/IGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCA6IGN1cnJlbnRVcHBlckJyYWNrZXRJbmRleCkgKyAxKSBhcyBCcmFja2V0Um91bmRQb3NpdGlvbixcbiAgICAgICAgbmFtZTogcm91bmQubmFtZSxcbiAgICAgICAgbWF0Y2hDb3VudDogbWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgICAgbWlycm9yUm91bmRUeXBlOiBudWxsLFxuICAgICAgICBpc0ZpcnN0Um91bmQsXG4gICAgICB9O1xuXG4gICAgICBicmFja2V0RGF0YS5yb3VuZElkcy5wdXNoKHJvdW5kSWQpO1xuICAgICAgYnJhY2tldERhdGEucm91bmRzLnNldChyb3VuZElkLCBicmFja2V0Um91bmQpO1xuXG4gICAgICBsZXQgY3VycmVudEluZGV4SW5Sb3VuZCA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICBjb25zdCBwYXJ0aWNpcGFudENvdW50ZXIgPSBicmFja2V0RGF0YS5wYXJ0aWNpcGFudHMuc2l6ZTtcblxuICAgICAgICBjb25zdCBicmFja2V0TWF0Y2ggPSBnZW5lcmF0ZUFuZFNldEJyYWNrZXRNYXRjaFdpdGhQYXJ0aWNpcGFudHMobWF0Y2gsIHtcbiAgICAgICAgICBicmFja2V0RGF0YSxcbiAgICAgICAgICBicmFja2V0Um91bmQsXG4gICAgICAgICAgY3VycmVudEluZGV4SW5Sb3VuZCxcbiAgICAgICAgICBwYXJ0aWNpcGFudENvdW50ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICBicmFja2V0RGF0YS5tYXRjaElkcy5wdXNoKGJyYWNrZXRNYXRjaC5pZCk7XG4gICAgICAgIGN1cnJlbnRJbmRleEluUm91bmQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNMb3dlckJyYWNrZXQpIHtcbiAgICAgIGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50VXBwZXJCcmFja2V0SW5kZXgrKztcbiAgICB9XG4gIH1cblxuICBpZiAoc3BsaXRSb3VuZHNSZXN0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxhc3RSb3VuZElkID0gYnJhY2tldERhdGEucm91bmRJZHNbYnJhY2tldERhdGEucm91bmRJZHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoIWxhc3RSb3VuZElkKSB0aHJvdyBuZXcgRXJyb3IoJ0xhc3Qgcm91bmQgaWQgbm90IGZvdW5kJyk7XG5cbiAgICBjb25zdCBsYXN0Um91bmQgPSBicmFja2V0RGF0YS5yb3VuZHMuZ2V0KGxhc3RSb3VuZElkKTtcblxuICAgIGlmICghbGFzdFJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ0xhc3Qgcm91bmQgbm90IGZvdW5kJyk7XG5cbiAgICBmb3IgKGNvbnN0IFtzcGxpdFJvdW5kSW5kZXgsIHNwbGl0Um91bmRdIG9mIHNwbGl0Um91bmRzUmVzdC5lbnRyaWVzKCkpIHtcbiAgICAgIHNwbGl0Um91bmQuaW5kZXggPSBsYXN0Um91bmQuaW5kZXggKyBzcGxpdFJvdW5kSW5kZXggKyAxO1xuICAgICAgc3BsaXRSb3VuZC5wb3NpdGlvbiA9IChsYXN0Um91bmQucG9zaXRpb24gKyBzcGxpdFJvdW5kSW5kZXggKyAxKSBhcyBCcmFja2V0Um91bmRQb3NpdGlvbjtcbiAgICAgIGJyYWNrZXREYXRhLnJvdW5kcy5zZXQoc3BsaXRSb3VuZC5pZCwgc3BsaXRSb3VuZCk7XG4gICAgICBicmFja2V0RGF0YS5yb3VuZElkcy5wdXNoKHNwbGl0Um91bmQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBicmFja2V0RGF0YTtcbn07XG4iXX0=