@igo2/integration 1.15.3 → 16.0.0-rc.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 (275) hide show
  1. package/{esm2020 → esm2022}/igo2-integration.mjs +4 -4
  2. package/esm2022/lib/about/about-tool/about-tool.component.mjs +205 -0
  3. package/{esm2020 → esm2022}/lib/about/about-tool/index.mjs +2 -2
  4. package/{esm2020 → esm2022}/lib/about/about.module.mjs +55 -55
  5. package/{esm2020 → esm2022}/lib/about/index.mjs +2 -2
  6. package/esm2022/lib/analytics/analytics-listener.service.mjs +156 -0
  7. package/{esm2020 → esm2022}/lib/analytics/analytics.module.mjs +16 -16
  8. package/{esm2020 → esm2022}/lib/analytics/index.mjs +2 -2
  9. package/esm2022/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +133 -0
  10. package/esm2022/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +24 -0
  11. package/esm2022/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +103 -0
  12. package/esm2022/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +24 -0
  13. package/esm2022/lib/catalog/catalog.module.mjs +19 -0
  14. package/esm2022/lib/catalog/catalog.state.mjs +58 -0
  15. package/{esm2020 → esm2022}/lib/catalog/index.mjs +6 -6
  16. package/esm2022/lib/context/context-editor-tool/context-editor-tool.component.mjs +36 -0
  17. package/esm2022/lib/context/context-manager-tool/context-manager-tool.component.mjs +51 -0
  18. package/esm2022/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +24 -0
  19. package/esm2022/lib/context/context-share-tool/context-share-tool.component.mjs +43 -0
  20. package/{esm2020 → esm2022}/lib/context/context.module.mjs +39 -39
  21. package/esm2022/lib/context/context.state.mjs +96 -0
  22. package/{esm2020 → esm2022}/lib/context/index.mjs +6 -6
  23. package/esm2022/lib/directions/directions-tool/directions-tool.component.mjs +116 -0
  24. package/{esm2020 → esm2022}/lib/directions/directions-tool/index.mjs +2 -2
  25. package/{esm2020 → esm2022}/lib/directions/directions.module.mjs +26 -26
  26. package/esm2022/lib/directions/directions.state.mjs +69 -0
  27. package/{esm2020 → esm2022}/lib/directions/index.mjs +3 -3
  28. package/esm2022/lib/draw/draw.module.mjs +18 -0
  29. package/esm2022/lib/draw/draw.state.mjs +42 -0
  30. package/esm2022/lib/draw/drawing-tool/drawing-tool.component.mjs +77 -0
  31. package/esm2022/lib/draw/drawing-tool/drawing-tool.module.mjs +23 -0
  32. package/{esm2020 → esm2022}/lib/draw/index.mjs +3 -3
  33. package/{esm2020 → esm2022}/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs +10 -10
  34. package/esm2022/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +46 -0
  35. package/{esm2020 → esm2022}/lib/filter/active-ogc-filter-tool/index.mjs +2 -2
  36. package/{esm2020 → esm2022}/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs +10 -10
  37. package/esm2022/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +46 -0
  38. package/{esm2020 → esm2022}/lib/filter/active-time-filter-tool/index.mjs +2 -2
  39. package/{esm2020 → esm2022}/lib/filter/filter.module.mjs +51 -51
  40. package/{esm2020 → esm2022}/lib/filter/index.mjs +6 -6
  41. package/{esm2020 → esm2022}/lib/filter/ogc-filter-tool/index.mjs +2 -2
  42. package/esm2022/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +25 -0
  43. package/{esm2020 → esm2022}/lib/filter/spatial-filter-tool/index.mjs +2 -2
  44. package/esm2022/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +605 -0
  45. package/{esm2020 → esm2022}/lib/filter/time-filter-tool/index.mjs +2 -2
  46. package/esm2022/lib/filter/time-filter-tool/time-filter-tool.component.mjs +25 -0
  47. package/esm2022/lib/import-export/import-export-tool/import-export-tool.component.mjs +154 -0
  48. package/{esm2020 → esm2022}/lib/import-export/import-export-tool/index.mjs +2 -2
  49. package/{esm2020 → esm2022}/lib/import-export/import-export.module.mjs +51 -51
  50. package/esm2022/lib/import-export/import-export.state.mjs +39 -0
  51. package/{esm2020 → esm2022}/lib/import-export/index.mjs +3 -3
  52. package/{esm2020 → esm2022}/lib/integration.module.mjs +72 -72
  53. package/esm2022/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +524 -0
  54. package/esm2022/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +92 -0
  55. package/esm2022/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +231 -0
  56. package/{esm2020 → esm2022}/lib/map/advanced-map-tool/index.mjs +2 -2
  57. package/{esm2020 → esm2022}/lib/map/index.mjs +9 -9
  58. package/esm2022/lib/map/layer-list-tool.state.mjs +40 -0
  59. package/{esm2020 → esm2022}/lib/map/map-details-tool/index.mjs +2 -2
  60. package/esm2022/lib/map/map-details-tool/map-details-tool.component.mjs +269 -0
  61. package/{esm2020 → esm2022}/lib/map/map-legend/index.mjs +2 -2
  62. package/esm2022/lib/map/map-legend/map-legend-tool.component.mjs +285 -0
  63. package/{esm2020 → esm2022}/lib/map/map-proximity-tool/index.mjs +2 -2
  64. package/esm2022/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +220 -0
  65. package/esm2022/lib/map/map-proximity.state.mjs +180 -0
  66. package/{esm2020 → esm2022}/lib/map/map-tool/index.mjs +2 -2
  67. package/esm2022/lib/map/map-tool/map-tool.component.mjs +140 -0
  68. package/{esm2020 → esm2022}/lib/map/map-tools/index.mjs +2 -2
  69. package/esm2022/lib/map/map-tools/map-tools.component.mjs +521 -0
  70. package/esm2022/lib/map/map.module.mjs +168 -0
  71. package/esm2022/lib/map/map.state.mjs +56 -0
  72. package/{esm2020 → esm2022}/lib/measure/index.mjs +4 -4
  73. package/esm2022/lib/measure/measure.module.mjs +18 -0
  74. package/esm2022/lib/measure/measure.state.mjs +40 -0
  75. package/esm2022/lib/measure/measurer-tool/measurer-tool.component.mjs +54 -0
  76. package/{esm2020 → esm2022}/lib/measure/measurer-tool/measurer-tool.module.mjs +23 -25
  77. package/{esm2020 → esm2022}/lib/print/index.mjs +2 -2
  78. package/{esm2020 → esm2022}/lib/print/print-tool/index.mjs +2 -2
  79. package/esm2022/lib/print/print-tool/print-tool.component.mjs +35 -0
  80. package/{esm2020 → esm2022}/lib/print/print.module.mjs +26 -26
  81. package/{esm2020 → esm2022}/lib/search/index.mjs +7 -7
  82. package/esm2022/lib/search/query.state.mjs +48 -0
  83. package/esm2022/lib/search/search-bar/search-bar-binding.directive.mjs +72 -0
  84. package/{esm2020 → esm2022}/lib/search/search-bar/search-bar.module.mjs +22 -22
  85. package/esm2022/lib/search/search-results-tool/search-results-tool.component.mjs +631 -0
  86. package/esm2022/lib/search/search-results-tool/search-results-tool.module.mjs +65 -0
  87. package/esm2022/lib/search/search.module.mjs +19 -0
  88. package/esm2022/lib/search/search.state.mjs +145 -0
  89. package/{esm2020 → esm2022}/lib/storage/index.mjs +2 -2
  90. package/{esm2020 → esm2022}/lib/storage/storage.module.mjs +16 -16
  91. package/esm2022/lib/storage/storage.state.mjs +25 -0
  92. package/{esm2020 → esm2022}/lib/tool/index.mjs +2 -2
  93. package/{esm2020 → esm2022}/lib/tool/tool.module.mjs +16 -16
  94. package/esm2022/lib/tool/tool.state.mjs +56 -0
  95. package/{esm2020 → esm2022}/lib/workspace/index.mjs +4 -4
  96. package/esm2022/lib/workspace/shared/edition-actions.service.mjs +74 -0
  97. package/esm2022/lib/workspace/shared/feature-actions.service.mjs +66 -0
  98. package/{esm2020 → esm2022}/lib/workspace/shared/index.mjs +3 -3
  99. package/esm2022/lib/workspace/shared/wfs-actions.service.mjs +76 -0
  100. package/esm2022/lib/workspace/shared/workspace.utils.mjs +162 -0
  101. package/{esm2020 → esm2022}/lib/workspace/workspace-button/index.mjs +2 -2
  102. package/esm2022/lib/workspace/workspace-button/workspace-button.component.mjs +76 -0
  103. package/esm2022/lib/workspace/workspace.module.mjs +38 -0
  104. package/esm2022/lib/workspace/workspace.state.mjs +204 -0
  105. package/{esm2020 → esm2022}/public_api.mjs +34 -34
  106. package/{fesm2020 → fesm2022}/igo2-integration.mjs +6522 -6139
  107. package/fesm2022/igo2-integration.mjs.map +1 -0
  108. package/index.d.ts +5 -5
  109. package/lib/about/about-tool/about-tool.component.d.ts +34 -34
  110. package/lib/about/about-tool/index.d.ts +1 -1
  111. package/lib/about/about.module.d.ts +16 -16
  112. package/lib/about/index.d.ts +1 -1
  113. package/lib/analytics/analytics-listener.service.d.ts +33 -33
  114. package/lib/analytics/analytics.module.d.ts +6 -6
  115. package/lib/analytics/index.d.ts +1 -1
  116. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +57 -57
  117. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.d.ts +12 -12
  118. package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +50 -50
  119. package/lib/catalog/catalog-library-tool/catalog-library-tool.module.d.ts +12 -12
  120. package/lib/catalog/catalog.module.d.ts +8 -8
  121. package/lib/catalog/catalog.state.d.ts +37 -37
  122. package/lib/catalog/index.d.ts +5 -5
  123. package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +9 -9
  124. package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +15 -15
  125. package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +5 -5
  126. package/lib/context/context-share-tool/context-share-tool.component.d.ts +13 -13
  127. package/lib/context/context.module.d.ts +11 -11
  128. package/lib/context/context.state.d.ts +37 -37
  129. package/lib/context/index.d.ts +5 -5
  130. package/lib/directions/directions-tool/directions-tool.component.d.ts +54 -54
  131. package/lib/directions/directions-tool/index.d.ts +1 -1
  132. package/lib/directions/directions.module.d.ts +10 -10
  133. package/lib/directions/directions.state.d.ts +28 -28
  134. package/lib/directions/index.d.ts +2 -2
  135. package/lib/draw/draw.module.d.ts +8 -8
  136. package/lib/draw/draw.state.d.ts +16 -16
  137. package/lib/draw/drawing-tool/drawing-tool.component.d.ts +31 -31
  138. package/lib/draw/drawing-tool/drawing-tool.module.d.ts +11 -0
  139. package/lib/draw/index.d.ts +2 -2
  140. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.d.ts +2 -2
  141. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +12 -12
  142. package/lib/filter/active-ogc-filter-tool/index.d.ts +1 -1
  143. package/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.d.ts +2 -2
  144. package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +12 -12
  145. package/lib/filter/active-time-filter-tool/index.d.ts +1 -1
  146. package/lib/filter/filter.module.d.ts +15 -15
  147. package/lib/filter/index.d.ts +5 -5
  148. package/lib/filter/ogc-filter-tool/index.d.ts +1 -1
  149. package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +6 -6
  150. package/lib/filter/spatial-filter-tool/index.d.ts +1 -1
  151. package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +82 -82
  152. package/lib/filter/time-filter-tool/index.d.ts +1 -1
  153. package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +6 -6
  154. package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +33 -33
  155. package/lib/import-export/import-export-tool/index.d.ts +1 -1
  156. package/lib/import-export/import-export.module.d.ts +15 -15
  157. package/lib/import-export/import-export.state.d.ts +24 -24
  158. package/lib/import-export/index.d.ts +2 -2
  159. package/lib/integration.module.d.ts +20 -20
  160. package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +97 -97
  161. package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +12 -12
  162. package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +65 -65
  163. package/lib/map/advanced-map-tool/index.d.ts +1 -1
  164. package/lib/map/index.d.ts +8 -8
  165. package/lib/map/layer-list-tool.state.d.ts +19 -19
  166. package/lib/map/map-details-tool/index.d.ts +1 -1
  167. package/lib/map/map-details-tool/map-details-tool.component.d.ts +38 -38
  168. package/lib/map/map-legend/index.d.ts +1 -1
  169. package/lib/map/map-legend/map-legend-tool.component.d.ts +40 -40
  170. package/lib/map/map-proximity-tool/index.d.ts +1 -1
  171. package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +36 -36
  172. package/lib/map/map-proximity.state.d.ts +31 -31
  173. package/lib/map/map-tool/index.d.ts +1 -1
  174. package/lib/map/map-tool/map-tool.component.d.ts +27 -27
  175. package/lib/map/map-tools/index.d.ts +1 -1
  176. package/lib/map/map-tools/map-tools.component.d.ts +66 -66
  177. package/lib/map/map.module.d.ts +38 -38
  178. package/lib/map/map.state.d.ts +24 -24
  179. package/lib/measure/index.d.ts +3 -3
  180. package/lib/measure/measure.module.d.ts +7 -7
  181. package/lib/measure/measure.state.d.ts +16 -16
  182. package/lib/measure/measurer-tool/measurer-tool.component.d.ts +24 -24
  183. package/lib/measure/measurer-tool/measurer-tool.module.d.ts +11 -11
  184. package/lib/print/index.d.ts +1 -1
  185. package/lib/print/print-tool/index.d.ts +1 -1
  186. package/lib/print/print-tool/print-tool.component.d.ts +10 -10
  187. package/lib/print/print.module.d.ts +10 -10
  188. package/lib/search/index.d.ts +6 -6
  189. package/lib/search/query.state.d.ts +26 -20
  190. package/lib/search/search-bar/search-bar-binding.directive.d.ts +20 -20
  191. package/lib/search/search-bar/search-bar.module.d.ts +11 -11
  192. package/lib/search/search-results-tool/search-results-tool.component.d.ts +100 -100
  193. package/lib/search/search-results-tool/search-results-tool.module.d.ts +18 -18
  194. package/lib/search/search.module.d.ts +8 -8
  195. package/lib/search/search.state.d.ts +62 -60
  196. package/lib/storage/index.d.ts +1 -1
  197. package/lib/storage/storage.module.d.ts +6 -6
  198. package/lib/storage/storage.state.d.ts +12 -12
  199. package/lib/tool/index.d.ts +1 -1
  200. package/lib/tool/tool.module.d.ts +6 -6
  201. package/lib/tool/tool.state.d.ts +22 -22
  202. package/lib/workspace/index.d.ts +3 -3
  203. package/lib/workspace/shared/edition-actions.service.d.ts +28 -26
  204. package/lib/workspace/shared/feature-actions.service.d.ts +27 -25
  205. package/lib/workspace/shared/index.d.ts +2 -2
  206. package/lib/workspace/shared/wfs-actions.service.d.ts +29 -27
  207. package/lib/workspace/shared/workspace.utils.d.ts +9 -2
  208. package/lib/workspace/workspace-button/index.d.ts +1 -1
  209. package/lib/workspace/workspace-button/workspace-button.component.d.ts +21 -21
  210. package/lib/workspace/workspace.module.d.ts +12 -12
  211. package/lib/workspace/workspace.state.d.ts +63 -63
  212. package/locale/en.integration.json +126 -0
  213. package/locale/fr.integration.json +126 -0
  214. package/package.json +14 -18
  215. package/public_api.d.ts +31 -31
  216. package/esm2020/lib/about/about-tool/about-tool.component.mjs +0 -185
  217. package/esm2020/lib/analytics/analytics-listener.service.mjs +0 -127
  218. package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +0 -113
  219. package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +0 -29
  220. package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +0 -89
  221. package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +0 -29
  222. package/esm2020/lib/catalog/catalog.module.mjs +0 -24
  223. package/esm2020/lib/catalog/catalog.state.mjs +0 -54
  224. package/esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs +0 -34
  225. package/esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs +0 -44
  226. package/esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +0 -25
  227. package/esm2020/lib/context/context-share-tool/context-share-tool.component.mjs +0 -34
  228. package/esm2020/lib/context/context.state.mjs +0 -88
  229. package/esm2020/lib/directions/directions-tool/directions-tool.component.mjs +0 -84
  230. package/esm2020/lib/directions/directions.state.mjs +0 -64
  231. package/esm2020/lib/draw/draw.module.mjs +0 -21
  232. package/esm2020/lib/draw/draw.state.mjs +0 -39
  233. package/esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs +0 -72
  234. package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +0 -44
  235. package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +0 -44
  236. package/esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +0 -25
  237. package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +0 -535
  238. package/esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs +0 -25
  239. package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +0 -141
  240. package/esm2020/lib/import-export/import-export.state.mjs +0 -41
  241. package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +0 -472
  242. package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +0 -89
  243. package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +0 -218
  244. package/esm2020/lib/map/layer-list-tool.state.mjs +0 -42
  245. package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +0 -256
  246. package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +0 -275
  247. package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +0 -203
  248. package/esm2020/lib/map/map-proximity.state.mjs +0 -167
  249. package/esm2020/lib/map/map-tool/map-tool.component.mjs +0 -130
  250. package/esm2020/lib/map/map-tools/map-tools.component.mjs +0 -495
  251. package/esm2020/lib/map/map.module.mjs +0 -144
  252. package/esm2020/lib/map/map.state.mjs +0 -47
  253. package/esm2020/lib/measure/measure.module.mjs +0 -20
  254. package/esm2020/lib/measure/measure.state.mjs +0 -35
  255. package/esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs +0 -45
  256. package/esm2020/lib/print/print-tool/print-tool.component.mjs +0 -33
  257. package/esm2020/lib/search/query.state.mjs +0 -34
  258. package/esm2020/lib/search/search-bar/search-bar-binding.directive.mjs +0 -61
  259. package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +0 -593
  260. package/esm2020/lib/search/search-results-tool/search-results-tool.module.mjs +0 -65
  261. package/esm2020/lib/search/search.module.mjs +0 -24
  262. package/esm2020/lib/search/search.state.mjs +0 -132
  263. package/esm2020/lib/storage/storage.state.mjs +0 -23
  264. package/esm2020/lib/tool/tool.state.mjs +0 -52
  265. package/esm2020/lib/workspace/shared/edition-actions.service.mjs +0 -156
  266. package/esm2020/lib/workspace/shared/feature-actions.service.mjs +0 -144
  267. package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +0 -158
  268. package/esm2020/lib/workspace/shared/workspace.utils.mjs +0 -7
  269. package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +0 -69
  270. package/esm2020/lib/workspace/workspace.module.mjs +0 -37
  271. package/esm2020/lib/workspace/workspace.state.mjs +0 -188
  272. package/fesm2015/igo2-integration.mjs +0 -6759
  273. package/fesm2015/igo2-integration.mjs.map +0 -1
  274. package/fesm2020/igo2-integration.mjs.map +0 -1
  275. package/ngcc.config.js +0 -3
@@ -0,0 +1,524 @@
1
+ import { ChangeDetectorRef, Component, Input } from '@angular/core';
2
+ import { formatScale } from '@igo2/geo';
3
+ import { MapState } from '../../map.state';
4
+ import { Clipboard } from '@igo2/utils';
5
+ import { MessageService, LanguageService, StorageService, StorageScope, ConfigService } from '@igo2/core';
6
+ import { BehaviorSubject, combineLatest } from 'rxjs';
7
+ import { UntypedFormBuilder, Validators } from '@angular/forms';
8
+ import { debounceTime } from 'rxjs/operators';
9
+ import { zoneMtm, zoneUtm, computeProjectionsConstraints } from '@igo2/geo';
10
+ import * as olproj from 'ol/proj';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../../map.state";
13
+ import * as i2 from "@igo2/core";
14
+ import * as i3 from "@angular/forms";
15
+ import * as i4 from "@angular/material/form-field";
16
+ import * as i5 from "@angular/material/select";
17
+ import * as i6 from "@angular/material/core";
18
+ import * as i7 from "@angular/material/input";
19
+ import * as i8 from "@angular/common";
20
+ import * as i9 from "@angular/material/icon";
21
+ import * as i10 from "@angular/material/slide-toggle";
22
+ import * as i11 from "@angular/material/button";
23
+ import * as i12 from "@ngx-translate/core";
24
+ function AdvancedCoordinatesComponent_mat_form_field_2_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "mat-form-field", 14)(1, "mat-label");
26
+ i0.ɵɵtext(2);
27
+ i0.ɵɵpipe(3, "translate");
28
+ i0.ɵɵelementEnd();
29
+ i0.ɵɵelement(4, "textarea", 15, 16);
30
+ i0.ɵɵpipe(6, "translate");
31
+ i0.ɵɵelementEnd();
32
+ } if (rf & 2) {
33
+ const ctx_r0 = i0.ɵɵnextContext();
34
+ i0.ɵɵadvance(2);
35
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 3, "igo.integration.advanced-map-tool.advanced-coordinates.lon"));
36
+ i0.ɵɵadvance(2);
37
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(6, 5, "igo.integration.advanced-map-tool.advanced-coordinates.lon"))("value", ctx_r0.coordinates[0]);
38
+ } }
39
+ function AdvancedCoordinatesComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "mat-form-field", 14);
41
+ i0.ɵɵelement(1, "textarea", 15, 16);
42
+ i0.ɵɵpipe(3, "translate");
43
+ i0.ɵɵelementEnd();
44
+ } if (rf & 2) {
45
+ const ctx_r2 = i0.ɵɵnextContext();
46
+ i0.ɵɵadvance(1);
47
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.est"))("value", ctx_r2.coordinates[0]);
48
+ } }
49
+ function AdvancedCoordinatesComponent_mat_form_field_5_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelementStart(0, "mat-form-field", 17)(1, "mat-label");
51
+ i0.ɵɵtext(2);
52
+ i0.ɵɵpipe(3, "translate");
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelement(4, "textarea", 15, 16);
55
+ i0.ɵɵpipe(6, "translate");
56
+ i0.ɵɵelementEnd();
57
+ } if (rf & 2) {
58
+ const ctx_r3 = i0.ɵɵnextContext();
59
+ i0.ɵɵadvance(2);
60
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 3, "igo.integration.advanced-map-tool.advanced-coordinates.lat"));
61
+ i0.ɵɵadvance(2);
62
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(6, 5, "igo.integration.advanced-map-tool.advanced-coordinates.lat"))("value", ctx_r3.coordinates[1]);
63
+ } }
64
+ function AdvancedCoordinatesComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelementStart(0, "mat-form-field", 17);
66
+ i0.ɵɵelement(1, "textarea", 15, 16);
67
+ i0.ɵɵpipe(3, "translate");
68
+ i0.ɵɵelementEnd();
69
+ } if (rf & 2) {
70
+ const ctx_r5 = i0.ɵɵnextContext();
71
+ i0.ɵɵadvance(1);
72
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.nord"))("value", ctx_r5.coordinates[1]);
73
+ } }
74
+ function AdvancedCoordinatesComponent_mat_option_17_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelementStart(0, "mat-option", 18);
76
+ i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_mat_option_17_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
77
+ i0.ɵɵtext(1);
78
+ i0.ɵɵelementEnd();
79
+ } if (rf & 2) {
80
+ const projection_r11 = ctx.$implicit;
81
+ i0.ɵɵproperty("value", projection_r11);
82
+ i0.ɵɵadvance(1);
83
+ i0.ɵɵtextInterpolate1(" ", projection_r11.translatedValue || projection_r11.alias, " ");
84
+ } }
85
+ /**
86
+ * Tool to display the coordinates and a cursor of the center of the map
87
+ */
88
+ export class AdvancedCoordinatesComponent {
89
+ mapState;
90
+ languageService;
91
+ messageService;
92
+ cdRef;
93
+ storageService;
94
+ config;
95
+ formBuilder;
96
+ formattedScale$ = new BehaviorSubject('');
97
+ projections$ = new BehaviorSubject([]);
98
+ form;
99
+ coordinates;
100
+ currentCenterDefaultProj;
101
+ center;
102
+ inMtmZone = true;
103
+ inLambert2 = { 32198: true, 3798: true };
104
+ mapState$$;
105
+ _projectionsLimitations = {};
106
+ projectionsConstraints;
107
+ defaultProj;
108
+ currentZones = { utm: undefined, mtm: undefined };
109
+ units = true;
110
+ get map() {
111
+ return this.mapState.map;
112
+ }
113
+ get inputProj() {
114
+ return this.form.get('inputProj').value;
115
+ }
116
+ set inputProj(value) {
117
+ this.form.patchValue({ inputProj: value });
118
+ }
119
+ get projectionsLimitations() {
120
+ return this._projectionsLimitations || {};
121
+ }
122
+ set projectionsLimitations(value) {
123
+ this._projectionsLimitations = value;
124
+ }
125
+ constructor(mapState, languageService, messageService, cdRef, storageService, config, formBuilder) {
126
+ this.mapState = mapState;
127
+ this.languageService = languageService;
128
+ this.messageService = messageService;
129
+ this.cdRef = cdRef;
130
+ this.storageService = storageService;
131
+ this.config = config;
132
+ this.formBuilder = formBuilder;
133
+ this.defaultProj = {
134
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
135
+ translateKey: 'wgs84',
136
+ alias: 'WGS84',
137
+ code: 'EPSG:4326',
138
+ zone: ''
139
+ };
140
+ this.center = this.storageService.get('centerToggle');
141
+ this.computeProjections();
142
+ this.buildForm();
143
+ }
144
+ /**
145
+ * Listen a state of the map, a state of a form, update the coordinates
146
+ */
147
+ ngOnInit() {
148
+ this.mapState$$ = combineLatest([
149
+ this.map.viewController.state$.pipe(debounceTime(50)),
150
+ this.form.valueChanges
151
+ ]).subscribe(() => {
152
+ this.setScaleValue(this.map);
153
+ this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
154
+ const currentMtmZone = zoneMtm(this.currentCenterDefaultProj[0]);
155
+ const currentUtmZone = zoneUtm(this.currentCenterDefaultProj[0]);
156
+ if (!this.inMtmZone && currentMtmZone !== this.currentZones.mtm) {
157
+ this.back2quebec();
158
+ }
159
+ let zoneChange = false;
160
+ if (currentMtmZone !== this.currentZones.mtm) {
161
+ this.currentZones.mtm = currentMtmZone;
162
+ zoneChange = true;
163
+ }
164
+ if (currentUtmZone !== this.currentZones.utm) {
165
+ this.currentZones.utm = currentUtmZone;
166
+ zoneChange = true;
167
+ }
168
+ if (zoneChange) {
169
+ this.updateProjectionsZoneChange();
170
+ }
171
+ this.checkLambert(this.currentCenterDefaultProj);
172
+ this.coordinates = this.getCoordinates();
173
+ this.cdRef.detectChanges();
174
+ this.storageService.set('currentProjection', this.inputProj, StorageScope.SESSION);
175
+ });
176
+ const tempInputProj = this.storageService.get('currentProjection');
177
+ this.inputProj = this.projections$.value[0];
178
+ if (tempInputProj !== null) {
179
+ const pos = this.positionInList(tempInputProj);
180
+ this.inputProj = this.projections$.value[pos];
181
+ this.updateZoneMtmUtm();
182
+ }
183
+ this.map.mapCenter$.next(this.center);
184
+ this.coordinates = this.getCoordinates();
185
+ this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
186
+ }
187
+ ngOnDestroy() {
188
+ this.map.mapCenter$.next(false);
189
+ this.mapState$$.unsubscribe();
190
+ }
191
+ setScaleValue(map) {
192
+ this.formattedScale$.next(': ~ 1 / ' + formatScale(map.viewController.getScale()));
193
+ }
194
+ /**
195
+ * Coordinates of the center of the map on the appropriate systeme of coordinates
196
+ * @returns Array of two numbers
197
+ */
198
+ getCoordinates() {
199
+ this.currentZones.mtm = zoneMtm(this.currentCenterDefaultProj[0]);
200
+ this.currentZones.utm = zoneUtm(this.currentCenterDefaultProj[0]);
201
+ let coord;
202
+ const code = this.inputProj.code;
203
+ let decimal = 2;
204
+ if (code.includes('EPSG:4326') || code.includes('EPSG:4269')) {
205
+ decimal = 5;
206
+ }
207
+ this.units = code === 'EPSG:4326' || code === 'EPSG:4269';
208
+ coord = this.map.viewController
209
+ .getCenter(code)
210
+ .map((c) => c.toFixed(decimal));
211
+ return coord;
212
+ }
213
+ /**
214
+ * Copy the coordinates to a clipboard
215
+ */
216
+ copyTextToClipboard() {
217
+ const successful = Clipboard.copy(this.coordinates.toString());
218
+ if (successful) {
219
+ this.messageService.success('igo.integration.advanced-map-tool.advanced-coordinates.copyMsg', 'igo.integration.advanced-map-tool.advanced-coordinates.copyTitle');
220
+ }
221
+ }
222
+ /**
223
+ * Display a cursor on the center of the map
224
+ */
225
+ displayCenter(toggle) {
226
+ this.center = toggle;
227
+ this.map.mapCenter$.next(toggle);
228
+ this.storageService.set('centerToggle', toggle, StorageScope.SESSION);
229
+ }
230
+ /**
231
+ * Builder of the form
232
+ */
233
+ buildForm() {
234
+ this.form = this.formBuilder.group({
235
+ inputProj: ['', [Validators.required]]
236
+ });
237
+ }
238
+ /**
239
+ * Update list of projections after changing of the state of the map
240
+ */
241
+ updateProjectionsZoneChange() {
242
+ let modifiedProj = this.projections$.value;
243
+ const translate = this.languageService.translate;
244
+ modifiedProj.map((p) => {
245
+ if (p.translateKey === 'mtm') {
246
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
247
+ if (zone) {
248
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
249
+ p.alias = `MTM ${zone}`;
250
+ p.code = code;
251
+ p.zone = `${zone}`;
252
+ p.translatedValue = translate.instant('igo.geo.importExportForm.projections.mtm', p);
253
+ }
254
+ else {
255
+ p.alias = '';
256
+ this.inMtmZone = false;
257
+ if (this.inputProj.translateKey === 'mtm') {
258
+ this.inputProj = this.projections$.value[0];
259
+ }
260
+ }
261
+ }
262
+ if (p.translateKey === 'utm') {
263
+ const zone = zoneUtm(this.currentCenterDefaultProj[0]);
264
+ const code = `EPSG:326${zone}`;
265
+ p.alias = `UTM ${zone}`;
266
+ p.code = code;
267
+ p.zone = `${zone}`;
268
+ p.translatedValue = translate.instant('igo.geo.importExportForm.projections.utm', p);
269
+ }
270
+ });
271
+ modifiedProj = modifiedProj.filter((p) => p.alias !== '');
272
+ this.projections$.next(modifiedProj);
273
+ }
274
+ /**
275
+ * Create a list of currents projections
276
+ */
277
+ computeProjections() {
278
+ this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
279
+ const projections = [];
280
+ if (!this.currentCenterDefaultProj) {
281
+ this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
282
+ }
283
+ const translate = this.languageService.translate;
284
+ if (this.projectionsConstraints.wgs84) {
285
+ projections.push({
286
+ translatedValue: translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
287
+ translateKey: 'wgs84',
288
+ alias: 'WGS84',
289
+ code: 'EPSG:4326',
290
+ zone: ''
291
+ });
292
+ }
293
+ if (this.projectionsConstraints.nad83) {
294
+ projections.push({
295
+ translatedValue: translate.instant('igo.geo.importExportForm.projections.nad83', { code: 'EPSG:4269' }),
296
+ translateKey: 'nad83',
297
+ alias: 'NAD83',
298
+ code: 'EPSG:4269',
299
+ zone: ''
300
+ });
301
+ }
302
+ if (this.projectionsConstraints.webMercator) {
303
+ projections.push({
304
+ translatedValue: translate.instant('igo.geo.importExportForm.projections.webMercator', { code: 'EPSG:3857' }),
305
+ translateKey: 'webMercator',
306
+ alias: 'Web Mercator',
307
+ code: 'EPSG:3857',
308
+ zone: ''
309
+ });
310
+ }
311
+ if (this.projectionsConstraints.mtm) {
312
+ // Quebec
313
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
314
+ if (zone) {
315
+ this.inMtmZone = true;
316
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
317
+ projections.splice(3, 0, {
318
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
319
+ translateKey: 'mtm',
320
+ alias: `MTM ${zone}`,
321
+ code,
322
+ zone: `${zone}`
323
+ });
324
+ }
325
+ else {
326
+ this.inMtmZone = false;
327
+ }
328
+ }
329
+ if (this.projectionsConstraints.utm) {
330
+ const order = this.inMtmZone ? 4 : 3;
331
+ const zone = zoneUtm(this.currentCenterDefaultProj[0]);
332
+ const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
333
+ projections.splice(order, 0, {
334
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone }),
335
+ translateKey: 'utm',
336
+ alias: `UTM ${zone}`,
337
+ code,
338
+ zone: `${zone}`
339
+ });
340
+ }
341
+ let configProjection = [];
342
+ if (this.projectionsConstraints.projFromConfig) {
343
+ configProjection = this.config.getConfig('projections') || [];
344
+ }
345
+ this.projections$.next(projections.concat(configProjection));
346
+ }
347
+ /**
348
+ * Push the MTM in the array of systeme of coordinates
349
+ * @param projections Array of the InputProjections
350
+ */
351
+ pushMtm(projections) {
352
+ if (this.projectionsConstraints.mtm) {
353
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
354
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
355
+ projections.splice(3, 0, {
356
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
357
+ translateKey: 'mtm',
358
+ alias: `MTM ${zone}`,
359
+ code,
360
+ zone: `${zone}`
361
+ });
362
+ }
363
+ }
364
+ /**
365
+ * Updates the list of systems of coordinates for territory of Quebec
366
+ * push MTM and UTM in the Array
367
+ */
368
+ back2quebec() {
369
+ const projections = this.projections$.value;
370
+ this.pushMtm(projections);
371
+ this.inMtmZone = true;
372
+ }
373
+ /**
374
+ * Update the numbers of the zones when application is restarted
375
+ */
376
+ updateZoneMtmUtm() {
377
+ if (this.inputProj.translateKey === 'mtm') {
378
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
379
+ this.inputProj.alias = `MTM ${zone}`;
380
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
381
+ this.inputProj.code = code;
382
+ this.inputProj.zone = `${zone}`;
383
+ this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone });
384
+ }
385
+ if (this.inputProj.translateKey === 'utm') {
386
+ const zone = zoneUtm(this.currentCenterDefaultProj[0]);
387
+ this.inputProj.alias = `UTM ${zone}`;
388
+ const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
389
+ this.inputProj.code = code;
390
+ this.inputProj.zone = `${zone}`;
391
+ this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone });
392
+ }
393
+ }
394
+ /**
395
+ * Compute the position of a current projection in a list. 0 if the projection is not in the list
396
+ * @param translateKey string, translate key of a projection
397
+ * @returns numeric, position of an element in the array
398
+ */
399
+ positionInList(tempInputProj) {
400
+ const tk = tempInputProj.translateKey;
401
+ const alias = tempInputProj.alias;
402
+ let position; // = undefined;
403
+ let iter = 0;
404
+ this.projections$.value.map((projection) => {
405
+ if (tk) {
406
+ if (tk === projection.translateKey) {
407
+ position = iter;
408
+ }
409
+ }
410
+ else if (alias === projection.alias) {
411
+ position = iter;
412
+ }
413
+ iter++;
414
+ });
415
+ position = position ? position : 0;
416
+ return position;
417
+ }
418
+ /**
419
+ * Change the list of projections depending on the projections of Lambert
420
+ * @param coordinates An array of numbers, longitude and latitude
421
+ */
422
+ checkLambert(coordinates) {
423
+ const lambertProjections = this.config.getConfig('projections');
424
+ lambertProjections.forEach((projection) => {
425
+ let modifiedProj = this.projections$.value;
426
+ const extent = projection.extent;
427
+ const code = projection.code.match(/\d+/);
428
+ const currentExtentWGS = olproj.transformExtent(extent, projection.code, this.defaultProj.code);
429
+ if (coordinates[0] < currentExtentWGS[0] ||
430
+ coordinates[0] > currentExtentWGS[2] ||
431
+ coordinates[1] < currentExtentWGS[1] ||
432
+ coordinates[1] > currentExtentWGS[3]) {
433
+ this.inLambert2[code] = false;
434
+ if (this.inputProj.alias === projection.alias) {
435
+ this.inputProj = this.projections$.value[0];
436
+ }
437
+ modifiedProj = modifiedProj.filter((p) => p.alias !== projection.alias);
438
+ this.projections$.next(modifiedProj);
439
+ }
440
+ else {
441
+ if (!this.inLambert2[code]) {
442
+ this.projections$.next(modifiedProj.concat(projection));
443
+ this.inLambert2[code] = true;
444
+ }
445
+ }
446
+ });
447
+ }
448
+ static ɵfac = function AdvancedCoordinatesComponent_Factory(t) { return new (t || AdvancedCoordinatesComponent)(i0.ɵɵdirectiveInject(i1.MapState), i0.ɵɵdirectiveInject(i2.LanguageService), i0.ɵɵdirectiveInject(i2.MessageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.StorageService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.UntypedFormBuilder)); };
449
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdvancedCoordinatesComponent, selectors: [["igo-advanced-coordinates"]], inputs: { projectionsLimitations: "projectionsLimitations" }, decls: 33, vars: 37, consts: [[1, "advanced-coordinates__coordinates-container"], [1, "advanced-coordinates__coordinates-container__inner"], ["class", "coordinates", 4, "ngIf", "ngIfElse"], ["elseBlock", ""], ["class", "coordinates2", 4, "ngIf", "ngIfElse"], ["elseBlock2", ""], ["mat-icon-button", "", 1, "igo-form-button-group", "advanced-coordinates__copy-coordinates", 3, "click"], ["svgIcon", "content-copy"], [1, "igo-form", "advanced-coordinates__form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], ["matTooltipShowDelay", "500", 3, "value", "click", 4, "ngFor", "ngForOf"], [1, "center-toggle", "mat-typography", 3, "checked", "labelPosition", "change"], [1, "igo-zoom", "mat-typography"], [1, "coordinates"], ["matInput", "", "readonly", "", "rows", "1", 3, "placeholder", "value"], ["textArea", ""], [1, "coordinates2"], ["matTooltipShowDelay", "500", 3, "value", "click"]], template: function AdvancedCoordinatesComponent_Template(rf, ctx) { if (rf & 1) {
450
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
451
+ i0.ɵɵtemplate(2, AdvancedCoordinatesComponent_mat_form_field_2_Template, 7, 7, "mat-form-field", 2);
452
+ i0.ɵɵtemplate(3, AdvancedCoordinatesComponent_ng_template_3_Template, 4, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
453
+ i0.ɵɵtemplate(5, AdvancedCoordinatesComponent_mat_form_field_5_Template, 7, 7, "mat-form-field", 4);
454
+ i0.ɵɵtemplate(6, AdvancedCoordinatesComponent_ng_template_6_Template, 4, 4, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
455
+ i0.ɵɵelementEnd();
456
+ i0.ɵɵelementStart(8, "button", 6);
457
+ i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_Template_button_click_8_listener() { return ctx.copyTextToClipboard(); });
458
+ i0.ɵɵpipe(9, "translate");
459
+ i0.ɵɵelement(10, "mat-icon", 7);
460
+ i0.ɵɵelementEnd()();
461
+ i0.ɵɵelementStart(11, "form", 8)(12, "mat-form-field", 9)(13, "mat-label");
462
+ i0.ɵɵtext(14);
463
+ i0.ɵɵpipe(15, "translate");
464
+ i0.ɵɵelementEnd();
465
+ i0.ɵɵelementStart(16, "mat-select", 10);
466
+ i0.ɵɵlistener("valueChange", function AdvancedCoordinatesComponent_Template_mat_select_valueChange_16_listener($event) { return ctx.inputProj = $event; });
467
+ i0.ɵɵtemplate(17, AdvancedCoordinatesComponent_mat_option_17_Template, 2, 2, "mat-option", 11);
468
+ i0.ɵɵpipe(18, "async");
469
+ i0.ɵɵelementEnd()();
470
+ i0.ɵɵelementStart(19, "mat-slide-toggle", 12);
471
+ i0.ɵɵlistener("change", function AdvancedCoordinatesComponent_Template_mat_slide_toggle_change_19_listener($event) { return ctx.displayCenter($event.checked); });
472
+ i0.ɵɵtext(20);
473
+ i0.ɵɵpipe(21, "translate");
474
+ i0.ɵɵelementEnd()();
475
+ i0.ɵɵelementStart(22, "p", 13);
476
+ i0.ɵɵtext(23);
477
+ i0.ɵɵpipe(24, "translate");
478
+ i0.ɵɵelementEnd();
479
+ i0.ɵɵelementStart(25, "p", 13);
480
+ i0.ɵɵtext(26);
481
+ i0.ɵɵpipe(27, "translate");
482
+ i0.ɵɵpipe(28, "async");
483
+ i0.ɵɵelementEnd();
484
+ i0.ɵɵelementStart(29, "p", 13);
485
+ i0.ɵɵtext(30);
486
+ i0.ɵɵpipe(31, "translate");
487
+ i0.ɵɵpipe(32, "number");
488
+ i0.ɵɵelementEnd();
489
+ } if (rf & 2) {
490
+ const _r1 = i0.ɵɵreference(4);
491
+ const _r4 = i0.ɵɵreference(7);
492
+ i0.ɵɵadvance(2);
493
+ i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r1);
494
+ i0.ɵɵadvance(3);
495
+ i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r4);
496
+ i0.ɵɵadvance(3);
497
+ i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind1(9, 18, "igo.integration.advanced-map-tool.advanced-coordinates.copy"));
498
+ i0.ɵɵadvance(3);
499
+ i0.ɵɵproperty("formGroup", ctx.form);
500
+ i0.ɵɵadvance(3);
501
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(15, 20, "igo.integration.advanced-map-tool.advanced-coordinates.coordSystem"));
502
+ i0.ɵɵadvance(2);
503
+ i0.ɵɵproperty("value", ctx.inputProj);
504
+ i0.ɵɵadvance(1);
505
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(18, 22, ctx.projections$));
506
+ i0.ɵɵadvance(2);
507
+ i0.ɵɵproperty("checked", ctx.center)("labelPosition", "before");
508
+ i0.ɵɵadvance(1);
509
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 24, "igo.integration.advanced-map-tool.advanced-coordinates.center"), " ");
510
+ i0.ɵɵadvance(3);
511
+ i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind1(24, 26, "igo.integration.advanced-map-tool.advanced-coordinates.zoom"), " ", ctx.map.viewController.getZoom(), "\n");
512
+ i0.ɵɵadvance(3);
513
+ i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind1(27, 28, "igo.integration.advanced-map-tool.advanced-coordinates.scale"), " ", i0.ɵɵpipeBind1(28, 30, ctx.formattedScale$), "\n");
514
+ i0.ɵɵadvance(4);
515
+ i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind1(31, 32, "igo.integration.advanced-map-tool.advanced-coordinates.resolution"), " ", i0.ɵɵpipeBind2(32, 34, ctx.map.viewController.getResolution(), "1.0-0"), "\n");
516
+ } }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatusGroup, i3.FormGroupDirective, i4.MatFormField, i4.MatLabel, i5.MatSelect, i6.MatOption, i7.MatInput, i8.NgForOf, i8.NgIf, i9.MatIcon, i10.MatSlideToggle, i11.MatIconButton, i8.AsyncPipe, i8.DecimalPipe, i12.TranslatePipe], styles: ["textarea[_ngcontent-%COMP%]{resize:none}mat-form-field[_ngcontent-%COMP%]{padding:10px 15px}mat-form-field.coordinates2[_ngcontent-%COMP%]{padding:0 10px 0 3px}mat-form-field.igo-input-container[_ngcontent-%COMP%]{width:100%;padding:0 15px}.igo-form-button-group[_ngcontent-%COMP%]{padding:0 10px;margin:0 10px}.igo-zoom[_ngcontent-%COMP%]{padding:0 15px}.advanced-coordinates__coordinates-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.advanced-coordinates__coordinates-container__inner[_ngcontent-%COMP%]{flex:1 1 0}.advanced-coordinates__coordinates-container__inner[_ngcontent-%COMP%] .mat-mdc-form-field[_ngcontent-%COMP%]{width:50%}.advanced-coordinates__form[_ngcontent-%COMP%] .mat-mdc-slide-toggle{padding:10px 15px 35px;width:100%}mat-slide-toggle[_ngcontent-%COMP%]{width:100%;padding:0 8px}mat-slide-toggle[_ngcontent-%COMP%] .mdc-form-field{width:100%}mat-slide-toggle[_ngcontent-%COMP%] .mdc-label{margin-left:0;width:calc(100% - 60px)}"] });
517
+ }
518
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdvancedCoordinatesComponent, [{
519
+ type: Component,
520
+ args: [{ selector: 'igo-advanced-coordinates', template: "<div class=\"advanced-coordinates__coordinates-container\">\r\n <div class=\"advanced-coordinates__coordinates-container__inner\">\r\n <mat-form-field *ngIf=\"units; else elseBlock\" class=\"coordinates\">\r\n <mat-label>{{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.lon' | translate\r\n }}</mat-label>\r\n <textarea\r\n #textArea\r\n matInput\r\n readonly\r\n rows=\"1\"\r\n [placeholder]=\"\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.lon'\r\n | translate\r\n \"\r\n [value]=\"coordinates[0]\"\r\n ></textarea>\r\n </mat-form-field>\r\n <ng-template #elseBlock>\r\n <mat-form-field class=\"coordinates\">\r\n <textarea\r\n #textArea\r\n matInput\r\n readonly\r\n rows=\"1\"\r\n [placeholder]=\"\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.est'\r\n | translate\r\n \"\r\n [value]=\"coordinates[0]\"\r\n ></textarea>\r\n </mat-form-field>\r\n </ng-template>\r\n\r\n <mat-form-field *ngIf=\"units; else elseBlock2\" class=\"coordinates2\">\r\n <mat-label>{{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.lat' | translate\r\n }}</mat-label>\r\n <textarea\r\n #textArea\r\n matInput\r\n readonly\r\n rows=\"1\"\r\n [placeholder]=\"\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.lat'\r\n | translate\r\n \"\r\n [value]=\"coordinates[1]\"\r\n ></textarea>\r\n </mat-form-field>\r\n <ng-template #elseBlock2>\r\n <mat-form-field class=\"coordinates2\">\r\n <textarea\r\n #textArea\r\n matInput\r\n readonly\r\n rows=\"1\"\r\n [placeholder]=\"\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.nord'\r\n | translate\r\n \"\r\n [value]=\"coordinates[1]\"\r\n ></textarea>\r\n </mat-form-field>\r\n </ng-template>\r\n </div>\r\n\r\n <button\r\n mat-icon-button\r\n [attr.aria-label]=\"\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.copy' | translate\r\n \"\r\n class=\"igo-form-button-group advanced-coordinates__copy-coordinates\"\r\n (click)=\"copyTextToClipboard()\"\r\n >\r\n <mat-icon svgIcon=\"content-copy\"></mat-icon>\r\n </button>\r\n</div>\r\n<form class=\"igo-form advanced-coordinates__form\" [formGroup]=\"form\">\r\n <mat-form-field class=\"igo-input-container\">\r\n <mat-label>{{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.coordSystem'\r\n | translate\r\n }}</mat-label>\r\n <mat-select [(value)]=\"inputProj\">\r\n <mat-option\r\n matTooltipShowDelay=\"500\"\r\n *ngFor=\"let projection of projections$ | async\"\r\n [value]=\"projection\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ projection.translatedValue || projection.alias }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-slide-toggle\r\n class=\"center-toggle mat-typography\"\r\n [checked]=\"center\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"displayCenter($event.checked)\"\r\n >\r\n {{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.center'\r\n | translate\r\n }}\r\n </mat-slide-toggle>\r\n</form>\r\n\r\n<p class=\"igo-zoom mat-typography\">\r\n {{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.zoom' | translate\r\n }}\r\n {{ map.viewController.getZoom() }}\r\n</p>\r\n<p class=\"igo-zoom mat-typography\">\r\n {{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.scale' | translate\r\n }}\r\n {{ formattedScale$ | async }}\r\n</p>\r\n<p class=\"igo-zoom mat-typography\">\r\n {{\r\n 'igo.integration.advanced-map-tool.advanced-coordinates.resolution'\r\n | translate\r\n }}\r\n {{ map.viewController.getResolution() | number: '1.0-0' }}\r\n</p>\r\n", styles: ["textarea{resize:none}mat-form-field{padding:10px 15px}mat-form-field.coordinates2{padding:0 10px 0 3px}mat-form-field.igo-input-container{width:100%;padding:0 15px}.igo-form-button-group{padding:0 10px;margin:0 10px}.igo-zoom{padding:0 15px}.advanced-coordinates__coordinates-container{display:flex;flex-direction:row;align-items:center}.advanced-coordinates__coordinates-container__inner{flex:1 1 0}.advanced-coordinates__coordinates-container__inner .mat-mdc-form-field{width:50%}.advanced-coordinates__form ::ng-deep .mat-mdc-slide-toggle{padding:10px 15px 35px;width:100%}mat-slide-toggle{width:100%;padding:0 8px}mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}\n"] }]
521
+ }], function () { return [{ type: i1.MapState }, { type: i2.LanguageService }, { type: i2.MessageService }, { type: i0.ChangeDetectorRef }, { type: i2.StorageService }, { type: i2.ConfigService }, { type: i3.UntypedFormBuilder }]; }, { projectionsLimitations: [{
522
+ type: Input
523
+ }] }); })();
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBR1QsS0FBSyxFQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxXQUFXLEVBSVosTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUNMLGNBQWMsRUFDZCxlQUFlLEVBQ2YsY0FBYyxFQUNkLFlBQVksRUFDWixhQUFhLEVBQ2QsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxrQkFBa0IsRUFFbEIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVFLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7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Rjs7O3VGRHZGYSw0QkFBNEI7Y0FMeEMsU0FBUzsyQkFDRSwwQkFBMEI7Z1BBbUNoQyxzQkFBc0I7a0JBRHpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIElucHV0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgZm9ybWF0U2NhbGUsXHJcbiAgSWdvTWFwLFxyXG4gIElucHV0UHJvamVjdGlvbnMsXHJcbiAgUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnNcclxufSBmcm9tICdAaWdvMi9nZW8nO1xyXG5pbXBvcnQgeyBNYXBTdGF0ZSB9IGZyb20gJy4uLy4uL21hcC5zdGF0ZSc7XHJcbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BpZ28yL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBNZXNzYWdlU2VydmljZSxcclxuICBMYW5ndWFnZVNlcnZpY2UsXHJcbiAgU3RvcmFnZVNlcnZpY2UsXHJcbiAgU3RvcmFnZVNjb3BlLFxyXG4gIENvbmZpZ1NlcnZpY2VcclxufSBmcm9tICdAaWdvMi9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgVW50eXBlZEZvcm1Hcm91cCxcclxuICBWYWxpZGF0b3JzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IHpvbmVNdG0sIHpvbmVVdG0sIGNvbXB1dGVQcm9qZWN0aW9uc0NvbnN0cmFpbnRzIH0gZnJvbSAnQGlnbzIvZ2VvJztcclxuaW1wb3J0ICogYXMgb2xwcm9qIGZyb20gJ29sL3Byb2onO1xyXG4vKipcclxuICogVG9vbCB0byBkaXNwbGF5IHRoZSBjb29yZGluYXRlcyBhbmQgYSBjdXJzb3Igb2YgdGhlIGNlbnRlciBvZiB0aGUgbWFwXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lnby1hZHZhbmNlZC1jb29yZGluYXRlcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLWNvb3JkaW5hdGVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC1jb29yZGluYXRlcy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZENvb3JkaW5hdGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHB1YmxpYyBmb3JtYXR0ZWRTY2FsZSQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XHJcbiAgcHVibGljIHByb2plY3Rpb25zJDogQmVoYXZpb3JTdWJqZWN0PElucHV0UHJvamVjdGlvbnNbXT4gPVxyXG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XHJcbiAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIGNvb3JkaW5hdGVzOiBzdHJpbmdbXTtcclxuICBwcml2YXRlIGN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvajogW251bWJlciwgbnVtYmVyXTtcclxuICBwdWJsaWMgY2VudGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgaW5NdG1ab25lOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGluTGFtYmVydDIgPSB7IDMyMTk4OiB0cnVlLCAzNzk4OiB0cnVlIH07XHJcbiAgcHJpdmF0ZSBtYXBTdGF0ZSQkOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBfcHJvamVjdGlvbnNMaW1pdGF0aW9uczogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMgPSB7fTtcclxuICBwcml2YXRlIHByb2plY3Rpb25zQ29uc3RyYWludHM6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zO1xyXG4gIHByaXZhdGUgZGVmYXVsdFByb2o6IElucHV0UHJvamVjdGlvbnM7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Wm9uZXMgPSB7IHV0bTogdW5kZWZpbmVkLCBtdG06IHVuZGVmaW5lZCB9O1xyXG4gIHB1YmxpYyB1bml0czogYm9vbGVhbiA9IHRydWU7XHJcbiAgZ2V0IG1hcCgpOiBJZ29NYXAge1xyXG4gICAgcmV0dXJuIHRoaXMubWFwU3RhdGUubWFwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlucHV0UHJvaigpOiBJbnB1dFByb2plY3Rpb25zIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdpbnB1dFByb2onKS52YWx1ZTtcclxuICB9XHJcbiAgc2V0IGlucHV0UHJvaih2YWx1ZTogSW5wdXRQcm9qZWN0aW9ucykge1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBpbnB1dFByb2o6IHZhbHVlIH0pO1xyXG4gIH1cclxuICBnZXQgcHJvamVjdGlvbnNMaW1pdGF0aW9ucygpOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyB8fCB7fTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHByb2plY3Rpb25zTGltaXRhdGlvbnModmFsdWU6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zKSB7XHJcbiAgICB0aGlzLl9wcm9qZWN0aW9uc0xpbWl0YXRpb25zID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBtYXBTdGF0ZTogTWFwU3RhdGUsXHJcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXJcclxuICApIHtcclxuICAgIHRoaXMuZGVmYXVsdFByb2ogPSB7XHJcbiAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy53Z3M4NCcsXHJcbiAgICAgICAgeyBjb2RlOiAnRVBTRzo0MzI2JyB9XHJcbiAgICAgICksXHJcbiAgICAgIHRyYW5zbGF0ZUtleTogJ3dnczg0JyxcclxuICAgICAgYWxpYXM6ICdXR1M4NCcsXHJcbiAgICAgIGNvZGU6ICdFUFNHOjQzMjYnLFxyXG4gICAgICB6b25lOiAnJ1xyXG4gICAgfTtcclxuICAgIHRoaXMuY2VudGVyID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoJ2NlbnRlclRvZ2dsZScpIGFzIGJvb2xlYW47XHJcbiAgICB0aGlzLmNvbXB1dGVQcm9qZWN0aW9ucygpO1xyXG4gICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3RlbiBhIHN0YXRlIG9mIHRoZSBtYXAsIGEgc3RhdGUgb2YgYSBmb3JtLCB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hcFN0YXRlJCQgPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuc3RhdGUkLnBpcGUoZGVib3VuY2VUaW1lKDUwKSksXHJcbiAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNcclxuICAgIF0pLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0U2NhbGVWYWx1ZSh0aGlzLm1hcCk7XHJcbiAgICAgIHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdFByb2ouY29kZVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBjdXJyZW50TXRtWm9uZSA9IHpvbmVNdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICBjb25zdCBjdXJyZW50VXRtWm9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICBpZiAoIXRoaXMuaW5NdG1ab25lICYmIGN1cnJlbnRNdG1ab25lICE9PSB0aGlzLmN1cnJlbnRab25lcy5tdG0pIHtcclxuICAgICAgICB0aGlzLmJhY2sycXVlYmVjKCk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHpvbmVDaGFuZ2UgPSBmYWxzZTtcclxuICAgICAgaWYgKGN1cnJlbnRNdG1ab25lICE9PSB0aGlzLmN1cnJlbnRab25lcy5tdG0pIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRab25lcy5tdG0gPSBjdXJyZW50TXRtWm9uZTtcclxuICAgICAgICB6b25lQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY3VycmVudFV0bVpvbmUgIT09IHRoaXMuY3VycmVudFpvbmVzLnV0bSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFpvbmVzLnV0bSA9IGN1cnJlbnRVdG1ab25lO1xyXG4gICAgICAgIHpvbmVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh6b25lQ2hhbmdlKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uc1pvbmVDaGFuZ2UoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNoZWNrTGFtYmVydCh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaik7XHJcbiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSB0aGlzLmdldENvb3JkaW5hdGVzKCk7XHJcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChcclxuICAgICAgICAnY3VycmVudFByb2plY3Rpb24nLFxyXG4gICAgICAgIHRoaXMuaW5wdXRQcm9qLFxyXG4gICAgICAgIFN0b3JhZ2VTY29wZS5TRVNTSU9OXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZW1wSW5wdXRQcm9qID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoXHJcbiAgICAgICdjdXJyZW50UHJvamVjdGlvbidcclxuICAgICkgYXMgSW5wdXRQcm9qZWN0aW9ucztcclxuICAgIHRoaXMuaW5wdXRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbMF07XHJcbiAgICBpZiAodGVtcElucHV0UHJvaiAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBwb3MgPSB0aGlzLnBvc2l0aW9uSW5MaXN0KHRlbXBJbnB1dFByb2opO1xyXG4gICAgICB0aGlzLmlucHV0UHJvaiA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlW3Bvc107XHJcbiAgICAgIHRoaXMudXBkYXRlWm9uZU10bVV0bSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXAubWFwQ2VudGVyJC5uZXh0KHRoaXMuY2VudGVyKTtcclxuICAgIHRoaXMuY29vcmRpbmF0ZXMgPSB0aGlzLmdldENvb3JkaW5hdGVzKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaiA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldENlbnRlcihcclxuICAgICAgdGhpcy5kZWZhdWx0UHJvai5jb2RlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hcC5tYXBDZW50ZXIkLm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5tYXBTdGF0ZSQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRTY2FsZVZhbHVlKG1hcDogSWdvTWFwKSB7XHJcbiAgICB0aGlzLmZvcm1hdHRlZFNjYWxlJC5uZXh0KFxyXG4gICAgICAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwLnZpZXdDb250cm9sbGVyLmdldFNjYWxlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXAgb24gdGhlIGFwcHJvcHJpYXRlIHN5c3RlbWUgb2YgY29vcmRpbmF0ZXNcclxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0d28gbnVtYmVyc1xyXG4gICAqL1xyXG4gIGdldENvb3JkaW5hdGVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHRoaXMuY3VycmVudFpvbmVzLm10bSA9IHpvbmVNdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgdGhpcy5jdXJyZW50Wm9uZXMudXRtID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XHJcbiAgICBsZXQgY29vcmQ7XHJcbiAgICBjb25zdCBjb2RlID0gdGhpcy5pbnB1dFByb2ouY29kZTtcclxuICAgIGxldCBkZWNpbWFsID0gMjtcclxuICAgIGlmIChjb2RlLmluY2x1ZGVzKCdFUFNHOjQzMjYnKSB8fCBjb2RlLmluY2x1ZGVzKCdFUFNHOjQyNjknKSkge1xyXG4gICAgICBkZWNpbWFsID0gNTtcclxuICAgIH1cclxuICAgIHRoaXMudW5pdHMgPSBjb2RlID09PSAnRVBTRzo0MzI2JyB8fCBjb2RlID09PSAnRVBTRzo0MjY5JztcclxuICAgIGNvb3JkID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXJcclxuICAgICAgLmdldENlbnRlcihjb2RlKVxyXG4gICAgICAubWFwKChjKSA9PiBjLnRvRml4ZWQoZGVjaW1hbCkpO1xyXG4gICAgcmV0dXJuIGNvb3JkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29weSB0aGUgY29vcmRpbmF0ZXMgdG8gYSBjbGlwYm9hcmRcclxuICAgKi9cclxuICBjb3B5VGV4dFRvQ2xpcGJvYXJkKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IENsaXBib2FyZC5jb3B5KHRoaXMuY29vcmRpbmF0ZXMudG9TdHJpbmcoKSk7XHJcbiAgICBpZiAoc3VjY2Vzc2Z1bCkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXHJcbiAgICAgICAgJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5jb3B5TXNnJyxcclxuICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHlUaXRsZSdcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3BsYXkgYSBjdXJzb3Igb24gdGhlIGNlbnRlciBvZiB0aGUgbWFwXHJcbiAgICovXHJcbiAgZGlzcGxheUNlbnRlcih0b2dnbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuY2VudGVyID0gdG9nZ2xlO1xyXG4gICAgdGhpcy5tYXAubWFwQ2VudGVyJC5uZXh0KHRvZ2dsZSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnY2VudGVyVG9nZ2xlJywgdG9nZ2xlLCBTdG9yYWdlU2NvcGUuU0VTU0lPTik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZGVyIG9mIHRoZSBmb3JtXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZEZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgaW5wdXRQcm9qOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGxpc3Qgb2YgcHJvamVjdGlvbnMgYWZ0ZXIgY2hhbmdpbmcgb2YgdGhlIHN0YXRlIG9mIHRoZSBtYXBcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZVByb2plY3Rpb25zWm9uZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIGxldCBtb2RpZmllZFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZTtcclxuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcclxuICAgIG1vZGlmaWVkUHJvai5tYXAoKHApID0+IHtcclxuICAgICAgaWYgKHAudHJhbnNsYXRlS2V5ID09PSAnbXRtJykge1xyXG4gICAgICAgIGNvbnN0IHpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcclxuICAgICAgICBpZiAoem9uZSkge1xyXG4gICAgICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyMTgke3pvbmV9YCA6IGBFUFNHOjMyMSR7ODAgKyB6b25lfWA7XHJcbiAgICAgICAgICBwLmFsaWFzID0gYE1UTSAke3pvbmV9YDtcclxuICAgICAgICAgIHAuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgICBwLnpvbmUgPSBgJHt6b25lfWA7XHJcbiAgICAgICAgICBwLnRyYW5zbGF0ZWRWYWx1ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsXHJcbiAgICAgICAgICAgIHBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHAuYWxpYXMgPSAnJztcclxuICAgICAgICAgIHRoaXMuaW5NdG1ab25lID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5pbnB1dFByb2oudHJhbnNsYXRlS2V5ID09PSAnbXRtJykge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0UHJvaiA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlWzBdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAocC50cmFuc2xhdGVLZXkgPT09ICd1dG0nKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSBgRVBTRzozMjYke3pvbmV9YDtcclxuICAgICAgICBwLmFsaWFzID0gYFVUTSAke3pvbmV9YDtcclxuICAgICAgICBwLmNvZGUgPSBjb2RlO1xyXG4gICAgICAgIHAuem9uZSA9IGAke3pvbmV9YDtcclxuICAgICAgICBwLnRyYW5zbGF0ZWRWYWx1ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy51dG0nLFxyXG4gICAgICAgICAgcFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbW9kaWZpZWRQcm9qID0gbW9kaWZpZWRQcm9qLmZpbHRlcigocCkgPT4gcC5hbGlhcyAhPT0gJycpO1xyXG4gICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChtb2RpZmllZFByb2opO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbGlzdCBvZiBjdXJyZW50cyBwcm9qZWN0aW9uc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgY29tcHV0ZVByb2plY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzID0gY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHMoXHJcbiAgICAgIHRoaXMucHJvamVjdGlvbnNMaW1pdGF0aW9uc1xyXG4gICAgKTtcclxuICAgIGNvbnN0IHByb2plY3Rpb25zOiBJbnB1dFByb2plY3Rpb25zW10gPSBbXTtcclxuXHJcbiAgICBpZiAoIXRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdFByb2ouY29kZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcclxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMud2dzODQpIHtcclxuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMud2dzODQnLFxyXG4gICAgICAgICAgeyBjb2RlOiAnRVBTRzo0MzI2JyB9XHJcbiAgICAgICAgKSxcclxuICAgICAgICB0cmFuc2xhdGVLZXk6ICd3Z3M4NCcsXHJcbiAgICAgICAgYWxpYXM6ICdXR1M4NCcsXHJcbiAgICAgICAgY29kZTogJ0VQU0c6NDMyNicsXHJcbiAgICAgICAgem9uZTogJydcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5uYWQ4Mykge1xyXG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcclxuICAgICAgICB0cmFuc2xhdGVkVmFsdWU6IHRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5uYWQ4MycsXHJcbiAgICAgICAgICB7IGNvZGU6ICdFUFNHOjQyNjknIH1cclxuICAgICAgICApLFxyXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ25hZDgzJyxcclxuICAgICAgICBhbGlhczogJ05BRDgzJyxcclxuICAgICAgICBjb2RlOiAnRVBTRzo0MjY5JyxcclxuICAgICAgICB6b25lOiAnJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLndlYk1lcmNhdG9yKSB7XHJcbiAgICAgIHByb2plY3Rpb25zLnB1c2goe1xyXG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLndlYk1lcmNhdG9yJyxcclxuICAgICAgICAgIHsgY29kZTogJ0VQU0c6Mzg1NycgfVxyXG4gICAgICAgICksXHJcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAnd2ViTWVyY2F0b3InLFxyXG4gICAgICAgIGFsaWFzOiAnV2ViIE1lcmNhdG9yJyxcclxuICAgICAgICBjb2RlOiAnRVBTRzozODU3JyxcclxuICAgICAgICB6b25lOiAnJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubXRtKSB7XHJcbiAgICAgIC8vIFF1ZWJlY1xyXG4gICAgICBjb25zdCB6b25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XHJcbiAgICAgIGlmICh6b25lKSB7XHJcbiAgICAgICAgdGhpcy5pbk10bVpvbmUgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSB6b25lIDwgMTAgPyBgRVBTRzozMjE4JHt6b25lfWAgOiBgRVBTRzozMjEkezgwICsgem9uZX1gO1xyXG4gICAgICAgIHByb2plY3Rpb25zLnNwbGljZSgzLCAwLCB7XHJcbiAgICAgICAgICB0cmFuc2xhdGVkVmFsdWU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsXHJcbiAgICAgICAgICAgIHsgY29kZSwgem9uZSB9XHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgdHJhbnNsYXRlS2V5OiAnbXRtJyxcclxuICAgICAgICAgIGFsaWFzOiBgTVRNICR7em9uZX1gLFxyXG4gICAgICAgICAgY29kZSxcclxuICAgICAgICAgIHpvbmU6IGAke3pvbmV9YFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaW5NdG1ab25lID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMudXRtKSB7XHJcbiAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5pbk10bVpvbmUgPyA0IDogMztcclxuICAgICAgY29uc3Qgem9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzI2MCR7em9uZX1gIDogYEVQU0c6MzI2JHt6b25lfWA7XHJcbiAgICAgIHByb2plY3Rpb25zLnNwbGljZShvcmRlciwgMCwge1xyXG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLnV0bScsXHJcbiAgICAgICAgICB7IGNvZGUsIHpvbmUgfVxyXG4gICAgICAgICksXHJcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAndXRtJyxcclxuICAgICAgICBhbGlhczogYFVUTSAke3pvbmV9YCxcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIHpvbmU6IGAke3pvbmV9YFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGxldCBjb25maWdQcm9qZWN0aW9uID0gW107XHJcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnByb2pGcm9tQ29uZmlnKSB7XHJcbiAgICAgIGNvbmZpZ1Byb2plY3Rpb24gPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ3Byb2plY3Rpb25zJykgfHwgW107XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb2plY3Rpb25zJC5uZXh0KHByb2plY3Rpb25zLmNvbmNhdChjb25maWdQcm9qZWN0aW9uKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIHRoZSBNVE0gaW4gdGhlIGFycmF5IG9mIHN5c3RlbWUgb2YgY29vcmRpbmF0ZXNcclxuICAgKiBAcGFyYW0gcHJvamVjdGlvbnMgQXJyYXkgb2YgdGhlIElucHV0UHJvamVjdGlvbnNcclxuICAgKi9cclxuICBwcml2YXRlIHB1c2hNdG0ocHJvamVjdGlvbnM6IEFycmF5PElucHV0UHJvamVjdGlvbnM+KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bSkge1xyXG4gICAgICBjb25zdCB6b25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XHJcbiAgICAgIGNvbnN0IGNvZGUgPSB6b25lIDwgMTAgPyBgRVBTRzozMjE4JHt6b25lfWAgOiBgRVBTRzozMjEkezgwICsgem9uZX1gO1xyXG4gICAgICBwcm9qZWN0aW9ucy5zcGxpY2UoMywgMCwge1xyXG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsXHJcbiAgICAgICAgICB7IGNvZGUsIHpvbmUgfVxyXG4gICAgICAgICksXHJcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAnbXRtJyxcclxuICAgICAgICBhbGlhczogYE1UTSAke3pvbmV9YCxcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIHpvbmU6IGAke3pvbmV9YFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGxpc3Qgb2Ygc3lzdGVtcyBvZiBjb29yZGluYXRlcyBmb3IgdGVycml0b3J5IG9mIFF1ZWJlY1xyXG4gICAqIHB1c2ggTVRNIGFuZCBVVE0gaW4gdGhlIEFycmF5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiYWNrMnF1ZWJlYygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByb2plY3Rpb25zID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWU7XHJcbiAgICB0aGlzLnB1c2hNdG0ocHJvamVjdGlvbnMpO1xyXG4gICAgdGhpcy5pbk10bVpvbmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBudW1iZXJzIG9mIHRoZSB6b25lcyB3aGVuIGFwcGxpY2F0aW9uIGlzIHJlc3RhcnRlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlWm9uZU10bVV0bSgpIHtcclxuICAgIGlmICh0aGlzLmlucHV0UHJvai50cmFuc2xhdGVLZXkgPT09ICdtdG0nKSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcclxuICAgICAgdGhpcy5pbnB1dFByb2ouYWxpYXMgPSBgTVRNICR7em9uZX1gO1xyXG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzIxOCR7em9uZX1gIDogYEVQU0c6MzIxJHs4MCArIHpvbmV9YDtcclxuICAgICAgdGhpcy5pbnB1dFByb2ouY29kZSA9IGNvZGU7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLnpvbmUgPSBgJHt6b25lfWA7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZWRWYWx1ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMubXRtJyxcclxuICAgICAgICB7IGNvZGUsIHpvbmUgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZUtleSA9PT0gJ3V0bScpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICB0aGlzLmlucHV0UHJvai5hbGlhcyA9IGBVVE0gJHt6b25lfWA7XHJcbiAgICAgIGNvbnN0IGNvZGUgPSB6b25lIDwgMTAgPyBgRVBTRzozMjYwJHt6b25lfWAgOiBgRVBTRzozMjYke3pvbmV9YDtcclxuICAgICAgdGhpcy5pbnB1dFByb2ouY29kZSA9IGNvZGU7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLnpvbmUgPSBgJHt6b25lfWA7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZWRWYWx1ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMudXRtJyxcclxuICAgICAgICB7IGNvZGUsIHpvbmUgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHV0ZSB0aGUgcG9zaXRpb24gb2YgYSBjdXJyZW50IHByb2plY3Rpb24gaW4gYSBsaXN0LiAwIGlmIHRoZSBwcm9qZWN0aW9uIGlzIG5vdCBpbiB0aGUgbGlzdFxyXG4gICAqIEBwYXJhbSB0cmFuc2xhdGVLZXkgc3RyaW5nLCB0cmFuc2xhdGUga2V5IG9mIGEgcHJvamVjdGlvblxyXG4gICAqIEByZXR1cm5zIG51bWVyaWMsIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICovXHJcbiAgcG9zaXRpb25Jbkxpc3QodGVtcElucHV0UHJvajogSW5wdXRQcm9qZWN0aW9ucyk6IG51bWJlciB7XHJcbiAgICBjb25zdCB0ayA9IHRlbXBJbnB1dFByb2oudHJhbnNsYXRlS2V5O1xyXG4gICAgY29uc3QgYWxpYXMgPSB0ZW1wSW5wdXRQcm9qLmFsaWFzO1xyXG4gICAgbGV0IHBvc2l0aW9uOyAvLyA9IHVuZGVmaW5lZDtcclxuICAgIGxldCBpdGVyID0gMDtcclxuICAgIHRoaXMucHJvamVjdGlvbnMkLnZhbHVlLm1hcCgocHJvamVjdGlvbikgPT4ge1xyXG4gICAgICBpZiAodGspIHtcclxuICAgICAgICBpZiAodGsgPT09IHByb2plY3Rpb24udHJhbnNsYXRlS2V5KSB7XHJcbiAgICAgICAgICBwb3NpdGlvbiA9IGl0ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBwcm9qZWN0aW9uLmFsaWFzKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSBpdGVyO1xyXG4gICAgICB9XHJcbiAgICAgIGl0ZXIrKztcclxuICAgIH0pO1xyXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uIDogMDtcclxuICAgIHJldHVybiBwb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHByb2plY3Rpb25zIG9mIExhbWJlcnRcclxuICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgQW4gYXJyYXkgb2YgbnVtYmVycywgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZVxyXG4gICAqL1xyXG4gIGNoZWNrTGFtYmVydChjb29yZGluYXRlczogW251bWJlciwgbnVtYmVyXSkge1xyXG4gICAgY29uc3QgbGFtYmVydFByb2plY3Rpb25zID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdwcm9qZWN0aW9ucycpO1xyXG4gICAgbGFtYmVydFByb2plY3Rpb25zLmZvckVhY2goKHByb2plY3Rpb24pID0+IHtcclxuICAgICAgbGV0IG1vZGlmaWVkUHJvaiA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlO1xyXG4gICAgICBjb25zdCBleHRlbnQgPSBwcm9qZWN0aW9uLmV4dGVudDtcclxuICAgICAgY29uc3QgY29kZSA9IHByb2plY3Rpb24uY29kZS5tYXRjaCgvXFxkKy8pO1xyXG4gICAgICBjb25zdCBjdXJyZW50RXh0ZW50V0dTID0gb2xwcm9qLnRyYW5zZm9ybUV4dGVudChcclxuICAgICAgICBleHRlbnQsXHJcbiAgICAgICAgcHJvamVjdGlvbi5jb2RlLFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdFByb2ouY29kZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29vcmRpbmF0ZXNbMF0gPCBjdXJyZW50RXh0ZW50V0dTWzBdIHx8XHJcbiAgICAgICAgY29vcmRpbmF0ZXNbMF0gPiBjdXJyZW50RXh0ZW50V0dTWzJdIHx8XHJcbiAgICAgICAgY29vcmRpbmF0ZXNbMV0gPCBjdXJyZW50RXh0ZW50V0dTWzFdIHx8XHJcbiAgICAgICAgY29vcmRpbmF0ZXNbMV0gPiBjdXJyZW50RXh0ZW50V0dTWzNdXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuaW5MYW1iZXJ0Mltjb2RlXSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmlucHV0UHJvai5hbGlhcyA9PT0gcHJvamVjdGlvbi5hbGlhcykge1xyXG4gICAgICAgICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbW9kaWZpZWRQcm9qID0gbW9kaWZpZWRQcm9qLmZpbHRlcigocCkgPT4gcC5hbGlhcyAhPT0gcHJvamVjdGlvbi5hbGlhcyk7XHJcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChtb2RpZmllZFByb2opO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5pbkxhbWJlcnQyW2NvZGVdKSB7XHJcbiAgICAgICAgICB0aGlzLnByb2plY3Rpb25zJC5uZXh0KG1vZGlmaWVkUHJvai5jb25jYXQocHJvamVjdGlvbikpO1xyXG4gICAgICAgICAgdGhpcy5pbkxhbWJlcnQyW2NvZGVdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYWR2YW5jZWQtY29vcmRpbmF0ZXNfX2Nvb3JkaW5hdGVzLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJhZHZhbmNlZC1jb29yZGluYXRlc19fY29vcmRpbmF0ZXMtY29udGFpbmVyX19pbm5lclwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwidW5pdHM7IGVsc2UgZWxzZUJsb2NrXCIgY2xhc3M9XCJjb29yZGluYXRlc1wiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7XHJcbiAgICAgICAgJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5sb24nIHwgdHJhbnNsYXRlXHJcbiAgICAgIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICN0ZXh0QXJlYVxyXG4gICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICByb3dzPVwiMVwiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxyXG4gICAgICAgICAgJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5sb24nXHJcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgXCJcclxuICAgICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMF1cIlxyXG4gICAgICA+PC90ZXh0YXJlYT5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29vcmRpbmF0ZXNcIj5cclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICN0ZXh0QXJlYVxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICByb3dzPVwiMVwiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXHJcbiAgICAgICAgICAgICdpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuZXN0J1xyXG4gICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImNvb3JkaW5hdGVzWzBdXCJcclxuICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwidW5pdHM7IGVsc2UgZWxzZUJsb2NrMlwiIGNsYXNzPVwiY29vcmRpbmF0ZXMyXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3tcclxuICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmxhdCcgfCB0cmFuc2xhdGVcclxuICAgICAgfX08L21hdC1sYWJlbD5cclxuICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgI3RleHRBcmVhXHJcbiAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICByZWFkb25seVxyXG4gICAgICAgIHJvd3M9XCIxXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXHJcbiAgICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmxhdCdcclxuICAgICAgICAgICAgfCB0cmFuc2xhdGVcclxuICAgICAgICBcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJjb29yZGluYXRlc1sxXVwiXHJcbiAgICAgID48L3RleHRhcmVhPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrMj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29vcmRpbmF0ZXMyXCI+XHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAjdGV4dEFyZWFcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgcm93cz1cIjFcIlxyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxyXG4gICAgICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLm5vcmQnXHJcbiAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMV1cIlxyXG4gICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxyXG4gICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHknIHwgdHJhbnNsYXRlXHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXAgYWR2YW5jZWQtY29vcmRpbmF0ZXNfX2NvcHktY29vcmRpbmF0ZXNcIlxyXG4gICAgKGNsaWNrKT1cImNvcHlUZXh0VG9DbGlwYm9hcmQoKVwiXHJcbiAgPlxyXG4gICAgPG1hdC1pY29uIHN2Z0ljb249XCJjb250ZW50LWNvcHlcIj48L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuPGZvcm0gY2xhc3M9XCJpZ28tZm9ybSBhZHZhbmNlZC1jb29yZGluYXRlc19fZm9ybVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cclxuICAgIDxtYXQtbGFiZWw+e3tcclxuICAgICAgJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5jb29yZFN5c3RlbSdcclxuICAgICAgICB8IHRyYW5zbGF0ZVxyXG4gICAgfX08L21hdC1sYWJlbD5cclxuICAgIDxtYXQtc2VsZWN0IFsodmFsdWUpXT1cImlucHV0UHJvalwiPlxyXG4gICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBwcm9qZWN0aW9uIG9mIHByb2plY3Rpb25zJCB8IGFzeW5jXCJcclxuICAgICAgICBbdmFsdWVdPVwicHJvamVjdGlvblwiXHJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBwcm9qZWN0aW9uLnRyYW5zbGF0ZWRWYWx1ZSB8fCBwcm9qZWN0aW9uLmFsaWFzIH19XHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbWF0LXNlbGVjdD5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICBjbGFzcz1cImNlbnRlci10b2dnbGUgbWF0LXR5cG9ncmFwaHlcIlxyXG4gICAgW2NoZWNrZWRdPVwiY2VudGVyXCJcclxuICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcclxuICAgIChjaGFuZ2UpPVwiZGlzcGxheUNlbnRlcigkZXZlbnQuY2hlY2tlZClcIlxyXG4gID5cclxuICAgIHt7XHJcbiAgICAgICdpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuY2VudGVyJ1xyXG4gICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICB9fVxyXG4gIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuPC9mb3JtPlxyXG5cclxuPHAgY2xhc3M9XCJpZ28tem9vbSBtYXQtdHlwb2dyYXBoeVwiPlxyXG4gIHt7XHJcbiAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLnpvb20nIHwgdHJhbnNsYXRlXHJcbiAgfX1cclxuICB7eyBtYXAudmlld0NvbnRyb2xsZXIuZ2V0Wm9vbSgpIH19XHJcbjwvcD5cclxuPHAgY2xhc3M9XCJpZ28tem9vbSBtYXQtdHlwb2dyYXBoeVwiPlxyXG4gIHt7XHJcbiAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLnNjYWxlJyB8IHRyYW5zbGF0ZVxyXG4gIH19XHJcbiAge3sgZm9ybWF0dGVkU2NhbGUkIHwgYXN5bmMgfX1cclxuPC9wPlxyXG48cCBjbGFzcz1cImlnby16b29tIG1hdC10eXBvZ3JhcGh5XCI+XHJcbiAge3tcclxuICAgICdpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMucmVzb2x1dGlvbidcclxuICAgICAgfCB0cmFuc2xhdGVcclxuICB9fVxyXG4gIHt7IG1hcC52aWV3Q29udHJvbGxlci5nZXRSZXNvbHV0aW9uKCkgfCBudW1iZXI6ICcxLjAtMCcgfX1cclxuPC9wPlxyXG4iXX0=