mediasfu-angular 1.0.1 → 2.0.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 (474) hide show
  1. package/README.md +871 -769
  2. package/dist/README.md +870 -769
  3. package/dist/fesm2022/mediasfu-angular.mjs +13241 -3372
  4. package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
  5. package/dist/lib/@types/types.d.ts +22 -1
  6. package/dist/lib/components/background-components/background-modal/background-modal.component.d.ts +36 -0
  7. package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +51 -0
  8. package/dist/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.d.ts +48 -0
  9. package/dist/lib/components/co-host-components/co-host-modal/co-host-modal.component.d.ts +62 -0
  10. package/dist/lib/components/display-components/alert-component/alert.component.component.d.ts +24 -18
  11. package/dist/lib/components/display-components/audio-card/audio-card.component.d.ts +59 -0
  12. package/dist/lib/components/display-components/audio-grid/audio-grid.component.d.ts +20 -0
  13. package/dist/lib/components/display-components/card-video-display/card-video-display.component.d.ts +35 -0
  14. package/dist/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.d.ts +38 -0
  15. package/dist/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.d.ts +24 -40
  16. package/dist/lib/components/display-components/control-widgets/menu-participants-widget.component.d.ts +21 -0
  17. package/dist/lib/components/display-components/control-widgets/menu-record-widget.component.d.ts +22 -0
  18. package/dist/lib/components/display-components/control-widgets/menu-widget.component.d.ts +23 -0
  19. package/dist/lib/components/display-components/control-widgets/message-widget.component.d.ts +23 -0
  20. package/dist/lib/components/display-components/control-widgets/record-timer-widget.component.d.ts +15 -0
  21. package/dist/lib/components/display-components/control-widgets/screenshare-widget.component.d.ts +27 -0
  22. package/dist/lib/components/display-components/flexible-grid/flexible-grid.component.d.ts +27 -18
  23. package/dist/lib/components/display-components/flexible-video/flexible-video.component.d.ts +30 -45
  24. package/dist/lib/components/display-components/loading-modal/loading-modal.component.d.ts +19 -17
  25. package/dist/lib/components/display-components/main-aspect-component/main-aspect-component.component.d.ts +32 -24
  26. package/dist/lib/components/display-components/main-container-component/main-container-component.component.d.ts +28 -16
  27. package/dist/lib/components/display-components/main-grid-component/main-grid-component.component.d.ts +28 -14
  28. package/dist/lib/components/display-components/main-screen-component/main-screen-component.component.d.ts +43 -22
  29. package/dist/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.d.ts +25 -30
  30. package/dist/lib/components/display-components/mini-audio/mini-audio.component.d.ts +55 -62
  31. package/dist/lib/components/display-components/mini-card/mini-card.component.d.ts +19 -23
  32. package/dist/lib/components/display-components/mini-card-audio/mini-card-audio.component.d.ts +39 -39
  33. package/dist/lib/components/display-components/other-grid-component/other-grid-component.component.d.ts +28 -13
  34. package/dist/lib/components/display-components/pagination/pagination.component.d.ts +29 -23
  35. package/dist/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.d.ts +18 -24
  36. package/dist/lib/components/display-components/video-card/video-card.component.d.ts +62 -0
  37. package/dist/lib/components/display-settings-components/display-settings-modal.component.d.ts +28 -17
  38. package/dist/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.d.ts +47 -38
  39. package/dist/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.d.ts +35 -22
  40. package/dist/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.d.ts +35 -24
  41. package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +258 -117
  42. package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +254 -117
  43. package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +312 -162
  44. package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +312 -162
  45. package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +310 -162
  46. package/dist/lib/components/menu-components/custom-buttons/custom-buttons.component.d.ts +49 -51
  47. package/dist/lib/components/menu-components/meeting-id-component/meeting-id-component.component.d.ts +6 -1
  48. package/dist/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.d.ts +5 -0
  49. package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +27 -29
  50. package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +20 -15
  51. package/dist/lib/components/message-components/message-panel/message-panel.component.d.ts +24 -0
  52. package/dist/lib/components/message-components/messages-modal/messages-modal.component.d.ts +34 -0
  53. package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +20 -35
  54. package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +79 -66
  55. package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +19 -1
  56. package/dist/lib/components/misc-components/welcome-page/welcome-page.component.d.ts +15 -0
  57. package/dist/lib/components/participants-components/participant-list/participant-list.component.d.ts +19 -0
  58. package/dist/lib/components/participants-components/participant-list-item/participant-list-item.component.d.ts +19 -0
  59. package/dist/lib/components/participants-components/participant-list-others/participant-list-others.component.d.ts +17 -0
  60. package/dist/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.d.ts +17 -0
  61. package/dist/lib/components/participants-components/participants-modal/participants-modal.component.d.ts +24 -0
  62. package/dist/lib/components/polls-components/poll-modal/poll-modal.component.d.ts +27 -0
  63. package/dist/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.d.ts +15 -0
  64. package/dist/lib/components/recording-components/recording-modal/recording-modal.component.d.ts +12 -0
  65. package/dist/lib/components/recording-components/standard-panel-component/standard-panel-component.component.d.ts +5 -0
  66. package/dist/lib/components/requests-components/render-request-component/render-request-component.component.d.ts +22 -0
  67. package/dist/lib/components/requests-components/requests-modal/requests-modal.component.d.ts +17 -0
  68. package/dist/lib/components/screenboard-components/screenboard/screenboard.component.d.ts +10 -0
  69. package/dist/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.d.ts +11 -0
  70. package/dist/lib/components/waiting-components/waiting-room-modal.component.d.ts +59 -0
  71. package/dist/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.d.ts +21 -0
  72. package/dist/lib/components/whiteboard-components/whiteboard/whiteboard.component.d.ts +49 -0
  73. package/dist/lib/consumers/add-videos-grid.service.d.ts +49 -0
  74. package/dist/lib/consumers/auto-adjust.service.d.ts +26 -0
  75. package/dist/lib/consumers/calculate-rows-and-columns.service.d.ts +18 -0
  76. package/dist/lib/consumers/change-vids.service.d.ts +131 -66
  77. package/dist/lib/consumers/check-grid.service.d.ts +32 -18
  78. package/dist/lib/consumers/check-permission.service.d.ts +25 -0
  79. package/dist/lib/consumers/check-screen-share.service.d.ts +35 -0
  80. package/dist/lib/consumers/close-and-resize.service.d.ts +102 -0
  81. package/dist/lib/consumers/compare-active-names.service.d.ts +31 -0
  82. package/dist/lib/consumers/compare-screen-states.service.d.ts +35 -0
  83. package/dist/lib/consumers/connect-ips.service.d.ts +42 -0
  84. package/dist/lib/consumers/connect-local-ips.service.d.ts +81 -0
  85. package/dist/lib/consumers/connect-recv-transport.service.d.ts +33 -0
  86. package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +81 -11
  87. package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +96 -15
  88. package/dist/lib/consumers/connect-send-transport-video.service.d.ts +101 -11
  89. package/dist/lib/consumers/connect-send-transport.service.d.ts +59 -1
  90. package/dist/lib/consumers/consumer-resume.service.d.ts +36 -0
  91. package/dist/lib/consumers/control-media.service.d.ts +45 -0
  92. package/dist/lib/consumers/create-send-transport.service.d.ts +149 -13
  93. package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +100 -13
  94. package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +75 -2
  95. package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +99 -17
  96. package/dist/lib/consumers/disp-streams.service.d.ts +92 -0
  97. package/dist/lib/consumers/generate-page-content.service.d.ts +47 -0
  98. package/dist/lib/consumers/get-estimate.service.d.ts +50 -0
  99. package/dist/lib/consumers/get-piped-producers-alt.service.d.ts +38 -1
  100. package/dist/lib/consumers/get-producers-piped.service.d.ts +33 -0
  101. package/dist/lib/consumers/get-videos.service.d.ts +33 -0
  102. package/dist/lib/consumers/mix-streams.service.d.ts +22 -0
  103. package/dist/lib/consumers/on-screen-changes.service.d.ts +40 -0
  104. package/dist/lib/consumers/prepopulate-user-media.service.d.ts +99 -0
  105. package/dist/lib/consumers/process-consumer-transports-audio.service.d.ts +29 -0
  106. package/dist/lib/consumers/process-consumer-transports.service.d.ts +37 -0
  107. package/dist/lib/consumers/re-port.service.d.ts +48 -0
  108. package/dist/lib/consumers/re-update-inter.service.d.ts +82 -0
  109. package/dist/lib/consumers/readjust.service.d.ts +50 -0
  110. package/dist/lib/consumers/receive-all-piped-transports.service.d.ts +36 -1
  111. package/dist/lib/consumers/receive-room-messages.service.d.ts +27 -0
  112. package/dist/lib/consumers/reorder-streams.service.d.ts +58 -0
  113. package/dist/lib/consumers/request-screen-share.service.d.ts +34 -0
  114. package/dist/lib/consumers/resume-pause-audio-streams.service.d.ts +51 -0
  115. package/dist/lib/consumers/resume-pause-streams.service.d.ts +33 -0
  116. package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +76 -7
  117. package/dist/lib/consumers/signal-new-consumer-transport.service.d.ts +37 -37
  118. package/dist/lib/consumers/socket-receive-methods/join-consume-room.service.d.ts +33 -0
  119. package/dist/lib/consumers/socket-receive-methods/new-pipe-producer.service.d.ts +39 -0
  120. package/dist/lib/consumers/socket-receive-methods/producer-closed.service.d.ts +27 -0
  121. package/dist/lib/consumers/start-share-screen.service.d.ts +40 -0
  122. package/dist/lib/consumers/stop-share-screen.service.d.ts +55 -0
  123. package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +148 -11
  124. package/dist/lib/consumers/stream-success-audio.service.d.ts +61 -0
  125. package/dist/lib/consumers/stream-success-screen.service.d.ts +50 -0
  126. package/dist/lib/consumers/stream-success-video.service.d.ts +58 -0
  127. package/dist/lib/consumers/switch-user-audio.service.d.ts +33 -0
  128. package/dist/lib/consumers/switch-user-video-alt.service.d.ts +32 -0
  129. package/dist/lib/consumers/switch-user-video.service.d.ts +47 -0
  130. package/dist/lib/consumers/trigger.service.d.ts +41 -0
  131. package/dist/lib/consumers/update-mini-cards-grid.service.d.ts +54 -0
  132. package/dist/lib/consumers/update-participant-audio-decibels.service.d.ts +45 -0
  133. package/dist/lib/methods/background-methods/launch-background.service.d.ts +25 -0
  134. package/dist/lib/methods/breakout-room-methods/breakout-room-updated.service.d.ts +71 -0
  135. package/dist/lib/methods/breakout-room-methods/launch-breakout-rooms.service.d.ts +24 -0
  136. package/dist/lib/methods/co-host-methods/launch-co-host.service.d.ts +24 -0
  137. package/dist/lib/methods/co-host-methods/modify-co-host-settings.service.d.ts +44 -0
  138. package/dist/lib/methods/display-settings-methods/launch-display-settings.service.d.ts +22 -0
  139. package/dist/lib/methods/display-settings-methods/modify-display-settings.service.d.ts +75 -0
  140. package/dist/lib/methods/exit-methods/confirm-exit.service.d.ts +29 -1
  141. package/dist/lib/methods/exit-methods/launch-confirm-exit.service.d.ts +20 -0
  142. package/dist/lib/methods/media-settings-methods/launch-media-settings.service.d.ts +35 -0
  143. package/dist/lib/methods/menu-methods/launch-menu-modal.service.d.ts +22 -0
  144. package/dist/lib/methods/message-methods/launch-messages.service.d.ts +22 -0
  145. package/dist/lib/methods/message-methods/send-message.service.d.ts +49 -0
  146. package/dist/lib/methods/participants-methods/launch-participants.service.d.ts +24 -0
  147. package/dist/lib/methods/participants-methods/message-participants.service.d.ts +46 -0
  148. package/dist/lib/methods/participants-methods/mute-participants.service.d.ts +39 -0
  149. package/dist/lib/methods/participants-methods/remove-participants.service.d.ts +45 -0
  150. package/dist/lib/methods/polls-methods/handle-create-poll.service.d.ts +38 -0
  151. package/dist/lib/methods/polls-methods/handle-end-poll.service.d.ts +32 -0
  152. package/dist/lib/methods/polls-methods/handle-vote-poll.service.d.ts +34 -0
  153. package/dist/lib/methods/polls-methods/launch-poll.service.d.ts +20 -0
  154. package/dist/lib/methods/polls-methods/poll-updated.service.d.ts +31 -0
  155. package/dist/lib/methods/recording-methods/check-pause-state.service.d.ts +24 -0
  156. package/dist/lib/methods/recording-methods/check-resume-state.service.d.ts +22 -0
  157. package/dist/lib/methods/recording-methods/confirm-recording.service.d.ts +63 -0
  158. package/dist/lib/methods/recording-methods/launch-recording.service.d.ts +43 -0
  159. package/dist/lib/methods/recording-methods/record-pause-timer.service.d.ts +27 -0
  160. package/dist/lib/methods/recording-methods/record-resume-timer.service.d.ts +44 -0
  161. package/dist/lib/methods/recording-methods/record-start-timer.service.d.ts +45 -0
  162. package/dist/lib/methods/recording-methods/record-update-timer.service.d.ts +32 -0
  163. package/dist/lib/methods/recording-methods/start-recording.service.d.ts +53 -0
  164. package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +42 -1
  165. package/dist/lib/methods/recording-methods/update-recording.service.d.ts +51 -0
  166. package/dist/lib/methods/requests-methods/launch-requests.service.d.ts +25 -0
  167. package/dist/lib/methods/requests-methods/respond-to-requests.service.d.ts +39 -0
  168. package/dist/lib/methods/settings-methods/launch-settings.service.d.ts +25 -0
  169. package/dist/lib/methods/settings-methods/modify-settings.service.d.ts +42 -0
  170. package/dist/lib/methods/stream-methods/click-audio.service.d.ts +100 -0
  171. package/dist/lib/methods/stream-methods/click-chat.service.d.ts +31 -0
  172. package/dist/lib/methods/stream-methods/click-screen-share.service.d.ts +68 -0
  173. package/dist/lib/methods/stream-methods/click-video.service.d.ts +88 -0
  174. package/dist/lib/methods/stream-methods/switch-audio.service.d.ts +47 -0
  175. package/dist/lib/methods/stream-methods/switch-video-alt.service.d.ts +50 -0
  176. package/dist/lib/methods/stream-methods/switch-video.service.d.ts +56 -0
  177. package/dist/lib/methods/utils/check-limits-and-make-request.service.d.ts +23 -0
  178. package/dist/lib/methods/utils/create-response-join-room.util.d.ts +33 -0
  179. package/dist/lib/methods/utils/create-room-on-media-sfu.service.d.ts +25 -0
  180. package/dist/lib/methods/utils/format-number.service.d.ts +26 -14
  181. package/dist/lib/methods/utils/generate-random-messages.service.d.ts +33 -0
  182. package/dist/lib/methods/utils/generate-random-participants.service.d.ts +27 -0
  183. package/dist/lib/methods/utils/generate-random-polls.service.d.ts +26 -0
  184. package/dist/lib/methods/utils/generate-random-request-list.service.d.ts +36 -0
  185. package/dist/lib/methods/utils/generate-random-waiting-room-list.service.d.ts +21 -0
  186. package/dist/lib/methods/utils/get-modal-position.util.d.ts +13 -3
  187. package/dist/lib/methods/utils/get-overlay-position.util.d.ts +13 -3
  188. package/dist/lib/methods/utils/initial-values.util.d.ts +6 -0
  189. package/dist/lib/methods/utils/join-room-on-media-sfu.service.d.ts +52 -0
  190. package/dist/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.d.ts +37 -0
  191. package/dist/lib/methods/utils/mini-audio-player/mini-audio-player.component.d.ts +55 -0
  192. package/dist/lib/methods/utils/producer/a-params.service.d.ts +37 -0
  193. package/dist/lib/methods/utils/producer/h-params.service.d.ts +50 -0
  194. package/dist/lib/methods/utils/producer/screen-params.service.d.ts +37 -0
  195. package/dist/lib/methods/utils/producer/v-params.service.d.ts +50 -0
  196. package/dist/lib/methods/utils/producer/video-capture-constraints.service.d.ts +46 -0
  197. package/dist/lib/methods/utils/sleep.util.d.ts +9 -3
  198. package/dist/lib/methods/utils/sound-player.service.d.ts +21 -0
  199. package/dist/lib/methods/utils/validate-alphanumeric.service.d.ts +16 -0
  200. package/dist/lib/methods/waiting-methods/launch-waiting.service.d.ts +18 -0
  201. package/dist/lib/methods/waiting-methods/respond-to-waiting.service.d.ts +29 -0
  202. package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +46 -0
  203. package/dist/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.d.ts +20 -0
  204. package/dist/lib/producer-client/producer-client-emits/create-device-client.service.d.ts +23 -0
  205. package/dist/lib/producer-client/producer-client-emits/join-room-client.service.d.ts +31 -0
  206. package/dist/lib/producer-client/producer-client-emits/update-room-parameters-client.service.d.ts +44 -0
  207. package/dist/lib/producers/producer-emits/join-con-room.service.d.ts +38 -0
  208. package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +125 -0
  209. package/dist/lib/producers/producer-emits/join-room.service.d.ts +38 -0
  210. package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +80 -2
  211. package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +78 -2
  212. package/dist/lib/producers/socket-receive-methods/all-waiting-room-members.service.d.ts +27 -0
  213. package/dist/lib/producers/socket-receive-methods/ban-participant.service.d.ts +36 -0
  214. package/dist/lib/producers/socket-receive-methods/control-media-host.service.d.ts +37 -0
  215. package/dist/lib/producers/socket-receive-methods/disconnect-user-self.service.d.ts +29 -1
  216. package/dist/lib/producers/socket-receive-methods/disconnect.service.d.ts +26 -0
  217. package/dist/lib/producers/socket-receive-methods/get-domains.service.d.ts +24 -9
  218. package/dist/lib/producers/socket-receive-methods/host-request-response.service.d.ts +31 -48
  219. package/dist/lib/producers/socket-receive-methods/meeting-ended.service.d.ts +29 -0
  220. package/dist/lib/producers/socket-receive-methods/meeting-still-there.service.d.ts +23 -0
  221. package/dist/lib/producers/socket-receive-methods/meeting-time-remaining.service.d.ts +27 -0
  222. package/dist/lib/producers/socket-receive-methods/participant-requested.service.d.ts +31 -0
  223. package/dist/lib/producers/socket-receive-methods/person-joined.service.d.ts +25 -0
  224. package/dist/lib/producers/socket-receive-methods/producer-media-closed.service.d.ts +61 -0
  225. package/dist/lib/producers/socket-receive-methods/producer-media-paused.service.d.ts +62 -0
  226. package/dist/lib/producers/socket-receive-methods/producer-media-resumed.service.d.ts +45 -0
  227. package/dist/lib/producers/socket-receive-methods/re-initiate-recording.service.d.ts +29 -0
  228. package/dist/lib/producers/socket-receive-methods/receive-message.service.d.ts +38 -0
  229. package/dist/lib/producers/socket-receive-methods/recording-notice.service.d.ts +38 -0
  230. package/dist/lib/producers/socket-receive-methods/room-record-params.service.d.ts +62 -0
  231. package/dist/lib/producers/socket-receive-methods/screen-producer-id.service.d.ts +41 -0
  232. package/dist/lib/producers/socket-receive-methods/start-records.service.d.ts +25 -0
  233. package/dist/lib/producers/socket-receive-methods/stopped-recording.service.d.ts +25 -0
  234. package/dist/lib/producers/socket-receive-methods/time-left-recording.service.d.ts +21 -0
  235. package/dist/lib/producers/socket-receive-methods/update-consuming-domains.service.d.ts +42 -0
  236. package/dist/lib/producers/socket-receive-methods/update-media-settings.service.d.ts +30 -0
  237. package/dist/lib/producers/socket-receive-methods/updated-co-host.service.d.ts +40 -0
  238. package/dist/lib/producers/socket-receive-methods/user-waiting.service.d.ts +14 -40
  239. package/dist/lib/sockets/socket-manager.service.d.ts +130 -0
  240. package/dist/public-api.d.ts +11 -1
  241. package/package.json +17 -20
  242. package/dist/esm2022/lib/@types/types.mjs +0 -2
  243. package/dist/esm2022/lib/components/background-components/background-modal/background-modal.component.mjs +0 -763
  244. package/dist/esm2022/lib/components/breakout-components/breakout-rooms-modal.component.mjs +0 -316
  245. package/dist/esm2022/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.mjs +0 -95
  246. package/dist/esm2022/lib/components/breakout-components/room-list/room-list.component.mjs +0 -40
  247. package/dist/esm2022/lib/components/co-host-components/co-host-modal/co-host-modal.component.mjs +0 -246
  248. package/dist/esm2022/lib/components/display-components/alert-component/alert.component.component.mjs +0 -73
  249. package/dist/esm2022/lib/components/display-components/audio-card/audio-card.component.mjs +0 -297
  250. package/dist/esm2022/lib/components/display-components/audio-grid/audio-grid.component.mjs +0 -60
  251. package/dist/esm2022/lib/components/display-components/card-video-display/card-video-display.component.mjs +0 -94
  252. package/dist/esm2022/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.mjs +0 -100
  253. package/dist/esm2022/lib/components/display-components/control-buttons-component/control-buttons-component.component.mjs +0 -231
  254. package/dist/esm2022/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.mjs +0 -298
  255. package/dist/esm2022/lib/components/display-components/control-widgets/menu-participants-widget.component.mjs +0 -61
  256. package/dist/esm2022/lib/components/display-components/control-widgets/menu-record-widget.component.mjs +0 -43
  257. package/dist/esm2022/lib/components/display-components/control-widgets/menu-widget.component.mjs +0 -114
  258. package/dist/esm2022/lib/components/display-components/control-widgets/message-widget.component.mjs +0 -114
  259. package/dist/esm2022/lib/components/display-components/control-widgets/record-timer-widget.component.mjs +0 -36
  260. package/dist/esm2022/lib/components/display-components/control-widgets/screenshare-widget.component.mjs +0 -74
  261. package/dist/esm2022/lib/components/display-components/flexible-grid/flexible-grid.component.mjs +0 -142
  262. package/dist/esm2022/lib/components/display-components/flexible-video/flexible-video.component.mjs +0 -265
  263. package/dist/esm2022/lib/components/display-components/loading-modal/loading-modal.component.mjs +0 -100
  264. package/dist/esm2022/lib/components/display-components/main-aspect-component/main-aspect-component.component.mjs +0 -132
  265. package/dist/esm2022/lib/components/display-components/main-container-component/main-container-component.component.mjs +0 -119
  266. package/dist/esm2022/lib/components/display-components/main-grid-component/main-grid-component.component.mjs +0 -106
  267. package/dist/esm2022/lib/components/display-components/main-screen-component/main-screen-component.component.mjs +0 -180
  268. package/dist/esm2022/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.mjs +0 -120
  269. package/dist/esm2022/lib/components/display-components/mini-audio/mini-audio.component.mjs +0 -326
  270. package/dist/esm2022/lib/components/display-components/mini-card/mini-card.component.mjs +0 -165
  271. package/dist/esm2022/lib/components/display-components/mini-card-audio/mini-card-audio.component.mjs +0 -230
  272. package/dist/esm2022/lib/components/display-components/other-grid-component/other-grid-component.component.mjs +0 -111
  273. package/dist/esm2022/lib/components/display-components/pagination/pagination.component.mjs +0 -328
  274. package/dist/esm2022/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.mjs +0 -118
  275. package/dist/esm2022/lib/components/display-components/video-card/video-card.component.mjs +0 -330
  276. package/dist/esm2022/lib/components/display-settings-components/display-settings-modal.component.mjs +0 -95
  277. package/dist/esm2022/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.mjs +0 -190
  278. package/dist/esm2022/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.mjs +0 -119
  279. package/dist/esm2022/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.mjs +0 -209
  280. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-broadcast.component.mjs +0 -4189
  281. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-chat.component.mjs +0 -3705
  282. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-conference.component.mjs +0 -5024
  283. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-generic.component.mjs +0 -5333
  284. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-webinar.component.mjs +0 -5023
  285. package/dist/esm2022/lib/components/menu-components/custom-buttons/custom-buttons.component.mjs +0 -85
  286. package/dist/esm2022/lib/components/menu-components/meeting-id-component/meeting-id-component.component.mjs +0 -22
  287. package/dist/esm2022/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.mjs +0 -22
  288. package/dist/esm2022/lib/components/menu-components/menu-modal/menu-modal.component.mjs +0 -132
  289. package/dist/esm2022/lib/components/menu-components/share-buttons-component/share-buttons-component.component.mjs +0 -104
  290. package/dist/esm2022/lib/components/message-components/message-panel/message-panel.component.mjs +0 -204
  291. package/dist/esm2022/lib/components/message-components/messages-modal/messages-modal.component.mjs +0 -243
  292. package/dist/esm2022/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.mjs +0 -147
  293. package/dist/esm2022/lib/components/misc-components/pre-join-page/pre-join-page.component.mjs +0 -335
  294. package/dist/esm2022/lib/components/misc-components/share-event-modal/share-event-modal.component.mjs +0 -113
  295. package/dist/esm2022/lib/components/misc-components/welcome-page/welcome-page.component.mjs +0 -226
  296. package/dist/esm2022/lib/components/participants-components/participant-list/participant-list.component.mjs +0 -63
  297. package/dist/esm2022/lib/components/participants-components/participant-list-item/participant-list-item.component.mjs +0 -120
  298. package/dist/esm2022/lib/components/participants-components/participant-list-others/participant-list-others.component.mjs +0 -23
  299. package/dist/esm2022/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.mjs +0 -43
  300. package/dist/esm2022/lib/components/participants-components/participants-modal/participants-modal.component.mjs +0 -100
  301. package/dist/esm2022/lib/components/polls-components/poll-modal/poll-modal.component.mjs +0 -174
  302. package/dist/esm2022/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.mjs +0 -77
  303. package/dist/esm2022/lib/components/recording-components/recording-modal/recording-modal.component.mjs +0 -121
  304. package/dist/esm2022/lib/components/recording-components/standard-panel-component/standard-panel-component.component.mjs +0 -85
  305. package/dist/esm2022/lib/components/requests-components/render-request-component/render-request-component.component.mjs +0 -59
  306. package/dist/esm2022/lib/components/requests-components/requests-modal/requests-modal.component.mjs +0 -130
  307. package/dist/esm2022/lib/components/screenboard-components/screenboard/screenboard.component.mjs +0 -617
  308. package/dist/esm2022/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.mjs +0 -380
  309. package/dist/esm2022/lib/components/waiting-components/waiting-room-modal.component.mjs +0 -142
  310. package/dist/esm2022/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.mjs +0 -265
  311. package/dist/esm2022/lib/components/whiteboard-components/whiteboard/whiteboard.component.mjs +0 -1784
  312. package/dist/esm2022/lib/consumers/add-videos-grid.service.mjs +0 -296
  313. package/dist/esm2022/lib/consumers/auto-adjust.service.mjs +0 -83
  314. package/dist/esm2022/lib/consumers/calculate-rows-and-columns.service.mjs +0 -42
  315. package/dist/esm2022/lib/consumers/change-vids.service.mjs +0 -486
  316. package/dist/esm2022/lib/consumers/check-grid.service.mjs +0 -79
  317. package/dist/esm2022/lib/consumers/check-permission.service.mjs +0 -80
  318. package/dist/esm2022/lib/consumers/check-screen-share.service.mjs +0 -71
  319. package/dist/esm2022/lib/consumers/close-and-resize.service.mjs +0 -229
  320. package/dist/esm2022/lib/consumers/compare-active-names.service.mjs +0 -75
  321. package/dist/esm2022/lib/consumers/compare-screen-states.service.mjs +0 -63
  322. package/dist/esm2022/lib/consumers/connect-ips.service.mjs +0 -112
  323. package/dist/esm2022/lib/consumers/connect-recv-transport.service.mjs +0 -113
  324. package/dist/esm2022/lib/consumers/connect-send-transport-audio.service.mjs +0 -46
  325. package/dist/esm2022/lib/consumers/connect-send-transport-screen.service.mjs +0 -62
  326. package/dist/esm2022/lib/consumers/connect-send-transport-video.service.mjs +0 -55
  327. package/dist/esm2022/lib/consumers/connect-send-transport.service.mjs +0 -86
  328. package/dist/esm2022/lib/consumers/consumer-resume.service.mjs +0 -332
  329. package/dist/esm2022/lib/consumers/control-media.service.mjs +0 -68
  330. package/dist/esm2022/lib/consumers/create-send-transport.service.mjs +0 -126
  331. package/dist/esm2022/lib/consumers/disconnect-send-transport-audio.service.mjs +0 -58
  332. package/dist/esm2022/lib/consumers/disconnect-send-transport-screen.service.mjs +0 -45
  333. package/dist/esm2022/lib/consumers/disconnect-send-transport-video.service.mjs +0 -56
  334. package/dist/esm2022/lib/consumers/disp-streams.service.mjs +0 -421
  335. package/dist/esm2022/lib/consumers/generate-page-content.service.mjs +0 -59
  336. package/dist/esm2022/lib/consumers/get-estimate.service.mjs +0 -70
  337. package/dist/esm2022/lib/consumers/get-piped-producers-alt.service.mjs +0 -49
  338. package/dist/esm2022/lib/consumers/get-producers-piped.service.mjs +0 -46
  339. package/dist/esm2022/lib/consumers/get-videos.service.mjs +0 -58
  340. package/dist/esm2022/lib/consumers/mix-streams.service.mjs +0 -73
  341. package/dist/esm2022/lib/consumers/on-screen-changes.service.mjs +0 -63
  342. package/dist/esm2022/lib/consumers/prepopulate-user-media.service.mjs +0 -442
  343. package/dist/esm2022/lib/consumers/process-consumer-transports-audio.service.mjs +0 -72
  344. package/dist/esm2022/lib/consumers/process-consumer-transports.service.mjs +0 -91
  345. package/dist/esm2022/lib/consumers/re-port.service.mjs +0 -66
  346. package/dist/esm2022/lib/consumers/re-update-inter.service.mjs +0 -157
  347. package/dist/esm2022/lib/consumers/readjust.service.mjs +0 -123
  348. package/dist/esm2022/lib/consumers/receive-all-piped-transports.service.mjs +0 -56
  349. package/dist/esm2022/lib/consumers/receive-room-messages.service.mjs +0 -42
  350. package/dist/esm2022/lib/consumers/reorder-streams.service.mjs +0 -181
  351. package/dist/esm2022/lib/consumers/request-screen-share.service.mjs +0 -67
  352. package/dist/esm2022/lib/consumers/resume-pause-audio-streams.service.mjs +0 -99
  353. package/dist/esm2022/lib/consumers/resume-pause-streams.service.mjs +0 -70
  354. package/dist/esm2022/lib/consumers/resume-send-transport-audio.service.mjs +0 -55
  355. package/dist/esm2022/lib/consumers/signal-new-consumer-transport.service.mjs +0 -136
  356. package/dist/esm2022/lib/consumers/socket-receive-methods/join-consume-room.service.mjs +0 -63
  357. package/dist/esm2022/lib/consumers/socket-receive-methods/new-pipe-producer.service.mjs +0 -61
  358. package/dist/esm2022/lib/consumers/socket-receive-methods/producer-closed.service.mjs +0 -51
  359. package/dist/esm2022/lib/consumers/start-share-screen.service.mjs +0 -80
  360. package/dist/esm2022/lib/consumers/stop-share-screen.service.mjs +0 -120
  361. package/dist/esm2022/lib/consumers/stream-success-audio-switch.service.mjs +0 -132
  362. package/dist/esm2022/lib/consumers/stream-success-audio.service.mjs +0 -149
  363. package/dist/esm2022/lib/consumers/stream-success-screen.service.mjs +0 -143
  364. package/dist/esm2022/lib/consumers/stream-success-video.service.mjs +0 -202
  365. package/dist/esm2022/lib/consumers/switch-user-audio.service.mjs +0 -87
  366. package/dist/esm2022/lib/consumers/switch-user-video-alt.service.mjs +0 -228
  367. package/dist/esm2022/lib/consumers/switch-user-video.service.mjs +0 -125
  368. package/dist/esm2022/lib/consumers/trigger.service.mjs +0 -172
  369. package/dist/esm2022/lib/consumers/update-mini-cards-grid.service.mjs +0 -81
  370. package/dist/esm2022/lib/consumers/update-participant-audio-decibels.service.mjs +0 -39
  371. package/dist/esm2022/lib/methods/background-methods/launch-background.service.mjs +0 -23
  372. package/dist/esm2022/lib/methods/breakout-room-methods/breakout-room-updated.service.mjs +0 -112
  373. package/dist/esm2022/lib/methods/breakout-room-methods/launch-breakout-rooms.service.mjs +0 -22
  374. package/dist/esm2022/lib/methods/co-host-methods/launch-co-host.service.mjs +0 -22
  375. package/dist/esm2022/lib/methods/co-host-methods/modify-co-host-settings.service.mjs +0 -60
  376. package/dist/esm2022/lib/methods/display-settings-methods/launch-display-settings.service.mjs +0 -24
  377. package/dist/esm2022/lib/methods/display-settings-methods/modify-display-settings.service.mjs +0 -119
  378. package/dist/esm2022/lib/methods/exit-methods/confirm-exit.service.mjs +0 -28
  379. package/dist/esm2022/lib/methods/exit-methods/launch-confirm-exit.service.mjs +0 -22
  380. package/dist/esm2022/lib/methods/media-settings-methods/launch-media-settings.service.mjs +0 -50
  381. package/dist/esm2022/lib/methods/menu-methods/launch-menu-modal.service.mjs +0 -22
  382. package/dist/esm2022/lib/methods/message-methods/launch-messages.service.mjs +0 -23
  383. package/dist/esm2022/lib/methods/message-methods/send-message.service.mjs +0 -94
  384. package/dist/esm2022/lib/methods/participants-methods/launch-participants.service.mjs +0 -23
  385. package/dist/esm2022/lib/methods/participants-methods/message-participants.service.mjs +0 -52
  386. package/dist/esm2022/lib/methods/participants-methods/mute-participants.service.mjs +0 -57
  387. package/dist/esm2022/lib/methods/participants-methods/remove-participants.service.mjs +0 -62
  388. package/dist/esm2022/lib/methods/polls-methods/handle-create-poll.service.mjs +0 -37
  389. package/dist/esm2022/lib/methods/polls-methods/handle-end-poll.service.mjs +0 -40
  390. package/dist/esm2022/lib/methods/polls-methods/handle-vote-poll.service.mjs +0 -49
  391. package/dist/esm2022/lib/methods/polls-methods/launch-poll.service.mjs +0 -23
  392. package/dist/esm2022/lib/methods/polls-methods/poll-updated.service.mjs +0 -64
  393. package/dist/esm2022/lib/methods/recording-methods/check-pause-state.service.mjs +0 -45
  394. package/dist/esm2022/lib/methods/recording-methods/check-resume-state.service.mjs +0 -34
  395. package/dist/esm2022/lib/methods/recording-methods/confirm-recording.service.mjs +0 -215
  396. package/dist/esm2022/lib/methods/recording-methods/launch-recording.service.mjs +0 -82
  397. package/dist/esm2022/lib/methods/recording-methods/record-pause-timer.service.mjs +0 -40
  398. package/dist/esm2022/lib/methods/recording-methods/record-resume-timer.service.mjs +0 -86
  399. package/dist/esm2022/lib/methods/recording-methods/record-start-timer.service.mjs +0 -89
  400. package/dist/esm2022/lib/methods/recording-methods/record-update-timer.service.mjs +0 -48
  401. package/dist/esm2022/lib/methods/recording-methods/start-recording.service.mjs +0 -147
  402. package/dist/esm2022/lib/methods/recording-methods/stop-recording.service.mjs +0 -74
  403. package/dist/esm2022/lib/methods/recording-methods/update-recording.service.mjs +0 -224
  404. package/dist/esm2022/lib/methods/requests-methods/launch-requests.service.mjs +0 -26
  405. package/dist/esm2022/lib/methods/requests-methods/respond-to-requests.service.mjs +0 -45
  406. package/dist/esm2022/lib/methods/settings-methods/launch-settings.service.mjs +0 -26
  407. package/dist/esm2022/lib/methods/settings-methods/modify-settings.service.mjs +0 -67
  408. package/dist/esm2022/lib/methods/stream-methods/click-audio.service.mjs +0 -178
  409. package/dist/esm2022/lib/methods/stream-methods/click-chat.service.mjs +0 -44
  410. package/dist/esm2022/lib/methods/stream-methods/click-screen-share.service.mjs +0 -110
  411. package/dist/esm2022/lib/methods/stream-methods/click-video.service.mjs +0 -183
  412. package/dist/esm2022/lib/methods/stream-methods/switch-audio.service.mjs +0 -33
  413. package/dist/esm2022/lib/methods/stream-methods/switch-video-alt.service.mjs +0 -66
  414. package/dist/esm2022/lib/methods/stream-methods/switch-video.service.mjs +0 -76
  415. package/dist/esm2022/lib/methods/utils/format-number.service.mjs +0 -45
  416. package/dist/esm2022/lib/methods/utils/generate-random-messages.service.mjs +0 -87
  417. package/dist/esm2022/lib/methods/utils/generate-random-participants.service.mjs +0 -99
  418. package/dist/esm2022/lib/methods/utils/generate-random-polls.service.mjs +0 -52
  419. package/dist/esm2022/lib/methods/utils/generate-random-request-list.service.mjs +0 -54
  420. package/dist/esm2022/lib/methods/utils/generate-random-waiting-room-list.service.mjs +0 -38
  421. package/dist/esm2022/lib/methods/utils/get-modal-position.util.mjs +0 -22
  422. package/dist/esm2022/lib/methods/utils/get-overlay-position.util.mjs +0 -21
  423. package/dist/esm2022/lib/methods/utils/initial-values.util.mjs +0 -379
  424. package/dist/esm2022/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.mjs +0 -59
  425. package/dist/esm2022/lib/methods/utils/mini-audio-player/mini-audio-player.component.mjs +0 -260
  426. package/dist/esm2022/lib/methods/utils/producer/a-params.service.mjs +0 -21
  427. package/dist/esm2022/lib/methods/utils/producer/h-params.service.mjs +0 -37
  428. package/dist/esm2022/lib/methods/utils/producer/screen-params.service.mjs +0 -24
  429. package/dist/esm2022/lib/methods/utils/producer/v-params.service.mjs +0 -37
  430. package/dist/esm2022/lib/methods/utils/producer/video-capture-constraints.service.mjs +0 -38
  431. package/dist/esm2022/lib/methods/utils/sleep.util.mjs +0 -11
  432. package/dist/esm2022/lib/methods/utils/sound-player.service.mjs +0 -42
  433. package/dist/esm2022/lib/methods/utils/validate-alphanumeric.service.mjs +0 -33
  434. package/dist/esm2022/lib/methods/waiting-methods/launch-waiting.service.mjs +0 -23
  435. package/dist/esm2022/lib/methods/waiting-methods/respond-to-waiting.service.mjs +0 -40
  436. package/dist/esm2022/lib/methods/whiteboard-methods/capture-canvas-stream.service.mjs +0 -69
  437. package/dist/esm2022/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.mjs +0 -24
  438. package/dist/esm2022/lib/producer-client/producer-client-emits/create-device-client.service.mjs +0 -51
  439. package/dist/esm2022/lib/producer-client/producer-client-emits/join-room-client.service.mjs +0 -65
  440. package/dist/esm2022/lib/producer-client/producer-client-emits/update-room-parameters-client.service.mjs +0 -232
  441. package/dist/esm2022/lib/producers/producer-emits/join-con-room.service.mjs +0 -114
  442. package/dist/esm2022/lib/producers/producer-emits/join-room.service.mjs +0 -114
  443. package/dist/esm2022/lib/producers/socket-receive-methods/all-members-rest.service.mjs +0 -155
  444. package/dist/esm2022/lib/producers/socket-receive-methods/all-members.service.mjs +0 -147
  445. package/dist/esm2022/lib/producers/socket-receive-methods/all-waiting-room-members.service.mjs +0 -30
  446. package/dist/esm2022/lib/producers/socket-receive-methods/ban-participant.service.mjs +0 -40
  447. package/dist/esm2022/lib/producers/socket-receive-methods/control-media-host.service.mjs +0 -146
  448. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect-user-self.service.mjs +0 -26
  449. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect.service.mjs +0 -38
  450. package/dist/esm2022/lib/producers/socket-receive-methods/get-domains.service.mjs +0 -63
  451. package/dist/esm2022/lib/producers/socket-receive-methods/host-request-response.service.mjs +0 -167
  452. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-ended.service.mjs +0 -44
  453. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-still-there.service.mjs +0 -24
  454. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-time-remaining.service.mjs +0 -36
  455. package/dist/esm2022/lib/producers/socket-receive-methods/participant-requested.service.mjs +0 -32
  456. package/dist/esm2022/lib/producers/socket-receive-methods/person-joined.service.mjs +0 -29
  457. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-closed.service.mjs +0 -68
  458. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-paused.service.mjs +0 -90
  459. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-resumed.service.mjs +0 -54
  460. package/dist/esm2022/lib/producers/socket-receive-methods/re-initiate-recording.service.mjs +0 -38
  461. package/dist/esm2022/lib/producers/socket-receive-methods/receive-message.service.mjs +0 -96
  462. package/dist/esm2022/lib/producers/socket-receive-methods/recording-notice.service.mjs +0 -195
  463. package/dist/esm2022/lib/producers/socket-receive-methods/room-record-params.service.mjs +0 -59
  464. package/dist/esm2022/lib/producers/socket-receive-methods/screen-producer-id.service.mjs +0 -45
  465. package/dist/esm2022/lib/producers/socket-receive-methods/start-records.service.mjs +0 -35
  466. package/dist/esm2022/lib/producers/socket-receive-methods/stopped-recording.service.mjs +0 -37
  467. package/dist/esm2022/lib/producers/socket-receive-methods/time-left-recording.service.mjs +0 -36
  468. package/dist/esm2022/lib/producers/socket-receive-methods/update-consuming-domains.service.mjs +0 -63
  469. package/dist/esm2022/lib/producers/socket-receive-methods/update-media-settings.service.mjs +0 -36
  470. package/dist/esm2022/lib/producers/socket-receive-methods/updated-co-host.service.mjs +0 -56
  471. package/dist/esm2022/lib/producers/socket-receive-methods/user-waiting.service.mjs +0 -78
  472. package/dist/esm2022/lib/sockets/socket-manager.service.mjs +0 -73
  473. package/dist/esm2022/mediasfu-angular.mjs +0 -5
  474. package/dist/esm2022/public-api.mjs +0 -187
@@ -1,486 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class ChangeVids {
4
- /**
5
- * Asynchronously changes the video streams based on the provided options.
6
- *
7
- * @param {Object} options - The options for changing video streams.
8
- * @param {boolean} [options.screenChanged=false] - Indicates if the screen has changed.
9
- * @param {ChangeVidsOptions} options.parameters - The parameters for changing video streams.
10
- * @returns {Promise<void>} A promise that resolves when the video streams have been changed.
11
- *
12
- * @typedef {Object} ChangeVidsOptions
13
- * @property {Function} getUpdatedAllParams - Function to get updated parameters.
14
- * @property {Array} allVideoStreams - Array of all video streams.
15
- * @property {Array} p_activeNames - Array of active participant names.
16
- * @property {Array} activeNames - Array of active names.
17
- * @property {Array} dispActiveNames - Array of displayed active names.
18
- * @property {boolean} shareScreenStarted - Indicates if screen sharing has started.
19
- * @property {boolean} shared - Indicates if the screen is shared.
20
- * @property {Array} newLimitedStreams - Array of new limited streams.
21
- * @property {Array} non_alVideoStreams - Array of non-al video streams.
22
- * @property {Array} ref_participants - Array of reference participants.
23
- * @property {Array} participants - Array of participants.
24
- * @property {string} eventType - Type of the event.
25
- * @property {string} islevel - Level of the participant.
26
- * @property {string} member - Name of the member.
27
- * @property {boolean} sortAudioLoudness - Indicates if audio loudness should be sorted.
28
- * @property {Array} audioDecibels - Array of audio decibels.
29
- * @property {Array} mixed_alVideoStreams - Array of mixed al video streams.
30
- * @property {Array} non_alVideoStreams_muted - Array of muted non-al video streams.
31
- * @property {string} remoteProducerId - ID of the remote producer.
32
- * @property {Object} localStreamVideo - Local stream video object.
33
- * @property {Array} oldAllStreams - Array of old all streams.
34
- * @property {number} screenPageLimit - Limit of streams per screen page.
35
- * @property {string} meetingDisplayType - Type of meeting display.
36
- * @property {boolean} meetingVideoOptimized - Indicates if meeting video is optimized.
37
- * @property {boolean} recordingVideoOptimized - Indicates if recording video is optimized.
38
- * @property {string} recordingDisplayType - Type of recording display.
39
- * @property {Array} paginatedStreams - Array of paginated streams.
40
- * @property {number} itemPageLimit - Limit of items per page.
41
- * @property {boolean} doPaginate - Indicates if pagination should be done.
42
- * @property {boolean} prevDoPaginate - Indicates if pagination was previously done.
43
- * @property {number} currentUserPage - Current user page number.
44
- * @property {Array} breakoutRooms - Array of breakout rooms.
45
- * @property {number} hostNewRoom - Index of the new room for the host.
46
- * @property {boolean} breakOutRoomStarted - Indicates if breakout room has started.
47
- * @property {boolean} breakOutRoomEnded - Indicates if breakout room has ended.
48
- * @property {Object} virtualStream - Virtual stream object.
49
- * @property {number} mainRoomsLength - Length of main rooms.
50
- * @property {string} memberRoom - Room of the member.
51
- * @property {Function} updateP_activeNames - Function to update active participant names.
52
- * @property {Function} updateActiveNames - Function to update active names.
53
- * @property {Function} updateDispActiveNames - Function to update displayed active names.
54
- * @property {Function} updateNewLimitedStreams - Function to update new limited streams.
55
- * @property {Function} updateNon_alVideoStreams - Function to update non-al video streams.
56
- * @property {Function} updateRef_participants - Function to update reference participants.
57
- * @property {Function} updateSortAudioLoudness - Function to update audio loudness sorting.
58
- * @property {Function} updateMixed_alVideoStreams - Function to update mixed al video streams.
59
- * @property {Function} updateNon_alVideoStreams_muted - Function to update muted non-al video streams.
60
- * @property {Function} updatePaginatedStreams - Function to update paginated streams.
61
- * @property {Function} updateDoPaginate - Function to update pagination status.
62
- * @property {Function} updatePrevDoPaginate - Function to update previous pagination status.
63
- * @property {Function} updateCurrentUserPage - Function to update current user page.
64
- * @property {Function} updateNumberPages - Function to update number of pages.
65
- * @property {Function} updateMainRoomsLength - Function to update main rooms length.
66
- * @property {Function} updateMemberRoom - Function to update member room.
67
- * @property {Function} mixStreams - Function to mix streams.
68
- * @property {Function} dispStreams - Function to display streams.
69
- */
70
- changeVids = async ({ screenChanged = false, parameters }) => {
71
- let { getUpdatedAllParams } = parameters;
72
- parameters = getUpdatedAllParams();
73
- let { allVideoStreams, p_activeNames, activeNames, dispActiveNames, shareScreenStarted, shared, newLimitedStreams, non_alVideoStreams, ref_participants, participants, eventType, islevel, member, sortAudioLoudness, audioDecibels, mixed_alVideoStreams, non_alVideoStreams_muted, remoteProducerId, localStreamVideo, oldAllStreams, screenPageLimit, meetingDisplayType, meetingVideoOptimized, recordingVideoOptimized, recordingDisplayType, paginatedStreams, itemPageLimit, doPaginate, prevDoPaginate, currentUserPage, breakoutRooms, hostNewRoom, breakOutRoomStarted, breakOutRoomEnded, virtualStream, mainRoomsLength, memberRoom, updateP_activeNames, updateActiveNames, updateDispActiveNames, updateNewLimitedStreams, updateNon_alVideoStreams, updateRef_participants, updateSortAudioLoudness, updateMixed_alVideoStreams, updateNon_alVideoStreams_muted, updatePaginatedStreams, updateDoPaginate, updatePrevDoPaginate, updateCurrentUserPage, updateNumberPages, updateMainRoomsLength, updateMemberRoom,
74
- // mediasfu functions
75
- mixStreams, dispStreams, } = parameters;
76
- try {
77
- let alVideoStreams = [...allVideoStreams];
78
- p_activeNames = [...activeNames];
79
- let streame;
80
- if (shareScreenStarted || shared) {
81
- alVideoStreams = [...newLimitedStreams];
82
- activeNames = [];
83
- }
84
- activeNames = [];
85
- dispActiveNames = [];
86
- ref_participants = participants;
87
- let temp = alVideoStreams;
88
- await Promise.all(temp.map(async (stream) => {
89
- let participant = ref_participants.find((obj) => obj.videoID === stream.producerId);
90
- if (!participant && stream.producerId !== 'youyou' && stream.producerId !== 'youyouyou') {
91
- alVideoStreams = alVideoStreams.filter((obj) => obj.producerId !== stream.producerId);
92
- }
93
- }));
94
- if (eventType === 'broadcast' || eventType === 'chat') {
95
- sortAudioLoudness = false;
96
- }
97
- if (shareScreenStarted || shared) {
98
- non_alVideoStreams = [];
99
- non_alVideoStreams_muted = [];
100
- mixed_alVideoStreams = [];
101
- }
102
- else {
103
- if (alVideoStreams.length > screenPageLimit) {
104
- alVideoStreams = alVideoStreams.filter((obj) => obj.producerId !== 'youyou' && obj.producerId !== 'youyouyou');
105
- ref_participants = ref_participants.sort((a, b) => (a.muted ?? false) > (b.muted ?? false) ? 1 : -1);
106
- let temp = [];
107
- await Promise.all(ref_participants.map((participant) => {
108
- let stream = alVideoStreams.find((obj) => obj.producerId === participant.videoID);
109
- if (stream) {
110
- temp.push(stream);
111
- }
112
- }));
113
- alVideoStreams = temp;
114
- let youyou = allVideoStreams.find((obj) => obj.producerId === 'youyou');
115
- if (!youyou) {
116
- let youyouyou = allVideoStreams.find((obj) => obj.producerId === 'youyouyou');
117
- if (youyouyou) {
118
- alVideoStreams.unshift(youyouyou);
119
- }
120
- }
121
- else {
122
- if (youyou) {
123
- alVideoStreams.unshift(youyou);
124
- }
125
- }
126
- }
127
- const admin = participants.filter((participant) => participant.islevel === '2');
128
- let adminName = '';
129
- if (admin.length > 0) {
130
- adminName = admin[0].name || '';
131
- }
132
- non_alVideoStreams = [];
133
- await Promise.all(ref_participants.map(async (participant) => {
134
- let stream = alVideoStreams.find((obj) => obj.producerId === participant.videoID);
135
- if (eventType !== 'chat' && eventType !== 'conference') {
136
- if (!stream &&
137
- participant.name !== member &&
138
- !participant['muted'] &&
139
- participant.name !== adminName) {
140
- non_alVideoStreams.push(participant);
141
- }
142
- }
143
- else {
144
- if (!stream && participant.name !== member && !participant['muted']) {
145
- non_alVideoStreams.push(participant);
146
- }
147
- }
148
- }));
149
- if (sortAudioLoudness) {
150
- non_alVideoStreams.sort((a, b) => {
151
- const avgLoudnessA = audioDecibels.find((obj) => obj.name === a.name)?.averageLoudness || 127;
152
- const avgLoudnessB = audioDecibels.find((obj) => obj.name === b.name)?.averageLoudness || 127;
153
- return avgLoudnessB - avgLoudnessA;
154
- });
155
- if (!(meetingDisplayType === 'video' && meetingVideoOptimized) ||
156
- !(recordingVideoOptimized && recordingDisplayType === 'video')) {
157
- mixed_alVideoStreams = await mixStreams({
158
- alVideoStreams,
159
- non_alVideoStreams,
160
- ref_participants,
161
- });
162
- }
163
- }
164
- non_alVideoStreams_muted = [];
165
- await Promise.all(ref_participants.map(async (participant) => {
166
- let stream = alVideoStreams.find((obj) => obj.producerId === participant.videoID);
167
- if (eventType !== 'chat' && eventType !== 'conference') {
168
- if (!stream &&
169
- participant.name !== member &&
170
- participant['muted'] &&
171
- participant.name !== adminName) {
172
- non_alVideoStreams_muted.push(participant);
173
- }
174
- }
175
- else {
176
- if (!stream && participant.name !== member && participant['muted']) {
177
- non_alVideoStreams_muted.push(participant);
178
- }
179
- }
180
- }));
181
- }
182
- if (eventType === 'conference' && islevel !== '2') {
183
- let host = participants.find((obj) => obj.islevel === '2');
184
- if (host) {
185
- if (host.videoID) {
186
- remoteProducerId = host.videoID;
187
- }
188
- if (islevel === '2') {
189
- host['stream'] = virtualStream || localStreamVideo;
190
- }
191
- else {
192
- let hostVideo = alVideoStreams.find((obj) => obj.producerId === remoteProducerId);
193
- if (!hostVideo) {
194
- streame = oldAllStreams.find((streame) => streame.producerId === remoteProducerId);
195
- if (streame) {
196
- alVideoStreams = alVideoStreams.filter((obj) => obj.producerId !== host.videoID);
197
- non_alVideoStreams = non_alVideoStreams.filter((obj) => obj.name !== host.name);
198
- non_alVideoStreams_muted = non_alVideoStreams_muted.filter((obj) => obj.name !== host.name);
199
- if (sortAudioLoudness) {
200
- mixed_alVideoStreams = mixed_alVideoStreams.filter((obj) => obj.name !== host.name);
201
- non_alVideoStreams_muted = non_alVideoStreams_muted.filter((obj) => obj.name !== host.name);
202
- if (meetingDisplayType == 'video' && meetingVideoOptimized) {
203
- alVideoStreams.unshift(streame);
204
- }
205
- else {
206
- mixed_alVideoStreams.unshift(streame);
207
- }
208
- }
209
- else {
210
- alVideoStreams.unshift(streame);
211
- }
212
- }
213
- else {
214
- await Promise.all(ref_participants.map(async (participant) => {
215
- let stream = alVideoStreams.find((obj) => obj.producerId == participant.videoID && participant.name == host.name);
216
- if (stream) {
217
- if (sortAudioLoudness) {
218
- mixed_alVideoStreams = mixed_alVideoStreams.filter((obj) => obj.name !== host.name);
219
- non_alVideoStreams_muted = non_alVideoStreams_muted.filter((obj) => obj.name !== host.name);
220
- mixed_alVideoStreams.unshift(participant);
221
- }
222
- else {
223
- non_alVideoStreams = non_alVideoStreams.filter((obj) => obj.name !== host.name);
224
- non_alVideoStreams.unshift(participant);
225
- return;
226
- }
227
- }
228
- }));
229
- }
230
- }
231
- }
232
- }
233
- }
234
- let allStreamsPaged = [];
235
- if (sortAudioLoudness) {
236
- if (meetingDisplayType === 'video') {
237
- if (meetingVideoOptimized) {
238
- allStreamsPaged = [...alVideoStreams];
239
- }
240
- else {
241
- allStreamsPaged = [...mixed_alVideoStreams];
242
- }
243
- }
244
- else if (meetingDisplayType === 'media') {
245
- allStreamsPaged = [...mixed_alVideoStreams];
246
- }
247
- else if (meetingDisplayType === 'all') {
248
- allStreamsPaged = [...mixed_alVideoStreams, ...non_alVideoStreams_muted];
249
- }
250
- }
251
- else {
252
- if (meetingDisplayType === 'video') {
253
- allStreamsPaged = [...alVideoStreams];
254
- }
255
- else if (meetingDisplayType === 'media') {
256
- allStreamsPaged = [...alVideoStreams, ...non_alVideoStreams];
257
- }
258
- else if (meetingDisplayType === 'all') {
259
- allStreamsPaged = [...alVideoStreams, ...non_alVideoStreams, ...non_alVideoStreams_muted];
260
- }
261
- }
262
- paginatedStreams = [];
263
- let limit = itemPageLimit;
264
- if (shareScreenStarted || shared) {
265
- limit = screenPageLimit;
266
- }
267
- let firstPage = [];
268
- let page = [];
269
- let limit_ = limit + 1;
270
- if (eventType === 'conference' && !shared && !shareScreenStarted) {
271
- limit_ = limit_ - 1;
272
- }
273
- // Create pagination
274
- let memberInRoom = false;
275
- let filterHost = false;
276
- if (breakOutRoomStarted && !breakOutRoomEnded) {
277
- let tempBreakoutRooms = JSON.parse(JSON.stringify(breakoutRooms));
278
- let host = participants.find((obj) => obj.islevel == '2');
279
- for (let room of tempBreakoutRooms) {
280
- try {
281
- let currentStreams = [];
282
- const roomIndex = tempBreakoutRooms.indexOf(room);
283
- if (hostNewRoom != -1 && roomIndex == hostNewRoom) {
284
- if (host) {
285
- if (!room.map((obj) => obj.name).includes(host.name)) {
286
- room = [...room, { name: host.name, breakRoom: roomIndex }];
287
- filterHost = true;
288
- }
289
- }
290
- }
291
- for (let participant of room) {
292
- if (participant.name == member && !memberInRoom) {
293
- memberInRoom = true;
294
- memberRoom = participant.breakRoom;
295
- updateMemberRoom(memberRoom);
296
- }
297
- let streams = allStreamsPaged.filter((stream) => {
298
- if ((Object.prototype.hasOwnProperty.call(stream, 'producerId') &&
299
- stream.producerId != null &&
300
- stream.producerId !== '') ||
301
- (Object.prototype.hasOwnProperty.call(stream, 'audioID') &&
302
- stream['audioID'] != null &&
303
- stream['audioID'] !== '')) {
304
- let producerId = stream.producerId || stream['audioID'];
305
- let matchingParticipant = ref_participants.find((obj) => obj['audioID'] === producerId ||
306
- obj.videoID === producerId ||
307
- ((producerId == 'youyou' || producerId == 'youyouyou') &&
308
- member == participant.name));
309
- return ((matchingParticipant && matchingParticipant.name === participant.name) ||
310
- (participant.name == member &&
311
- (producerId == 'youyou' || producerId == 'youyouyou')));
312
- }
313
- else {
314
- return (Object.prototype.hasOwnProperty.call(stream, 'name') &&
315
- stream.name == participant.name);
316
- }
317
- });
318
- for (let stream of streams) {
319
- if (currentStreams.length < limit_) {
320
- currentStreams.push(stream);
321
- }
322
- }
323
- }
324
- paginatedStreams.push(currentStreams);
325
- }
326
- catch {
327
- /* handle error */
328
- }
329
- }
330
- let remainingStreams = allStreamsPaged.filter((stream) => {
331
- if ((Object.prototype.hasOwnProperty.call(stream, 'producerId') &&
332
- stream.producerId != null &&
333
- stream.producerId !== '') ||
334
- (Object.prototype.hasOwnProperty.call(stream, 'audioID') &&
335
- stream['audioID'] != null &&
336
- stream['audioID'] !== '')) {
337
- let producerId = stream.producerId || stream['audioID'];
338
- let matchingParticipant = ref_participants.find((obj) => obj['audioID'] === producerId ||
339
- obj.videoID === producerId ||
340
- ((producerId == 'youyou' || producerId == 'youyouyou') && member == obj.name));
341
- return (matchingParticipant &&
342
- !breakoutRooms
343
- .flat()
344
- .map((obj) => obj.name)
345
- .includes(matchingParticipant.name) &&
346
- (!filterHost || matchingParticipant.name != host?.name));
347
- }
348
- else {
349
- return (!breakoutRooms
350
- .flat()
351
- .map((obj) => obj.name)
352
- .includes(stream.name ?? '') &&
353
- (!filterHost || stream.name != host?.name));
354
- }
355
- });
356
- if (memberInRoom) {
357
- let memberStream = allStreamsPaged.find((stream) => {
358
- if (Object.prototype.hasOwnProperty.call(stream, 'producerId') &&
359
- stream.producerId != null &&
360
- stream.producerId !== '') {
361
- return stream.producerId == 'youyou' || stream.producerId == 'youyouyou';
362
- }
363
- return false; // Add a return statement here
364
- });
365
- if (memberStream && !remainingStreams.includes(memberStream)) {
366
- remainingStreams.unshift(memberStream);
367
- }
368
- }
369
- let remainingPaginatedStreams = [];
370
- if (remainingStreams.length > 0) {
371
- firstPage = remainingStreams.slice(0, limit_);
372
- remainingPaginatedStreams.push(firstPage);
373
- for (let i = limit_; i < remainingStreams.length; i += limit) {
374
- page = remainingStreams.slice(i, i + limit);
375
- remainingPaginatedStreams.push(page);
376
- }
377
- }
378
- mainRoomsLength = remainingPaginatedStreams.length;
379
- updateMainRoomsLength(mainRoomsLength);
380
- // Add the remaining streams to the beginning of the paginatedStreams
381
- for (let i = remainingPaginatedStreams.length - 1; i >= 0; i--) {
382
- paginatedStreams.unshift(remainingPaginatedStreams[i]);
383
- }
384
- }
385
- else {
386
- firstPage = allStreamsPaged.slice(0, limit_);
387
- paginatedStreams.push(firstPage);
388
- for (let i = limit_; i < allStreamsPaged.length; i += limit) {
389
- page = allStreamsPaged.slice(i, i + limit);
390
- paginatedStreams.push(page);
391
- }
392
- }
393
- // State updates
394
- updateP_activeNames(p_activeNames);
395
- updateActiveNames(activeNames);
396
- updateDispActiveNames(dispActiveNames);
397
- updateNewLimitedStreams(newLimitedStreams);
398
- updateNon_alVideoStreams(non_alVideoStreams);
399
- updateRef_participants(ref_participants);
400
- updateSortAudioLoudness(sortAudioLoudness);
401
- updateMixed_alVideoStreams(mixed_alVideoStreams);
402
- updateNon_alVideoStreams_muted(non_alVideoStreams_muted);
403
- updatePaginatedStreams(paginatedStreams);
404
- prevDoPaginate = doPaginate;
405
- doPaginate = false;
406
- updatePrevDoPaginate(prevDoPaginate);
407
- updateDoPaginate(doPaginate);
408
- let isActive = false;
409
- if (paginatedStreams.length > 1) {
410
- if (!shareScreenStarted && !shared) {
411
- doPaginate = true;
412
- }
413
- updateDoPaginate(doPaginate);
414
- if (currentUserPage > paginatedStreams.length - 1) {
415
- if (breakOutRoomStarted && !breakOutRoomEnded) {
416
- currentUserPage = 0;
417
- }
418
- else {
419
- currentUserPage = paginatedStreams.length - 1;
420
- }
421
- }
422
- else if (currentUserPage == 0) {
423
- isActive = true;
424
- }
425
- updateCurrentUserPage(currentUserPage);
426
- updateNumberPages(paginatedStreams.length - 1);
427
- if (screenChanged) {
428
- await dispStreams({
429
- lStreams: paginatedStreams[0],
430
- ind: 0,
431
- parameters,
432
- });
433
- }
434
- else {
435
- await dispStreams({
436
- lStreams: paginatedStreams[0],
437
- ind: 0,
438
- auto: true,
439
- parameters,
440
- });
441
- }
442
- if (!isActive) {
443
- const currentPageBreak = currentUserPage - mainRoomsLength;
444
- await dispStreams({
445
- lStreams: paginatedStreams[currentUserPage],
446
- ind: currentUserPage,
447
- parameters,
448
- breakRoom: currentPageBreak,
449
- inBreakRoom: currentPageBreak >= 0,
450
- });
451
- }
452
- }
453
- else {
454
- currentUserPage = 0;
455
- updateCurrentUserPage(currentUserPage);
456
- if (screenChanged) {
457
- await dispStreams({
458
- lStreams: paginatedStreams[0],
459
- ind: 0,
460
- parameters,
461
- });
462
- }
463
- else {
464
- await dispStreams({
465
- lStreams: paginatedStreams[0],
466
- ind: 0,
467
- auto: true,
468
- parameters,
469
- });
470
- }
471
- }
472
- }
473
- catch (error) {
474
- console.log('changeVids error', error);
475
- }
476
- };
477
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ChangeVids, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
478
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ChangeVids, providedIn: 'root' });
479
- }
480
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ChangeVids, decorators: [{
481
- type: Injectable,
482
- args: [{
483
- providedIn: 'root',
484
- }]
485
- }] });
486
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXZpZHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhc2Z1LWFuZ3VsYXIvc3JjL2xpYi9jb25zdW1lcnMvY2hhbmdlLXZpZHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQXFGM0MsTUFBTSxPQUFPLFVBQVU7SUFDckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUVHO0lBQ0gsVUFBVSxHQUFHLEtBQUssRUFBRSxFQUFFLGFBQWEsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFxQixFQUFpQixFQUFFO1FBQzdGLElBQUksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLFVBQVUsQ0FBQztRQUN6QyxVQUFVLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztRQUVuQyxJQUFJLEVBQ0YsZUFBZSxFQUNmLGFBQWEsRUFDYixXQUFXLEVBQ1gsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBRWYsYUFBYSxFQUNiLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixlQUFlLEVBQ2YsVUFBVSxFQUVW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TyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUMsQ0FBQzt1R0EzbEJTLFVBQVU7MkdBQVYsVUFBVSxjQUZULE1BQU07OzJGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgU3RyZWFtLFxuICBQYXJ0aWNpcGFudCxcbiAgRGlzcFN0cmVhbXNUeXBlLFxuICBEaXNwU3RyZWFtc1BhcmFtZXRlcnMsXG4gIEF1ZGlvRGVjaWJlbHMsXG4gIE1peFN0cmVhbXNUeXBlLFxuICBCcmVha291dFBhcnRpY2lwYW50LFxuICBFdmVudFR5cGUsXG59IGZyb20gJy4uL0B0eXBlcy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlVmlkc1BhcmFtZXRlcnMgZXh0ZW5kcyBEaXNwU3RyZWFtc1BhcmFtZXRlcnMge1xuICBhbGxWaWRlb1N0cmVhbXM6IChTdHJlYW0gfCBQYXJ0aWNpcGFudClbXTtcbiAgcF9hY3RpdmVOYW1lczogc3RyaW5nW107XG4gIGFjdGl2ZU5hbWVzOiBzdHJpbmdbXTtcbiAgZGlzcEFjdGl2ZU5hbWVzOiBzdHJpbmdbXTtcbiAgc2hhcmVTY3JlZW5TdGFydGVkOiBib29sZWFuO1xuICBzaGFyZWQ6IGJvb2xlYW47XG4gIG5ld0xpbWl0ZWRTdHJlYW1zOiAoU3RyZWFtIHwgUGFydGljaXBhbnQpW107XG4gIG5vbl9hbFZpZGVvU3RyZWFtczogUGFydGljaXBhbnRbXTtcbiAgcmVmX3BhcnRpY2lwYW50czogUGFydGljaXBhbnRbXTtcbiAgcGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudFtdO1xuICBldmVudFR5cGU6IEV2ZW50VHlwZTtcbiAgaXNsZXZlbDogc3RyaW5nO1xuICBtZW1iZXI6IHN0cmluZztcbiAgc29ydEF1ZGlvTG91ZG5lc3M6IGJvb2xlYW47XG4gIGF1ZGlvRGVjaWJlbHM6IEF1ZGlvRGVjaWJlbHNbXTtcbiAgbWl4ZWRfYWxWaWRlb1N0cmVhbXM6IChTdHJlYW0gfCBQYXJ0aWNpcGFudClbXTtcbiAgbm9uX2FsVmlkZW9TdHJlYW1zX211dGVkOiBQYXJ0aWNpcGFudFtdO1xuICByZW1vdGVQcm9kdWNlcklkPzogc3RyaW5nO1xuICBsb2NhbFN0cmVhbVZpZGVvOiBNZWRpYVN0cmVhbSB8IG51bGw7XG4gIG9sZEFsbFN0cmVhbXM6IChTdHJlYW0gfCBQYXJ0aWNpcGFudClbXTtcbiAgc2NyZWVuUGFnZUxpbWl0OiBudW1iZXI7XG4gIG1lZXRpbmdEaXNwbGF5VHlwZTogc3RyaW5nO1xuICBtZWV0aW5nVmlkZW9PcHRpbWl6ZWQ6IGJvb2xlYW47XG4gIHJlY29yZGluZ1ZpZGVvT3B0aW1pemVkOiBib29sZWFuO1xuICByZWNvcmRpbmdEaXNwbGF5VHlwZTogJ3ZpZGVvJyB8ICdtZWRpYScgfCAnYWxsJztcbiAgcGFnaW5hdGVkU3RyZWFtczogKFN0cmVhbSB8IFBhcnRpY2lwYW50KVtdW107XG4gIGl0ZW1QYWdlTGltaXQ6IG51bWJlcjtcbiAgZG9QYWdpbmF0ZTogYm9vbGVhbjtcbiAgcHJldkRvUGFnaW5hdGU6IGJvb2xlYW47XG4gIGN1cnJlbnRVc2VyUGFnZTogbnVtYmVyO1xuICBicmVha291dFJvb21zOiBCcmVha291dFBhcnRpY2lwYW50W11bXTtcbiAgaG9zdE5ld1Jvb206IG51bWJlcjtcbiAgYnJlYWtPdXRSb29tU3RhcnRlZDogYm9vbGVhbjtcbiAgYnJlYWtPdXRSb29tRW5kZWQ6IGJvb2xlYW47XG4gIHZpcnR1YWxTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbDtcbiAgbWFpblJvb21zTGVuZ3RoOiBudW1iZXI7XG4gIG1lbWJlclJvb206IG51bWJlcjtcbiAgdXBkYXRlUF9hY3RpdmVOYW1lczogKG5hbWVzOiBzdHJpbmdbXSkgPT4gdm9pZDtcbiAgdXBkYXRlQWN0aXZlTmFtZXM6IChuYW1lczogc3RyaW5nW10pID0+IHZvaWQ7XG4gIHVwZGF0ZURpc3BBY3RpdmVOYW1lczogKG5hbWVzOiBzdHJpbmdbXSkgPT4gdm9pZDtcbiAgdXBkYXRlTmV3TGltaXRlZFN0cmVhbXM6IChzdHJlYW1zOiAoU3RyZWFtIHwgUGFydGljaXBhbnQpW10pID0+IHZvaWQ7XG4gIHVwZGF0ZU5vbl9hbFZpZGVvU3RyZWFtczogKHBhcnRpY2lwYW50czogUGFydGljaXBhbnRbXSkgPT4gdm9pZDtcbiAgdXBkYXRlUmVmX3BhcnRpY2lwYW50czogKHBhcnRpY2lwYW50czogUGFydGljaXBhbnRbXSkgPT4gdm9pZDtcbiAgdXBkYXRlU29ydEF1ZGlvTG91ZG5lc3M6IChzb3J0OiBib29sZWFuKSA9PiB2b2lkO1xuICB1cGRhdGVNaXhlZF9hbFZpZGVvU3RyZWFtczogKHN0cmVhbXM6IChTdHJlYW0gfCBQYXJ0aWNpcGFudClbXSkgPT4gdm9pZDtcbiAgdXBkYXRlTm9uX2FsVmlkZW9TdHJlYW1zX211dGVkOiAocGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudFtdKSA9PiB2b2lkO1xuICB1cGRhdGVQYWdpbmF0ZWRTdHJlYW1zOiAoc3RyZWFtczogKFN0cmVhbSB8IFBhcnRpY2lwYW50KVtdW10pID0+IHZvaWQ7XG4gIHVwZGF0ZURvUGFnaW5hdGU6IChwYWdpbmF0ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlUHJldkRvUGFnaW5hdGU6IChwYWdpbmF0ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlQ3VycmVudFVzZXJQYWdlOiAocGFnZTogbnVtYmVyKSA9PiB2b2lkO1xuICB1cGRhdGVOdW1iZXJQYWdlczogKHBhZ2VzOiBudW1iZXIpID0+IHZvaWQ7XG4gIHVwZGF0ZU1haW5Sb29tc0xlbmd0aDogKGxlbmd0aDogbnVtYmVyKSA9PiB2b2lkO1xuICB1cGRhdGVNZW1iZXJSb29tOiAocm9vbTogbnVtYmVyKSA9PiB2b2lkO1xuXG4gIC8vIG1lZGlhc2Z1IGZ1bmN0aW9uc1xuICBtaXhTdHJlYW1zOiBNaXhTdHJlYW1zVHlwZTtcbiAgZGlzcFN0cmVhbXM6IERpc3BTdHJlYW1zVHlwZTtcbiAgZ2V0VXBkYXRlZEFsbFBhcmFtczogKCkgPT4gQ2hhbmdlVmlkc1BhcmFtZXRlcnM7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VWaWRzT3B0aW9ucyB7XG4gIHNjcmVlbkNoYW5nZWQ/OiBib29sZWFuO1xuICBwYXJhbWV0ZXJzOiBDaGFuZ2VWaWRzUGFyYW1ldGVycztcbn1cblxuLy8gRXhwb3J0IHRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBmdW5jdGlvblxuZXhwb3J0IHR5cGUgQ2hhbmdlVmlkc1R5cGUgPSAob3B0aW9uczogQ2hhbmdlVmlkc09wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFuZ2VWaWRzIHtcbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IGNoYW5nZXMgdGhlIHZpZGVvIHN0cmVhbXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGNoYW5naW5nIHZpZGVvIHN0cmVhbXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2NyZWVuQ2hhbmdlZD1mYWxzZV0gLSBJbmRpY2F0ZXMgaWYgdGhlIHNjcmVlbiBoYXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIHtDaGFuZ2VWaWRzT3B0aW9uc30gb3B0aW9ucy5wYXJhbWV0ZXJzIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNoYW5naW5nIHZpZGVvIHN0cmVhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2aWRlbyBzdHJlYW1zIGhhdmUgYmVlbiBjaGFuZ2VkLlxuICAgKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGFuZ2VWaWRzT3B0aW9uc1xuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRVcGRhdGVkQWxsUGFyYW1zIC0gRnVuY3Rpb24gdG8gZ2V0IHVwZGF0ZWQgcGFyYW1ldGVycy5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gYWxsVmlkZW9TdHJlYW1zIC0gQXJyYXkgb2YgYWxsIHZpZGVvIHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHBfYWN0aXZlTmFtZXMgLSBBcnJheSBvZiBhY3RpdmUgcGFydGljaXBhbnQgbmFtZXMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGFjdGl2ZU5hbWVzIC0gQXJyYXkgb2YgYWN0aXZlIG5hbWVzLlxuICAgKiBAcHJvcGVydHkge0FycmF5fSBkaXNwQWN0aXZlTmFtZXMgLSBBcnJheSBvZiBkaXNwbGF5ZWQgYWN0aXZlIG5hbWVzLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNoYXJlU2NyZWVuU3RhcnRlZCAtIEluZGljYXRlcyBpZiBzY3JlZW4gc2hhcmluZyBoYXMgc3RhcnRlZC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaGFyZWQgLSBJbmRpY2F0ZXMgaWYgdGhlIHNjcmVlbiBpcyBzaGFyZWQuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IG5ld0xpbWl0ZWRTdHJlYW1zIC0gQXJyYXkgb2YgbmV3IGxpbWl0ZWQgc3RyZWFtcy5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gbm9uX2FsVmlkZW9TdHJlYW1zIC0gQXJyYXkgb2Ygbm9uLWFsIHZpZGVvIHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHJlZl9wYXJ0aWNpcGFudHMgLSBBcnJheSBvZiByZWZlcmVuY2UgcGFydGljaXBhbnRzLlxuICAgKiBAcHJvcGVydHkge0FycmF5fSBwYXJ0aWNpcGFudHMgLSBBcnJheSBvZiBwYXJ0aWNpcGFudHMuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudFR5cGUgLSBUeXBlIG9mIHRoZSBldmVudC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlzbGV2ZWwgLSBMZXZlbCBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZW1iZXIgLSBOYW1lIG9mIHRoZSBtZW1iZXIuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc29ydEF1ZGlvTG91ZG5lc3MgLSBJbmRpY2F0ZXMgaWYgYXVkaW8gbG91ZG5lc3Mgc2hvdWxkIGJlIHNvcnRlZC5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gYXVkaW9EZWNpYmVscyAtIEFycmF5IG9mIGF1ZGlvIGRlY2liZWxzLlxuICAgKiBAcHJvcGVydHkge0FycmF5fSBtaXhlZF9hbFZpZGVvU3RyZWFtcyAtIEFycmF5IG9mIG1peGVkIGFsIHZpZGVvIHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IG5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZCAtIEFycmF5IG9mIG11dGVkIG5vbi1hbCB2aWRlbyBzdHJlYW1zLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUHJvZHVjZXJJZCAtIElEIG9mIHRoZSByZW1vdGUgcHJvZHVjZXIuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2NhbFN0cmVhbVZpZGVvIC0gTG9jYWwgc3RyZWFtIHZpZGVvIG9iamVjdC5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gb2xkQWxsU3RyZWFtcyAtIEFycmF5IG9mIG9sZCBhbGwgc3RyZWFtcy5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcmVlblBhZ2VMaW1pdCAtIExpbWl0IG9mIHN0cmVhbXMgcGVyIHNjcmVlbiBwYWdlLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbWVldGluZ0Rpc3BsYXlUeXBlIC0gVHlwZSBvZiBtZWV0aW5nIGRpc3BsYXkuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbWVldGluZ1ZpZGVvT3B0aW1pemVkIC0gSW5kaWNhdGVzIGlmIG1lZXRpbmcgdmlkZW8gaXMgb3B0aW1pemVkLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlY29yZGluZ1ZpZGVvT3B0aW1pemVkIC0gSW5kaWNhdGVzIGlmIHJlY29yZGluZyB2aWRlbyBpcyBvcHRpbWl6ZWQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWNvcmRpbmdEaXNwbGF5VHlwZSAtIFR5cGUgb2YgcmVjb3JkaW5nIGRpc3BsYXkuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHBhZ2luYXRlZFN0cmVhbXMgLSBBcnJheSBvZiBwYWdpbmF0ZWQgc3RyZWFtcy5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl0ZW1QYWdlTGltaXQgLSBMaW1pdCBvZiBpdGVtcyBwZXIgcGFnZS5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBkb1BhZ2luYXRlIC0gSW5kaWNhdGVzIGlmIHBhZ2luYXRpb24gc2hvdWxkIGJlIGRvbmUuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJldkRvUGFnaW5hdGUgLSBJbmRpY2F0ZXMgaWYgcGFnaW5hdGlvbiB3YXMgcHJldmlvdXNseSBkb25lLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gY3VycmVudFVzZXJQYWdlIC0gQ3VycmVudCB1c2VyIHBhZ2UgbnVtYmVyLlxuICAgKiBAcHJvcGVydHkge0FycmF5fSBicmVha291dFJvb21zIC0gQXJyYXkgb2YgYnJlYWtvdXQgcm9vbXMuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBob3N0TmV3Um9vbSAtIEluZGV4IG9mIHRoZSBuZXcgcm9vbSBmb3IgdGhlIGhvc3QuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYnJlYWtPdXRSb29tU3RhcnRlZCAtIEluZGljYXRlcyBpZiBicmVha291dCByb29tIGhhcyBzdGFydGVkLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGJyZWFrT3V0Um9vbUVuZGVkIC0gSW5kaWNhdGVzIGlmIGJyZWFrb3V0IHJvb20gaGFzIGVuZGVkLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gdmlydHVhbFN0cmVhbSAtIFZpcnR1YWwgc3RyZWFtIG9iamVjdC5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IG1haW5Sb29tc0xlbmd0aCAtIExlbmd0aCBvZiBtYWluIHJvb21zLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbWVtYmVyUm9vbSAtIFJvb20gb2YgdGhlIG1lbWJlci5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXBkYXRlUF9hY3RpdmVOYW1lcyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBhY3RpdmUgcGFydGljaXBhbnQgbmFtZXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZUFjdGl2ZU5hbWVzIC0gRnVuY3Rpb24gdG8gdXBkYXRlIGFjdGl2ZSBuYW1lcy5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXBkYXRlRGlzcEFjdGl2ZU5hbWVzIC0gRnVuY3Rpb24gdG8gdXBkYXRlIGRpc3BsYXllZCBhY3RpdmUgbmFtZXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZU5ld0xpbWl0ZWRTdHJlYW1zIC0gRnVuY3Rpb24gdG8gdXBkYXRlIG5ldyBsaW1pdGVkIHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZU5vbl9hbFZpZGVvU3RyZWFtcyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBub24tYWwgdmlkZW8gc3RyZWFtcy5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXBkYXRlUmVmX3BhcnRpY2lwYW50cyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSByZWZlcmVuY2UgcGFydGljaXBhbnRzLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cGRhdGVTb3J0QXVkaW9Mb3VkbmVzcyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBhdWRpbyBsb3VkbmVzcyBzb3J0aW5nLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cGRhdGVNaXhlZF9hbFZpZGVvU3RyZWFtcyAtIEZ1bmN0aW9uIHRvIHVwZGF0ZSBtaXhlZCBhbCB2aWRlbyBzdHJlYW1zLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cGRhdGVOb25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQgLSBGdW5jdGlvbiB0byB1cGRhdGUgbXV0ZWQgbm9uLWFsIHZpZGVvIHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZVBhZ2luYXRlZFN0cmVhbXMgLSBGdW5jdGlvbiB0byB1cGRhdGUgcGFnaW5hdGVkIHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZURvUGFnaW5hdGUgLSBGdW5jdGlvbiB0byB1cGRhdGUgcGFnaW5hdGlvbiBzdGF0dXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZVByZXZEb1BhZ2luYXRlIC0gRnVuY3Rpb24gdG8gdXBkYXRlIHByZXZpb3VzIHBhZ2luYXRpb24gc3RhdHVzLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cGRhdGVDdXJyZW50VXNlclBhZ2UgLSBGdW5jdGlvbiB0byB1cGRhdGUgY3VycmVudCB1c2VyIHBhZ2UuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVwZGF0ZU51bWJlclBhZ2VzIC0gRnVuY3Rpb24gdG8gdXBkYXRlIG51bWJlciBvZiBwYWdlcy5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gdXBkYXRlTWFpblJvb21zTGVuZ3RoIC0gRnVuY3Rpb24gdG8gdXBkYXRlIG1haW4gcm9vbXMgbGVuZ3RoLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB1cGRhdGVNZW1iZXJSb29tIC0gRnVuY3Rpb24gdG8gdXBkYXRlIG1lbWJlciByb29tLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBtaXhTdHJlYW1zIC0gRnVuY3Rpb24gdG8gbWl4IHN0cmVhbXMuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGRpc3BTdHJlYW1zIC0gRnVuY3Rpb24gdG8gZGlzcGxheSBzdHJlYW1zLlxuICAgKi9cbiAgY2hhbmdlVmlkcyA9IGFzeW5jICh7IHNjcmVlbkNoYW5nZWQgPSBmYWxzZSwgcGFyYW1ldGVycyB9OiBDaGFuZ2VWaWRzT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGxldCB7IGdldFVwZGF0ZWRBbGxQYXJhbXMgfSA9IHBhcmFtZXRlcnM7XG4gICAgcGFyYW1ldGVycyA9IGdldFVwZGF0ZWRBbGxQYXJhbXMoKTtcblxuICAgIGxldCB7XG4gICAgICBhbGxWaWRlb1N0cmVhbXMsXG4gICAgICBwX2FjdGl2ZU5hbWVzLFxuICAgICAgYWN0aXZlTmFtZXMsXG4gICAgICBkaXNwQWN0aXZlTmFtZXMsXG4gICAgICBzaGFyZVNjcmVlblN0YXJ0ZWQsXG4gICAgICBzaGFyZWQsXG4gICAgICBuZXdMaW1pdGVkU3RyZWFtcyxcbiAgICAgIG5vbl9hbFZpZGVvU3RyZWFtcyxcbiAgICAgIHJlZl9wYXJ0aWNpcGFudHMsXG4gICAgICBwYXJ0aWNpcGFudHMsXG4gICAgICBldmVudFR5cGUsXG4gICAgICBpc2xldmVsLFxuICAgICAgbWVtYmVyLFxuICAgICAgc29ydEF1ZGlvTG91ZG5lc3MsXG4gICAgICBhdWRpb0RlY2liZWxzLFxuICAgICAgbWl4ZWRfYWxWaWRlb1N0cmVhbXMsXG4gICAgICBub25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQsXG4gICAgICByZW1vdGVQcm9kdWNlcklkLFxuICAgICAgbG9jYWxTdHJlYW1WaWRlbyxcbiAgICAgIG9sZEFsbFN0cmVhbXMsXG4gICAgICBzY3JlZW5QYWdlTGltaXQsXG4gICAgICBtZWV0aW5nRGlzcGxheVR5cGUsXG4gICAgICBtZWV0aW5nVmlkZW9PcHRpbWl6ZWQsXG4gICAgICByZWNvcmRpbmdWaWRlb09wdGltaXplZCxcbiAgICAgIHJlY29yZGluZ0Rpc3BsYXlUeXBlLFxuICAgICAgcGFnaW5hdGVkU3RyZWFtcyxcbiAgICAgIGl0ZW1QYWdlTGltaXQsXG4gICAgICBkb1BhZ2luYXRlLFxuICAgICAgcHJldkRvUGFnaW5hdGUsXG4gICAgICBjdXJyZW50VXNlclBhZ2UsXG5cbiAgICAgIGJyZWFrb3V0Um9vbXMsXG4gICAgICBob3N0TmV3Um9vbSxcbiAgICAgIGJyZWFrT3V0Um9vbVN0YXJ0ZWQsXG4gICAgICBicmVha091dFJvb21FbmRlZCxcbiAgICAgIHZpcnR1YWxTdHJlYW0sXG4gICAgICBtYWluUm9vbXNMZW5ndGgsXG4gICAgICBtZW1iZXJSb29tLFxuXG4gICAgICB1cGRhdGVQX2FjdGl2ZU5hbWVzLFxuICAgICAgdXBkYXRlQWN0aXZlTmFtZXMsXG4gICAgICB1cGRhdGVEaXNwQWN0aXZlTmFtZXMsXG4gICAgICB1cGRhdGVOZXdMaW1pdGVkU3RyZWFtcyxcbiAgICAgIHVwZGF0ZU5vbl9hbFZpZGVvU3RyZWFtcyxcbiAgICAgIHVwZGF0ZVJlZl9wYXJ0aWNpcGFudHMsXG4gICAgICB1cGRhdGVTb3J0QXVkaW9Mb3VkbmVzcyxcbiAgICAgIHVwZGF0ZU1peGVkX2FsVmlkZW9TdHJlYW1zLFxuICAgICAgdXBkYXRlTm9uX2FsVmlkZW9TdHJlYW1zX211dGVkLFxuICAgICAgdXBkYXRlUGFnaW5hdGVkU3RyZWFtcyxcbiAgICAgIHVwZGF0ZURvUGFnaW5hdGUsXG4gICAgICB1cGRhdGVQcmV2RG9QYWdpbmF0ZSxcbiAgICAgIHVwZGF0ZUN1cnJlbnRVc2VyUGFnZSxcbiAgICAgIHVwZGF0ZU51bWJlclBhZ2VzLFxuXG4gICAgICB1cGRhdGVNYWluUm9vbXNMZW5ndGgsXG4gICAgICB1cGRhdGVNZW1iZXJSb29tLFxuXG4gICAgICAvLyBtZWRpYXNmdSBmdW5jdGlvbnNcbiAgICAgIG1peFN0cmVhbXMsXG4gICAgICBkaXNwU3RyZWFtcyxcbiAgICB9ID0gcGFyYW1ldGVycztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgYWxWaWRlb1N0cmVhbXMgPSBbLi4uYWxsVmlkZW9TdHJlYW1zXTtcbiAgICAgIHBfYWN0aXZlTmFtZXMgPSBbLi4uYWN0aXZlTmFtZXNdO1xuXG4gICAgICBsZXQgc3RyZWFtZTtcblxuICAgICAgaWYgKHNoYXJlU2NyZWVuU3RhcnRlZCB8fCBzaGFyZWQpIHtcbiAgICAgICAgYWxWaWRlb1N0cmVhbXMgPSBbLi4ubmV3TGltaXRlZFN0cmVhbXNdO1xuICAgICAgICBhY3RpdmVOYW1lcyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmVOYW1lcyA9IFtdO1xuICAgICAgZGlzcEFjdGl2ZU5hbWVzID0gW107XG4gICAgICByZWZfcGFydGljaXBhbnRzID0gcGFydGljaXBhbnRzO1xuXG4gICAgICBsZXQgdGVtcCA9IGFsVmlkZW9TdHJlYW1zO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGVtcC5tYXAoYXN5bmMgKHN0cmVhbSkgPT4ge1xuICAgICAgICAgIGxldCBwYXJ0aWNpcGFudCA9IHJlZl9wYXJ0aWNpcGFudHMuZmluZCgob2JqKSA9PiBvYmoudmlkZW9JRCA9PT0gc3RyZWFtLnByb2R1Y2VySWQpO1xuICAgICAgICAgIGlmICghcGFydGljaXBhbnQgJiYgc3RyZWFtLnByb2R1Y2VySWQgIT09ICd5b3V5b3UnICYmIHN0cmVhbS5wcm9kdWNlcklkICE9PSAneW91eW91eW91Jykge1xuICAgICAgICAgICAgYWxWaWRlb1N0cmVhbXMgPSBhbFZpZGVvU3RyZWFtcy5maWx0ZXIoKG9iaikgPT4gb2JqLnByb2R1Y2VySWQgIT09IHN0cmVhbS5wcm9kdWNlcklkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ2Jyb2FkY2FzdCcgfHwgZXZlbnRUeXBlID09PSAnY2hhdCcpIHtcbiAgICAgICAgc29ydEF1ZGlvTG91ZG5lc3MgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNoYXJlU2NyZWVuU3RhcnRlZCB8fCBzaGFyZWQpIHtcbiAgICAgICAgbm9uX2FsVmlkZW9TdHJlYW1zID0gW107XG4gICAgICAgIG5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZCA9IFtdO1xuICAgICAgICBtaXhlZF9hbFZpZGVvU3RyZWFtcyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFsVmlkZW9TdHJlYW1zLmxlbmd0aCA+IHNjcmVlblBhZ2VMaW1pdCkge1xuICAgICAgICAgIGFsVmlkZW9TdHJlYW1zID0gYWxWaWRlb1N0cmVhbXMuZmlsdGVyKFxuICAgICAgICAgICAgKG9iaikgPT4gb2JqLnByb2R1Y2VySWQgIT09ICd5b3V5b3UnICYmIG9iai5wcm9kdWNlcklkICE9PSAneW91eW91eW91JyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmVmX3BhcnRpY2lwYW50cyA9IHJlZl9wYXJ0aWNpcGFudHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgIChhLm11dGVkID8/IGZhbHNlKSA+IChiLm11dGVkID8/IGZhbHNlKSA/IDEgOiAtMSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbGV0IHRlbXA6IChTdHJlYW0gfCBQYXJ0aWNpcGFudClbXSA9IFtdO1xuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgcmVmX3BhcnRpY2lwYW50cy5tYXAoKHBhcnRpY2lwYW50KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBzdHJlYW0gPSBhbFZpZGVvU3RyZWFtcy5maW5kKChvYmopID0+IG9iai5wcm9kdWNlcklkID09PSBwYXJ0aWNpcGFudC52aWRlb0lEKTtcbiAgICAgICAgICAgICAgaWYgKHN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRlbXAucHVzaChzdHJlYW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYWxWaWRlb1N0cmVhbXMgPSB0ZW1wO1xuXG4gICAgICAgICAgbGV0IHlvdXlvdSA9IGFsbFZpZGVvU3RyZWFtcy5maW5kKChvYmopID0+IG9iai5wcm9kdWNlcklkID09PSAneW91eW91Jyk7XG4gICAgICAgICAgaWYgKCF5b3V5b3UpIHtcbiAgICAgICAgICAgIGxldCB5b3V5b3V5b3UgPSBhbGxWaWRlb1N0cmVhbXMuZmluZCgob2JqKSA9PiBvYmoucHJvZHVjZXJJZCA9PT0gJ3lvdXlvdXlvdScpO1xuICAgICAgICAgICAgaWYgKHlvdXlvdXlvdSkge1xuICAgICAgICAgICAgICBhbFZpZGVvU3RyZWFtcy51bnNoaWZ0KHlvdXlvdXlvdSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh5b3V5b3UpIHtcbiAgICAgICAgICAgICAgYWxWaWRlb1N0cmVhbXMudW5zaGlmdCh5b3V5b3UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkbWluID0gcGFydGljaXBhbnRzLmZpbHRlcigocGFydGljaXBhbnQpID0+IHBhcnRpY2lwYW50LmlzbGV2ZWwgPT09ICcyJyk7XG4gICAgICAgIGxldCBhZG1pbk5hbWUgPSAnJztcbiAgICAgICAgaWYgKGFkbWluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhZG1pbk5hbWUgPSBhZG1pblswXS5uYW1lIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9uX2FsVmlkZW9TdHJlYW1zID0gW107XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcmVmX3BhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHBhcnRpY2lwYW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyZWFtID0gYWxWaWRlb1N0cmVhbXMuZmluZCgob2JqKSA9PiBvYmoucHJvZHVjZXJJZCA9PT0gcGFydGljaXBhbnQudmlkZW9JRCk7XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9PSAnY2hhdCcgJiYgZXZlbnRUeXBlICE9PSAnY29uZmVyZW5jZScpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFzdHJlYW0gJiZcbiAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5uYW1lICE9PSBtZW1iZXIgJiZcbiAgICAgICAgICAgICAgICAhcGFydGljaXBhbnRbJ211dGVkJ10gJiZcbiAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5uYW1lICE9PSBhZG1pbk5hbWVcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbm9uX2FsVmlkZW9TdHJlYW1zLnB1c2gocGFydGljaXBhbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIXN0cmVhbSAmJiBwYXJ0aWNpcGFudC5uYW1lICE9PSBtZW1iZXIgJiYgIXBhcnRpY2lwYW50WydtdXRlZCddKSB7XG4gICAgICAgICAgICAgICAgbm9uX2FsVmlkZW9TdHJlYW1zLnB1c2gocGFydGljaXBhbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHNvcnRBdWRpb0xvdWRuZXNzKSB7XG4gICAgICAgICAgbm9uX2FsVmlkZW9TdHJlYW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z0xvdWRuZXNzQSA9XG4gICAgICAgICAgICAgIGF1ZGlvRGVjaWJlbHMuZmluZCgob2JqKSA9PiBvYmoubmFtZSA9PT0gYS5uYW1lKT8uYXZlcmFnZUxvdWRuZXNzIHx8IDEyNztcbiAgICAgICAgICAgIGNvbnN0IGF2Z0xvdWRuZXNzQiA9XG4gICAgICAgICAgICAgIGF1ZGlvRGVjaWJlbHMuZmluZCgob2JqKSA9PiBvYmoubmFtZSA9PT0gYi5uYW1lKT8uYXZlcmFnZUxvdWRuZXNzIHx8IDEyNztcbiAgICAgICAgICAgIHJldHVybiBhdmdMb3VkbmVzc0IgLSBhdmdMb3VkbmVzc0E7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKG1lZXRpbmdEaXNwbGF5VHlwZSA9PT0gJ3ZpZGVvJyAmJiBtZWV0aW5nVmlkZW9PcHRpbWl6ZWQpIHx8XG4gICAgICAgICAgICAhKHJlY29yZGluZ1ZpZGVvT3B0aW1pemVkICYmIHJlY29yZGluZ0Rpc3BsYXlUeXBlID09PSAndmlkZW8nKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWl4ZWRfYWxWaWRlb1N0cmVhbXMgPSBhd2FpdCBtaXhTdHJlYW1zKHtcbiAgICAgICAgICAgICAgYWxWaWRlb1N0cmVhbXMsXG4gICAgICAgICAgICAgIG5vbl9hbFZpZGVvU3RyZWFtcyxcbiAgICAgICAgICAgICAgcmVmX3BhcnRpY2lwYW50cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZCA9IFtdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZWZfcGFydGljaXBhbnRzLm1hcChhc3luYyAocGFydGljaXBhbnQpID0+IHtcbiAgICAgICAgICAgIGxldCBzdHJlYW0gPSBhbFZpZGVvU3RyZWFtcy5maW5kKChvYmopID0+IG9iai5wcm9kdWNlcklkID09PSBwYXJ0aWNpcGFudC52aWRlb0lEKTtcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT09ICdjaGF0JyAmJiBldmVudFR5cGUgIT09ICdjb25mZXJlbmNlJykge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXN0cmVhbSAmJlxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50Lm5hbWUgIT09IG1lbWJlciAmJlxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50WydtdXRlZCddICYmXG4gICAgICAgICAgICAgICAgcGFydGljaXBhbnQubmFtZSAhPT0gYWRtaW5OYW1lXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZC5wdXNoKHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFzdHJlYW0gJiYgcGFydGljaXBhbnQubmFtZSAhPT0gbWVtYmVyICYmIHBhcnRpY2lwYW50WydtdXRlZCddKSB7XG4gICAgICAgICAgICAgICAgbm9uX2FsVmlkZW9TdHJlYW1zX211dGVkLnB1c2gocGFydGljaXBhbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFR5cGUgPT09ICdjb25mZXJlbmNlJyAmJiBpc2xldmVsICE9PSAnMicpIHtcbiAgICAgICAgbGV0IGhvc3QgPSBwYXJ0aWNpcGFudHMuZmluZCgob2JqKSA9PiBvYmouaXNsZXZlbCA9PT0gJzInKTtcbiAgICAgICAgaWYgKGhvc3QpIHtcbiAgICAgICAgICBpZiAoaG9zdC52aWRlb0lEKSB7XG4gICAgICAgICAgICByZW1vdGVQcm9kdWNlcklkID0gaG9zdC52aWRlb0lEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNsZXZlbCA9PT0gJzInKSB7XG4gICAgICAgICAgICBob3N0WydzdHJlYW0nXSA9IHZpcnR1YWxTdHJlYW0gfHwgbG9jYWxTdHJlYW1WaWRlbztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGhvc3RWaWRlbyA9IGFsVmlkZW9TdHJlYW1zLmZpbmQoKG9iaikgPT4gb2JqLnByb2R1Y2VySWQgPT09IHJlbW90ZVByb2R1Y2VySWQpO1xuICAgICAgICAgICAgaWYgKCFob3N0VmlkZW8pIHtcbiAgICAgICAgICAgICAgc3RyZWFtZSA9IG9sZEFsbFN0cmVhbXMuZmluZCgoc3RyZWFtZSkgPT4gc3RyZWFtZS5wcm9kdWNlcklkID09PSByZW1vdGVQcm9kdWNlcklkKTtcbiAgICAgICAgICAgICAgaWYgKHN0cmVhbWUpIHtcbiAgICAgICAgICAgICAgICBhbFZpZGVvU3RyZWFtcyA9IGFsVmlkZW9TdHJlYW1zLmZpbHRlcigob2JqKSA9PiBvYmoucHJvZHVjZXJJZCAhPT0gaG9zdC52aWRlb0lEKTtcbiAgICAgICAgICAgICAgICBub25fYWxWaWRlb1N0cmVhbXMgPSBub25fYWxWaWRlb1N0cmVhbXMuZmlsdGVyKChvYmopID0+IG9iai5uYW1lICE9PSBob3N0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIG5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZCA9IG5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAob2JqKSA9PiBvYmoubmFtZSAhPT0gaG9zdC5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRBdWRpb0xvdWRuZXNzKSB7XG4gICAgICAgICAgICAgICAgICBtaXhlZF9hbFZpZGVvU3RyZWFtcyA9IG1peGVkX2FsVmlkZW9TdHJlYW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKG9iaikgPT4gb2JqLm5hbWUgIT09IGhvc3QubmFtZSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBub25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQgPSBub25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAob2JqKSA9PiBvYmoubmFtZSAhPT0gaG9zdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtZWV0aW5nRGlzcGxheVR5cGUgPT0gJ3ZpZGVvJyAmJiBtZWV0aW5nVmlkZW9PcHRpbWl6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxWaWRlb1N0cmVhbXMudW5zaGlmdChzdHJlYW1lKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX2FsVmlkZW9TdHJlYW1zLnVuc2hpZnQoc3RyZWFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGFsVmlkZW9TdHJlYW1zLnVuc2hpZnQoc3RyZWFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgcmVmX3BhcnRpY2lwYW50cy5tYXAoYXN5bmMgKHBhcnRpY2lwYW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW0gPSBhbFZpZGVvU3RyZWFtcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgIChvYmopID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmoucHJvZHVjZXJJZCA9PSBwYXJ0aWNpcGFudC52aWRlb0lEICYmIHBhcnRpY2lwYW50Lm5hbWUgPT0gaG9zdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNvcnRBdWRpb0xvdWRuZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaXhlZF9hbFZpZGVvU3RyZWFtcyA9IG1peGVkX2FsVmlkZW9TdHJlYW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iaikgPT4gb2JqLm5hbWUgIT09IGhvc3QubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQgPSBub25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqKSA9PiBvYmoubmFtZSAhPT0gaG9zdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1peGVkX2FsVmlkZW9TdHJlYW1zLnVuc2hpZnQocGFydGljaXBhbnQpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub25fYWxWaWRlb1N0cmVhbXMgPSBub25fYWxWaWRlb1N0cmVhbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqKSA9PiBvYmoubmFtZSAhPT0gaG9zdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9hbFZpZGVvU3RyZWFtcy51bnNoaWZ0KHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFsbFN0cmVhbXNQYWdlZDogKFN0cmVhbSB8IFBhcnRpY2lwYW50KVtdID0gW107XG4gICAgICBpZiAoc29ydEF1ZGlvTG91ZG5lc3MpIHtcbiAgICAgICAgaWYgKG1lZXRpbmdEaXNwbGF5VHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgIGlmIChtZWV0aW5nVmlkZW9PcHRpbWl6ZWQpIHtcbiAgICAgICAgICAgIGFsbFN0cmVhbXNQYWdlZCA9IFsuLi5hbFZpZGVvU3RyZWFtc107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsbFN0cmVhbXNQYWdlZCA9IFsuLi5taXhlZF9hbFZpZGVvU3RyZWFtc107XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1lZXRpbmdEaXNwbGF5VHlwZSA9PT0gJ21lZGlhJykge1xuICAgICAgICAgIGFsbFN0cmVhbXNQYWdlZCA9IFsuLi5taXhlZF9hbFZpZGVvU3RyZWFtc107XG4gICAgICAgIH0gZWxzZSBpZiAobWVldGluZ0Rpc3BsYXlUeXBlID09PSAnYWxsJykge1xuICAgICAgICAgIGFsbFN0cmVhbXNQYWdlZCA9IFsuLi5taXhlZF9hbFZpZGVvU3RyZWFtcywgLi4ubm9uX2FsVmlkZW9TdHJlYW1zX211dGVkXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG1lZXRpbmdEaXNwbGF5VHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgIGFsbFN0cmVhbXNQYWdlZCA9IFsuLi5hbFZpZGVvU3RyZWFtc107XG4gICAgICAgIH0gZWxzZSBpZiAobWVldGluZ0Rpc3BsYXlUeXBlID09PSAnbWVkaWEnKSB7XG4gICAgICAgICAgYWxsU3RyZWFtc1BhZ2VkID0gWy4uLmFsVmlkZW9TdHJlYW1zLCAuLi5ub25fYWxWaWRlb1N0cmVhbXNdO1xuICAgICAgICB9IGVsc2UgaWYgKG1lZXRpbmdEaXNwbGF5VHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBhbGxTdHJlYW1zUGFnZWQgPSBbLi4uYWxWaWRlb1N0cmVhbXMsIC4uLm5vbl9hbFZpZGVvU3RyZWFtcywgLi4ubm9uX2FsVmlkZW9TdHJlYW1zX211dGVkXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWdpbmF0ZWRTdHJlYW1zID0gW107XG4gICAgICBsZXQgbGltaXQgPSBpdGVtUGFnZUxpbWl0O1xuXG4gICAgICBpZiAoc2hhcmVTY3JlZW5TdGFydGVkIHx8IHNoYXJlZCkge1xuICAgICAgICBsaW1pdCA9IHNjcmVlblBhZ2VMaW1pdDtcbiAgICAgIH1cblxuICAgICAgbGV0IGZpcnN0UGFnZTogKFN0cmVhbSB8IFBhcnRpY2lwYW50KVtdID0gW107XG4gICAgICBsZXQgcGFnZTogKFN0cmVhbSB8IFBhcnRpY2lwYW50KVtdID0gW107XG4gICAgICBsZXQgbGltaXRfID0gbGltaXQgKyAxO1xuXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSAnY29uZmVyZW5jZScgJiYgIXNoYXJlZCAmJiAhc2hhcmVTY3JlZW5TdGFydGVkKSB7XG4gICAgICAgIGxpbWl0XyA9IGxpbWl0XyAtIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBwYWdpbmF0aW9uXG4gICAgICBsZXQgbWVtYmVySW5Sb29tID0gZmFsc2U7XG4gICAgICBsZXQgZmlsdGVySG9zdCA9IGZhbHNlO1xuICAgICAgaWYgKGJyZWFrT3V0Um9vbVN0YXJ0ZWQgJiYgIWJyZWFrT3V0Um9vbUVuZGVkKSB7XG4gICAgICAgIGxldCB0ZW1wQnJlYWtvdXRSb29tcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYnJlYWtvdXRSb29tcykpO1xuICAgICAgICBsZXQgaG9zdCA9IHBhcnRpY2lwYW50cy5maW5kKChvYmopID0+IG9iai5pc2xldmVsID09ICcyJyk7XG4gICAgICAgIGZvciAobGV0IHJvb20gb2YgdGVtcEJyZWFrb3V0Um9vbXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHJlYW1zID0gW107XG4gICAgICAgICAgICBjb25zdCByb29tSW5kZXggPSB0ZW1wQnJlYWtvdXRSb29tcy5pbmRleE9mKHJvb20pO1xuICAgICAgICAgICAgaWYgKGhvc3ROZXdSb29tICE9IC0xICYmIHJvb21JbmRleCA9PSBob3N0TmV3Um9vbSkge1xuICAgICAgICAgICAgICBpZiAoaG9zdCkge1xuICAgICAgICAgICAgICAgIGlmICghcm9vbS5tYXAoKG9iajogYW55KSA9PiBvYmoubmFtZSkuaW5jbHVkZXMoaG9zdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgcm9vbSA9IFsuLi5yb29tLCB7IG5hbWU6IGhvc3QubmFtZSwgYnJlYWtSb29tOiByb29tSW5kZXggfV07XG4gICAgICAgICAgICAgICAgICBmaWx0ZXJIb3N0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHBhcnRpY2lwYW50IG9mIHJvb20pIHtcbiAgICAgICAgICAgICAgaWYgKHBhcnRpY2lwYW50Lm5hbWUgPT0gbWVtYmVyICYmICFtZW1iZXJJblJvb20pIHtcbiAgICAgICAgICAgICAgICBtZW1iZXJJblJvb20gPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1lbWJlclJvb20gPSBwYXJ0aWNpcGFudC5icmVha1Jvb207XG4gICAgICAgICAgICAgICAgdXBkYXRlTWVtYmVyUm9vbShtZW1iZXJSb29tKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZXQgc3RyZWFtcyA9IGFsbFN0cmVhbXNQYWdlZC5maWx0ZXIoKHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RyZWFtLCAncHJvZHVjZXJJZCcpICYmXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wcm9kdWNlcklkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnByb2R1Y2VySWQgIT09ICcnKSB8fFxuICAgICAgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdHJlYW0sICdhdWRpb0lEJykgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtWydhdWRpb0lEJ10gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1bJ2F1ZGlvSUQnXSAhPT0gJycpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjZXJJZCA9IHN0cmVhbS5wcm9kdWNlcklkIHx8IHN0cmVhbVsnYXVkaW9JRCddO1xuICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nUGFydGljaXBhbnQgPSByZWZfcGFydGljaXBhbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChvYmopID0+XG4gICAgICAgICAgICAgICAgICAgICAgb2JqWydhdWRpb0lEJ10gPT09IHByb2R1Y2VySWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBvYmoudmlkZW9JRCA9PT0gcHJvZHVjZXJJZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICgocHJvZHVjZXJJZCA9PSAneW91eW91JyB8fCBwcm9kdWNlcklkID09ICd5b3V5b3V5b3UnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyID09IHBhcnRpY2lwYW50Lm5hbWUpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIChtYXRjaGluZ1BhcnRpY2lwYW50ICYmIG1hdGNoaW5nUGFydGljaXBhbnQubmFtZSA9PT0gcGFydGljaXBhbnQubmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2lwYW50Lm5hbWUgPT0gbWVtYmVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHByb2R1Y2VySWQgPT0gJ3lvdXlvdScgfHwgcHJvZHVjZXJJZCA9PSAneW91eW91eW91JykpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RyZWFtLCAnbmFtZScpICYmXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5uYW1lID09IHBhcnRpY2lwYW50Lm5hbWVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgc3RyZWFtIG9mIHN0cmVhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0cmVhbXMubGVuZ3RoIDwgbGltaXRfKSB7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50U3RyZWFtcy5wdXNoKHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWdpbmF0ZWRTdHJlYW1zLnB1c2goY3VycmVudFN0cmVhbXMpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogaGFuZGxlIGVycm9yICovXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlbWFpbmluZ1N0cmVhbXMgPSBhbGxTdHJlYW1zUGFnZWQuZmlsdGVyKChzdHJlYW0pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0cmVhbSwgJ3Byb2R1Y2VySWQnKSAmJlxuICAgICAgICAgICAgICBzdHJlYW0ucHJvZHVjZXJJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAgIHN0cmVhbS5wcm9kdWNlcklkICE9PSAnJykgfHxcbiAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RyZWFtLCAnYXVkaW9JRCcpICYmXG4gICAgICAgICAgICAgIHN0cmVhbVsnYXVkaW9JRCddICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgc3RyZWFtWydhdWRpb0lEJ10gIT09ICcnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGV0IHByb2R1Y2VySWQgPSBzdHJlYW0ucHJvZHVjZXJJZCB8fCBzdHJlYW1bJ2F1ZGlvSUQnXTtcbiAgICAgICAgICAgIGxldCBtYXRjaGluZ1BhcnRpY2lwYW50ID0gcmVmX3BhcnRpY2lwYW50cy5maW5kKFxuICAgICAgICAgICAgICAob2JqKSA9PlxuICAgICAgICAgICAgICAgIG9ialsnYXVkaW9JRCddID09PSBwcm9kdWNlcklkIHx8XG4gICAgICAgICAgICAgICAgb2JqLnZpZGVvSUQgPT09IHByb2R1Y2VySWQgfHxcbiAgICAgICAgICAgICAgICAoKHByb2R1Y2VySWQgPT0gJ3lvdXlvdScgfHwgcHJvZHVjZXJJZCA9PSAneW91eW91eW91JykgJiYgbWVtYmVyID09IG9iai5uYW1lKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBtYXRjaGluZ1BhcnRpY2lwYW50ICYmXG4gICAgICAgICAgICAgICFicmVha291dFJvb21zXG4gICAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAgIC5tYXAoKG9iaikgPT4gb2JqLm5hbWUpXG4gICAgICAgICAgICAgICAgLmluY2x1ZGVzKG1hdGNoaW5nUGFydGljaXBhbnQubmFtZSkgJiZcbiAgICAgICAgICAgICAgKCFmaWx0ZXJIb3N0IHx8IG1hdGNoaW5nUGFydGljaXBhbnQubmFtZSAhPSBob3N0Py5uYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgIWJyZWFrb3V0Um9vbXNcbiAgICAgICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgICAgICAgICAgLm1hcCgob2JqKSA9PiBvYmoubmFtZSlcbiAgICAgICAgICAgICAgICAuaW5jbHVkZXMoc3RyZWFtLm5hbWUgPz8gJycpICYmXG4gICAgICAgICAgICAgICghZmlsdGVySG9zdCB8fCBzdHJlYW0ubmFtZSAhPSBob3N0Py5uYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtZW1iZXJJblJvb20pIHtcbiAgICAgICAgICBsZXQgbWVtYmVyU3RyZWFtID0gYWxsU3RyZWFtc1BhZ2VkLmZpbmQoKHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RyZWFtLCAncHJvZHVjZXJJZCcpICYmXG4gICAgICAgICAgICAgIHN0cmVhbS5wcm9kdWNlcklkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgc3RyZWFtLnByb2R1Y2VySWQgIT09ICcnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5wcm9kdWNlcklkID09ICd5b3V5b3UnIHx8IHN0cmVhbS5wcm9kdWNlcklkID09ICd5b3V5b3V5b3UnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBBZGQgYSByZXR1cm4gc3RhdGVtZW50IGhlcmVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWVtYmVyU3RyZWFtICYmICFyZW1haW5pbmdTdHJlYW1zLmluY2x1ZGVzKG1lbWJlclN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJlbWFpbmluZ1N0cmVhbXMudW5zaGlmdChtZW1iZXJTdHJlYW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVtYWluaW5nUGFnaW5hdGVkU3RyZWFtcyA9IFtdO1xuXG4gICAgICAgIGlmIChyZW1haW5pbmdTdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaXJzdFBhZ2UgPSByZW1haW5pbmdTdHJlYW1zLnNsaWNlKDAsIGxpbWl0Xyk7XG4gICAgICAgICAgcmVtYWluaW5nUGFnaW5hdGVkU3RyZWFtcy5wdXNoKGZpcnN0UGFnZSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGxpbWl0XzsgaSA8IHJlbWFpbmluZ1N0cmVhbXMubGVuZ3RoOyBpICs9IGxpbWl0KSB7XG4gICAgICAgICAgICBwYWdlID0gcmVtYWluaW5nU3RyZWFtcy5zbGljZShpLCBpICsgbGltaXQpO1xuICAgICAgICAgICAgcmVtYWluaW5nUGFnaW5hdGVkU3RyZWFtcy5wdXNoKHBhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1haW5Sb29tc0xlbmd0aCA9IHJlbWFpbmluZ1BhZ2luYXRlZFN0cmVhbXMubGVuZ3RoO1xuICAgICAgICB1cGRhdGVNYWluUm9vbXNMZW5ndGgobWFpblJvb21zTGVuZ3RoKTtcbiAgICAgICAgLy8gQWRkIHRoZSByZW1haW5pbmcgc3RyZWFtcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdpbmF0ZWRTdHJlYW1zXG4gICAgICAgIGZvciAobGV0IGkgPSByZW1haW5pbmdQYWdpbmF0ZWRTdHJlYW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgcGFnaW5hdGVkU3RyZWFtcy51bnNoaWZ0KHJlbWFpbmluZ1BhZ2luYXRlZFN0cmVhbXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdFBhZ2UgPSBhbGxTdHJlYW1zUGFnZWQuc2xpY2UoMCwgbGltaXRfKTtcbiAgICAgICAgcGFnaW5hdGVkU3RyZWFtcy5wdXNoKGZpcnN0UGFnZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGxpbWl0XzsgaSA8IGFsbFN0cmVhbXNQYWdlZC5sZW5ndGg7IGkgKz0gbGltaXQpIHtcbiAgICAgICAgICBwYWdlID0gYWxsU3RyZWFtc1BhZ2VkLnNsaWNlKGksIGkgKyBsaW1pdCk7XG4gICAgICAgICAgcGFnaW5hdGVkU3RyZWFtcy5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXRlIHVwZGF0ZXNcbiAgICAgIHVwZGF0ZVBfYWN0aXZlTmFtZXMocF9hY3RpdmVOYW1lcyk7XG4gICAgICB1cGRhdGVBY3RpdmVOYW1lcyhhY3RpdmVOYW1lcyk7XG4gICAgICB1cGRhdGVEaXNwQWN0aXZlTmFtZXMoZGlzcEFjdGl2ZU5hbWVzKTtcbiAgICAgIHVwZGF0ZU5ld0xpbWl0ZWRTdHJlYW1zKG5ld0xpbWl0ZWRTdHJlYW1zKTtcbiAgICAgIHVwZGF0ZU5vbl9hbFZpZGVvU3RyZWFtcyhub25fYWxWaWRlb1N0cmVhbXMpO1xuICAgICAgdXBkYXRlUmVmX3BhcnRpY2lwYW50cyhyZWZfcGFydGljaXBhbnRzKTtcbiAgICAgIHVwZGF0ZVNvcnRBdWRpb0xvdWRuZXNzKHNvcnRBdWRpb0xvdWRuZXNzKTtcbiAgICAgIHVwZGF0ZU1peGVkX2FsVmlkZW9TdHJlYW1zKG1peGVkX2FsVmlkZW9TdHJlYW1zKTtcbiAgICAgIHVwZGF0ZU5vbl9hbFZpZGVvU3RyZWFtc19tdXRlZChub25fYWxWaWRlb1N0cmVhbXNfbXV0ZWQpO1xuICAgICAgdXBkYXRlUGFnaW5hdGVkU3RyZWFtcyhwYWdpbmF0ZWRTdHJlYW1zKTtcblxuICAgICAgcHJldkRvUGFnaW5hdGUgPSBkb1BhZ2luYXRlO1xuICAgICAgZG9QYWdpbmF0ZSA9IGZhbHNlO1xuICAgICAgdXBkYXRlUHJldkRvUGFnaW5hdGUocHJldkRvUGFnaW5hdGUpO1xuICAgICAgdXBkYXRlRG9QYWdpbmF0ZShkb1BhZ2luYXRlKTtcblxuICAgICAgbGV0IGlzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGlmIChwYWdpbmF0ZWRTdHJlYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKCFzaGFyZVNjcmVlblN0YXJ0ZWQgJiYgIXNoYXJlZCkge1xuICAgICAgICAgIGRvUGFnaW5hdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZURvUGFnaW5hdGUoZG9QYWdpbmF0ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRVc2VyUGFnZSA+IHBhZ2luYXRlZFN0cmVhbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmIChicmVha091dFJvb21TdGFydGVkICYmICFicmVha091dFJvb21FbmRlZCkge1xuICAgICAgICAgICAgY3VycmVudFVzZXJQYWdlID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFVzZXJQYWdlID0gcGFnaW5hdGVkU3RyZWFtcy5sZW5ndGggLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VXNlclBhZ2UgPT0gMCkge1xuICAgICAgICAgIGlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDdXJyZW50VXNlclBhZ2UoY3VycmVudFVzZXJQYWdlKTtcbiAgICAgICAgdXBkYXRlTnVtYmVyUGFnZXMocGFnaW5hdGVkU3RyZWFtcy5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAoc2NyZWVuQ2hhbmdlZCkge1xuICAgICAgICAgIGF3YWl0IGRpc3BTdHJlYW1zKHtcbiAgICAgICAgICAgIGxTdHJlYW1zOiBwYWdpbmF0ZWRTdHJlYW1zWzBdLFxuICAgICAgICAgICAgaW5kOiAwLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBkaXNwU3RyZWFtcyh7XG4gICAgICAgICAgICBsU3RyZWFtczogcGFnaW5hdGVkU3RyZWFtc1swXSxcbiAgICAgICAgICAgIGluZDogMCxcbiAgICAgICAgICAgIGF1dG86IHRydWUsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlQnJlYWsgPSBjdXJyZW50VXNlclBhZ2UgLSBtYWluUm9vbXNMZW5ndGg7XG4gICAgICAgICAgYXdhaXQgZGlzcFN0cmVhbXMoe1xuICAgICAgICAgICAgbFN0cmVhbXM6IHBhZ2luYXRlZFN0cmVhbXNbY3VycmVudFVzZXJQYWdlXSxcbiAgICAgICAgICAgIGluZDogY3VycmVudFVzZXJQYWdlLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIGJyZWFrUm9vbTogY3VycmVudFBhZ2VCcmVhayxcbiAgICAgICAgICAgIGluQnJlYWtSb29tOiBjdXJyZW50UGFnZUJyZWFrID49IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRVc2VyUGFnZSA9IDA7XG4gICAgICAgIHVwZGF0ZUN1cnJlbnRVc2VyUGFnZShjdXJyZW50VXNlclBhZ2UpO1xuXG4gICAgICAgIGlmIChzY3JlZW5DaGFuZ2VkKSB7XG4gICAgICAgICAgYXdhaXQgZGlzcFN0cmVhbXMoe1xuICAgICAgICAgICAgbFN0cmVhbXM6IHBhZ2luYXRlZFN0cmVhbXNbMF0sXG4gICAgICAgICAgICBpbmQ6IDAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGRpc3BTdHJlYW1zKHtcbiAgICAgICAgICAgIGxTdHJlYW1zOiBwYWdpbmF0ZWRTdHJlYW1zWzBdLFxuICAgICAgICAgICAgaW5kOiAwLFxuICAgICAgICAgICAgYXV0bzogdHJ1ZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coJ2NoYW5nZVZpZHMgZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICB9O1xufVxuIl19