@wizishop/img-manager 0.2.108 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/esm2020/lib/animations/easeInOut/ease-in-out.animation.mjs +12 -0
  2. package/esm2020/lib/animations/insertRemove/insert-remove.animation.mjs +9 -0
  3. package/esm2020/lib/animations/listAnnimation/list.animation.mjs +16 -0
  4. package/esm2020/lib/components/canva-btn/canva-btn.component.mjs +67 -0
  5. package/esm2020/lib/components/images-view/images-actions-handler.mjs +151 -0
  6. package/esm2020/lib/components/images-view/images-view.component.mjs +474 -0
  7. package/esm2020/lib/components/images-view/mosaic-view/img-card/img-card.component.mjs +66 -0
  8. package/esm2020/lib/components/images-view/mosaic-view/mosaic-view.component.mjs +68 -0
  9. package/esm2020/lib/components/images-view/table-view/table-view.component.mjs +48 -0
  10. package/esm2020/lib/components/img-editor/cropper/cropper.component.mjs +307 -0
  11. package/esm2020/lib/components/img-editor/img-editor.component.mjs +109 -0
  12. package/esm2020/lib/components/img-editor/info-section/info-section.component.mjs +54 -0
  13. package/esm2020/lib/components/img-selection/img-selection.component.mjs +59 -0
  14. package/esm2020/lib/components/img-tabs/img-tabs.component.mjs +122 -0
  15. package/esm2020/lib/components/img-upload/img-upload.component.mjs +118 -0
  16. package/esm2020/lib/components/loader/loader.component.mjs +21 -0
  17. package/esm2020/lib/components/pexels-lib/pexels-lib.component.mjs +200 -0
  18. package/esm2020/lib/components/shared/alert/alert.component.mjs +27 -0
  19. package/esm2020/lib/components/shared/checkbox/checkbox.component.mjs +52 -0
  20. package/esm2020/lib/components/shared/dropdown/dropdown.component.mjs +21 -0
  21. package/esm2020/lib/components/shared/input-search/input-search.component.mjs +54 -0
  22. package/esm2020/lib/components/shared/pagination/page-selector/page-selector.component.mjs +49 -0
  23. package/esm2020/lib/components/shared/pagination/pagination.component.mjs +49 -0
  24. package/esm2020/lib/components/shared/select/call-to-action.model.mjs +2 -0
  25. package/esm2020/lib/components/shared/select/select-items.dto.mjs +2 -0
  26. package/esm2020/lib/components/shared/select/select.component.mjs +110 -0
  27. package/esm2020/lib/components/shared/table/table.component.mjs +116 -0
  28. package/esm2020/lib/components/upload-list/upload-list.component.mjs +79 -0
  29. package/esm2020/lib/directives/abstract-debounce/abstract-debounce.directive.mjs +37 -0
  30. package/esm2020/lib/directives/abstract-debounce/debounce-keyup.directive.mjs +24 -0
  31. package/esm2020/lib/directives/auto-hide.directive.mjs +48 -0
  32. package/esm2020/lib/directives/copy-to-clipboard.directive.mjs +37 -0
  33. package/esm2020/lib/directives/drag-drop.directive.mjs +57 -0
  34. package/esm2020/lib/directives/loading.directive.mjs +42 -0
  35. package/esm2020/lib/directives/table/checkBoxRow.directive.mjs +114 -0
  36. package/esm2020/lib/directives/table/column.directive.mjs +45 -0
  37. package/esm2020/lib/directives/table/columnHeader.directive.mjs +204 -0
  38. package/esm2020/lib/directives/table/raw.directive.mjs +31 -0
  39. package/esm2020/lib/directives/zindex-toggle.directive.mjs +42 -0
  40. package/esm2020/lib/dto/ImgManagerDisplayConfig.dto.mjs +2 -0
  41. package/esm2020/lib/dto/canva-create-design.dto.mjs +4 -0
  42. package/esm2020/lib/dto/canva.dto.mjs +4 -0
  43. package/esm2020/lib/dto/config/apis/api.dto.mjs +9 -0
  44. package/esm2020/lib/dto/config/external/external-config.dto.mjs +3 -0
  45. package/esm2020/lib/dto/config/image-cdn/image-cdn-config.dto.mjs +10 -0
  46. package/esm2020/lib/dto/export-dtos.api.mjs +11 -0
  47. package/esm2020/lib/dto/img-editor-config.dto.mjs +2 -0
  48. package/esm2020/lib/dto/img-manager.dto.mjs +2 -0
  49. package/esm2020/lib/dto/pexels-img.dto.mjs +2 -0
  50. package/esm2020/lib/dto/picture-name-update.dto.mjs +2 -0
  51. package/esm2020/lib/dto/stateDisplayed.dto.mjs +2 -0
  52. package/esm2020/lib/dto/tabDisplayed.dto.mjs +2 -0
  53. package/esm2020/lib/dto/wizi-block-media.dto.mjs +3 -0
  54. package/esm2020/lib/pipes/images/img-src.pipe.mjs +28 -0
  55. package/esm2020/lib/pipes/number-to-array.pipe.mjs +16 -0
  56. package/esm2020/lib/pipes/pagination/array-total-pages/array-pages.pipe.mjs +28 -0
  57. package/esm2020/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.mjs +53 -0
  58. package/esm2020/lib/pipes/pagination/text/custom-text.pipe.mjs +35 -0
  59. package/esm2020/lib/pipes/pagination/total-pages/is-last-page.pipe.mjs +25 -0
  60. package/esm2020/lib/pipes/select/select-filters.pipe.mjs +19 -0
  61. package/esm2020/lib/services/alert.service.mjs +53 -0
  62. package/esm2020/lib/services/canva.service.mjs +159 -0
  63. package/esm2020/lib/services/config/external-config.service.mjs +49 -0
  64. package/esm2020/lib/services/config/img-cdn.service.mjs +28 -0
  65. package/esm2020/lib/services/dom.service.mjs +36 -0
  66. package/{esm2015/lib/services/img-event.service.js → esm2020/lib/services/img-event.service.mjs} +11 -12
  67. package/esm2020/lib/services/img-manager.service.mjs +138 -0
  68. package/{esm2015/lib/services/img-selection.service.js → esm2020/lib/services/img-selection.service.mjs} +11 -12
  69. package/esm2020/lib/services/pexels.service.mjs +62 -0
  70. package/esm2020/lib/services/rename-picture.service.mjs +68 -0
  71. package/esm2020/lib/services/table/filters-table.service.mjs +63 -0
  72. package/{esm2015/lib/services/user-settings.service.js → esm2020/lib/services/user-settings.service.mjs} +11 -12
  73. package/esm2020/lib/wz-img-manager.component.mjs +186 -0
  74. package/esm2020/lib/wz-img-manager.module.mjs +193 -0
  75. package/esm2020/public-api.mjs +11 -0
  76. package/esm2020/wizishop-img-manager.mjs +5 -0
  77. package/fesm2015/wizishop-img-manager.mjs +4134 -0
  78. package/fesm2015/wizishop-img-manager.mjs.map +1 -0
  79. package/fesm2020/wizishop-img-manager.mjs +4140 -0
  80. package/fesm2020/wizishop-img-manager.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/components/canva-btn/canva-btn.component.d.ts +9 -6
  83. package/lib/components/images-view/images-actions-handler.d.ts +3 -0
  84. package/lib/components/images-view/images-view.component.d.ts +3 -0
  85. package/lib/components/images-view/mosaic-view/img-card/img-card.component.d.ts +3 -0
  86. package/lib/components/images-view/mosaic-view/mosaic-view.component.d.ts +3 -0
  87. package/lib/components/images-view/table-view/table-view.component.d.ts +3 -0
  88. package/lib/components/img-editor/cropper/cropper.component.d.ts +6 -3
  89. package/lib/components/img-editor/img-editor.component.d.ts +3 -0
  90. package/lib/components/img-editor/info-section/info-section.component.d.ts +3 -0
  91. package/lib/components/img-selection/img-selection.component.d.ts +3 -0
  92. package/lib/components/img-tabs/img-tabs.component.d.ts +3 -0
  93. package/lib/components/img-upload/img-upload.component.d.ts +4 -1
  94. package/lib/components/loader/loader.component.d.ts +3 -0
  95. package/lib/components/pexels-lib/pexels-lib.component.d.ts +3 -0
  96. package/lib/components/shared/alert/alert.component.d.ts +3 -0
  97. package/lib/components/shared/checkbox/checkbox.component.d.ts +3 -0
  98. package/lib/components/shared/dropdown/dropdown.component.d.ts +3 -0
  99. package/lib/components/shared/input-search/input-search.component.d.ts +3 -0
  100. package/lib/components/shared/pagination/page-selector/page-selector.component.d.ts +3 -0
  101. package/lib/components/shared/pagination/pagination.component.d.ts +3 -0
  102. package/lib/components/shared/select/select.component.d.ts +3 -0
  103. package/lib/components/shared/table/table.component.d.ts +3 -0
  104. package/lib/components/upload-list/upload-list.component.d.ts +3 -0
  105. package/lib/directives/abstract-debounce/abstract-debounce.directive.d.ts +3 -0
  106. package/lib/directives/abstract-debounce/debounce-keyup.directive.d.ts +3 -0
  107. package/lib/directives/auto-hide.directive.d.ts +3 -0
  108. package/lib/directives/copy-to-clipboard.directive.d.ts +3 -0
  109. package/lib/directives/drag-drop.directive.d.ts +3 -0
  110. package/lib/directives/loading.directive.d.ts +3 -0
  111. package/lib/directives/table/checkBoxRow.directive.d.ts +3 -0
  112. package/lib/directives/table/column.directive.d.ts +3 -0
  113. package/lib/directives/table/columnHeader.directive.d.ts +3 -0
  114. package/lib/directives/table/raw.directive.d.ts +3 -0
  115. package/lib/directives/zindex-toggle.directive.d.ts +3 -0
  116. package/lib/dto/pexels-img.dto.d.ts +1 -0
  117. package/lib/pipes/images/img-src.pipe.d.ts +3 -0
  118. package/lib/pipes/number-to-array.pipe.d.ts +3 -0
  119. package/lib/pipes/pagination/array-total-pages/array-pages.pipe.d.ts +3 -0
  120. package/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.d.ts +7 -1
  121. package/lib/pipes/pagination/text/custom-text.pipe.d.ts +3 -0
  122. package/lib/pipes/pagination/total-pages/is-last-page.pipe.d.ts +3 -0
  123. package/lib/pipes/select/select-filters.pipe.d.ts +3 -0
  124. package/lib/services/alert.service.d.ts +3 -0
  125. package/lib/services/canva.service.d.ts +3 -0
  126. package/lib/services/config/external-config.service.d.ts +3 -0
  127. package/lib/services/config/img-cdn.service.d.ts +3 -0
  128. package/lib/services/dom.service.d.ts +3 -0
  129. package/lib/services/img-event.service.d.ts +3 -0
  130. package/lib/services/img-manager.service.d.ts +5 -2
  131. package/lib/services/img-selection.service.d.ts +3 -0
  132. package/lib/services/pexels.service.d.ts +7 -4
  133. package/lib/services/rename-picture.service.d.ts +3 -0
  134. package/lib/services/table/filters-table.service.d.ts +3 -0
  135. package/lib/services/user-settings.service.d.ts +3 -0
  136. package/lib/wz-img-manager.component.d.ts +3 -0
  137. package/lib/wz-img-manager.module.d.ts +56 -0
  138. package/package.json +47 -29
  139. package/wizishop-img-manager-14.0.0.tgz +0 -0
  140. package/wz-img-manager.scss +4 -404
  141. package/bundles/wizishop-img-manager.umd.js +0 -5077
  142. package/bundles/wizishop-img-manager.umd.js.map +0 -1
  143. package/bundles/wizishop-img-manager.umd.min.js +0 -16
  144. package/bundles/wizishop-img-manager.umd.min.js.map +0 -1
  145. package/esm2015/lib/animations/easeInOut/ease-in-out.animation.js +0 -12
  146. package/esm2015/lib/animations/insertRemove/insert-remove.animation.js +0 -9
  147. package/esm2015/lib/animations/listAnnimation/list.animation.js +0 -16
  148. package/esm2015/lib/components/canva-btn/canva-btn.component.js +0 -70
  149. package/esm2015/lib/components/images-view/images-actions-handler.js +0 -180
  150. package/esm2015/lib/components/images-view/images-view.component.js +0 -492
  151. package/esm2015/lib/components/images-view/mosaic-view/img-card/img-card.component.js +0 -84
  152. package/esm2015/lib/components/images-view/mosaic-view/mosaic-view.component.js +0 -79
  153. package/esm2015/lib/components/images-view/table-view/table-view.component.js +0 -49
  154. package/esm2015/lib/components/img-editor/cropper/cropper.component.js +0 -300
  155. package/esm2015/lib/components/img-editor/img-editor.component.js +0 -112
  156. package/esm2015/lib/components/img-editor/info-section/info-section.component.js +0 -59
  157. package/esm2015/lib/components/img-selection/img-selection.component.js +0 -62
  158. package/esm2015/lib/components/img-tabs/img-tabs.component.js +0 -131
  159. package/esm2015/lib/components/img-upload/img-upload.component.js +0 -125
  160. package/esm2015/lib/components/loader/loader.component.js +0 -28
  161. package/esm2015/lib/components/pexels-lib/pexels-lib.component.js +0 -208
  162. package/esm2015/lib/components/shared/alert/alert.component.js +0 -37
  163. package/esm2015/lib/components/shared/checkbox/checkbox.component.js +0 -69
  164. package/esm2015/lib/components/shared/dropdown/dropdown.component.js +0 -26
  165. package/esm2015/lib/components/shared/input-search/input-search.component.js +0 -62
  166. package/esm2015/lib/components/shared/pagination/page-selector/page-selector.component.js +0 -55
  167. package/esm2015/lib/components/shared/pagination/pagination.component.js +0 -51
  168. package/esm2015/lib/components/shared/select/call-to-action.model.js +0 -1
  169. package/esm2015/lib/components/shared/select/select-items.dto.js +0 -1
  170. package/esm2015/lib/components/shared/select/select.component.js +0 -133
  171. package/esm2015/lib/components/shared/table/table.component.js +0 -133
  172. package/esm2015/lib/components/upload-list/upload-list.component.js +0 -87
  173. package/esm2015/lib/directives/abstract-debounce/abstract-debounce.directive.js +0 -40
  174. package/esm2015/lib/directives/abstract-debounce/debounce-keyup.directive.js +0 -26
  175. package/esm2015/lib/directives/auto-hide.directive.js +0 -55
  176. package/esm2015/lib/directives/copy-to-clipboard.directive.js +0 -40
  177. package/esm2015/lib/directives/drag-drop.directive.js +0 -68
  178. package/esm2015/lib/directives/loading.directive.js +0 -44
  179. package/esm2015/lib/directives/table/checkBoxRow.directive.js +0 -128
  180. package/esm2015/lib/directives/table/column.directive.js +0 -49
  181. package/esm2015/lib/directives/table/columnHeader.directive.js +0 -221
  182. package/esm2015/lib/directives/table/raw.directive.js +0 -33
  183. package/esm2015/lib/directives/zindex-toggle.directive.js +0 -49
  184. package/esm2015/lib/dto/ImgManagerDisplayConfig.dto.js +0 -1
  185. package/esm2015/lib/dto/canva-create-design.dto.js +0 -4
  186. package/esm2015/lib/dto/canva.dto.js +0 -4
  187. package/esm2015/lib/dto/config/apis/api.dto.js +0 -9
  188. package/esm2015/lib/dto/config/external/external-config.dto.js +0 -3
  189. package/esm2015/lib/dto/config/image-cdn/image-cdn-config.dto.js +0 -10
  190. package/esm2015/lib/dto/export-dtos.api.js +0 -5
  191. package/esm2015/lib/dto/img-editor-config.dto.js +0 -1
  192. package/esm2015/lib/dto/img-manager.dto.js +0 -1
  193. package/esm2015/lib/dto/pexels-img.dto.js +0 -1
  194. package/esm2015/lib/dto/picture-name-update.dto.js +0 -1
  195. package/esm2015/lib/dto/stateDisplayed.dto.js +0 -1
  196. package/esm2015/lib/dto/tabDisplayed.dto.js +0 -1
  197. package/esm2015/lib/dto/wizi-block-media.dto.js +0 -3
  198. package/esm2015/lib/pipes/images/img-src.pipe.js +0 -29
  199. package/esm2015/lib/pipes/number-to-array.pipe.js +0 -14
  200. package/esm2015/lib/pipes/pagination/array-total-pages/array-pages.pipe.js +0 -26
  201. package/esm2015/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.js +0 -51
  202. package/esm2015/lib/pipes/pagination/text/custom-text.pipe.js +0 -36
  203. package/esm2015/lib/pipes/pagination/total-pages/is-last-page.pipe.js +0 -23
  204. package/esm2015/lib/pipes/select/select-filters.pipe.js +0 -17
  205. package/esm2015/lib/services/alert.service.js +0 -59
  206. package/esm2015/lib/services/canva.service.js +0 -171
  207. package/esm2015/lib/services/config/external-config.service.js +0 -55
  208. package/esm2015/lib/services/config/img-cdn.service.js +0 -29
  209. package/esm2015/lib/services/dom.service.js +0 -36
  210. package/esm2015/lib/services/img-manager.service.js +0 -142
  211. package/esm2015/lib/services/pexels.service.js +0 -70
  212. package/esm2015/lib/services/rename-picture.service.js +0 -74
  213. package/esm2015/lib/services/table/filters-table.service.js +0 -67
  214. package/esm2015/lib/wz-img-manager.component.js +0 -212
  215. package/esm2015/lib/wz-img-manager.module.js +0 -132
  216. package/esm2015/public-api.js +0 -11
  217. package/esm2015/wizishop-img-manager.js +0 -57
  218. package/esm5/lib/animations/easeInOut/ease-in-out.animation.js +0 -12
  219. package/esm5/lib/animations/insertRemove/insert-remove.animation.js +0 -9
  220. package/esm5/lib/animations/listAnnimation/list.animation.js +0 -16
  221. package/esm5/lib/components/canva-btn/canva-btn.component.js +0 -72
  222. package/esm5/lib/components/images-view/images-actions-handler.js +0 -183
  223. package/esm5/lib/components/images-view/images-view.component.js +0 -535
  224. package/esm5/lib/components/images-view/mosaic-view/img-card/img-card.component.js +0 -87
  225. package/esm5/lib/components/images-view/mosaic-view/mosaic-view.component.js +0 -82
  226. package/esm5/lib/components/images-view/table-view/table-view.component.js +0 -52
  227. package/esm5/lib/components/img-editor/cropper/cropper.component.js +0 -312
  228. package/esm5/lib/components/img-editor/img-editor.component.js +0 -115
  229. package/esm5/lib/components/img-editor/info-section/info-section.component.js +0 -64
  230. package/esm5/lib/components/img-selection/img-selection.component.js +0 -64
  231. package/esm5/lib/components/img-tabs/img-tabs.component.js +0 -133
  232. package/esm5/lib/components/img-upload/img-upload.component.js +0 -138
  233. package/esm5/lib/components/loader/loader.component.js +0 -29
  234. package/esm5/lib/components/pexels-lib/pexels-lib.component.js +0 -216
  235. package/esm5/lib/components/shared/alert/alert.component.js +0 -38
  236. package/esm5/lib/components/shared/checkbox/checkbox.component.js +0 -71
  237. package/esm5/lib/components/shared/dropdown/dropdown.component.js +0 -27
  238. package/esm5/lib/components/shared/input-search/input-search.component.js +0 -68
  239. package/esm5/lib/components/shared/pagination/page-selector/page-selector.component.js +0 -64
  240. package/esm5/lib/components/shared/pagination/pagination.component.js +0 -56
  241. package/esm5/lib/components/shared/select/call-to-action.model.js +0 -1
  242. package/esm5/lib/components/shared/select/select-items.dto.js +0 -1
  243. package/esm5/lib/components/shared/select/select.component.js +0 -136
  244. package/esm5/lib/components/shared/table/table.component.js +0 -135
  245. package/esm5/lib/components/upload-list/upload-list.component.js +0 -103
  246. package/esm5/lib/directives/abstract-debounce/abstract-debounce.directive.js +0 -42
  247. package/esm5/lib/directives/abstract-debounce/debounce-keyup.directive.js +0 -28
  248. package/esm5/lib/directives/auto-hide.directive.js +0 -57
  249. package/esm5/lib/directives/copy-to-clipboard.directive.js +0 -42
  250. package/esm5/lib/directives/drag-drop.directive.js +0 -69
  251. package/esm5/lib/directives/loading.directive.js +0 -46
  252. package/esm5/lib/directives/table/checkBoxRow.directive.js +0 -137
  253. package/esm5/lib/directives/table/column.directive.js +0 -50
  254. package/esm5/lib/directives/table/columnHeader.directive.js +0 -229
  255. package/esm5/lib/directives/table/raw.directive.js +0 -34
  256. package/esm5/lib/directives/zindex-toggle.directive.js +0 -54
  257. package/esm5/lib/dto/ImgManagerDisplayConfig.dto.js +0 -1
  258. package/esm5/lib/dto/canva-create-design.dto.js +0 -8
  259. package/esm5/lib/dto/canva.dto.js +0 -8
  260. package/esm5/lib/dto/config/apis/api.dto.js +0 -11
  261. package/esm5/lib/dto/config/external/external-config.dto.js +0 -7
  262. package/esm5/lib/dto/config/image-cdn/image-cdn-config.dto.js +0 -12
  263. package/esm5/lib/dto/export-dtos.api.js +0 -5
  264. package/esm5/lib/dto/img-editor-config.dto.js +0 -1
  265. package/esm5/lib/dto/img-manager.dto.js +0 -1
  266. package/esm5/lib/dto/pexels-img.dto.js +0 -1
  267. package/esm5/lib/dto/picture-name-update.dto.js +0 -1
  268. package/esm5/lib/dto/stateDisplayed.dto.js +0 -1
  269. package/esm5/lib/dto/tabDisplayed.dto.js +0 -1
  270. package/esm5/lib/dto/wizi-block-media.dto.js +0 -7
  271. package/esm5/lib/pipes/images/img-src.pipe.js +0 -30
  272. package/esm5/lib/pipes/number-to-array.pipe.js +0 -17
  273. package/esm5/lib/pipes/pagination/array-total-pages/array-pages.pipe.js +0 -29
  274. package/esm5/lib/pipes/pagination/large-number-of-page/large-number-of-page.pipe.js +0 -54
  275. package/esm5/lib/pipes/pagination/text/custom-text.pipe.js +0 -37
  276. package/esm5/lib/pipes/pagination/total-pages/is-last-page.pipe.js +0 -26
  277. package/esm5/lib/pipes/select/select-filters.pipe.js +0 -20
  278. package/esm5/lib/services/alert.service.js +0 -62
  279. package/esm5/lib/services/canva.service.js +0 -181
  280. package/esm5/lib/services/config/external-config.service.js +0 -56
  281. package/esm5/lib/services/config/img-cdn.service.js +0 -34
  282. package/esm5/lib/services/dom.service.js +0 -39
  283. package/esm5/lib/services/img-event.service.js +0 -46
  284. package/esm5/lib/services/img-manager.service.js +0 -143
  285. package/esm5/lib/services/img-selection.service.js +0 -143
  286. package/esm5/lib/services/pexels.service.js +0 -72
  287. package/esm5/lib/services/rename-picture.service.js +0 -88
  288. package/esm5/lib/services/table/filters-table.service.js +0 -68
  289. package/esm5/lib/services/user-settings.service.js +0 -30
  290. package/esm5/lib/wz-img-manager.component.js +0 -228
  291. package/esm5/lib/wz-img-manager.module.js +0 -131
  292. package/esm5/public-api.js +0 -11
  293. package/esm5/wizishop-img-manager.js +0 -57
  294. package/fesm2015/wizishop-img-manager.js +0 -4533
  295. package/fesm2015/wizishop-img-manager.js.map +0 -1
  296. package/fesm5/wizishop-img-manager.js +0 -4814
  297. package/fesm5/wizishop-img-manager.js.map +0 -1
  298. package/wizishop-img-manager-0.2.108.tgz +0 -0
  299. package/wizishop-img-manager.d.ts +0 -56
  300. package/wizishop-img-manager.metadata.json +0 -1
@@ -0,0 +1,307 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { insertRemove } from '../../../animations/insertRemove/insert-remove.animation';
4
+ import { ImgCDNService } from '../../../services/config/img-cdn.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../services/config/img-cdn.service";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@wizishop/ng-wizi-bulma";
9
+ import * as i4 from "ngx-image-cropper";
10
+ import * as i5 from "../../shared/dropdown/dropdown.component";
11
+ import * as i6 from "@ngx-translate/core";
12
+ export class CropperComponent {
13
+ constructor(imgCDNService) {
14
+ this.imgCDNService = imgCDNService;
15
+ this._isImgModified = false;
16
+ this.isImgModifiedChange = new EventEmitter();
17
+ this.editClosed = new EventEmitter();
18
+ this.currentCroppedImageChange = new EventEmitter();
19
+ this.msgFailLoad = 'ImgManager.ImgEditor.msgFailLoad';
20
+ this.isNameModified = false;
21
+ this.isCropperReady = false; // Use to not display the crop validation btn, after the img is loaded or changed
22
+ this.currentCroppedImage = ''; // Img modified return in base64
23
+ this.isCropped = false;
24
+ this.isLoading = false;
25
+ this._isImgCropped = false;
26
+ this.imgCropperChange = new Subject();
27
+ this.skipNextImgCropped = 1;
28
+ this.imageChangedEvent = '';
29
+ this.croppedImage = '';
30
+ this.canvasRotation = 0;
31
+ this.rotation = 0;
32
+ this.scale = 1;
33
+ this.showCropper = false;
34
+ this.containWithinAspectRatio = false;
35
+ this.transform = {};
36
+ // dropdown list
37
+ this.resolutionConfig = [
38
+ {
39
+ label: 'ImgManager.ImgEditor.config.origin',
40
+ config: {
41
+ maintainAspectRatio: true
42
+ },
43
+ },
44
+ {
45
+ label: 'ImgManager.ImgEditor.config.free',
46
+ config: {
47
+ maintainAspectRatio: false
48
+ },
49
+ active: true
50
+ },
51
+ {
52
+ label: 'ImgManager.ImgEditor.config.square',
53
+ config: {
54
+ maintainAspectRatio: true,
55
+ aspectRatio: 1 / 1
56
+ }
57
+ },
58
+ {
59
+ label: 'ImgManager.ImgEditor.config.Portrait',
60
+ config: {
61
+ maintainAspectRatio: true,
62
+ aspectRatio: 3 / 4
63
+ }
64
+ },
65
+ {
66
+ label: 'ImgManager.ImgEditor.config.landscape',
67
+ config: {
68
+ maintainAspectRatio: true,
69
+ aspectRatio: 5 / 3
70
+ }
71
+ }
72
+ ];
73
+ this.rotationConfig = [
74
+ {
75
+ label: 'ImgManager.ImgEditor.config.schedule',
76
+ icon: "fal fa-redo-alt",
77
+ method: "rotateRight",
78
+ active: true
79
+ },
80
+ {
81
+ label: 'ImgManager.ImgEditor.config.AntiSchedule',
82
+ icon: "fal fa-undo-alt",
83
+ method: "rotateLeft"
84
+ },
85
+ {
86
+ label: 'ImgManager.ImgEditor.config.flipVert',
87
+ icon: "fal fa-sort-alt",
88
+ method: "flipVertical"
89
+ },
90
+ {
91
+ label: 'ImgManager.ImgEditor.config.flipHoriz',
92
+ icon: "fal fa-exchange-alt",
93
+ method: "flipHorizontal"
94
+ }
95
+ ];
96
+ this.zoomConfig = [
97
+ {
98
+ label: 'ImgManager.ImgEditor.config.zoom',
99
+ icon: "fal fa-search-plus",
100
+ method: "zoomIn",
101
+ active: true
102
+ },
103
+ {
104
+ label: 'ImgManager.ImgEditor.config.dezoom',
105
+ icon: "fal fa-search-minus",
106
+ method: "zoomOut"
107
+ }
108
+ ];
109
+ // Img cropper variables
110
+ this.imgCropperConfig = {
111
+ maintainAspectRatio: false,
112
+ aspectRatio: undefined
113
+ };
114
+ }
115
+ set isImgModified(isImgModified) {
116
+ this._isImgModified = isImgModified;
117
+ if (!isImgModified) {
118
+ this.restartEdit();
119
+ }
120
+ }
121
+ get isImgModified() {
122
+ return this._isImgModified;
123
+ }
124
+ set isImgCropped(isImgCropped) {
125
+ setTimeout(() => {
126
+ this._isImgCropped = isImgCropped;
127
+ }, 0);
128
+ }
129
+ get isImgCropped() {
130
+ return this._isImgCropped;
131
+ }
132
+ ngOnInit() {
133
+ this.init();
134
+ this.detectImgCropperChange();
135
+ }
136
+ init() {
137
+ this.imgRoute = this.getRAWImgRoute();
138
+ this.imgType = this.getImgType();
139
+ this.croppedImage = null;
140
+ this.setDefautAspectRatio();
141
+ }
142
+ getRAWImgRoute() {
143
+ return this.imgCDNService.getUrlImg('raw') + this.imgToEdit.file_name;
144
+ }
145
+ getImgType() {
146
+ return (this.imgToEdit.file_name ? this.imgToEdit.file_name.split('.').pop() : undefined);
147
+ }
148
+ setDefautAspectRatio() {
149
+ const height = parseInt(this.imgToEdit.raw_height);
150
+ const width = parseInt(this.imgToEdit.raw_width);
151
+ this.defaultAspectRatio = height / width;
152
+ this.resolutionConfig[0].config.aspectRatio = this.defaultAspectRatio;
153
+ this.imgCropperConfig.aspectRatio = this.defaultAspectRatio;
154
+ }
155
+ onEditClosed(msgKey) {
156
+ this.editClosed.emit(msgKey);
157
+ }
158
+ onRestart() {
159
+ this.isImgModifiedChange.emit(false);
160
+ }
161
+ restartEdit() {
162
+ this.init();
163
+ this.resetConfCropper();
164
+ }
165
+ onImgModified() {
166
+ this.isImgModified = true;
167
+ this.isImgModifiedChange.emit(true);
168
+ }
169
+ ////// Img cropper methods ////////////////////////////////////////////////////////////////////////////////////////////////////////
170
+ /* Cropper output events */
171
+ fileChangeEvent(event) {
172
+ this.imageChangedEvent = event;
173
+ }
174
+ imageCropped(event) {
175
+ this.imgCropperChange.next();
176
+ this.currentCroppedImage = event.base64;
177
+ this.currentCroppedImageChange.emit(this.currentCroppedImage);
178
+ }
179
+ imageLoaded() {
180
+ this.showCropper = true;
181
+ }
182
+ cropperReady() {
183
+ this.isCropperReady = true;
184
+ }
185
+ loadImageFailed() {
186
+ this.onEditClosed(this.msgFailLoad);
187
+ }
188
+ /* Resize functions */
189
+ changeResolutionSize(index) {
190
+ this.setActiveItem(this.resolutionConfig, index);
191
+ const config = this.resolutionConfig[index].config;
192
+ this.setCropperProperties(config);
193
+ }
194
+ confirmCrop() {
195
+ setTimeout(() => {
196
+ this.imgRoute = null;
197
+ this.croppedImage = this.currentCroppedImage;
198
+ this.skipNextImgCropped = 2;
199
+ this.isImgCropped = false;
200
+ }, 0);
201
+ this.resetConfCropper();
202
+ this.onImgModified();
203
+ }
204
+ resetConfCropper() {
205
+ this.scale = 1;
206
+ this.rotation = 0;
207
+ this.canvasRotation = 0;
208
+ this.transform = {};
209
+ }
210
+ setActiveItem(array, index) {
211
+ // Set active-item class for the dropdown
212
+ array.forEach((item, indexItem) => {
213
+ item.active = indexItem === index ? true : false;
214
+ });
215
+ }
216
+ setCropperProperties(config) {
217
+ for (const property in config) {
218
+ this.imgCropperConfig[property] = config[property];
219
+ }
220
+ }
221
+ detectImgCropperChange() {
222
+ this.imgCropperChange
223
+ .subscribe(() => {
224
+ this.skipNextImgCropped--;
225
+ if (this.skipNextImgCropped >= 0) {
226
+ return;
227
+ }
228
+ this.skipNextImgCropped = 0;
229
+ this.isImgCropped = true;
230
+ });
231
+ }
232
+ /* Rotations functions */
233
+ rotateLeft() {
234
+ this.canvasRotation--;
235
+ this.flipAfterRotate();
236
+ this.onImgModified();
237
+ }
238
+ rotateRight() {
239
+ this.canvasRotation++;
240
+ this.flipAfterRotate();
241
+ this.onImgModified();
242
+ }
243
+ flipHorizontal() {
244
+ this.transform = {
245
+ ...this.transform,
246
+ flipH: !this.transform.flipH
247
+ };
248
+ this.onImgModified();
249
+ }
250
+ flipVertical() {
251
+ this.transform = {
252
+ ...this.transform,
253
+ flipV: !this.transform.flipV
254
+ };
255
+ this.onImgModified();
256
+ }
257
+ flipAfterRotate() {
258
+ const flippedH = this.transform.flipH;
259
+ const flippedV = this.transform.flipV;
260
+ this.transform = {
261
+ ...this.transform,
262
+ flipH: flippedV,
263
+ flipV: flippedH
264
+ };
265
+ }
266
+ /* Zoom functions */
267
+ zoomOut() {
268
+ this.scale -= this.scale < 0.2 ? 0 : .1;
269
+ this.transform = {
270
+ ...this.transform,
271
+ scale: this.scale
272
+ };
273
+ this.onImgModified();
274
+ }
275
+ zoomIn() {
276
+ this.scale += .1;
277
+ this.transform = {
278
+ ...this.transform,
279
+ scale: this.scale
280
+ };
281
+ this.onImgModified();
282
+ }
283
+ applyMethod(method) {
284
+ this[method](); // call the method contains in zoomConfig or rotationConfig
285
+ }
286
+ }
287
+ CropperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CropperComponent, deps: [{ token: i1.ImgCDNService }], target: i0.ɵɵFactoryTarget.Component });
288
+ CropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: CropperComponent, selector: "cropper", inputs: { imgToEdit: "imgToEdit", isImgModified: "isImgModified" }, outputs: { isImgModifiedChange: "isImgModifiedChange", editClosed: "editClosed", currentCroppedImageChange: "currentCroppedImageChange" }, ngImport: i0, template: "<div class=\"img-editor__container__toolsContainer\">\n\n <div *ngIf=\"isImgCropped\">\n <div\n class=\"img-editor__container__toolsContainer__tool img-editor__container__toolsContainer__tool--button\"\n (click)=\"confirmCrop()\"\n [nwbToolTip]=\"'ImgManager.ImgEditor.ValidtToolTip' | translate\"\n nwbToolTipPosition=\"left\"\n >\n <i class=\"far fa-check\"></i>\n <p>{{ 'ImgManager.ImgEditor.Valid' | translate }}</p>\n </div>\n </div>\n\n <!-- Resolution -->\n <dropdown dropdownId=\"dropdown-resolution\">\n <ng-container label>\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n >\n <i class=\"far fa-crop\"></i>\n <p>{{ 'ImgManager.ImgEditor.crop' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of resolutionConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"changeResolutionSize(index)\">\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Zoom -->\n <dropdown dropdownId=\"dropdown-rotation\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"zoomIn()\">\n <i class=\"far fa-expand-arrows-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.display' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of zoomConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Rotation -->\n <dropdown dropdownId=\"dropdown-rotation\" dropDownMenuClass=\"img-editor__container__toolsContainer__RotationDropdown\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"rotateRight()\">\n <i class=\"far fa-redo\"></i>\n <p>{{ 'ImgManager.ImgEditor.rotation' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of rotationConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n (click)=\"onRestart()\"\n @insertRemoveAnnim\n >\n <i class=\"far fa-retweet-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.restart' | translate }}</p>\n </div>\n</div>\n\n<div class=\"img-editor__image-cropper\" >\n <image-cropper\n [imageURL]=\"imgRoute\"\n [imageBase64]=\"croppedImage\"\n [maintainAspectRatio]=\"imgCropperConfig.maintainAspectRatio\"\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\n [aspectRatio]=\"imgCropperConfig.aspectRatio\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [alignImage]=\"'center'\"\n [style.display]=\"showCropper ? null : 'none'\"\n [format]=\"imgType\"\n [backgroundColor]=\"'white'\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n (cropperReady)=\"cropperReady()\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NwbToolTipDirective, selector: "[nwbToolTip]", inputs: ["nwbToolTip", "nwbToolTipPosition", "nwbToolTipIsMultiline"] }, { kind: "component", type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "component", type: i5.DropdownComponent, selector: "dropdown", inputs: ["dropDownMenuClass", "disable"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }], animations: [
289
+ insertRemove
290
+ ] });
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CropperComponent, decorators: [{
292
+ type: Component,
293
+ args: [{ selector: 'cropper', animations: [
294
+ insertRemove
295
+ ], template: "<div class=\"img-editor__container__toolsContainer\">\n\n <div *ngIf=\"isImgCropped\">\n <div\n class=\"img-editor__container__toolsContainer__tool img-editor__container__toolsContainer__tool--button\"\n (click)=\"confirmCrop()\"\n [nwbToolTip]=\"'ImgManager.ImgEditor.ValidtToolTip' | translate\"\n nwbToolTipPosition=\"left\"\n >\n <i class=\"far fa-check\"></i>\n <p>{{ 'ImgManager.ImgEditor.Valid' | translate }}</p>\n </div>\n </div>\n\n <!-- Resolution -->\n <dropdown dropdownId=\"dropdown-resolution\">\n <ng-container label>\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n >\n <i class=\"far fa-crop\"></i>\n <p>{{ 'ImgManager.ImgEditor.crop' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of resolutionConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"changeResolutionSize(index)\">\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Zoom -->\n <dropdown dropdownId=\"dropdown-rotation\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"zoomIn()\">\n <i class=\"far fa-expand-arrows-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.display' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of zoomConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <!-- Rotation -->\n <dropdown dropdownId=\"dropdown-rotation\" dropDownMenuClass=\"img-editor__container__toolsContainer__RotationDropdown\">\n <ng-container label>\n <div class=\"img-editor__container__toolsContainer__tool\" (click)=\"rotateRight()\">\n <i class=\"far fa-redo\"></i>\n <p>{{ 'ImgManager.ImgEditor.rotation' | translate }}</p>\n </div>\n </ng-container>\n <ng-container item *ngFor=\"let item of rotationConfig; let index = index;\">\n <div\n class=\"dropdown-item\"\n [ngClass]=\"{'active-item': item.active}\"\n (click)=\"applyMethod(item.method)\">\n <i *ngIf=\"item.icon\" [ngClass]=\"item.icon\"></i>\n <p>{{item.label | translate}}</p>\n </div>\n </ng-container>\n </dropdown>\n\n <div\n class=\"img-editor__container__toolsContainer__tool\"\n (click)=\"onRestart()\"\n @insertRemoveAnnim\n >\n <i class=\"far fa-retweet-alt\"></i>\n <p>{{ 'ImgManager.ImgEditor.restart' | translate }}</p>\n </div>\n</div>\n\n<div class=\"img-editor__image-cropper\" >\n <image-cropper\n [imageURL]=\"imgRoute\"\n [imageBase64]=\"croppedImage\"\n [maintainAspectRatio]=\"imgCropperConfig.maintainAspectRatio\"\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\n [aspectRatio]=\"imgCropperConfig.aspectRatio\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [alignImage]=\"'center'\"\n [style.display]=\"showCropper ? null : 'none'\"\n [format]=\"imgType\"\n [backgroundColor]=\"'white'\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n (cropperReady)=\"cropperReady()\"\n (loadImageFailed)=\"loadImageFailed()\"\n ></image-cropper>\n</div>\n" }]
296
+ }], ctorParameters: function () { return [{ type: i1.ImgCDNService }]; }, propDecorators: { imgToEdit: [{
297
+ type: Input
298
+ }], isImgModified: [{
299
+ type: Input
300
+ }], isImgModifiedChange: [{
301
+ type: Output
302
+ }], editClosed: [{
303
+ type: Output
304
+ }], currentCroppedImageChange: [{
305
+ type: Output
306
+ }] } });
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ei1pbWctbWFuYWdlci9zcmMvbGliL2NvbXBvbmVudHMvaW1nLWVkaXRvci9jcm9wcGVyL2Nyb3BwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltZy1lZGl0b3IvY3JvcHBlci9jcm9wcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMERBQTBELENBQUM7QUFHeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQVN6RSxNQUFNLE9BQU8sZ0JBQWdCO0lBK0kzQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBakk5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUd4Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBR2xELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdkQsZ0JBQVcsR0FBVyxrQ0FBa0MsQ0FBQztRQUV6RCxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxtQkFBYyxHQUFZLEtBQUssQ0FBQyxDQUFDLGlGQUFpRjtRQUNsSCx3QkFBbUIsR0FBVyxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDbEUsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixjQUFTLEdB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OzJGQUVVLGdCQUFnQjtrQkFQNUIsU0FBUzsrQkFDRSxTQUFTLGNBRVA7d0JBQ1YsWUFBWTtxQkFDYjtvR0FLRCxTQUFTO3NCQURSLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFhTixtQkFBbUI7c0JBRGxCLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNO2dCQUlQLHlCQUF5QjtzQkFEeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlVHJhbnNmb3JtLCBPdXRwdXRGb3JtYXQgfSBmcm9tICduZ3gtaW1hZ2UtY3JvcHBlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbnNlcnRSZW1vdmUgfSBmcm9tICcuLi8uLi8uLi9hbmltYXRpb25zL2luc2VydFJlbW92ZS9pbnNlcnQtcmVtb3ZlLmFuaW1hdGlvbic7XG5pbXBvcnQgeyBDcm9wcGVyQ29uZmlnRFRPLCBJbWdDcm9wcGVyQ29uZmlnRFRPIH0gZnJvbSAnLi4vLi4vLi4vZHRvL2ltZy1lZGl0b3ItY29uZmlnLmR0byc7XG5pbXBvcnQgeyBJbWdQaWN0dXJlRFRPIH0gZnJvbSAnLi4vLi4vLi4vZHRvL2ltZy1tYW5hZ2VyLmR0byc7XG5pbXBvcnQgeyBJbWdDRE5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlnL2ltZy1jZG4uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nyb3BwZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JvcHBlci5jb21wb25lbnQuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBpbnNlcnRSZW1vdmVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKVxuICBpbWdUb0VkaXQ6IEltZ1BpY3R1cmVEVE87XG5cbiAgQElucHV0KClcbiAgc2V0IGlzSW1nTW9kaWZpZWQoaXNJbWdNb2RpZmllZDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzSW1nTW9kaWZpZWQgPSBpc0ltZ01vZGlmaWVkO1xuICAgIGlmICghaXNJbWdNb2RpZmllZCkge1xuICAgICAgdGhpcy5yZXN0YXJ0RWRpdCgpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNJbWdNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbWdNb2RpZmllZDtcbiAgfVxuICBwcml2YXRlIF9pc0ltZ01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIGlzSW1nTW9kaWZpZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGVkaXRDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIGN1cnJlbnRDcm9wcGVkSW1hZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBtc2dGYWlsTG9hZDogc3RyaW5nID0gJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLm1zZ0ZhaWxMb2FkJztcblxuICBpc05hbWVNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0Nyb3BwZXJSZWFkeTogYm9vbGVhbiA9IGZhbHNlOyAvLyBVc2UgdG8gbm90IGRpc3BsYXkgdGhlIGNyb3AgdmFsaWRhdGlvbiBidG4sIGFmdGVyIHRoZSBpbWcgaXMgbG9hZGVkIG9yIGNoYW5nZWRcbiAgY3VycmVudENyb3BwZWRJbWFnZTogc3RyaW5nID0gJyc7IC8vIEltZyBtb2RpZmllZCByZXR1cm4gaW4gYmFzZTY0XG4gIGlzQ3JvcHBlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBfaXNJbWdDcm9wcGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHNldCBpc0ltZ0Nyb3BwZWQoaXNJbWdDcm9wcGVkOiBib29sZWFuKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9pc0ltZ0Nyb3BwZWQgPSBpc0ltZ0Nyb3BwZWQ7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXQgaXNJbWdDcm9wcGVkKCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbWdDcm9wcGVkO1xuICB9XG4gIGltZ0Nyb3BwZXJDaGFuZ2U6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBza2lwTmV4dEltZ0Nyb3BwZWQ6IG51bWJlciA9IDE7XG5cbiAgLy8gSW1hZ2UgQ3JvcHBlciBwcm9wZXJ0aWVzXG4gIGltZ1R5cGU6IE91dHB1dEZvcm1hdDtcbiAgaW1nUm91dGU6IHN0cmluZztcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IGFueSA9ICcnO1xuICBjcm9wcGVkSW1hZ2U6IGFueSA9ICcnO1xuICBjYW52YXNSb3RhdGlvbiA9IDA7XG4gIHJvdGF0aW9uID0gMDtcbiAgc2NhbGUgPSAxO1xuICBzaG93Q3JvcHBlciA9IGZhbHNlO1xuICBjb250YWluV2l0aGluQXNwZWN0UmF0aW8gPSBmYWxzZTtcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xuXG4gIGRlZmF1bHRBc3BlY3RSYXRpbzogbnVtYmVyO1xuXG4gIC8vIGRyb3Bkb3duIGxpc3RcbiAgcmVzb2x1dGlvbkNvbmZpZzpJbWdDcm9wcGVyQ29uZmlnRFRPW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcub3JpZ2luJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcuZnJlZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2VcbiAgICAgIH0sXG4gICAgICBhY3RpdmU6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLnNxdWFyZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcbiAgICAgICAgYXNwZWN0UmF0aW86IDEgLyAxXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmNvbmZpZy5Qb3J0cmFpdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcbiAgICAgICAgYXNwZWN0UmF0aW86IDMgLyA0XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmNvbmZpZy5sYW5kc2NhcGUnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IHRydWUsXG4gICAgICAgIGFzcGVjdFJhdGlvOiA1IC8gM1xuICAgICAgfVxuICAgIH1cbiAgXTtcblxuICByb3RhdGlvbkNvbmZpZzpJbWdDcm9wcGVyQ29uZmlnRFRPW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcuc2NoZWR1bGUnLFxuICAgICAgaWNvbjogXCJmYWwgZmEtcmVkby1hbHRcIixcbiAgICAgIG1ldGhvZDogXCJyb3RhdGVSaWdodFwiLFxuICAgICAgYWN0aXZlOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmNvbmZpZy5BbnRpU2NoZWR1bGUnLFxuICAgICAgaWNvbjogXCJmYWwgZmEtdW5kby1hbHRcIixcbiAgICAgIG1ldGhvZDogXCJyb3RhdGVMZWZ0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLmZsaXBWZXJ0JyxcbiAgICAgIGljb246IFwiZmFsIGZhLXNvcnQtYWx0XCIsXG4gICAgICBtZXRob2Q6IFwiZmxpcFZlcnRpY2FsXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLmZsaXBIb3JpeicsXG4gICAgICBpY29uOiBcImZhbCBmYS1leGNoYW5nZS1hbHRcIixcbiAgICAgIG1ldGhvZDogXCJmbGlwSG9yaXpvbnRhbFwiXG4gICAgfVxuICBdO1xuXG4gIHpvb21Db25maWc6SW1nQ3JvcHBlckNvbmZpZ0RUT1tdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29uZmlnLnpvb20nLFxuICAgICAgaWNvbjogXCJmYWwgZmEtc2VhcmNoLXBsdXNcIixcbiAgICAgIG1ldGhvZDogXCJ6b29tSW5cIixcbiAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5jb25maWcuZGV6b29tJyxcbiAgICAgIGljb246IFwiZmFsIGZhLXNlYXJjaC1taW51c1wiLFxuICAgICAgbWV0aG9kOiBcInpvb21PdXRcIlxuICAgIH1cbiAgXTtcblxuICAvLyBJbWcgY3JvcHBlciB2YXJpYWJsZXNcbiAgaW1nQ3JvcHBlckNvbmZpZzpDcm9wcGVyQ29uZmlnRFRPID0ge1xuICAgIG1haW50YWluQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgIGFzcGVjdFJhdGlvOiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW1nQ0ROU2VydmljZTogSW1nQ0ROU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuZGV0ZWN0SW1nQ3JvcHBlckNoYW5nZSgpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmltZ1JvdXRlID0gdGhpcy5nZXRSQVdJbWdSb3V0ZSgpO1xuICAgIHRoaXMuaW1nVHlwZSA9IHRoaXMuZ2V0SW1nVHlwZSgpO1xuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLnNldERlZmF1dEFzcGVjdFJhdGlvKCk7XG4gIH1cblxuICBnZXRSQVdJbWdSb3V0ZSgpe1xuICAgIHJldHVybiB0aGlzLmltZ0NETlNlcnZpY2UuZ2V0VXJsSW1nKCdyYXcnKSArIHRoaXMuaW1nVG9FZGl0LmZpbGVfbmFtZTtcbiAgfVxuXG4gIGdldEltZ1R5cGUoKSB7XG4gICAgcmV0dXJuICh0aGlzLmltZ1RvRWRpdC5maWxlX25hbWUgPyB0aGlzLmltZ1RvRWRpdC5maWxlX25hbWUuc3BsaXQoJy4nKS5wb3AoKSA6IHVuZGVmaW5lZCkgYXMgT3V0cHV0Rm9ybWF0O1xuICB9XG5cbiAgc2V0RGVmYXV0QXNwZWN0UmF0aW8oKSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQodGhpcy5pbWdUb0VkaXQucmF3X2hlaWdodCk7XG4gICAgY29uc3Qgd2lkdGggPSBwYXJzZUludCh0aGlzLmltZ1RvRWRpdC5yYXdfd2lkdGgpO1xuICAgIHRoaXMuZGVmYXVsdEFzcGVjdFJhdGlvID0gaGVpZ2h0IC8gd2lkdGg7XG4gICAgdGhpcy5yZXNvbHV0aW9uQ29uZmlnWzBdLmNvbmZpZy5hc3BlY3RSYXRpbyA9IHRoaXMuZGVmYXVsdEFzcGVjdFJhdGlvO1xuICAgIHRoaXMuaW1nQ3JvcHBlckNvbmZpZy5hc3BlY3RSYXRpbyA9IHRoaXMuZGVmYXVsdEFzcGVjdFJhdGlvO1xuICB9XG5cbiAgb25FZGl0Q2xvc2VkKG1zZ0tleT86IHN0cmluZykge1xuICAgIHRoaXMuZWRpdENsb3NlZC5lbWl0KG1zZ0tleSk7XG4gIH1cblxuICBvblJlc3RhcnQoKSB7XG4gICAgdGhpcy5pc0ltZ01vZGlmaWVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcmVzdGFydEVkaXQoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZXNldENvbmZDcm9wcGVyKCk7XG4gIH1cblxuICBvbkltZ01vZGlmaWVkKCkge1xuICAgIHRoaXMuaXNJbWdNb2RpZmllZCA9IHRydWU7XG4gICAgdGhpcy5pc0ltZ01vZGlmaWVkQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvLy8vLy8gSW1nIGNyb3BwZXIgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qIENyb3BwZXIgb3V0cHV0IGV2ZW50cyAqL1xuXG4gIGZpbGVDaGFuZ2VFdmVudChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgaW1hZ2VDcm9wcGVkKGV2ZW50OiBJbWFnZUNyb3BwZWRFdmVudCkge1xuICAgIHRoaXMuaW1nQ3JvcHBlckNoYW5nZS5uZXh0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRDcm9wcGVkSW1hZ2UgPSBldmVudC5iYXNlNjQ7XG4gICAgdGhpcy5jdXJyZW50Q3JvcHBlZEltYWdlQ2hhbmdlLmVtaXQodGhpcy5jdXJyZW50Q3JvcHBlZEltYWdlKTtcbiAgfVxuXG4gIGltYWdlTG9hZGVkKCkge1xuICAgIHRoaXMuc2hvd0Nyb3BwZXIgPSB0cnVlO1xuICB9XG5cbiAgY3JvcHBlclJlYWR5KCkge1xuICAgIHRoaXMuaXNDcm9wcGVyUmVhZHkgPSB0cnVlO1xuICB9XG5cbiAgbG9hZEltYWdlRmFpbGVkKCkge1xuICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnRmFpbExvYWQpO1xuICB9XG5cbiAgLyogUmVzaXplIGZ1bmN0aW9ucyAqL1xuXG4gIGNoYW5nZVJlc29sdXRpb25TaXplKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5yZXNvbHV0aW9uQ29uZmlnLCBpbmRleCk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5yZXNvbHV0aW9uQ29uZmlnW2luZGV4XS5jb25maWc7XG4gICAgdGhpcy5zZXRDcm9wcGVyUHJvcGVydGllcyhjb25maWcpO1xuICB9XG5cbiAgY29uZmlybUNyb3AoKSB7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8gQXZvaWQgaW1hZ2UtY3JvcHBlciBlcnJvclxuICAgICAgdGhpcy5pbWdSb3V0ZSA9IG51bGw7XG4gICAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IHRoaXMuY3VycmVudENyb3BwZWRJbWFnZTtcbiAgICAgIHRoaXMuc2tpcE5leHRJbWdDcm9wcGVkID0gMjtcbiAgICAgIHRoaXMuaXNJbWdDcm9wcGVkID0gZmFsc2U7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLnJlc2V0Q29uZkNyb3BwZXIoKTtcbiAgICB0aGlzLm9uSW1nTW9kaWZpZWQoKTtcbiAgfVxuXG4gIHJlc2V0Q29uZkNyb3BwZXIoKSB7XG4gICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlSXRlbShhcnJheTphbnlbXSwgaW5kZXg6IG51bWJlcikge1xuICAgIC8vIFNldCBhY3RpdmUtaXRlbSBjbGFzcyBmb3IgdGhlIGRyb3Bkb3duXG4gICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaW5kZXhJdGVtKSA9PiB7XG4gICAgICBpdGVtLmFjdGl2ZSA9IGluZGV4SXRlbSA9PT0gaW5kZXggPyB0cnVlIDogZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldENyb3BwZXJQcm9wZXJ0aWVzKGNvbmZpZzogYW55KSB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBjb25maWcpIHtcbiAgICAgIHRoaXMuaW1nQ3JvcHBlckNvbmZpZ1twcm9wZXJ0eV0gPSBjb25maWdbcHJvcGVydHldO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0SW1nQ3JvcHBlckNoYW5nZSgpIHtcbiAgICB0aGlzLmltZ0Nyb3BwZXJDaGFuZ2VcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNraXBOZXh0SW1nQ3JvcHBlZC0tO1xuICAgICAgICBpZiAodGhpcy5za2lwTmV4dEltZ0Nyb3BwZWQgPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNraXBOZXh0SW1nQ3JvcHBlZCA9IDA7XG4gICAgICAgIHRoaXMuaXNJbWdDcm9wcGVkID0gdHJ1ZTtcbiAgICB9KVxuXG4gIH1cblxuICAvKiBSb3RhdGlvbnMgZnVuY3Rpb25zICovXG5cbiAgcm90YXRlTGVmdCgpIHtcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24tLTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgICB0aGlzLm9uSW1nTW9kaWZpZWQoKTtcbiAgfVxuXG4gIHJvdGF0ZVJpZ2h0KCkge1xuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICAgIHRoaXMub25JbWdNb2RpZmllZCgpO1xuICB9XG5cbiAgZmxpcEhvcml6b250YWwoKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICBmbGlwSDogIXRoaXMudHJhbnNmb3JtLmZsaXBIXG4gICAgICB9O1xuICAgICAgdGhpcy5vbkltZ01vZGlmaWVkKCk7XG4gIH1cblxuICBmbGlwVmVydGljYWwoKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICBmbGlwVjogIXRoaXMudHJhbnNmb3JtLmZsaXBWXG4gICAgICB9O1xuICAgICAgdGhpcy5vbkltZ01vZGlmaWVkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsaXBBZnRlclJvdGF0ZSgpIHtcbiAgICBjb25zdCBmbGlwcGVkSCA9IHRoaXMudHJhbnNmb3JtLmZsaXBIO1xuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgICBmbGlwSDogZmxpcHBlZFYsXG4gICAgICAgIGZsaXBWOiBmbGlwcGVkSFxuICAgIH07XG4gIH1cblxuICAvKiBab29tIGZ1bmN0aW9ucyAqL1xuXG4gIHpvb21PdXQoKSB7XG4gICAgICB0aGlzLnNjYWxlIC09ICB0aGlzLnNjYWxlIDwgMC4yPyAwIDogLjE7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZVxuICAgICAgfTtcbiAgICAgIHRoaXMub25JbWdNb2RpZmllZCgpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgICAgdGhpcy5zY2FsZSArPSAuMTtcbiAgICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgIHNjYWxlOiB0aGlzLnNjYWxlXG4gICAgICB9O1xuICAgICAgdGhpcy5vbkltZ01vZGlmaWVkKCk7XG4gIH1cblxuICBhcHBseU1ldGhvZChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXNbbWV0aG9kXSgpOyAvLyBjYWxsIHRoZSBtZXRob2QgY29udGFpbnMgaW4gem9vbUNvbmZpZyBvciByb3RhdGlvbkNvbmZpZ1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9fY29udGFpbmVyX190b29sc0NvbnRhaW5lclwiPlxuXG4gICAgPGRpdiAqbmdJZj1cImlzSW1nQ3JvcHBlZFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX190b29sIGltZy1lZGl0b3JfX2NvbnRhaW5lcl9fdG9vbHNDb250YWluZXJfX3Rvb2wtLWJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1Dcm9wKClcIlxuICAgICAgICAgIFtud2JUb29sVGlwXT1cIidJbWdNYW5hZ2VyLkltZ0VkaXRvci5WYWxpZHRUb29sVGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgbndiVG9vbFRpcFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNoZWNrXCI+PC9pPlxuICAgICAgICAgICAgPHA+e3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLlZhbGlkJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlc29sdXRpb24gLS0+XG4gICAgPGRyb3Bkb3duIGRyb3Bkb3duSWQ9XCJkcm9wZG93bi1yZXNvbHV0aW9uXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGFiZWw+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWVkaXRvcl9fY29udGFpbmVyX190b29sc0NvbnRhaW5lcl9fdG9vbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY3JvcFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8cD57eyAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY3JvcCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgaXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiByZXNvbHV0aW9uQ29uZmlnOyBsZXQgaW5kZXggPSBpbmRleDtcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpdGVtLmFjdGl2ZX1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VSZXNvbHV0aW9uU2l6ZShpbmRleClcIj5cbiAgICAgICAgICAgICAgICA8cD57e2l0ZW0ubGFiZWwgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Ryb3Bkb3duPlxuXG4gICAgPCEtLSBab29tIC0tPlxuICAgIDxkcm9wZG93biBkcm9wZG93bklkPVwiZHJvcGRvd24tcm90YXRpb25cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX190b29sXCIgKGNsaWNrKT1cInpvb21JbigpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtZXhwYW5kLWFycm93cy1hbHRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLmRpc3BsYXknIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygem9vbUNvbmZpZzsgbGV0IGluZGV4ID0gaW5kZXg7XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpdGVtLmFjdGl2ZX1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlNZXRob2QoaXRlbS5tZXRob2QpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5pY29uXCIgW25nQ2xhc3NdPVwiaXRlbS5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8cD57e2l0ZW0ubGFiZWwgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Ryb3Bkb3duPlxuXG4gICAgPCEtLSBSb3RhdGlvbiAtLT5cbiAgICA8ZHJvcGRvd24gZHJvcGRvd25JZD1cImRyb3Bkb3duLXJvdGF0aW9uXCIgZHJvcERvd25NZW51Q2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX19Sb3RhdGlvbkRyb3Bkb3duXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9fY29udGFpbmVyX190b29sc0NvbnRhaW5lcl9fdG9vbFwiIChjbGljayk9XCJyb3RhdGVSaWdodCgpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtcmVkb1wiPjwvaT5cbiAgICAgICAgICAgICAgICA8cD57eyAnSW1nTWFuYWdlci5JbWdFZGl0b3Iucm90YXRpb24nIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm90YXRpb25Db25maWc7IGxldCBpbmRleCA9IGluZGV4O1wiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1pdGVtJzogaXRlbS5hY3RpdmV9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5TWV0aG9kKGl0ZW0ubWV0aG9kKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0uaWNvblwiIFtuZ0NsYXNzXT1cIml0ZW0uaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHA+e3tpdGVtLmxhYmVsIHwgdHJhbnNsYXRlfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kcm9wZG93bj5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbWctZWRpdG9yX19jb250YWluZXJfX3Rvb2xzQ29udGFpbmVyX190b29sXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uUmVzdGFydCgpXCJcbiAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1yZXR3ZWV0LWFsdFwiPjwvaT5cbiAgICAgICAgPHA+e3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLnJlc3RhcnQnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbWFnZS1jcm9wcGVyXCIgPlxuICAgIDxpbWFnZS1jcm9wcGVyXG4gICAgICAgIFtpbWFnZVVSTF09XCJpbWdSb3V0ZVwiXG4gICAgICAgIFtpbWFnZUJhc2U2NF09XCJjcm9wcGVkSW1hZ2VcIlxuICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJpbWdDcm9wcGVyQ29uZmlnLm1haW50YWluQXNwZWN0UmF0aW9cIlxuICAgICAgICBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb1wiXG4gICAgICAgIFthc3BlY3RSYXRpb109XCJpbWdDcm9wcGVyQ29uZmlnLmFzcGVjdFJhdGlvXCJcbiAgICAgICAgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXG4gICAgICAgIFtyb3VuZENyb3BwZXJdPVwiZmFsc2VcIlxuICAgICAgICBbY2FudmFzUm90YXRpb25dPVwiY2FudmFzUm90YXRpb25cIlxuICAgICAgICBbdHJhbnNmb3JtXT1cInRyYW5zZm9ybVwiXG4gICAgICAgIFthbGlnbkltYWdlXT1cIidjZW50ZXInXCJcbiAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwic2hvd0Nyb3BwZXIgPyBudWxsIDogJ25vbmUnXCJcbiAgICAgICAgW2Zvcm1hdF09XCJpbWdUeXBlXCJcbiAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInd2hpdGUnXCJcbiAgICAgICAgKGltYWdlQ3JvcHBlZCk9XCJpbWFnZUNyb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChpbWFnZUxvYWRlZCk9XCJpbWFnZUxvYWRlZCgpXCJcbiAgICAgICAgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoKVwiXG4gICAgICAgIChsb2FkSW1hZ2VGYWlsZWQpPVwibG9hZEltYWdlRmFpbGVkKClcIlxuICAgID48L2ltYWdlLWNyb3BwZXI+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,109 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { ImgManagerService } from '../../services/img-manager.service';
3
+ import { easeInOut } from '../../animations/easeInOut/ease-in-out.animation';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/img-manager.service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "ngx-perfect-scrollbar";
8
+ import * as i4 from "./info-section/info-section.component";
9
+ import * as i5 from "./cropper/cropper.component";
10
+ import * as i6 from "../../directives/loading.directive";
11
+ import * as i7 from "@ngx-translate/core";
12
+ export class ImgEditorComponent {
13
+ constructor(imgManagerService) {
14
+ this.imgManagerService = imgManagerService;
15
+ this.editClosed = new EventEmitter();
16
+ this.isLoading = false;
17
+ this.isImgModified = false;
18
+ this.isNameModified = false;
19
+ this.currentCroppedImage = ''; // Img modified return in base64 by the cropper
20
+ this.msgFailSave = 'ImgManager.ImgEditor.msgFailSave';
21
+ this.msgFailLoad = 'ImgManager.ImgEditor.msgFailLoad';
22
+ this.msgSuccessEdit = "Les modifications de l'image ont bien été enregistrées.";
23
+ }
24
+ ngOnInit() {
25
+ this.previousName = this.imgToEdit.display_name;
26
+ }
27
+ onSave() {
28
+ if (this.isLoading) {
29
+ return;
30
+ }
31
+ this.isLoading = true;
32
+ if (!this.isImgModified && !this.isNameModified) {
33
+ this.isLoading = false;
34
+ this.onEditClosed();
35
+ }
36
+ const obsReplaceImg = this.imgManagerService.replaceImg(this.currentCroppedImage, this.imgToEdit.id_file);
37
+ const obsChangeImgName = this.imgManagerService.changeImgName(this.imgToEdit.display_name, this.imgToEdit.id_file);
38
+ if (this.isImgModified && this.isNameModified) {
39
+ this.ranameAndReplaceImg(obsChangeImgName, obsReplaceImg);
40
+ return;
41
+ }
42
+ if (this.isImgModified) {
43
+ obsReplaceImg.subscribe(data => {
44
+ this.isLoading = false;
45
+ this.onEditClosed(this.msgSuccessEdit);
46
+ }, error => {
47
+ this.isLoading = false;
48
+ this.currentCroppedImage = '';
49
+ this.onEditClosed(this.msgFailSave);
50
+ });
51
+ return;
52
+ }
53
+ if (this.isNameModified) {
54
+ obsChangeImgName.subscribe(data => {
55
+ this.isLoading = false;
56
+ this.previousName = this.imgToEdit.display_name;
57
+ this.onEditClosed(this.msgSuccessEdit);
58
+ }, error => {
59
+ this.isLoading = false;
60
+ this.imgToEdit.display_name = this.previousName;
61
+ this.onEditClosed(this.msgFailSave);
62
+ });
63
+ }
64
+ this.isNameModified = false;
65
+ }
66
+ onEditClosed(msgKey) {
67
+ this.editClosed.emit(msgKey);
68
+ }
69
+ onRestartEdit() {
70
+ this.isImgModified = false;
71
+ this.isNameModified = false;
72
+ this.imgToEdit.display_name = this.previousName;
73
+ }
74
+ onCancel() {
75
+ this.onEditClosed('');
76
+ }
77
+ onImgCropped(imgBase64) {
78
+ this.currentCroppedImage = imgBase64;
79
+ }
80
+ ranameAndReplaceImg(obsChangeImgName, obsReplaceImg) {
81
+ // Avoid to use forkjoin, because it can create conflict and loos the img
82
+ obsChangeImgName.subscribe(res1 => {
83
+ obsReplaceImg.subscribe(res2 => {
84
+ this.onEditClosed(this.msgSuccessEdit);
85
+ }, error => {
86
+ this.onEditClosed(this.msgFailSave);
87
+ });
88
+ }, error => {
89
+ this.onEditClosed(this.msgFailSave);
90
+ });
91
+ }
92
+ }
93
+ ImgEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ImgEditorComponent, deps: [{ token: i1.ImgManagerService }], target: i0.ɵɵFactoryTarget.Component });
94
+ ImgEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: ImgEditorComponent, selector: "img-editor", inputs: { stateDisplayed: "stateDisplayed", imgToEdit: "imgToEdit" }, outputs: { editClosed: "editClosed" }, ngImport: i0, template: "<div class=\"img-editor\" [@easeInOut]=\"'in'\">\n\n <!-- Button Action Section -->\n\n <div class=\"img-editor__infoSection__actions\">\n <div>\n <button\n class=\"button img-editor__infoSection__actions__cancel\"\n (click)=\"onCancel()\"\n [disabled]=\"isLoading || (!isImgModified && !isNameModified)\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <div\n class=\"button danger button img-editor__infoSection__actions__save\"\n [ngClass]=\"{'img-editor__infoSection__actions__save--disable': isLoading}\"\n (click)=\"onSave()\"\n >\n {{ 'ImgManager.ImgEditor.saveBtn' | translate }}\n <span btnLoadingAnim *ngIf=\"isLoading\" class=\"btnLoadingAnnimation\"></span>\n </div>\n\n </div>\n </div>\n\n <perfect-scrollbar\n [config]=\"{suppressScrollX: true}\"\n class=\"img-editor__scroll\"\n [ngClass]=\"{\n 'img-editor__scroll--full': stateDisplayed === 'full',\n 'img-editor__scroll--smallDisplay': stateDisplayed === 'small',\n 'img-editor__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div class=\"columns\">\n <!-- Left section -->\n <div class=\"column is-one-third img-editor__infoSection\">\n\n <info-section\n [imgToEdit]=\"imgToEdit\"\n [(isNameModified)]=\"isNameModified\"\n >\n </info-section>\n </div>\n\n\n <!-- Right section -->\n <div class=\"column img-editor__container\">\n <cropper\n [imgToEdit]=\"imgToEdit\"\n [(isImgModified)]=\"isImgModified\"\n (currentCroppedImageChange)=\"onImgCropped($event)\"\n (editClosed)=\"onEditClosed($event)\">\n </cropper>\n </div>\n </div>\n </perfect-scrollbar>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.PerfectScrollbarComponent, selector: "perfect-scrollbar", inputs: ["disabled", "usePSClass", "autoPropagation", "scrollIndicators", "config"], outputs: ["psScrollY", "psScrollX", "psScrollUp", "psScrollDown", "psScrollLeft", "psScrollRight", "psYReachEnd", "psYReachStart", "psXReachEnd", "psXReachStart"], exportAs: ["ngxPerfectScrollbar"] }, { kind: "component", type: i4.EditorInfoSectionComponent, selector: "info-section", inputs: ["imgToEdit", "isNameModified"], outputs: ["isNameModifiedChange"] }, { kind: "component", type: i5.CropperComponent, selector: "cropper", inputs: ["imgToEdit", "isImgModified"], outputs: ["isImgModifiedChange", "editClosed", "currentCroppedImageChange"] }, { kind: "directive", type: i6.LoadingDirective, selector: "[btnLoadingAnim]" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [
95
+ easeInOut
96
+ ] });
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: ImgEditorComponent, decorators: [{
98
+ type: Component,
99
+ args: [{ selector: 'img-editor', animations: [
100
+ easeInOut
101
+ ], template: "<div class=\"img-editor\" [@easeInOut]=\"'in'\">\n\n <!-- Button Action Section -->\n\n <div class=\"img-editor__infoSection__actions\">\n <div>\n <button\n class=\"button img-editor__infoSection__actions__cancel\"\n (click)=\"onCancel()\"\n [disabled]=\"isLoading || (!isImgModified && !isNameModified)\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <div\n class=\"button danger button img-editor__infoSection__actions__save\"\n [ngClass]=\"{'img-editor__infoSection__actions__save--disable': isLoading}\"\n (click)=\"onSave()\"\n >\n {{ 'ImgManager.ImgEditor.saveBtn' | translate }}\n <span btnLoadingAnim *ngIf=\"isLoading\" class=\"btnLoadingAnnimation\"></span>\n </div>\n\n </div>\n </div>\n\n <perfect-scrollbar\n [config]=\"{suppressScrollX: true}\"\n class=\"img-editor__scroll\"\n [ngClass]=\"{\n 'img-editor__scroll--full': stateDisplayed === 'full',\n 'img-editor__scroll--smallDisplay': stateDisplayed === 'small',\n 'img-editor__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div class=\"columns\">\n <!-- Left section -->\n <div class=\"column is-one-third img-editor__infoSection\">\n\n <info-section\n [imgToEdit]=\"imgToEdit\"\n [(isNameModified)]=\"isNameModified\"\n >\n </info-section>\n </div>\n\n\n <!-- Right section -->\n <div class=\"column img-editor__container\">\n <cropper\n [imgToEdit]=\"imgToEdit\"\n [(isImgModified)]=\"isImgModified\"\n (currentCroppedImageChange)=\"onImgCropped($event)\"\n (editClosed)=\"onEditClosed($event)\">\n </cropper>\n </div>\n </div>\n </perfect-scrollbar>\n</div>\n" }]
102
+ }], ctorParameters: function () { return [{ type: i1.ImgManagerService }]; }, propDecorators: { stateDisplayed: [{
103
+ type: Input
104
+ }], imgToEdit: [{
105
+ type: Input
106
+ }], editClosed: [{
107
+ type: Output
108
+ }] } });
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1nLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ei1pbWctbWFuYWdlci9zcmMvbGliL2NvbXBvbmVudHMvaW1nLWVkaXRvci9pbWctZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWctZWRpdG9yL2ltZy1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFHOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7QUFTN0UsTUFBTSxPQUFPLGtCQUFrQjtJQW1CN0IsWUFDVSxpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWJwQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUxQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLHdCQUFtQixHQUFXLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztRQUdqRixnQkFBVyxHQUFXLGtDQUFrQyxDQUFDO1FBQ3pELGdCQUFXLEdBQVcsa0NBQWtDLENBQUM7UUFDekQsbUJBQWMsR0FBVyx5REFBeUQsQ0FBQTtJQUk1RSxDQUFDO0lBRVAsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FB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QVMsQ0FDeEIsSUFBSSxDQUFDLEVBQUU7WUFDTCxhQUFhLENBQUMsU0FBUyxDQUNyQixJQUFJLENBQUMsRUFBRTtnQkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN6QyxDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7Z0JBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7OytHQTdHVSxrQkFBa0I7bUdBQWxCLGtCQUFrQiwrSkNiL0IscTZEQTBEQSxpa0NEakRjO1FBQ1YsU0FBUztLQUNWOzJGQUVVLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxZQUFZLGNBRVY7d0JBQ1YsU0FBUztxQkFDVjt3R0FLRCxjQUFjO3NCQURiLEtBQUs7Z0JBR04sU0FBUztzQkFEUixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbWdQaWN0dXJlRFRPIH0gZnJvbSAnLi4vLi4vZHRvL2ltZy1tYW5hZ2VyLmR0byc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW1nTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IGVhc2VJbk91dCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvZWFzZUluT3V0L2Vhc2UtaW4tb3V0LmFuaW1hdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltZy1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1nLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBlYXNlSW5PdXRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbWdFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpXG4gIHN0YXRlRGlzcGxheWVkO1xuICBASW5wdXQoKVxuICBpbWdUb0VkaXQ6IEltZ1BpY3R1cmVEVE87XG5cbiAgQE91dHB1dCgpIGVkaXRDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGlzSW1nTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNOYW1lTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudENyb3BwZWRJbWFnZTogc3RyaW5nID0gJyc7IC8vIEltZyBtb2RpZmllZCByZXR1cm4gaW4gYmFzZTY0IGJ5IHRoZSBjcm9wcGVyXG4gIHByaXZhdGUgcHJldmlvdXNOYW1lOiBzdHJpbmc7XG5cbiAgbXNnRmFpbFNhdmU6IHN0cmluZyA9ICdJbWdNYW5hZ2VyLkltZ0VkaXRvci5tc2dGYWlsU2F2ZSc7XG4gIG1zZ0ZhaWxMb2FkOiBzdHJpbmcgPSAnSW1nTWFuYWdlci5JbWdFZGl0b3IubXNnRmFpbExvYWQnO1xuICBtc2dTdWNjZXNzRWRpdDogc3RyaW5nID0gXCJMZXMgbW9kaWZpY2F0aW9ucyBkZSBsJ2ltYWdlIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGltZ01hbmFnZXJTZXJ2aWNlOiBJbWdNYW5hZ2VyU2VydmljZSxcbiAgICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlvdXNOYW1lID0gdGhpcy5pbWdUb0VkaXQuZGlzcGxheV9uYW1lO1xuICB9XG5cbiAgb25TYXZlKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICBpZiAoIXRoaXMuaXNJbWdNb2RpZmllZCAgJiYgIXRoaXMuaXNOYW1lTW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm9uRWRpdENsb3NlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9ic1JlcGxhY2VJbWc6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuaW1nTWFuYWdlclNlcnZpY2UucmVwbGFjZUltZyh0aGlzLmN1cnJlbnRDcm9wcGVkSW1hZ2UsIHRoaXMuaW1nVG9FZGl0LmlkX2ZpbGUpO1xuICAgIGNvbnN0IG9ic0NoYW5nZUltZ05hbWU6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuaW1nTWFuYWdlclNlcnZpY2UuY2hhbmdlSW1nTmFtZSh0aGlzLmltZ1RvRWRpdC5kaXNwbGF5X25hbWUsIHRoaXMuaW1nVG9FZGl0LmlkX2ZpbGUpO1xuXG4gICAgaWYodGhpcy5pc0ltZ01vZGlmaWVkICYmIHRoaXMuaXNOYW1lTW9kaWZpZWQpIHtcbiAgICAgIHRoaXMucmFuYW1lQW5kUmVwbGFjZUltZyhvYnNDaGFuZ2VJbWdOYW1lLCBvYnNSZXBsYWNlSW1nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZih0aGlzLmlzSW1nTW9kaWZpZWQpe1xuICAgICAgb2JzUmVwbGFjZUltZy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnU3VjY2Vzc0VkaXQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q3JvcHBlZEltYWdlID0gJyc7XG4gICAgICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnRmFpbFNhdmUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOYW1lTW9kaWZpZWQpIHtcbiAgICAgIG9ic0NoYW5nZUltZ05hbWUuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByZXZpb3VzTmFtZSA9IHRoaXMuaW1nVG9FZGl0LmRpc3BsYXlfbmFtZTtcbiAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dTdWNjZXNzRWRpdCk7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmltZ1RvRWRpdC5kaXNwbGF5X25hbWUgPSB0aGlzLnByZXZpb3VzTmFtZTtcbiAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dGYWlsU2F2ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pc05hbWVNb2RpZmllZCA9IGZhbHNlO1xuICB9XG5cbiAgb25FZGl0Q2xvc2VkKG1zZ0tleT86IHN0cmluZykge1xuICAgIHRoaXMuZWRpdENsb3NlZC5lbWl0KG1zZ0tleSk7XG4gIH1cblxuICBvblJlc3RhcnRFZGl0KCkge1xuICAgIHRoaXMuaXNJbWdNb2RpZmllZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNOYW1lTW9kaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLmltZ1RvRWRpdC5kaXNwbGF5X25hbWUgPSB0aGlzLnByZXZpb3VzTmFtZTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCkge1xuICAgIHRoaXMub25FZGl0Q2xvc2VkKCcnKTtcbiAgfVxuXG4gIG9uSW1nQ3JvcHBlZChpbWdCYXNlNjQ6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudENyb3BwZWRJbWFnZSA9IGltZ0Jhc2U2NDtcbiAgfVxuXG4gIHByaXZhdGUgcmFuYW1lQW5kUmVwbGFjZUltZyhvYnNDaGFuZ2VJbWdOYW1lOiBPYnNlcnZhYmxlPGFueT4sIG9ic1JlcGxhY2VJbWc6IE9ic2VydmFibGU8YW55Pikge1xuICAgIC8vIEF2b2lkIHRvIHVzZSBmb3Jram9pbiwgYmVjYXVzZSBpdCBjYW4gY3JlYXRlIGNvbmZsaWN0IGFuZCBsb29zIHRoZSBpbWdcbiAgICBvYnNDaGFuZ2VJbWdOYW1lLnN1YnNjcmliZShcbiAgICAgIHJlczEgPT4ge1xuICAgICAgICBvYnNSZXBsYWNlSW1nLnN1YnNjcmliZShcbiAgICAgICAgICByZXMyID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FZGl0Q2xvc2VkKHRoaXMubXNnU3VjY2Vzc0VkaXQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dGYWlsU2F2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5vbkVkaXRDbG9zZWQodGhpcy5tc2dGYWlsU2F2ZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImltZy1lZGl0b3JcIiBbQGVhc2VJbk91dF09XCInaW4nXCI+XG5cbiAgICA8IS0tIEJ1dHRvbiBBY3Rpb24gU2VjdGlvbiAtLT5cblxuICAgIDxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fYWN0aW9uc1wiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19hY3Rpb25zX19jYW5jZWxcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8ICghaXNJbWdNb2RpZmllZCAgJiYgIWlzTmFtZU1vZGlmaWVkKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnSW1nTWFuYWdlci5JbWdMaWIuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGRhbmdlciBidXR0b24gaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX2FjdGlvbnNfX3NhdmVcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX2FjdGlvbnNfX3NhdmUtLWRpc2FibGUnOiBpc0xvYWRpbmd9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TYXZlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0ltZ01hbmFnZXIuSW1nRWRpdG9yLnNhdmVCdG4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHNwYW4gYnRuTG9hZGluZ0FuaW0gKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImJ0bkxvYWRpbmdBbm5pbWF0aW9uXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8cGVyZmVjdC1zY3JvbGxiYXJcbiAgICAgICAgW2NvbmZpZ109XCJ7c3VwcHJlc3NTY3JvbGxYOiB0cnVlfVwiXG4gICAgICAgIGNsYXNzPVwiaW1nLWVkaXRvcl9fc2Nyb2xsXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2ltZy1lZGl0b3JfX3Njcm9sbC0tZnVsbCc6IHN0YXRlRGlzcGxheWVkID09PSAnZnVsbCcsXG4gICAgICAgICAgICAnaW1nLWVkaXRvcl9fc2Nyb2xsLS1zbWFsbERpc3BsYXknOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJyxcbiAgICAgICAgICAgICdpbWctZWRpdG9yX19zY3JvbGwtLXdpbmRvdyc6IHN0YXRlRGlzcGxheWVkID09PSAnd2luZG93J1xuICAgICAgICB9XCJcbiAgICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbnNcIj5cbiAgICAgICAgPCEtLSBMZWZ0IHNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtb25lLXRoaXJkIGltZy1lZGl0b3JfX2luZm9TZWN0aW9uXCI+XG5cbiAgICAgICAgICAgIDxpbmZvLXNlY3Rpb25cbiAgICAgICAgICAgICAgW2ltZ1RvRWRpdF09XCJpbWdUb0VkaXRcIlxuICAgICAgICAgICAgICBbKGlzTmFtZU1vZGlmaWVkKV09XCJpc05hbWVNb2RpZmllZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaW5mby1zZWN0aW9uPlxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwhLS0gUmlnaHQgc2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpbWctZWRpdG9yX19jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxjcm9wcGVyXG4gICAgICAgICAgICAgIFtpbWdUb0VkaXRdPVwiaW1nVG9FZGl0XCJcbiAgICAgICAgICAgICAgWyhpc0ltZ01vZGlmaWVkKV09XCJpc0ltZ01vZGlmaWVkXCJcbiAgICAgICAgICAgICAgKGN1cnJlbnRDcm9wcGVkSW1hZ2VDaGFuZ2UpPVwib25JbWdDcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoZWRpdENsb3NlZCk9XCJvbkVkaXRDbG9zZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcm9wcGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,54 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { Output } from '@angular/core';
3
+ import { Component, Input } from '@angular/core';
4
+ import { AlertService } from '../../../services/alert.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../services/alert.service";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@wizishop/ng-wizi-bulma";
9
+ import * as i4 from "../../../directives/copy-to-clipboard.directive";
10
+ import * as i5 from "../../../directives/abstract-debounce/debounce-keyup.directive";
11
+ import * as i6 from "@ngx-translate/core";
12
+ import * as i7 from "../../../pipes/images/img-src.pipe";
13
+ export class EditorInfoSectionComponent {
14
+ constructor(alertService) {
15
+ this.alertService = alertService;
16
+ this._isNameModified = false;
17
+ this.isNameModifiedChange = new EventEmitter();
18
+ this.msgCopyToClipBoard = 'ImgManager.ImgEditor.copytoClipBoard';
19
+ }
20
+ set isNameModified(isNameModified) {
21
+ this._isNameModified = isNameModified;
22
+ }
23
+ get isNameModified() {
24
+ return this._isNameModified;
25
+ }
26
+ ngOnInit() {
27
+ this.init();
28
+ }
29
+ init() {
30
+ this.imgName = this.imgToEdit.display_name;
31
+ }
32
+ getFileSize() {
33
+ return this.imgToEdit ? Math.round(parseInt(this.imgToEdit.size) / 1000) : '-';
34
+ }
35
+ copyToClipBoard(event) {
36
+ this.alertService.openAlert(this.msgCopyToClipBoard);
37
+ }
38
+ onNameChange() {
39
+ this.isNameModifiedChange.emit(true);
40
+ }
41
+ }
42
+ EditorInfoSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: EditorInfoSectionComponent, deps: [{ token: i1.AlertService }], target: i0.ɵɵFactoryTarget.Component });
43
+ EditorInfoSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: EditorInfoSectionComponent, selector: "info-section", inputs: { imgToEdit: "imgToEdit", isNameModified: "isNameModified" }, outputs: { isNameModifiedChange: "isNameModifiedChange" }, ngImport: i0, template: "\n<!-- Img properties -->\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">\n {{ 'ImgManager.UploadList.properties.imgName' | translate }}\n <span class=\"img-editor__infoSection__propertyEditable__tooltips\" [nwbToolTip]=\"'ImgManager.ImgEditor.NameInfo' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></span>\n </p>\n <input\n type=\"text\"\n class=\"img-editor__infoSection__propertyEditable__input\"\n placeholder=\"{{'ImgManager.ImgEditor.nameEx' | translate}} \"\n [(ngModel)]=\"imgToEdit.display_name\"\n debounceKeyUp\n [debounceTime]=\"500\"\n (onEventChange)=\"onNameChange()\">\n</div>\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgURL' | translate }}</p>\n <button [copy-clipboard]=\"imgToEdit.file_name | imgSrc : 'raw'\" (copied)=\"copyToClipBoard($event)\" ><span class=\"img-editor__infoSection__propertyEditable__span\">{{imgToEdit.file_name}}</span>&nbsp;&nbsp;<i class=\"far fa-copy\"></i></button>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgSize' | translate }}&nbsp;:</p>\n <p>{{imgToEdit.raw_height}}*{{imgToEdit.raw_width}}px</p>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgWeight' | translate }}&nbsp;:</p>\n <p >{{getFileSize()}}&nbsp;ko</p>\n</div>\n\n<!-- SEO info -->\n\n<span class=\"img-editor__infoSection__divider\"></span>\n\n<div class=\"img-editor__infoSection__titleSEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.title' | translate }}</p>\n</div>\n\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.rezise' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.reziseTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.webp' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.webpTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.cdn' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.cdnTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.lazyloading' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.lazyloadingTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n", dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NwbToolTipDirective, selector: "[nwbToolTip]", inputs: ["nwbToolTip", "nwbToolTipPosition", "nwbToolTipIsMultiline"] }, { kind: "directive", type: i4.CopyClipboardDirective, selector: "[copy-clipboard]", inputs: ["copy-clipboard"], outputs: ["copied"] }, { kind: "directive", type: i5.DebounceKeyupDirective, selector: "input[debounceKeyUp]" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.ImageSrcPipe, name: "imgSrc" }] });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: EditorInfoSectionComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'info-section', template: "\n<!-- Img properties -->\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">\n {{ 'ImgManager.UploadList.properties.imgName' | translate }}\n <span class=\"img-editor__infoSection__propertyEditable__tooltips\" [nwbToolTip]=\"'ImgManager.ImgEditor.NameInfo' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></span>\n </p>\n <input\n type=\"text\"\n class=\"img-editor__infoSection__propertyEditable__input\"\n placeholder=\"{{'ImgManager.ImgEditor.nameEx' | translate}} \"\n [(ngModel)]=\"imgToEdit.display_name\"\n debounceKeyUp\n [debounceTime]=\"500\"\n (onEventChange)=\"onNameChange()\">\n</div>\n<div class=\"img-editor__infoSection__propertyEditable\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgURL' | translate }}</p>\n <button [copy-clipboard]=\"imgToEdit.file_name | imgSrc : 'raw'\" (copied)=\"copyToClipBoard($event)\" ><span class=\"img-editor__infoSection__propertyEditable__span\">{{imgToEdit.file_name}}</span>&nbsp;&nbsp;<i class=\"far fa-copy\"></i></button>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgSize' | translate }}&nbsp;:</p>\n <p>{{imgToEdit.raw_height}}*{{imgToEdit.raw_width}}px</p>\n</div>\n<div class=\"img-editor__infoSection__property\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.properties.imgWeight' | translate }}&nbsp;:</p>\n <p >{{getFileSize()}}&nbsp;ko</p>\n</div>\n\n<!-- SEO info -->\n\n<span class=\"img-editor__infoSection__divider\"></span>\n\n<div class=\"img-editor__infoSection__titleSEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.title' | translate }}</p>\n</div>\n\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.rezise' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.reziseTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.webp' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.webpTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.cdn' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.cdnTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n\n</div>\n<div class=\"img-editor__infoSection__propertySEO\">\n <p class=\"mainColor\">{{ 'ImgManager.UploadList.seo.lazyloading' | translate }}</p>\n <p><i class=\"fal fa-check\"></i>&nbsp;100%</p>\n <p class=\"img-editor__infoSection__propertySEO__tooltips\" [nwbToolTip]=\"'ImgManager.UploadList.seo.lazyloadingTooltips' | translate\" [nwbToolTipIsMultiline]=\"true\" nwbToolTipPosition=\"right\"><i class=\"fas fa-info-circle\"></i></p>\n</div>\n" }]
47
+ }], ctorParameters: function () { return [{ type: i1.AlertService }]; }, propDecorators: { imgToEdit: [{
48
+ type: Input
49
+ }], isNameModified: [{
50
+ type: Input
51
+ }], isNameModifiedChange: [{
52
+ type: Output
53
+ }] } });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWctZWRpdG9yL2luZm8tc2VjdGlvbi9pbmZvLXNlY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltZy1lZGl0b3IvaW5mby1zZWN0aW9uL2luZm8tc2VjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFNL0QsTUFBTSxPQUFPLDBCQUEwQjtJQXNCckMsWUFDVSxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVg1QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUd6Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBS25ELHVCQUFrQixHQUFXLHNDQUFzQyxDQUFDO0lBSTlELENBQUM7SUFuQlAsSUFDSSxjQUFjLENBQUMsY0FBdUI7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7SUFDeEMsQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQWVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDN0MsQ0FBQztJQUNELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUMvRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQUs7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7O3VIQTNDVSwwQkFBMEI7MkdBQTFCLDBCQUEwQixxTENWdkMsNC9HQTBEQTsyRkRoRGEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNFLGNBQWM7bUdBTXhCLFNBQVM7c0JBRFIsS0FBSztnQkFJRixjQUFjO3NCQURqQixLQUFLO2dCQVVOLG9CQUFvQjtzQkFEbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEltZ1BpY3R1cmVEVE8gfSBmcm9tICcuLi8uLi8uLi9kdG8vaW1nLW1hbmFnZXIuZHRvJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbmZvLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5mby1zZWN0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JJbmZvU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KClcbiAgaW1nVG9FZGl0OiBJbWdQaWN0dXJlRFRPO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpc05hbWVNb2RpZmllZChpc05hbWVNb2RpZmllZDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTmFtZU1vZGlmaWVkID0gaXNOYW1lTW9kaWZpZWQ7XG4gIH1cbiAgZ2V0IGlzTmFtZU1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc05hbWVNb2RpZmllZDtcbiAgfVxuICBwcml2YXRlIF9pc05hbWVNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBpc05hbWVNb2RpZmllZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBpbWdOYW1lOiBzdHJpbmc7XG4gIGltZ1JvdXRlOiBzdHJpbmc7XG5cbiAgbXNnQ29weVRvQ2xpcEJvYXJkOiBzdHJpbmcgPSAnSW1nTWFuYWdlci5JbWdFZGl0b3IuY29weXRvQ2xpcEJvYXJkJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuaW1nTmFtZSA9IHRoaXMuaW1nVG9FZGl0LmRpc3BsYXlfbmFtZTtcbiAgfVxuICBnZXRGaWxlU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbWdUb0VkaXQgPyBNYXRoLnJvdW5kKHBhcnNlSW50KHRoaXMuaW1nVG9FZGl0LnNpemUpLzEwMDApIDogJy0nO1xuICB9XG5cbiAgY29weVRvQ2xpcEJvYXJkKGV2ZW50KSB7XG4gICAgdGhpcy5hbGVydFNlcnZpY2Uub3BlbkFsZXJ0KHRoaXMubXNnQ29weVRvQ2xpcEJvYXJkKTtcbiAgfVxuXG4gIG9uTmFtZUNoYW5nZSgpIHtcbiAgICB0aGlzLmlzTmFtZU1vZGlmaWVkQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cbn1cbiIsIlxuPCEtLSBJbWcgcHJvcGVydGllcyAtLT5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlFZGl0YWJsZVwiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+XG4gICAgICAgIHt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3QucHJvcGVydGllcy5pbWdOYW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8c3BhbiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eUVkaXRhYmxlX190b29sdGlwc1wiIFtud2JUb29sVGlwXT1cIidJbWdNYW5hZ2VyLkltZ0VkaXRvci5OYW1lSW5mbycgfCB0cmFuc2xhdGVcIiBbbndiVG9vbFRpcElzTXVsdGlsaW5lXT1cInRydWVcIiBud2JUb29sVGlwUG9zaXRpb249XCJyaWdodFwiPjxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPjwvc3Bhbj5cbiAgICA8L3A+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eUVkaXRhYmxlX19pbnB1dFwiXG4gICAgICBwbGFjZWhvbGRlcj1cInt7J0ltZ01hbmFnZXIuSW1nRWRpdG9yLm5hbWVFeCcgfCB0cmFuc2xhdGV9fSBcIlxuICAgICAgWyhuZ01vZGVsKV09XCJpbWdUb0VkaXQuZGlzcGxheV9uYW1lXCJcbiAgICAgIGRlYm91bmNlS2V5VXBcbiAgICAgIFtkZWJvdW5jZVRpbWVdPVwiNTAwXCJcbiAgICAgIChvbkV2ZW50Q2hhbmdlKT1cIm9uTmFtZUNoYW5nZSgpXCI+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlFZGl0YWJsZVwiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5wcm9wZXJ0aWVzLmltZ1VSTCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgPGJ1dHRvbiBbY29weS1jbGlwYm9hcmRdPVwiaW1nVG9FZGl0LmZpbGVfbmFtZSB8IGltZ1NyYyA6ICdyYXcnXCIgKGNvcGllZCk9XCJjb3B5VG9DbGlwQm9hcmQoJGV2ZW50KVwiID48c3BhbiAgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlFZGl0YWJsZV9fc3BhblwiPnt7aW1nVG9FZGl0LmZpbGVfbmFtZX19PC9zcGFuPiZuYnNwOyZuYnNwOzxpIGNsYXNzPVwiZmFyIGZhLWNvcHlcIj48L2k+PC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlcIj5cbiAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3QucHJvcGVydGllcy5pbWdTaXplJyB8IHRyYW5zbGF0ZSB9fSZuYnNwOzo8L3A+XG4gICAgPHA+e3tpbWdUb0VkaXQucmF3X2hlaWdodH19Knt7aW1nVG9FZGl0LnJhd193aWR0aH19cHg8L3A+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlcIj5cbiAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3QucHJvcGVydGllcy5pbWdXZWlnaHQnIHwgdHJhbnNsYXRlIH19Jm5ic3A7OjwvcD5cbiAgICA8cCA+e3tnZXRGaWxlU2l6ZSgpfX0mbmJzcDtrbzwvcD5cbjwvZGl2PlxuXG48IS0tIFNFTyBpbmZvIC0tPlxuXG48c3BhbiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19kaXZpZGVyXCI+PC9zcGFuPlxuXG48ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX3RpdGxlU0VPXCI+XG4gICAgPHAgY2xhc3M9XCJtYWluQ29sb3JcIj57eyAnSW1nTWFuYWdlci5VcGxvYWRMaXN0LnNlby50aXRsZScgfCB0cmFuc2xhdGUgfX08L3A+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eVNFT1wiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8ucmV6aXNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8cD48aSBjbGFzcz1cImZhbCBmYS1jaGVja1wiPjwvaT4mbmJzcDsxMDAlPC9wPlxuICAgIDxwIGNsYXNzPVwiaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX3Byb3BlcnR5U0VPX190b29sdGlwc1wiIFtud2JUb29sVGlwXT1cIidJbWdNYW5hZ2VyLlVwbG9hZExpc3Quc2VvLnJlemlzZVRvb2x0aXBzJyB8IHRyYW5zbGF0ZVwiIFtud2JUb29sVGlwSXNNdWx0aWxpbmVdPVwidHJ1ZVwiIG53YlRvb2xUaXBQb3NpdGlvbj1cInJpZ2h0XCI+PGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGVcIj48L2k+PC9wPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiaW1nLWVkaXRvcl9faW5mb1NlY3Rpb25fX3Byb3BlcnR5U0VPXCI+XG4gICAgPHAgY2xhc3M9XCJtYWluQ29sb3JcIj57eyAnSW1nTWFuYWdlci5VcGxvYWRMaXN0LnNlby53ZWJwJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8cD48aSBjbGFzcz1cImZhbCBmYS1jaGVja1wiPjwvaT4mbmJzcDsxMDAlPC9wPlxuICA8cCBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eVNFT19fdG9vbHRpcHNcIiBbbndiVG9vbFRpcF09XCInSW1nTWFuYWdlci5VcGxvYWRMaXN0LnNlby53ZWJwVG9vbHRpcHMnIHwgdHJhbnNsYXRlXCIgW253YlRvb2xUaXBJc011bHRpbGluZV09XCJ0cnVlXCIgbndiVG9vbFRpcFBvc2l0aW9uPVwicmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZVwiPjwvaT48L3A+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlTRU9cIj5cbiAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLlVwbG9hZExpc3Quc2VvLmNkbicgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgPHA+PGkgY2xhc3M9XCJmYWwgZmEtY2hlY2tcIj48L2k+Jm5ic3A7MTAwJTwvcD5cbiAgPHAgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlTRU9fX3Rvb2x0aXBzXCIgW253YlRvb2xUaXBdPVwiJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8uY2RuVG9vbHRpcHMnIHwgdHJhbnNsYXRlXCIgW253YlRvb2xUaXBJc011bHRpbGluZV09XCJ0cnVlXCIgbndiVG9vbFRpcFBvc2l0aW9uPVwicmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZVwiPjwvaT48L3A+XG5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImltZy1lZGl0b3JfX2luZm9TZWN0aW9uX19wcm9wZXJ0eVNFT1wiPlxuICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8ubGF6eWxvYWRpbmcnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIDxwPjxpIGNsYXNzPVwiZmFsIGZhLWNoZWNrXCI+PC9pPiZuYnNwOzEwMCU8L3A+XG4gICAgPHAgY2xhc3M9XCJpbWctZWRpdG9yX19pbmZvU2VjdGlvbl9fcHJvcGVydHlTRU9fX3Rvb2x0aXBzXCIgW253YlRvb2xUaXBdPVwiJ0ltZ01hbmFnZXIuVXBsb2FkTGlzdC5zZW8ubGF6eWxvYWRpbmdUb29sdGlwcycgfCB0cmFuc2xhdGVcIiBbbndiVG9vbFRpcElzTXVsdGlsaW5lXT1cInRydWVcIiBud2JUb29sVGlwUG9zaXRpb249XCJyaWdodFwiPjxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPjwvcD5cbjwvZGl2PlxuIl19