@igo2/geo 1.14.2 → 1.14.3

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 (871) hide show
  1. package/esm2020/igo2-geo.mjs +4 -4
  2. package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +300 -300
  3. package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +305 -305
  4. package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -246
  5. package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +79 -79
  6. package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +208 -208
  7. package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +78 -78
  8. package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +216 -216
  9. package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +94 -94
  10. package/esm2020/lib/catalog/catalog.module.mjs +52 -52
  11. package/esm2020/lib/catalog/index.mjs +4 -4
  12. package/esm2020/lib/catalog/shared/catalog.abstract.mjs +94 -94
  13. package/esm2020/lib/catalog/shared/catalog.enum.mjs +15 -15
  14. package/esm2020/lib/catalog/shared/catalog.interface.mjs +1 -1
  15. package/esm2020/lib/catalog/shared/catalog.service.mjs +605 -605
  16. package/esm2020/lib/catalog/shared/index.mjs +4 -4
  17. package/esm2020/lib/datasource/datasource.module.mjs +21 -21
  18. package/esm2020/lib/datasource/index.mjs +2 -2
  19. package/esm2020/lib/datasource/shared/capabilities.service.mjs +430 -430
  20. package/esm2020/lib/datasource/shared/datasource.service.mjs +235 -235
  21. package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
  22. package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +1 -1
  23. package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +1 -1
  24. package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +144 -144
  25. package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
  26. package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +108 -108
  27. package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
  28. package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +14 -14
  29. package/esm2020/lib/datasource/shared/datasources/data.service.mjs +2 -2
  30. package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
  31. package/esm2020/lib/datasource/shared/datasources/datasource.mjs +28 -28
  32. package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
  33. package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +42 -42
  34. package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
  35. package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +56 -56
  36. package/esm2020/lib/datasource/shared/datasources/index.mjs +35 -35
  37. package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
  38. package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +27 -27
  39. package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
  40. package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +11 -11
  41. package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
  42. package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +48 -48
  43. package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
  44. package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +14 -14
  45. package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +1 -1
  46. package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +53 -53
  47. package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  48. package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +71 -71
  49. package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +151 -151
  50. package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  51. package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +205 -205
  52. package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +206 -206
  53. package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
  54. package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +15 -15
  55. package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
  56. package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +8 -8
  57. package/esm2020/lib/datasource/shared/index.mjs +4 -4
  58. package/esm2020/lib/datasource/shared/options/index.mjs +4 -4
  59. package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +1 -1
  60. package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +14 -14
  61. package/esm2020/lib/datasource/shared/options/options-api.service.mjs +80 -80
  62. package/esm2020/lib/datasource/shared/options/options.service.mjs +2 -2
  63. package/esm2020/lib/datasource/utils/esri-style-generator.mjs +356 -356
  64. package/esm2020/lib/datasource/utils/index.mjs +2 -2
  65. package/esm2020/lib/datasource/utils/tilegrid.mjs +19 -19
  66. package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +223 -223
  67. package/esm2020/lib/directions/directions-buttons/index.mjs +1 -1
  68. package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +289 -289
  69. package/esm2020/lib/directions/directions-inputs/index.mjs +1 -1
  70. package/esm2020/lib/directions/directions-results/directions-results.component.mjs +195 -195
  71. package/esm2020/lib/directions/directions-results/index.mjs +1 -1
  72. package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +1 -1
  73. package/esm2020/lib/directions/directions-sources/directions-source.mjs +2 -2
  74. package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +15 -15
  75. package/esm2020/lib/directions/directions-sources/index.mjs +4 -4
  76. package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +98 -98
  77. package/esm2020/lib/directions/directions.component.mjs +310 -310
  78. package/esm2020/lib/directions/directions.module.mjs +101 -101
  79. package/esm2020/lib/directions/index.mjs +6 -6
  80. package/esm2020/lib/directions/shared/directions-source.service.mjs +16 -16
  81. package/esm2020/lib/directions/shared/directions.enum.mjs +27 -27
  82. package/esm2020/lib/directions/shared/directions.interface.mjs +1 -1
  83. package/esm2020/lib/directions/shared/directions.service.mjs +28 -28
  84. package/esm2020/lib/directions/shared/directions.utils.mjs +508 -508
  85. package/esm2020/lib/directions/shared/index.mjs +5 -5
  86. package/esm2020/lib/directions/shared/store.mjs +23 -23
  87. package/esm2020/lib/download/download-button/download-button.component.mjs +60 -60
  88. package/esm2020/lib/download/download-button/index.mjs +1 -1
  89. package/esm2020/lib/download/download.module.mjs +41 -41
  90. package/esm2020/lib/download/index.mjs +2 -2
  91. package/esm2020/lib/download/shared/download.interface.mjs +1 -1
  92. package/esm2020/lib/download/shared/download.service.mjs +64 -64
  93. package/esm2020/lib/download/shared/index.mjs +2 -2
  94. package/esm2020/lib/draw/draw/draw-layer-popup.component.mjs +54 -54
  95. package/esm2020/lib/draw/draw/draw-popup.component.mjs +590 -590
  96. package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +47 -47
  97. package/esm2020/lib/draw/draw/draw.component.mjs +1298 -1298
  98. package/esm2020/lib/draw/draw/draw.module.mjs +112 -112
  99. package/esm2020/lib/draw/drawingTool.module.mjs +19 -19
  100. package/esm2020/lib/draw/index.mjs +2 -2
  101. package/esm2020/lib/draw/shared/draw-icon.service.mjs +26 -26
  102. package/esm2020/lib/draw/shared/draw-style.service.mjs +189 -189
  103. package/esm2020/lib/draw/shared/draw.enum.mjs +36 -36
  104. package/esm2020/lib/draw/shared/draw.interface.mjs +1 -1
  105. package/esm2020/lib/draw/shared/draw.utils.mjs +121 -121
  106. package/esm2020/lib/draw/shared/index.mjs +5 -5
  107. package/esm2020/lib/feature/feature-details/feature-details.component.mjs +404 -404
  108. package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +53 -53
  109. package/esm2020/lib/feature/feature-details/feature-details.module.mjs +47 -47
  110. package/esm2020/lib/feature/feature-form/feature-form.component.mjs +111 -111
  111. package/esm2020/lib/feature/feature-form/feature-form.module.mjs +33 -33
  112. package/esm2020/lib/feature/feature.module.mjs +27 -27
  113. package/esm2020/lib/feature/index.mjs +3 -3
  114. package/esm2020/lib/feature/shared/feature.enums.mjs +8 -8
  115. package/esm2020/lib/feature/shared/feature.interfaces.mjs +1 -1
  116. package/esm2020/lib/feature/shared/feature.utils.mjs +346 -346
  117. package/esm2020/lib/feature/shared/index.mjs +6 -6
  118. package/esm2020/lib/feature/shared/store.mjs +123 -123
  119. package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +112 -112
  120. package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +93 -93
  121. package/esm2020/lib/feature/shared/strategies/index.mjs +5 -5
  122. package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +103 -103
  123. package/esm2020/lib/feature/shared/strategies/loading.mjs +132 -132
  124. package/esm2020/lib/feature/shared/strategies/selection.mjs +369 -369
  125. package/esm2020/lib/feature/shared/strategies.utils.mjs +36 -36
  126. package/esm2020/lib/filter/filter.module.mjs +288 -288
  127. package/esm2020/lib/filter/index.mjs +15 -15
  128. package/esm2020/lib/filter/ogc-filter-button/index.mjs +1 -1
  129. package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +139 -139
  130. package/esm2020/lib/filter/ogc-filter-form/index.mjs +1 -1
  131. package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +644 -644
  132. package/esm2020/lib/filter/ogc-filter-selection/index.mjs +1 -1
  133. package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +1301 -1301
  134. package/esm2020/lib/filter/ogc-filter-time/index.mjs +2 -2
  135. package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +176 -176
  136. package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +897 -897
  137. package/esm2020/lib/filter/ogc-filterable-form/index.mjs +1 -1
  138. package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +58 -58
  139. package/esm2020/lib/filter/ogc-filterable-item/index.mjs +1 -1
  140. package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +306 -306
  141. package/esm2020/lib/filter/ogc-filterable-list/index.mjs +2 -2
  142. package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +30 -30
  143. package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +43 -43
  144. package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +54 -54
  145. package/esm2020/lib/filter/shared/index.mjs +11 -11
  146. package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +71 -71
  147. package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +29 -29
  148. package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +1 -1
  149. package/esm2020/lib/filter/shared/ogc-filter.mjs +691 -691
  150. package/esm2020/lib/filter/shared/ogc-filter.service.mjs +45 -45
  151. package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +22 -22
  152. package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +1 -1
  153. package/esm2020/lib/filter/shared/spatial-filter.service.mjs +268 -268
  154. package/esm2020/lib/filter/shared/time-filter.enum.mjs +12 -12
  155. package/esm2020/lib/filter/shared/time-filter.interface.mjs +1 -1
  156. package/esm2020/lib/filter/shared/time-filter.service.mjs +106 -106
  157. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +1 -1
  158. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1088 -1088
  159. package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +1 -1
  160. package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +207 -207
  161. package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +1 -1
  162. package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +143 -143
  163. package/esm2020/lib/filter/time-filter-button/index.mjs +1 -1
  164. package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +77 -77
  165. package/esm2020/lib/filter/time-filter-form/index.mjs +1 -1
  166. package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +733 -733
  167. package/esm2020/lib/filter/time-filter-item/index.mjs +1 -1
  168. package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +118 -118
  169. package/esm2020/lib/filter/time-filter-list/index.mjs +2 -2
  170. package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +30 -30
  171. package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +38 -38
  172. package/esm2020/lib/geo.module.mjs +101 -101
  173. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +520 -520
  174. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +188 -188
  175. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +63 -63
  176. package/esm2020/lib/geometry/geometry.module.mjs +26 -26
  177. package/esm2020/lib/geometry/index.mjs +3 -3
  178. package/esm2020/lib/geometry/shared/controls/draw.mjs +313 -313
  179. package/esm2020/lib/geometry/shared/controls/index.mjs +3 -3
  180. package/esm2020/lib/geometry/shared/controls/modify.mjs +520 -520
  181. package/esm2020/lib/geometry/shared/controls/slice.mjs +176 -176
  182. package/esm2020/lib/geometry/shared/geometry.errors.mjs +25 -25
  183. package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +1 -1
  184. package/esm2020/lib/geometry/shared/geometry.utils.mjs +121 -121
  185. package/esm2020/lib/geometry/shared/index.mjs +4 -4
  186. package/esm2020/lib/import-export/export-button/export-button.component.mjs +63 -63
  187. package/esm2020/lib/import-export/export-button/index.mjs +1 -1
  188. package/esm2020/lib/import-export/import-export/import-export.component.mjs +1219 -1219
  189. package/esm2020/lib/import-export/import-export/index.mjs +1 -1
  190. package/esm2020/lib/import-export/import-export.module.mjs +95 -95
  191. package/esm2020/lib/import-export/index.mjs +4 -4
  192. package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +134 -134
  193. package/esm2020/lib/import-export/shared/export.errors.mjs +14 -14
  194. package/esm2020/lib/import-export/shared/export.interface.mjs +1 -1
  195. package/esm2020/lib/import-export/shared/export.service.mjs +194 -194
  196. package/esm2020/lib/import-export/shared/export.type.mjs +3 -3
  197. package/esm2020/lib/import-export/shared/export.utils.mjs +54 -54
  198. package/esm2020/lib/import-export/shared/import.errors.mjs +38 -38
  199. package/esm2020/lib/import-export/shared/import.interface.mjs +1 -1
  200. package/esm2020/lib/import-export/shared/import.service.mjs +214 -214
  201. package/esm2020/lib/import-export/shared/import.utils.mjs +234 -234
  202. package/esm2020/lib/import-export/shared/index.mjs +10 -10
  203. package/esm2020/lib/import-export/style-list/index.mjs +4 -4
  204. package/esm2020/lib/import-export/style-list/style-list.interface.mjs +1 -1
  205. package/esm2020/lib/import-export/style-list/style-list.module.mjs +22 -22
  206. package/esm2020/lib/import-export/style-list/style-list.provider.mjs +20 -20
  207. package/esm2020/lib/import-export/style-list/style-list.service.mjs +50 -50
  208. package/esm2020/lib/layer/index.mjs +10 -10
  209. package/esm2020/lib/layer/layer-item/index.mjs +1 -1
  210. package/esm2020/lib/layer/layer-item/layer-item.component.mjs +299 -299
  211. package/esm2020/lib/layer/layer-legend/index.mjs +1 -1
  212. package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +387 -387
  213. package/esm2020/lib/layer/layer-legend-item/index.mjs +1 -1
  214. package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +83 -83
  215. package/esm2020/lib/layer/layer-legend-list/index.mjs +2 -2
  216. package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +47 -47
  217. package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +194 -194
  218. package/esm2020/lib/layer/layer-list/index.mjs +3 -3
  219. package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +58 -58
  220. package/esm2020/lib/layer/layer-list/layer-list.component.mjs +1008 -1008
  221. package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +18 -18
  222. package/esm2020/lib/layer/layer-list-tool/index.mjs +4 -4
  223. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +164 -164
  224. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +6 -6
  225. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +1 -1
  226. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +21 -21
  227. package/esm2020/lib/layer/layer.module.mjs +184 -184
  228. package/esm2020/lib/layer/shared/clusterParam.mjs +1 -1
  229. package/esm2020/lib/layer/shared/index.mjs +6 -6
  230. package/esm2020/lib/layer/shared/layer.enums.mjs +1 -1
  231. package/esm2020/lib/layer/shared/layer.service.mjs +185 -185
  232. package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  233. package/esm2020/lib/layer/shared/layers/any-layer.mjs +1 -1
  234. package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  235. package/esm2020/lib/layer/shared/layers/image-layer.mjs +67 -67
  236. package/esm2020/lib/layer/shared/layers/index.mjs +12 -12
  237. package/esm2020/lib/layer/shared/layers/layer.interface.mjs +17 -17
  238. package/esm2020/lib/layer/shared/layers/layer.mjs +163 -163
  239. package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +1 -1
  240. package/esm2020/lib/layer/shared/layers/tile-layer.mjs +46 -46
  241. package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +1 -1
  242. package/esm2020/lib/layer/shared/layers/vector-layer.mjs +377 -377
  243. package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +1 -1
  244. package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +103 -103
  245. package/esm2020/lib/layer/shared/style.service.mjs +355 -355
  246. package/esm2020/lib/layer/shared/vector-style.interface.mjs +1 -1
  247. package/esm2020/lib/layer/style-modal/index.mjs +1 -1
  248. package/esm2020/lib/layer/style-modal/style-modal.component.mjs +287 -287
  249. package/esm2020/lib/layer/track-feature-button/index.mjs +1 -1
  250. package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +58 -58
  251. package/esm2020/lib/layer/utils/image-watcher.mjs +61 -61
  252. package/esm2020/lib/layer/utils/index.mjs +5 -5
  253. package/esm2020/lib/layer/utils/layer.utils.mjs +9 -9
  254. package/esm2020/lib/layer/utils/outputLegend.mjs +26 -26
  255. package/esm2020/lib/layer/utils/tile-watcher.mjs +49 -49
  256. package/esm2020/lib/layer/utils/vector-watcher.mjs +47 -47
  257. package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +19 -19
  258. package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +96 -96
  259. package/esm2020/lib/map/baselayers-switcher/index.mjs +2 -2
  260. package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +141 -142
  261. package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +78 -78
  262. package/esm2020/lib/map/geolocate-button/index.mjs +1 -1
  263. package/esm2020/lib/map/home-extent-button/home-extent-button.component.mjs +62 -62
  264. package/esm2020/lib/map/home-extent-button/index.mjs +1 -1
  265. package/esm2020/lib/map/index.mjs +13 -13
  266. package/esm2020/lib/map/info-section/index.mjs +1 -1
  267. package/esm2020/lib/map/info-section/info-section.component.mjs +29 -29
  268. package/esm2020/lib/map/map-browser/index.mjs +1 -1
  269. package/esm2020/lib/map/map-browser/map-browser.component.mjs +65 -65
  270. package/esm2020/lib/map/map-center/index.mjs +1 -1
  271. package/esm2020/lib/map/map-center/map-center.component.mjs +49 -49
  272. package/esm2020/lib/map/map.module.mjs +126 -126
  273. package/esm2020/lib/map/menu-button/index.mjs +1 -1
  274. package/esm2020/lib/map/menu-button/menu-button.component.mjs +61 -61
  275. package/esm2020/lib/map/offline-button/index.mjs +1 -1
  276. package/esm2020/lib/map/offline-button/offline-button.component.mjs +75 -75
  277. package/esm2020/lib/map/rotation-button/index.mjs +1 -1
  278. package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +69 -69
  279. package/esm2020/lib/map/shared/controllers/controller.mjs +41 -41
  280. package/esm2020/lib/map/shared/controllers/geolocation.mjs +307 -307
  281. package/esm2020/lib/map/shared/controllers/index.mjs +3 -3
  282. package/esm2020/lib/map/shared/controllers/view.mjs +350 -350
  283. package/esm2020/lib/map/shared/hover-feature.directive.mjs +502 -502
  284. package/esm2020/lib/map/shared/index.mjs +13 -13
  285. package/esm2020/lib/map/shared/linkedLayers.utils.mjs +237 -237
  286. package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +106 -106
  287. package/esm2020/lib/map/shared/map.enums.mjs +5 -5
  288. package/esm2020/lib/map/shared/map.interface.mjs +1 -1
  289. package/esm2020/lib/map/shared/map.mjs +406 -406
  290. package/esm2020/lib/map/shared/map.service.mjs +28 -28
  291. package/esm2020/lib/map/shared/map.utils.mjs +462 -462
  292. package/esm2020/lib/map/shared/mapOffline.directive.mjs +162 -162
  293. package/esm2020/lib/map/shared/projection.interfaces.mjs +1 -1
  294. package/esm2020/lib/map/shared/projection.service.mjs +64 -64
  295. package/esm2020/lib/map/shared/projection.utils.mjs +63 -63
  296. package/esm2020/lib/map/swipe-control/index.mjs +1 -1
  297. package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +192 -192
  298. package/esm2020/lib/map/utils/layer-watcher.mjs +78 -78
  299. package/esm2020/lib/map/wake-lock-button/index.mjs +1 -1
  300. package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +113 -113
  301. package/esm2020/lib/map/zoom-button/index.mjs +1 -1
  302. package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +39 -39
  303. package/esm2020/lib/measure/index.mjs +3 -3
  304. package/esm2020/lib/measure/measure.module.mjs +19 -19
  305. package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +36 -36
  306. package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +179 -179
  307. package/esm2020/lib/measure/measurer/measurer-item.component.mjs +139 -139
  308. package/esm2020/lib/measure/measurer/measurer.component.mjs +1041 -1041
  309. package/esm2020/lib/measure/measurer/measurer.module.mjs +93 -93
  310. package/esm2020/lib/measure/shared/index.mjs +3 -3
  311. package/esm2020/lib/measure/shared/measure.enum.mjs +36 -36
  312. package/esm2020/lib/measure/shared/measure.interfaces.mjs +1 -1
  313. package/esm2020/lib/measure/shared/measure.utils.mjs +488 -488
  314. package/esm2020/lib/metadata/index.mjs +2 -2
  315. package/esm2020/lib/metadata/metadata-button/index.mjs +1 -1
  316. package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +133 -133
  317. package/esm2020/lib/metadata/metadata.module.mjs +54 -54
  318. package/esm2020/lib/metadata/shared/index.mjs +2 -2
  319. package/esm2020/lib/metadata/shared/metadata.interface.mjs +1 -1
  320. package/esm2020/lib/metadata/shared/metadata.service.mjs +18 -18
  321. package/esm2020/lib/offline/geoDB/configFileToGeoDB.service.mjs +104 -104
  322. package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +5 -5
  323. package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +1 -1
  324. package/esm2020/lib/offline/geoDB/geoDB.service.mjs +166 -166
  325. package/esm2020/lib/offline/geoDB/index.mjs +4 -4
  326. package/esm2020/lib/offline/index.mjs +2 -2
  327. package/esm2020/lib/offline/shared/geo-network.service.mjs +65 -65
  328. package/esm2020/lib/offline/shared/index.mjs +1 -1
  329. package/esm2020/lib/overlay/index.mjs +1 -1
  330. package/esm2020/lib/overlay/overlay.module.mjs +22 -22
  331. package/esm2020/lib/overlay/shared/index.mjs +6 -6
  332. package/esm2020/lib/overlay/shared/overlay-marker-style.utils.mjs +68 -68
  333. package/esm2020/lib/overlay/shared/overlay.directive.mjs +32 -32
  334. package/esm2020/lib/overlay/shared/overlay.enum.mjs +7 -7
  335. package/esm2020/lib/overlay/shared/overlay.mjs +129 -129
  336. package/esm2020/lib/overlay/shared/overlay.service.mjs +26 -26
  337. package/esm2020/lib/overlay/shared/overlay.utils.mjs +102 -102
  338. package/esm2020/lib/print/index.mjs +3 -3
  339. package/esm2020/lib/print/print/print.component.mjs +125 -125
  340. package/esm2020/lib/print/print-form/index.mjs +1 -1
  341. package/esm2020/lib/print/print-form/print-form.component.mjs +427 -427
  342. package/esm2020/lib/print/print.module.mjs +64 -64
  343. package/esm2020/lib/print/shared/geopdf.mjs +57 -57
  344. package/esm2020/lib/print/shared/index.mjs +4 -4
  345. package/esm2020/lib/print/shared/print.interface.mjs +1 -1
  346. package/esm2020/lib/print/shared/print.service.mjs +933 -933
  347. package/esm2020/lib/print/shared/print.type.mjs +29 -29
  348. package/esm2020/lib/query/index.mjs +1 -1
  349. package/esm2020/lib/query/query.module.mjs +28 -28
  350. package/esm2020/lib/query/shared/index.mjs +6 -6
  351. package/esm2020/lib/query/shared/query-search-source.mjs +34 -34
  352. package/esm2020/lib/query/shared/query-search-source.providers.mjs +21 -21
  353. package/esm2020/lib/query/shared/query.directive.mjs +260 -260
  354. package/esm2020/lib/query/shared/query.enums.mjs +29 -29
  355. package/esm2020/lib/query/shared/query.interfaces.mjs +1 -1
  356. package/esm2020/lib/query/shared/query.service.mjs +732 -732
  357. package/esm2020/lib/query/shared/query.utils.mjs +36 -36
  358. package/esm2020/lib/search/index.mjs +11 -11
  359. package/esm2020/lib/search/search-bar/search-bar.component.mjs +511 -511
  360. package/esm2020/lib/search/search-bar/search-bar.module.mjs +74 -74
  361. package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +34 -34
  362. package/esm2020/lib/search/search-results/save-feature-dialog.component.mjs +117 -117
  363. package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +370 -370
  364. package/esm2020/lib/search/search-results/search-results-item.component.mjs +123 -123
  365. package/esm2020/lib/search/search-results/search-results.component.mjs +339 -339
  366. package/esm2020/lib/search/search-results/search-results.module.mjs +103 -103
  367. package/esm2020/lib/search/search-selector/search-selector.component.mjs +122 -122
  368. package/esm2020/lib/search/search-selector/search-selector.module.mjs +55 -55
  369. package/esm2020/lib/search/search-settings/search-settings.component.mjs +441 -441
  370. package/esm2020/lib/search/search-settings/search-settings.module.mjs +59 -59
  371. package/esm2020/lib/search/search.module.mjs +66 -66
  372. package/esm2020/lib/search/shared/index.mjs +8 -8
  373. package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +321 -321
  374. package/esm2020/lib/search/shared/search-source-service.providers.mjs +19 -19
  375. package/esm2020/lib/search/shared/search-source.service.mjs +46 -46
  376. package/esm2020/lib/search/shared/search.enums.mjs +3 -3
  377. package/esm2020/lib/search/shared/search.interfaces.mjs +1 -1
  378. package/esm2020/lib/search/shared/search.service.mjs +120 -120
  379. package/esm2020/lib/search/shared/search.utils.mjs +90 -90
  380. package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +1 -1
  381. package/esm2020/lib/search/shared/sources/coordinates.mjs +152 -152
  382. package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +39 -39
  383. package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +1 -1
  384. package/esm2020/lib/search/shared/sources/icherche.mjs +766 -766
  385. package/esm2020/lib/search/shared/sources/icherche.providers.mjs +65 -65
  386. package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
  387. package/esm2020/lib/search/shared/sources/ilayer.mjs +319 -319
  388. package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +39 -39
  389. package/esm2020/lib/search/shared/sources/index.mjs +17 -17
  390. package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +1 -1
  391. package/esm2020/lib/search/shared/sources/nominatim.mjs +251 -251
  392. package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +22 -22
  393. package/esm2020/lib/search/shared/sources/source.interfaces.mjs +1 -1
  394. package/esm2020/lib/search/shared/sources/source.mjs +178 -178
  395. package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +1 -1
  396. package/esm2020/lib/search/shared/sources/storedqueries.mjs +424 -424
  397. package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +40 -40
  398. package/esm2020/lib/toast/index.mjs +1 -1
  399. package/esm2020/lib/toast/toast.component.mjs +112 -112
  400. package/esm2020/lib/toast/toast.module.mjs +44 -44
  401. package/esm2020/lib/utils/commonVectorStyle.interface.mjs +1 -1
  402. package/esm2020/lib/utils/commonVectorStyle.mjs +74 -74
  403. package/esm2020/lib/utils/googleLinks.mjs +12 -12
  404. package/esm2020/lib/utils/id-generator.mjs +109 -109
  405. package/esm2020/lib/utils/index.mjs +5 -5
  406. package/esm2020/lib/utils/osmLinks.mjs +9 -9
  407. package/esm2020/lib/wkt/index.mjs +1 -1
  408. package/esm2020/lib/wkt/shared/index.mjs +1 -1
  409. package/esm2020/lib/wkt/shared/wkt.service.mjs +224 -224
  410. package/esm2020/lib/wkt/wkt.module.mjs +21 -21
  411. package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +47 -47
  412. package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +35 -35
  413. package/esm2020/lib/workspace/confirmation-popup/index.mjs +2 -2
  414. package/esm2020/lib/workspace/index.mjs +7 -7
  415. package/esm2020/lib/workspace/shared/edition-workspace.mjs +279 -279
  416. package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +656 -656
  417. package/esm2020/lib/workspace/shared/feature-workspace.mjs +34 -34
  418. package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +149 -149
  419. package/esm2020/lib/workspace/shared/index.mjs +7 -7
  420. package/esm2020/lib/workspace/shared/wfs-workspace.mjs +34 -34
  421. package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +149 -149
  422. package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +259 -259
  423. package/esm2020/lib/workspace/shared/workspace.utils.mjs +23 -23
  424. package/esm2020/lib/workspace/widgets/index.mjs +3 -3
  425. package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +46 -46
  426. package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +35 -35
  427. package/esm2020/lib/workspace/widgets/widgets.mjs +14 -14
  428. package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +132 -132
  429. package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +27 -27
  430. package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +112 -112
  431. package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +27 -27
  432. package/esm2020/lib/workspace/workspace.module.mjs +61 -61
  433. package/esm2020/public_api.mjs +54 -54
  434. package/fesm2015/igo2-geo.mjs +44986 -44986
  435. package/fesm2015/igo2-geo.mjs.map +1 -1
  436. package/fesm2020/igo2-geo.mjs +43029 -43030
  437. package/fesm2020/igo2-geo.mjs.map +1 -1
  438. package/index.d.ts +5 -5
  439. package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +126 -126
  440. package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +80 -80
  441. package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +105 -105
  442. package/lib/catalog/catalog-browser/catalog-browser.module.d.ts +22 -22
  443. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +45 -45
  444. package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +25 -25
  445. package/lib/catalog/catalog-library/catalog-library.component.d.ts +65 -65
  446. package/lib/catalog/catalog-library/catalog-library.module.d.ts +26 -26
  447. package/lib/catalog/catalog.module.d.ts +14 -14
  448. package/lib/catalog/index.d.ts +4 -4
  449. package/lib/catalog/shared/catalog.abstract.d.ts +50 -50
  450. package/lib/catalog/shared/catalog.enum.d.ts +14 -14
  451. package/lib/catalog/shared/catalog.interface.d.ts +66 -66
  452. package/lib/catalog/shared/catalog.service.d.ts +36 -36
  453. package/lib/catalog/shared/index.d.ts +4 -4
  454. package/lib/datasource/datasource.module.d.ts +8 -8
  455. package/lib/datasource/index.d.ts +2 -2
  456. package/lib/datasource/shared/capabilities.service.d.ts +37 -37
  457. package/lib/datasource/shared/datasource.service.d.ts +37 -37
  458. package/lib/datasource/shared/datasources/any-datasource.d.ts +16 -16
  459. package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +15 -15
  460. package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +14 -14
  461. package/lib/datasource/shared/datasources/arcgisrest-datasource.interface.d.ts +14 -14
  462. package/lib/datasource/shared/datasources/carto-datasource.d.ts +15 -15
  463. package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +13 -13
  464. package/lib/datasource/shared/datasources/cluster-datasource.d.ts +10 -10
  465. package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +11 -11
  466. package/lib/datasource/shared/datasources/data.service.d.ts +3 -3
  467. package/lib/datasource/shared/datasources/datasource.d.ts +20 -20
  468. package/lib/datasource/shared/datasources/datasource.interface.d.ts +100 -100
  469. package/lib/datasource/shared/datasources/feature-datasource.d.ts +12 -12
  470. package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +18 -18
  471. package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +15 -15
  472. package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +15 -15
  473. package/lib/datasource/shared/datasources/index.d.ts +35 -35
  474. package/lib/datasource/shared/datasources/mvt-datasource.d.ts +10 -10
  475. package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +13 -13
  476. package/lib/datasource/shared/datasources/osm-datasource.d.ts +9 -9
  477. package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +7 -7
  478. package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +15 -15
  479. package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +14 -14
  480. package/lib/datasource/shared/datasources/tiledebug-datasource.d.ts +9 -9
  481. package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +9 -9
  482. package/lib/datasource/shared/datasources/websocket-datasource.d.ts +15 -15
  483. package/lib/datasource/shared/datasources/websocket-datasource.interface.d.ts +7 -7
  484. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +20 -20
  485. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +20 -20
  486. package/lib/datasource/shared/datasources/wfs.service.d.ts +17 -17
  487. package/lib/datasource/shared/datasources/wms-datasource.d.ts +31 -31
  488. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +32 -32
  489. package/lib/datasource/shared/datasources/wms-wfs.utils.d.ts +41 -41
  490. package/lib/datasource/shared/datasources/wmts-datasource.d.ts +10 -10
  491. package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +13 -13
  492. package/lib/datasource/shared/datasources/xyz-datasource.d.ts +9 -9
  493. package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +11 -11
  494. package/lib/datasource/shared/index.d.ts +4 -4
  495. package/lib/datasource/shared/options/index.d.ts +4 -4
  496. package/lib/datasource/shared/options/options-api.interface.d.ts +4 -4
  497. package/lib/datasource/shared/options/options-api.providers.d.ts +10 -10
  498. package/lib/datasource/shared/options/options-api.service.d.ts +16 -16
  499. package/lib/datasource/shared/options/options.service.d.ts +6 -6
  500. package/lib/datasource/utils/esri-style-generator.d.ts +21 -21
  501. package/lib/datasource/utils/index.d.ts +2 -2
  502. package/lib/datasource/utils/tilegrid.d.ts +2 -2
  503. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +30 -30
  504. package/lib/directions/directions-buttons/index.d.ts +1 -1
  505. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +45 -45
  506. package/lib/directions/directions-inputs/index.d.ts +1 -1
  507. package/lib/directions/directions-results/directions-results.component.d.ts +30 -30
  508. package/lib/directions/directions-results/index.d.ts +1 -1
  509. package/lib/directions/directions-sources/directions-source.d.ts +7 -7
  510. package/lib/directions/directions-sources/directions-source.interface.d.ts +11 -11
  511. package/lib/directions/directions-sources/directions-source.provider.d.ts +11 -11
  512. package/lib/directions/directions-sources/index.d.ts +4 -4
  513. package/lib/directions/directions-sources/osrm-directions-source.d.ts +23 -23
  514. package/lib/directions/directions.component.d.ts +56 -56
  515. package/lib/directions/directions.module.d.ts +26 -26
  516. package/lib/directions/index.d.ts +6 -6
  517. package/lib/directions/shared/directions-source.service.d.ts +11 -11
  518. package/lib/directions/shared/directions.enum.d.ts +22 -22
  519. package/lib/directions/shared/directions.interface.d.ts +126 -126
  520. package/lib/directions/shared/directions.service.d.ts +13 -13
  521. package/lib/directions/shared/directions.utils.d.ts +42 -42
  522. package/lib/directions/shared/index.d.ts +5 -5
  523. package/lib/directions/shared/store.d.ts +18 -18
  524. package/lib/download/download-button/download-button.component.d.ts +18 -18
  525. package/lib/download/download-button/index.d.ts +1 -1
  526. package/lib/download/download.module.d.ts +14 -14
  527. package/lib/download/index.d.ts +2 -2
  528. package/lib/download/shared/download.interface.d.ts +10 -10
  529. package/lib/download/shared/download.service.d.ts +11 -11
  530. package/lib/download/shared/index.d.ts +2 -2
  531. package/lib/draw/draw/draw-layer-popup.component.d.ts +14 -14
  532. package/lib/draw/draw/draw-popup.component.d.ts +63 -63
  533. package/lib/draw/draw/draw-shorcuts.component.d.ts +5 -5
  534. package/lib/draw/draw/draw.component.d.ts +239 -239
  535. package/lib/draw/draw/draw.module.d.ts +34 -34
  536. package/lib/draw/drawingTool.module.d.ts +7 -7
  537. package/lib/draw/index.d.ts +2 -2
  538. package/lib/draw/shared/draw-icon.service.d.ts +12 -12
  539. package/lib/draw/shared/draw-style.service.d.ts +36 -36
  540. package/lib/draw/shared/draw.enum.d.ts +32 -32
  541. package/lib/draw/shared/draw.interface.d.ts +40 -40
  542. package/lib/draw/shared/draw.utils.d.ts +35 -35
  543. package/lib/draw/shared/index.d.ts +5 -5
  544. package/lib/feature/feature-details/feature-details.component.d.ts +60 -60
  545. package/lib/feature/feature-details/feature-details.directive.d.ts +19 -19
  546. package/lib/feature/feature-details/feature-details.module.d.ts +15 -15
  547. package/lib/feature/feature-form/feature-form.component.d.ts +50 -50
  548. package/lib/feature/feature-form/feature-form.module.d.ts +12 -12
  549. package/lib/feature/feature.module.d.ts +9 -9
  550. package/lib/feature/index.d.ts +3 -3
  551. package/lib/feature/shared/feature.enums.d.ts +7 -7
  552. package/lib/feature/shared/feature.interfaces.d.ts +74 -74
  553. package/lib/feature/shared/feature.utils.d.ts +104 -104
  554. package/lib/feature/shared/index.d.ts +6 -6
  555. package/lib/feature/shared/store.d.ts +71 -71
  556. package/lib/feature/shared/strategies/in-map-extent.d.ts +52 -52
  557. package/lib/feature/shared/strategies/in-map-resolution.d.ts +52 -52
  558. package/lib/feature/shared/strategies/index.d.ts +5 -5
  559. package/lib/feature/shared/strategies/loading-layer.d.ts +59 -59
  560. package/lib/feature/shared/strategies/loading.d.ts +75 -75
  561. package/lib/feature/shared/strategies/selection.d.ts +176 -176
  562. package/lib/feature/shared/strategies.utils.d.ts +17 -17
  563. package/lib/filter/filter.module.d.ts +53 -53
  564. package/lib/filter/index.d.ts +15 -15
  565. package/lib/filter/ogc-filter-button/index.d.ts +1 -1
  566. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +20 -20
  567. package/lib/filter/ogc-filter-form/index.d.ts +1 -1
  568. package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +65 -65
  569. package/lib/filter/ogc-filter-selection/index.d.ts +1 -1
  570. package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +93 -93
  571. package/lib/filter/ogc-filter-time/index.d.ts +2 -2
  572. package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +39 -39
  573. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +86 -86
  574. package/lib/filter/ogc-filterable-form/index.d.ts +1 -1
  575. package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +15 -15
  576. package/lib/filter/ogc-filterable-item/index.d.ts +1 -1
  577. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +41 -41
  578. package/lib/filter/ogc-filterable-list/index.d.ts +2 -2
  579. package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +14 -14
  580. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +10 -10
  581. package/lib/filter/shared/filterable-datasource.pipe.d.ts +10 -10
  582. package/lib/filter/shared/index.d.ts +11 -11
  583. package/lib/filter/shared/ogc-filter-time.service.d.ts +19 -19
  584. package/lib/filter/shared/ogc-filter.d.ts +29 -29
  585. package/lib/filter/shared/ogc-filter.enum.d.ts +27 -27
  586. package/lib/filter/shared/ogc-filter.interface.d.ts +200 -200
  587. package/lib/filter/shared/ogc-filter.service.d.ts +11 -11
  588. package/lib/filter/shared/spatial-filter.enum.d.ts +19 -19
  589. package/lib/filter/shared/spatial-filter.interface.d.ts +10 -10
  590. package/lib/filter/shared/spatial-filter.service.d.ts +37 -37
  591. package/lib/filter/shared/time-filter.enum.d.ts +10 -10
  592. package/lib/filter/shared/time-filter.interface.d.ts +29 -29
  593. package/lib/filter/shared/time-filter.service.d.ts +11 -11
  594. package/lib/filter/spatial-filter/spatial-filter-item/index.d.ts +1 -1
  595. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +166 -166
  596. package/lib/filter/spatial-filter/spatial-filter-list/index.d.ts +1 -1
  597. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +58 -58
  598. package/lib/filter/spatial-filter/spatial-filter-type/index.d.ts +1 -1
  599. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +45 -45
  600. package/lib/filter/time-filter-button/index.d.ts +1 -1
  601. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +20 -20
  602. package/lib/filter/time-filter-form/index.d.ts +1 -1
  603. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +77 -77
  604. package/lib/filter/time-filter-item/index.d.ts +1 -1
  605. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +28 -28
  606. package/lib/filter/time-filter-list/index.d.ts +2 -2
  607. package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +14 -14
  608. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +12 -12
  609. package/lib/geo.module.d.ts +28 -28
  610. package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +206 -206
  611. package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +88 -88
  612. package/lib/geometry/geometry-form-field/geometry-form-field.module.d.ts +19 -19
  613. package/lib/geometry/geometry.module.d.ts +8 -8
  614. package/lib/geometry/index.d.ts +3 -3
  615. package/lib/geometry/shared/controls/draw.d.ts +150 -150
  616. package/lib/geometry/shared/controls/index.d.ts +3 -3
  617. package/lib/geometry/shared/controls/modify.d.ts +228 -228
  618. package/lib/geometry/shared/controls/slice.d.ts +99 -99
  619. package/lib/geometry/shared/geometry.errors.d.ts +11 -11
  620. package/lib/geometry/shared/geometry.interfaces.d.ts +13 -13
  621. package/lib/geometry/shared/geometry.utils.d.ts +45 -45
  622. package/lib/geometry/shared/index.d.ts +4 -4
  623. package/lib/import-export/export-button/export-button.component.d.ts +16 -16
  624. package/lib/import-export/export-button/index.d.ts +1 -1
  625. package/lib/import-export/import-export/import-export.component.d.ts +104 -104
  626. package/lib/import-export/import-export/index.d.ts +1 -1
  627. package/lib/import-export/import-export.module.d.ts +26 -26
  628. package/lib/import-export/index.d.ts +4 -4
  629. package/lib/import-export/shared/drop-geo-file.directive.d.ts +36 -36
  630. package/lib/import-export/shared/export.errors.d.ts +8 -8
  631. package/lib/import-export/shared/export.interface.d.ts +11 -11
  632. package/lib/import-export/shared/export.service.d.ts +30 -30
  633. package/lib/import-export/shared/export.type.d.ts +16 -16
  634. package/lib/import-export/shared/export.utils.d.ts +19 -19
  635. package/lib/import-export/shared/import.errors.d.ts +20 -20
  636. package/lib/import-export/shared/import.interface.d.ts +8 -8
  637. package/lib/import-export/shared/import.service.d.ts +31 -31
  638. package/lib/import-export/shared/import.utils.d.ts +18 -18
  639. package/lib/import-export/shared/index.d.ts +10 -10
  640. package/lib/import-export/style-list/index.d.ts +4 -4
  641. package/lib/import-export/style-list/style-list.interface.d.ts +6 -6
  642. package/lib/import-export/style-list/style-list.module.d.ts +8 -8
  643. package/lib/import-export/style-list/style-list.provider.d.ts +15 -15
  644. package/lib/import-export/style-list/style-list.service.d.ts +18 -18
  645. package/lib/layer/index.d.ts +10 -10
  646. package/lib/layer/layer-item/index.d.ts +1 -1
  647. package/lib/layer/layer-item/layer-item.component.d.ts +62 -62
  648. package/lib/layer/layer-legend/index.d.ts +1 -1
  649. package/lib/layer/layer-legend/layer-legend.component.d.ts +90 -90
  650. package/lib/layer/layer-legend-item/index.d.ts +1 -1
  651. package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +22 -22
  652. package/lib/layer/layer-legend-list/index.d.ts +2 -2
  653. package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +16 -16
  654. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +31 -31
  655. package/lib/layer/layer-list/index.d.ts +3 -3
  656. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +19 -19
  657. package/lib/layer/layer-list/layer-list.component.d.ts +127 -127
  658. package/lib/layer/layer-list/layer-list.enum.d.ts +15 -15
  659. package/lib/layer/layer-list-tool/index.d.ts +4 -4
  660. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +32 -32
  661. package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +5 -5
  662. package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +8 -8
  663. package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +14 -14
  664. package/lib/layer/layer.module.d.ts +36 -36
  665. package/lib/layer/shared/clusterParam.d.ts +13 -13
  666. package/lib/layer/shared/index.d.ts +6 -6
  667. package/lib/layer/shared/layer.enums.d.ts +1 -1
  668. package/lib/layer/shared/layer.service.d.ts +30 -30
  669. package/lib/layer/shared/layers/any-layer.d.ts +6 -6
  670. package/lib/layer/shared/layers/any-layer.interface.d.ts +6 -6
  671. package/lib/layer/shared/layers/image-layer.d.ts +22 -22
  672. package/lib/layer/shared/layers/image-layer.interface.d.ts +19 -19
  673. package/lib/layer/shared/layers/index.d.ts +12 -12
  674. package/lib/layer/shared/layers/layer.d.ts +62 -62
  675. package/lib/layer/shared/layers/layer.interface.d.ts +109 -107
  676. package/lib/layer/shared/layers/tile-layer.d.ts +31 -31
  677. package/lib/layer/shared/layers/tile-layer.interface.d.ts +20 -20
  678. package/lib/layer/shared/layers/vector-layer.d.ts +78 -78
  679. package/lib/layer/shared/layers/vector-layer.interface.d.ts +41 -41
  680. package/lib/layer/shared/layers/vectortile-layer.d.ts +28 -28
  681. package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +18 -18
  682. package/lib/layer/shared/style.service.d.ts +57 -57
  683. package/lib/layer/shared/vector-style.interface.d.ts +38 -38
  684. package/lib/layer/style-modal/index.d.ts +1 -1
  685. package/lib/layer/style-modal/style-modal.component.d.ts +42 -42
  686. package/lib/layer/track-feature-button/index.d.ts +1 -1
  687. package/lib/layer/track-feature-button/track-feature-button.component.d.ts +15 -15
  688. package/lib/layer/utils/image-watcher.d.ts +17 -17
  689. package/lib/layer/utils/index.d.ts +5 -5
  690. package/lib/layer/utils/layer.utils.d.ts +2 -2
  691. package/lib/layer/utils/outputLegend.d.ts +7 -7
  692. package/lib/layer/utils/tile-watcher.d.ts +14 -14
  693. package/lib/layer/utils/vector-watcher.d.ts +13 -13
  694. package/lib/map/baselayers-switcher/baselayers-switcher.animation.d.ts +2 -2
  695. package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +21 -21
  696. package/lib/map/baselayers-switcher/index.d.ts +2 -2
  697. package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +29 -29
  698. package/lib/map/geolocate-button/geolocate-button.component.d.ts +22 -22
  699. package/lib/map/geolocate-button/index.d.ts +1 -1
  700. package/lib/map/home-extent-button/home-extent-button.component.d.ts +20 -20
  701. package/lib/map/home-extent-button/index.d.ts +1 -1
  702. package/lib/map/index.d.ts +13 -13
  703. package/lib/map/info-section/index.d.ts +1 -1
  704. package/lib/map/info-section/info-section.component.d.ts +7 -7
  705. package/lib/map/map-browser/index.d.ts +1 -1
  706. package/lib/map/map-browser/map-browser.component.d.ts +25 -25
  707. package/lib/map/map-center/index.d.ts +1 -1
  708. package/lib/map/map-center/map-center.component.d.ts +31 -31
  709. package/lib/map/map.module.d.ts +28 -28
  710. package/lib/map/menu-button/index.d.ts +1 -1
  711. package/lib/map/menu-button/menu-button.component.d.ts +17 -17
  712. package/lib/map/offline-button/index.d.ts +1 -1
  713. package/lib/map/offline-button/offline-button.component.d.ts +23 -23
  714. package/lib/map/rotation-button/index.d.ts +1 -1
  715. package/lib/map/rotation-button/rotation-button.component.d.ts +17 -17
  716. package/lib/map/shared/controllers/controller.d.ts +29 -29
  717. package/lib/map/shared/controllers/geolocation.d.ts +112 -112
  718. package/lib/map/shared/controllers/index.d.ts +3 -3
  719. package/lib/map/shared/controllers/view.d.ts +200 -200
  720. package/lib/map/shared/hover-feature.directive.d.ts +132 -132
  721. package/lib/map/shared/index.d.ts +13 -13
  722. package/lib/map/shared/linkedLayers.utils.d.ts +17 -17
  723. package/lib/map/shared/map-pointer-position.directive.d.ts +71 -71
  724. package/lib/map/shared/map.d.ts +135 -135
  725. package/lib/map/shared/map.enums.d.ts +4 -4
  726. package/lib/map/shared/map.interface.d.ts +57 -57
  727. package/lib/map/shared/map.service.d.ts +19 -19
  728. package/lib/map/shared/map.utils.d.ts +90 -90
  729. package/lib/map/shared/mapOffline.directive.d.ts +21 -21
  730. package/lib/map/shared/projection.interfaces.d.ts +29 -29
  731. package/lib/map/shared/projection.service.d.ts +19 -19
  732. package/lib/map/shared/projection.utils.d.ts +19 -19
  733. package/lib/map/swipe-control/index.d.ts +1 -1
  734. package/lib/map/swipe-control/swipe-control.component.d.ts +97 -97
  735. package/lib/map/utils/layer-watcher.d.ts +20 -20
  736. package/lib/map/wake-lock-button/index.d.ts +1 -1
  737. package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +30 -30
  738. package/lib/map/zoom-button/index.d.ts +1 -1
  739. package/lib/map/zoom-button/zoom-button.component.d.ts +12 -12
  740. package/lib/measure/index.d.ts +3 -3
  741. package/lib/measure/measure.module.d.ts +7 -7
  742. package/lib/measure/measurer/measure-format.pipe.d.ts +15 -15
  743. package/lib/measure/measurer/measurer-dialog.component.d.ts +14 -14
  744. package/lib/measure/measurer/measurer-item.component.d.ts +66 -66
  745. package/lib/measure/measurer/measurer.component.d.ts +405 -405
  746. package/lib/measure/measurer/measurer.module.d.ts +25 -25
  747. package/lib/measure/shared/index.d.ts +3 -3
  748. package/lib/measure/shared/measure.enum.d.ts +33 -33
  749. package/lib/measure/shared/measure.interfaces.d.ts +21 -21
  750. package/lib/measure/shared/measure.utils.d.ts +180 -180
  751. package/lib/metadata/index.d.ts +2 -2
  752. package/lib/metadata/metadata-button/index.d.ts +1 -1
  753. package/lib/metadata/metadata-button/metadata-button.component.d.ts +26 -26
  754. package/lib/metadata/metadata.module.d.ts +15 -15
  755. package/lib/metadata/shared/index.d.ts +2 -2
  756. package/lib/metadata/shared/metadata.interface.d.ts +13 -13
  757. package/lib/metadata/shared/metadata.service.d.ts +8 -8
  758. package/lib/offline/geoDB/configFileToGeoDB.service.d.ts +14 -14
  759. package/lib/offline/geoDB/geoDB.enums.d.ts +4 -4
  760. package/lib/offline/geoDB/geoDB.interface.d.ts +19 -19
  761. package/lib/offline/geoDB/geoDB.service.d.ts +37 -37
  762. package/lib/offline/geoDB/index.d.ts +4 -4
  763. package/lib/offline/index.d.ts +2 -2
  764. package/lib/offline/shared/geo-network.service.d.ts +28 -28
  765. package/lib/offline/shared/index.d.ts +1 -1
  766. package/lib/overlay/index.d.ts +1 -1
  767. package/lib/overlay/overlay.module.d.ts +9 -9
  768. package/lib/overlay/shared/index.d.ts +6 -6
  769. package/lib/overlay/shared/overlay-marker-style.utils.d.ts +11 -11
  770. package/lib/overlay/shared/overlay.d.ts +81 -81
  771. package/lib/overlay/shared/overlay.directive.d.ts +18 -18
  772. package/lib/overlay/shared/overlay.enum.d.ts +6 -6
  773. package/lib/overlay/shared/overlay.service.d.ts +14 -14
  774. package/lib/overlay/shared/overlay.utils.d.ts +17 -17
  775. package/lib/print/index.d.ts +3 -3
  776. package/lib/print/print/print.component.d.ts +35 -35
  777. package/lib/print/print-form/index.d.ts +1 -1
  778. package/lib/print/print-form/print-form.component.d.ts +97 -97
  779. package/lib/print/print.module.d.ts +19 -19
  780. package/lib/print/shared/geopdf.d.ts +1 -1
  781. package/lib/print/shared/index.d.ts +4 -4
  782. package/lib/print/shared/print.interface.d.ts +22 -22
  783. package/lib/print/shared/print.service.d.ts +168 -168
  784. package/lib/print/shared/print.type.d.ts +45 -45
  785. package/lib/query/index.d.ts +1 -1
  786. package/lib/query/query.module.d.ts +11 -11
  787. package/lib/query/shared/index.d.ts +6 -6
  788. package/lib/query/shared/query-search-source.d.ts +17 -17
  789. package/lib/query/shared/query-search-source.providers.d.ts +17 -17
  790. package/lib/query/shared/query.directive.d.ts +105 -105
  791. package/lib/query/shared/query.enums.d.ts +26 -26
  792. package/lib/query/shared/query.interfaces.d.ts +35 -35
  793. package/lib/query/shared/query.service.d.ts +56 -56
  794. package/lib/query/shared/query.utils.d.ts +27 -27
  795. package/lib/search/index.d.ts +11 -11
  796. package/lib/search/search-bar/search-bar.component.d.ts +230 -230
  797. package/lib/search/search-bar/search-bar.module.d.ts +23 -23
  798. package/lib/search/search-bar/search-url-param.directive.d.ts +13 -13
  799. package/lib/search/search-results/save-feature-dialog.component.d.ts +32 -32
  800. package/lib/search/search-results/search-results-add-button.component.d.ts +76 -76
  801. package/lib/search/search-results/search-results-item.component.d.ts +47 -47
  802. package/lib/search/search-results/search-results.component.d.ts +161 -161
  803. package/lib/search/search-results/search-results.module.d.ts +28 -28
  804. package/lib/search/search-selector/search-selector.component.d.ts +58 -58
  805. package/lib/search/search-selector/search-selector.module.d.ts +19 -19
  806. package/lib/search/search-settings/search-settings.component.d.ts +102 -102
  807. package/lib/search/search-settings/search-settings.module.d.ts +20 -20
  808. package/lib/search/search.module.d.ts +14 -14
  809. package/lib/search/shared/index.d.ts +8 -8
  810. package/lib/search/shared/search-pointer-summary.directive.d.ts +133 -133
  811. package/lib/search/shared/search-source-service.providers.d.ts +15 -15
  812. package/lib/search/shared/search-source.service.d.ts +32 -32
  813. package/lib/search/shared/search.enums.d.ts +1 -1
  814. package/lib/search/shared/search.interfaces.d.ts +29 -29
  815. package/lib/search/shared/search.service.d.ts +53 -53
  816. package/lib/search/shared/search.utils.d.ts +39 -39
  817. package/lib/search/shared/sources/coordinates.d.ts +40 -40
  818. package/lib/search/shared/sources/coordinates.interfaces.d.ts +12 -12
  819. package/lib/search/shared/sources/coordinates.providers.d.ts +31 -31
  820. package/lib/search/shared/sources/icherche.d.ts +96 -96
  821. package/lib/search/shared/sources/icherche.interfaces.d.ts +30 -30
  822. package/lib/search/shared/sources/icherche.providers.d.ts +46 -46
  823. package/lib/search/shared/sources/ilayer.d.ts +55 -55
  824. package/lib/search/shared/sources/ilayer.interfaces.d.ts +47 -47
  825. package/lib/search/shared/sources/ilayer.providers.d.ts +31 -31
  826. package/lib/search/shared/sources/index.d.ts +17 -17
  827. package/lib/search/shared/sources/nominatim.d.ts +45 -45
  828. package/lib/search/shared/sources/nominatim.interfaces.d.ts +10 -10
  829. package/lib/search/shared/sources/nominatim.providers.d.ts +18 -18
  830. package/lib/search/shared/sources/source.d.ts +108 -108
  831. package/lib/search/shared/sources/source.interfaces.d.ts +47 -47
  832. package/lib/search/shared/sources/storedqueries.d.ts +73 -73
  833. package/lib/search/shared/sources/storedqueries.interfaces.d.ts +42 -42
  834. package/lib/search/shared/sources/storedqueries.providers.d.ts +32 -32
  835. package/lib/toast/index.d.ts +1 -1
  836. package/lib/toast/toast.component.d.ts +33 -33
  837. package/lib/toast/toast.module.d.ts +14 -14
  838. package/lib/utils/commonVectorStyle.d.ts +14 -14
  839. package/lib/utils/commonVectorStyle.interface.d.ts +16 -16
  840. package/lib/utils/googleLinks.d.ts +5 -5
  841. package/lib/utils/id-generator.d.ts +54 -54
  842. package/lib/utils/index.d.ts +5 -5
  843. package/lib/utils/osmLinks.d.ts +4 -4
  844. package/lib/wkt/index.d.ts +1 -1
  845. package/lib/wkt/shared/index.d.ts +1 -1
  846. package/lib/wkt/shared/wkt.service.d.ts +19 -19
  847. package/lib/wkt/wkt.module.d.ts +8 -8
  848. package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +23 -23
  849. package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +14 -14
  850. package/lib/workspace/confirmation-popup/index.d.ts +2 -2
  851. package/lib/workspace/index.d.ts +7 -7
  852. package/lib/workspace/shared/edition-workspace.d.ts +82 -82
  853. package/lib/workspace/shared/edition-workspace.service.d.ts +52 -52
  854. package/lib/workspace/shared/feature-workspace.d.ts +18 -18
  855. package/lib/workspace/shared/feature-workspace.service.d.ts +19 -19
  856. package/lib/workspace/shared/index.d.ts +7 -7
  857. package/lib/workspace/shared/wfs-workspace.d.ts +18 -18
  858. package/lib/workspace/shared/wfs-workspace.service.d.ts +19 -19
  859. package/lib/workspace/shared/wms-workspace.service.d.ts +22 -22
  860. package/lib/workspace/shared/workspace.utils.d.ts +10 -10
  861. package/lib/workspace/widgets/index.d.ts +3 -3
  862. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +29 -29
  863. package/lib/workspace/widgets/ogc-filter/ogc-filter.module.d.ts +14 -14
  864. package/lib/workspace/widgets/widgets.d.ts +9 -9
  865. package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +32 -32
  866. package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +11 -11
  867. package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +26 -26
  868. package/lib/workspace/workspace-updator/workspace-updator.module.d.ts +11 -11
  869. package/lib/workspace/workspace.module.d.ts +14 -14
  870. package/package.json +4 -4
  871. package/public_api.d.ts +51 -51
@@ -1,1220 +1,1220 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { strEnum } from '@igo2/utils';
5
- import { ClusterDataSource } from '../../datasource/shared/datasources/cluster-datasource';
6
- import { VectorLayer } from '../../layer/shared/layers/vector-layer';
7
- import olPoint from 'ol/geom/Point';
8
- import { circular } from 'ol/geom/Polygon';
9
- import { handleFileExportError, handleFileExportSuccess } from '../shared/export.utils';
10
- import { ExportFormat, EncodingFormat } from '../shared/export.type';
11
- import { ExportService } from '../shared/export.service';
12
- import { handleFileImportSuccess, handleFileImportError } from '../shared/import.utils';
13
- import { skipWhile } from 'rxjs/operators';
14
- import { computeProjectionsConstraints } from '../../map';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "../shared/import.service";
17
- import * as i2 from "../shared/export.service";
18
- import * as i3 from "@igo2/core";
19
- import * as i4 from "../style-list/style-list.service";
20
- import * as i5 from "../../layer/shared/style.service";
21
- import * as i6 from "@angular/forms";
22
- import * as i7 from "../../download/shared/download.service";
23
- import * as i8 from "@angular/material/tooltip";
24
- import * as i9 from "@angular/common";
25
- import * as i10 from "@angular/material/button";
26
- import * as i11 from "@angular/material/button-toggle";
27
- import * as i12 from "@angular/material/form-field";
28
- import * as i13 from "@angular/material/select";
29
- import * as i14 from "@angular/material/core";
30
- import * as i15 from "@angular/material/input";
31
- import * as i16 from "@angular/material/slide-toggle";
32
- import * as i17 from "@igo2/common";
33
- import * as i18 from "@ngx-translate/core";
34
- function ImportExportComponent_form_8_mat_option_7_p_1_Template(rf, ctx) { if (rf & 1) {
35
- i0.ɵɵelementStart(0, "p", 16);
36
- i0.ɵɵtext(1);
37
- i0.ɵɵpipe(2, "translate");
38
- i0.ɵɵelementEnd();
39
- } if (rf & 2) {
40
- const projection_r6 = i0.ɵɵnextContext().$implicit;
41
- i0.ɵɵadvance(1);
42
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, "igo.geo.importExportForm.projections." + projection_r6.translateKey, projection_r6));
43
- } }
44
- function ImportExportComponent_form_8_mat_option_7_p_2_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelementStart(0, "p", 16);
46
- i0.ɵɵtext(1);
47
- i0.ɵɵelementEnd();
48
- } if (rf & 2) {
49
- const projection_r6 = i0.ɵɵnextContext().$implicit;
50
- i0.ɵɵadvance(1);
51
- i0.ɵɵtextInterpolate(projection_r6.alias);
52
- } }
53
- function ImportExportComponent_form_8_mat_option_7_Template(rf, ctx) { if (rf & 1) {
54
- i0.ɵɵelementStart(0, "mat-option", 14);
55
- i0.ɵɵlistener("click", function ImportExportComponent_form_8_mat_option_7_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
56
- i0.ɵɵtemplate(1, ImportExportComponent_form_8_mat_option_7_p_1_Template, 3, 4, "p", 15);
57
- i0.ɵɵtemplate(2, ImportExportComponent_form_8_mat_option_7_p_2_Template, 2, 1, "p", 15);
58
- i0.ɵɵelementEnd();
59
- } if (rf & 2) {
60
- const projection_r6 = ctx.$implicit;
61
- i0.ɵɵproperty("value", projection_r6);
62
- i0.ɵɵadvance(1);
63
- i0.ɵɵproperty("ngIf", projection_r6.translateKey);
64
- i0.ɵɵadvance(1);
65
- i0.ɵɵproperty("ngIf", !projection_r6.translateKey);
66
- } }
67
- function ImportExportComponent_form_8_Template(rf, ctx) { if (rf & 1) {
68
- const _r13 = i0.ɵɵgetCurrentView();
69
- i0.ɵɵelementStart(0, "form", 5)(1, "div", 6)(2, "mat-form-field")(3, "mat-label");
70
- i0.ɵɵtext(4);
71
- i0.ɵɵpipe(5, "translate");
72
- i0.ɵɵelementEnd();
73
- i0.ɵɵelementStart(6, "mat-select", 7);
74
- i0.ɵɵlistener("valueChange", function ImportExportComponent_form_8_Template_mat_select_valueChange_6_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.inputProj = $event); });
75
- i0.ɵɵtemplate(7, ImportExportComponent_form_8_mat_option_7_Template, 3, 3, "mat-option", 8);
76
- i0.ɵɵpipe(8, "async");
77
- i0.ɵɵelementEnd()()();
78
- i0.ɵɵelementStart(9, "div", 9);
79
- i0.ɵɵpipe(10, "translate");
80
- i0.ɵɵpipe(11, "translate");
81
- i0.ɵɵelementStart(12, "button", 10);
82
- i0.ɵɵlistener("click", function ImportExportComponent_form_8_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r13); const _r5 = i0.ɵɵreference(19); return i0.ɵɵresetView(_r5.click()); });
83
- i0.ɵɵpipe(13, "async");
84
- i0.ɵɵtext(14);
85
- i0.ɵɵpipe(15, "translate");
86
- i0.ɵɵelementEnd();
87
- i0.ɵɵelement(16, "igo-spinner", 11);
88
- i0.ɵɵpipe(17, "async");
89
- i0.ɵɵelementStart(18, "input", 12, 13);
90
- i0.ɵɵlistener("click", function ImportExportComponent_form_8_Template_input_click_18_listener() { i0.ɵɵrestoreView(_r13); const _r5 = i0.ɵɵreference(19); return i0.ɵɵresetView(_r5.value = null); })("change", function ImportExportComponent_form_8_Template_input_change_18_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r16 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r16.importFiles($event.target.files)); });
91
- i0.ɵɵelementEnd()()();
92
- } if (rf & 2) {
93
- const ctx_r0 = i0.ɵɵnextContext();
94
- i0.ɵɵproperty("formGroup", ctx_r0.importForm);
95
- i0.ɵɵadvance(4);
96
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 10, "igo.geo.importExportForm.importProjPlaceholder"));
97
- i0.ɵɵadvance(2);
98
- i0.ɵɵproperty("value", ctx_r0.inputProj);
99
- i0.ɵɵadvance(1);
100
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(8, 12, ctx_r0.projections$));
101
- i0.ɵɵadvance(2);
102
- i0.ɵɵproperty("matTooltip", ctx_r0.importForm.invalid ? i0.ɵɵpipeBind1(10, 14, "igo.geo.importExportForm.projections.choose") : i0.ɵɵpipeBind1(11, 16, "igo.geo.importExportForm.importButton"));
103
- i0.ɵɵadvance(3);
104
- i0.ɵɵproperty("disabled", ctx_r0.importForm.invalid || i0.ɵɵpipeBind1(13, 18, ctx_r0.loading$));
105
- i0.ɵɵadvance(2);
106
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(15, 20, "igo.geo.importExportForm.importButton"), " ");
107
- i0.ɵɵadvance(2);
108
- i0.ɵɵproperty("shown", i0.ɵɵpipeBind1(17, 22, ctx_r0.loading$));
109
- i0.ɵɵadvance(2);
110
- i0.ɵɵstyleProp("display", "none");
111
- } }
112
- const _c0 = function (a0) { return { size: a0 }; };
113
- function ImportExportComponent_section_9_div_1_Template(rf, ctx) { if (rf & 1) {
114
- i0.ɵɵelementStart(0, "div")(1, "h4");
115
- i0.ɵɵtext(2);
116
- i0.ɵɵpipe(3, "translate");
117
- i0.ɵɵelementEnd();
118
- i0.ɵɵelementStart(4, "ul")(5, "li");
119
- i0.ɵɵtext(6);
120
- i0.ɵɵpipe(7, "translate");
121
- i0.ɵɵelementEnd();
122
- i0.ɵɵelementStart(8, "li");
123
- i0.ɵɵtext(9);
124
- i0.ɵɵpipe(10, "translate");
125
- i0.ɵɵelementEnd();
126
- i0.ɵɵelementStart(11, "li");
127
- i0.ɵɵtext(12);
128
- i0.ɵɵpipe(13, "translate");
129
- i0.ɵɵelementEnd()()();
130
- } if (rf & 2) {
131
- const ctx_r17 = i0.ɵɵnextContext(2);
132
- i0.ɵɵadvance(2);
133
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 4, "igo.geo.importExportForm.importClarifications"));
134
- i0.ɵɵadvance(4);
135
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(7, 6, "igo.geo.importExportForm.importSizeMax", i0.ɵɵpureFunction1(13, _c0, ctx_r17.fileSizeMb)));
136
- i0.ɵɵadvance(3);
137
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 9, "igo.geo.importExportForm.importFormatAuthorized"));
138
- i0.ɵɵadvance(3);
139
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 11, "igo.geo.importExportForm.importShpZip"));
140
- } }
141
- function ImportExportComponent_section_9_igo_custom_html_2_Template(rf, ctx) { if (rf & 1) {
142
- i0.ɵɵelement(0, "igo-custom-html", 20);
143
- } if (rf & 2) {
144
- const ctx_r18 = i0.ɵɵnextContext(2);
145
- i0.ɵɵproperty("html", ctx_r18.importHtmlClarifications);
146
- } }
147
- function ImportExportComponent_section_9_Template(rf, ctx) { if (rf & 1) {
148
- i0.ɵɵelementStart(0, "section", 17);
149
- i0.ɵɵtemplate(1, ImportExportComponent_section_9_div_1_Template, 14, 15, "div", 18);
150
- i0.ɵɵtemplate(2, ImportExportComponent_section_9_igo_custom_html_2_Template, 1, 1, "igo-custom-html", 19);
151
- i0.ɵɵelementEnd();
152
- } if (rf & 2) {
153
- const ctx_r1 = i0.ɵɵnextContext();
154
- i0.ɵɵadvance(1);
155
- i0.ɵɵproperty("ngIf", ctx_r1.importHtmlClarifications === "");
156
- i0.ɵɵadvance(1);
157
- i0.ɵɵproperty("ngIf", ctx_r1.importHtmlClarifications !== "");
158
- } }
159
- function ImportExportComponent_section_10_Template(rf, ctx) { if (rf & 1) {
160
- i0.ɵɵelementStart(0, "section", 17)(1, "h4");
161
- i0.ɵɵtext(2);
162
- i0.ɵɵpipe(3, "translate");
163
- i0.ɵɵelementEnd()();
164
- } if (rf & 2) {
165
- i0.ɵɵadvance(2);
166
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 1, "igo.geo.importExportForm.exportNoLayersExportable"));
167
- } }
168
- function ImportExportComponent_form_12_span_9_Template(rf, ctx) { if (rf & 1) {
169
- i0.ɵɵelementStart(0, "span", 31);
170
- i0.ɵɵtext(1);
171
- i0.ɵɵpipe(2, "translate");
172
- i0.ɵɵelementEnd();
173
- } if (rf & 2) {
174
- const ctx_r19 = i0.ɵɵnextContext(2);
175
- i0.ɵɵadvance(1);
176
- i0.ɵɵtextInterpolate2(" (+", ctx_r19.layers.length - 1, " ", i0.ɵɵpipeBind1(2, 2, (ctx_r19.layers == null ? null : ctx_r19.layers.length) === 2 ? "igo.geo.importExportForm.other" : "igo.geo.importExportForm.others"), ") ");
177
- } }
178
- function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template(rf, ctx) { if (rf & 1) {
179
- const _r33 = i0.ɵɵgetCurrentView();
180
- i0.ɵɵelementStart(0, "mat-slide-toggle", 34);
181
- i0.ɵɵlistener("click", function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template_mat_slide_toggle_click_0_listener($event) { i0.ɵɵrestoreView(_r33); const layer_r29 = i0.ɵɵnextContext().$implicit; const ctx_r31 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r31.onlySelectedClick($event, layer_r29.id)); })("checked", function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template_mat_slide_toggle_checked_0_listener() { i0.ɵɵrestoreView(_r33); const layer_r29 = i0.ɵɵnextContext().$implicit; const ctx_r34 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r34.inLayersIdToExportSelectionOnly(layer_r29)); })("change", function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r33); const layer_r29 = i0.ɵɵnextContext().$implicit; const ctx_r36 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r36.onlySelected($event, layer_r29.id)); });
182
- i0.ɵɵelementStart(1, "small");
183
- i0.ɵɵtext(2);
184
- i0.ɵɵpipe(3, "translate");
185
- i0.ɵɵelementEnd()();
186
- } if (rf & 2) {
187
- i0.ɵɵproperty("labelPosition", "after");
188
- i0.ɵɵadvance(2);
189
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportSelectedFeature"));
190
- } }
191
- const _c1 = function (a0) { return { "igo-export-layer-mat-option": a0 }; };
192
- function ImportExportComponent_form_12_mat_option_10_Template(rf, ctx) { if (rf & 1) {
193
- i0.ɵɵelementStart(0, "mat-option", 32);
194
- i0.ɵɵlistener("click", function ImportExportComponent_form_12_mat_option_10_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
195
- i0.ɵɵelementStart(1, "p", 16);
196
- i0.ɵɵtext(2);
197
- i0.ɵɵelementEnd();
198
- i0.ɵɵelementStart(3, "p", 16);
199
- i0.ɵɵtemplate(4, ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template, 4, 4, "mat-slide-toggle", 33);
200
- i0.ɵɵelementEnd()();
201
- } if (rf & 2) {
202
- const layer_r29 = ctx.$implicit;
203
- const ctx_r20 = i0.ɵɵnextContext(2);
204
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c1, ctx_r20.layerHasSelectedFeatures(layer_r29)))("value", layer_r29.id);
205
- i0.ɵɵadvance(2);
206
- i0.ɵɵtextInterpolate(layer_r29.title);
207
- i0.ɵɵadvance(2);
208
- i0.ɵɵproperty("ngIf", ctx_r20.layerHasSelectedFeatures(layer_r29));
209
- } }
210
- function ImportExportComponent_form_12_ng_container_18_mat_option_1_Template(rf, ctx) { if (rf & 1) {
211
- i0.ɵɵelementStart(0, "mat-option", 2);
212
- i0.ɵɵtext(1);
213
- i0.ɵɵpipe(2, "translate");
214
- i0.ɵɵelementEnd();
215
- } if (rf & 2) {
216
- const format_r40 = ctx.$implicit;
217
- i0.ɵɵproperty("value", format_r40.key);
218
- i0.ɵɵadvance(1);
219
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "igo.geo.export.format." + format_r40.value), " ");
220
- } }
221
- function ImportExportComponent_form_12_ng_container_18_Template(rf, ctx) { if (rf & 1) {
222
- i0.ɵɵelementContainerStart(0);
223
- i0.ɵɵtemplate(1, ImportExportComponent_form_12_ng_container_18_mat_option_1_Template, 3, 4, "mat-option", 35);
224
- i0.ɵɵpipe(2, "keyvalue");
225
- i0.ɵɵpipe(3, "async");
226
- i0.ɵɵelementContainerEnd();
227
- } if (rf & 2) {
228
- const ctx_r21 = i0.ɵɵnextContext(2);
229
- i0.ɵɵadvance(1);
230
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, i0.ɵɵpipeBind1(3, 3, ctx_r21.formats$)));
231
- } }
232
- function ImportExportComponent_form_12_mat_option_20_Template(rf, ctx) { if (rf & 1) {
233
- i0.ɵɵelementStart(0, "mat-option", 36);
234
- i0.ɵɵtext(1);
235
- i0.ɵɵpipe(2, "translate");
236
- i0.ɵɵelementEnd();
237
- } if (rf & 2) {
238
- i0.ɵɵadvance(1);
239
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "igo.geo.export.noFormat.title"), " ");
240
- } }
241
- function ImportExportComponent_form_12_div_22_Template(rf, ctx) { if (rf & 1) {
242
- i0.ɵɵelementStart(0, "div", 6)(1, "mat-form-field");
243
- i0.ɵɵelement(2, "input", 37);
244
- i0.ɵɵpipe(3, "translate");
245
- i0.ɵɵelementEnd()();
246
- } if (rf & 2) {
247
- i0.ɵɵadvance(2);
248
- i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(3, 1, "igo.geo.importExportForm.exportFileNamePlaceholder"));
249
- } }
250
- function ImportExportComponent_form_12_div_23_ng_container_6_mat_option_1_Template(rf, ctx) { if (rf & 1) {
251
- i0.ɵɵelementStart(0, "mat-option", 2);
252
- i0.ɵɵtext(1);
253
- i0.ɵɵpipe(2, "translate");
254
- i0.ɵɵelementEnd();
255
- } if (rf & 2) {
256
- const encoding_r43 = ctx.$implicit;
257
- i0.ɵɵproperty("value", encoding_r43.key);
258
- i0.ɵɵadvance(1);
259
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "igo.geo.export.encoding." + encoding_r43.value), " ");
260
- } }
261
- function ImportExportComponent_form_12_div_23_ng_container_6_Template(rf, ctx) { if (rf & 1) {
262
- i0.ɵɵelementContainerStart(0);
263
- i0.ɵɵtemplate(1, ImportExportComponent_form_12_div_23_ng_container_6_mat_option_1_Template, 3, 4, "mat-option", 35);
264
- i0.ɵɵpipe(2, "keyvalue");
265
- i0.ɵɵpipe(3, "async");
266
- i0.ɵɵelementContainerEnd();
267
- } if (rf & 2) {
268
- const ctx_r41 = i0.ɵɵnextContext(3);
269
- i0.ɵɵadvance(1);
270
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, i0.ɵɵpipeBind1(3, 3, ctx_r41.encodings$)));
271
- } }
272
- function ImportExportComponent_form_12_div_23_Template(rf, ctx) { if (rf & 1) {
273
- i0.ɵɵelementStart(0, "div", 6)(1, "mat-form-field")(2, "mat-label");
274
- i0.ɵɵtext(3);
275
- i0.ɵɵpipe(4, "translate");
276
- i0.ɵɵelementEnd();
277
- i0.ɵɵelementStart(5, "mat-select", 38);
278
- i0.ɵɵtemplate(6, ImportExportComponent_form_12_div_23_ng_container_6_Template, 4, 5, "ng-container", 18);
279
- i0.ɵɵpipe(7, "async");
280
- i0.ɵɵelementEnd()()();
281
- } if (rf & 2) {
282
- const ctx_r24 = i0.ɵɵnextContext(2);
283
- i0.ɵɵadvance(3);
284
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 2, "igo.geo.importExportForm.encodingPlaceholder"));
285
- i0.ɵɵadvance(3);
286
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(7, 4, ctx_r24.encodings$).length !== 0);
287
- } }
288
- function ImportExportComponent_form_12_div_24_Template(rf, ctx) { if (rf & 1) {
289
- i0.ɵɵelementStart(0, "div", 39)(1, "mat-slide-toggle", 40);
290
- i0.ɵɵtext(2);
291
- i0.ɵɵpipe(3, "translate");
292
- i0.ɵɵelementEnd()();
293
- } if (rf & 2) {
294
- i0.ɵɵadvance(1);
295
- i0.ɵɵproperty("labelPosition", "before");
296
- i0.ɵɵadvance(1);
297
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportCombineResults"), " ");
298
- } }
299
- function ImportExportComponent_form_12_div_25_Template(rf, ctx) { if (rf & 1) {
300
- i0.ɵɵelementStart(0, "div", 41)(1, "mat-slide-toggle", 42);
301
- i0.ɵɵtext(2);
302
- i0.ɵɵpipe(3, "translate");
303
- i0.ɵɵelementEnd()();
304
- } if (rf & 2) {
305
- i0.ɵɵadvance(1);
306
- i0.ɵɵproperty("labelPosition", "before");
307
- i0.ɵɵadvance(1);
308
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportSeparator"), " ");
309
- } }
310
- function ImportExportComponent_form_12_div_26_Template(rf, ctx) { if (rf & 1) {
311
- i0.ɵɵelementStart(0, "div", 43)(1, "mat-slide-toggle", 44);
312
- i0.ɵɵtext(2);
313
- i0.ɵɵpipe(3, "translate");
314
- i0.ɵɵelementEnd()();
315
- } if (rf & 2) {
316
- i0.ɵɵadvance(1);
317
- i0.ɵɵproperty("labelPosition", "before");
318
- i0.ɵɵadvance(1);
319
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportFeatureInExtent"), " ");
320
- } }
321
- function ImportExportComponent_form_12_igo_custom_html_36_Template(rf, ctx) { if (rf & 1) {
322
- i0.ɵɵelement(0, "igo-custom-html", 20);
323
- } if (rf & 2) {
324
- const ctx_r28 = i0.ɵɵnextContext(2);
325
- i0.ɵɵproperty("html", ctx_r28.exportHtmlClarifications);
326
- } }
327
- function ImportExportComponent_form_12_Template(rf, ctx) { if (rf & 1) {
328
- const _r45 = i0.ɵɵgetCurrentView();
329
- i0.ɵɵelementStart(0, "form", 5)(1, "div", 6)(2, "mat-form-field")(3, "mat-label");
330
- i0.ɵɵtext(4);
331
- i0.ɵɵpipe(5, "translate");
332
- i0.ɵɵelementEnd();
333
- i0.ɵɵelementStart(6, "mat-select", 21);
334
- i0.ɵɵlistener("valueChange", function ImportExportComponent_form_12_Template_mat_select_valueChange_6_listener($event) { i0.ɵɵrestoreView(_r45); const ctx_r44 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r44.layers = $event); });
335
- i0.ɵɵelementStart(7, "mat-select-trigger");
336
- i0.ɵɵtext(8);
337
- i0.ɵɵtemplate(9, ImportExportComponent_form_12_span_9_Template, 3, 4, "span", 22);
338
- i0.ɵɵelementEnd();
339
- i0.ɵɵtemplate(10, ImportExportComponent_form_12_mat_option_10_Template, 5, 6, "mat-option", 23);
340
- i0.ɵɵpipe(11, "async");
341
- i0.ɵɵelementEnd()()();
342
- i0.ɵɵelementStart(12, "div", 6)(13, "mat-form-field")(14, "mat-label");
343
- i0.ɵɵtext(15);
344
- i0.ɵɵpipe(16, "translate");
345
- i0.ɵɵelementEnd();
346
- i0.ɵɵelementStart(17, "mat-select", 24);
347
- i0.ɵɵtemplate(18, ImportExportComponent_form_12_ng_container_18_Template, 4, 5, "ng-container", 18);
348
- i0.ɵɵpipe(19, "async");
349
- i0.ɵɵtemplate(20, ImportExportComponent_form_12_mat_option_20_Template, 3, 3, "mat-option", 25);
350
- i0.ɵɵpipe(21, "async");
351
- i0.ɵɵelementEnd()()();
352
- i0.ɵɵtemplate(22, ImportExportComponent_form_12_div_22_Template, 4, 3, "div", 26);
353
- i0.ɵɵtemplate(23, ImportExportComponent_form_12_div_23_Template, 8, 6, "div", 26);
354
- i0.ɵɵtemplate(24, ImportExportComponent_form_12_div_24_Template, 4, 4, "div", 27);
355
- i0.ɵɵtemplate(25, ImportExportComponent_form_12_div_25_Template, 4, 4, "div", 28);
356
- i0.ɵɵtemplate(26, ImportExportComponent_form_12_div_26_Template, 4, 4, "div", 29);
357
- i0.ɵɵelementStart(27, "div", 30)(28, "button", 10);
358
- i0.ɵɵlistener("click", function ImportExportComponent_form_12_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r45); const ctx_r46 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r46.handleExportFormSubmit(ctx_r46.form.value)); });
359
- i0.ɵɵpipe(29, "async");
360
- i0.ɵɵtext(30);
361
- i0.ɵɵpipe(31, "translate");
362
- i0.ɵɵpipe(32, "translate");
363
- i0.ɵɵpipe(33, "translate");
364
- i0.ɵɵelementEnd();
365
- i0.ɵɵelement(34, "igo-spinner", 11);
366
- i0.ɵɵpipe(35, "async");
367
- i0.ɵɵelementEnd();
368
- i0.ɵɵtemplate(36, ImportExportComponent_form_12_igo_custom_html_36_Template, 1, 1, "igo-custom-html", 19);
369
- i0.ɵɵelementEnd();
370
- } if (rf & 2) {
371
- const ctx_r3 = i0.ɵɵnextContext();
372
- i0.ɵɵproperty("formGroup", ctx_r3.form);
373
- i0.ɵɵadvance(4);
374
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 18, "igo.geo.importExportForm.exportLayerPlaceholder"));
375
- i0.ɵɵadvance(2);
376
- i0.ɵɵproperty("value", ctx_r3.layers);
377
- i0.ɵɵadvance(2);
378
- i0.ɵɵtextInterpolate1(" ", ctx_r3.layers.length ? ctx_r3.getLayerTitleById(ctx_r3.layers[0]) : "", " ");
379
- i0.ɵɵadvance(1);
380
- i0.ɵɵproperty("ngIf", ctx_r3.layers.length > 1);
381
- i0.ɵɵadvance(1);
382
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(11, 20, ctx_r3.exportableLayers$));
383
- i0.ɵɵadvance(5);
384
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 22, "igo.geo.importExportForm.exportFormatPlaceholder"));
385
- i0.ɵɵadvance(3);
386
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(19, 24, ctx_r3.formats$).length !== 0);
387
- i0.ɵɵadvance(2);
388
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(21, 26, ctx_r3.formats$).length === 0);
389
- i0.ɵɵadvance(2);
390
- i0.ɵɵproperty("ngIf", ctx_r3.forceNaming && ctx_r3.form.value.format !== "URL");
391
- i0.ɵɵadvance(1);
392
- i0.ɵɵproperty("ngIf", ctx_r3.form.value.format === "CSVcomma" || ctx_r3.form.value.format === "CSVsemicolon");
393
- i0.ɵɵadvance(1);
394
- i0.ɵɵproperty("ngIf", ctx_r3.layers.length > 1 && (ctx_r3.form.value.format === "CSVcomma" || ctx_r3.form.value.format === "CSVsemicolon"));
395
- i0.ɵɵadvance(1);
396
- i0.ɵɵproperty("ngIf", ctx_r3.layers.length > 1 && (ctx_r3.form.value.format === "CSVcomma" || ctx_r3.form.value.format === "CSVsemicolon") && ctx_r3.form.value.combineLayers);
397
- i0.ɵɵadvance(1);
398
- i0.ɵɵproperty("ngIf", ctx_r3.form.value.format !== "URL");
399
- i0.ɵɵadvance(2);
400
- i0.ɵɵproperty("disabled", !ctx_r3.form.valid || i0.ɵɵpipeBind1(29, 28, ctx_r3.loading$));
401
- i0.ɵɵadvance(2);
402
- i0.ɵɵtextInterpolate1(" ", ctx_r3.form.value.format !== "URL" ? i0.ɵɵpipeBind1(31, 30, "igo.geo.importExportForm.exportButton") : ctx_r3.form.value.layers.length > 1 ? i0.ɵɵpipeBind1(32, 32, "igo.geo.importExportForm.exportButtonLinks") : i0.ɵɵpipeBind1(33, 34, "igo.geo.importExportForm.exportButtonLink"), " ");
403
- i0.ɵɵadvance(4);
404
- i0.ɵɵproperty("shown", i0.ɵɵpipeBind1(35, 36, ctx_r3.loading$));
405
- i0.ɵɵadvance(2);
406
- i0.ɵɵproperty("ngIf", ctx_r3.exportHtmlClarifications !== "");
407
- } }
408
- export class ImportExportComponent {
409
- constructor(importService, exportService, languageService, messageService, styleListService, styleService, formBuilder, config, cdRef, storageService, downloadService) {
410
- this.importService = importService;
411
- this.exportService = exportService;
412
- this.languageService = languageService;
413
- this.messageService = messageService;
414
- this.styleListService = styleListService;
415
- this.styleService = styleService;
416
- this.formBuilder = formBuilder;
417
- this.config = config;
418
- this.cdRef = cdRef;
419
- this.storageService = storageService;
420
- this.downloadService = downloadService;
421
- this.formats$ = new BehaviorSubject(undefined);
422
- this.encodings$ = new BehaviorSubject(undefined);
423
- this.exportableLayers$ = new BehaviorSubject([]);
424
- this.loading$ = new BehaviorSubject(false);
425
- this.forceNaming = false;
426
- this.controlFormat = 'format';
427
- this.espgCodeRegex = new RegExp('^\\d{4,6}');
428
- this.projections$ = new BehaviorSubject([]);
429
- this.popupChecked = false;
430
- this.previousLayerSpecs$ = new BehaviorSubject(undefined);
431
- this.selectFirstProj = false;
432
- this._projectionsLimitations = {};
433
- this.selectedMode = 'import';
434
- this.selectMode = new EventEmitter();
435
- this.exportOptions$ = new BehaviorSubject(undefined);
436
- this.exportOptionsChange = new EventEmitter();
437
- this.loadConfig();
438
- this.buildForm();
439
- this.computeProjections();
440
- this.importHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.importHtmlClarifications');
441
- this.exportHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.exportHtmlClarifications');
442
- }
443
- set projectionsLimitations(value) {
444
- this._projectionsLimitations = value;
445
- this.computeProjections();
446
- }
447
- get projectionsLimitations() {
448
- return this._projectionsLimitations || {};
449
- }
450
- get layers() {
451
- return this.form.get('layers').value;
452
- }
453
- set layers(value) {
454
- this.form.patchValue({ layers: value });
455
- }
456
- get inputProj() {
457
- return this.importForm.get('inputProj').value;
458
- }
459
- set inputProj(value) {
460
- this.importForm.patchValue({ inputProj: value });
461
- }
462
- get popupAllowed() {
463
- return this.storageService.get('importExportPopupAllowed') || false;
464
- }
465
- set popupAllowed(value) {
466
- this.storageService.set('importExportPopupAllowed', value);
467
- }
468
- ngOnInit() {
469
- this.layers$$ = this.map.layers$.subscribe((layers) => {
470
- this.exportableLayers$.next(layers.filter((layer) => {
471
- return ((layer instanceof VectorLayer && layer.exportable === true) ||
472
- (layer.dataSource.options.download &&
473
- layer.dataSource.options.download.url));
474
- }));
475
- });
476
- const configFileSizeMb = this.config.getConfig('importExport.clientSideFileSizeMaxMb');
477
- this.clientSideFileSizeMax =
478
- (configFileSizeMb ? configFileSizeMb : 30) * Math.pow(1024, 2);
479
- this.fileSizeMb = this.clientSideFileSizeMax / Math.pow(1024, 2);
480
- this.exportOptions$$ = this.exportOptions$
481
- .pipe(skipWhile((exportOptions) => !exportOptions))
482
- .subscribe((exportOptions) => {
483
- this.form.patchValue(exportOptions, { emitEvent: true });
484
- if (exportOptions.layers) {
485
- this.computeFormats(exportOptions.layers.map((l) => this.map.getLayerById(l)));
486
- }
487
- });
488
- this.formLayer$$ = this.form
489
- .get('format')
490
- .valueChanges
491
- .subscribe((format) => {
492
- const ogreFormats = Object.keys(ExportService.ogreFormats);
493
- if (!this.popupChecked &&
494
- this.form.get('layers').value?.length > 1 &&
495
- (ogreFormats.indexOf(format) >= 0 || format === ExportFormat.URL)) {
496
- if (!this.handlePopup(true)) {
497
- this.form.patchValue({ format: undefined }, { emitEvent: false });
498
- }
499
- }
500
- });
501
- this.formLayer$$ = this.form
502
- .get('layers')
503
- .valueChanges.subscribe((layersId) => {
504
- this.handlePreviousLayerSpecs();
505
- const selectedLayers = layersId instanceof Array ? layersId : [layersId];
506
- this.form.patchValue({ layers: selectedLayers }, { emitEvent: false });
507
- const layers = selectedLayers.map((l) => this.map.getLayerById(l));
508
- this.computeFormats(layers);
509
- if (Object.keys(this.formats$.value).indexOf(this.form.value.format) ===
510
- -1) {
511
- this.form.patchValue({ format: undefined });
512
- }
513
- this.loading$.next(true);
514
- const previousSpecs = [];
515
- layers.forEach((layer) => {
516
- if (layer instanceof VectorLayer &&
517
- layer.dataSource.ol.getFeatures().length === 0) {
518
- previousSpecs.push({
519
- id: layer.id,
520
- visible: layer.visible,
521
- opacity: layer.opacity,
522
- queryable: layer.queryable
523
- });
524
- layer.opacity = 0;
525
- layer.visible = true;
526
- }
527
- });
528
- this.previousLayerSpecs$.next(previousSpecs);
529
- setTimeout(() => {
530
- this.loading$.next(false);
531
- }, 500);
532
- });
533
- this.formats$$ = this.formats$
534
- .pipe(skipWhile((formats) => !formats))
535
- .subscribe((formats) => {
536
- if (Object.keys(formats).length === 1) {
537
- this.form.patchValue({ format: formats[Object.keys(formats)[0]] });
538
- }
539
- });
540
- this.encodings$$ = this.encodings$
541
- .pipe(skipWhile((encodings) => !encodings))
542
- .subscribe((encodings) => {
543
- if (Object.keys(encodings).length === 1) {
544
- this.form.patchValue({ encoding: encodings[Object.keys(encodings)[0]] });
545
- }
546
- });
547
- this.exportableLayers$$ = this.exportableLayers$
548
- .pipe(skipWhile((layers) => !layers))
549
- .subscribe((layers) => {
550
- if (layers.length === 1) {
551
- this.form.patchValue({ layers: layers[0].id });
552
- }
553
- });
554
- this.form.controls[this.controlFormat].valueChanges.subscribe((format) => {
555
- if (format === ExportFormat.CSVcomma || format === ExportFormat.CSVsemicolon) {
556
- this.form.patchValue({ encoding: EncodingFormat.LATIN1 });
557
- }
558
- else {
559
- this.form.patchValue({ encoding: EncodingFormat.UTF8 });
560
- }
561
- this.cdRef.detectChanges();
562
- });
563
- if (this.selectFirstProj) {
564
- if (this.projections$.value.length === 0) {
565
- this.importForm.patchValue({ inputProj: { translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4326', zone: '' } });
566
- }
567
- else {
568
- this.importForm.patchValue({ inputProj: this.projections$.value[0] });
569
- }
570
- }
571
- else {
572
- this.importForm.patchValue({ inputProj: undefined });
573
- }
574
- }
575
- computeProjections() {
576
- this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
577
- const projections = [];
578
- if (this.projectionsConstraints.nad83) {
579
- projections.push({ translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4269', zone: '' });
580
- }
581
- if (this.projectionsConstraints.wgs84) {
582
- projections.push({ translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: '' });
583
- }
584
- if (this.projectionsConstraints.webMercator) {
585
- projections.push({ translateKey: 'webMercator', alias: 'Web Mercator', code: 'EPSG:3857', zone: '' });
586
- }
587
- if (this.projectionsConstraints.mtm) {
588
- // all mtm zones
589
- const minZone = this.projectionsConstraints.mtmZone.minZone;
590
- const maxZone = this.projectionsConstraints.mtmZone.maxZone;
591
- for (let mtmZone = minZone; mtmZone <= maxZone; mtmZone++) {
592
- const code = mtmZone < 10 ? `EPSG:3218${mtmZone}` : `EPSG:321${80 + mtmZone}`;
593
- projections.push({ translateKey: 'mtm', alias: `MTM ${mtmZone}`, code, zone: `${mtmZone}` });
594
- }
595
- }
596
- if (this.projectionsConstraints.utm) {
597
- // all utm zones
598
- const minZone = this.projectionsConstraints.utmZone.minZone;
599
- const maxZone = this.projectionsConstraints.utmZone.maxZone;
600
- for (let utmZone = minZone; utmZone <= maxZone; utmZone++) {
601
- const code = utmZone < 10 ? `EPSG:3260${utmZone}` : `EPSG:326${utmZone}`;
602
- projections.push({ translateKey: 'utm', alias: `UTM ${utmZone}`, code, zone: `${utmZone}` });
603
- }
604
- }
605
- let configProjection = [];
606
- if (this.projectionsConstraints.projFromConfig) {
607
- configProjection = this.config.getConfig('projections') || [];
608
- }
609
- this.projections$.next(configProjection.concat(projections));
610
- }
611
- getWorkspaceByLayerId(id) {
612
- const wksFromLayerId = this.store
613
- .all()
614
- .find(workspace => workspace.layer.id === id);
615
- if (wksFromLayerId) {
616
- return wksFromLayerId;
617
- }
618
- return;
619
- }
620
- getLayerTitleById(id) {
621
- return this.map.getLayerById(id)?.title;
622
- }
623
- layerHasSelectedFeatures(layer) {
624
- const wksFromLayer = this.getWorkspaceByLayerId(layer.id);
625
- if (wksFromLayer) {
626
- const recs = wksFromLayer.entityStore.stateView
627
- .firstBy((record) => {
628
- return record.state.selected === true;
629
- });
630
- return recs ? true : false;
631
- }
632
- }
633
- onlySelected(event, id) {
634
- let layersWithSelection = this.form.value.layersWithSelection;
635
- if (event.checked) {
636
- layersWithSelection.push(id);
637
- }
638
- else {
639
- layersWithSelection = layersWithSelection.filter(layerId => layerId !== id);
640
- }
641
- this.form.patchValue({ layersWithSelection });
642
- }
643
- onlySelectedClick(event, id) {
644
- if (this.form.value.layers.find(layerId => layerId === id)) {
645
- event.stopPropagation();
646
- }
647
- }
648
- inLayersIdToExportSelectionOnly(layer) {
649
- return this.form.value.layersWithSelection.find(layerId => layerId === layer.id) ? true : false;
650
- }
651
- ngOnDestroy() {
652
- this.layers$$.unsubscribe();
653
- this.exportableLayers$$.unsubscribe();
654
- this.formats$$.unsubscribe();
655
- this.encodings$$.unsubscribe();
656
- this.formLayer$$.unsubscribe();
657
- if (this.exportOptions$$) {
658
- this.exportOptions$$.unsubscribe();
659
- }
660
- this.exportOptionsChange.emit(this.form.value);
661
- this.handlePreviousLayerSpecs();
662
- }
663
- handlePreviousLayerSpecs() {
664
- const previousSpecs = this.previousLayerSpecs$.value;
665
- if (previousSpecs && previousSpecs.length) {
666
- previousSpecs.forEach((specs) => {
667
- const previousLayer = this.map.getLayerById(specs.id);
668
- previousLayer.visible = specs.visible;
669
- previousLayer.opacity = specs.opacity;
670
- previousLayer.queryable = specs.queryable;
671
- });
672
- }
673
- this.previousLayerSpecs$.next(undefined);
674
- }
675
- importFiles(files) {
676
- let inputProj = this.inputProj.code;
677
- if (this.espgCodeRegex.test(inputProj)) {
678
- inputProj = `EPSG:${inputProj}`;
679
- }
680
- this.loading$.next(true);
681
- for (const file of files) {
682
- this.importService.import(file, inputProj).subscribe((features) => this.onFileImportSuccess(file, features), (error) => this.onFileImportError(file, error), () => {
683
- this.loading$.next(false);
684
- });
685
- }
686
- }
687
- handlePopup(preCheck = true) {
688
- const p1 = window.open('', 'popup', 'width=1, height=1');
689
- p1.close();
690
- const p2 = window.open('', 'popup', 'width=1, height=1');
691
- if (!p2 || p2.closed || typeof p2.closed === 'undefined' || p2 === null) {
692
- this.onPopupBlockedError(preCheck);
693
- this.popupAllowed = false;
694
- }
695
- else {
696
- p2.close();
697
- this.popupAllowed = true;
698
- this.popupChecked = true;
699
- }
700
- return this.popupAllowed;
701
- }
702
- handleExportFormSubmit(data) {
703
- this.loading$.next(true);
704
- const ogreFormats = Object.keys(ExportService.ogreFormats);
705
- if (!this.popupChecked && data.layers.length > 1 &&
706
- (ogreFormats.indexOf(data.format) >= 0 || data.format === ExportFormat.URL) && !this.popupAllowed) {
707
- this.handlePopup();
708
- }
709
- let geomTypesCSV = [];
710
- let featuresCSV = [];
711
- let filename = "";
712
- for (const [layerIndex, layer] of data.layers.entries()) {
713
- const lay = this.map.getLayerById(layer);
714
- if (!(data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma)
715
- || !data.combineLayers || data.layers.length === 1) {
716
- filename = lay.title;
717
- if (data.name) {
718
- filename = data.name;
719
- }
720
- }
721
- else {
722
- filename = this.languageService.translate.instant('igo.geo.export.combinedLayers');
723
- }
724
- const dSOptions = lay.dataSource.options;
725
- if (data.format === ExportFormat.URL && dSOptions.download && (dSOptions.download.url || dSOptions.download.dynamicUrl)) {
726
- setTimeout(() => {
727
- // better look an feel
728
- const url = dSOptions.download.url || dSOptions.download.dynamicUrl;
729
- url.match(/service=wfs/gi) ? this.downloadService.open(lay) : window.open(url, '_blank');
730
- this.loading$.next(false);
731
- }, 500);
732
- return;
733
- }
734
- const wks = this.getWorkspaceByLayerId(layer);
735
- let olFeatures;
736
- if (wks && wks.entityStore && wks.entityStore.stateView.all().length) {
737
- if (data.layersWithSelection.indexOf(layer) !== -1 && data.featureInMapExtent) {
738
- // Only export selected feature && into map extent
739
- olFeatures = wks.entityStore.stateView.all()
740
- .filter((e) => e.state.inMapExtent && e.state.selected).map(e => e.entity.ol);
741
- }
742
- else if (data.layersWithSelection.indexOf(layer) !== -1 && !data.featureInMapExtent) {
743
- // Only export selected feature && (into map extent OR not)
744
- olFeatures = wks.entityStore.stateView.all()
745
- .filter((e) => e.state.selected).map(e => e.entity.ol);
746
- }
747
- else if (data.featureInMapExtent) {
748
- // Only into map extent
749
- olFeatures = wks.entityStore.stateView.all()
750
- .filter((e) => e.state.inMapExtent).map(e => e.entity.ol);
751
- }
752
- else {
753
- // All features
754
- olFeatures = wks.entityStore.stateView.all().map(e => e.entity.ol);
755
- }
756
- }
757
- else {
758
- const ol = lay.dataSource.ol;
759
- if (data.featureInMapExtent) {
760
- olFeatures = ol.getFeaturesInExtent(lay.map.viewController.getExtent());
761
- }
762
- else {
763
- olFeatures = ol.getFeatures();
764
- }
765
- if (lay.dataSource instanceof ClusterDataSource) {
766
- olFeatures = olFeatures.flatMap((cluster) => cluster.get('features'));
767
- }
768
- }
769
- const translate = this.languageService.translate;
770
- let geomTypes = [];
771
- if (data.format === ExportFormat.Shapefile || data.format === ExportFormat.GPX) {
772
- olFeatures.forEach((olFeature) => {
773
- const featureGeomType = olFeature.getGeometry().getType();
774
- const currentGeomType = geomTypes.find(geomType => geomType.geometryType === featureGeomType);
775
- if (currentGeomType) {
776
- currentGeomType.features.push(olFeature);
777
- }
778
- else {
779
- geomTypes.push({ geometryType: featureGeomType, features: [olFeature] });
780
- }
781
- });
782
- }
783
- else {
784
- geomTypes = [{ geometryType: '', features: olFeatures }];
785
- }
786
- geomTypes.forEach(geomType => {
787
- geomType.features.forEach(feature => {
788
- const radius = feature.get('rad');
789
- if (radius) {
790
- const center4326 = [feature.get('longitude'), feature.get('latitude')];
791
- const circle = circular(center4326, radius, 500);
792
- circle.transform('EPSG:4326', feature.get('_projection'));
793
- feature.setGeometry(circle);
794
- }
795
- });
796
- });
797
- if (data.format === ExportFormat.GPX) {
798
- const gpxFeatureCnt = geomTypes.length;
799
- geomTypes = geomTypes.filter(geomType => ['LineString', 'Point'].includes(geomType.geometryType));
800
- const gpxFeatureCntPointOrPoly = geomTypes.length;
801
- if (gpxFeatureCnt > gpxFeatureCntPointOrPoly) {
802
- const title = translate.instant('igo.geo.export.gpx.error.poly.title');
803
- const message = translate.instant('igo.geo.export.gpx.error.poly.text');
804
- this.messageService.error(message, title, { timeOut: 20000 });
805
- }
806
- }
807
- else if ((data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma) && data.combineLayers) {
808
- geomTypes.forEach(geomType => geomTypesCSV.push(geomType));
809
- if (layerIndex !== data.layers.length - 1) {
810
- continue;
811
- }
812
- else {
813
- let previousFeature = undefined;
814
- geomTypesCSV.forEach(geomType => {
815
- geomType.features.forEach(currentFeature => {
816
- if (data.separator) {
817
- if (previousFeature) {
818
- if (currentFeature.get('_featureStore').layer.options.title !==
819
- previousFeature.get('_featureStore').layer.options.title) {
820
- const titleEmptyRows = this.createTitleEmptyRows(previousFeature, currentFeature);
821
- featuresCSV.push(titleEmptyRows[2]);
822
- featuresCSV.push(titleEmptyRows[0]);
823
- featuresCSV.push(titleEmptyRows[1]);
824
- }
825
- }
826
- else {
827
- const titleEmptyRows = this.createTitleEmptyRows(currentFeature, currentFeature);
828
- featuresCSV.push(titleEmptyRows[0]);
829
- }
830
- }
831
- featuresCSV.push(currentFeature);
832
- previousFeature = currentFeature;
833
- });
834
- });
835
- }
836
- }
837
- if (geomTypes.length === 0) {
838
- this.loading$.next(false);
839
- const title = translate.instant('igo.geo.export.nothing.title');
840
- const message = translate.instant('igo.geo.export.nothing.text');
841
- this.messageService.error(message, title, { timeOut: 20000 });
842
- }
843
- else {
844
- if (!(data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma) || !data.combineLayers) {
845
- geomTypes.map(geomType => this.exportService.export(geomType.features, data.format, filename + geomType.geometryType, data.encoding, this.map.projection)
846
- .subscribe(() => { }, (error) => this.onFileExportError(error), () => {
847
- this.onFileExportSuccess();
848
- geomType.features.forEach(feature => {
849
- this.circleToPoint(feature);
850
- });
851
- this.loading$.next(false);
852
- }));
853
- }
854
- }
855
- }
856
- ;
857
- if ((data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma) && data.combineLayers) {
858
- this.exportService.export(featuresCSV, data.format, filename, data.encoding, this.map.projection)
859
- .subscribe(() => { }, (error) => this.onFileExportError(error), () => {
860
- this.onFileExportSuccess();
861
- featuresCSV.forEach(feature => {
862
- this.circleToPoint(feature);
863
- });
864
- this.loading$.next(false);
865
- });
866
- }
867
- }
868
- createTitleEmptyRows(previousFeature, currentFeature) {
869
- const titleRow = currentFeature.clone();
870
- const headerRow = currentFeature.clone();
871
- const emptyRow = currentFeature.clone();
872
- const previousFeatureKeys = previousFeature.getKeys();
873
- let firstKeyPrevious = '';
874
- for (const key in previousFeatureKeys) {
875
- if (previousFeatureKeys[key] !== 'geometry') {
876
- firstKeyPrevious = previousFeatureKeys[key];
877
- break;
878
- }
879
- }
880
- const currentFeatureKeys = currentFeature.getKeys();
881
- let firstKeyCurrent = '';
882
- for (const key in currentFeatureKeys) {
883
- if (currentFeatureKeys[key] !== 'geometry') {
884
- firstKeyCurrent = currentFeatureKeys[key];
885
- break;
886
- }
887
- }
888
- const allKeys = currentFeature.getKeys();
889
- previousFeatureKeys.forEach(previousKey => {
890
- if (allKeys.includes(previousKey) && previousKey !== firstKeyPrevious) {
891
- allKeys.push(previousKey);
892
- }
893
- });
894
- allKeys.unshift(firstKeyPrevious);
895
- let firstKeyAll = '';
896
- for (const key in allKeys) {
897
- if (allKeys[key] !== 'geometry') {
898
- firstKeyAll = allKeys[key];
899
- break;
900
- }
901
- }
902
- allKeys.forEach(key => {
903
- const sameKeys = previousFeatureKeys.length === currentFeatureKeys.length &&
904
- previousFeatureKeys.every((value, index) => value === currentFeatureKeys[index]);
905
- if (key === firstKeyAll && !sameKeys) {
906
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title + " ===============>", true);
907
- headerRow.set(key, key, true);
908
- emptyRow.unset(key, true);
909
- }
910
- else if (key === firstKeyAll && sameKeys) {
911
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
912
- headerRow.set(key, key, true);
913
- emptyRow.unset(key, true);
914
- }
915
- else if (key === firstKeyCurrent) {
916
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
917
- headerRow.set(key, key, true);
918
- emptyRow.unset(key, true);
919
- }
920
- else if (key !== 'geometry') {
921
- titleRow.unset(key, true);
922
- headerRow.set(key, key, true);
923
- emptyRow.unset(key, true);
924
- }
925
- else {
926
- titleRow.unset(key, true);
927
- emptyRow.unset(key, true);
928
- }
929
- if (!(currentFeatureKeys.includes(key))) {
930
- headerRow.unset(key, true);
931
- }
932
- });
933
- const titleEmptyRows = [titleRow, headerRow, emptyRow];
934
- return titleEmptyRows;
935
- }
936
- circleToPoint(feature) {
937
- const radius = feature.get('rad');
938
- if (radius) {
939
- const point = new olPoint([feature.get('longitude'), feature.get('latitude')]);
940
- point.transform('EPSG:4326', feature.get('_projection'));
941
- feature.setGeometry(point);
942
- }
943
- }
944
- buildForm() {
945
- this.importForm = this.formBuilder.group({
946
- inputProj: ['', [Validators.required]]
947
- });
948
- if (this.forceNaming) {
949
- this.form = this.formBuilder.group({
950
- format: ['', [Validators.required]],
951
- layers: [[], [Validators.required]],
952
- layersWithSelection: [[]],
953
- encoding: [EncodingFormat.UTF8, [Validators.required]],
954
- combineLayers: [true, [Validators.required]],
955
- separator: [false, [Validators.required]],
956
- featureInMapExtent: [false, [Validators.required]],
957
- name: ['', [Validators.required]]
958
- });
959
- }
960
- else {
961
- this.form = this.formBuilder.group({
962
- format: ['', [Validators.required]],
963
- layers: [[], [Validators.required]],
964
- layersWithSelection: [[]],
965
- encoding: [EncodingFormat.UTF8, [Validators.required]],
966
- combineLayers: [true, [Validators.required]],
967
- separator: [false, [Validators.required]],
968
- featureInMapExtent: [false, [Validators.required]],
969
- });
970
- }
971
- }
972
- onFileImportSuccess(file, features) {
973
- if (!this.config.getConfig('importWithStyle')) {
974
- handleFileImportSuccess(file, features, this.map, this.messageService, this.languageService);
975
- }
976
- else {
977
- handleFileImportSuccess(file, features, this.map, this.messageService, this.languageService, this.styleListService, this.styleService);
978
- }
979
- }
980
- onFileImportError(file, error) {
981
- this.loading$.next(false);
982
- handleFileImportError(file, error, this.messageService, this.languageService, this.fileSizeMb);
983
- }
984
- onPopupBlockedError(preCheck = true) {
985
- this.loading$.next(false);
986
- const translate = this.languageService.translate;
987
- const title = translate.instant('igo.geo.export.popupBlocked.title');
988
- const extraMessage = preCheck ?
989
- translate.instant('igo.geo.export.popupBlocked.selectAgain') :
990
- translate.instant('igo.geo.export.popupBlocked.retry');
991
- const message = translate.instant('igo.geo.export.popupBlocked.text', { extraMessage });
992
- this.messageService.error(message, title, { timeOut: 20000 });
993
- }
994
- onFileExportError(error) {
995
- this.loading$.next(false);
996
- handleFileExportError(error, this.messageService, this.languageService);
997
- }
998
- loadConfig() {
999
- if (this.config.getConfig('importExport.forceNaming') !== undefined) {
1000
- this.forceNaming = this.config.getConfig('importExport.forceNaming');
1001
- }
1002
- this.computeFormats();
1003
- this.loadEncodings();
1004
- }
1005
- encodingDefaultValue(format) {
1006
- if (format === ExportFormat.CSVcomma || format === ExportFormat.CSVsemicolon) {
1007
- this.form.patchValue({ encoding: EncodingFormat.LATIN1 });
1008
- return EncodingFormat.LATIN1;
1009
- }
1010
- else {
1011
- this.form.patchValue({ encoding: EncodingFormat.UTF8 });
1012
- return EncodingFormat.UTF8;
1013
- }
1014
- }
1015
- loadEncodings() {
1016
- this.encodings$.next(EncodingFormat);
1017
- }
1018
- computeFormats(layers) {
1019
- let appliedformats = Object.keys(ExportFormat);
1020
- const formatsType = {
1021
- onlyUrl: false,
1022
- onlyVector: false,
1023
- vectorAndUrl: false,
1024
- customList: false
1025
- };
1026
- const customList = [];
1027
- if (layers && layers.length) {
1028
- layers.forEach((layer) => {
1029
- if (!layer) {
1030
- return;
1031
- }
1032
- if (layer.dataSource.options.download?.allowedFormats) {
1033
- formatsType.customList = true;
1034
- customList.push({ layer: layer.title, formats: this.validateListFormat(layer.dataSource.options.download.allowedFormats) });
1035
- }
1036
- else if (!(layer instanceof VectorLayer) &&
1037
- layer.dataSource.options.download &&
1038
- layer.dataSource.options.download.url) {
1039
- formatsType.onlyUrl = true;
1040
- }
1041
- else if (layer.dataSource.options.download &&
1042
- (layer.dataSource.options.download.url || layer.dataSource.options.download.dynamicUrl)) {
1043
- formatsType.vectorAndUrl = true;
1044
- }
1045
- else if (layer instanceof VectorLayer) {
1046
- formatsType.onlyVector = true;
1047
- }
1048
- });
1049
- if (formatsType.onlyUrl === true && formatsType.onlyVector === false) {
1050
- appliedformats = ['URL'];
1051
- }
1052
- else if (formatsType.onlyVector === true &&
1053
- formatsType.onlyUrl === false) {
1054
- this.computeFormats(); // reset
1055
- if (ExportFormat.URL in this.formats$.value) {
1056
- const keys = Object.keys(this.formats$.value).filter((key) => key !== 'URL');
1057
- appliedformats = keys;
1058
- }
1059
- }
1060
- else if (formatsType.vectorAndUrl === true &&
1061
- formatsType.onlyUrl === false &&
1062
- formatsType.onlyVector === false) {
1063
- this.computeFormats(); // reset
1064
- if (!(ExportFormat.URL in this.formats$.value)) {
1065
- const keys = Object.keys(this.formats$.value);
1066
- keys.push('URL');
1067
- appliedformats = keys;
1068
- }
1069
- }
1070
- }
1071
- if (this.config.getConfig('importExport.formats') !== undefined) {
1072
- const validatedListFormat = this.validateListFormat(this.config.getConfig('importExport.formats'));
1073
- appliedformats = validatedListFormat;
1074
- }
1075
- if (formatsType.customList) {
1076
- let commonFormats;
1077
- const layersWithCustomFormats = [];
1078
- let previousCustomListFormats = customList[0].formats;
1079
- customList.map(list => {
1080
- layersWithCustomFormats.push(list.layer);
1081
- commonFormats = list.formats.filter(value => previousCustomListFormats.includes(value));
1082
- previousCustomListFormats = list.formats;
1083
- });
1084
- const finalFormats = commonFormats.filter(value => appliedformats.includes(value));
1085
- if (finalFormats.length > 0) {
1086
- this.formats$.next(strEnum(finalFormats));
1087
- if (layers && layers.length) {
1088
- if (layers.length > 1) {
1089
- this.messageService.alert(this.languageService.translate.instant('igo.geo.export.customList.text', { value: layersWithCustomFormats.join() }), this.languageService.translate.instant('igo.geo.export.customList.title'));
1090
- }
1091
- }
1092
- }
1093
- else {
1094
- this.formats$.next([]);
1095
- this.messageService.alert(this.languageService.translate.instant('igo.geo.export.noFormat.text'), this.languageService.translate.instant('igo.geo.export.noFormat.title'));
1096
- }
1097
- return;
1098
- }
1099
- else {
1100
- this.formats$.next(strEnum(appliedformats));
1101
- }
1102
- }
1103
- validateListFormat(formats) {
1104
- return formats
1105
- .filter((format) => {
1106
- if (format.toUpperCase() === ExportFormat.CSVcomma.toUpperCase() ||
1107
- format.toUpperCase() === ExportFormat.CSVsemicolon.toUpperCase() ||
1108
- format.toUpperCase() === ExportFormat.GML.toUpperCase() ||
1109
- format.toUpperCase() === ExportFormat.GPX.toUpperCase() ||
1110
- format.toUpperCase() === ExportFormat.GeoJSON.toUpperCase() ||
1111
- format.toUpperCase() === ExportFormat.KML.toUpperCase() ||
1112
- format.toUpperCase() === ExportFormat.Shapefile.toUpperCase() ||
1113
- format.toUpperCase() === ExportFormat.URL.toUpperCase()) {
1114
- return format;
1115
- }
1116
- })
1117
- .map((format) => {
1118
- if (format.toUpperCase() === ExportFormat.CSVcomma.toUpperCase()) {
1119
- format = ExportFormat.CSVcomma;
1120
- return format;
1121
- }
1122
- if (format.toUpperCase() === ExportFormat.CSVsemicolon.toUpperCase()) {
1123
- format = ExportFormat.CSVsemicolon;
1124
- return format;
1125
- }
1126
- if (format.toUpperCase() === ExportFormat.GML.toUpperCase()) {
1127
- format = ExportFormat.GML;
1128
- return format;
1129
- }
1130
- if (format.toUpperCase() === ExportFormat.GPX.toUpperCase()) {
1131
- format = ExportFormat.GPX;
1132
- return format;
1133
- }
1134
- if (format.toUpperCase() === ExportFormat.GeoJSON.toUpperCase()) {
1135
- format = ExportFormat.GeoJSON;
1136
- return format;
1137
- }
1138
- if (format.toUpperCase() === ExportFormat.KML.toUpperCase()) {
1139
- format = ExportFormat.KML;
1140
- return format;
1141
- }
1142
- if (format.toUpperCase() === ExportFormat.Shapefile.toUpperCase()) {
1143
- format = ExportFormat.Shapefile;
1144
- return format;
1145
- }
1146
- if (format.toUpperCase() === ExportFormat.URL.toUpperCase()) {
1147
- format = ExportFormat.URL;
1148
- return format;
1149
- }
1150
- });
1151
- }
1152
- modeChanged(mode) {
1153
- this.selectMode.emit(mode);
1154
- }
1155
- onFileExportSuccess() {
1156
- handleFileExportSuccess(this.messageService, this.languageService);
1157
- }
1158
- onImportExportChange(event) {
1159
- this.selectedMode = event.value;
1160
- }
1161
- }
1162
- ImportExportComponent.ɵfac = function ImportExportComponent_Factory(t) { return new (t || ImportExportComponent)(i0.ɵɵdirectiveInject(i1.ImportService), i0.ɵɵdirectiveInject(i2.ExportService), i0.ɵɵdirectiveInject(i3.LanguageService), i0.ɵɵdirectiveInject(i3.MessageService), i0.ɵɵdirectiveInject(i4.StyleListService), i0.ɵɵdirectiveInject(i5.StyleService), i0.ɵɵdirectiveInject(i6.UntypedFormBuilder), i0.ɵɵdirectiveInject(i3.ConfigService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.StorageService), i0.ɵɵdirectiveInject(i7.DownloadService)); };
1163
- ImportExportComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ImportExportComponent, selectors: [["igo-import-export"]], inputs: { selectFirstProj: "selectFirstProj", map: "map", projectionsLimitations: "projectionsLimitations", store: "store", selectedMode: "selectedMode", exportOptions$: "exportOptions$" }, outputs: { selectMode: "selectMode", exportOptionsChange: "exportOptionsChange" }, decls: 14, vars: 17, consts: [[1, "import-export-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], ["class", "igo-form", 3, "formGroup", 4, "ngIf"], ["class", "mat-typography", 4, "ngIf"], [1, "igo-form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], [3, "value", "click", 4, "ngFor", "ngForOf"], ["tooltip-position", "below", "matTooltipShowDelay", "500", 1, "igo-form-button-group", 3, "matTooltip"], ["mat-raised-button", "", "type", "button", 3, "disabled", "click"], [3, "shown"], ["hidden", "", "type", "file", 3, "click", "change"], ["fileInput", ""], [3, "value", "click"], ["mat-line", "", 4, "ngIf"], ["mat-line", ""], [1, "mat-typography"], [4, "ngIf"], ["class", "mat-typography", 3, "html", 4, "ngIf"], [1, "mat-typography", 3, "html"], ["multiple", "", 3, "value", "valueChange"], ["class", "export-select-trigger", 4, "ngIf"], [3, "ngClass", "value", "click", 4, "ngFor", "ngForOf"], ["formControlName", "format"], ["disabled", "true", 4, "ngIf"], ["class", "igo-input-container", 4, "ngIf"], ["class", "export-combine-layers mat-typography", 4, "ngIf"], ["class", "export-separator mat-typography", 4, "ngIf"], ["class", "export-options mat-typography", 4, "ngIf"], [1, "igo-form-button-group"], [1, "export-select-trigger"], [3, "ngClass", "value", "click"], [3, "labelPosition", "click", "checked", "change", 4, "ngIf"], [3, "labelPosition", "click", "checked", "change"], [3, "value", 4, "ngFor", "ngForOf"], ["disabled", "true"], ["matInput", "", "formControlName", "name", 3, "placeholder"], ["formControlName", "encoding"], [1, "export-combine-layers", "mat-typography"], ["formControlName", "combineLayers", 3, "labelPosition"], [1, "export-separator", "mat-typography"], ["formControlName", "separator", 3, "labelPosition"], [1, "export-options", "mat-typography"], ["formControlName", "featureInMapExtent", 3, "labelPosition"]], template: function ImportExportComponent_Template(rf, ctx) { if (rf & 1) {
1164
- i0.ɵɵelementStart(0, "div", 0)(1, "mat-button-toggle-group", 1);
1165
- i0.ɵɵlistener("change", function ImportExportComponent_Template_mat_button_toggle_group_change_1_listener($event) { return ctx.onImportExportChange($event); });
1166
- i0.ɵɵelementStart(2, "mat-button-toggle", 2);
1167
- i0.ɵɵtext(3);
1168
- i0.ɵɵpipe(4, "translate");
1169
- i0.ɵɵelementEnd();
1170
- i0.ɵɵelementStart(5, "mat-button-toggle", 2);
1171
- i0.ɵɵtext(6);
1172
- i0.ɵɵpipe(7, "translate");
1173
- i0.ɵɵelementEnd()()();
1174
- i0.ɵɵtemplate(8, ImportExportComponent_form_8_Template, 20, 24, "form", 3);
1175
- i0.ɵɵtemplate(9, ImportExportComponent_section_9_Template, 3, 2, "section", 4);
1176
- i0.ɵɵtemplate(10, ImportExportComponent_section_10_Template, 4, 3, "section", 4);
1177
- i0.ɵɵpipe(11, "async");
1178
- i0.ɵɵtemplate(12, ImportExportComponent_form_12_Template, 37, 38, "form", 3);
1179
- i0.ɵɵpipe(13, "async");
1180
- } if (rf & 2) {
1181
- i0.ɵɵadvance(1);
1182
- i0.ɵɵproperty("value", ctx.selectedMode);
1183
- i0.ɵɵadvance(1);
1184
- i0.ɵɵproperty("value", "import");
1185
- i0.ɵɵadvance(1);
1186
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 9, "igo.geo.importExportForm.importTabTitle"), " ");
1187
- i0.ɵɵadvance(2);
1188
- i0.ɵɵproperty("value", "export");
1189
- i0.ɵɵadvance(1);
1190
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(7, 11, "igo.geo.importExportForm.exportTabTitle"), " ");
1191
- i0.ɵɵadvance(2);
1192
- i0.ɵɵproperty("ngIf", ctx.selectedMode === "import");
1193
- i0.ɵɵadvance(1);
1194
- i0.ɵɵproperty("ngIf", ctx.selectedMode === "import");
1195
- i0.ɵɵadvance(1);
1196
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(11, 13, ctx.exportableLayers$).length === 0 && ctx.selectedMode === "export");
1197
- i0.ɵɵadvance(2);
1198
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(13, 15, ctx.exportableLayers$).length > 0 && ctx.selectedMode === "export");
1199
- } }, dependencies: [i8.MatTooltip, i6.ɵNgNoValidate, i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgControlStatusGroup, i6.FormGroupDirective, i6.FormControlName, i9.NgClass, i9.NgForOf, i9.NgIf, i10.MatButton, i11.MatButtonToggleGroup, i11.MatButtonToggle, i12.MatFormField, i12.MatLabel, i13.MatSelect, i13.MatSelectTrigger, i14.MatOption, i15.MatInput, i16.MatSlideToggle, i17.SpinnerComponent, i17.CustomHtmlComponent, i9.AsyncPipe, i18.TranslatePipe, i17.KeyValuePipe], styles: ["mat-option.igo-export-layer-mat-option[_ngcontent-%COMP%]{height:5em;line-height:1em}.import-export-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.import-export-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.import-export-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:50%}h4[_ngcontent-%COMP%]{padding:0 5px}.igo-form[_ngcontent-%COMP%]{padding:15px 5px}.igo-input-container[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.igo-form-button-group[_ngcontent-%COMP%]{text-align:center;padding-top:10px}igo-spinner[_ngcontent-%COMP%]{position:absolute;padding-left:10px}.export-options[_ngcontent-%COMP%], .export-combine-layers[_ngcontent-%COMP%], .export-separator[_ngcontent-%COMP%]{overflow-x:hidden}.export-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%], .export-combine-layers[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%], .export-separator[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.export-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content, .export-combine-layers[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content, .export-separator[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.export-select-trigger[_ngcontent-%COMP%]{opacity:.75;font-size:.75em}"] });
1200
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ImportExportComponent, [{
1201
- type: Component,
1202
- args: [{ selector: 'igo-import-export', template: "<div class=\"import-export-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"selectedMode\"\n (change)=\"onImportExportChange($event)\">\n <mat-button-toggle [value]=\"'import'\">\n {{'igo.geo.importExportForm.importTabTitle' | translate}}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{'igo.geo.importExportForm.exportTabTitle' | translate}}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<form class=\"igo-form\" [formGroup]=\"importForm\" *ngIf=\"selectedMode === 'import'\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.importProjPlaceholder' | translate}}</mat-label>\n <mat-select\n [(value)]=\"inputProj\">\n <mat-option\n *ngFor=\"let projection of (projections$ | async)\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\">\n <p mat-line *ngIf=\"projection.translateKey\">{{('igo.geo.importExportForm.projections.' + projection.translateKey) | translate: projection}}</p>\n <p mat-line *ngIf=\"!projection.translateKey\">{{projection.alias}}</p>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"importForm.invalid ? ('igo.geo.importExportForm.projections.choose' | translate) : ('igo.geo.importExportForm.importButton' | translate)\"\n class=\"igo-form-button-group\">\n <button\n [disabled]=\"importForm.invalid || (loading$ | async)\"\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\">\n {{'igo.geo.importExportForm.importButton' | translate}}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n hidden\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($event.target.files)\">\n </div>\n</form>\n<section class=\"mat-typography\" *ngIf=\"selectedMode === 'import'\">\n <div *ngIf=\"importHtmlClarifications === ''\">\n <h4>{{'igo.geo.importExportForm.importClarifications' | translate}}</h4>\n <ul>\n <li>{{'igo.geo.importExportForm.importSizeMax' | translate: {size: fileSizeMb} }}</li>\n <li>{{'igo.geo.importExportForm.importFormatAuthorized' | translate}}</li>\n <li>{{'igo.geo.importExportForm.importShpZip' | translate}}</li>\n </ul>\n </div>\n <igo-custom-html *ngIf=\"importHtmlClarifications !== ''\" class=\"mat-typography\"\n [html]=\"importHtmlClarifications\">\n </igo-custom-html>\n</section>\n\n<section class=\"mat-typography\" *ngIf=\"(exportableLayers$ | async).length === 0 && selectedMode === 'export'\">\n <h4>{{'igo.geo.importExportForm.exportNoLayersExportable' | translate}}</h4>\n</section>\n\n<form class=\"igo-form\" [formGroup]=\"form\" *ngIf=\"(exportableLayers$ | async).length > 0 && selectedMode === 'export'\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.exportLayerPlaceholder' | translate}}</mat-label>\n <mat-select\n [(value)]=\"layers\" multiple>\n <mat-select-trigger>\n {{layers.length ? getLayerTitleById(layers[0]) : ''}}\n <span *ngIf=\"layers.length > 1\" class=\"export-select-trigger\">\n (+{{layers.length - 1}} {{(layers?.length === 2 ? 'igo.geo.importExportForm.other' : 'igo.geo.importExportForm.others') | translate }})\n </span>\n </mat-select-trigger>\n <mat-option\n *ngFor=\"let layer of (exportableLayers$ | async)\"\n [ngClass]=\"{'igo-export-layer-mat-option': layerHasSelectedFeatures(layer)}\"\n [value]=\"layer.id\"\n (click)=\"$event.stopPropagation()\">\n <p mat-line>{{layer.title}}</p>\n <p mat-line>\n <mat-slide-toggle *ngIf=\"layerHasSelectedFeatures(layer)\"\n [labelPosition]=\"'after'\"\n (click)=\"onlySelectedClick($event,layer.id)\"\n (checked)=\"inLayersIdToExportSelectionOnly(layer)\"\n (change)=\"onlySelected($event,layer.id)\">\n <small>{{'igo.geo.importExportForm.exportSelectedFeature' | translate}}</small>\n </mat-slide-toggle>\n </p>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.exportFormatPlaceholder' | translate}}</mat-label>\n <mat-select\n formControlName=\"format\">\n <ng-container *ngIf=\"(formats$ | async).length !== 0\">\n <mat-option *ngFor=\"let format of (formats$ | async) | keyvalue\" [value]=\"format.key\">\n {{'igo.geo.export.format.' + format.value | translate}}\n </mat-option>\n </ng-container>\n <mat-option *ngIf=\"(formats$ | async).length === 0\" disabled=\"true\">\n {{'igo.geo.export.noFormat.title' | translate}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\" *ngIf=\"forceNaming && form.value.format !== 'URL'\">\n <mat-form-field>\n <input matInput formControlName=\"name\" placeholder=\"{{'igo.geo.importExportForm.exportFileNamePlaceholder' | translate}}\">\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\" *ngIf=\"form.value.format === 'CSVcomma' || form.value.format === 'CSVsemicolon'\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.encodingPlaceholder' | translate}}</mat-label>\n <mat-select\n formControlName=\"encoding\">\n <ng-container *ngIf=\"(encodings$ | async).length !== 0\">\n <mat-option *ngFor=\"let encoding of (encodings$ | async) | keyvalue\" [value]=\"encoding.key\">\n {{'igo.geo.export.encoding.' + encoding.value | translate}}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"export-combine-layers mat-typography\" *ngIf=\"layers.length > 1 && (form.value.format === 'CSVcomma' || form.value.format === 'CSVsemicolon')\">\n <mat-slide-toggle\n formControlName=\"combineLayers\"\n [labelPosition]=\"'before'\">\n {{'igo.geo.importExportForm.exportCombineResults' | translate}}\n </mat-slide-toggle>\n </div>\n\n <div class=\"export-separator mat-typography\" *ngIf=\"layers.length > 1 && (form.value.format === 'CSVcomma' || form.value.format === 'CSVsemicolon') && form.value.combineLayers\">\n <mat-slide-toggle\n formControlName=\"separator\"\n [labelPosition]=\"'before'\">\n {{'igo.geo.importExportForm.exportSeparator' | translate}}\n </mat-slide-toggle>\n </div>\n\n <div class=\"export-options mat-typography\" *ngIf=\"form.value.format !== 'URL'\">\n <mat-slide-toggle\n formControlName=\"featureInMapExtent\"\n [labelPosition]=\"'before'\">\n {{'igo.geo.importExportForm.exportFeatureInExtent' | translate}}\n </mat-slide-toggle>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\">\n {{form.value.format !== 'URL' ? ('igo.geo.importExportForm.exportButton' | translate): (form.value.layers.length > 1 ? ('igo.geo.importExportForm.exportButtonLinks' | translate): ('igo.geo.importExportForm.exportButtonLink' | translate))}}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n\n <igo-custom-html *ngIf=\"exportHtmlClarifications !== ''\" class=\"mat-typography\"\n [html]=\"exportHtmlClarifications\">\n </igo-custom-html>\n\n</form>\n", styles: ["mat-option.igo-export-layer-mat-option{height:5em;line-height:1em}.import-export-toggle{padding:10px;text-align:center}.import-export-toggle mat-button-toggle-group{width:100%}.import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}h4{padding:0 5px}.igo-form{padding:15px 5px}.igo-input-container mat-form-field{width:100%}.igo-form-button-group{text-align:center;padding-top:10px}igo-spinner{position:absolute;padding-left:10px}.export-options,.export-combine-layers,.export-separator{overflow-x:hidden}.export-options mat-slide-toggle,.export-combine-layers mat-slide-toggle,.export-separator mat-slide-toggle{width:100%;margin:10px}.export-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content,.export-combine-layers mat-slide-toggle ::ng-deep .mat-slide-toggle-content,.export-separator mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.export-select-trigger{opacity:.75;font-size:.75em}\n"] }]
1203
- }], function () { return [{ type: i1.ImportService }, { type: i2.ExportService }, { type: i3.LanguageService }, { type: i3.MessageService }, { type: i4.StyleListService }, { type: i5.StyleService }, { type: i6.UntypedFormBuilder }, { type: i3.ConfigService }, { type: i0.ChangeDetectorRef }, { type: i3.StorageService }, { type: i7.DownloadService }]; }, { selectFirstProj: [{
1204
- type: Input
1205
- }], map: [{
1206
- type: Input
1207
- }], projectionsLimitations: [{
1208
- type: Input
1209
- }], store: [{
1210
- type: Input
1211
- }], selectedMode: [{
1212
- type: Input
1213
- }], selectMode: [{
1214
- type: Output
1215
- }], exportOptions$: [{
1216
- type: Input
1217
- }], exportOptionsChange: [{
1218
- type: Output
1219
- }] }); })();
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { strEnum } from '@igo2/utils';
5
+ import { ClusterDataSource } from '../../datasource/shared/datasources/cluster-datasource';
6
+ import { VectorLayer } from '../../layer/shared/layers/vector-layer';
7
+ import olPoint from 'ol/geom/Point';
8
+ import { circular } from 'ol/geom/Polygon';
9
+ import { handleFileExportError, handleFileExportSuccess } from '../shared/export.utils';
10
+ import { ExportFormat, EncodingFormat } from '../shared/export.type';
11
+ import { ExportService } from '../shared/export.service';
12
+ import { handleFileImportSuccess, handleFileImportError } from '../shared/import.utils';
13
+ import { skipWhile } from 'rxjs/operators';
14
+ import { computeProjectionsConstraints } from '../../map';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../shared/import.service";
17
+ import * as i2 from "../shared/export.service";
18
+ import * as i3 from "@igo2/core";
19
+ import * as i4 from "../style-list/style-list.service";
20
+ import * as i5 from "../../layer/shared/style.service";
21
+ import * as i6 from "@angular/forms";
22
+ import * as i7 from "../../download/shared/download.service";
23
+ import * as i8 from "@angular/material/tooltip";
24
+ import * as i9 from "@angular/common";
25
+ import * as i10 from "@angular/material/button";
26
+ import * as i11 from "@angular/material/button-toggle";
27
+ import * as i12 from "@angular/material/form-field";
28
+ import * as i13 from "@angular/material/select";
29
+ import * as i14 from "@angular/material/core";
30
+ import * as i15 from "@angular/material/input";
31
+ import * as i16 from "@angular/material/slide-toggle";
32
+ import * as i17 from "@igo2/common";
33
+ import * as i18 from "@ngx-translate/core";
34
+ function ImportExportComponent_form_8_mat_option_7_p_1_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "p", 16);
36
+ i0.ɵɵtext(1);
37
+ i0.ɵɵpipe(2, "translate");
38
+ i0.ɵɵelementEnd();
39
+ } if (rf & 2) {
40
+ const projection_r6 = i0.ɵɵnextContext().$implicit;
41
+ i0.ɵɵadvance(1);
42
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, "igo.geo.importExportForm.projections." + projection_r6.translateKey, projection_r6));
43
+ } }
44
+ function ImportExportComponent_form_8_mat_option_7_p_2_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "p", 16);
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const projection_r6 = i0.ɵɵnextContext().$implicit;
50
+ i0.ɵɵadvance(1);
51
+ i0.ɵɵtextInterpolate(projection_r6.alias);
52
+ } }
53
+ function ImportExportComponent_form_8_mat_option_7_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelementStart(0, "mat-option", 14);
55
+ i0.ɵɵlistener("click", function ImportExportComponent_form_8_mat_option_7_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
56
+ i0.ɵɵtemplate(1, ImportExportComponent_form_8_mat_option_7_p_1_Template, 3, 4, "p", 15);
57
+ i0.ɵɵtemplate(2, ImportExportComponent_form_8_mat_option_7_p_2_Template, 2, 1, "p", 15);
58
+ i0.ɵɵelementEnd();
59
+ } if (rf & 2) {
60
+ const projection_r6 = ctx.$implicit;
61
+ i0.ɵɵproperty("value", projection_r6);
62
+ i0.ɵɵadvance(1);
63
+ i0.ɵɵproperty("ngIf", projection_r6.translateKey);
64
+ i0.ɵɵadvance(1);
65
+ i0.ɵɵproperty("ngIf", !projection_r6.translateKey);
66
+ } }
67
+ function ImportExportComponent_form_8_Template(rf, ctx) { if (rf & 1) {
68
+ const _r13 = i0.ɵɵgetCurrentView();
69
+ i0.ɵɵelementStart(0, "form", 5)(1, "div", 6)(2, "mat-form-field")(3, "mat-label");
70
+ i0.ɵɵtext(4);
71
+ i0.ɵɵpipe(5, "translate");
72
+ i0.ɵɵelementEnd();
73
+ i0.ɵɵelementStart(6, "mat-select", 7);
74
+ i0.ɵɵlistener("valueChange", function ImportExportComponent_form_8_Template_mat_select_valueChange_6_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.inputProj = $event); });
75
+ i0.ɵɵtemplate(7, ImportExportComponent_form_8_mat_option_7_Template, 3, 3, "mat-option", 8);
76
+ i0.ɵɵpipe(8, "async");
77
+ i0.ɵɵelementEnd()()();
78
+ i0.ɵɵelementStart(9, "div", 9);
79
+ i0.ɵɵpipe(10, "translate");
80
+ i0.ɵɵpipe(11, "translate");
81
+ i0.ɵɵelementStart(12, "button", 10);
82
+ i0.ɵɵlistener("click", function ImportExportComponent_form_8_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r13); const _r5 = i0.ɵɵreference(19); return i0.ɵɵresetView(_r5.click()); });
83
+ i0.ɵɵpipe(13, "async");
84
+ i0.ɵɵtext(14);
85
+ i0.ɵɵpipe(15, "translate");
86
+ i0.ɵɵelementEnd();
87
+ i0.ɵɵelement(16, "igo-spinner", 11);
88
+ i0.ɵɵpipe(17, "async");
89
+ i0.ɵɵelementStart(18, "input", 12, 13);
90
+ i0.ɵɵlistener("click", function ImportExportComponent_form_8_Template_input_click_18_listener() { i0.ɵɵrestoreView(_r13); const _r5 = i0.ɵɵreference(19); return i0.ɵɵresetView(_r5.value = null); })("change", function ImportExportComponent_form_8_Template_input_change_18_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r16 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r16.importFiles($event.target.files)); });
91
+ i0.ɵɵelementEnd()()();
92
+ } if (rf & 2) {
93
+ const ctx_r0 = i0.ɵɵnextContext();
94
+ i0.ɵɵproperty("formGroup", ctx_r0.importForm);
95
+ i0.ɵɵadvance(4);
96
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 10, "igo.geo.importExportForm.importProjPlaceholder"));
97
+ i0.ɵɵadvance(2);
98
+ i0.ɵɵproperty("value", ctx_r0.inputProj);
99
+ i0.ɵɵadvance(1);
100
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(8, 12, ctx_r0.projections$));
101
+ i0.ɵɵadvance(2);
102
+ i0.ɵɵproperty("matTooltip", ctx_r0.importForm.invalid ? i0.ɵɵpipeBind1(10, 14, "igo.geo.importExportForm.projections.choose") : i0.ɵɵpipeBind1(11, 16, "igo.geo.importExportForm.importButton"));
103
+ i0.ɵɵadvance(3);
104
+ i0.ɵɵproperty("disabled", ctx_r0.importForm.invalid || i0.ɵɵpipeBind1(13, 18, ctx_r0.loading$));
105
+ i0.ɵɵadvance(2);
106
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(15, 20, "igo.geo.importExportForm.importButton"), " ");
107
+ i0.ɵɵadvance(2);
108
+ i0.ɵɵproperty("shown", i0.ɵɵpipeBind1(17, 22, ctx_r0.loading$));
109
+ i0.ɵɵadvance(2);
110
+ i0.ɵɵstyleProp("display", "none");
111
+ } }
112
+ const _c0 = function (a0) { return { size: a0 }; };
113
+ function ImportExportComponent_section_9_div_1_Template(rf, ctx) { if (rf & 1) {
114
+ i0.ɵɵelementStart(0, "div")(1, "h4");
115
+ i0.ɵɵtext(2);
116
+ i0.ɵɵpipe(3, "translate");
117
+ i0.ɵɵelementEnd();
118
+ i0.ɵɵelementStart(4, "ul")(5, "li");
119
+ i0.ɵɵtext(6);
120
+ i0.ɵɵpipe(7, "translate");
121
+ i0.ɵɵelementEnd();
122
+ i0.ɵɵelementStart(8, "li");
123
+ i0.ɵɵtext(9);
124
+ i0.ɵɵpipe(10, "translate");
125
+ i0.ɵɵelementEnd();
126
+ i0.ɵɵelementStart(11, "li");
127
+ i0.ɵɵtext(12);
128
+ i0.ɵɵpipe(13, "translate");
129
+ i0.ɵɵelementEnd()()();
130
+ } if (rf & 2) {
131
+ const ctx_r17 = i0.ɵɵnextContext(2);
132
+ i0.ɵɵadvance(2);
133
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 4, "igo.geo.importExportForm.importClarifications"));
134
+ i0.ɵɵadvance(4);
135
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(7, 6, "igo.geo.importExportForm.importSizeMax", i0.ɵɵpureFunction1(13, _c0, ctx_r17.fileSizeMb)));
136
+ i0.ɵɵadvance(3);
137
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 9, "igo.geo.importExportForm.importFormatAuthorized"));
138
+ i0.ɵɵadvance(3);
139
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 11, "igo.geo.importExportForm.importShpZip"));
140
+ } }
141
+ function ImportExportComponent_section_9_igo_custom_html_2_Template(rf, ctx) { if (rf & 1) {
142
+ i0.ɵɵelement(0, "igo-custom-html", 20);
143
+ } if (rf & 2) {
144
+ const ctx_r18 = i0.ɵɵnextContext(2);
145
+ i0.ɵɵproperty("html", ctx_r18.importHtmlClarifications);
146
+ } }
147
+ function ImportExportComponent_section_9_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵelementStart(0, "section", 17);
149
+ i0.ɵɵtemplate(1, ImportExportComponent_section_9_div_1_Template, 14, 15, "div", 18);
150
+ i0.ɵɵtemplate(2, ImportExportComponent_section_9_igo_custom_html_2_Template, 1, 1, "igo-custom-html", 19);
151
+ i0.ɵɵelementEnd();
152
+ } if (rf & 2) {
153
+ const ctx_r1 = i0.ɵɵnextContext();
154
+ i0.ɵɵadvance(1);
155
+ i0.ɵɵproperty("ngIf", ctx_r1.importHtmlClarifications === "");
156
+ i0.ɵɵadvance(1);
157
+ i0.ɵɵproperty("ngIf", ctx_r1.importHtmlClarifications !== "");
158
+ } }
159
+ function ImportExportComponent_section_10_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "section", 17)(1, "h4");
161
+ i0.ɵɵtext(2);
162
+ i0.ɵɵpipe(3, "translate");
163
+ i0.ɵɵelementEnd()();
164
+ } if (rf & 2) {
165
+ i0.ɵɵadvance(2);
166
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 1, "igo.geo.importExportForm.exportNoLayersExportable"));
167
+ } }
168
+ function ImportExportComponent_form_12_span_9_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "span", 31);
170
+ i0.ɵɵtext(1);
171
+ i0.ɵɵpipe(2, "translate");
172
+ i0.ɵɵelementEnd();
173
+ } if (rf & 2) {
174
+ const ctx_r19 = i0.ɵɵnextContext(2);
175
+ i0.ɵɵadvance(1);
176
+ i0.ɵɵtextInterpolate2(" (+", ctx_r19.layers.length - 1, " ", i0.ɵɵpipeBind1(2, 2, (ctx_r19.layers == null ? null : ctx_r19.layers.length) === 2 ? "igo.geo.importExportForm.other" : "igo.geo.importExportForm.others"), ") ");
177
+ } }
178
+ function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template(rf, ctx) { if (rf & 1) {
179
+ const _r33 = i0.ɵɵgetCurrentView();
180
+ i0.ɵɵelementStart(0, "mat-slide-toggle", 34);
181
+ i0.ɵɵlistener("click", function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template_mat_slide_toggle_click_0_listener($event) { i0.ɵɵrestoreView(_r33); const layer_r29 = i0.ɵɵnextContext().$implicit; const ctx_r31 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r31.onlySelectedClick($event, layer_r29.id)); })("checked", function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template_mat_slide_toggle_checked_0_listener() { i0.ɵɵrestoreView(_r33); const layer_r29 = i0.ɵɵnextContext().$implicit; const ctx_r34 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r34.inLayersIdToExportSelectionOnly(layer_r29)); })("change", function ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template_mat_slide_toggle_change_0_listener($event) { i0.ɵɵrestoreView(_r33); const layer_r29 = i0.ɵɵnextContext().$implicit; const ctx_r36 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r36.onlySelected($event, layer_r29.id)); });
182
+ i0.ɵɵelementStart(1, "small");
183
+ i0.ɵɵtext(2);
184
+ i0.ɵɵpipe(3, "translate");
185
+ i0.ɵɵelementEnd()();
186
+ } if (rf & 2) {
187
+ i0.ɵɵproperty("labelPosition", "after");
188
+ i0.ɵɵadvance(2);
189
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportSelectedFeature"));
190
+ } }
191
+ const _c1 = function (a0) { return { "igo-export-layer-mat-option": a0 }; };
192
+ function ImportExportComponent_form_12_mat_option_10_Template(rf, ctx) { if (rf & 1) {
193
+ i0.ɵɵelementStart(0, "mat-option", 32);
194
+ i0.ɵɵlistener("click", function ImportExportComponent_form_12_mat_option_10_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
195
+ i0.ɵɵelementStart(1, "p", 16);
196
+ i0.ɵɵtext(2);
197
+ i0.ɵɵelementEnd();
198
+ i0.ɵɵelementStart(3, "p", 16);
199
+ i0.ɵɵtemplate(4, ImportExportComponent_form_12_mat_option_10_mat_slide_toggle_4_Template, 4, 4, "mat-slide-toggle", 33);
200
+ i0.ɵɵelementEnd()();
201
+ } if (rf & 2) {
202
+ const layer_r29 = ctx.$implicit;
203
+ const ctx_r20 = i0.ɵɵnextContext(2);
204
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c1, ctx_r20.layerHasSelectedFeatures(layer_r29)))("value", layer_r29.id);
205
+ i0.ɵɵadvance(2);
206
+ i0.ɵɵtextInterpolate(layer_r29.title);
207
+ i0.ɵɵadvance(2);
208
+ i0.ɵɵproperty("ngIf", ctx_r20.layerHasSelectedFeatures(layer_r29));
209
+ } }
210
+ function ImportExportComponent_form_12_ng_container_18_mat_option_1_Template(rf, ctx) { if (rf & 1) {
211
+ i0.ɵɵelementStart(0, "mat-option", 2);
212
+ i0.ɵɵtext(1);
213
+ i0.ɵɵpipe(2, "translate");
214
+ i0.ɵɵelementEnd();
215
+ } if (rf & 2) {
216
+ const format_r40 = ctx.$implicit;
217
+ i0.ɵɵproperty("value", format_r40.key);
218
+ i0.ɵɵadvance(1);
219
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "igo.geo.export.format." + format_r40.value), " ");
220
+ } }
221
+ function ImportExportComponent_form_12_ng_container_18_Template(rf, ctx) { if (rf & 1) {
222
+ i0.ɵɵelementContainerStart(0);
223
+ i0.ɵɵtemplate(1, ImportExportComponent_form_12_ng_container_18_mat_option_1_Template, 3, 4, "mat-option", 35);
224
+ i0.ɵɵpipe(2, "keyvalue");
225
+ i0.ɵɵpipe(3, "async");
226
+ i0.ɵɵelementContainerEnd();
227
+ } if (rf & 2) {
228
+ const ctx_r21 = i0.ɵɵnextContext(2);
229
+ i0.ɵɵadvance(1);
230
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, i0.ɵɵpipeBind1(3, 3, ctx_r21.formats$)));
231
+ } }
232
+ function ImportExportComponent_form_12_mat_option_20_Template(rf, ctx) { if (rf & 1) {
233
+ i0.ɵɵelementStart(0, "mat-option", 36);
234
+ i0.ɵɵtext(1);
235
+ i0.ɵɵpipe(2, "translate");
236
+ i0.ɵɵelementEnd();
237
+ } if (rf & 2) {
238
+ i0.ɵɵadvance(1);
239
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "igo.geo.export.noFormat.title"), " ");
240
+ } }
241
+ function ImportExportComponent_form_12_div_22_Template(rf, ctx) { if (rf & 1) {
242
+ i0.ɵɵelementStart(0, "div", 6)(1, "mat-form-field");
243
+ i0.ɵɵelement(2, "input", 37);
244
+ i0.ɵɵpipe(3, "translate");
245
+ i0.ɵɵelementEnd()();
246
+ } if (rf & 2) {
247
+ i0.ɵɵadvance(2);
248
+ i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(3, 1, "igo.geo.importExportForm.exportFileNamePlaceholder"));
249
+ } }
250
+ function ImportExportComponent_form_12_div_23_ng_container_6_mat_option_1_Template(rf, ctx) { if (rf & 1) {
251
+ i0.ɵɵelementStart(0, "mat-option", 2);
252
+ i0.ɵɵtext(1);
253
+ i0.ɵɵpipe(2, "translate");
254
+ i0.ɵɵelementEnd();
255
+ } if (rf & 2) {
256
+ const encoding_r43 = ctx.$implicit;
257
+ i0.ɵɵproperty("value", encoding_r43.key);
258
+ i0.ɵɵadvance(1);
259
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "igo.geo.export.encoding." + encoding_r43.value), " ");
260
+ } }
261
+ function ImportExportComponent_form_12_div_23_ng_container_6_Template(rf, ctx) { if (rf & 1) {
262
+ i0.ɵɵelementContainerStart(0);
263
+ i0.ɵɵtemplate(1, ImportExportComponent_form_12_div_23_ng_container_6_mat_option_1_Template, 3, 4, "mat-option", 35);
264
+ i0.ɵɵpipe(2, "keyvalue");
265
+ i0.ɵɵpipe(3, "async");
266
+ i0.ɵɵelementContainerEnd();
267
+ } if (rf & 2) {
268
+ const ctx_r41 = i0.ɵɵnextContext(3);
269
+ i0.ɵɵadvance(1);
270
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, i0.ɵɵpipeBind1(3, 3, ctx_r41.encodings$)));
271
+ } }
272
+ function ImportExportComponent_form_12_div_23_Template(rf, ctx) { if (rf & 1) {
273
+ i0.ɵɵelementStart(0, "div", 6)(1, "mat-form-field")(2, "mat-label");
274
+ i0.ɵɵtext(3);
275
+ i0.ɵɵpipe(4, "translate");
276
+ i0.ɵɵelementEnd();
277
+ i0.ɵɵelementStart(5, "mat-select", 38);
278
+ i0.ɵɵtemplate(6, ImportExportComponent_form_12_div_23_ng_container_6_Template, 4, 5, "ng-container", 18);
279
+ i0.ɵɵpipe(7, "async");
280
+ i0.ɵɵelementEnd()()();
281
+ } if (rf & 2) {
282
+ const ctx_r24 = i0.ɵɵnextContext(2);
283
+ i0.ɵɵadvance(3);
284
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 2, "igo.geo.importExportForm.encodingPlaceholder"));
285
+ i0.ɵɵadvance(3);
286
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(7, 4, ctx_r24.encodings$).length !== 0);
287
+ } }
288
+ function ImportExportComponent_form_12_div_24_Template(rf, ctx) { if (rf & 1) {
289
+ i0.ɵɵelementStart(0, "div", 39)(1, "mat-slide-toggle", 40);
290
+ i0.ɵɵtext(2);
291
+ i0.ɵɵpipe(3, "translate");
292
+ i0.ɵɵelementEnd()();
293
+ } if (rf & 2) {
294
+ i0.ɵɵadvance(1);
295
+ i0.ɵɵproperty("labelPosition", "before");
296
+ i0.ɵɵadvance(1);
297
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportCombineResults"), " ");
298
+ } }
299
+ function ImportExportComponent_form_12_div_25_Template(rf, ctx) { if (rf & 1) {
300
+ i0.ɵɵelementStart(0, "div", 41)(1, "mat-slide-toggle", 42);
301
+ i0.ɵɵtext(2);
302
+ i0.ɵɵpipe(3, "translate");
303
+ i0.ɵɵelementEnd()();
304
+ } if (rf & 2) {
305
+ i0.ɵɵadvance(1);
306
+ i0.ɵɵproperty("labelPosition", "before");
307
+ i0.ɵɵadvance(1);
308
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportSeparator"), " ");
309
+ } }
310
+ function ImportExportComponent_form_12_div_26_Template(rf, ctx) { if (rf & 1) {
311
+ i0.ɵɵelementStart(0, "div", 43)(1, "mat-slide-toggle", 44);
312
+ i0.ɵɵtext(2);
313
+ i0.ɵɵpipe(3, "translate");
314
+ i0.ɵɵelementEnd()();
315
+ } if (rf & 2) {
316
+ i0.ɵɵadvance(1);
317
+ i0.ɵɵproperty("labelPosition", "before");
318
+ i0.ɵɵadvance(1);
319
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 2, "igo.geo.importExportForm.exportFeatureInExtent"), " ");
320
+ } }
321
+ function ImportExportComponent_form_12_igo_custom_html_36_Template(rf, ctx) { if (rf & 1) {
322
+ i0.ɵɵelement(0, "igo-custom-html", 20);
323
+ } if (rf & 2) {
324
+ const ctx_r28 = i0.ɵɵnextContext(2);
325
+ i0.ɵɵproperty("html", ctx_r28.exportHtmlClarifications);
326
+ } }
327
+ function ImportExportComponent_form_12_Template(rf, ctx) { if (rf & 1) {
328
+ const _r45 = i0.ɵɵgetCurrentView();
329
+ i0.ɵɵelementStart(0, "form", 5)(1, "div", 6)(2, "mat-form-field")(3, "mat-label");
330
+ i0.ɵɵtext(4);
331
+ i0.ɵɵpipe(5, "translate");
332
+ i0.ɵɵelementEnd();
333
+ i0.ɵɵelementStart(6, "mat-select", 21);
334
+ i0.ɵɵlistener("valueChange", function ImportExportComponent_form_12_Template_mat_select_valueChange_6_listener($event) { i0.ɵɵrestoreView(_r45); const ctx_r44 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r44.layers = $event); });
335
+ i0.ɵɵelementStart(7, "mat-select-trigger");
336
+ i0.ɵɵtext(8);
337
+ i0.ɵɵtemplate(9, ImportExportComponent_form_12_span_9_Template, 3, 4, "span", 22);
338
+ i0.ɵɵelementEnd();
339
+ i0.ɵɵtemplate(10, ImportExportComponent_form_12_mat_option_10_Template, 5, 6, "mat-option", 23);
340
+ i0.ɵɵpipe(11, "async");
341
+ i0.ɵɵelementEnd()()();
342
+ i0.ɵɵelementStart(12, "div", 6)(13, "mat-form-field")(14, "mat-label");
343
+ i0.ɵɵtext(15);
344
+ i0.ɵɵpipe(16, "translate");
345
+ i0.ɵɵelementEnd();
346
+ i0.ɵɵelementStart(17, "mat-select", 24);
347
+ i0.ɵɵtemplate(18, ImportExportComponent_form_12_ng_container_18_Template, 4, 5, "ng-container", 18);
348
+ i0.ɵɵpipe(19, "async");
349
+ i0.ɵɵtemplate(20, ImportExportComponent_form_12_mat_option_20_Template, 3, 3, "mat-option", 25);
350
+ i0.ɵɵpipe(21, "async");
351
+ i0.ɵɵelementEnd()()();
352
+ i0.ɵɵtemplate(22, ImportExportComponent_form_12_div_22_Template, 4, 3, "div", 26);
353
+ i0.ɵɵtemplate(23, ImportExportComponent_form_12_div_23_Template, 8, 6, "div", 26);
354
+ i0.ɵɵtemplate(24, ImportExportComponent_form_12_div_24_Template, 4, 4, "div", 27);
355
+ i0.ɵɵtemplate(25, ImportExportComponent_form_12_div_25_Template, 4, 4, "div", 28);
356
+ i0.ɵɵtemplate(26, ImportExportComponent_form_12_div_26_Template, 4, 4, "div", 29);
357
+ i0.ɵɵelementStart(27, "div", 30)(28, "button", 10);
358
+ i0.ɵɵlistener("click", function ImportExportComponent_form_12_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r45); const ctx_r46 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r46.handleExportFormSubmit(ctx_r46.form.value)); });
359
+ i0.ɵɵpipe(29, "async");
360
+ i0.ɵɵtext(30);
361
+ i0.ɵɵpipe(31, "translate");
362
+ i0.ɵɵpipe(32, "translate");
363
+ i0.ɵɵpipe(33, "translate");
364
+ i0.ɵɵelementEnd();
365
+ i0.ɵɵelement(34, "igo-spinner", 11);
366
+ i0.ɵɵpipe(35, "async");
367
+ i0.ɵɵelementEnd();
368
+ i0.ɵɵtemplate(36, ImportExportComponent_form_12_igo_custom_html_36_Template, 1, 1, "igo-custom-html", 19);
369
+ i0.ɵɵelementEnd();
370
+ } if (rf & 2) {
371
+ const ctx_r3 = i0.ɵɵnextContext();
372
+ i0.ɵɵproperty("formGroup", ctx_r3.form);
373
+ i0.ɵɵadvance(4);
374
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 18, "igo.geo.importExportForm.exportLayerPlaceholder"));
375
+ i0.ɵɵadvance(2);
376
+ i0.ɵɵproperty("value", ctx_r3.layers);
377
+ i0.ɵɵadvance(2);
378
+ i0.ɵɵtextInterpolate1(" ", ctx_r3.layers.length ? ctx_r3.getLayerTitleById(ctx_r3.layers[0]) : "", " ");
379
+ i0.ɵɵadvance(1);
380
+ i0.ɵɵproperty("ngIf", ctx_r3.layers.length > 1);
381
+ i0.ɵɵadvance(1);
382
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(11, 20, ctx_r3.exportableLayers$));
383
+ i0.ɵɵadvance(5);
384
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 22, "igo.geo.importExportForm.exportFormatPlaceholder"));
385
+ i0.ɵɵadvance(3);
386
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(19, 24, ctx_r3.formats$).length !== 0);
387
+ i0.ɵɵadvance(2);
388
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(21, 26, ctx_r3.formats$).length === 0);
389
+ i0.ɵɵadvance(2);
390
+ i0.ɵɵproperty("ngIf", ctx_r3.forceNaming && ctx_r3.form.value.format !== "URL");
391
+ i0.ɵɵadvance(1);
392
+ i0.ɵɵproperty("ngIf", ctx_r3.form.value.format === "CSVcomma" || ctx_r3.form.value.format === "CSVsemicolon");
393
+ i0.ɵɵadvance(1);
394
+ i0.ɵɵproperty("ngIf", ctx_r3.layers.length > 1 && (ctx_r3.form.value.format === "CSVcomma" || ctx_r3.form.value.format === "CSVsemicolon"));
395
+ i0.ɵɵadvance(1);
396
+ i0.ɵɵproperty("ngIf", ctx_r3.layers.length > 1 && (ctx_r3.form.value.format === "CSVcomma" || ctx_r3.form.value.format === "CSVsemicolon") && ctx_r3.form.value.combineLayers);
397
+ i0.ɵɵadvance(1);
398
+ i0.ɵɵproperty("ngIf", ctx_r3.form.value.format !== "URL");
399
+ i0.ɵɵadvance(2);
400
+ i0.ɵɵproperty("disabled", !ctx_r3.form.valid || i0.ɵɵpipeBind1(29, 28, ctx_r3.loading$));
401
+ i0.ɵɵadvance(2);
402
+ i0.ɵɵtextInterpolate1(" ", ctx_r3.form.value.format !== "URL" ? i0.ɵɵpipeBind1(31, 30, "igo.geo.importExportForm.exportButton") : ctx_r3.form.value.layers.length > 1 ? i0.ɵɵpipeBind1(32, 32, "igo.geo.importExportForm.exportButtonLinks") : i0.ɵɵpipeBind1(33, 34, "igo.geo.importExportForm.exportButtonLink"), " ");
403
+ i0.ɵɵadvance(4);
404
+ i0.ɵɵproperty("shown", i0.ɵɵpipeBind1(35, 36, ctx_r3.loading$));
405
+ i0.ɵɵadvance(2);
406
+ i0.ɵɵproperty("ngIf", ctx_r3.exportHtmlClarifications !== "");
407
+ } }
408
+ export class ImportExportComponent {
409
+ constructor(importService, exportService, languageService, messageService, styleListService, styleService, formBuilder, config, cdRef, storageService, downloadService) {
410
+ this.importService = importService;
411
+ this.exportService = exportService;
412
+ this.languageService = languageService;
413
+ this.messageService = messageService;
414
+ this.styleListService = styleListService;
415
+ this.styleService = styleService;
416
+ this.formBuilder = formBuilder;
417
+ this.config = config;
418
+ this.cdRef = cdRef;
419
+ this.storageService = storageService;
420
+ this.downloadService = downloadService;
421
+ this.formats$ = new BehaviorSubject(undefined);
422
+ this.encodings$ = new BehaviorSubject(undefined);
423
+ this.exportableLayers$ = new BehaviorSubject([]);
424
+ this.loading$ = new BehaviorSubject(false);
425
+ this.forceNaming = false;
426
+ this.controlFormat = 'format';
427
+ this.espgCodeRegex = new RegExp('^\\d{4,6}');
428
+ this.projections$ = new BehaviorSubject([]);
429
+ this.popupChecked = false;
430
+ this.previousLayerSpecs$ = new BehaviorSubject(undefined);
431
+ this.selectFirstProj = false;
432
+ this._projectionsLimitations = {};
433
+ this.selectedMode = 'import';
434
+ this.selectMode = new EventEmitter();
435
+ this.exportOptions$ = new BehaviorSubject(undefined);
436
+ this.exportOptionsChange = new EventEmitter();
437
+ this.loadConfig();
438
+ this.buildForm();
439
+ this.computeProjections();
440
+ this.importHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.importHtmlClarifications');
441
+ this.exportHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.exportHtmlClarifications');
442
+ }
443
+ set projectionsLimitations(value) {
444
+ this._projectionsLimitations = value;
445
+ this.computeProjections();
446
+ }
447
+ get projectionsLimitations() {
448
+ return this._projectionsLimitations || {};
449
+ }
450
+ get layers() {
451
+ return this.form.get('layers').value;
452
+ }
453
+ set layers(value) {
454
+ this.form.patchValue({ layers: value });
455
+ }
456
+ get inputProj() {
457
+ return this.importForm.get('inputProj').value;
458
+ }
459
+ set inputProj(value) {
460
+ this.importForm.patchValue({ inputProj: value });
461
+ }
462
+ get popupAllowed() {
463
+ return this.storageService.get('importExportPopupAllowed') || false;
464
+ }
465
+ set popupAllowed(value) {
466
+ this.storageService.set('importExportPopupAllowed', value);
467
+ }
468
+ ngOnInit() {
469
+ this.layers$$ = this.map.layers$.subscribe((layers) => {
470
+ this.exportableLayers$.next(layers.filter((layer) => {
471
+ return ((layer instanceof VectorLayer && layer.exportable === true) ||
472
+ (layer.dataSource.options.download &&
473
+ layer.dataSource.options.download.url));
474
+ }));
475
+ });
476
+ const configFileSizeMb = this.config.getConfig('importExport.clientSideFileSizeMaxMb');
477
+ this.clientSideFileSizeMax =
478
+ (configFileSizeMb ? configFileSizeMb : 30) * Math.pow(1024, 2);
479
+ this.fileSizeMb = this.clientSideFileSizeMax / Math.pow(1024, 2);
480
+ this.exportOptions$$ = this.exportOptions$
481
+ .pipe(skipWhile((exportOptions) => !exportOptions))
482
+ .subscribe((exportOptions) => {
483
+ this.form.patchValue(exportOptions, { emitEvent: true });
484
+ if (exportOptions.layers) {
485
+ this.computeFormats(exportOptions.layers.map((l) => this.map.getLayerById(l)));
486
+ }
487
+ });
488
+ this.formLayer$$ = this.form
489
+ .get('format')
490
+ .valueChanges
491
+ .subscribe((format) => {
492
+ const ogreFormats = Object.keys(ExportService.ogreFormats);
493
+ if (!this.popupChecked &&
494
+ this.form.get('layers').value?.length > 1 &&
495
+ (ogreFormats.indexOf(format) >= 0 || format === ExportFormat.URL)) {
496
+ if (!this.handlePopup(true)) {
497
+ this.form.patchValue({ format: undefined }, { emitEvent: false });
498
+ }
499
+ }
500
+ });
501
+ this.formLayer$$ = this.form
502
+ .get('layers')
503
+ .valueChanges.subscribe((layersId) => {
504
+ this.handlePreviousLayerSpecs();
505
+ const selectedLayers = layersId instanceof Array ? layersId : [layersId];
506
+ this.form.patchValue({ layers: selectedLayers }, { emitEvent: false });
507
+ const layers = selectedLayers.map((l) => this.map.getLayerById(l));
508
+ this.computeFormats(layers);
509
+ if (Object.keys(this.formats$.value).indexOf(this.form.value.format) ===
510
+ -1) {
511
+ this.form.patchValue({ format: undefined });
512
+ }
513
+ this.loading$.next(true);
514
+ const previousSpecs = [];
515
+ layers.forEach((layer) => {
516
+ if (layer instanceof VectorLayer &&
517
+ layer.dataSource.ol.getFeatures().length === 0) {
518
+ previousSpecs.push({
519
+ id: layer.id,
520
+ visible: layer.visible,
521
+ opacity: layer.opacity,
522
+ queryable: layer.queryable
523
+ });
524
+ layer.opacity = 0;
525
+ layer.visible = true;
526
+ }
527
+ });
528
+ this.previousLayerSpecs$.next(previousSpecs);
529
+ setTimeout(() => {
530
+ this.loading$.next(false);
531
+ }, 500);
532
+ });
533
+ this.formats$$ = this.formats$
534
+ .pipe(skipWhile((formats) => !formats))
535
+ .subscribe((formats) => {
536
+ if (Object.keys(formats).length === 1) {
537
+ this.form.patchValue({ format: formats[Object.keys(formats)[0]] });
538
+ }
539
+ });
540
+ this.encodings$$ = this.encodings$
541
+ .pipe(skipWhile((encodings) => !encodings))
542
+ .subscribe((encodings) => {
543
+ if (Object.keys(encodings).length === 1) {
544
+ this.form.patchValue({ encoding: encodings[Object.keys(encodings)[0]] });
545
+ }
546
+ });
547
+ this.exportableLayers$$ = this.exportableLayers$
548
+ .pipe(skipWhile((layers) => !layers))
549
+ .subscribe((layers) => {
550
+ if (layers.length === 1) {
551
+ this.form.patchValue({ layers: layers[0].id });
552
+ }
553
+ });
554
+ this.form.controls[this.controlFormat].valueChanges.subscribe((format) => {
555
+ if (format === ExportFormat.CSVcomma || format === ExportFormat.CSVsemicolon) {
556
+ this.form.patchValue({ encoding: EncodingFormat.LATIN1 });
557
+ }
558
+ else {
559
+ this.form.patchValue({ encoding: EncodingFormat.UTF8 });
560
+ }
561
+ this.cdRef.detectChanges();
562
+ });
563
+ if (this.selectFirstProj) {
564
+ if (this.projections$.value.length === 0) {
565
+ this.importForm.patchValue({ inputProj: { translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4326', zone: '' } });
566
+ }
567
+ else {
568
+ this.importForm.patchValue({ inputProj: this.projections$.value[0] });
569
+ }
570
+ }
571
+ else {
572
+ this.importForm.patchValue({ inputProj: undefined });
573
+ }
574
+ }
575
+ computeProjections() {
576
+ this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
577
+ const projections = [];
578
+ if (this.projectionsConstraints.nad83) {
579
+ projections.push({ translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4269', zone: '' });
580
+ }
581
+ if (this.projectionsConstraints.wgs84) {
582
+ projections.push({ translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: '' });
583
+ }
584
+ if (this.projectionsConstraints.webMercator) {
585
+ projections.push({ translateKey: 'webMercator', alias: 'Web Mercator', code: 'EPSG:3857', zone: '' });
586
+ }
587
+ if (this.projectionsConstraints.mtm) {
588
+ // all mtm zones
589
+ const minZone = this.projectionsConstraints.mtmZone.minZone;
590
+ const maxZone = this.projectionsConstraints.mtmZone.maxZone;
591
+ for (let mtmZone = minZone; mtmZone <= maxZone; mtmZone++) {
592
+ const code = mtmZone < 10 ? `EPSG:3218${mtmZone}` : `EPSG:321${80 + mtmZone}`;
593
+ projections.push({ translateKey: 'mtm', alias: `MTM ${mtmZone}`, code, zone: `${mtmZone}` });
594
+ }
595
+ }
596
+ if (this.projectionsConstraints.utm) {
597
+ // all utm zones
598
+ const minZone = this.projectionsConstraints.utmZone.minZone;
599
+ const maxZone = this.projectionsConstraints.utmZone.maxZone;
600
+ for (let utmZone = minZone; utmZone <= maxZone; utmZone++) {
601
+ const code = utmZone < 10 ? `EPSG:3260${utmZone}` : `EPSG:326${utmZone}`;
602
+ projections.push({ translateKey: 'utm', alias: `UTM ${utmZone}`, code, zone: `${utmZone}` });
603
+ }
604
+ }
605
+ let configProjection = [];
606
+ if (this.projectionsConstraints.projFromConfig) {
607
+ configProjection = this.config.getConfig('projections') || [];
608
+ }
609
+ this.projections$.next(configProjection.concat(projections));
610
+ }
611
+ getWorkspaceByLayerId(id) {
612
+ const wksFromLayerId = this.store
613
+ .all()
614
+ .find(workspace => workspace.layer.id === id);
615
+ if (wksFromLayerId) {
616
+ return wksFromLayerId;
617
+ }
618
+ return;
619
+ }
620
+ getLayerTitleById(id) {
621
+ return this.map.getLayerById(id)?.title;
622
+ }
623
+ layerHasSelectedFeatures(layer) {
624
+ const wksFromLayer = this.getWorkspaceByLayerId(layer.id);
625
+ if (wksFromLayer) {
626
+ const recs = wksFromLayer.entityStore.stateView
627
+ .firstBy((record) => {
628
+ return record.state.selected === true;
629
+ });
630
+ return recs ? true : false;
631
+ }
632
+ }
633
+ onlySelected(event, id) {
634
+ let layersWithSelection = this.form.value.layersWithSelection;
635
+ if (event.checked) {
636
+ layersWithSelection.push(id);
637
+ }
638
+ else {
639
+ layersWithSelection = layersWithSelection.filter(layerId => layerId !== id);
640
+ }
641
+ this.form.patchValue({ layersWithSelection });
642
+ }
643
+ onlySelectedClick(event, id) {
644
+ if (this.form.value.layers.find(layerId => layerId === id)) {
645
+ event.stopPropagation();
646
+ }
647
+ }
648
+ inLayersIdToExportSelectionOnly(layer) {
649
+ return this.form.value.layersWithSelection.find(layerId => layerId === layer.id) ? true : false;
650
+ }
651
+ ngOnDestroy() {
652
+ this.layers$$.unsubscribe();
653
+ this.exportableLayers$$.unsubscribe();
654
+ this.formats$$.unsubscribe();
655
+ this.encodings$$.unsubscribe();
656
+ this.formLayer$$.unsubscribe();
657
+ if (this.exportOptions$$) {
658
+ this.exportOptions$$.unsubscribe();
659
+ }
660
+ this.exportOptionsChange.emit(this.form.value);
661
+ this.handlePreviousLayerSpecs();
662
+ }
663
+ handlePreviousLayerSpecs() {
664
+ const previousSpecs = this.previousLayerSpecs$.value;
665
+ if (previousSpecs && previousSpecs.length) {
666
+ previousSpecs.forEach((specs) => {
667
+ const previousLayer = this.map.getLayerById(specs.id);
668
+ previousLayer.visible = specs.visible;
669
+ previousLayer.opacity = specs.opacity;
670
+ previousLayer.queryable = specs.queryable;
671
+ });
672
+ }
673
+ this.previousLayerSpecs$.next(undefined);
674
+ }
675
+ importFiles(files) {
676
+ let inputProj = this.inputProj.code;
677
+ if (this.espgCodeRegex.test(inputProj)) {
678
+ inputProj = `EPSG:${inputProj}`;
679
+ }
680
+ this.loading$.next(true);
681
+ for (const file of files) {
682
+ this.importService.import(file, inputProj).subscribe((features) => this.onFileImportSuccess(file, features), (error) => this.onFileImportError(file, error), () => {
683
+ this.loading$.next(false);
684
+ });
685
+ }
686
+ }
687
+ handlePopup(preCheck = true) {
688
+ const p1 = window.open('', 'popup', 'width=1, height=1');
689
+ p1.close();
690
+ const p2 = window.open('', 'popup', 'width=1, height=1');
691
+ if (!p2 || p2.closed || typeof p2.closed === 'undefined' || p2 === null) {
692
+ this.onPopupBlockedError(preCheck);
693
+ this.popupAllowed = false;
694
+ }
695
+ else {
696
+ p2.close();
697
+ this.popupAllowed = true;
698
+ this.popupChecked = true;
699
+ }
700
+ return this.popupAllowed;
701
+ }
702
+ handleExportFormSubmit(data) {
703
+ this.loading$.next(true);
704
+ const ogreFormats = Object.keys(ExportService.ogreFormats);
705
+ if (!this.popupChecked && data.layers.length > 1 &&
706
+ (ogreFormats.indexOf(data.format) >= 0 || data.format === ExportFormat.URL) && !this.popupAllowed) {
707
+ this.handlePopup();
708
+ }
709
+ let geomTypesCSV = [];
710
+ let featuresCSV = [];
711
+ let filename = "";
712
+ for (const [layerIndex, layer] of data.layers.entries()) {
713
+ const lay = this.map.getLayerById(layer);
714
+ if (!(data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma)
715
+ || !data.combineLayers || data.layers.length === 1) {
716
+ filename = lay.title;
717
+ if (data.name) {
718
+ filename = data.name;
719
+ }
720
+ }
721
+ else {
722
+ filename = this.languageService.translate.instant('igo.geo.export.combinedLayers');
723
+ }
724
+ const dSOptions = lay.dataSource.options;
725
+ if (data.format === ExportFormat.URL && dSOptions.download && (dSOptions.download.url || dSOptions.download.dynamicUrl)) {
726
+ setTimeout(() => {
727
+ // better look an feel
728
+ const url = dSOptions.download.url || dSOptions.download.dynamicUrl;
729
+ url.match(/service=wfs/gi) ? this.downloadService.open(lay) : window.open(url, '_blank');
730
+ this.loading$.next(false);
731
+ }, 500);
732
+ return;
733
+ }
734
+ const wks = this.getWorkspaceByLayerId(layer);
735
+ let olFeatures;
736
+ if (wks && wks.entityStore && wks.entityStore.stateView.all().length) {
737
+ if (data.layersWithSelection.indexOf(layer) !== -1 && data.featureInMapExtent) {
738
+ // Only export selected feature && into map extent
739
+ olFeatures = wks.entityStore.stateView.all()
740
+ .filter((e) => e.state.inMapExtent && e.state.selected).map(e => e.entity.ol);
741
+ }
742
+ else if (data.layersWithSelection.indexOf(layer) !== -1 && !data.featureInMapExtent) {
743
+ // Only export selected feature && (into map extent OR not)
744
+ olFeatures = wks.entityStore.stateView.all()
745
+ .filter((e) => e.state.selected).map(e => e.entity.ol);
746
+ }
747
+ else if (data.featureInMapExtent) {
748
+ // Only into map extent
749
+ olFeatures = wks.entityStore.stateView.all()
750
+ .filter((e) => e.state.inMapExtent).map(e => e.entity.ol);
751
+ }
752
+ else {
753
+ // All features
754
+ olFeatures = wks.entityStore.stateView.all().map(e => e.entity.ol);
755
+ }
756
+ }
757
+ else {
758
+ const ol = lay.dataSource.ol;
759
+ if (data.featureInMapExtent) {
760
+ olFeatures = ol.getFeaturesInExtent(lay.map.viewController.getExtent());
761
+ }
762
+ else {
763
+ olFeatures = ol.getFeatures();
764
+ }
765
+ if (lay.dataSource instanceof ClusterDataSource) {
766
+ olFeatures = olFeatures.flatMap((cluster) => cluster.get('features'));
767
+ }
768
+ }
769
+ const translate = this.languageService.translate;
770
+ let geomTypes = [];
771
+ if (data.format === ExportFormat.Shapefile || data.format === ExportFormat.GPX) {
772
+ olFeatures.forEach((olFeature) => {
773
+ const featureGeomType = olFeature.getGeometry().getType();
774
+ const currentGeomType = geomTypes.find(geomType => geomType.geometryType === featureGeomType);
775
+ if (currentGeomType) {
776
+ currentGeomType.features.push(olFeature);
777
+ }
778
+ else {
779
+ geomTypes.push({ geometryType: featureGeomType, features: [olFeature] });
780
+ }
781
+ });
782
+ }
783
+ else {
784
+ geomTypes = [{ geometryType: '', features: olFeatures }];
785
+ }
786
+ geomTypes.forEach(geomType => {
787
+ geomType.features.forEach(feature => {
788
+ const radius = feature.get('rad');
789
+ if (radius) {
790
+ const center4326 = [feature.get('longitude'), feature.get('latitude')];
791
+ const circle = circular(center4326, radius, 500);
792
+ circle.transform('EPSG:4326', feature.get('_projection'));
793
+ feature.setGeometry(circle);
794
+ }
795
+ });
796
+ });
797
+ if (data.format === ExportFormat.GPX) {
798
+ const gpxFeatureCnt = geomTypes.length;
799
+ geomTypes = geomTypes.filter(geomType => ['LineString', 'Point'].includes(geomType.geometryType));
800
+ const gpxFeatureCntPointOrPoly = geomTypes.length;
801
+ if (gpxFeatureCnt > gpxFeatureCntPointOrPoly) {
802
+ const title = translate.instant('igo.geo.export.gpx.error.poly.title');
803
+ const message = translate.instant('igo.geo.export.gpx.error.poly.text');
804
+ this.messageService.error(message, title, { timeOut: 20000 });
805
+ }
806
+ }
807
+ else if ((data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma) && data.combineLayers) {
808
+ geomTypes.forEach(geomType => geomTypesCSV.push(geomType));
809
+ if (layerIndex !== data.layers.length - 1) {
810
+ continue;
811
+ }
812
+ else {
813
+ let previousFeature = undefined;
814
+ geomTypesCSV.forEach(geomType => {
815
+ geomType.features.forEach(currentFeature => {
816
+ if (data.separator) {
817
+ if (previousFeature) {
818
+ if (currentFeature.get('_featureStore').layer.options.title !==
819
+ previousFeature.get('_featureStore').layer.options.title) {
820
+ const titleEmptyRows = this.createTitleEmptyRows(previousFeature, currentFeature);
821
+ featuresCSV.push(titleEmptyRows[2]);
822
+ featuresCSV.push(titleEmptyRows[0]);
823
+ featuresCSV.push(titleEmptyRows[1]);
824
+ }
825
+ }
826
+ else {
827
+ const titleEmptyRows = this.createTitleEmptyRows(currentFeature, currentFeature);
828
+ featuresCSV.push(titleEmptyRows[0]);
829
+ }
830
+ }
831
+ featuresCSV.push(currentFeature);
832
+ previousFeature = currentFeature;
833
+ });
834
+ });
835
+ }
836
+ }
837
+ if (geomTypes.length === 0) {
838
+ this.loading$.next(false);
839
+ const title = translate.instant('igo.geo.export.nothing.title');
840
+ const message = translate.instant('igo.geo.export.nothing.text');
841
+ this.messageService.error(message, title, { timeOut: 20000 });
842
+ }
843
+ else {
844
+ if (!(data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma) || !data.combineLayers) {
845
+ geomTypes.map(geomType => this.exportService.export(geomType.features, data.format, filename + geomType.geometryType, data.encoding, this.map.projection)
846
+ .subscribe(() => { }, (error) => this.onFileExportError(error), () => {
847
+ this.onFileExportSuccess();
848
+ geomType.features.forEach(feature => {
849
+ this.circleToPoint(feature);
850
+ });
851
+ this.loading$.next(false);
852
+ }));
853
+ }
854
+ }
855
+ }
856
+ ;
857
+ if ((data.format === ExportFormat.CSVsemicolon || data.format === ExportFormat.CSVcomma) && data.combineLayers) {
858
+ this.exportService.export(featuresCSV, data.format, filename, data.encoding, this.map.projection)
859
+ .subscribe(() => { }, (error) => this.onFileExportError(error), () => {
860
+ this.onFileExportSuccess();
861
+ featuresCSV.forEach(feature => {
862
+ this.circleToPoint(feature);
863
+ });
864
+ this.loading$.next(false);
865
+ });
866
+ }
867
+ }
868
+ createTitleEmptyRows(previousFeature, currentFeature) {
869
+ const titleRow = currentFeature.clone();
870
+ const headerRow = currentFeature.clone();
871
+ const emptyRow = currentFeature.clone();
872
+ const previousFeatureKeys = previousFeature.getKeys();
873
+ let firstKeyPrevious = '';
874
+ for (const key in previousFeatureKeys) {
875
+ if (previousFeatureKeys[key] !== 'geometry') {
876
+ firstKeyPrevious = previousFeatureKeys[key];
877
+ break;
878
+ }
879
+ }
880
+ const currentFeatureKeys = currentFeature.getKeys();
881
+ let firstKeyCurrent = '';
882
+ for (const key in currentFeatureKeys) {
883
+ if (currentFeatureKeys[key] !== 'geometry') {
884
+ firstKeyCurrent = currentFeatureKeys[key];
885
+ break;
886
+ }
887
+ }
888
+ const allKeys = currentFeature.getKeys();
889
+ previousFeatureKeys.forEach(previousKey => {
890
+ if (allKeys.includes(previousKey) && previousKey !== firstKeyPrevious) {
891
+ allKeys.push(previousKey);
892
+ }
893
+ });
894
+ allKeys.unshift(firstKeyPrevious);
895
+ let firstKeyAll = '';
896
+ for (const key in allKeys) {
897
+ if (allKeys[key] !== 'geometry') {
898
+ firstKeyAll = allKeys[key];
899
+ break;
900
+ }
901
+ }
902
+ allKeys.forEach(key => {
903
+ const sameKeys = previousFeatureKeys.length === currentFeatureKeys.length &&
904
+ previousFeatureKeys.every((value, index) => value === currentFeatureKeys[index]);
905
+ if (key === firstKeyAll && !sameKeys) {
906
+ titleRow.set(key, currentFeature.get('_featureStore').layer.options.title + " ===============>", true);
907
+ headerRow.set(key, key, true);
908
+ emptyRow.unset(key, true);
909
+ }
910
+ else if (key === firstKeyAll && sameKeys) {
911
+ titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
912
+ headerRow.set(key, key, true);
913
+ emptyRow.unset(key, true);
914
+ }
915
+ else if (key === firstKeyCurrent) {
916
+ titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
917
+ headerRow.set(key, key, true);
918
+ emptyRow.unset(key, true);
919
+ }
920
+ else if (key !== 'geometry') {
921
+ titleRow.unset(key, true);
922
+ headerRow.set(key, key, true);
923
+ emptyRow.unset(key, true);
924
+ }
925
+ else {
926
+ titleRow.unset(key, true);
927
+ emptyRow.unset(key, true);
928
+ }
929
+ if (!(currentFeatureKeys.includes(key))) {
930
+ headerRow.unset(key, true);
931
+ }
932
+ });
933
+ const titleEmptyRows = [titleRow, headerRow, emptyRow];
934
+ return titleEmptyRows;
935
+ }
936
+ circleToPoint(feature) {
937
+ const radius = feature.get('rad');
938
+ if (radius) {
939
+ const point = new olPoint([feature.get('longitude'), feature.get('latitude')]);
940
+ point.transform('EPSG:4326', feature.get('_projection'));
941
+ feature.setGeometry(point);
942
+ }
943
+ }
944
+ buildForm() {
945
+ this.importForm = this.formBuilder.group({
946
+ inputProj: ['', [Validators.required]]
947
+ });
948
+ if (this.forceNaming) {
949
+ this.form = this.formBuilder.group({
950
+ format: ['', [Validators.required]],
951
+ layers: [[], [Validators.required]],
952
+ layersWithSelection: [[]],
953
+ encoding: [EncodingFormat.UTF8, [Validators.required]],
954
+ combineLayers: [true, [Validators.required]],
955
+ separator: [false, [Validators.required]],
956
+ featureInMapExtent: [false, [Validators.required]],
957
+ name: ['', [Validators.required]]
958
+ });
959
+ }
960
+ else {
961
+ this.form = this.formBuilder.group({
962
+ format: ['', [Validators.required]],
963
+ layers: [[], [Validators.required]],
964
+ layersWithSelection: [[]],
965
+ encoding: [EncodingFormat.UTF8, [Validators.required]],
966
+ combineLayers: [true, [Validators.required]],
967
+ separator: [false, [Validators.required]],
968
+ featureInMapExtent: [false, [Validators.required]],
969
+ });
970
+ }
971
+ }
972
+ onFileImportSuccess(file, features) {
973
+ if (!this.config.getConfig('importWithStyle')) {
974
+ handleFileImportSuccess(file, features, this.map, this.messageService, this.languageService);
975
+ }
976
+ else {
977
+ handleFileImportSuccess(file, features, this.map, this.messageService, this.languageService, this.styleListService, this.styleService);
978
+ }
979
+ }
980
+ onFileImportError(file, error) {
981
+ this.loading$.next(false);
982
+ handleFileImportError(file, error, this.messageService, this.languageService, this.fileSizeMb);
983
+ }
984
+ onPopupBlockedError(preCheck = true) {
985
+ this.loading$.next(false);
986
+ const translate = this.languageService.translate;
987
+ const title = translate.instant('igo.geo.export.popupBlocked.title');
988
+ const extraMessage = preCheck ?
989
+ translate.instant('igo.geo.export.popupBlocked.selectAgain') :
990
+ translate.instant('igo.geo.export.popupBlocked.retry');
991
+ const message = translate.instant('igo.geo.export.popupBlocked.text', { extraMessage });
992
+ this.messageService.error(message, title, { timeOut: 20000 });
993
+ }
994
+ onFileExportError(error) {
995
+ this.loading$.next(false);
996
+ handleFileExportError(error, this.messageService, this.languageService);
997
+ }
998
+ loadConfig() {
999
+ if (this.config.getConfig('importExport.forceNaming') !== undefined) {
1000
+ this.forceNaming = this.config.getConfig('importExport.forceNaming');
1001
+ }
1002
+ this.computeFormats();
1003
+ this.loadEncodings();
1004
+ }
1005
+ encodingDefaultValue(format) {
1006
+ if (format === ExportFormat.CSVcomma || format === ExportFormat.CSVsemicolon) {
1007
+ this.form.patchValue({ encoding: EncodingFormat.LATIN1 });
1008
+ return EncodingFormat.LATIN1;
1009
+ }
1010
+ else {
1011
+ this.form.patchValue({ encoding: EncodingFormat.UTF8 });
1012
+ return EncodingFormat.UTF8;
1013
+ }
1014
+ }
1015
+ loadEncodings() {
1016
+ this.encodings$.next(EncodingFormat);
1017
+ }
1018
+ computeFormats(layers) {
1019
+ let appliedformats = Object.keys(ExportFormat);
1020
+ const formatsType = {
1021
+ onlyUrl: false,
1022
+ onlyVector: false,
1023
+ vectorAndUrl: false,
1024
+ customList: false
1025
+ };
1026
+ const customList = [];
1027
+ if (layers && layers.length) {
1028
+ layers.forEach((layer) => {
1029
+ if (!layer) {
1030
+ return;
1031
+ }
1032
+ if (layer.dataSource.options.download?.allowedFormats) {
1033
+ formatsType.customList = true;
1034
+ customList.push({ layer: layer.title, formats: this.validateListFormat(layer.dataSource.options.download.allowedFormats) });
1035
+ }
1036
+ else if (!(layer instanceof VectorLayer) &&
1037
+ layer.dataSource.options.download &&
1038
+ layer.dataSource.options.download.url) {
1039
+ formatsType.onlyUrl = true;
1040
+ }
1041
+ else if (layer.dataSource.options.download &&
1042
+ (layer.dataSource.options.download.url || layer.dataSource.options.download.dynamicUrl)) {
1043
+ formatsType.vectorAndUrl = true;
1044
+ }
1045
+ else if (layer instanceof VectorLayer) {
1046
+ formatsType.onlyVector = true;
1047
+ }
1048
+ });
1049
+ if (formatsType.onlyUrl === true && formatsType.onlyVector === false) {
1050
+ appliedformats = ['URL'];
1051
+ }
1052
+ else if (formatsType.onlyVector === true &&
1053
+ formatsType.onlyUrl === false) {
1054
+ this.computeFormats(); // reset
1055
+ if (ExportFormat.URL in this.formats$.value) {
1056
+ const keys = Object.keys(this.formats$.value).filter((key) => key !== 'URL');
1057
+ appliedformats = keys;
1058
+ }
1059
+ }
1060
+ else if (formatsType.vectorAndUrl === true &&
1061
+ formatsType.onlyUrl === false &&
1062
+ formatsType.onlyVector === false) {
1063
+ this.computeFormats(); // reset
1064
+ if (!(ExportFormat.URL in this.formats$.value)) {
1065
+ const keys = Object.keys(this.formats$.value);
1066
+ keys.push('URL');
1067
+ appliedformats = keys;
1068
+ }
1069
+ }
1070
+ }
1071
+ if (this.config.getConfig('importExport.formats') !== undefined) {
1072
+ const validatedListFormat = this.validateListFormat(this.config.getConfig('importExport.formats'));
1073
+ appliedformats = validatedListFormat;
1074
+ }
1075
+ if (formatsType.customList) {
1076
+ let commonFormats;
1077
+ const layersWithCustomFormats = [];
1078
+ let previousCustomListFormats = customList[0].formats;
1079
+ customList.map(list => {
1080
+ layersWithCustomFormats.push(list.layer);
1081
+ commonFormats = list.formats.filter(value => previousCustomListFormats.includes(value));
1082
+ previousCustomListFormats = list.formats;
1083
+ });
1084
+ const finalFormats = commonFormats.filter(value => appliedformats.includes(value));
1085
+ if (finalFormats.length > 0) {
1086
+ this.formats$.next(strEnum(finalFormats));
1087
+ if (layers && layers.length) {
1088
+ if (layers.length > 1) {
1089
+ this.messageService.alert(this.languageService.translate.instant('igo.geo.export.customList.text', { value: layersWithCustomFormats.join() }), this.languageService.translate.instant('igo.geo.export.customList.title'));
1090
+ }
1091
+ }
1092
+ }
1093
+ else {
1094
+ this.formats$.next([]);
1095
+ this.messageService.alert(this.languageService.translate.instant('igo.geo.export.noFormat.text'), this.languageService.translate.instant('igo.geo.export.noFormat.title'));
1096
+ }
1097
+ return;
1098
+ }
1099
+ else {
1100
+ this.formats$.next(strEnum(appliedformats));
1101
+ }
1102
+ }
1103
+ validateListFormat(formats) {
1104
+ return formats
1105
+ .filter((format) => {
1106
+ if (format.toUpperCase() === ExportFormat.CSVcomma.toUpperCase() ||
1107
+ format.toUpperCase() === ExportFormat.CSVsemicolon.toUpperCase() ||
1108
+ format.toUpperCase() === ExportFormat.GML.toUpperCase() ||
1109
+ format.toUpperCase() === ExportFormat.GPX.toUpperCase() ||
1110
+ format.toUpperCase() === ExportFormat.GeoJSON.toUpperCase() ||
1111
+ format.toUpperCase() === ExportFormat.KML.toUpperCase() ||
1112
+ format.toUpperCase() === ExportFormat.Shapefile.toUpperCase() ||
1113
+ format.toUpperCase() === ExportFormat.URL.toUpperCase()) {
1114
+ return format;
1115
+ }
1116
+ })
1117
+ .map((format) => {
1118
+ if (format.toUpperCase() === ExportFormat.CSVcomma.toUpperCase()) {
1119
+ format = ExportFormat.CSVcomma;
1120
+ return format;
1121
+ }
1122
+ if (format.toUpperCase() === ExportFormat.CSVsemicolon.toUpperCase()) {
1123
+ format = ExportFormat.CSVsemicolon;
1124
+ return format;
1125
+ }
1126
+ if (format.toUpperCase() === ExportFormat.GML.toUpperCase()) {
1127
+ format = ExportFormat.GML;
1128
+ return format;
1129
+ }
1130
+ if (format.toUpperCase() === ExportFormat.GPX.toUpperCase()) {
1131
+ format = ExportFormat.GPX;
1132
+ return format;
1133
+ }
1134
+ if (format.toUpperCase() === ExportFormat.GeoJSON.toUpperCase()) {
1135
+ format = ExportFormat.GeoJSON;
1136
+ return format;
1137
+ }
1138
+ if (format.toUpperCase() === ExportFormat.KML.toUpperCase()) {
1139
+ format = ExportFormat.KML;
1140
+ return format;
1141
+ }
1142
+ if (format.toUpperCase() === ExportFormat.Shapefile.toUpperCase()) {
1143
+ format = ExportFormat.Shapefile;
1144
+ return format;
1145
+ }
1146
+ if (format.toUpperCase() === ExportFormat.URL.toUpperCase()) {
1147
+ format = ExportFormat.URL;
1148
+ return format;
1149
+ }
1150
+ });
1151
+ }
1152
+ modeChanged(mode) {
1153
+ this.selectMode.emit(mode);
1154
+ }
1155
+ onFileExportSuccess() {
1156
+ handleFileExportSuccess(this.messageService, this.languageService);
1157
+ }
1158
+ onImportExportChange(event) {
1159
+ this.selectedMode = event.value;
1160
+ }
1161
+ }
1162
+ ImportExportComponent.ɵfac = function ImportExportComponent_Factory(t) { return new (t || ImportExportComponent)(i0.ɵɵdirectiveInject(i1.ImportService), i0.ɵɵdirectiveInject(i2.ExportService), i0.ɵɵdirectiveInject(i3.LanguageService), i0.ɵɵdirectiveInject(i3.MessageService), i0.ɵɵdirectiveInject(i4.StyleListService), i0.ɵɵdirectiveInject(i5.StyleService), i0.ɵɵdirectiveInject(i6.UntypedFormBuilder), i0.ɵɵdirectiveInject(i3.ConfigService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.StorageService), i0.ɵɵdirectiveInject(i7.DownloadService)); };
1163
+ ImportExportComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ImportExportComponent, selectors: [["igo-import-export"]], inputs: { selectFirstProj: "selectFirstProj", map: "map", projectionsLimitations: "projectionsLimitations", store: "store", selectedMode: "selectedMode", exportOptions$: "exportOptions$" }, outputs: { selectMode: "selectMode", exportOptionsChange: "exportOptionsChange" }, decls: 14, vars: 17, consts: [[1, "import-export-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], ["class", "igo-form", 3, "formGroup", 4, "ngIf"], ["class", "mat-typography", 4, "ngIf"], [1, "igo-form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], [3, "value", "click", 4, "ngFor", "ngForOf"], ["tooltip-position", "below", "matTooltipShowDelay", "500", 1, "igo-form-button-group", 3, "matTooltip"], ["mat-raised-button", "", "type", "button", 3, "disabled", "click"], [3, "shown"], ["hidden", "", "type", "file", 3, "click", "change"], ["fileInput", ""], [3, "value", "click"], ["mat-line", "", 4, "ngIf"], ["mat-line", ""], [1, "mat-typography"], [4, "ngIf"], ["class", "mat-typography", 3, "html", 4, "ngIf"], [1, "mat-typography", 3, "html"], ["multiple", "", 3, "value", "valueChange"], ["class", "export-select-trigger", 4, "ngIf"], [3, "ngClass", "value", "click", 4, "ngFor", "ngForOf"], ["formControlName", "format"], ["disabled", "true", 4, "ngIf"], ["class", "igo-input-container", 4, "ngIf"], ["class", "export-combine-layers mat-typography", 4, "ngIf"], ["class", "export-separator mat-typography", 4, "ngIf"], ["class", "export-options mat-typography", 4, "ngIf"], [1, "igo-form-button-group"], [1, "export-select-trigger"], [3, "ngClass", "value", "click"], [3, "labelPosition", "click", "checked", "change", 4, "ngIf"], [3, "labelPosition", "click", "checked", "change"], [3, "value", 4, "ngFor", "ngForOf"], ["disabled", "true"], ["matInput", "", "formControlName", "name", 3, "placeholder"], ["formControlName", "encoding"], [1, "export-combine-layers", "mat-typography"], ["formControlName", "combineLayers", 3, "labelPosition"], [1, "export-separator", "mat-typography"], ["formControlName", "separator", 3, "labelPosition"], [1, "export-options", "mat-typography"], ["formControlName", "featureInMapExtent", 3, "labelPosition"]], template: function ImportExportComponent_Template(rf, ctx) { if (rf & 1) {
1164
+ i0.ɵɵelementStart(0, "div", 0)(1, "mat-button-toggle-group", 1);
1165
+ i0.ɵɵlistener("change", function ImportExportComponent_Template_mat_button_toggle_group_change_1_listener($event) { return ctx.onImportExportChange($event); });
1166
+ i0.ɵɵelementStart(2, "mat-button-toggle", 2);
1167
+ i0.ɵɵtext(3);
1168
+ i0.ɵɵpipe(4, "translate");
1169
+ i0.ɵɵelementEnd();
1170
+ i0.ɵɵelementStart(5, "mat-button-toggle", 2);
1171
+ i0.ɵɵtext(6);
1172
+ i0.ɵɵpipe(7, "translate");
1173
+ i0.ɵɵelementEnd()()();
1174
+ i0.ɵɵtemplate(8, ImportExportComponent_form_8_Template, 20, 24, "form", 3);
1175
+ i0.ɵɵtemplate(9, ImportExportComponent_section_9_Template, 3, 2, "section", 4);
1176
+ i0.ɵɵtemplate(10, ImportExportComponent_section_10_Template, 4, 3, "section", 4);
1177
+ i0.ɵɵpipe(11, "async");
1178
+ i0.ɵɵtemplate(12, ImportExportComponent_form_12_Template, 37, 38, "form", 3);
1179
+ i0.ɵɵpipe(13, "async");
1180
+ } if (rf & 2) {
1181
+ i0.ɵɵadvance(1);
1182
+ i0.ɵɵproperty("value", ctx.selectedMode);
1183
+ i0.ɵɵadvance(1);
1184
+ i0.ɵɵproperty("value", "import");
1185
+ i0.ɵɵadvance(1);
1186
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 9, "igo.geo.importExportForm.importTabTitle"), " ");
1187
+ i0.ɵɵadvance(2);
1188
+ i0.ɵɵproperty("value", "export");
1189
+ i0.ɵɵadvance(1);
1190
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(7, 11, "igo.geo.importExportForm.exportTabTitle"), " ");
1191
+ i0.ɵɵadvance(2);
1192
+ i0.ɵɵproperty("ngIf", ctx.selectedMode === "import");
1193
+ i0.ɵɵadvance(1);
1194
+ i0.ɵɵproperty("ngIf", ctx.selectedMode === "import");
1195
+ i0.ɵɵadvance(1);
1196
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(11, 13, ctx.exportableLayers$).length === 0 && ctx.selectedMode === "export");
1197
+ i0.ɵɵadvance(2);
1198
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(13, 15, ctx.exportableLayers$).length > 0 && ctx.selectedMode === "export");
1199
+ } }, dependencies: [i8.MatTooltip, i6.ɵNgNoValidate, i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgControlStatusGroup, i6.FormGroupDirective, i6.FormControlName, i9.NgClass, i9.NgForOf, i9.NgIf, i10.MatButton, i11.MatButtonToggleGroup, i11.MatButtonToggle, i12.MatFormField, i12.MatLabel, i13.MatSelect, i13.MatSelectTrigger, i14.MatOption, i15.MatInput, i16.MatSlideToggle, i17.SpinnerComponent, i17.CustomHtmlComponent, i9.AsyncPipe, i18.TranslatePipe, i17.KeyValuePipe], styles: ["mat-option.igo-export-layer-mat-option[_ngcontent-%COMP%]{height:5em;line-height:1em}.import-export-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.import-export-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.import-export-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:50%}h4[_ngcontent-%COMP%]{padding:0 5px}.igo-form[_ngcontent-%COMP%]{padding:15px 5px}.igo-input-container[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.igo-form-button-group[_ngcontent-%COMP%]{text-align:center;padding-top:10px}igo-spinner[_ngcontent-%COMP%]{position:absolute;padding-left:10px}.export-options[_ngcontent-%COMP%], .export-combine-layers[_ngcontent-%COMP%], .export-separator[_ngcontent-%COMP%]{overflow-x:hidden}.export-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%], .export-combine-layers[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%], .export-separator[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.export-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content, .export-combine-layers[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content, .export-separator[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.export-select-trigger[_ngcontent-%COMP%]{opacity:.75;font-size:.75em}"] });
1200
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ImportExportComponent, [{
1201
+ type: Component,
1202
+ args: [{ selector: 'igo-import-export', template: "<div class=\"import-export-toggle mat-typography\">\n <mat-button-toggle-group\n [value]=\"selectedMode\"\n (change)=\"onImportExportChange($event)\">\n <mat-button-toggle [value]=\"'import'\">\n {{'igo.geo.importExportForm.importTabTitle' | translate}}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{'igo.geo.importExportForm.exportTabTitle' | translate}}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<form class=\"igo-form\" [formGroup]=\"importForm\" *ngIf=\"selectedMode === 'import'\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.importProjPlaceholder' | translate}}</mat-label>\n <mat-select\n [(value)]=\"inputProj\">\n <mat-option\n *ngFor=\"let projection of (projections$ | async)\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\">\n <p mat-line *ngIf=\"projection.translateKey\">{{('igo.geo.importExportForm.projections.' + projection.translateKey) | translate: projection}}</p>\n <p mat-line *ngIf=\"!projection.translateKey\">{{projection.alias}}</p>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"importForm.invalid ? ('igo.geo.importExportForm.projections.choose' | translate) : ('igo.geo.importExportForm.importButton' | translate)\"\n class=\"igo-form-button-group\">\n <button\n [disabled]=\"importForm.invalid || (loading$ | async)\"\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\">\n {{'igo.geo.importExportForm.importButton' | translate}}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n hidden\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($event.target.files)\">\n </div>\n</form>\n<section class=\"mat-typography\" *ngIf=\"selectedMode === 'import'\">\n <div *ngIf=\"importHtmlClarifications === ''\">\n <h4>{{'igo.geo.importExportForm.importClarifications' | translate}}</h4>\n <ul>\n <li>{{'igo.geo.importExportForm.importSizeMax' | translate: {size: fileSizeMb} }}</li>\n <li>{{'igo.geo.importExportForm.importFormatAuthorized' | translate}}</li>\n <li>{{'igo.geo.importExportForm.importShpZip' | translate}}</li>\n </ul>\n </div>\n <igo-custom-html *ngIf=\"importHtmlClarifications !== ''\" class=\"mat-typography\"\n [html]=\"importHtmlClarifications\">\n </igo-custom-html>\n</section>\n\n<section class=\"mat-typography\" *ngIf=\"(exportableLayers$ | async).length === 0 && selectedMode === 'export'\">\n <h4>{{'igo.geo.importExportForm.exportNoLayersExportable' | translate}}</h4>\n</section>\n\n<form class=\"igo-form\" [formGroup]=\"form\" *ngIf=\"(exportableLayers$ | async).length > 0 && selectedMode === 'export'\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.exportLayerPlaceholder' | translate}}</mat-label>\n <mat-select\n [(value)]=\"layers\" multiple>\n <mat-select-trigger>\n {{layers.length ? getLayerTitleById(layers[0]) : ''}}\n <span *ngIf=\"layers.length > 1\" class=\"export-select-trigger\">\n (+{{layers.length - 1}} {{(layers?.length === 2 ? 'igo.geo.importExportForm.other' : 'igo.geo.importExportForm.others') | translate }})\n </span>\n </mat-select-trigger>\n <mat-option\n *ngFor=\"let layer of (exportableLayers$ | async)\"\n [ngClass]=\"{'igo-export-layer-mat-option': layerHasSelectedFeatures(layer)}\"\n [value]=\"layer.id\"\n (click)=\"$event.stopPropagation()\">\n <p mat-line>{{layer.title}}</p>\n <p mat-line>\n <mat-slide-toggle *ngIf=\"layerHasSelectedFeatures(layer)\"\n [labelPosition]=\"'after'\"\n (click)=\"onlySelectedClick($event,layer.id)\"\n (checked)=\"inLayersIdToExportSelectionOnly(layer)\"\n (change)=\"onlySelected($event,layer.id)\">\n <small>{{'igo.geo.importExportForm.exportSelectedFeature' | translate}}</small>\n </mat-slide-toggle>\n </p>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.exportFormatPlaceholder' | translate}}</mat-label>\n <mat-select\n formControlName=\"format\">\n <ng-container *ngIf=\"(formats$ | async).length !== 0\">\n <mat-option *ngFor=\"let format of (formats$ | async) | keyvalue\" [value]=\"format.key\">\n {{'igo.geo.export.format.' + format.value | translate}}\n </mat-option>\n </ng-container>\n <mat-option *ngIf=\"(formats$ | async).length === 0\" disabled=\"true\">\n {{'igo.geo.export.noFormat.title' | translate}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\" *ngIf=\"forceNaming && form.value.format !== 'URL'\">\n <mat-form-field>\n <input matInput formControlName=\"name\" placeholder=\"{{'igo.geo.importExportForm.exportFileNamePlaceholder' | translate}}\">\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\" *ngIf=\"form.value.format === 'CSVcomma' || form.value.format === 'CSVsemicolon'\">\n <mat-form-field>\n <mat-label>{{'igo.geo.importExportForm.encodingPlaceholder' | translate}}</mat-label>\n <mat-select\n formControlName=\"encoding\">\n <ng-container *ngIf=\"(encodings$ | async).length !== 0\">\n <mat-option *ngFor=\"let encoding of (encodings$ | async) | keyvalue\" [value]=\"encoding.key\">\n {{'igo.geo.export.encoding.' + encoding.value | translate}}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"export-combine-layers mat-typography\" *ngIf=\"layers.length > 1 && (form.value.format === 'CSVcomma' || form.value.format === 'CSVsemicolon')\">\n <mat-slide-toggle\n formControlName=\"combineLayers\"\n [labelPosition]=\"'before'\">\n {{'igo.geo.importExportForm.exportCombineResults' | translate}}\n </mat-slide-toggle>\n </div>\n\n <div class=\"export-separator mat-typography\" *ngIf=\"layers.length > 1 && (form.value.format === 'CSVcomma' || form.value.format === 'CSVsemicolon') && form.value.combineLayers\">\n <mat-slide-toggle\n formControlName=\"separator\"\n [labelPosition]=\"'before'\">\n {{'igo.geo.importExportForm.exportSeparator' | translate}}\n </mat-slide-toggle>\n </div>\n\n <div class=\"export-options mat-typography\" *ngIf=\"form.value.format !== 'URL'\">\n <mat-slide-toggle\n formControlName=\"featureInMapExtent\"\n [labelPosition]=\"'before'\">\n {{'igo.geo.importExportForm.exportFeatureInExtent' | translate}}\n </mat-slide-toggle>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\">\n {{form.value.format !== 'URL' ? ('igo.geo.importExportForm.exportButton' | translate): (form.value.layers.length > 1 ? ('igo.geo.importExportForm.exportButtonLinks' | translate): ('igo.geo.importExportForm.exportButtonLink' | translate))}}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n\n <igo-custom-html *ngIf=\"exportHtmlClarifications !== ''\" class=\"mat-typography\"\n [html]=\"exportHtmlClarifications\">\n </igo-custom-html>\n\n</form>\n", styles: ["mat-option.igo-export-layer-mat-option{height:5em;line-height:1em}.import-export-toggle{padding:10px;text-align:center}.import-export-toggle mat-button-toggle-group{width:100%}.import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}h4{padding:0 5px}.igo-form{padding:15px 5px}.igo-input-container mat-form-field{width:100%}.igo-form-button-group{text-align:center;padding-top:10px}igo-spinner{position:absolute;padding-left:10px}.export-options,.export-combine-layers,.export-separator{overflow-x:hidden}.export-options mat-slide-toggle,.export-combine-layers mat-slide-toggle,.export-separator mat-slide-toggle{width:100%;margin:10px}.export-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content,.export-combine-layers mat-slide-toggle ::ng-deep .mat-slide-toggle-content,.export-separator mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.export-select-trigger{opacity:.75;font-size:.75em}\n"] }]
1203
+ }], function () { return [{ type: i1.ImportService }, { type: i2.ExportService }, { type: i3.LanguageService }, { type: i3.MessageService }, { type: i4.StyleListService }, { type: i5.StyleService }, { type: i6.UntypedFormBuilder }, { type: i3.ConfigService }, { type: i0.ChangeDetectorRef }, { type: i3.StorageService }, { type: i7.DownloadService }]; }, { selectFirstProj: [{
1204
+ type: Input
1205
+ }], map: [{
1206
+ type: Input
1207
+ }], projectionsLimitations: [{
1208
+ type: Input
1209
+ }], store: [{
1210
+ type: Input
1211
+ }], selectedMode: [{
1212
+ type: Input
1213
+ }], selectMode: [{
1214
+ type: Output
1215
+ }], exportOptions$: [{
1216
+ type: Input
1217
+ }], exportOptionsChange: [{
1218
+ type: Output
1219
+ }] }); })();
1220
1220
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCxNQUFNLEVBQ04sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFRckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUzRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHckUsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN4QixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFHaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdC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QyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDcEU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVU7YUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDMUU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCO2FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDcEMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxF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QUssQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQzs7MEZBbjVCVSxxQkFBcUI7d0VBQXJCLHFCQUFxQjtRQ2hFbEMsOEJBQWlELGlDQUFBO1FBR3pDLDJIQUFVLGdDQUE0QixJQUFDO1FBQ3ZDLDRDQUFzQztRQUNwQyxZQUNGOztRQUFBLGlCQUFvQjtRQUNwQiw0Q0FBc0M7UUFDcEMsWUFDRjs7UUFBQSxpQkFBb0IsRUFBQSxFQUFBO1FBSTVCLDBFQXNDTztRQUNQLDhFQVlVO1FBRVYsZ0ZBRVU7O1FBRVYsNEVBNEdPOzs7UUFoTEMsZUFBc0I7UUFBdEIsd0NBQXNCO1FBRUgsZUFBa0I7UUFBbEIsZ0NBQWtCO1FBQ25DLGVBQ0Y7UUFERSxnR0FDRjtRQUNtQixlQUFrQjtRQUFsQixnQ0FBa0I7UUFDbkMsZUFDRjtRQURFLGlHQUNGO1FBSXlDLGVBQStCO1FBQS9CLG9EQUErQjtRQXVDL0MsZUFBK0I7UUFBL0Isb0RBQStCO1FBYy9CLGVBQTJFO1FBQTNFLGtIQUEyRTtRQUlqRSxlQUF5RTtRQUF6RSxnSEFBeUU7O3VGRE52RyxxQkFBcUI7Y0FMakMsU0FBUzsyQkFDRSxtQkFBbUI7eVdBNENwQixlQUFlO2tCQUF2QixLQUFLO1lBRUcsR0FBRztrQkFBWCxLQUFLO1lBSUYsc0JBQXNCO2tCQUR6QixLQUFLO1lBWUcsS0FBSztrQkFBYixLQUFLO1lBRUcsWUFBWTtrQkFBcEIsS0FBSztZQUVJLFVBQVU7a0JBQW5CLE1BQU07WUFFRSxjQUFjO2tCQUF0QixLQUFLO1lBSUksbUJBQW1CO2tCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAsIFVudHlwZWRGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIE1lc3NhZ2VTZXJ2aWNlLFxuICBMYW5ndWFnZVNlcnZpY2UsXG4gIENvbmZpZ1NlcnZpY2UsXG4gIFN0b3JhZ2VTZXJ2aWNlXG59IGZyb20gJ0BpZ28yL2NvcmUnO1xuaW1wb3J0IHsgc3RyRW51bSB9IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBDbHVzdGVyRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2NsdXN0ZXItZGF0YXNvdXJjZSc7XG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvbGF5ZXInO1xuaW1wb3J0IHsgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL3ZlY3Rvci1sYXllcic7XG5pbXBvcnQgeyBBbnlMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvYW55LWxheWVyJztcbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvZGF0YXNvdXJjZS5pbnRlcmZhY2UnO1xuaW1wb3J0IG9sUG9pbnQgZnJvbSAnb2wvZ2VvbS9Qb2ludCc7XG5pbXBvcnQgeyBjaXJjdWxhciB9IGZyb20gJ29sL2dlb20vUG9seWdvbic7XG5cbmltcG9ydCB7XG4gIGhhbmRsZUZpbGVFeHBvcnRFcnJvcixcbiAgaGFuZGxlRmlsZUV4cG9ydFN1Y2Nlc3Ncbn0gZnJvbSAnLi4vc2hhcmVkL2V4cG9ydC51dGlscyc7XG5pbXBvcnQgeyBFeHBvcnRPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL2V4cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXhwb3J0Rm9ybWF0LCBFbmNvZGluZ0Zvcm1hdCB9IGZyb20gJy4uL3NoYXJlZC9leHBvcnQudHlwZSc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2V4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IEltcG9ydFNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvaW1wb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgaGFuZGxlRmlsZUltcG9ydFN1Y2Nlc3MsXG4gIGhhbmRsZUZpbGVJbXBvcnRFcnJvclxufSBmcm9tICcuLi9zaGFyZWQvaW1wb3J0LnV0aWxzJztcbmltcG9ydCB7IFN0eWxlU2VydmljZSB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9zdHlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0eWxlTGlzdFNlcnZpY2UgfSBmcm9tICcuLi9zdHlsZS1saXN0L3N0eWxlLWxpc3Quc2VydmljZSc7XG5pbXBvcnQgeyBza2lwV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFbnRpdHlSZWNvcmQsIFdvcmtzcGFjZSB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVN0b3JlIH0gZnJvbSAnQGlnbzIvY29tbW9uJztcbmltcG9ydCB7IFdmc1dvcmtzcGFjZSB9IGZyb20gJy4uLy4uL3dvcmtzcGFjZS9zaGFyZWQvd2ZzLXdvcmtzcGFjZSc7XG5pbXBvcnQgeyBFZGl0aW9uV29ya3NwYWNlIH0gZnJvbSAnLi4vLi4vd29ya3NwYWNlL3NoYXJlZC9lZGl0aW9uLXdvcmtzcGFjZSc7XG5pbXBvcnQgeyBGZWF0dXJlV29ya3NwYWNlIH0gZnJvbSAnLi4vLi4vd29ya3NwYWNlL3NoYXJlZC9mZWF0dXJlLXdvcmtzcGFjZSc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZUNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQgeyBJbnB1dFByb2plY3Rpb25zLCBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucyB9IGZyb20gJy4uLy4uL21hcC8nO1xuaW1wb3J0IHsgRG93bmxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZG93bmxvYWQvc2hhcmVkL2Rvd25sb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHMgfSBmcm9tICcuLi8uLi9tYXAnO1xuXG5pbXBvcnQgb2xWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgb2xDbHVzdGVyU291cmNlIGZyb20gJ29sL3NvdXJjZS9DbHVzdGVyJztcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1pbXBvcnQtZXhwb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltcG9ydC1leHBvcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbXBvcnQtZXhwb3J0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW1wb3J0RXhwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHVibGljIGltcG9ydEZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIHB1YmxpYyBmb3JtYXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcbiAgcHVibGljIGVuY29kaW5ncyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyBleHBvcnRhYmxlTGF5ZXJzJDogQmVoYXZpb3JTdWJqZWN0PEFueUxheWVyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChcbiAgICBbXVxuICApO1xuICBwdWJsaWMgbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGZvcmNlTmFtaW5nID0gZmFsc2U7XG4gIHB1YmxpYyBjb250cm9sRm9ybWF0ID0gJ2Zvcm1hdCc7XG5cbiAgcHJpdmF0ZSBsYXllcnMkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGV4cG9ydGFibGVMYXllcnMkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvcm1hdHMkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGVuY29kaW5ncyQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybUxheWVyJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBleHBvcnRPcHRpb25zJCQ6IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgaW1wb3J0SHRtbENsYXJpZmljYXRpb25zOiBzdHJpbmc7XG4gIHB1YmxpYyBleHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnM6IHN0cmluZztcblxuICBwcml2YXRlIGVzcGdDb2RlUmVnZXggPSBuZXcgUmVnRXhwKCdeXFxcXGR7NCw2fScpO1xuICBwcml2YXRlIGNsaWVudFNpZGVGaWxlU2l6ZU1heDogbnVtYmVyO1xuICBwdWJsaWMgZmlsZVNpemVNYjogbnVtYmVyO1xuXG4gIHB1YmxpYyBwcm9qZWN0aW9ucyQ6IEJlaGF2aW9yU3ViamVjdDxJbnB1dFByb2plY3Rpb25zW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIHByaXZhdGUgcHJvamVjdGlvbnNDb25zdHJhaW50czogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnM7XG5cbiAgcHVibGljIHBvcHVwQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHJldmlvdXNMYXllclNwZWNzJDogQmVoYXZpb3JTdWJqZWN0PFxuICAgIHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB2aXNpYmxlOiBib29sZWFuO1xuICAgICAgb3BhY2l0eTogbnVtYmVyO1xuICAgICAgcXVlcnlhYmxlOiBib29sZWFuO1xuICAgIH1bXVxuICA+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuXG4gIEBJbnB1dCgpIHNlbGVjdEZpcnN0UHJvajogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG1hcDogSWdvTWFwO1xuXG4gIHByaXZhdGUgX3Byb2plY3Rpb25zTGltaXRhdGlvbnM6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zID0ge307XG4gIEBJbnB1dCgpXG4gIHNldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKHZhbHVlOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucykge1xuICAgIHRoaXMuX3Byb2plY3Rpb25zTGltaXRhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbXB1dGVQcm9qZWN0aW9ucygpO1xuICB9XG4gIGdldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKCk6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGF0IGhvbGRzIHRoZSBhdmFpbGFibGUgd29ya3NwYWNlcy5cbiAgICovXG4gIEBJbnB1dCgpIHN0b3JlOiBXb3Jrc3BhY2VTdG9yZTtcblxuICBASW5wdXQoKSBzZWxlY3RlZE1vZGUgPSAnaW1wb3J0JztcblxuICBAT3V0cHV0KCkgc2VsZWN0TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBJbnB1dCgpIGV4cG9ydE9wdGlvbnMkOiBCZWhhdmlvclN1YmplY3Q8RXhwb3J0T3B0aW9ucz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIEBPdXRwdXQoKSBleHBvcnRPcHRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxFeHBvcnRPcHRpb25zPigpO1xuXG4gIGdldCBsYXllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2xheWVycycpLnZhbHVlO1xuICB9XG4gIHNldCBsYXllcnModmFsdWUpIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxheWVyczogdmFsdWUgfSk7XG4gIH1cblxuICBnZXQgaW5wdXRQcm9qKCkge1xuICAgIHJldHVybiB0aGlzLmltcG9ydEZvcm0uZ2V0KCdpbnB1dFByb2onKS52YWx1ZTtcbiAgfVxuICBzZXQgaW5wdXRQcm9qKHZhbHVlKSB7XG4gICAgdGhpcy5pbXBvcnRGb3JtLnBhdGNoVmFsdWUoeyBpbnB1dFByb2o6IHZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0IHBvcHVwQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoJ2ltcG9ydEV4cG9ydFBvcHVwQWxsb3dlZCcpIGFzIGJvb2xlYW4gfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgcG9wdXBBbGxvd2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2ltcG9ydEV4cG9ydFBvcHVwQWxsb3dlZCcsIHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW1wb3J0U2VydmljZTogSW1wb3J0U2VydmljZSxcbiAgICBwcml2YXRlIGV4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHN0eWxlTGlzdFNlcnZpY2U6IFN0eWxlTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdHlsZVNlcnZpY2U6IFN0eWxlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb3dubG9hZFNlcnZpY2U6IERvd25sb2FkU2VydmljZVxuICApIHtcbiAgICB0aGlzLmxvYWRDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIHRoaXMuY29tcHV0ZVByb2plY3Rpb25zKCk7XG4gICAgdGhpcy5pbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydEh0bWxDbGFyaWZpY2F0aW9ucycpO1xuICAgIHRoaXMuZXhwb3J0SHRtbENsYXJpZmljYXRpb25zID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMnKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubGF5ZXJzJCQgPSB0aGlzLm1hcC5sYXllcnMkLnN1YnNjcmliZSgobGF5ZXJzKSA9PiB7XG4gICAgICB0aGlzLmV4cG9ydGFibGVMYXllcnMkLm5leHQoXG4gICAgICAgIGxheWVycy5maWx0ZXIoKGxheWVyOiBMYXllcikgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllciAmJiBsYXllci5leHBvcnRhYmxlID09PSB0cnVlKSB8fFxuICAgICAgICAgICAgKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZCAmJlxuICAgICAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQudXJsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pIGFzIEFueUxheWVyW11cbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgY29uZmlnRmlsZVNpemVNYiA9IHRoaXMuY29uZmlnLmdldENvbmZpZyhcbiAgICAgICdpbXBvcnRFeHBvcnQuY2xpZW50U2lkZUZpbGVTaXplTWF4TWInXG4gICAgKTtcbiAgICB0aGlzLmNsaWVudFNpZGVGaWxlU2l6ZU1heCA9XG4gICAgICAoY29uZmlnRmlsZVNpemVNYiA/IGNvbmZpZ0ZpbGVTaXplTWIgOiAzMCkgKiBNYXRoLnBvdygxMDI0LCAyKTtcbiAgICB0aGlzLmZpbGVTaXplTWIgPSB0aGlzLmNsaWVudFNpZGVGaWxlU2l6ZU1heCAvIE1hdGgucG93KDEwMjQsIDIpO1xuXG4gICAgdGhpcy5leHBvcnRPcHRpb25zJCQgPSB0aGlzLmV4cG9ydE9wdGlvbnMkXG4gICAgICAucGlwZShza2lwV2hpbGUoKGV4cG9ydE9wdGlvbnMpID0+ICFleHBvcnRPcHRpb25zKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV4cG9ydE9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoZXhwb3J0T3B0aW9ucywgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgIGlmIChleHBvcnRPcHRpb25zLmxheWVycykge1xuICAgICAgICAgIHRoaXMuY29tcHV0ZUZvcm1hdHMoXG4gICAgICAgICAgICBleHBvcnRPcHRpb25zLmxheWVycy5tYXAoKGwpID0+IHRoaXMubWFwLmdldExheWVyQnlJZChsKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLmZvcm1MYXllciQkID0gdGhpcy5mb3JtXG4gICAgICAuZ2V0KCdmb3JtYXQnKVxuICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgLnN1YnNjcmliZSgoZm9ybWF0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9ncmVGb3JtYXRzID0gT2JqZWN0LmtleXMoRXhwb3J0U2VydmljZS5vZ3JlRm9ybWF0cyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5wb3B1cENoZWNrZWQgJiZcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdsYXllcnMnKS52YWx1ZT8ubGVuZ3RoID4gMSAmJlxuICAgICAgICAgIChvZ3JlRm9ybWF0cy5pbmRleE9mKGZvcm1hdCkgPj0gMCB8fCBmb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5VUkwpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhbmRsZVBvcHVwKHRydWUpKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogdW5kZWZpbmVkIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtTGF5ZXIkJCA9IHRoaXMuZm9ybVxuICAgICAgLmdldCgnbGF5ZXJzJylcbiAgICAgIC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChsYXllcnNJZCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVByZXZpb3VzTGF5ZXJTcGVjcygpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZExheWVycyA9IGxheWVyc0lkIGluc3RhbmNlb2YgQXJyYXkgPyBsYXllcnNJZCA6IFtsYXllcnNJZF07XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgbGF5ZXJzOiBzZWxlY3RlZExheWVycyB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IHNlbGVjdGVkTGF5ZXJzLm1hcCgobCkgPT4gdGhpcy5tYXAuZ2V0TGF5ZXJCeUlkKGwpKTtcbiAgICAgICAgdGhpcy5jb21wdXRlRm9ybWF0cyhsYXllcnMpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1hdHMkLnZhbHVlKS5pbmRleE9mKHRoaXMuZm9ybS52YWx1ZS5mb3JtYXQpID09PVxuICAgICAgICAgIC0xXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3BlY3M6IHtcbiAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgICAgICAgb3BhY2l0eTogbnVtYmVyO1xuICAgICAgICAgIHF1ZXJ5YWJsZTogYm9vbGVhbjtcbiAgICAgICAgfVtdID0gW107XG4gICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxheWVyIGluc3RhbmNlb2YgVmVjdG9yTGF5ZXIgJiZcbiAgICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub2wuZ2V0RmVhdHVyZXMoKS5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByZXZpb3VzU3BlY3MucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgICAgICAgICAgdmlzaWJsZTogbGF5ZXIudmlzaWJsZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogbGF5ZXIub3BhY2l0eSxcbiAgICAgICAgICAgICAgcXVlcnlhYmxlOiAobGF5ZXIgYXMgYW55KS5xdWVyeWFibGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGF5ZXIub3BhY2l0eSA9IDA7XG4gICAgICAgICAgICBsYXllci52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNMYXllclNwZWNzJC5uZXh0KHByZXZpb3VzU3BlY3MpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmZvcm1hdHMkJCA9IHRoaXMuZm9ybWF0cyRcbiAgICAgIC5waXBlKHNraXBXaGlsZSgoZm9ybWF0cykgPT4gIWZvcm1hdHMpKVxuICAgICAgLnN1YnNjcmliZSgoZm9ybWF0cykgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZm9ybWF0cykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IGZvcm1hdHNbT2JqZWN0LmtleXMoZm9ybWF0cylbMF1dIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuZW5jb2RpbmdzJCQgPSB0aGlzLmVuY29kaW5ncyRcbiAgICAgIC5waXBlKHNraXBXaGlsZSgoZW5jb2RpbmdzKSA9PiAhZW5jb2RpbmdzKSlcbiAgICAgIC5zdWJzY3JpYmUoKGVuY29kaW5ncykgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZW5jb2RpbmdzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGVuY29kaW5nOiBlbmNvZGluZ3NbT2JqZWN0LmtleXMoZW5jb2RpbmdzKVswXV0gfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5leHBvcnRhYmxlTGF5ZXJzJCQgPSB0aGlzLmV4cG9ydGFibGVMYXllcnMkXG4gICAgICAucGlwZShza2lwV2hpbGUoKGxheWVycykgPT4gIWxheWVycykpXG4gICAgICAuc3Vic2NyaWJlKChsYXllcnMpID0+IHtcbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxheWVyczogbGF5ZXJzWzBdLmlkIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLmNvbnRyb2xGb3JtYXRdLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGZvcm1hdCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdCA9PT0gRXhwb3J0Rm9ybWF0LkNTVmNvbW1hIHx8IGZvcm1hdCA9PT0gRXhwb3J0Rm9ybWF0LkNTVnNlbWljb2xvbikge1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGVuY29kaW5nOiBFbmNvZGluZ0Zvcm1hdC5MQVRJTjEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGVuY29kaW5nOiBFbmNvZGluZ0Zvcm1hdC5VVEY4IH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RGaXJzdFByb2opIHtcbiAgICAgIGlmICh0aGlzLnByb2plY3Rpb25zJC52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5pbXBvcnRGb3JtLnBhdGNoVmFsdWUoeyBpbnB1dFByb2o6IHsgdHJhbnNsYXRlS2V5OiAnbmFkODMnLCBhbGlhczogJ05BRDgzJywgY29kZTogJ0VQU0c6NDMyNicsIHpvbmU6ICcnIH0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmltcG9ydEZvcm0ucGF0Y2hWYWx1ZSh7IGlucHV0UHJvajogdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbMF0gfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1wb3J0Rm9ybS5wYXRjaFZhbHVlKHsgaW5wdXRQcm9qOiB1bmRlZmluZWQgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlUHJvamVjdGlvbnMoKSB7XG4gICAgdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzID0gY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHModGhpcy5wcm9qZWN0aW9uc0xpbWl0YXRpb25zKTtcbiAgICBjb25zdCBwcm9qZWN0aW9uczogSW5wdXRQcm9qZWN0aW9uc1tdID0gW107XG5cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm5hZDgzKSB7XG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHsgdHJhbnNsYXRlS2V5OiAnbmFkODMnLCBhbGlhczogJ05BRDgzJywgY29kZTogJ0VQU0c6NDI2OScsIHpvbmU6ICcnIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLndnczg0KSB7XG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHsgdHJhbnNsYXRlS2V5OiAnd2dzODQnLCBhbGlhczogJ1dHUzg0JywgY29kZTogJ0VQU0c6NDMyNicsIHpvbmU6ICcnIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLndlYk1lcmNhdG9yKSB7XG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHsgdHJhbnNsYXRlS2V5OiAnd2ViTWVyY2F0b3InLCBhbGlhczogJ1dlYiBNZXJjYXRvcicsIGNvZGU6ICdFUFNHOjM4NTcnLCB6b25lOiAnJyB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bSkge1xuICAgICAgLy8gYWxsIG10bSB6b25lc1xuICAgICAgY29uc3QgbWluWm9uZSA9IHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5tdG1ab25lLm1pblpvbmU7XG4gICAgICBjb25zdCBtYXhab25lID0gdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bVpvbmUubWF4Wm9uZTtcblxuICAgICAgZm9yIChsZXQgbXRtWm9uZSA9IG1pblpvbmU7IG10bVpvbmUgPD0gbWF4Wm9uZTsgbXRtWm9uZSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBtdG1ab25lIDwgMTAgPyBgRVBTRzozMjE4JHttdG1ab25lfWAgOiBgRVBTRzozMjEkezgwICsgbXRtWm9uZX1gO1xuICAgICAgICBwcm9qZWN0aW9ucy5wdXNoKHsgdHJhbnNsYXRlS2V5OiAnbXRtJywgYWxpYXM6IGBNVE0gJHttdG1ab25lfWAsIGNvZGUsIHpvbmU6IGAke210bVpvbmV9YCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bSkge1xuICAgICAgLy8gYWxsIHV0bSB6b25lc1xuICAgICAgY29uc3QgbWluWm9uZSA9IHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy51dG1ab25lLm1pblpvbmU7XG4gICAgICBjb25zdCBtYXhab25lID0gdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bVpvbmUubWF4Wm9uZTtcblxuICAgICAgZm9yIChsZXQgdXRtWm9uZSA9IG1pblpvbmU7IHV0bVpvbmUgPD0gbWF4Wm9uZTsgdXRtWm9uZSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSB1dG1ab25lIDwgMTAgPyBgRVBTRzozMjYwJHt1dG1ab25lfWAgOiBgRVBTRzozMjYke3V0bVpvbmV9YDtcbiAgICAgICAgcHJvamVjdGlvbnMucHVzaCh7IHRyYW5zbGF0ZUtleTogJ3V0bScsIGFsaWFzOiBgVVRNICR7dXRtWm9uZX1gLCBjb2RlLCB6b25lOiBgJHt1dG1ab25lfWAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbmZpZ1Byb2plY3Rpb24gPSBbXTtcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnByb2pGcm9tQ29uZmlnKSB7XG4gICAgICBjb25maWdQcm9qZWN0aW9uID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdwcm9qZWN0aW9ucycpIHx8IFtdO1xuICAgIH1cblxuICAgIHRoaXMucHJvamVjdGlvbnMkLm5leHQoY29uZmlnUHJvamVjdGlvbi5jb25jYXQocHJvamVjdGlvbnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V29ya3NwYWNlQnlMYXllcklkKGlkOiBzdHJpbmcpOiBXb3Jrc3BhY2Uge1xuICAgIGNvbnN0IHdrc0Zyb21MYXllcklkID0gdGhpcy5zdG9yZVxuICAgICAgLmFsbCgpXG4gICAgICAuZmluZCh3b3Jrc3BhY2UgPT4gKHdvcmtzcGFjZSBhcyBXZnNXb3Jrc3BhY2UgfCBGZWF0dXJlV29ya3NwYWNlIHwgRWRpdGlvbldvcmtzcGFjZSkubGF5ZXIuaWQgPT09IGlkKTtcbiAgICBpZiAod2tzRnJvbUxheWVySWQpIHtcbiAgICAgIHJldHVybiB3a3NGcm9tTGF5ZXJJZDtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVibGljIGdldExheWVyVGl0bGVCeUlkKGlkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0TGF5ZXJCeUlkKGlkKT8udGl0bGU7XG4gIH1cblxuXG4gIGxheWVySGFzU2VsZWN0ZWRGZWF0dXJlcyhsYXllcjogTGF5ZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB3a3NGcm9tTGF5ZXIgPSB0aGlzLmdldFdvcmtzcGFjZUJ5TGF5ZXJJZChsYXllci5pZCk7XG4gICAgaWYgKHdrc0Zyb21MYXllcikge1xuICAgICAgY29uc3QgcmVjcyA9IHdrc0Zyb21MYXllci5lbnRpdHlTdG9yZS5zdGF0ZVZpZXdcbiAgICAgICAgLmZpcnN0QnkoKHJlY29yZDogRW50aXR5UmVjb3JkPEZlYXR1cmU+KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVjcyA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25seVNlbGVjdGVkKGV2ZW50OiBNYXRTbGlkZVRvZ2dsZUNoYW5nZSwgaWQ6IHN0cmluZykge1xuICAgIGxldCBsYXllcnNXaXRoU2VsZWN0aW9uID0gdGhpcy5mb3JtLnZhbHVlLmxheWVyc1dpdGhTZWxlY3Rpb247XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIGxheWVyc1dpdGhTZWxlY3Rpb24ucHVzaChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyc1dpdGhTZWxlY3Rpb24gPSBsYXllcnNXaXRoU2VsZWN0aW9uLmZpbHRlcihsYXllcklkID0+IGxheWVySWQgIT09IGlkKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBsYXllcnNXaXRoU2VsZWN0aW9uIH0pO1xuICB9XG5cbiAgcHVibGljIG9ubHlTZWxlY3RlZENsaWNrKGV2ZW50LCBpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5sYXllcnMuZmluZChsYXllcklkID0+IGxheWVySWQgPT09IGlkKSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluTGF5ZXJzSWRUb0V4cG9ydFNlbGVjdGlvbk9ubHkobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS52YWx1ZS5sYXllcnNXaXRoU2VsZWN0aW9uLmZpbmQobGF5ZXJJZCA9PiBsYXllcklkID09PSBsYXllci5pZCkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmxheWVycyQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5leHBvcnRhYmxlTGF5ZXJzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1hdHMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW5jb2RpbmdzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1MYXllciQkLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuZXhwb3J0T3B0aW9ucyQkKSB7XG4gICAgICB0aGlzLmV4cG9ydE9wdGlvbnMkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmV4cG9ydE9wdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLmZvcm0udmFsdWUpO1xuICAgIHRoaXMuaGFuZGxlUHJldmlvdXNMYXllclNwZWNzKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVByZXZpb3VzTGF5ZXJTcGVjcygpIHtcbiAgICBjb25zdCBwcmV2aW91c1NwZWNzID0gdGhpcy5wcmV2aW91c0xheWVyU3BlY3MkLnZhbHVlO1xuICAgIGlmIChwcmV2aW91c1NwZWNzICYmIHByZXZpb3VzU3BlY3MubGVuZ3RoKSB7XG4gICAgICBwcmV2aW91c1NwZWNzLmZvckVhY2goKHNwZWNzKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGF5ZXIgPSB0aGlzLm1hcC5nZXRMYXllckJ5SWQoc3BlY3MuaWQpO1xuICAgICAgICBwcmV2aW91c0xheWVyLnZpc2libGUgPSBzcGVjcy52aXNpYmxlO1xuICAgICAgICBwcmV2aW91c0xheWVyLm9wYWNpdHkgPSBzcGVjcy5vcGFjaXR5O1xuICAgICAgICAocHJldmlvdXNMYXllciBhcyBhbnkpLnF1ZXJ5YWJsZSA9IHNwZWNzLnF1ZXJ5YWJsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnByZXZpb3VzTGF5ZXJTcGVjcyQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgaW1wb3J0RmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGxldCBpbnB1dFByb2ogPSB0aGlzLmlucHV0UHJvai5jb2RlO1xuICAgIGlmICh0aGlzLmVzcGdDb2RlUmVnZXgudGVzdChpbnB1dFByb2opKSB7XG4gICAgICBpbnB1dFByb2ogPSBgRVBTRzoke2lucHV0UHJvan1gO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRoaXMuaW1wb3J0U2VydmljZS5pbXBvcnQoZmlsZSwgaW5wdXRQcm9qKS5zdWJzY3JpYmUoXG4gICAgICAgIChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB0aGlzLm9uRmlsZUltcG9ydFN1Y2Nlc3MoZmlsZSwgZmVhdHVyZXMpLFxuICAgICAgICAoZXJyb3I6IEVycm9yKSA9PiB0aGlzLm9uRmlsZUltcG9ydEVycm9yKGZpbGUsIGVycm9yKSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9wdXAocHJlQ2hlY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcDEgPSB3aW5kb3cub3BlbignJywgJ3BvcHVwJywgJ3dpZHRoPTEsIGhlaWdodD0xJyk7XG4gICAgcDEuY2xvc2UoKTtcbiAgICBjb25zdCBwMiA9IHdpbmRvdy5vcGVuKCcnLCAncG9wdXAnLCAnd2lkdGg9MSwgaGVpZ2h0PTEnKTtcbiAgICBpZiAoIXAyIHx8IHAyLmNsb3NlZCB8fCB0eXBlb2YgcDIuY2xvc2VkID09PSAndW5kZWZpbmVkJyB8fCBwMiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5vblBvcHVwQmxvY2tlZEVycm9yKHByZUNoZWNrKTtcbiAgICAgIHRoaXMucG9wdXBBbGxvd2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAyLmNsb3NlKCk7XG4gICAgICB0aGlzLnBvcHVwQWxsb3dlZCA9IHRydWU7XG4gICAgICB0aGlzLnBvcHVwQ2hlY2tlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvcHVwQWxsb3dlZDtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydEZvcm1TdWJtaXQoZGF0YTogRXhwb3J0T3B0aW9ucykge1xuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcblxuICAgIGNvbnN0IG9ncmVGb3JtYXRzID0gT2JqZWN0LmtleXMoRXhwb3J0U2VydmljZS5vZ3JlRm9ybWF0cyk7XG4gICAgaWYgKCF0aGlzLnBvcHVwQ2hlY2tlZCAmJiBkYXRhLmxheWVycy5sZW5ndGggPiAxICYmXG4gICAgICAob2dyZUZvcm1hdHMuaW5kZXhPZihkYXRhLmZvcm1hdCkgPj0gMCB8fCBkYXRhLmZvcm1hdCA9PT0gRXhwb3J0Rm9ybWF0LlVSTCkgJiYgIXRoaXMucG9wdXBBbGxvd2VkKSB7XG4gICAgICB0aGlzLmhhbmRsZVBvcHVwKCk7XG4gICAgfVxuXG4gICAgbGV0IGdlb21UeXBlc0NTVjogeyBnZW9tZXRyeVR5cGU6IHN0cmluZywgZmVhdHVyZXM6IGFueVtdIH1bXSA9IFtdO1xuICAgIGxldCBmZWF0dXJlc0NTVjogYW55W10gPSBbXTtcbiAgICBsZXQgZmlsZW5hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgICBmb3IgKGNvbnN0IFtsYXllckluZGV4LCBsYXllcl0gb2YgZGF0YS5sYXllcnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBsYXkgPSB0aGlzLm1hcC5nZXRMYXllckJ5SWQobGF5ZXIpO1xuICAgICAgaWYgKCEoZGF0YS5mb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1ZzZW1pY29sb24gfHwgZGF0YS5mb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1Zjb21tYSlcbiAgICAgIHx8ICFkYXRhLmNvbWJpbmVMYXllcnMgfHwgZGF0YS5sYXllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbGVuYW1lID0gbGF5LnRpdGxlO1xuICAgICAgICBpZiAoZGF0YS5uYW1lKSB7XG4gICAgICAgICAgZmlsZW5hbWUgPSBkYXRhLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVuYW1lID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZXhwb3J0LmNvbWJpbmVkTGF5ZXJzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkU09wdGlvbnM6IERhdGFTb3VyY2VPcHRpb25zID0gbGF5LmRhdGFTb3VyY2Uub3B0aW9ucztcbiAgICAgIGlmIChkYXRhLmZvcm1hdCA9PT0gRXhwb3J0Rm9ybWF0LlVSTCAmJiBkU09wdGlvbnMuZG93bmxvYWQgJiYgKGRTT3B0aW9ucy5kb3dubG9hZC51cmwgfHwgZFNPcHRpb25zLmRvd25sb2FkLmR5bmFtaWNVcmwpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIGJldHRlciBsb29rIGFuIGZlZWxcbiAgICAgICAgICBjb25zdCB1cmwgPSBkU09wdGlvbnMuZG93bmxvYWQudXJsIHx8IGRTT3B0aW9ucy5kb3dubG9hZC5keW5hbWljVXJsO1xuICAgICAgICAgIHVybC5tYXRjaCgvc2VydmljZT13ZnMvZ2kpID8gdGhpcy5kb3dubG9hZFNlcnZpY2Uub3BlbihsYXkpIDogd2luZG93Lm9wZW4odXJsICwgJ19ibGFuaycpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdrcyA9IHRoaXMuZ2V0V29ya3NwYWNlQnlMYXllcklkKGxheWVyKTtcbiAgICAgIGxldCBvbEZlYXR1cmVzO1xuICAgICAgaWYgKHdrcyAmJiB3a3MuZW50aXR5U3RvcmUgJiYgd2tzLmVudGl0eVN0b3JlLnN0YXRlVmlldy5hbGwoKS5sZW5ndGgpIHtcblxuICAgICAgICBpZiAoZGF0YS5sYXllcnNXaXRoU2VsZWN0aW9uLmluZGV4T2YobGF5ZXIpICE9PSAtMSAmJiBkYXRhLmZlYXR1cmVJbk1hcEV4dGVudCkge1xuICAgICAgICAgIC8vIE9ubHkgZXhwb3J0IHNlbGVjdGVkIGZlYXR1cmUgJiYgaW50byBtYXAgZXh0ZW50XG4gICAgICAgICAgb2xGZWF0dXJlcyA9IHdrcy5lbnRpdHlTdG9yZS5zdGF0ZVZpZXcuYWxsKClcbiAgICAgICAgICAgIC5maWx0ZXIoKGU6IEVudGl0eVJlY29yZDxvYmplY3Q+KSA9PiBlLnN0YXRlLmluTWFwRXh0ZW50ICYmIGUuc3RhdGUuc2VsZWN0ZWQpLm1hcChlID0+IChlLmVudGl0eSBhcyBGZWF0dXJlKS5vbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5sYXllcnNXaXRoU2VsZWN0aW9uLmluZGV4T2YobGF5ZXIpICE9PSAtMSAmJiAhZGF0YS5mZWF0dXJlSW5NYXBFeHRlbnQpIHtcbiAgICAgICAgICAvLyBPbmx5IGV4cG9ydCBzZWxlY3RlZCBmZWF0dXJlICYmICAoaW50byBtYXAgZXh0ZW50IE9SIG5vdClcbiAgICAgICAgICBvbEZlYXR1cmVzID0gd2tzLmVudGl0eVN0b3JlLnN0YXRlVmlldy5hbGwoKVxuICAgICAgICAgICAgLmZpbHRlcigoZTogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IGUuc3RhdGUuc2VsZWN0ZWQpLm1hcChlID0+IChlLmVudGl0eSBhcyBGZWF0dXJlKS5vbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5mZWF0dXJlSW5NYXBFeHRlbnQpIHtcbiAgICAgICAgICAvLyBPbmx5IGludG8gbWFwIGV4dGVudFxuICAgICAgICAgIG9sRmVhdHVyZXMgPSB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3LmFsbCgpXG4gICAgICAgICAgICAuZmlsdGVyKChlOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gZS5zdGF0ZS5pbk1hcEV4dGVudCkubWFwKGUgPT4gKGUuZW50aXR5IGFzIEZlYXR1cmUpLm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbGwgZmVhdHVyZXNcbiAgICAgICAgICBvbEZlYXR1cmVzID0gd2tzLmVudGl0eVN0b3JlLnN0YXRlVmlldy5hbGwoKS5tYXAoZSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2wgPSBsYXkuZGF0YVNvdXJjZS5vbCBhcyBvbFZlY3RvclNvdXJjZTxPbEdlb21ldHJ5PiB8IG9sQ2x1c3RlclNvdXJjZSA7XG4gICAgICAgIGlmIChkYXRhLmZlYXR1cmVJbk1hcEV4dGVudCkge1xuICAgICAgICAgIG9sRmVhdHVyZXMgPSBvbC5nZXRGZWF0dXJlc0luRXh0ZW50KFxuICAgICAgICAgICAgbGF5Lm1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xGZWF0dXJlcyA9IG9sLmdldEZlYXR1cmVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheS5kYXRhU291cmNlIGluc3RhbmNlb2YgQ2x1c3RlckRhdGFTb3VyY2UpIHtcbiAgICAgICAgICBvbEZlYXR1cmVzID0gb2xGZWF0dXJlcy5mbGF0TWFwKChjbHVzdGVyOiBhbnkpID0+XG4gICAgICAgICAgICBjbHVzdGVyLmdldCgnZmVhdHVyZXMnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgICAgbGV0IGdlb21UeXBlczogeyBnZW9tZXRyeVR5cGU6IHN0cmluZywgZmVhdHVyZXM6IGFueVtdIH1bXSA9IFtdO1xuICAgICAgaWYgKGRhdGEuZm9ybWF0ID09PSBFeHBvcnRGb3JtYXQuU2hhcGVmaWxlIHx8IGRhdGEuZm9ybWF0ID09PSBFeHBvcnRGb3JtYXQuR1BYKSB7XG4gICAgICAgIG9sRmVhdHVyZXMuZm9yRWFjaCgob2xGZWF0dXJlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZUdlb21UeXBlID0gb2xGZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0VHlwZSgpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRHZW9tVHlwZSA9IGdlb21UeXBlcy5maW5kKGdlb21UeXBlID0+IGdlb21UeXBlLmdlb21ldHJ5VHlwZSA9PT0gZmVhdHVyZUdlb21UeXBlKTtcbiAgICAgICAgICBpZiAoY3VycmVudEdlb21UeXBlKSB7XG4gICAgICAgICAgICBjdXJyZW50R2VvbVR5cGUuZmVhdHVyZXMucHVzaChvbEZlYXR1cmUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZW9tVHlwZXMucHVzaCh7IGdlb21ldHJ5VHlwZTogZmVhdHVyZUdlb21UeXBlLCBmZWF0dXJlczogW29sRmVhdHVyZV0gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlb21UeXBlcyA9IFt7IGdlb21ldHJ5VHlwZTogJycsIGZlYXR1cmVzOiBvbEZlYXR1cmVzIH1dO1xuICAgICAgfVxuXG4gICAgICBnZW9tVHlwZXMuZm9yRWFjaChnZW9tVHlwZSA9PiB7XG4gICAgICAgIGdlb21UeXBlLmZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmFkaXVzOiBudW1iZXIgPSBmZWF0dXJlLmdldCgncmFkJyk7XG4gICAgICAgICAgaWYgKHJhZGl1cykge1xuICAgICAgICAgICAgY29uc3QgY2VudGVyNDMyNjogQXJyYXk8bnVtYmVyPiA9IFtmZWF0dXJlLmdldCgnbG9uZ2l0dWRlJyksIGZlYXR1cmUuZ2V0KCdsYXRpdHVkZScpXTtcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZSA9IGNpcmN1bGFyKGNlbnRlcjQzMjYsIHJhZGl1cywgNTAwKTtcbiAgICAgICAgICAgIGNpcmNsZS50cmFuc2Zvcm0oJ0VQU0c6NDMyNicsIGZlYXR1cmUuZ2V0KCdfcHJvamVjdGlvbicpKTtcbiAgICAgICAgICAgIGZlYXR1cmUuc2V0R2VvbWV0cnkoY2lyY2xlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChkYXRhLmZvcm1hdCA9PT0gRXhwb3J0Rm9ybWF0LkdQWCkge1xuICAgICAgICBjb25zdCBncHhGZWF0dXJlQ250ID0gZ2VvbVR5cGVzLmxlbmd0aDtcbiAgICAgICAgZ2VvbVR5cGVzID0gZ2VvbVR5cGVzLmZpbHRlcihnZW9tVHlwZSA9PiBbJ0xpbmVTdHJpbmcnLCAnUG9pbnQnXS5pbmNsdWRlcyhnZW9tVHlwZS5nZW9tZXRyeVR5cGUpKTtcbiAgICAgICAgY29uc3QgZ3B4RmVhdHVyZUNudFBvaW50T3JQb2x5ID0gZ2VvbVR5cGVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGdweEZlYXR1cmVDbnQgPiBncHhGZWF0dXJlQ250UG9pbnRPclBvbHkpIHtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmV4cG9ydC5ncHguZXJyb3IucG9seS50aXRsZScpO1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5leHBvcnQuZ3B4LmVycm9yLnBvbHkudGV4dCcpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IobWVzc2FnZSwgdGl0bGUsIHsgdGltZU91dDogMjAwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKGRhdGEuZm9ybWF0ID09PSBFeHBvcnRGb3JtYXQuQ1NWc2VtaWNvbG9uIHx8IGRhdGEuZm9ybWF0ID09PSBFeHBvcnRGb3JtYXQuQ1NWY29tbWEpICYmIGRhdGEuY29tYmluZUxheWVycykge1xuICAgICAgICBnZW9tVHlwZXMuZm9yRWFjaChnZW9tVHlwZSA9PiBnZW9tVHlwZXNDU1YucHVzaChnZW9tVHlwZSkpO1xuXG4gICAgICAgIGlmIChsYXllckluZGV4ICE9PSBkYXRhLmxheWVycy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHByZXZpb3VzRmVhdHVyZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBnZW9tVHlwZXNDU1YuZm9yRWFjaChnZW9tVHlwZSA9PiB7XG4gICAgICAgICAgICBnZW9tVHlwZS5mZWF0dXJlcy5mb3JFYWNoKGN1cnJlbnRGZWF0dXJlID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEuc2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzRmVhdHVyZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGZWF0dXJlLmdldCgnX2ZlYXR1cmVTdG9yZScpLmxheWVyLm9wdGlvbnMudGl0bGUgIT09XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0ZlYXR1cmUuZ2V0KCdfZmVhdHVyZVN0b3JlJykubGF5ZXIub3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUVtcHR5Um93cyA9IHRoaXMuY3JlYXRlVGl0bGVFbXB0eVJvd3MocHJldmlvdXNGZWF0dXJlLCBjdXJyZW50RmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzQ1NWLnB1c2godGl0bGVFbXB0eVJvd3NbMl0pO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc0NTVi5wdXNoKHRpdGxlRW1wdHlSb3dzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNDU1YucHVzaCh0aXRsZUVtcHR5Um93c1sxXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRW1wdHlSb3dzID0gdGhpcy5jcmVhdGVUaXRsZUVtcHR5Um93cyhjdXJyZW50RmVhdHVyZSwgY3VycmVudEZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZXNDU1YucHVzaCh0aXRsZUVtcHR5Um93c1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZlYXR1cmVzQ1NWLnB1c2goY3VycmVudEZlYXR1cmUpO1xuICAgICAgICAgICAgICBwcmV2aW91c0ZlYXR1cmUgPSBjdXJyZW50RmVhdHVyZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChnZW9tVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZXhwb3J0Lm5vdGhpbmcudGl0bGUnKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmV4cG9ydC5ub3RoaW5nLnRleHQnKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihtZXNzYWdlLCB0aXRsZSwgeyB0aW1lT3V0OiAyMDAwMCB9KTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEoZGF0YS5mb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1ZzZW1pY29sb24gfHwgZGF0YS5mb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1Zjb21tYSkgfHwgIWRhdGEuY29tYmluZUxheWVycykge1xuICAgICAgICAgIGdlb21UeXBlcy5tYXAoZ2VvbVR5cGUgPT5cbiAgICAgICAgICAgIHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnQoZ2VvbVR5cGUuZmVhdHVyZXMsIGRhdGEuZm9ybWF0LCBmaWxlbmFtZSArIGdlb21UeXBlLmdlb21ldHJ5VHlwZSwgZGF0YS5lbmNvZGluZywgdGhpcy5tYXAucHJvamVjdGlvbilcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICgpID0+IHt9LFxuICAgICAgICAgICAgICAoZXJyb3I6IEVycm9yKSA9PiB0aGlzLm9uRmlsZUV4cG9ydEVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25GaWxlRXhwb3J0U3VjY2VzcygpO1xuXG4gICAgICAgICAgICAgICAgZ2VvbVR5cGUuZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2lyY2xlVG9Qb2ludChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICgoZGF0YS5mb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1ZzZW1pY29sb24gfHwgZGF0YS5mb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1Zjb21tYSkgJiYgZGF0YS5jb21iaW5lTGF5ZXJzKSB7XG4gICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0KGZlYXR1cmVzQ1NWLCBkYXRhLmZvcm1hdCwgZmlsZW5hbWUsIGRhdGEuZW5jb2RpbmcsIHRoaXMubWFwLnByb2plY3Rpb24pXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgKGVycm9yOiBFcnJvcikgPT4gdGhpcy5vbkZpbGVFeHBvcnRFcnJvcihlcnJvciksXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLm9uRmlsZUV4cG9ydFN1Y2Nlc3MoKTtcblxuICAgICAgICAgIGZlYXR1cmVzQ1NWLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNpcmNsZVRvUG9pbnQoZmVhdHVyZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGl0bGVFbXB0eVJvd3MocHJldmlvdXNGZWF0dXJlLCBjdXJyZW50RmVhdHVyZSkge1xuICAgIGNvbnN0IHRpdGxlUm93ID0gY3VycmVudEZlYXR1cmUuY2xvbmUoKTtcbiAgICBjb25zdCBoZWFkZXJSb3cgPSBjdXJyZW50RmVhdHVyZS5jbG9uZSgpO1xuICAgIGNvbnN0IGVtcHR5Um93ID0gY3VycmVudEZlYXR1cmUuY2xvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0ZlYXR1cmVLZXlzOiBBcnJheTxzdHJpbmc+ID0gcHJldmlvdXNGZWF0dXJlLmdldEtleXMoKTtcbiAgICBsZXQgZmlyc3RLZXlQcmV2aW91czogc3RyaW5nID0gJyc7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldmlvdXNGZWF0dXJlS2V5cykge1xuICAgICAgaWYgKHByZXZpb3VzRmVhdHVyZUtleXNba2V5XSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICBmaXJzdEtleVByZXZpb3VzID0gcHJldmlvdXNGZWF0dXJlS2V5c1trZXldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RmVhdHVyZUtleXM6IEFycmF5PHN0cmluZz4gPSBjdXJyZW50RmVhdHVyZS5nZXRLZXlzKCk7XG4gICAgbGV0IGZpcnN0S2V5Q3VycmVudDogc3RyaW5nID0gJyc7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3VycmVudEZlYXR1cmVLZXlzKSB7XG4gICAgICBpZiAoY3VycmVudEZlYXR1cmVLZXlzW2tleV0gIT09ICdnZW9tZXRyeScpIHtcbiAgICAgICAgZmlyc3RLZXlDdXJyZW50ID0gY3VycmVudEZlYXR1cmVLZXlzW2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhbGxLZXlzOiBBcnJheTxzdHJpbmc+ID0gY3VycmVudEZlYXR1cmUuZ2V0S2V5cygpO1xuICAgIHByZXZpb3VzRmVhdHVyZUtleXMuZm9yRWFjaChwcmV2aW91c0tleSA9PiB7XG4gICAgICBpZiAoYWxsS2V5cy5pbmNsdWRlcyhwcmV2aW91c0tleSkgJiYgcHJldmlvdXNLZXkgIT09IGZpcnN0S2V5UHJldmlvdXMpIHtcbiAgICAgICAgYWxsS2V5cy5wdXNoKHByZXZpb3VzS2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBhbGxLZXlzLnVuc2hpZnQoZmlyc3RLZXlQcmV2aW91cyk7XG5cbiAgICBsZXQgZmlyc3RLZXlBbGw6IHN0cmluZyA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGFsbEtleXMpIHtcbiAgICAgIGlmIChhbGxLZXlzW2tleV0gIT09ICdnZW9tZXRyeScpIHtcbiAgICAgICAgZmlyc3RLZXlBbGwgPSBhbGxLZXlzW2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBhbGxLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHNhbWVLZXlzOiBib29sZWFuID0gcHJldmlvdXNGZWF0dXJlS2V5cy5sZW5ndGggPT09IGN1cnJlbnRGZWF0dXJlS2V5cy5sZW5ndGggJiZcbiAgICAgIHByZXZpb3VzRmVhdHVyZUtleXMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGN1cnJlbnRGZWF0dXJlS2V5c1tpbmRleF0pO1xuICAgICAgaWYgKGtleSA9PT0gZmlyc3RLZXlBbGwgJiYgIXNhbWVLZXlzKSB7XG4gICAgICAgIHRpdGxlUm93LnNldChrZXksIGN1cnJlbnRGZWF0dXJlLmdldCgnX2ZlYXR1cmVTdG9yZScpLmxheWVyLm9wdGlvbnMudGl0bGUgKyBcIiA9PT09PT09PT09PT09PT0+XCIsIHRydWUpO1xuICAgICAgICBoZWFkZXJSb3cuc2V0KGtleSwga2V5LCB0cnVlKTtcbiAgICAgICAgZW1wdHlSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBmaXJzdEtleUFsbCAmJiBzYW1lS2V5cykge1xuICAgICAgICB0aXRsZVJvdy5zZXQoa2V5LCBjdXJyZW50RmVhdHVyZS5nZXQoJ19mZWF0dXJlU3RvcmUnKS5sYXllci5vcHRpb25zLnRpdGxlLCB0cnVlKTtcbiAgICAgICAgaGVhZGVyUm93LnNldChrZXksIGtleSwgdHJ1ZSk7XG4gICAgICAgIGVtcHR5Um93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gZmlyc3RLZXlDdXJyZW50KSB7XG4gICAgICAgIHRpdGxlUm93LnNldChrZXksIGN1cnJlbnRGZWF0dXJlLmdldCgnX2ZlYXR1cmVTdG9yZScpLmxheWVyLm9wdGlvbnMudGl0bGUsIHRydWUpO1xuICAgICAgICBoZWFkZXJSb3cuc2V0KGtleSwga2V5LCB0cnVlKTtcbiAgICAgICAgZW1wdHlSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZ2VvbWV0cnknKSB7XG4gICAgICAgIHRpdGxlUm93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIGhlYWRlclJvdy5zZXQoa2V5LCBrZXksIHRydWUpO1xuICAgICAgICBlbXB0eVJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgZW1wdHlSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoY3VycmVudEZlYXR1cmVLZXlzLmluY2x1ZGVzKGtleSkpKSB7XG4gICAgICAgIGhlYWRlclJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHRpdGxlRW1wdHlSb3dzID0gW3RpdGxlUm93LCBoZWFkZXJSb3csIGVtcHR5Um93XTtcbiAgICByZXR1cm4gdGl0bGVFbXB0eVJvd3M7XG4gIH1cblxuICBwcml2YXRlIGNpcmNsZVRvUG9pbnQoZmVhdHVyZSkge1xuICAgIGNvbnN0IHJhZGl1czogbnVtYmVyID0gZmVhdHVyZS5nZXQoJ3JhZCcpO1xuXG4gICAgaWYgKHJhZGl1cykge1xuICAgICAgY29uc3QgcG9pbnQgPSBuZXcgb2xQb2ludChbZmVhdHVyZS5nZXQoJ2xvbmdpdHVkZScpLCBmZWF0dXJlLmdldCgnbGF0aXR1ZGUnKV0pO1xuICAgICAgcG9pbnQudHJhbnNmb3JtKCdFUFNHOjQzMjYnLCBmZWF0dXJlLmdldCgnX3Byb2plY3Rpb24nKSk7XG4gICAgICBmZWF0dXJlLnNldEdlb21ldHJ5KHBvaW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcbiAgICB0aGlzLmltcG9ydEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGlucHV0UHJvajogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5mb3JjZU5hbWluZykge1xuICAgICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIGZvcm1hdDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICBsYXllcnM6IFtbXSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgbGF5ZXJzV2l0aFNlbGVjdGlvbjogW1tdXSxcbiAgICAgICAgZW5jb2Rpbmc6IFtFbmNvZGluZ0Zvcm1hdC5VVEY4LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICBjb21iaW5lTGF5ZXJzOiBbdHJ1ZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgc2VwYXJhdG9yOiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgIGZlYXR1cmVJbk1hcEV4dGVudDogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgZm9ybWF0OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgIGxheWVyczogW1tdLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICBsYXllcnNXaXRoU2VsZWN0aW9uOiBbW11dLFxuICAgICAgICBlbmNvZGluZzogW0VuY29kaW5nRm9ybWF0LlVURjgsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgIGNvbWJpbmVMYXllcnM6IFt0cnVlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICBzZXBhcmF0b3I6IFtmYWxzZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgZmVhdHVyZUluTWFwRXh0ZW50OiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRmlsZUltcG9ydFN1Y2Nlc3MoZmlsZTogRmlsZSwgZmVhdHVyZXM6IEZlYXR1cmVbXSkge1xuICAgIGlmICghdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRXaXRoU3R5bGUnKSkge1xuICAgICAgaGFuZGxlRmlsZUltcG9ydFN1Y2Nlc3MoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZlYXR1cmVzLFxuICAgICAgICB0aGlzLm1hcCxcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZSxcbiAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZUZpbGVJbXBvcnRTdWNjZXNzKFxuICAgICAgICBmaWxlLFxuICAgICAgICBmZWF0dXJlcyxcbiAgICAgICAgdGhpcy5tYXAsXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UsXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLFxuICAgICAgICB0aGlzLnN0eWxlTGlzdFNlcnZpY2UsXG4gICAgICAgIHRoaXMuc3R5bGVTZXJ2aWNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25GaWxlSW1wb3J0RXJyb3IoZmlsZTogRmlsZSwgZXJyb3I6IEVycm9yKSB7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICBoYW5kbGVGaWxlSW1wb3J0RXJyb3IoXG4gICAgICBmaWxlLFxuICAgICAgZXJyb3IsXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLFxuICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UsXG4gICAgICB0aGlzLmZpbGVTaXplTWJcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBvcHVwQmxvY2tlZEVycm9yKHByZUNoZWNrOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGNvbnN0IHRpdGxlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZXhwb3J0LnBvcHVwQmxvY2tlZC50aXRsZScpO1xuICAgIGNvbnN0IGV4dHJhTWVzc2FnZSA9IHByZUNoZWNrID9cbiAgICAgIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmV4cG9ydC5wb3B1cEJsb2NrZWQuc2VsZWN0QWdhaW4nKSA6XG4gICAgICB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5leHBvcnQucG9wdXBCbG9ja2VkLnJldHJ5Jyk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmV4cG9ydC5wb3B1cEJsb2NrZWQudGV4dCcsIHsgZXh0cmFNZXNzYWdlIH0pO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IobWVzc2FnZSwgdGl0bGUsIHsgdGltZU91dDogMjAwMDAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsZUV4cG9ydEVycm9yKGVycm9yOiBFcnJvcikge1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgaGFuZGxlRmlsZUV4cG9ydEVycm9yKGVycm9yLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCB0aGlzLmxhbmd1YWdlU2VydmljZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRDb25maWcoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmdldENvbmZpZygnaW1wb3J0RXhwb3J0LmZvcmNlTmFtaW5nJykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5mb3JjZU5hbWluZyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnaW1wb3J0RXhwb3J0LmZvcmNlTmFtaW5nJyk7XG4gICAgfVxuICAgIHRoaXMuY29tcHV0ZUZvcm1hdHMoKTtcbiAgICB0aGlzLmxvYWRFbmNvZGluZ3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmNvZGluZ0RlZmF1bHRWYWx1ZShmb3JtYXQ6IEV4cG9ydEZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1Zjb21tYSB8fCBmb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5DU1ZzZW1pY29sb24pIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZW5jb2Rpbmc6IEVuY29kaW5nRm9ybWF0LkxBVElOMSB9KTtcbiAgICAgIHJldHVybiBFbmNvZGluZ0Zvcm1hdC5MQVRJTjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZW5jb2Rpbmc6IEVuY29kaW5nRm9ybWF0LlVURjggfSk7XG4gICAgICByZXR1cm4gRW5jb2RpbmdGb3JtYXQuVVRGODtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvYWRFbmNvZGluZ3MoKSB7XG4gICAgdGhpcy5lbmNvZGluZ3MkLm5leHQoRW5jb2RpbmdGb3JtYXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRm9ybWF0cyhsYXllcnM/OiBBbnlMYXllcltdKSB7XG4gICAgbGV0IGFwcGxpZWRmb3JtYXRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKEV4cG9ydEZvcm1hdCk7XG4gICAgY29uc3QgZm9ybWF0c1R5cGUgPSB7XG4gICAgICBvbmx5VXJsOiBmYWxzZSxcbiAgICAgIG9ubHlWZWN0b3I6IGZhbHNlLFxuICAgICAgdmVjdG9yQW5kVXJsOiBmYWxzZSxcbiAgICAgIGN1c3RvbUxpc3Q6IGZhbHNlXG4gICAgfTtcbiAgICBjb25zdCBjdXN0b21MaXN0ID0gW107XG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoKSB7XG4gICAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkPy5hbGxvd2VkRm9ybWF0cykge1xuICAgICAgICAgIGZvcm1hdHNUeXBlLmN1c3RvbUxpc3QgPSB0cnVlO1xuICAgICAgICAgIGN1c3RvbUxpc3QucHVzaCh7bGF5ZXI6IGxheWVyLnRpdGxlLCBmb3JtYXRzOiB0aGlzLnZhbGlkYXRlTGlzdEZvcm1hdChsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQuYWxsb3dlZEZvcm1hdHMpfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgIShsYXllciBpbnN0YW5jZW9mIFZlY3RvckxheWVyKSAmJlxuICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZCAmJlxuICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZC51cmxcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9ybWF0c1R5cGUub25seVVybCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkICYmXG4gICAgICAgICAgKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZC51cmwgfHwgbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkLmR5bmFtaWNVcmwpXG4gICAgICAgICkge1xuICAgICAgICAgIGZvcm1hdHNUeXBlLnZlY3RvckFuZFVybCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllcikge1xuICAgICAgICAgIGZvcm1hdHNUeXBlLm9ubHlWZWN0b3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZvcm1hdHNUeXBlLm9ubHlVcmwgPT09IHRydWUgJiYgZm9ybWF0c1R5cGUub25seVZlY3RvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXBwbGllZGZvcm1hdHMgPSBbJ1VSTCddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZm9ybWF0c1R5cGUub25seVZlY3RvciA9PT0gdHJ1ZSAmJlxuICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VXJsID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29tcHV0ZUZvcm1hdHMoKTsgLy8gcmVzZXRcbiAgICAgICAgaWYgKEV4cG9ydEZvcm1hdC5VUkwgaW4gdGhpcy5mb3JtYXRzJC52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1hdHMkLnZhbHVlKS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiBrZXkgIT09ICdVUkwnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhcHBsaWVkZm9ybWF0cyA9IGtleXM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZvcm1hdHNUeXBlLnZlY3RvckFuZFVybCA9PT0gdHJ1ZSAmJlxuICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VXJsID09PSBmYWxzZSAmJlxuICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VmVjdG9yID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29tcHV0ZUZvcm1hdHMoKTsgLy8gcmVzZXRcbiAgICAgICAgaWYgKCEoRXhwb3J0Rm9ybWF0LlVSTCBpbiB0aGlzLmZvcm1hdHMkLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1hdHMkLnZhbHVlKTtcbiAgICAgICAgICBrZXlzLnB1c2goJ1VSTCcpO1xuICAgICAgICAgIGFwcGxpZWRmb3JtYXRzID0ga2V5cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRFeHBvcnQuZm9ybWF0cycpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZExpc3RGb3JtYXQgPSB0aGlzLnZhbGlkYXRlTGlzdEZvcm1hdChcbiAgICAgICAgdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRFeHBvcnQuZm9ybWF0cycpXG4gICAgICApO1xuICAgICAgYXBwbGllZGZvcm1hdHMgPSB2YWxpZGF0ZWRMaXN0Rm9ybWF0O1xuICAgIH1cbiAgICBpZiAoZm9ybWF0c1R5cGUuY3VzdG9tTGlzdCkge1xuICAgICAgbGV0IGNvbW1vbkZvcm1hdHM7XG4gICAgICBjb25zdCBsYXllcnNXaXRoQ3VzdG9tRm9ybWF0cyA9IFtdO1xuICAgICAgbGV0IHByZXZpb3VzQ3VzdG9tTGlzdEZvcm1hdHMgPSBjdXN0b21MaXN0WzBdLmZvcm1hdHM7XG4gICAgICBjdXN0b21MaXN0Lm1hcChsaXN0ID0+IHtcbiAgICAgICAgbGF5ZXJzV2l0aEN1c3RvbUZvcm1hdHMucHVzaChsaXN0LmxheWVyKTtcbiAgICAgICAgY29tbW9uRm9ybWF0cyA9IGxpc3QuZm9ybWF0cy5maWx0ZXIodmFsdWUgPT4gcHJldmlvdXNDdXN0b21MaXN0Rm9ybWF0cy5pbmNsdWRlcyh2YWx1ZSkpO1xuICAgICAgICBwcmV2aW91c0N1c3RvbUxpc3RGb3JtYXRzID0gbGlzdC5mb3JtYXRzO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmaW5hbEZvcm1hdHMgPSBjb21tb25Gb3JtYXRzLmZpbHRlcih2YWx1ZSA9PiBhcHBsaWVkZm9ybWF0cy5pbmNsdWRlcyh2YWx1ZSkpO1xuICAgICAgaWYgKGZpbmFsRm9ybWF0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZm9ybWF0cyQubmV4dChzdHJFbnVtKGZpbmFsRm9ybWF0cykpO1xuXG4gICAgICAgIGlmIChsYXllcnMgJiYgbGF5ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChsYXllcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZXhwb3J0LmN1c3RvbUxpc3QudGV4dCcsIHsgdmFsdWU6IGxheWVyc1dpdGhDdXN0b21Gb3JtYXRzLmpvaW4oKSB9KSxcbiAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZXhwb3J0LmN1c3RvbUxpc3QudGl0bGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybWF0cyQubmV4dChbXSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZXhwb3J0Lm5vRm9ybWF0LnRleHQnKSxcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5leHBvcnQubm9Gb3JtYXQudGl0bGUnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1hdHMkLm5leHQoc3RyRW51bShhcHBsaWVkZm9ybWF0cykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVMaXN0Rm9ybWF0KGZvcm1hdHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBmb3JtYXRzXG4gICAgICAuZmlsdGVyKChmb3JtYXQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuQ1NWY29tbWEudG9VcHBlckNhc2UoKSB8fFxuICAgICAgICAgIGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuQ1NWc2VtaWNvbG9uLnRvVXBwZXJDYXNlKCkgfHxcbiAgICAgICAgICBmb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gRXhwb3J0Rm9ybWF0LkdNTC50b1VwcGVyQ2FzZSgpIHx8XG4gICAgICAgICAgZm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09IEV4cG9ydEZvcm1hdC5HUFgudG9VcHBlckNhc2UoKSB8fFxuICAgICAgICAgIGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuR2VvSlNPTi50b1VwcGVyQ2FzZSgpIHx8XG4gICAgICAgICAgZm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09IEV4cG9ydEZvcm1hdC5LTUwudG9VcHBlckNhc2UoKSB8fFxuICAgICAgICAgIGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuU2hhcGVmaWxlLnRvVXBwZXJDYXNlKCkgfHxcbiAgICAgICAgICBmb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gRXhwb3J0Rm9ybWF0LlVSTC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAubWFwKChmb3JtYXQpID0+IHtcbiAgICAgICAgaWYgKGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuQ1NWY29tbWEudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgIGZvcm1hdCA9IEV4cG9ydEZvcm1hdC5DU1Zjb21tYTtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gRXhwb3J0Rm9ybWF0LkNTVnNlbWljb2xvbi50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgZm9ybWF0ID0gRXhwb3J0Rm9ybWF0LkNTVnNlbWljb2xvbjtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gRXhwb3J0Rm9ybWF0LkdNTC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgZm9ybWF0ID0gRXhwb3J0Rm9ybWF0LkdNTDtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gRXhwb3J0Rm9ybWF0LkdQWC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgZm9ybWF0ID0gRXhwb3J0Rm9ybWF0LkdQWDtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gRXhwb3J0Rm9ybWF0Lkdlb0pTT04udG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgIGZvcm1hdCA9IEV4cG9ydEZvcm1hdC5HZW9KU09OO1xuICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuS01MLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICBmb3JtYXQgPSBFeHBvcnRGb3JtYXQuS01MO1xuICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSBFeHBvcnRGb3JtYXQuU2hhcGVmaWxlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICBmb3JtYXQgPSBFeHBvcnRGb3JtYXQuU2hhcGVmaWxlO1xuICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09IEV4cG9ydEZvcm1hdC5VUkwudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgIGZvcm1hdCA9IEV4cG9ydEZvcm1hdC5VUkw7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW9kZUNoYW5nZWQobW9kZSkge1xuICAgIHRoaXMuc2VsZWN0TW9kZS5lbWl0KG1vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkZpbGVFeHBvcnRTdWNjZXNzKCkge1xuICAgIGhhbmRsZUZpbGVFeHBvcnRTdWNjZXNzKHRoaXMubWVzc2FnZVNlcnZpY2UsIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlKTtcbiAgfVxuXG4gIG9uSW1wb3J0RXhwb3J0Q2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBldmVudC52YWx1ZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImltcG9ydC1leHBvcnQtdG9nZ2xlIG1hdC10eXBvZ3JhcGh5XCI+XG4gIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFxuICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRNb2RlXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkltcG9ydEV4cG9ydENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiJ2ltcG9ydCdcIj5cbiAgICAgICAgICB7eydpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0VGFiVGl0bGUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCInZXhwb3J0J1wiPlxuICAgICAgICAgIHt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRUYWJUaXRsZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuPC9kaXY+XG5cbjxmb3JtIGNsYXNzPVwiaWdvLWZvcm1cIiBbZm9ybUdyb3VwXT1cImltcG9ydEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTW9kZSA9PT0gJ2ltcG9ydCdcIj5cbiAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPnt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRQcm9qUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgIFsodmFsdWUpXT1cImlucHV0UHJvalwiPlxuICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9qZWN0aW9uIG9mIChwcm9qZWN0aW9ucyQgfCBhc3luYylcIlxuICAgICAgICAgIFt2YWx1ZV09XCJwcm9qZWN0aW9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgPHAgbWF0LWxpbmUgKm5nSWY9XCJwcm9qZWN0aW9uLnRyYW5zbGF0ZUtleVwiPnt7KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMuJyArIHByb2plY3Rpb24udHJhbnNsYXRlS2V5KSB8IHRyYW5zbGF0ZTogcHJvamVjdGlvbn19PC9wPlxuICAgICAgICAgIDxwIG1hdC1saW5lICpuZ0lmPVwiIXByb2plY3Rpb24udHJhbnNsYXRlS2V5XCI+e3twcm9qZWN0aW9uLmFsaWFzfX08L3A+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICBbbWF0VG9vbHRpcF09XCJpbXBvcnRGb3JtLmludmFsaWQgPyAoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5jaG9vc2UnIHwgdHJhbnNsYXRlKSA6ICgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydEJ1dHRvbicgfCB0cmFuc2xhdGUpXCJcbiAgICBjbGFzcz1cImlnby1mb3JtLWJ1dHRvbi1ncm91cFwiPlxuICAgIDxidXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCJpbXBvcnRGb3JtLmludmFsaWQgfHwgKGxvYWRpbmckIHwgYXN5bmMpXCJcbiAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPlxuICAgICAgICB7eydpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0QnV0dG9uJyB8IHRyYW5zbGF0ZX19XG4gICAgPC9idXR0b24+XG4gICAgPGlnby1zcGlubmVyIFtzaG93bl09XCJsb2FkaW5nJCB8IGFzeW5jXCI+PC9pZ28tc3Bpbm5lcj5cbiAgICA8aW5wdXRcbiAgICAgIGhpZGRlblxuICAgICAgI2ZpbGVJbnB1dFxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcbiAgICAgIChjbGljayk9XCJmaWxlSW5wdXQudmFsdWUgPSBudWxsXCJcbiAgICAgIChjaGFuZ2UpPVwiaW1wb3J0RmlsZXMoJGV2ZW50LnRhcmdldC5maWxlcylcIj5cbiAgPC9kaXY+XG48L2Zvcm0+XG48c2VjdGlvbiBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5XCIgKm5nSWY9XCJzZWxlY3RlZE1vZGUgPT09ICdpbXBvcnQnXCI+XG4gIDxkaXYgKm5nSWY9XCJpbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgPT09ICcnXCI+XG4gICAgPGg0Pnt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRDbGFyaWZpY2F0aW9ucycgfCB0cmFuc2xhdGV9fTwvaDQ+XG4gICAgPHVsPlxuICAgICAgPGxpPnt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRTaXplTWF4JyB8IHRyYW5zbGF0ZToge3NpemU6IGZpbGVTaXplTWJ9IH19PC9saT5cbiAgICAgIDxsaT57eydpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0Rm9ybWF0QXV0aG9yaXplZCcgfCB0cmFuc2xhdGV9fTwvbGk+XG4gICAgICA8bGk+e3snaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydFNocFppcCcgfCB0cmFuc2xhdGV9fTwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG4gIDxpZ28tY3VzdG9tLWh0bWwgKm5nSWY9XCJpbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgIT09ICcnXCIgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiXG4gICAgW2h0bWxdPVwiaW1wb3J0SHRtbENsYXJpZmljYXRpb25zXCI+XG4gIDwvaWdvLWN1c3RvbS1odG1sPlxuPC9zZWN0aW9uPlxuXG48c2VjdGlvbiBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5XCIgKm5nSWY9XCIoZXhwb3J0YWJsZUxheWVycyQgfCBhc3luYykubGVuZ3RoID09PSAwICYmIHNlbGVjdGVkTW9kZSA9PT0gJ2V4cG9ydCdcIj5cbiAgPGg0Pnt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnROb0xheWVyc0V4cG9ydGFibGUnIHwgdHJhbnNsYXRlfX08L2g0PlxuPC9zZWN0aW9uPlxuXG48Zm9ybSBjbGFzcz1cImlnby1mb3JtXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKm5nSWY9XCIoZXhwb3J0YWJsZUxheWVycyQgfCBhc3luYykubGVuZ3RoID4gMCAmJiBzZWxlY3RlZE1vZGUgPT09ICdleHBvcnQnXCI+XG4gIDxkaXYgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbD57eydpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0TGF5ZXJQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgWyh2YWx1ZSldPVwibGF5ZXJzXCIgbXVsdGlwbGU+XG4gICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAge3tsYXllcnMubGVuZ3RoID8gZ2V0TGF5ZXJUaXRsZUJ5SWQobGF5ZXJzWzBdKSA6ICcnfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImxheWVycy5sZW5ndGggPiAxXCIgY2xhc3M9XCJleHBvcnQtc2VsZWN0LXRyaWdnZXJcIj5cbiAgICAgICAgICAgICgre3tsYXllcnMubGVuZ3RoIC0gMX19IHt7KGxheWVycz8ubGVuZ3RoID09PSAyID8gJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5vdGhlcicgOiAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLm90aGVycycpIHwgdHJhbnNsYXRlIH19KVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGxheWVyIG9mIChleHBvcnRhYmxlTGF5ZXJzJCB8IGFzeW5jKVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydpZ28tZXhwb3J0LWxheWVyLW1hdC1vcHRpb24nOiBsYXllckhhc1NlbGVjdGVkRmVhdHVyZXMobGF5ZXIpfVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImxheWVyLmlkXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgPHAgbWF0LWxpbmU+e3tsYXllci50aXRsZX19PC9wPlxuICAgICAgICAgIDxwIG1hdC1saW5lPlxuICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgKm5nSWY9XCJsYXllckhhc1NlbGVjdGVkRmVhdHVyZXMobGF5ZXIpXCJcbiAgICAgICAgICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2FmdGVyJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbmx5U2VsZWN0ZWRDbGljaygkZXZlbnQsbGF5ZXIuaWQpXCJcbiAgICAgICAgICAgICAgKGNoZWNrZWQpPVwiaW5MYXllcnNJZFRvRXhwb3J0U2VsZWN0aW9uT25seShsYXllcilcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9ubHlTZWxlY3RlZCgkZXZlbnQsbGF5ZXIuaWQpXCI+XG4gICAgICAgICAgICAgIDxzbWFsbD57eydpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0U2VsZWN0ZWRGZWF0dXJlJyB8IHRyYW5zbGF0ZX19PC9zbWFsbD5cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiaWdvLWlucHV0LWNvbnRhaW5lclwiPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWw+e3snaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydEZvcm1hdFBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgICA8bWF0LXNlbGVjdFxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmb3JtYXRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihmb3JtYXRzJCB8IGFzeW5jKS5sZW5ndGggIT09IDBcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZm9ybWF0IG9mIChmb3JtYXRzJCB8IGFzeW5jKSB8IGtleXZhbHVlXCIgW3ZhbHVlXT1cImZvcm1hdC5rZXlcIj5cbiAgICAgICAgICAgIHt7J2lnby5nZW8uZXhwb3J0LmZvcm1hdC4nICsgZm9ybWF0LnZhbHVlIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIihmb3JtYXRzJCB8IGFzeW5jKS5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD1cInRydWVcIj5cbiAgICAgICAgICB7eydpZ28uZ2VvLmV4cG9ydC5ub0Zvcm1hdC50aXRsZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cImZvcmNlTmFtaW5nICYmIGZvcm0udmFsdWUuZm9ybWF0ICE9PSAnVVJMJ1wiPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cInt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRGaWxlTmFtZVBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZX19XCI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cImZvcm0udmFsdWUuZm9ybWF0ID09PSAnQ1NWY29tbWEnIHx8IGZvcm0udmFsdWUuZm9ybWF0ID09PSAnQ1NWc2VtaWNvbG9uJ1wiPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWw+e3snaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmVuY29kaW5nUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVuY29kaW5nXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZW5jb2RpbmdzJCB8IGFzeW5jKS5sZW5ndGggIT09IDBcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZW5jb2Rpbmcgb2YgKGVuY29kaW5ncyQgfCBhc3luYykgfCBrZXl2YWx1ZVwiIFt2YWx1ZV09XCJlbmNvZGluZy5rZXlcIj5cbiAgICAgICAgICAgIHt7J2lnby5nZW8uZXhwb3J0LmVuY29kaW5nLicgKyBlbmNvZGluZy52YWx1ZSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZXhwb3J0LWNvbWJpbmUtbGF5ZXJzIG1hdC10eXBvZ3JhcGh5XCIgKm5nSWY9XCJsYXllcnMubGVuZ3RoID4gMSAmJiAoZm9ybS52YWx1ZS5mb3JtYXQgPT09ICdDU1Zjb21tYScgfHwgZm9ybS52YWx1ZS5mb3JtYXQgPT09ICdDU1ZzZW1pY29sb24nKVwiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbWJpbmVMYXllcnNcIlxuICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiPlxuICAgICAgICAgIHt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRDb21iaW5lUmVzdWx0cycgfCB0cmFuc2xhdGV9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImV4cG9ydC1zZXBhcmF0b3IgbWF0LXR5cG9ncmFwaHlcIiAqbmdJZj1cImxheWVycy5sZW5ndGggPiAxICYmIChmb3JtLnZhbHVlLmZvcm1hdCA9PT0gJ0NTVmNvbW1hJyB8fCBmb3JtLnZhbHVlLmZvcm1hdCA9PT0gJ0NTVnNlbWljb2xvbicpICYmIGZvcm0udmFsdWUuY29tYmluZUxheWVyc1wiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlcGFyYXRvclwiXG4gICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCI+XG4gICAgICAgICAge3snaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydFNlcGFyYXRvcicgfCB0cmFuc2xhdGV9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImV4cG9ydC1vcHRpb25zIG1hdC10eXBvZ3JhcGh5XCIgKm5nSWY9XCJmb3JtLnZhbHVlLmZvcm1hdCAhPT0gJ1VSTCdcIj5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmZWF0dXJlSW5NYXBFeHRlbnRcIlxuICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiPlxuICAgICAgICAgIHt7J2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRGZWF0dXJlSW5FeHRlbnQnIHwgdHJhbnNsYXRlfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWZvcm0udmFsaWQgfHwgKGxvYWRpbmckIHwgYXN5bmMpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVFeHBvcnRGb3JtU3VibWl0KGZvcm0udmFsdWUpXCI+XG4gICAgICB7e2Zvcm0udmFsdWUuZm9ybWF0ICE9PSAnVVJMJyAgPyAoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRCdXR0b24nIHwgdHJhbnNsYXRlKTogKGZvcm0udmFsdWUubGF5ZXJzLmxlbmd0aCA+IDEgID8gKCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0QnV0dG9uTGlua3MnIHwgdHJhbnNsYXRlKTogKCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0QnV0dG9uTGluaycgfCB0cmFuc2xhdGUpKX19XG4gICAgPC9idXR0b24+XG4gICAgPGlnby1zcGlubmVyIFtzaG93bl09XCJsb2FkaW5nJCB8IGFzeW5jXCI+PC9pZ28tc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGlnby1jdXN0b20taHRtbCAqbmdJZj1cImV4cG9ydEh0bWxDbGFyaWZpY2F0aW9ucyAhPT0gJydcIiBjbGFzcz1cIm1hdC10eXBvZ3JhcGh5XCJcbiAgICBbaHRtbF09XCJleHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnNcIj5cbiAgPC9pZ28tY3VzdG9tLWh0bWw+XG5cbjwvZm9ybT5cbiJdfQ==