@rocketshow/designer 1.32.0 → 1.35.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 (362) hide show
  1. package/assets/i18n/de.json +2 -1
  2. package/assets/i18n/en.json +2 -1
  3. package/esm2022/lib/array-sort-pipe.mjs +30 -0
  4. package/esm2022/lib/designer.component.mjs +672 -0
  5. package/esm2022/lib/designer.module.mjs +186 -0
  6. package/esm2022/lib/designer.service.mjs +14 -0
  7. package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
  8. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +577 -0
  9. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
  10. package/esm2022/lib/effect/effect.component.mjs +174 -0
  11. package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
  12. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
  13. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
  14. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
  15. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
  16. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
  17. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
  18. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +162 -0
  19. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
  20. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
  21. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
  22. package/esm2022/lib/fixture/fixture.component.mjs +148 -0
  23. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
  24. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +643 -0
  25. package/esm2022/lib/intro/intro.component.mjs +95 -0
  26. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
  27. package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
  28. package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
  29. package/esm2022/lib/models/cached-fixture.mjs +6 -0
  30. package/esm2022/lib/models/color.mjs +8 -0
  31. package/esm2022/lib/models/composition.mjs +46 -0
  32. package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
  33. package/esm2022/lib/models/effect-curve.mjs +69 -0
  34. package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
  35. package/esm2022/lib/models/effect.mjs +12 -0
  36. package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
  37. package/esm2022/lib/models/fixture-capability.mjs +84 -0
  38. package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
  39. package/esm2022/lib/models/fixture-channel.mjs +24 -0
  40. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
  41. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
  42. package/esm2022/lib/models/fixture-matrix.mjs +25 -0
  43. package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
  44. package/esm2022/lib/models/fixture-mode.mjs +17 -0
  45. package/esm2022/lib/models/fixture-physical.mjs +14 -0
  46. package/esm2022/lib/models/fixture-profile.mjs +85 -0
  47. package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
  48. package/esm2022/lib/models/fixture-wheel.mjs +15 -0
  49. package/esm2022/lib/models/fixture.mjs +40 -0
  50. package/esm2022/lib/models/preset-fixture.mjs +10 -0
  51. package/esm2022/lib/models/preset-region-scene.mjs +8 -0
  52. package/esm2022/lib/models/preset.mjs +65 -0
  53. package/esm2022/lib/models/project.mjs +78 -0
  54. package/esm2022/lib/models/scene-playback-region.mjs +11 -0
  55. package/esm2022/lib/models/scene.mjs +27 -0
  56. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
  57. package/esm2022/lib/preset/preset.component.mjs +131 -0
  58. package/esm2022/lib/preview/models/color-changer-3d.mjs +64 -0
  59. package/esm2022/lib/preview/models/fixture-3d.mjs +274 -0
  60. package/esm2022/lib/preview/models/moving-head-3d.mjs +124 -0
  61. package/esm2022/lib/preview/preview.component.mjs +219 -0
  62. package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
  63. package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
  64. package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
  65. package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
  66. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
  67. package/esm2022/lib/scene/scene.component.mjs +110 -0
  68. package/esm2022/lib/services/animation.service.mjs +16 -0
  69. package/esm2022/lib/services/config.service.mjs +28 -0
  70. package/esm2022/lib/services/effect.service.mjs +14 -0
  71. package/esm2022/lib/services/error-dialog.service.mjs +39 -0
  72. package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
  73. package/esm2022/lib/services/fixture.service.mjs +639 -0
  74. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
  75. package/esm2022/lib/services/intro.service.mjs +140 -0
  76. package/esm2022/lib/services/preset.service.mjs +449 -0
  77. package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
  78. package/esm2022/lib/services/preview.service.mjs +497 -0
  79. package/esm2022/lib/services/project-load.service.mjs +209 -0
  80. package/esm2022/lib/services/project.service.mjs +93 -0
  81. package/esm2022/lib/services/scene.service.mjs +164 -0
  82. package/esm2022/lib/services/timeline.service.mjs +726 -0
  83. package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
  84. package/esm2022/lib/services/user.service.mjs +89 -0
  85. package/esm2022/lib/services/uuid.service.mjs +23 -0
  86. package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
  87. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +304 -0
  88. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
  89. package/esm2022/lib/timeline/timeline.component.mjs +418 -0
  90. package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
  91. package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
  92. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
  93. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
  94. package/esm2022/public_api.mjs +7 -0
  95. package/esm2022/rocketshow-designer.mjs +5 -0
  96. package/fesm2022/rocketshow-designer.mjs +11171 -0
  97. package/fesm2022/rocketshow-designer.mjs.map +1 -0
  98. package/index.d.ts +5 -0
  99. package/lib/array-sort-pipe.d.ts +3 -0
  100. package/lib/designer.component.d.ts +19 -16
  101. package/lib/designer.module.d.ts +55 -0
  102. package/lib/designer.service.d.ts +3 -0
  103. package/lib/dropzone/dropzone.component.d.ts +24 -0
  104. package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
  105. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
  106. package/lib/effect/effect.component.d.ts +3 -0
  107. package/lib/error-dialog/error-dialog.component.d.ts +3 -0
  108. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
  109. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
  110. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
  111. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
  112. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
  113. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
  114. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
  115. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
  116. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
  117. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
  118. package/lib/fixture/fixture.component.d.ts +7 -3
  119. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
  120. package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
  121. package/lib/intro/intro.component.d.ts +3 -0
  122. package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
  123. package/lib/models/cached-fixture.d.ts +1 -0
  124. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
  125. package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
  126. package/lib/models/fixture-matrix.d.ts +6 -0
  127. package/lib/models/fixture-mode-channel.d.ts +8 -0
  128. package/lib/models/fixture-mode.d.ts +3 -1
  129. package/lib/models/fixture-physical.d.ts +4 -0
  130. package/lib/models/fixture-profile.d.ts +5 -0
  131. package/lib/models/preset-fixture.d.ts +5 -0
  132. package/lib/models/preset.d.ts +2 -0
  133. package/lib/models/project.d.ts +3 -0
  134. package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
  135. package/lib/preset/preset.component.d.ts +3 -0
  136. package/lib/preview/models/color-changer-3d.d.ts +1 -11
  137. package/lib/preview/models/fixture-3d.d.ts +11 -0
  138. package/lib/preview/models/moving-head-3d.d.ts +1 -11
  139. package/lib/preview/preview.component.d.ts +4 -4
  140. package/lib/project/project-browser/project-browser.component.d.ts +3 -0
  141. package/lib/project/project-import/project-import.component.d.ts +3 -0
  142. package/lib/project/project-save/project-save.component.d.ts +3 -0
  143. package/lib/project/project-share/project-share.component.d.ts +3 -0
  144. package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
  145. package/lib/scene/scene.component.d.ts +3 -0
  146. package/lib/services/animation.service.d.ts +3 -0
  147. package/lib/services/config.service.d.ts +4 -0
  148. package/lib/services/effect.service.d.ts +3 -0
  149. package/lib/services/error-dialog.service.d.ts +3 -0
  150. package/lib/services/fixture-pool.service.d.ts +3 -0
  151. package/lib/services/fixture.service.d.ts +10 -2
  152. package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
  153. package/lib/services/intro.service.d.ts +3 -0
  154. package/lib/services/preset.service.d.ts +7 -2
  155. package/lib/services/preview-mesh.service.d.ts +3 -0
  156. package/lib/services/preview.service.d.ts +6 -4
  157. package/lib/services/project-load.service.d.ts +8 -1
  158. package/lib/services/project.service.d.ts +5 -3
  159. package/lib/services/scene.service.d.ts +3 -0
  160. package/lib/services/timeline.service.d.ts +3 -0
  161. package/lib/services/user-ensure-login.service.d.ts +3 -0
  162. package/lib/services/user.service.d.ts +3 -0
  163. package/lib/services/uuid.service.d.ts +3 -0
  164. package/lib/services/warning-dialog.service.d.ts +3 -0
  165. package/lib/timeline/composition-settings/composition-settings.component.d.ts +5 -1
  166. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
  167. package/lib/timeline/timeline.component.d.ts +3 -0
  168. package/lib/user/user-login/user-login.component.d.ts +3 -0
  169. package/lib/user/user-register/user-register.component.d.ts +3 -0
  170. package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
  171. package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
  172. package/package.json +20 -22
  173. package/rocketshow-designer-1.35.0.tgz +0 -0
  174. package/bundles/rocketshow-designer.umd.js +0 -9966
  175. package/bundles/rocketshow-designer.umd.js.map +0 -1
  176. package/bundles/rocketshow-designer.umd.min.js +0 -17
  177. package/bundles/rocketshow-designer.umd.min.js.map +0 -1
  178. package/esm2015/lib/array-sort-pipe.js +0 -28
  179. package/esm2015/lib/designer.component.js +0 -411
  180. package/esm2015/lib/designer.module.js +0 -117
  181. package/esm2015/lib/designer.service.js +0 -16
  182. package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
  183. package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
  184. package/esm2015/lib/effect/effect.component.js +0 -73
  185. package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
  186. package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
  187. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
  188. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
  189. package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
  190. package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
  191. package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
  192. package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
  193. package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
  194. package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
  195. package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
  196. package/esm2015/lib/fixture/fixture.component.js +0 -70
  197. package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
  198. package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
  199. package/esm2015/lib/intro/intro.component.js +0 -25
  200. package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
  201. package/esm2015/lib/models/cached-fixture-capability.js +0 -9
  202. package/esm2015/lib/models/cached-fixture-channel.js +0 -7
  203. package/esm2015/lib/models/cached-fixture.js +0 -6
  204. package/esm2015/lib/models/color.js +0 -8
  205. package/esm2015/lib/models/composition.js +0 -46
  206. package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
  207. package/esm2015/lib/models/effect-curve.js +0 -69
  208. package/esm2015/lib/models/effect-pan-tilt.js +0 -19
  209. package/esm2015/lib/models/effect.js +0 -12
  210. package/esm2015/lib/models/fixture-capability-value.js +0 -15
  211. package/esm2015/lib/models/fixture-capability.js +0 -84
  212. package/esm2015/lib/models/fixture-channel-value.js +0 -11
  213. package/esm2015/lib/models/fixture-channel.js +0 -24
  214. package/esm2015/lib/models/fixture-mode.js +0 -14
  215. package/esm2015/lib/models/fixture-profile.js +0 -70
  216. package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
  217. package/esm2015/lib/models/fixture-wheel.js +0 -15
  218. package/esm2015/lib/models/fixture.js +0 -40
  219. package/esm2015/lib/models/preset-region-scene.js +0 -8
  220. package/esm2015/lib/models/preset.js +0 -56
  221. package/esm2015/lib/models/project.js +0 -68
  222. package/esm2015/lib/models/scene-playback-region.js +0 -11
  223. package/esm2015/lib/models/scene.js +0 -27
  224. package/esm2015/lib/models/universe.js +0 -11
  225. package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
  226. package/esm2015/lib/preset/preset.component.js +0 -85
  227. package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
  228. package/esm2015/lib/preview/models/fixture-3d.js +0 -150
  229. package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
  230. package/esm2015/lib/preview/preview.component.js +0 -242
  231. package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
  232. package/esm2015/lib/project/project-import/project-import.component.js +0 -89
  233. package/esm2015/lib/project/project-save/project-save.component.js +0 -105
  234. package/esm2015/lib/project/project-share/project-share.component.js +0 -43
  235. package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
  236. package/esm2015/lib/scene/scene.component.js +0 -56
  237. package/esm2015/lib/services/animation.service.js +0 -17
  238. package/esm2015/lib/services/config.service.js +0 -28
  239. package/esm2015/lib/services/effect.service.js +0 -16
  240. package/esm2015/lib/services/error-dialog.service.js +0 -44
  241. package/esm2015/lib/services/fixture-pool.service.js +0 -34
  242. package/esm2015/lib/services/fixture.service.js +0 -443
  243. package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
  244. package/esm2015/lib/services/intro.service.js +0 -144
  245. package/esm2015/lib/services/preset.service.js +0 -416
  246. package/esm2015/lib/services/preview-mesh.service.js +0 -58
  247. package/esm2015/lib/services/preview.service.js +0 -500
  248. package/esm2015/lib/services/project-load.service.js +0 -171
  249. package/esm2015/lib/services/project.service.js +0 -113
  250. package/esm2015/lib/services/scene.service.js +0 -174
  251. package/esm2015/lib/services/timeline.service.js +0 -738
  252. package/esm2015/lib/services/universe.service.js +0 -24
  253. package/esm2015/lib/services/user-ensure-login.service.js +0 -44
  254. package/esm2015/lib/services/user.service.js +0 -93
  255. package/esm2015/lib/services/uuid.service.js +0 -25
  256. package/esm2015/lib/services/warning-dialog.service.js +0 -43
  257. package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
  258. package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
  259. package/esm2015/lib/timeline/timeline.component.js +0 -239
  260. package/esm2015/lib/user/user-login/user-login.component.js +0 -64
  261. package/esm2015/lib/user/user-register/user-register.component.js +0 -89
  262. package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
  263. package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
  264. package/esm2015/public_api.js +0 -7
  265. package/esm2015/rocketshow-designer.js +0 -61
  266. package/esm5/lib/array-sort-pipe.js +0 -31
  267. package/esm5/lib/designer.component.js +0 -468
  268. package/esm5/lib/designer.module.js +0 -120
  269. package/esm5/lib/designer.service.js +0 -17
  270. package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
  271. package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
  272. package/esm5/lib/effect/effect.component.js +0 -75
  273. package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
  274. package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
  275. package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
  276. package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
  277. package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
  278. package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
  279. package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
  280. package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
  281. package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
  282. package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
  283. package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
  284. package/esm5/lib/fixture/fixture.component.js +0 -71
  285. package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
  286. package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
  287. package/esm5/lib/intro/intro.component.js +0 -26
  288. package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
  289. package/esm5/lib/models/cached-fixture-capability.js +0 -11
  290. package/esm5/lib/models/cached-fixture-channel.js +0 -9
  291. package/esm5/lib/models/cached-fixture.js +0 -8
  292. package/esm5/lib/models/color.js +0 -10
  293. package/esm5/lib/models/composition.js +0 -60
  294. package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
  295. package/esm5/lib/models/effect-curve.js +0 -95
  296. package/esm5/lib/models/effect-pan-tilt.js +0 -24
  297. package/esm5/lib/models/effect.js +0 -14
  298. package/esm5/lib/models/fixture-capability-value.js +0 -17
  299. package/esm5/lib/models/fixture-capability.js +0 -86
  300. package/esm5/lib/models/fixture-channel-value.js +0 -13
  301. package/esm5/lib/models/fixture-channel.js +0 -38
  302. package/esm5/lib/models/fixture-mode.js +0 -16
  303. package/esm5/lib/models/fixture-profile.js +0 -114
  304. package/esm5/lib/models/fixture-wheel-slot.js +0 -28
  305. package/esm5/lib/models/fixture-wheel.js +0 -29
  306. package/esm5/lib/models/fixture.js +0 -42
  307. package/esm5/lib/models/preset-region-scene.js +0 -10
  308. package/esm5/lib/models/preset.js +0 -90
  309. package/esm5/lib/models/project.js +0 -122
  310. package/esm5/lib/models/scene-playback-region.js +0 -13
  311. package/esm5/lib/models/scene.js +0 -29
  312. package/esm5/lib/models/universe.js +0 -13
  313. package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
  314. package/esm5/lib/preset/preset.component.js +0 -86
  315. package/esm5/lib/preview/models/color-changer-3d.js +0 -194
  316. package/esm5/lib/preview/models/fixture-3d.js +0 -196
  317. package/esm5/lib/preview/models/moving-head-3d.js +0 -250
  318. package/esm5/lib/preview/preview.component.js +0 -280
  319. package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
  320. package/esm5/lib/project/project-import/project-import.component.js +0 -88
  321. package/esm5/lib/project/project-save/project-save.component.js +0 -120
  322. package/esm5/lib/project/project-share/project-share.component.js +0 -44
  323. package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
  324. package/esm5/lib/scene/scene.component.js +0 -57
  325. package/esm5/lib/services/animation.service.js +0 -18
  326. package/esm5/lib/services/config.service.js +0 -29
  327. package/esm5/lib/services/effect.service.js +0 -17
  328. package/esm5/lib/services/error-dialog.service.js +0 -46
  329. package/esm5/lib/services/fixture-pool.service.js +0 -36
  330. package/esm5/lib/services/fixture.service.js +0 -643
  331. package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
  332. package/esm5/lib/services/intro.service.js +0 -145
  333. package/esm5/lib/services/preset.service.js +0 -637
  334. package/esm5/lib/services/preview-mesh.service.js +0 -61
  335. package/esm5/lib/services/preview.service.js +0 -754
  336. package/esm5/lib/services/project-load.service.js +0 -185
  337. package/esm5/lib/services/project.service.js +0 -127
  338. package/esm5/lib/services/scene.service.js +0 -251
  339. package/esm5/lib/services/timeline.service.js +0 -845
  340. package/esm5/lib/services/universe.service.js +0 -36
  341. package/esm5/lib/services/user-ensure-login.service.js +0 -45
  342. package/esm5/lib/services/user.service.js +0 -95
  343. package/esm5/lib/services/uuid.service.js +0 -26
  344. package/esm5/lib/services/warning-dialog.service.js +0 -45
  345. package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
  346. package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
  347. package/esm5/lib/timeline/timeline.component.js +0 -243
  348. package/esm5/lib/user/user-login/user-login.component.js +0 -66
  349. package/esm5/lib/user/user-register/user-register.component.js +0 -91
  350. package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
  351. package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
  352. package/esm5/public_api.js +0 -7
  353. package/esm5/rocketshow-designer.js +0 -61
  354. package/fesm2015/rocketshow-designer.js +0 -7945
  355. package/fesm2015/rocketshow-designer.js.map +0 -1
  356. package/fesm5/rocketshow-designer.js +0 -9690
  357. package/fesm5/rocketshow-designer.js.map +0 -1
  358. package/lib/models/universe.d.ts +0 -8
  359. package/lib/services/universe.service.d.ts +0 -6
  360. package/rocketshow-designer-1.32.0.tgz +0 -0
  361. package/rocketshow-designer.d.ts +0 -60
  362. package/rocketshow-designer.metadata.json +0 -1
@@ -0,0 +1,577 @@
1
+ import { Component, ElementRef, Input, ViewChild } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+ import { timer } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+ import { EffectCurveProfileChannels } from '../../models/effect-curve-profile-channel';
6
+ import { FixtureCapability, FixtureCapabilityColor, FixtureCapabilityType } from '../../models/fixture-capability';
7
+ import { FixtureService } from '../../services/fixture.service';
8
+ import { PresetService } from '../../services/preset.service';
9
+ import { EffectCurve } from './../../models/effect-curve';
10
+ import { AnimationService } from './../../services/animation.service';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../../services/preset.service";
13
+ import * as i2 from "./../../services/animation.service";
14
+ import * as i3 from "../../services/fixture.service";
15
+ import * as i4 from "@ngx-translate/core";
16
+ import * as i5 from "@angular/common";
17
+ import * as i6 from "@angular/forms";
18
+ import * as i7 from "ngx-bootstrap-slider";
19
+ import * as i8 from "ngx-bootstrap/popover";
20
+ const _c0 = ["curveGrid"];
21
+ function EffectCurveComponent_div_73_Template(rf, ctx) { if (rf & 1) {
22
+ const _r2 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "div", 29)(1, "input", 30);
24
+ i0.ɵɵlistener("change", function EffectCurveComponent_div_73_Template_input_change_1_listener($event) { const capability_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleCapability($event, capability_r3)); });
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(2, "label", 31);
27
+ i0.ɵɵtext(3);
28
+ i0.ɵɵpipe(4, "async");
29
+ i0.ɵɵelementEnd()();
30
+ } if (rf & 2) {
31
+ const capability_r3 = ctx.$implicit;
32
+ const i_r5 = ctx.index;
33
+ const ctx_r3 = i0.ɵɵnextContext();
34
+ i0.ɵɵadvance();
35
+ i0.ɵɵpropertyInterpolate1("id", "capability_", (ctx_r3.curve == null ? null : ctx_r3.curve.uuid) + "_" + i_r5, "");
36
+ i0.ɵɵproperty("ngModel", ctx_r3.capabilityChecked(capability_r3));
37
+ i0.ɵɵadvance();
38
+ i0.ɵɵpropertyInterpolate1("for", "capability_", (ctx_r3.curve == null ? null : ctx_r3.curve.uuid) + "_" + i_r5, "");
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 6, ctx_r3.getCapabilityName(capability_r3)));
41
+ } }
42
+ function EffectCurveComponent_div_75_div_1_Template(rf, ctx) { if (rf & 1) {
43
+ const _r6 = i0.ɵɵgetCurrentView();
44
+ i0.ɵɵelementStart(0, "div", 29)(1, "input", 30);
45
+ i0.ɵɵlistener("change", function EffectCurveComponent_div_75_div_1_Template_input_change_1_listener($event) { const profile_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.changeProfileSelection($event, profile_r7)); });
46
+ i0.ɵɵelementEnd();
47
+ i0.ɵɵelementStart(2, "label", 31);
48
+ i0.ɵɵtext(3);
49
+ i0.ɵɵelementEnd()();
50
+ } if (rf & 2) {
51
+ const profile_r7 = ctx.$implicit;
52
+ const ctx_r3 = i0.ɵɵnextContext(2);
53
+ i0.ɵɵadvance();
54
+ i0.ɵɵpropertyInterpolate2("id", "channel_profile_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", profile_r7.uuid, "");
55
+ i0.ɵɵproperty("ngModel", ctx_r3.selectedProfiles.indexOf(profile_r7) >= 0);
56
+ i0.ɵɵadvance();
57
+ i0.ɵɵpropertyInterpolate2("for", "channel_profile_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", profile_r7.uuid, "");
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵtextInterpolate(profile_r7.name);
60
+ } }
61
+ function EffectCurveComponent_div_75_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementStart(0, "div");
63
+ i0.ɵɵtemplate(1, EffectCurveComponent_div_75_div_1_Template, 4, 8, "div", 25);
64
+ i0.ɵɵelement(2, "hr", 32);
65
+ i0.ɵɵelementEnd();
66
+ } if (rf & 2) {
67
+ const ctx_r3 = i0.ɵɵnextContext();
68
+ i0.ɵɵadvance();
69
+ i0.ɵɵproperty("ngForOf", ctx_r3.availableProfiles);
70
+ } }
71
+ function EffectCurveComponent_ng_container_76_div_1_Template(rf, ctx) { if (rf & 1) {
72
+ const _r8 = i0.ɵɵgetCurrentView();
73
+ i0.ɵɵelementStart(0, "div", 29)(1, "input", 30);
74
+ i0.ɵɵlistener("change", function EffectCurveComponent_ng_container_76_div_1_Template_input_change_1_listener($event) { const channel_r9 = i0.ɵɵrestoreView(_r8).$implicit; const entry_r10 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleChannel($event, entry_r10.key, channel_r9)); });
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵelementStart(2, "label", 31);
77
+ i0.ɵɵtext(3);
78
+ i0.ɵɵelementEnd()();
79
+ } if (rf & 2) {
80
+ const channel_r9 = ctx.$implicit;
81
+ const j_r11 = ctx.index;
82
+ const ctx_r11 = i0.ɵɵnextContext();
83
+ const entry_r10 = ctx_r11.$implicit;
84
+ const i_r13 = ctx_r11.index;
85
+ const ctx_r3 = i0.ɵɵnextContext();
86
+ i0.ɵɵadvance();
87
+ i0.ɵɵpropertyInterpolate3("id", "channel_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", i_r13, "_", j_r11, "");
88
+ i0.ɵɵproperty("ngModel", ctx_r3.channelChecked(entry_r10.key, channel_r9));
89
+ i0.ɵɵadvance();
90
+ i0.ɵɵpropertyInterpolate3("for", "channel_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", i_r13, "_", j_r11, "");
91
+ i0.ɵɵadvance();
92
+ i0.ɵɵtextInterpolate(ctx_r3.getChannelName(entry_r10.key.name, channel_r9.name));
93
+ } }
94
+ function EffectCurveComponent_ng_container_76_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelementContainerStart(0);
96
+ i0.ɵɵtemplate(1, EffectCurveComponent_ng_container_76_div_1_Template, 4, 10, "div", 25);
97
+ i0.ɵɵelementContainerEnd();
98
+ } if (rf & 2) {
99
+ const entry_r10 = ctx.$implicit;
100
+ i0.ɵɵadvance();
101
+ i0.ɵɵproperty("ngForOf", entry_r10.value);
102
+ } }
103
+ export class EffectCurveComponent {
104
+ // whether the effect is currently being edited (open) or not
105
+ set isSelected(value) {
106
+ if (value) {
107
+ // start the update timer
108
+ if (!this.gridUpdateSubscription) {
109
+ this.gridUpdateSubscription = timer(0, 15).subscribe(() => {
110
+ this.redraw();
111
+ });
112
+ }
113
+ }
114
+ else {
115
+ // stop the update timer
116
+ if (this.gridUpdateSubscription) {
117
+ this.gridUpdateSubscription.unsubscribe();
118
+ this.gridUpdateSubscription = undefined;
119
+ }
120
+ }
121
+ }
122
+ constructor(presetService, animationService, fixtureService, translate) {
123
+ this.presetService = presetService;
124
+ this.animationService = animationService;
125
+ this.fixtureService = fixtureService;
126
+ this.translate = translate;
127
+ this.lengthMillisMin = 20;
128
+ this.lengthMillisMax = 8000;
129
+ this.amplitudeMin = 0;
130
+ this.amplitudeMax = 4;
131
+ this.percentageMin = 0;
132
+ this.percentageMax = 1;
133
+ this.phaseMillisMin = -1000;
134
+ this.phaseMillisMax = 1000;
135
+ this.phasingMillisMin = 0;
136
+ this.phasingMillisMax = 1000;
137
+ // the selected capabilities
138
+ this.availableCapabilities = [];
139
+ // the selected channels
140
+ this.availableChannels = new Map();
141
+ this.availableProfiles = [];
142
+ this.selectedProfiles = [];
143
+ this.presetService.fixtureSelectionChanged.subscribe(() => {
144
+ this.updateCapabilitiesAndChannels();
145
+ });
146
+ this.updateCapabilitiesAndChannels();
147
+ }
148
+ ngOnInit() {
149
+ const canvas = this.curveGrid.nativeElement;
150
+ this.ctx = canvas.getContext('2d');
151
+ this.maxWidth = canvas.width;
152
+ this.maxHeight = canvas.height;
153
+ this.redraw();
154
+ }
155
+ drawCurrentValue(currMillis, radius, lineWidth, durationMillis, maxHeight) {
156
+ const currVal = 1 - this.curve.getValueAtMillis(currMillis);
157
+ const x = (this.maxWidth * (currMillis % durationMillis)) / durationMillis;
158
+ const y = maxHeight * currVal + lineWidth;
159
+ this.ctx.beginPath();
160
+ this.ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
161
+ this.ctx.fillStyle = '#fff';
162
+ this.ctx.fill();
163
+ this.ctx.lineWidth = 1;
164
+ this.ctx.strokeStyle = '#000';
165
+ this.ctx.stroke();
166
+ }
167
+ getPhasingCount() {
168
+ let count = 0;
169
+ const countedFirstDmxChannelPixelKey = [];
170
+ for (const presetFixture of this.presetService.selectedPreset.fixtures) {
171
+ const fixture = this.fixtureService.getFixtureByUuid(presetFixture.fixtureUuid);
172
+ const firstDmxChannelAndFixtureUuid = {
173
+ firstDmxChannel: fixture.dmxFirstChannel,
174
+ pixelKey: presetFixture.pixelKey,
175
+ };
176
+ const exists = countedFirstDmxChannelPixelKey.some((item) => item.firstDmxChannel === firstDmxChannelAndFixtureUuid.firstDmxChannel &&
177
+ ((!item.pixelKey && !firstDmxChannelAndFixtureUuid.pixelKey) || item.pixelKey === firstDmxChannelAndFixtureUuid.pixelKey));
178
+ // don't count it, if it has the same DMX address and pixel key (if available),
179
+ // as an already counted one
180
+ if (!exists) {
181
+ count++;
182
+ countedFirstDmxChannelPixelKey.push(firstDmxChannelAndFixtureUuid);
183
+ }
184
+ }
185
+ return count;
186
+ }
187
+ redraw() {
188
+ this.ctx.clearRect(0, 0, this.maxWidth, this.maxHeight);
189
+ this.ctx.fillStyle = '#fff';
190
+ this.ctx.strokeStyle = '#fff';
191
+ // the width of the lines
192
+ const width = 3;
193
+ this.ctx.lineWidth = width;
194
+ let oldX;
195
+ let oldY;
196
+ let step = 50;
197
+ if (length < 500) {
198
+ step = 5;
199
+ }
200
+ const durationMillis = this.curve.lengthMillis * Math.max(Math.round(4 - this.curve.lengthMillis / 1000), 1);
201
+ const maxHeight = this.maxHeight - width * 2;
202
+ // draw the curve
203
+ for (let i = -step * 2; i < durationMillis + step * 2; i += step) {
204
+ const val = 1 - this.curve.getValueAtMillis(i);
205
+ // Scale the values to the grid dimensions
206
+ const x = (this.maxWidth * i) / durationMillis;
207
+ const y = maxHeight * val + width;
208
+ if (oldY) {
209
+ this.ctx.beginPath();
210
+ this.ctx.moveTo(oldX, oldY);
211
+ this.ctx.lineTo(x, y);
212
+ this.ctx.stroke();
213
+ }
214
+ oldX = x;
215
+ oldY = y;
216
+ }
217
+ // draw the current value
218
+ this.drawCurrentValue(this.animationService.timeMillis % durationMillis, 5, width, durationMillis, maxHeight);
219
+ // draw the phasing values (chase), if required
220
+ let phasingCount = 0;
221
+ if (this.curve.phasingMillis > 0 && this.presetService.selectedPreset) {
222
+ phasingCount = this.getPhasingCount();
223
+ }
224
+ for (let i = 1; i < phasingCount; i++) {
225
+ this.drawCurrentValue((this.animationService.timeMillis - i * this.curve.phasingMillis) % durationMillis, 3, width, durationMillis, maxHeight);
226
+ }
227
+ }
228
+ calculateChannelCapabilities() {
229
+ this.availableChannels = this.presetService.getSelectedProfileChannels(this.selectedProfiles);
230
+ }
231
+ changeProfileSelection($event, profile) {
232
+ if (this.selectedProfiles.indexOf(profile) >= 0) {
233
+ this.selectedProfiles.splice(this.selectedProfiles.indexOf(profile), 1);
234
+ }
235
+ else {
236
+ this.selectedProfiles.push(profile);
237
+ }
238
+ this.calculateChannelCapabilities();
239
+ }
240
+ updateCapabilitiesAndChannels() {
241
+ // capabilities
242
+ this.availableCapabilities = [];
243
+ if (this.presetService.hasCapabilityDimmer()) {
244
+ const capability = new FixtureCapability();
245
+ capability.type = FixtureCapabilityType.Intensity;
246
+ this.availableCapabilities.push(capability);
247
+ }
248
+ if (this.presetService.hasCapabilityColor()) {
249
+ let capability = new FixtureCapability();
250
+ capability.type = FixtureCapabilityType.ColorIntensity;
251
+ capability.color = FixtureCapabilityColor.Red;
252
+ this.availableCapabilities.push(capability);
253
+ capability = new FixtureCapability();
254
+ capability.type = FixtureCapabilityType.ColorIntensity;
255
+ capability.color = FixtureCapabilityColor.Green;
256
+ this.availableCapabilities.push(capability);
257
+ capability = new FixtureCapability();
258
+ capability.type = FixtureCapabilityType.ColorIntensity;
259
+ capability.color = FixtureCapabilityColor.Blue;
260
+ this.availableCapabilities.push(capability);
261
+ }
262
+ if (this.presetService.hasCapabilityPanTilt()) {
263
+ let capability = new FixtureCapability();
264
+ capability.type = FixtureCapabilityType.Pan;
265
+ this.availableCapabilities.push(capability);
266
+ capability = new FixtureCapability();
267
+ capability.type = FixtureCapabilityType.Tilt;
268
+ this.availableCapabilities.push(capability);
269
+ }
270
+ // calculate all profiles
271
+ this.availableProfiles = this.presetService.getSelectedProfiles();
272
+ // select all profiles by default
273
+ this.selectedProfiles = [...this.availableProfiles];
274
+ // calculate all channels
275
+ this.calculateChannelCapabilities();
276
+ }
277
+ getCapabilityName(capability) {
278
+ return this.translate
279
+ .get(['designer.fixtureCapabilityType.' + capability.type, 'designer.fixtureCapabilityColor.' + capability.color])
280
+ .pipe(map((result) => {
281
+ let name = '';
282
+ name += result['designer.fixtureCapabilityType.' + capability.type];
283
+ if (capability.color) {
284
+ name += ', ' + result['designer.fixtureCapabilityColor.' + capability.color];
285
+ }
286
+ else {
287
+ return name;
288
+ }
289
+ return name;
290
+ }));
291
+ }
292
+ capabilityChecked(capability) {
293
+ for (const existingCapability of this.curve.capabilities) {
294
+ if (this.fixtureService.capabilitiesMatch(existingCapability.type, capability.type, existingCapability.color, capability.color, null, null, null, null)) {
295
+ return true;
296
+ }
297
+ }
298
+ return false;
299
+ }
300
+ toggleCapability(event, capability) {
301
+ if (event.currentTarget.checked) {
302
+ // add the capability
303
+ this.curve.capabilities.push(capability);
304
+ }
305
+ else {
306
+ // Remove the channel
307
+ for (let i = 0; i < this.curve.capabilities.length; i++) {
308
+ const existingCapability = this.curve.capabilities[i];
309
+ if (this.fixtureService.capabilitiesMatch(existingCapability.type, capability.type, existingCapability.color, capability.color, null, null, null, null)) {
310
+ this.curve.capabilities.splice(i, 1);
311
+ }
312
+ }
313
+ }
314
+ this.presetService.previewLive();
315
+ }
316
+ getChannelName(profileName, channelName) {
317
+ if (this.availableProfiles.length > 1) {
318
+ return profileName + ' - ' + channelName;
319
+ }
320
+ return channelName;
321
+ }
322
+ channelChecked(profile, channel) {
323
+ for (const profileChannels of this.curve.channels) {
324
+ if (profileChannels.profileUuid === profile.uuid) {
325
+ if (profileChannels.channels.includes(channel.name)) {
326
+ return true;
327
+ }
328
+ break;
329
+ }
330
+ }
331
+ return false;
332
+ }
333
+ toggleChannel(event, profile, channel) {
334
+ // add the profile, if necessary
335
+ let profileContained = false;
336
+ for (const profileChannels of this.curve.channels) {
337
+ if (profileChannels.profileUuid === profile.uuid) {
338
+ profileContained = true;
339
+ break;
340
+ }
341
+ }
342
+ if (!profileContained) {
343
+ const profileChannels = new EffectCurveProfileChannels();
344
+ profileChannels.profileUuid = profile.uuid;
345
+ this.curve.channels.push(profileChannels);
346
+ }
347
+ // add or delete the channel
348
+ for (const profileChannels of this.curve.channels) {
349
+ if (profileChannels.profileUuid === profile.uuid) {
350
+ const index = profileChannels.channels.indexOf(channel.name);
351
+ if (index >= 0) {
352
+ profileChannels.channels.splice(index, 1);
353
+ }
354
+ else {
355
+ profileChannels.channels.push(channel.name);
356
+ }
357
+ break;
358
+ }
359
+ }
360
+ this.presetService.previewLive();
361
+ }
362
+ setLengthMillis(value) {
363
+ if (!isNaN(value) && value >= this.lengthMillisMin && value <= this.lengthMillisMax) {
364
+ this.curve.lengthMillis = +value;
365
+ this.presetService.previewLive();
366
+ }
367
+ }
368
+ setAmplitude(value) {
369
+ if (!isNaN(value) && value >= this.amplitudeMin && value <= this.amplitudeMax) {
370
+ this.curve.amplitude = +value;
371
+ this.presetService.previewLive();
372
+ }
373
+ }
374
+ setPosition(value) {
375
+ if (!isNaN(value) && value >= this.percentageMin && value <= this.percentageMax) {
376
+ this.curve.position = +value;
377
+ this.presetService.previewLive();
378
+ }
379
+ }
380
+ setPhaseMillis(value) {
381
+ if (!isNaN(value) && value >= this.phaseMillisMin && value <= this.phaseMillisMax) {
382
+ this.curve.phaseMillis = +value;
383
+ this.presetService.previewLive();
384
+ }
385
+ }
386
+ setPhasingMillis(value) {
387
+ if (!isNaN(value) && value >= this.phasingMillisMin && value <= this.phasingMillisMax) {
388
+ this.curve.phasingMillis = +value;
389
+ this.presetService.previewLive();
390
+ }
391
+ }
392
+ static { this.ɵfac = function EffectCurveComponent_Factory(t) { return new (t || EffectCurveComponent)(i0.ɵɵdirectiveInject(i1.PresetService), i0.ɵɵdirectiveInject(i2.AnimationService), i0.ɵɵdirectiveInject(i3.FixtureService), i0.ɵɵdirectiveInject(i4.TranslateService)); }; }
393
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EffectCurveComponent, selectors: [["lib-app-effect-curve"]], viewQuery: function EffectCurveComponent_Query(rf, ctx) { if (rf & 1) {
394
+ i0.ɵɵviewQuery(_c0, 7);
395
+ } if (rf & 2) {
396
+ let _t;
397
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.curveGrid = _t.first);
398
+ } }, inputs: { curve: "curve", isSelected: "isSelected" }, decls: 78, vars: 83, consts: [["curveGrid", ""], [1, "mr-3", 2, "float", "left"], [1, "mb-2"], [2, "width", "200px", "height", "20px", 3, "ngModelChange", "ngModel"], [3, "value"], ["width", "200", "height", "100", "viewBox", "150 -75 4850 5150", "preserveAspectRatio", "none", 1, "curve-grid"], [1, "mr-4", 2, "float", "left"], [1, "d-flex"], [1, "my-auto", 2, "width", "100px", "float", "left"], [1, "my-auto", 2, "float", "left"], [2, "width", "80px", 3, "change", "valueChange", "value", "tooltip", "value", "min", "max", "step"], [1, "my-auto"], ["type", "text", 1, "slider-input", 3, "ngModelChange", "ngModel"], [1, "my-auto", "ml-1"], [2, "width", "80px", 3, "change", "valueChange", "value", "tooltip", "min", "max", "step"], [2, "width", "80px", "height", "18px", 3, "change", "valueChange", "value", "tooltip", "min", "max", "step"], [1, "col", "col-auto", "p-0", 2, "margin-right", "1px", "width", "50px", "float", "left"], ["id", "v-pills-tab", "role", "tablist", "aria-orientation", "vertical", 1, "nav", "flex-column", "nav-pills"], ["id", "v-pills-effect-capabilities-tab", "container", "body", "placement", "right", "triggers", "mouseenter:mouseleave", "data-toggle", "pill", "role", "tab", "aria-controls", "v-pills-capabilities", "aria-selected", "true", 1, "nav-link", "px-3", "active", 3, "popover", "href"], ["aria-hidden", "true", 1, "fa", "fa-bolt", "fa-fw"], ["id", "v-pills-effect-channels-tab", "container", "body", "placement", "right", "triggers", "mouseenter:mouseleave", "data-toggle", "pill", "role", "tab", "aria-controls", "v-pills-channels", "aria-selected", "false", 1, "nav-link", "px-3", 3, "popover", "href"], ["aria-hidden", "true", 1, "fa", "fa-sliders", "fa-fw"], [1, "applying-to"], ["id", "v-pills-tabContent", 1, "tab-content", "h-100"], ["role", "tabpanel", 1, "tab-pane", "h-100", "show", "active", 3, "id"], ["class", "form-check", 4, "ngFor", "ngForOf"], ["role", "tabpanel", 1, "tab-pane", "h-100", "show", 3, "id"], [4, "ngIf"], [4, "ngFor", "ngForOf"], [1, "form-check"], ["type", "checkbox", 1, "form-check-input", 3, "change", "id", "ngModel"], [1, "form-check-label", 3, "for"], [1, "my-1", 2, "border-color", "white"]], template: function EffectCurveComponent_Template(rf, ctx) { if (rf & 1) {
399
+ const _r1 = i0.ɵɵgetCurrentView();
400
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "select", 3);
401
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_select_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r1); ctx.curve.curveType = $event; return i0.ɵɵresetView(ctx.presetService.previewLive()); });
402
+ i0.ɵɵelementStart(3, "option", 4);
403
+ i0.ɵɵtext(4);
404
+ i0.ɵɵpipe(5, "translate");
405
+ i0.ɵɵelementEnd();
406
+ i0.ɵɵelementStart(6, "option", 4);
407
+ i0.ɵɵtext(7);
408
+ i0.ɵɵpipe(8, "translate");
409
+ i0.ɵɵelementEnd()()();
410
+ i0.ɵɵelementStart(9, "div");
411
+ i0.ɵɵelement(10, "canvas", 5, 0);
412
+ i0.ɵɵelementEnd()();
413
+ i0.ɵɵelementStart(12, "div", 6)(13, "div", 7)(14, "div", 8);
414
+ i0.ɵɵtext(15);
415
+ i0.ɵɵpipe(16, "translate");
416
+ i0.ɵɵelementEnd();
417
+ i0.ɵɵelementStart(17, "div", 9)(18, "mv-slider", 10);
418
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_18_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
419
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_18_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.lengthMillis, $event) || (ctx.curve.lengthMillis = $event); return i0.ɵɵresetView($event); });
420
+ i0.ɵɵelementEnd()();
421
+ i0.ɵɵelementStart(19, "div", 11)(20, "input", 12);
422
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setLengthMillis($event); return i0.ɵɵresetView(ctx.redraw()); });
423
+ i0.ɵɵelementEnd()();
424
+ i0.ɵɵelementStart(21, "div", 13);
425
+ i0.ɵɵtext(22);
426
+ i0.ɵɵpipe(23, "translate");
427
+ i0.ɵɵelementEnd()();
428
+ i0.ɵɵelementStart(24, "div", 7)(25, "div", 8);
429
+ i0.ɵɵtext(26);
430
+ i0.ɵɵpipe(27, "translate");
431
+ i0.ɵɵelementEnd();
432
+ i0.ɵɵelementStart(28, "div", 9)(29, "mv-slider", 14);
433
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_29_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
434
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_29_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.amplitude, $event) || (ctx.curve.amplitude = $event); return i0.ɵɵresetView($event); });
435
+ i0.ɵɵelementEnd()();
436
+ i0.ɵɵelementStart(30, "div", 11)(31, "input", 12);
437
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_31_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setAmplitude($event); return i0.ɵɵresetView(ctx.redraw()); });
438
+ i0.ɵɵelementEnd()()();
439
+ i0.ɵɵelementStart(32, "div", 7)(33, "div", 8);
440
+ i0.ɵɵtext(34);
441
+ i0.ɵɵpipe(35, "translate");
442
+ i0.ɵɵelementEnd();
443
+ i0.ɵɵelementStart(36, "div", 9)(37, "mv-slider", 15);
444
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_37_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
445
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_37_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.position, $event) || (ctx.curve.position = $event); return i0.ɵɵresetView($event); });
446
+ i0.ɵɵelementEnd()();
447
+ i0.ɵɵelementStart(38, "div", 11)(39, "input", 12);
448
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setPosition($event); return i0.ɵɵresetView(ctx.redraw()); });
449
+ i0.ɵɵelementEnd()()();
450
+ i0.ɵɵelementStart(40, "div", 7)(41, "div", 8);
451
+ i0.ɵɵtext(42);
452
+ i0.ɵɵpipe(43, "translate");
453
+ i0.ɵɵelementEnd();
454
+ i0.ɵɵelementStart(44, "div", 9)(45, "mv-slider", 15);
455
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_45_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
456
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_45_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.phaseMillis, $event) || (ctx.curve.phaseMillis = $event); return i0.ɵɵresetView($event); });
457
+ i0.ɵɵelementEnd()();
458
+ i0.ɵɵelementStart(46, "div", 11)(47, "input", 12);
459
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_47_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setPhaseMillis($event); return i0.ɵɵresetView(ctx.redraw()); });
460
+ i0.ɵɵelementEnd()();
461
+ i0.ɵɵelementStart(48, "div", 13);
462
+ i0.ɵɵtext(49);
463
+ i0.ɵɵpipe(50, "translate");
464
+ i0.ɵɵelementEnd()();
465
+ i0.ɵɵelementStart(51, "div", 7)(52, "div", 8);
466
+ i0.ɵɵtext(53);
467
+ i0.ɵɵpipe(54, "translate");
468
+ i0.ɵɵelementEnd();
469
+ i0.ɵɵelementStart(55, "div", 9)(56, "mv-slider", 15);
470
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_56_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
471
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_56_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.phasingMillis, $event) || (ctx.curve.phasingMillis = $event); return i0.ɵɵresetView($event); });
472
+ i0.ɵɵelementEnd()();
473
+ i0.ɵɵelementStart(57, "div", 11)(58, "input", 12);
474
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_58_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setPhasingMillis($event); return i0.ɵɵresetView(ctx.redraw()); });
475
+ i0.ɵɵelementEnd()();
476
+ i0.ɵɵelementStart(59, "div", 13);
477
+ i0.ɵɵtext(60);
478
+ i0.ɵɵpipe(61, "translate");
479
+ i0.ɵɵelementEnd()()();
480
+ i0.ɵɵelementStart(62, "div", 16)(63, "div", 17)(64, "a", 18);
481
+ i0.ɵɵpipe(65, "translate");
482
+ i0.ɵɵelement(66, "i", 19);
483
+ i0.ɵɵelementEnd();
484
+ i0.ɵɵelementStart(67, "a", 20);
485
+ i0.ɵɵpipe(68, "translate");
486
+ i0.ɵɵelement(69, "i", 21);
487
+ i0.ɵɵelementEnd()()();
488
+ i0.ɵɵelementStart(70, "div", 22)(71, "div", 23)(72, "div", 24);
489
+ i0.ɵɵtemplate(73, EffectCurveComponent_div_73_Template, 5, 8, "div", 25);
490
+ i0.ɵɵelementEnd();
491
+ i0.ɵɵelementStart(74, "div", 26);
492
+ i0.ɵɵtemplate(75, EffectCurveComponent_div_75_Template, 3, 1, "div", 27)(76, EffectCurveComponent_ng_container_76_Template, 2, 1, "ng-container", 28);
493
+ i0.ɵɵpipe(77, "keyvalue");
494
+ i0.ɵɵelementEnd()()();
495
+ } if (rf & 2) {
496
+ i0.ɵɵadvance(2);
497
+ i0.ɵɵproperty("ngModel", ctx.curve.curveType);
498
+ i0.ɵɵadvance();
499
+ i0.ɵɵproperty("value", "sine");
500
+ i0.ɵɵadvance();
501
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 57, "designer.effect.curve-sine"), " ");
502
+ i0.ɵɵadvance(2);
503
+ i0.ɵɵproperty("value", "square");
504
+ i0.ɵɵadvance();
505
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 59, "designer.effect.curve-square"), " ");
506
+ i0.ɵɵadvance(8);
507
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(16, 61, "designer.effect.curve-length"), " ");
508
+ i0.ɵɵadvance(3);
509
+ i0.ɵɵtwoWayProperty("value", ctx.curve.lengthMillis);
510
+ i0.ɵɵproperty("tooltip", "hide")("value", 0)("min", ctx.lengthMillisMin)("max", ctx.lengthMillisMax)("step", 1);
511
+ i0.ɵɵadvance(2);
512
+ i0.ɵɵproperty("ngModel", ctx.curve.lengthMillis);
513
+ i0.ɵɵadvance(2);
514
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 63, "designer.misc.ms"), " ");
515
+ i0.ɵɵadvance(4);
516
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(27, 65, "designer.effect.curve-amplitude"), " ");
517
+ i0.ɵɵadvance(3);
518
+ i0.ɵɵtwoWayProperty("value", ctx.curve.amplitude);
519
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.amplitudeMin)("max", ctx.amplitudeMax)("step", 0.01);
520
+ i0.ɵɵadvance(2);
521
+ i0.ɵɵproperty("ngModel", ctx.curve.amplitude);
522
+ i0.ɵɵadvance(3);
523
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(35, 67, "designer.effect.curve-position"), " ");
524
+ i0.ɵɵadvance(3);
525
+ i0.ɵɵtwoWayProperty("value", ctx.curve.position);
526
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.percentageMin)("max", ctx.percentageMax)("step", 0.01);
527
+ i0.ɵɵadvance(2);
528
+ i0.ɵɵproperty("ngModel", ctx.curve.position);
529
+ i0.ɵɵadvance(3);
530
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(43, 69, "designer.effect.curve-phase"), " ");
531
+ i0.ɵɵadvance(3);
532
+ i0.ɵɵtwoWayProperty("value", ctx.curve.phaseMillis);
533
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.phaseMillisMin)("max", ctx.phaseMillisMax)("step", 1);
534
+ i0.ɵɵadvance(2);
535
+ i0.ɵɵproperty("ngModel", ctx.curve.phaseMillis);
536
+ i0.ɵɵadvance(2);
537
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(50, 71, "designer.misc.ms"), " ");
538
+ i0.ɵɵadvance(4);
539
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 73, "designer.effect.curve-chase"), " ");
540
+ i0.ɵɵadvance(3);
541
+ i0.ɵɵtwoWayProperty("value", ctx.curve.phasingMillis);
542
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.phasingMillisMin)("max", ctx.phasingMillisMax)("step", 1);
543
+ i0.ɵɵadvance(2);
544
+ i0.ɵɵproperty("ngModel", ctx.curve.phasingMillis);
545
+ i0.ɵɵadvance(2);
546
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(61, 75, "designer.misc.ms"), " ");
547
+ i0.ɵɵadvance(4);
548
+ i0.ɵɵpropertyInterpolate("popover", i0.ɵɵpipeBind1(65, 77, "designer.misc.capabilities"));
549
+ i0.ɵɵpropertyInterpolate1("href", "#v-pills-effect-capabilities-", ctx.curve == null ? null : ctx.curve.uuid, "", i0.ɵɵsanitizeUrl);
550
+ i0.ɵɵadvance(3);
551
+ i0.ɵɵpropertyInterpolate("popover", i0.ɵɵpipeBind1(68, 79, "designer.misc.channels"));
552
+ i0.ɵɵpropertyInterpolate1("href", "#v-pills-effect-channels-", ctx.curve == null ? null : ctx.curve.uuid, "", i0.ɵɵsanitizeUrl);
553
+ i0.ɵɵadvance(5);
554
+ i0.ɵɵpropertyInterpolate1("id", "v-pills-effect-capabilities-", ctx.curve == null ? null : ctx.curve.uuid, "");
555
+ i0.ɵɵadvance();
556
+ i0.ɵɵproperty("ngForOf", ctx.availableCapabilities);
557
+ i0.ɵɵadvance();
558
+ i0.ɵɵpropertyInterpolate1("id", "v-pills-effect-channels-", ctx.curve == null ? null : ctx.curve.uuid, "");
559
+ i0.ɵɵadvance();
560
+ i0.ɵɵproperty("ngIf", ctx.availableProfiles.length > 1);
561
+ i0.ɵɵadvance();
562
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(77, 81, ctx.availableChannels));
563
+ } }, dependencies: [i5.NgForOf, i5.NgIf, i6.NgSelectOption, i6.ɵNgSelectMultipleOption, i6.DefaultValueAccessor, i6.CheckboxControlValueAccessor, i6.SelectControlValueAccessor, i6.NgControlStatus, i6.NgModel, i7.SliderComponent, i8.PopoverDirective, i5.AsyncPipe, i5.KeyValuePipe, i4.TranslatePipe], styles: [".curve-grid[_ngcontent-%COMP%]{background-color:#000;border:1px solid white}.applying-to[_ngcontent-%COMP%]{overflow-y:scroll;height:130px!important;background-color:#222;border:1px solid white;padding:.5rem}.applying-to[_ngcontent-%COMP%] .form-check[_ngcontent-%COMP%]:last-child{margin-bottom:.5rem}"] }); }
564
+ }
565
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EffectCurveComponent, [{
566
+ type: Component,
567
+ args: [{ selector: 'lib-app-effect-curve', template: "<div class=\"mr-3\" style=\"float: left\">\n <div class=\"mb-2\">\n <select\n [ngModel]=\"curve.curveType\"\n (ngModelChange)=\"curve.curveType = $event; presetService.previewLive()\"\n style=\"width: 200px; height: 20px\"\n >\n <option [value]=\"'sine'\">\n {{ 'designer.effect.curve-sine' | translate }}\n </option>\n <option [value]=\"'square'\">\n {{ 'designer.effect.curve-square' | translate }}\n </option>\n <!-- <option [value]=\"'triangle'\">\n {{ 'designer.effect.curve-triangle' | translate }}</option>\n <option [value]=\"'sawtooth'\">\n {{ 'designer.effect.curve-sawtooth' | translate }}</option>\n <option [value]=\"'reverse-sawtooth'\">\n {{ 'designer.effect.curve-reverse-sawtooth' | translate }}</option> -->\n </select>\n </div>\n <div>\n <canvas #curveGrid class=\"curve-grid\" width=\"200\" height=\"100\" viewBox=\"150 -75 4850 5150\" preserveAspectRatio=\"none\"></canvas>\n </div>\n</div>\n\n<div class=\"mr-4\" style=\"float: left\">\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-length' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.lengthMillis\"\n style=\"width: 80px\"\n [tooltip]=\"'hide'\"\n [value]=\"0\"\n [min]=\"lengthMillisMin\"\n [max]=\"lengthMillisMax\"\n [step]=\"1\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.lengthMillis\" (ngModelChange)=\"setLengthMillis($event); redraw()\" />\n </div>\n <div class=\"my-auto ml-1\">\n {{ 'designer.misc.ms' | translate }}\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-amplitude' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.amplitude\"\n style=\"width: 80px\"\n [tooltip]=\"'hide'\"\n [min]=\"amplitudeMin\"\n [max]=\"amplitudeMax\"\n [step]=\"0.01\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.amplitude\" (ngModelChange)=\"setAmplitude($event); redraw()\" />\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-position' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.position\"\n style=\"width: 80px; height: 18px\"\n [tooltip]=\"'hide'\"\n [min]=\"percentageMin\"\n [max]=\"percentageMax\"\n [step]=\"0.01\"\n >\n </mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.position\" (ngModelChange)=\"setPosition($event); redraw()\" />\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-phase' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.phaseMillis\"\n style=\"width: 80px; height: 18px\"\n [tooltip]=\"'hide'\"\n [min]=\"phaseMillisMin\"\n [max]=\"phaseMillisMax\"\n [step]=\"1\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.phaseMillis\" (ngModelChange)=\"setPhaseMillis($event); redraw()\" />\n </div>\n <div class=\"my-auto ml-1\">\n {{ 'designer.misc.ms' | translate }}\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-chase' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.phasingMillis\"\n style=\"width: 80px; height: 18px\"\n [tooltip]=\"'hide'\"\n [min]=\"phasingMillisMin\"\n [max]=\"phasingMillisMax\"\n [step]=\"1\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.phasingMillis\" (ngModelChange)=\"setPhasingMillis($event); redraw()\" />\n </div>\n <div class=\"my-auto ml-1\">\n {{ 'designer.misc.ms' | translate }}\n </div>\n </div>\n</div>\n\n<!-- Menu for the capabilities and channels-->\n<div class=\"col col-auto p-0\" style=\"margin-right: 1px; width: 50px; float: left\">\n <div class=\"nav flex-column nav-pills\" id=\"v-pills-tab\" role=\"tablist\" aria-orientation=\"vertical\">\n <a\n class=\"nav-link px-3 active\"\n id=\"v-pills-effect-capabilities-tab\"\n popover=\"{{ 'designer.misc.capabilities' | translate }}\"\n container=\"body\"\n placement=\"right\"\n triggers=\"mouseenter:mouseleave\"\n data-toggle=\"pill\"\n href=\"#v-pills-effect-capabilities-{{ curve?.uuid }}\"\n role=\"tab\"\n aria-controls=\"v-pills-capabilities\"\n aria-selected=\"true\"\n >\n <i class=\"fa fa-bolt fa-fw\" aria-hidden=\"true\"></i>\n </a>\n <a\n class=\"nav-link px-3\"\n id=\"v-pills-effect-channels-tab\"\n popover=\"{{ 'designer.misc.channels' | translate }}\"\n container=\"body\"\n placement=\"right\"\n triggers=\"mouseenter:mouseleave\"\n data-toggle=\"pill\"\n href=\"#v-pills-effect-channels-{{ curve?.uuid }}\"\n role=\"tab\"\n aria-controls=\"v-pills-channels\"\n aria-selected=\"false\"\n >\n <i class=\"fa fa-sliders fa-fw\" aria-hidden=\"true\"></i>\n </a>\n </div>\n</div>\n\n<div class=\"h-100\" class=\"applying-to\">\n <div class=\"tab-content h-100\" id=\"v-pills-tabContent\">\n <div class=\"tab-pane h-100 show active\" id=\"v-pills-effect-capabilities-{{ curve?.uuid }}\" role=\"tabpanel\">\n <!-- Capabilities-->\n <div *ngFor=\"let capability of availableCapabilities; let i = index\" class=\"form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n id=\"capability_{{ curve?.uuid + '_' + i }}\"\n [ngModel]=\"capabilityChecked(capability)\"\n (change)=\"toggleCapability($event, capability)\"\n />\n <label class=\"form-check-label\" for=\"capability_{{ curve?.uuid + '_' + i }}\">{{ getCapabilityName(capability) | async }}</label>\n </div>\n </div>\n <div class=\"tab-pane h-100 show\" id=\"v-pills-effect-channels-{{ curve?.uuid }}\" role=\"tabpanel\">\n <!-- channels -->\n\n <!-- profile selection -->\n <div *ngIf=\"availableProfiles.length > 1\">\n <div *ngFor=\"let profile of availableProfiles; let i = index\" class=\"form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n id=\"channel_profile_{{ curve?.uuid }}_{{ profile.uuid }}\"\n [ngModel]=\"selectedProfiles.indexOf(profile) >= 0\"\n (change)=\"changeProfileSelection($event, profile)\"\n />\n <label class=\"form-check-label\" for=\"channel_profile_{{ curve?.uuid }}_{{ profile.uuid }}\">{{ profile.name }}</label>\n </div>\n\n <hr class=\"my-1\" style=\"border-color: white\" />\n </div>\n\n <!-- channels -->\n <ng-container *ngFor=\"let entry of availableChannels | keyvalue; let i = index\">\n <div *ngFor=\"let channel of entry.value; let j = index\" class=\"form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n id=\"channel_{{ curve?.uuid }}_{{ i }}_{{ j }}\"\n [ngModel]=\"channelChecked(entry.key, channel)\"\n (change)=\"toggleChannel($event, entry.key, channel)\"\n />\n <label class=\"form-check-label\" for=\"channel_{{ curve?.uuid }}_{{ i }}_{{ j }}\">{{\n getChannelName(entry.key.name, channel.name)\n }}</label>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [".curve-grid{background-color:#000;border:1px solid white}.applying-to{overflow-y:scroll;height:130px!important;background-color:#222;border:1px solid white;padding:.5rem}.applying-to .form-check:last-child{margin-bottom:.5rem}\n"] }]
568
+ }], () => [{ type: i1.PresetService }, { type: i2.AnimationService }, { type: i3.FixtureService }, { type: i4.TranslateService }], { curve: [{
569
+ type: Input
570
+ }], isSelected: [{
571
+ type: Input
572
+ }], curveGrid: [{
573
+ type: ViewChild,
574
+ args: ['curveGrid', { static: true }]
575
+ }] }); })();
576
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EffectCurveComponent, { className: "EffectCurveComponent" }); })();
577
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LWN1cnZlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZWZmZWN0L2VmZmVjdC1jdXJ2ZS9lZmZlY3QtY3VydmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9lZmZlY3QvZWZmZWN0LWN1cnZlL2VmZmVjdC1jdXJ2ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBNEIsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7OztJQ3lLOUQsQUFERiwrQkFBd0YsZ0JBT3BGO0lBREEsd05BQVUsOENBQW9DLEtBQUM7SUFMakQsaUJBTUU7SUFDRixpQ0FBNkU7SUFBQSxZQUEyQzs7SUFDMUgsQUFEMEgsaUJBQVEsRUFDNUg7Ozs7O0lB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LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNoYW5uZWwnO1xuaW1wb3J0IHsgRWZmZWN0Q3VydmVQcm9maWxlQ2hhbm5lbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvZWZmZWN0LWN1cnZlLXByb2ZpbGUtY2hhbm5lbCc7XG5pbXBvcnQgeyBGaXh0dXJlQ2FwYWJpbGl0eSwgRml4dHVyZUNhcGFiaWxpdHlDb2xvciwgRml4dHVyZUNhcGFiaWxpdHlUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpeHR1cmUtY2FwYWJpbGl0eSc7XG5pbXBvcnQgeyBGaXh0dXJlUHJvZmlsZSB9IGZyb20gJy4uLy4uL21vZGVscy9maXh0dXJlLXByb2ZpbGUnO1xuaW1wb3J0IHsgRml4dHVyZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maXh0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlc2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ByZXNldC5zZXJ2aWNlJztcbmltcG9ydCB7IEVmZmVjdEN1cnZlIH0gZnJvbSAnLi8uLi8uLi9tb2RlbHMvZWZmZWN0LWN1cnZlJztcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL2FuaW1hdGlvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFwcC1lZmZlY3QtY3VydmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZWZmZWN0LWN1cnZlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZWZmZWN0LWN1cnZlLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRWZmZWN0Q3VydmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGdyaWRVcGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdHg6IGFueTtcbiAgcHJpdmF0ZSBtYXhXaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIG1heEhlaWdodDogbnVtYmVyO1xuXG4gIHB1YmxpYyBsZW5ndGhNaWxsaXNNaW4gPSAyMDtcbiAgcHVibGljIGxlbmd0aE1pbGxpc01heCA9IDgwMDA7XG4gIHB1YmxpYyBhbXBsaXR1ZGVNaW4gPSAwO1xuICBwdWJsaWMgYW1wbGl0dWRlTWF4ID0gNDtcbiAgcHVibGljIHBlcmNlbnRhZ2VNaW4gPSAwO1xuICBwdWJsaWMgcGVyY2VudGFnZU1heCA9IDE7XG4gIHB1YmxpYyBwaGFzZU1pbGxpc01pbiA9IC0xMDAwO1xuICBwdWJsaWMgcGhhc2VNaWxsaXNNYXggPSAxMDAwO1xuICBwdWJsaWMgcGhhc2luZ01pbGxpc01pbiA9IDA7XG4gIHB1YmxpYyBwaGFzaW5nTWlsbGlzTWF4ID0gMTAwMDtcblxuICAvLyB0aGUgc2VsZWN0ZWQgY2FwYWJpbGl0aWVzXG4gIHB1YmxpYyBhdmFpbGFibGVDYXBhYmlsaXRpZXM6IEZpeHR1cmVDYXBhYmlsaXR5W10gPSBbXTtcblxuICAvLyB0aGUgc2VsZWN0ZWQgY2hhbm5lbHNcbiAgcHVibGljIGF2YWlsYWJsZUNoYW5uZWxzOiBNYXA8Rml4dHVyZVByb2ZpbGUsIENhY2hlZEZpeHR1cmVDaGFubmVsW10+ID0gbmV3IE1hcDxGaXh0dXJlUHJvZmlsZSwgQ2FjaGVkRml4dHVyZUNoYW5uZWxbXT4oKTtcbiAgcHVibGljIGF2YWlsYWJsZVByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdID0gW107XG4gIHB1YmxpYyBzZWxlY3RlZFByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdID0gW107XG5cbiAgQElucHV0KCkgY3VydmU6IEVmZmVjdEN1cnZlO1xuXG4gIC8vIHdoZXRoZXIgdGhlIGVmZmVjdCBpcyBjdXJyZW50bHkgYmVpbmcgZWRpdGVkIChvcGVuKSBvciBub3RcbiAgQElucHV0KClcbiAgc2V0IGlzU2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIC8vIHN0YXJ0IHRoZSB1cGRhdGUgdGltZXJcbiAgICAgIGlmICghdGhpcy5ncmlkVXBkYXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuZ3JpZFVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRpbWVyKDAsIDE1KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzdG9wIHRoZSB1cGRhdGUgdGltZXJcbiAgICAgIGlmICh0aGlzLmdyaWRVcGRhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5ncmlkVXBkYXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZ3JpZFVwZGF0ZVN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAVmlld0NoaWxkKCdjdXJ2ZUdyaWQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjdXJ2ZUdyaWQ6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHByZXNldFNlcnZpY2U6IFByZXNldFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbmltYXRpb25TZXJ2aWNlOiBBbmltYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5maXh0dXJlU2VsZWN0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVDYXBhYmlsaXRpZXNBbmRDaGFubmVscygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVDYXBhYmlsaXRpZXNBbmRDaGFubmVscygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jdXJ2ZUdyaWQubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMubWF4V2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgdGhpcy5tYXhIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0N1cnJlbnRWYWx1ZShjdXJyTWlsbGlzOiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgZHVyYXRpb25NaWxsaXM6IG51bWJlciwgbWF4SGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjdXJyVmFsID0gMSAtIHRoaXMuY3VydmUuZ2V0VmFsdWVBdE1pbGxpcyhjdXJyTWlsbGlzKTtcblxuICAgIGNvbnN0IHggPSAodGhpcy5tYXhXaWR0aCAqIChjdXJyTWlsbGlzICUgZHVyYXRpb25NaWxsaXMpKSAvIGR1cmF0aW9uTWlsbGlzO1xuICAgIGNvbnN0IHkgPSBtYXhIZWlnaHQgKiBjdXJyVmFsICsgbGluZVdpZHRoO1xuXG4gICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgdGhpcy5jdHguYXJjKHgsIHksIHJhZGl1cywgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSAnI2ZmZic7XG4gICAgdGhpcy5jdHguZmlsbCgpO1xuICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAnIzAwMCc7XG4gICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBoYXNpbmdDb3VudCgpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3QgY291bnRlZEZpcnN0RG14Q2hhbm5lbFBpeGVsS2V5OiBhbnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwcmVzZXRGaXh0dXJlIG9mIHRoaXMucHJlc2V0U2VydmljZS5zZWxlY3RlZFByZXNldC5maXh0dXJlcykge1xuICAgICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUJ5VXVpZChwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkKTtcbiAgICAgIGNvbnN0IGZpcnN0RG14Q2hhbm5lbEFuZEZpeHR1cmVVdWlkID0ge1xuICAgICAgICBmaXJzdERteENoYW5uZWw6IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsLFxuICAgICAgICBwaXhlbEtleTogcHJlc2V0Rml4dHVyZS5waXhlbEtleSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGV4aXN0cyA9IGNvdW50ZWRGaXJzdERteENoYW5uZWxQaXhlbEtleS5zb21lKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICBpdGVtLmZpcnN0RG14Q2hhbm5lbCA9PT0gZmlyc3REbXhDaGFubmVsQW5kRml4dHVyZVV1aWQuZmlyc3REbXhDaGFubmVsICYmXG4gICAgICAgICAgKCghaXRlbS5waXhlbEtleSAmJiAhZmlyc3REbXhDaGFubmVsQW5kRml4dHVyZVV1aWQucGl4ZWxLZXkpIHx8IGl0ZW0ucGl4ZWxLZXkgPT09IGZpcnN0RG14Q2hhbm5lbEFuZEZpeHR1cmVVdWlkLnBpeGVsS2V5KVxuICAgICAgKTtcblxuICAgICAgLy8gZG9uJ3QgY291bnQgaXQsIGlmIGl0IGhhcyB0aGUgc2FtZSBETVggYWRkcmVzcyBhbmQgcGl4ZWwga2V5IChpZiBhdmFpbGFibGUpLFxuICAgICAgLy8gYXMgYW4gYWxyZWFkeSBjb3VudGVkIG9uZVxuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgY291bnRlZEZpcnN0RG14Q2hhbm5lbFBpeGVsS2V5LnB1c2goZmlyc3REbXhDaGFubmVsQW5kRml4dHVyZVV1aWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIHJlZHJhdygpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5tYXhXaWR0aCwgdGhpcy5tYXhIZWlnaHQpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9ICcjZmZmJztcbiAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9ICcjZmZmJztcblxuICAgIC8vIHRoZSB3aWR0aCBvZiB0aGUgbGluZXNcbiAgICBjb25zdCB3aWR0aCA9IDM7XG5cbiAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB3aWR0aDtcblxuICAgIGxldCBvbGRYOiBudW1iZXI7XG4gICAgbGV0IG9sZFk6IG51bWJlcjtcblxuICAgIGxldCBzdGVwID0gNTA7XG5cbiAgICBpZiAobGVuZ3RoIDwgNTAwKSB7XG4gICAgICBzdGVwID0gNTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpcyA9IHRoaXMuY3VydmUubGVuZ3RoTWlsbGlzICogTWF0aC5tYXgoTWF0aC5yb3VuZCg0IC0gdGhpcy5jdXJ2ZS5sZW5ndGhNaWxsaXMgLyAxMDAwKSwgMSk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgLSB3aWR0aCAqIDI7XG5cbiAgICAvLyBkcmF3IHRoZSBjdXJ2ZVxuICAgIGZvciAobGV0IGkgPSAtc3RlcCAqIDI7IGkgPCBkdXJhdGlvbk1pbGxpcyArIHN0ZXAgKiAyOyBpICs9IHN0ZXApIHtcbiAgICAgIGNvbnN0IHZhbCA9IDEgLSB0aGlzLmN1cnZlLmdldFZhbHVlQXRNaWxsaXMoaSk7XG5cbiAgICAgIC8vIFNjYWxlIHRoZSB2YWx1ZXMgdG8gdGhlIGdyaWQgZGltZW5zaW9uc1xuICAgICAgY29uc3QgeCA9ICh0aGlzLm1heFdpZHRoICogaSkgLyBkdXJhdGlvbk1pbGxpcztcbiAgICAgIGNvbnN0IHkgPSBtYXhIZWlnaHQgKiB2YWwgKyB3aWR0aDtcblxuICAgICAgaWYgKG9sZFkpIHtcbiAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIHRoaXMuY3R4Lm1vdmVUbyhvbGRYLCBvbGRZKTtcbiAgICAgICAgdGhpcy5jdHgubGluZVRvKHgsIHkpO1xuICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgIH1cblxuICAgICAgb2xkWCA9IHg7XG4gICAgICBvbGRZID0geTtcbiAgICB9XG5cbiAgICAvLyBkcmF3IHRoZSBjdXJyZW50IHZhbHVlXG4gICAgdGhpcy5kcmF3Q3VycmVudFZhbHVlKHRoaXMuYW5pbWF0aW9uU2VydmljZS50aW1lTWlsbGlzICUgZHVyYXRpb25NaWxsaXMsIDUsIHdpZHRoLCBkdXJhdGlvbk1pbGxpcywgbWF4SGVpZ2h0KTtcblxuICAgIC8vIGRyYXcgdGhlIHBoYXNpbmcgdmFsdWVzIChjaGFzZSksIGlmIHJlcXVpcmVkXG4gICAgbGV0IHBoYXNpbmdDb3VudCA9IDA7XG5cbiAgICBpZiAodGhpcy5jdXJ2ZS5waGFzaW5nTWlsbGlzID4gMCAmJiB0aGlzLnByZXNldFNlcnZpY2Uuc2VsZWN0ZWRQcmVzZXQpIHtcbiAgICAgIHBoYXNpbmdDb3VudCA9IHRoaXMuZ2V0UGhhc2luZ0NvdW50KCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwaGFzaW5nQ291bnQ7IGkrKykge1xuICAgICAgdGhpcy5kcmF3Q3VycmVudFZhbHVlKFxuICAgICAgICAodGhpcy5hbmltYXRpb25TZXJ2aWNlLnRpbWVNaWxsaXMgLSBpICogdGhpcy5jdXJ2ZS5waGFzaW5nTWlsbGlzKSAlIGR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAzLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgZHVyYXRpb25NaWxsaXMsXG4gICAgICAgIG1heEhlaWdodFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNoYW5uZWxDYXBhYmlsaXRpZXMoKSB7XG4gICAgdGhpcy5hdmFpbGFibGVDaGFubmVscyA9IHRoaXMucHJlc2V0U2VydmljZS5nZXRTZWxlY3RlZFByb2ZpbGVDaGFubmVscyh0aGlzLnNlbGVjdGVkUHJvZmlsZXMpO1xuICB9XG5cbiAgY2hhbmdlUHJvZmlsZVNlbGVjdGlvbigkZXZlbnQ6IGFueSwgcHJvZmlsZTogRml4dHVyZVByb2ZpbGUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFByb2ZpbGVzLmluZGV4T2YocHJvZmlsZSkgPj0gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFByb2ZpbGVzLnNwbGljZSh0aGlzLnNlbGVjdGVkUHJvZmlsZXMuaW5kZXhPZihwcm9maWxlKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9maWxlcy5wdXNoKHByb2ZpbGUpO1xuICAgIH1cblxuICAgIHRoaXMuY2FsY3VsYXRlQ2hhbm5lbENhcGFiaWxpdGllcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYXBhYmlsaXRpZXNBbmRDaGFubmVscygpIHtcbiAgICAvLyBjYXBhYmlsaXRpZXNcbiAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMucHJlc2V0U2VydmljZS5oYXNDYXBhYmlsaXR5RGltbWVyKCkpIHtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNhcGFiaWxpdHkudHlwZSA9IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5JbnRlbnNpdHk7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXNldFNlcnZpY2UuaGFzQ2FwYWJpbGl0eUNvbG9yKCkpIHtcbiAgICAgIGxldCBjYXBhYmlsaXR5ID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgICBjYXBhYmlsaXR5LnR5cGUgPSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHk7XG4gICAgICBjYXBhYmlsaXR5LmNvbG9yID0gRml4dHVyZUNhcGFiaWxpdHlDb2xvci5SZWQ7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuXG4gICAgICBjYXBhYmlsaXR5ID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgICBjYXBhYmlsaXR5LnR5cGUgPSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHk7XG4gICAgICBjYXBhYmlsaXR5LmNvbG9yID0gRml4dHVyZUNhcGFiaWxpdHlDb2xvci5HcmVlbjtcbiAgICAgIHRoaXMuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLnB1c2goY2FwYWJpbGl0eSk7XG5cbiAgICAgIGNhcGFiaWxpdHkgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNhcGFiaWxpdHkudHlwZSA9IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eTtcbiAgICAgIGNhcGFiaWxpdHkuY29sb3IgPSBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLkJsdWU7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXNldFNlcnZpY2UuaGFzQ2FwYWJpbGl0eVBhblRpbHQoKSkge1xuICAgICAgbGV0IGNhcGFiaWxpdHkgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNhcGFiaWxpdHkudHlwZSA9IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5QYW47XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuXG4gICAgICBjYXBhYmlsaXR5ID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgICBjYXBhYmlsaXR5LnR5cGUgPSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuVGlsdDtcbiAgICAgIHRoaXMuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLnB1c2goY2FwYWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFsbCBwcm9maWxlc1xuICAgIHRoaXMuYXZhaWxhYmxlUHJvZmlsZXMgPSB0aGlzLnByZXNldFNlcnZpY2UuZ2V0U2VsZWN0ZWRQcm9maWxlcygpO1xuXG4gICAgLy8gc2VsZWN0IGFsbCBwcm9maWxlcyBieSBkZWZhdWx0XG4gICAgdGhpcy5zZWxlY3RlZFByb2ZpbGVzID0gWy4uLnRoaXMuYXZhaWxhYmxlUHJvZmlsZXNdO1xuXG4gICAgLy8gY2FsY3VsYXRlIGFsbCBjaGFubmVsc1xuICAgIHRoaXMuY2FsY3VsYXRlQ2hhbm5lbENhcGFiaWxpdGllcygpO1xuICB9XG5cbiAgZ2V0Q2FwYWJpbGl0eU5hbWUoY2FwYWJpbGl0eTogRml4dHVyZUNhcGFiaWxpdHkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVxuICAgICAgLmdldChbJ2Rlc2lnbmVyLmZpeHR1cmVDYXBhYmlsaXR5VHlwZS4nICsgY2FwYWJpbGl0eS50eXBlLCAnZGVzaWduZXIuZml4dHVyZUNhcGFiaWxpdHlDb2xvci4nICsgY2FwYWJpbGl0eS5jb2xvcl0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGxldCBuYW1lID0gJyc7XG4gICAgICAgICAgbmFtZSArPSByZXN1bHRbJ2Rlc2lnbmVyLmZpeHR1cmVDYXBhYmlsaXR5VHlwZS4nICsgY2FwYWJpbGl0eS50eXBlXTtcblxuICAgICAgICAgIGlmIChjYXBhYmlsaXR5LmNvbG9yKSB7XG4gICAgICAgICAgICBuYW1lICs9ICcsICcgKyByZXN1bHRbJ2Rlc2lnbmVyLmZpeHR1cmVDYXBhYmlsaXR5Q29sb3IuJyArIGNhcGFiaWxpdHkuY29sb3JdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBjYXBhYmlsaXR5Q2hlY2tlZChjYXBhYmlsaXR5OiBGaXh0dXJlQ2FwYWJpbGl0eSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZXhpc3RpbmdDYXBhYmlsaXR5IG9mIHRoaXMuY3VydmUuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgICAgICAgZXhpc3RpbmdDYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgY2FwYWJpbGl0eS50eXBlLFxuICAgICAgICAgIGV4aXN0aW5nQ2FwYWJpbGl0eS5jb2xvcixcbiAgICAgICAgICBjYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDYXBhYmlsaXR5KGV2ZW50OiBhbnksIGNhcGFiaWxpdHk6IEZpeHR1cmVDYXBhYmlsaXR5KSB7XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hlY2tlZCkge1xuICAgICAgLy8gYWRkIHRoZSBjYXBhYmlsaXR5XG4gICAgICB0aGlzLmN1cnZlLmNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNoYW5uZWxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jdXJ2ZS5jYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDYXBhYmlsaXR5ID0gdGhpcy5jdXJ2ZS5jYXBhYmlsaXRpZXNbaV07XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhcGFiaWxpdGllc01hdGNoKFxuICAgICAgICAgICAgZXhpc3RpbmdDYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgICBjYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgICBleGlzdGluZ0NhcGFiaWxpdHkuY29sb3IsXG4gICAgICAgICAgICBjYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jdXJ2ZS5jYXBhYmlsaXRpZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKCk7XG4gIH1cblxuICBnZXRDaGFubmVsTmFtZShwcm9maWxlTmFtZTogc3RyaW5nLCBjaGFubmVsTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlUHJvZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHByb2ZpbGVOYW1lICsgJyAtICcgKyBjaGFubmVsTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbE5hbWU7XG4gIH1cblxuICBjaGFubmVsQ2hlY2tlZChwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgY2hhbm5lbDogQ2FjaGVkRml4dHVyZUNoYW5uZWwpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGVDaGFubmVscyBvZiB0aGlzLmN1cnZlLmNoYW5uZWxzKSB7XG4gICAgICBpZiAocHJvZmlsZUNoYW5uZWxzLnByb2ZpbGVVdWlkID09PSBwcm9maWxlLnV1aWQpIHtcbiAgICAgICAgaWYgKHByb2ZpbGVDaGFubmVscy5jaGFubmVscy5pbmNsdWRlcyhjaGFubmVsLm5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDaGFubmVsKGV2ZW50OiBhbnksIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlLCBjaGFubmVsOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCkge1xuICAgIC8vIGFkZCB0aGUgcHJvZmlsZSwgaWYgbmVjZXNzYXJ5XG4gICAgbGV0IHByb2ZpbGVDb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGVDaGFubmVscyBvZiB0aGlzLmN1cnZlLmNoYW5uZWxzKSB7XG4gICAgICBpZiAocHJvZmlsZUNoYW5uZWxzLnByb2ZpbGVVdWlkID09PSBwcm9maWxlLnV1aWQpIHtcbiAgICAgICAgcHJvZmlsZUNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvZmlsZUNvbnRhaW5lZCkge1xuICAgICAgY29uc3QgcHJvZmlsZUNoYW5uZWxzID0gbmV3IEVmZmVjdEN1cnZlUHJvZmlsZUNoYW5uZWxzKCk7XG4gICAgICBwcm9maWxlQ2hhbm5lbHMucHJvZmlsZVV1aWQgPSBwcm9maWxlLnV1aWQ7XG4gICAgICB0aGlzLmN1cnZlLmNoYW5uZWxzLnB1c2gocHJvZmlsZUNoYW5uZWxzKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgb3IgZGVsZXRlIHRoZSBjaGFubmVsXG4gICAgZm9yIChjb25zdCBwcm9maWxlQ2hhbm5lbHMgb2YgdGhpcy5jdXJ2ZS5jaGFubmVscykge1xuICAgICAgaWYgKHByb2ZpbGVDaGFubmVscy5wcm9maWxlVXVpZCA9PT0gcHJvZmlsZS51dWlkKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcHJvZmlsZUNoYW5uZWxzLmNoYW5uZWxzLmluZGV4T2YoY2hhbm5lbC5uYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHByb2ZpbGVDaGFubmVscy5jaGFubmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2ZpbGVDaGFubmVscy5jaGFubmVscy5wdXNoKGNoYW5uZWwubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgfVxuXG4gIHNldExlbmd0aE1pbGxpcyh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkgJiYgdmFsdWUgPj0gdGhpcy5sZW5ndGhNaWxsaXNNaW4gJiYgdmFsdWUgPD0gdGhpcy5sZW5ndGhNaWxsaXNNYXgpIHtcbiAgICAgIHRoaXMuY3VydmUubGVuZ3RoTWlsbGlzID0gK3ZhbHVlO1xuICAgICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0QW1wbGl0dWRlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+PSB0aGlzLmFtcGxpdHVkZU1pbiAmJiB2YWx1ZSA8PSB0aGlzLmFtcGxpdHVkZU1heCkge1xuICAgICAgdGhpcy5jdXJ2ZS5hbXBsaXR1ZGUgPSArdmFsdWU7XG4gICAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQb3NpdGlvbih2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkgJiYgdmFsdWUgPj0gdGhpcy5wZXJjZW50YWdlTWluICYmIHZhbHVlIDw9IHRoaXMucGVyY2VudGFnZU1heCkge1xuICAgICAgdGhpcy5jdXJ2ZS5wb3NpdGlvbiA9ICt2YWx1ZTtcbiAgICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFBoYXNlTWlsbGlzKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+PSB0aGlzLnBoYXNlTWlsbGlzTWluICYmIHZhbHVlIDw9IHRoaXMucGhhc2VNaWxsaXNNYXgpIHtcbiAgICAgIHRoaXMuY3VydmUucGhhc2VNaWxsaXMgPSArdmFsdWU7XG4gICAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQaGFzaW5nTWlsbGlzKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+PSB0aGlzLnBoYXNpbmdNaWxsaXNNaW4gJiYgdmFsdWUgPD0gdGhpcy5waGFzaW5nTWlsbGlzTWF4KSB7XG4gICAgICB0aGlzLmN1cnZlLnBoYXNpbmdNaWxsaXMgPSArdmFsdWU7XG4gICAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtci0zXCIgc3R5bGU9XCJmbG9hdDogbGVmdFwiPlxuICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgIDxzZWxlY3RcbiAgICAgIFtuZ01vZGVsXT1cImN1cnZlLmN1cnZlVHlwZVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJjdXJ2ZS5jdXJ2ZVR5cGUgPSAkZXZlbnQ7IHByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKVwiXG4gICAgICBzdHlsZT1cIndpZHRoOiAyMDBweDsgaGVpZ2h0OiAyMHB4XCJcbiAgICA+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCInc2luZSdcIj5cbiAgICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1zaW5lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCInc3F1YXJlJ1wiPlxuICAgICAgICB7eyAnZGVzaWduZXIuZWZmZWN0LmN1cnZlLXNxdWFyZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPCEtLSA8b3B0aW9uIFt2YWx1ZV09XCIndHJpYW5nbGUnXCI+XG4gICAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtdHJpYW5nbGUnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCInc2F3dG9vdGgnXCI+XG4gICAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtc2F3dG9vdGgnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCIncmV2ZXJzZS1zYXd0b290aCdcIj5cbiAgICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1yZXZlcnNlLXNhd3Rvb3RoJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPiAtLT5cbiAgICA8L3NlbGVjdD5cbiAgPC9kaXY+XG4gIDxkaXY+XG4gICAgPGNhbnZhcyAjY3VydmVHcmlkIGNsYXNzPVwiY3VydmUtZ3JpZFwiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMTAwXCIgdmlld0JveD1cIjE1MCAtNzUgNDg1MCA1MTUwXCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIj48L2NhbnZhcz5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1yLTRcIiBzdHlsZT1cImZsb2F0OiBsZWZ0XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiIHN0eWxlPVwid2lkdGg6IDEwMHB4OyBmbG9hdDogbGVmdFwiPlxuICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1sZW5ndGgnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cImZsb2F0OiBsZWZ0XCI+XG4gICAgICA8bXYtc2xpZGVyXG4gICAgICAgIChjaGFuZ2UpPVwicmVkcmF3KCk7IHByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKVwiXG4gICAgICAgIFsodmFsdWUpXT1cImN1cnZlLmxlbmd0aE1pbGxpc1wiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDgwcHhcIlxuICAgICAgICBbdG9vbHRpcF09XCInaGlkZSdcIlxuICAgICAgICBbdmFsdWVdPVwiMFwiXG4gICAgICAgIFttaW5dPVwibGVuZ3RoTWlsbGlzTWluXCJcbiAgICAgICAgW21heF09XCJsZW5ndGhNaWxsaXNNYXhcIlxuICAgICAgICBbc3RlcF09XCIxXCJcbiAgICAgID48L212LXNsaWRlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJzbGlkZXItaW5wdXRcIiBbbmdNb2RlbF09XCJjdXJ2ZS5sZW5ndGhNaWxsaXNcIiAobmdNb2RlbENoYW5nZSk9XCJzZXRMZW5ndGhNaWxsaXMoJGV2ZW50KTsgcmVkcmF3KClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvIG1sLTFcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5taXNjLm1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cIndpZHRoOiAxMDBweDsgZmxvYXQ6IGxlZnRcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtYW1wbGl0dWRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJmbG9hdDogbGVmdFwiPlxuICAgICAgPG12LXNsaWRlclxuICAgICAgICAoY2hhbmdlKT1cInJlZHJhdygpOyBwcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKClcIlxuICAgICAgICBbKHZhbHVlKV09XCJjdXJ2ZS5hbXBsaXR1ZGVcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiA4MHB4XCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ2hpZGUnXCJcbiAgICAgICAgW21pbl09XCJhbXBsaXR1ZGVNaW5cIlxuICAgICAgICBbbWF4XT1cImFtcGxpdHVkZU1heFwiXG4gICAgICAgIFtzdGVwXT1cIjAuMDFcIlxuICAgICAgPjwvbXYtc2xpZGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNsaWRlci1pbnB1dFwiIFtuZ01vZGVsXT1cImN1cnZlLmFtcGxpdHVkZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldEFtcGxpdHVkZSgkZXZlbnQpOyByZWRyYXcoKVwiIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiIHN0eWxlPVwid2lkdGg6IDEwMHB4OyBmbG9hdDogbGVmdFwiPlxuICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1wb3NpdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiIHN0eWxlPVwiZmxvYXQ6IGxlZnRcIj5cbiAgICAgIDxtdi1zbGlkZXJcbiAgICAgICAgKGNoYW5nZSk9XCJyZWRyYXcoKTsgcHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpXCJcbiAgICAgICAgWyh2YWx1ZSldPVwiY3VydmUucG9zaXRpb25cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiA4MHB4OyBoZWlnaHQ6IDE4cHhcIlxuICAgICAgICBbdG9vbHRpcF09XCInaGlkZSdcIlxuICAgICAgICBbbWluXT1cInBlcmNlbnRhZ2VNaW5cIlxuICAgICAgICBbbWF4XT1cInBlcmNlbnRhZ2VNYXhcIlxuICAgICAgICBbc3RlcF09XCIwLjAxXCJcbiAgICAgID5cbiAgICAgIDwvbXYtc2xpZGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNsaWRlci1pbnB1dFwiIFtuZ01vZGVsXT1cImN1cnZlLnBvc2l0aW9uXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0UG9zaXRpb24oJGV2ZW50KTsgcmVkcmF3KClcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cIndpZHRoOiAxMDBweDsgZmxvYXQ6IGxlZnRcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtcGhhc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cImZsb2F0OiBsZWZ0XCI+XG4gICAgICA8bXYtc2xpZGVyXG4gICAgICAgIChjaGFuZ2UpPVwicmVkcmF3KCk7IHByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKVwiXG4gICAgICAgIFsodmFsdWUpXT1cImN1cnZlLnBoYXNlTWlsbGlzXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogODBweDsgaGVpZ2h0OiAxOHB4XCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ2hpZGUnXCJcbiAgICAgICAgW21pbl09XCJwaGFzZU1pbGxpc01pblwiXG4gICAgICAgIFttYXhdPVwicGhhc2VNaWxsaXNNYXhcIlxuICAgICAgICBbc3RlcF09XCIxXCJcbiAgICAgID48L212LXNsaWRlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJzbGlkZXItaW5wdXRcIiBbbmdNb2RlbF09XCJjdXJ2ZS5waGFzZU1pbGxpc1wiIChuZ01vZGVsQ2hhbmdlKT1cInNldFBoYXNlTWlsbGlzKCRldmVudCk7IHJlZHJhdygpXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0byBtbC0xXCI+XG4gICAgICB7eyAnZGVzaWduZXIubWlzYy5tcycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7IGZsb2F0OiBsZWZ0XCI+XG4gICAgICB7eyAnZGVzaWduZXIuZWZmZWN0LmN1cnZlLWNoYXNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJmbG9hdDogbGVmdFwiPlxuICAgICAgPG12LXNsaWRlclxuICAgICAgICAoY2hhbmdlKT1cInJlZHJhdygpOyBwcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKClcIlxuICAgICAgICBbKHZhbHVlKV09XCJjdXJ2ZS5waGFzaW5nTWlsbGlzXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogODBweDsgaGVpZ2h0OiAxOHB4XCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ2hpZGUnXCJcbiAgICAgICAgW21pbl09XCJwaGFzaW5nTWlsbGlzTWluXCJcbiAgICAgICAgW21heF09XCJwaGFzaW5nTWlsbGlzTWF4XCJcbiAgICAgICAgW3N0ZXBdPVwiMVwiXG4gICAgICA+PC9tdi1zbGlkZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2xpZGVyLWlucHV0XCIgW25nTW9kZWxdPVwiY3VydmUucGhhc2luZ01pbGxpc1wiIChuZ01vZGVsQ2hhbmdlKT1cInNldFBoYXNpbmdNaWxsaXMoJGV2ZW50KTsgcmVkcmF3KClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvIG1sLTFcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5taXNjLm1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIE1lbnUgZm9yIHRoZSBjYXBhYmlsaXRpZXMgYW5kIGNoYW5uZWxzLS0+XG48ZGl2IGNsYXNzPVwiY29sIGNvbC1hdXRvIHAtMFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxcHg7IHdpZHRoOiA1MHB4OyBmbG9hdDogbGVmdFwiPlxuICA8ZGl2IGNsYXNzPVwibmF2IGZsZXgtY29sdW1uIG5hdi1waWxsc1wiIGlkPVwidi1waWxscy10YWJcIiByb2xlPVwidGFibGlzdFwiIGFyaWEtb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiPlxuICAgIDxhXG4gICAgICBjbGFzcz1cIm5hdi1saW5rIHB4LTMgYWN0aXZlXCJcbiAgICAgIGlkPVwidi1waWxscy1lZmZlY3QtY2FwYWJpbGl0aWVzLXRhYlwiXG4gICAgICBwb3BvdmVyPVwie3sgJ2Rlc2lnbmVyLm1pc2MuY2FwYWJpbGl0aWVzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgIHRyaWdnZXJzPVwibW91c2VlbnRlcjptb3VzZWxlYXZlXCJcbiAgICAgIGRhdGEtdG9nZ2xlPVwicGlsbFwiXG4gICAgICBocmVmPVwiI3YtcGlsbHMtZWZmZWN0LWNhcGFiaWxpdGllcy17eyBjdXJ2ZT8udXVpZCB9fVwiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJ2LXBpbGxzLWNhcGFiaWxpdGllc1wiXG4gICAgICBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1ib2x0IGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvYT5cbiAgICA8YVxuICAgICAgY2xhc3M9XCJuYXYtbGluayBweC0zXCJcbiAgICAgIGlkPVwidi1waWxscy1lZmZlY3QtY2hhbm5lbHMtdGFiXCJcbiAgICAgIHBvcG92ZXI9XCJ7eyAnZGVzaWduZXIubWlzYy5jaGFubmVscycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICB0cmlnZ2Vycz1cIm1vdXNlZW50ZXI6bW91c2VsZWF2ZVwiXG4gICAgICBkYXRhLXRvZ2dsZT1cInBpbGxcIlxuICAgICAgaHJlZj1cIiN2LXBpbGxzLWVmZmVjdC1jaGFubmVscy17eyBjdXJ2ZT8udXVpZCB9fVwiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJ2LXBpbGxzLWNoYW5uZWxzXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zbGlkZXJzIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImgtMTAwXCIgY2xhc3M9XCJhcHBseWluZy10b1wiPlxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnQgaC0xMDBcIiBpZD1cInYtcGlsbHMtdGFiQ29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZSBoLTEwMCBzaG93IGFjdGl2ZVwiIGlkPVwidi1waWxscy1lZmZlY3QtY2FwYWJpbGl0aWVzLXt7IGN1cnZlPy51dWlkIH19XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICA8IS0tIENhcGFiaWxpdGllcy0tPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2FwYWJpbGl0eSBvZiBhdmFpbGFibGVDYXBhYmlsaXRpZXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxuICAgICAgICAgIGlkPVwiY2FwYWJpbGl0eV97eyBjdXJ2ZT8udXVpZCArICdfJyArIGkgfX1cIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImNhcGFiaWxpdHlDaGVja2VkKGNhcGFiaWxpdHkpXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUNhcGFiaWxpdHkoJGV2ZW50LCBjYXBhYmlsaXR5KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJjYXBhYmlsaXR5X3t7IGN1cnZlPy51dWlkICsgJ18nICsgaSB9fVwiPnt7IGdldENhcGFiaWxpdHlOYW1lKGNhcGFiaWxpdHkpIHwgYXN5bmMgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIGgtMTAwIHNob3dcIiBpZD1cInYtcGlsbHMtZWZmZWN0LWNoYW5uZWxzLXt7IGN1cnZlPy51dWlkIH19XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICA8IS0tIGNoYW5uZWxzIC0tPlxuXG4gICAgICA8IS0tIHByb2ZpbGUgc2VsZWN0aW9uIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZVByb2ZpbGVzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZmlsZSBvZiBhdmFpbGFibGVQcm9maWxlczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZm9ybS1jaGVja1wiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXG4gICAgICAgICAgICBpZD1cImNoYW5uZWxfcHJvZmlsZV97eyBjdXJ2ZT8udXVpZCB9fV97eyBwcm9maWxlLnV1aWQgfX1cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRQcm9maWxlcy5pbmRleE9mKHByb2ZpbGUpID49IDBcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VQcm9maWxlU2VsZWN0aW9uKCRldmVudCwgcHJvZmlsZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImNoYW5uZWxfcHJvZmlsZV97eyBjdXJ2ZT8udXVpZCB9fV97eyBwcm9maWxlLnV1aWQgfX1cIj57eyBwcm9maWxlLm5hbWUgfX08L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aHIgY2xhc3M9XCJteS0xXCIgc3R5bGU9XCJib3JkZXItY29sb3I6IHdoaXRlXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIGNoYW5uZWxzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZW50cnkgb2YgYXZhaWxhYmxlQ2hhbm5lbHMgfCBrZXl2YWx1ZTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGFubmVsIG9mIGVudHJ5LnZhbHVlOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcbiAgICAgICAgICAgIGlkPVwiY2hhbm5lbF97eyBjdXJ2ZT8udXVpZCB9fV97eyBpIH19X3t7IGogfX1cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwiY2hhbm5lbENoZWNrZWQoZW50cnkua2V5LCBjaGFubmVsKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUNoYW5uZWwoJGV2ZW50LCBlbnRyeS5rZXksIGNoYW5uZWwpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJjaGFubmVsX3t7IGN1cnZlPy51dWlkIH19X3t7IGkgfX1fe3sgaiB9fVwiPnt7XG4gICAgICAgICAgICBnZXRDaGFubmVsTmFtZShlbnRyeS5rZXkubmFtZSwgY2hhbm5lbC5uYW1lKVxuICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==