@igo2/geo 18.0.0 → 18.0.1-next.2

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 (510) hide show
  1. package/fesm2022/igo2-geo.mjs +684 -709
  2. package/fesm2022/igo2-geo.mjs.map +1 -1
  3. package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
  4. package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
  5. package/lib/style/style-list/style-list.provider.d.ts +1 -8
  6. package/lib/style/style-list/style-list.service.d.ts +1 -1
  7. package/package.json +15 -17
  8. package/src/lib/layer/layer-list/layer-list.theme.scss +2 -1
  9. package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
  10. package/src/style/style.scss +1 -1
  11. package/esm2022/igo2-geo.mjs +0 -5
  12. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +0 -234
  13. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +0 -272
  14. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +0 -246
  15. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +0 -19
  16. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +0 -136
  17. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +0 -60
  18. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +0 -232
  19. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +0 -24
  20. package/esm2022/lib/catalog/catalog-library/index.mjs +0 -4
  21. package/esm2022/lib/catalog/catalog.module.mjs +0 -26
  22. package/esm2022/lib/catalog/index.mjs +0 -6
  23. package/esm2022/lib/catalog/shared/catalog.abstract.mjs +0 -32
  24. package/esm2022/lib/catalog/shared/catalog.enum.mjs +0 -16
  25. package/esm2022/lib/catalog/shared/catalog.interface.mjs +0 -2
  26. package/esm2022/lib/catalog/shared/catalog.service.mjs +0 -706
  27. package/esm2022/lib/catalog/shared/catalogs.mjs +0 -75
  28. package/esm2022/lib/catalog/shared/index.mjs +0 -5
  29. package/esm2022/lib/datasource/index.mjs +0 -3
  30. package/esm2022/lib/datasource/shared/capabilities.interface.mjs +0 -17
  31. package/esm2022/lib/datasource/shared/capabilities.service.mjs +0 -441
  32. package/esm2022/lib/datasource/shared/datasource.service.mjs +0 -258
  33. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +0 -2
  34. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +0 -2
  35. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +0 -2
  36. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +0 -222
  37. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +0 -2
  38. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +0 -118
  39. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +0 -2
  40. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +0 -24
  41. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +0 -3
  42. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +0 -2
  43. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +0 -41
  44. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +0 -2
  45. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +0 -52
  46. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +0 -2
  47. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +0 -70
  48. package/esm2022/lib/datasource/shared/datasources/index.mjs +0 -36
  49. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +0 -2
  50. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +0 -33
  51. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +0 -2
  52. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +0 -14
  53. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +0 -2
  54. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +0 -60
  55. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +0 -2
  56. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +0 -17
  57. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +0 -2
  58. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +0 -56
  59. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +0 -2
  60. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +0 -137
  61. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +0 -170
  62. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +0 -2
  63. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +0 -227
  64. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +0 -224
  65. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +0 -2
  66. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +0 -18
  67. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +0 -2
  68. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +0 -11
  69. package/esm2022/lib/datasource/shared/index.mjs +0 -6
  70. package/esm2022/lib/datasource/shared/options/index.mjs +0 -5
  71. package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +0 -2
  72. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +0 -15
  73. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +0 -85
  74. package/esm2022/lib/datasource/shared/options/options.service.mjs +0 -3
  75. package/esm2022/lib/datasource/utils/index.mjs +0 -2
  76. package/esm2022/lib/datasource/utils/tilegrid.mjs +0 -20
  77. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +0 -246
  78. package/esm2022/lib/directions/directions-buttons/index.mjs +0 -2
  79. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +0 -312
  80. package/esm2022/lib/directions/directions-inputs/index.mjs +0 -2
  81. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +0 -192
  82. package/esm2022/lib/directions/directions-results/index.mjs +0 -2
  83. package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +0 -5
  84. package/esm2022/lib/directions/directions-sources/directions-source.mjs +0 -3
  85. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +0 -23
  86. package/esm2022/lib/directions/directions-sources/index.mjs +0 -5
  87. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +0 -159
  88. package/esm2022/lib/directions/directions.component.mjs +0 -437
  89. package/esm2022/lib/directions/directions.module.mjs +0 -46
  90. package/esm2022/lib/directions/directions.provider.mjs +0 -16
  91. package/esm2022/lib/directions/index.mjs +0 -8
  92. package/esm2022/lib/directions/shared/directions-source.service.mjs +0 -18
  93. package/esm2022/lib/directions/shared/directions.enum.mjs +0 -72
  94. package/esm2022/lib/directions/shared/directions.interface.mjs +0 -2
  95. package/esm2022/lib/directions/shared/directions.service.mjs +0 -239
  96. package/esm2022/lib/directions/shared/directions.utils.mjs +0 -522
  97. package/esm2022/lib/directions/shared/index.mjs +0 -6
  98. package/esm2022/lib/directions/shared/store.mjs +0 -21
  99. package/esm2022/lib/download/download-button/download-button.component.mjs +0 -48
  100. package/esm2022/lib/download/download-button/index.mjs +0 -2
  101. package/esm2022/lib/download/download.module.mjs +0 -24
  102. package/esm2022/lib/download/index.mjs +0 -3
  103. package/esm2022/lib/download/shared/download.interface.mjs +0 -2
  104. package/esm2022/lib/download/shared/download.service.mjs +0 -67
  105. package/esm2022/lib/download/shared/index.mjs +0 -3
  106. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +0 -42
  107. package/esm2022/lib/draw/draw/draw-popup.component.mjs +0 -421
  108. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +0 -28
  109. package/esm2022/lib/draw/draw/draw.component.mjs +0 -1136
  110. package/esm2022/lib/draw/draw/draw.module.mjs +0 -19
  111. package/esm2022/lib/draw/drawingTool.module.mjs +0 -18
  112. package/esm2022/lib/draw/index.mjs +0 -3
  113. package/esm2022/lib/draw/shared/draw-icon.service.mjs +0 -30
  114. package/esm2022/lib/draw/shared/draw.enum.mjs +0 -21
  115. package/esm2022/lib/draw/shared/draw.interface.mjs +0 -2
  116. package/esm2022/lib/draw/shared/draw.utils.mjs +0 -125
  117. package/esm2022/lib/draw/shared/index.mjs +0 -5
  118. package/esm2022/lib/environment/environment.interface.mjs +0 -2
  119. package/esm2022/lib/environment/index.mjs +0 -2
  120. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +0 -306
  121. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +0 -56
  122. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +0 -26
  123. package/esm2022/lib/feature/feature-details/index.mjs +0 -4
  124. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +0 -101
  125. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +0 -19
  126. package/esm2022/lib/feature/feature.module.mjs +0 -26
  127. package/esm2022/lib/feature/index.mjs +0 -5
  128. package/esm2022/lib/feature/shared/feature-store.utils.mjs +0 -28
  129. package/esm2022/lib/feature/shared/feature.enums.mjs +0 -9
  130. package/esm2022/lib/feature/shared/feature.interfaces.mjs +0 -2
  131. package/esm2022/lib/feature/shared/feature.utils.mjs +0 -332
  132. package/esm2022/lib/feature/shared/index.mjs +0 -8
  133. package/esm2022/lib/feature/shared/store.mjs +0 -143
  134. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +0 -216
  135. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +0 -119
  136. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +0 -99
  137. package/esm2022/lib/feature/shared/strategies/index.mjs +0 -8
  138. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +0 -103
  139. package/esm2022/lib/feature/shared/strategies/loading.mjs +0 -136
  140. package/esm2022/lib/feature/shared/strategies/search.mjs +0 -158
  141. package/esm2022/lib/feature/shared/strategies/selection.mjs +0 -385
  142. package/esm2022/lib/feature/shared/strategies.utils.mjs +0 -37
  143. package/esm2022/lib/filter/filter.module.mjs +0 -131
  144. package/esm2022/lib/filter/index.mjs +0 -17
  145. package/esm2022/lib/filter/ogc-filter-button/index.mjs +0 -2
  146. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +0 -141
  147. package/esm2022/lib/filter/ogc-filter-form/index.mjs +0 -2
  148. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +0 -325
  149. package/esm2022/lib/filter/ogc-filter-selection/index.mjs +0 -2
  150. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +0 -787
  151. package/esm2022/lib/filter/ogc-filter-time/index.mjs +0 -3
  152. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +0 -201
  153. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +0 -665
  154. package/esm2022/lib/filter/ogc-filterable-form/index.mjs +0 -2
  155. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +0 -66
  156. package/esm2022/lib/filter/ogc-filterable-item/index.mjs +0 -2
  157. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +0 -244
  158. package/esm2022/lib/filter/ogc-filterable-list/index.mjs +0 -3
  159. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +0 -39
  160. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +0 -32
  161. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +0 -63
  162. package/esm2022/lib/filter/shared/index.mjs +0 -12
  163. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +0 -72
  164. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +0 -30
  165. package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +0 -2
  166. package/esm2022/lib/filter/shared/ogc-filter.mjs +0 -756
  167. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +0 -47
  168. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +0 -23
  169. package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +0 -2
  170. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +0 -282
  171. package/esm2022/lib/filter/shared/time-filter.enum.mjs +0 -13
  172. package/esm2022/lib/filter/shared/time-filter.interface.mjs +0 -2
  173. package/esm2022/lib/filter/shared/time-filter.service.mjs +0 -107
  174. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +0 -2
  175. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +0 -875
  176. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +0 -2
  177. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +0 -191
  178. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +0 -2
  179. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +0 -120
  180. package/esm2022/lib/filter/time-filter-button/index.mjs +0 -2
  181. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +0 -70
  182. package/esm2022/lib/filter/time-filter-form/index.mjs +0 -2
  183. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +0 -537
  184. package/esm2022/lib/filter/time-filter-item/index.mjs +0 -2
  185. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +0 -90
  186. package/esm2022/lib/filter/time-filter-list/index.mjs +0 -3
  187. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +0 -39
  188. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +0 -24
  189. package/esm2022/lib/geo.module.mjs +0 -63
  190. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +0 -559
  191. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +0 -170
  192. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +0 -24
  193. package/esm2022/lib/geometry/geometry-form-field/index.mjs +0 -4
  194. package/esm2022/lib/geometry/geometry.module.mjs +0 -18
  195. package/esm2022/lib/geometry/index.mjs +0 -3
  196. package/esm2022/lib/geometry/shared/controls/draw.mjs +0 -340
  197. package/esm2022/lib/geometry/shared/controls/index.mjs +0 -4
  198. package/esm2022/lib/geometry/shared/controls/modify.mjs +0 -538
  199. package/esm2022/lib/geometry/shared/controls/slice.mjs +0 -190
  200. package/esm2022/lib/geometry/shared/geometry.errors.mjs +0 -24
  201. package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +0 -2
  202. package/esm2022/lib/geometry/shared/geometry.utils.mjs +0 -113
  203. package/esm2022/lib/geometry/shared/index.mjs +0 -5
  204. package/esm2022/lib/import-export/export-button/export-button.component.mjs +0 -49
  205. package/esm2022/lib/import-export/export-button/index.mjs +0 -2
  206. package/esm2022/lib/import-export/import-export/import-export.component.mjs +0 -876
  207. package/esm2022/lib/import-export/import-export/index.mjs +0 -2
  208. package/esm2022/lib/import-export/import-export.module.mjs +0 -31
  209. package/esm2022/lib/import-export/index.mjs +0 -5
  210. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +0 -114
  211. package/esm2022/lib/import-export/shared/export.errors.mjs +0 -15
  212. package/esm2022/lib/import-export/shared/export.interface.mjs +0 -2
  213. package/esm2022/lib/import-export/shared/export.service.mjs +0 -378
  214. package/esm2022/lib/import-export/shared/export.type.mjs +0 -13
  215. package/esm2022/lib/import-export/shared/export.utils.mjs +0 -51
  216. package/esm2022/lib/import-export/shared/import.errors.mjs +0 -39
  217. package/esm2022/lib/import-export/shared/import.interface.mjs +0 -2
  218. package/esm2022/lib/import-export/shared/import.service.mjs +0 -221
  219. package/esm2022/lib/import-export/shared/import.utils.mjs +0 -203
  220. package/esm2022/lib/import-export/shared/index.mjs +0 -11
  221. package/esm2022/lib/layer/index.mjs +0 -16
  222. package/esm2022/lib/layer/layer-group/index.mjs +0 -2
  223. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +0 -103
  224. package/esm2022/lib/layer/layer-item/index.mjs +0 -2
  225. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +0 -196
  226. package/esm2022/lib/layer/layer-legend/index.mjs +0 -2
  227. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +0 -287
  228. package/esm2022/lib/layer/layer-legend-item/index.mjs +0 -2
  229. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +0 -85
  230. package/esm2022/lib/layer/layer-legend-list/index.mjs +0 -3
  231. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +0 -54
  232. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +0 -104
  233. package/esm2022/lib/layer/layer-list/index.mjs +0 -2
  234. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +0 -232
  235. package/esm2022/lib/layer/layer-list-tool/index.mjs +0 -4
  236. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +0 -92
  237. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +0 -7
  238. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +0 -61
  239. package/esm2022/lib/layer/layer-search/index.mjs +0 -2
  240. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +0 -65
  241. package/esm2022/lib/layer/layer-unavailable/index.mjs +0 -3
  242. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +0 -25
  243. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +0 -35
  244. package/esm2022/lib/layer/layer-viewer/index.mjs +0 -3
  245. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +0 -226
  246. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +0 -2
  247. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +0 -2
  248. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +0 -207
  249. package/esm2022/lib/layer/layer-visibility-button/index.mjs +0 -2
  250. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +0 -83
  251. package/esm2022/lib/layer/layer.module.mjs +0 -107
  252. package/esm2022/lib/layer/shared/clusterParam.mjs +0 -2
  253. package/esm2022/lib/layer/shared/index.mjs +0 -6
  254. package/esm2022/lib/layer/shared/layer-controller.mjs +0 -316
  255. package/esm2022/lib/layer/shared/layer-selection.mjs +0 -38
  256. package/esm2022/lib/layer/shared/layer.enums.mjs +0 -2
  257. package/esm2022/lib/layer/shared/layer.service.mjs +0 -315
  258. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +0 -2
  259. package/esm2022/lib/layer/shared/layers/any-layer.mjs +0 -2
  260. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +0 -2
  261. package/esm2022/lib/layer/shared/layers/image-layer.mjs +0 -75
  262. package/esm2022/lib/layer/shared/layers/index.mjs +0 -18
  263. package/esm2022/lib/layer/shared/layers/layer-base.mjs +0 -199
  264. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +0 -2
  265. package/esm2022/lib/layer/shared/layers/layer-group.mjs +0 -120
  266. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +0 -7
  267. package/esm2022/lib/layer/shared/layers/layer.mjs +0 -178
  268. package/esm2022/lib/layer/shared/layers/legend.interface.mjs +0 -2
  269. package/esm2022/lib/layer/shared/layers/linked/index.mjs +0 -4
  270. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +0 -12
  271. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +0 -242
  272. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +0 -70
  273. package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +0 -2
  274. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +0 -55
  275. package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +0 -2
  276. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +0 -576
  277. package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +0 -2
  278. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +0 -112
  279. package/esm2022/lib/layer/track-feature-button/index.mjs +0 -2
  280. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +0 -54
  281. package/esm2022/lib/layer/utils/image-watcher.mjs +0 -62
  282. package/esm2022/lib/layer/utils/index.mjs +0 -6
  283. package/esm2022/lib/layer/utils/layer.utils.mjs +0 -57
  284. package/esm2022/lib/layer/utils/outputLegend.mjs +0 -32
  285. package/esm2022/lib/layer/utils/tile-watcher.mjs +0 -52
  286. package/esm2022/lib/layer/utils/vector-watcher.mjs +0 -50
  287. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +0 -20
  288. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +0 -87
  289. package/esm2022/lib/map/baselayers-switcher/index.mjs +0 -3
  290. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +0 -122
  291. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +0 -78
  292. package/esm2022/lib/map/geolocate-button/index.mjs +0 -2
  293. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +0 -73
  294. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +0 -2
  295. package/esm2022/lib/map/home-extent-button/index.mjs +0 -3
  296. package/esm2022/lib/map/index.mjs +0 -14
  297. package/esm2022/lib/map/info-section/index.mjs +0 -2
  298. package/esm2022/lib/map/info-section/info-section.component.mjs +0 -15
  299. package/esm2022/lib/map/map-browser/index.mjs +0 -2
  300. package/esm2022/lib/map/map-browser/map-browser.component.mjs +0 -67
  301. package/esm2022/lib/map/map-center/index.mjs +0 -2
  302. package/esm2022/lib/map/map-center/map-center.component.mjs +0 -56
  303. package/esm2022/lib/map/map.module.mjs +0 -89
  304. package/esm2022/lib/map/menu-button/index.mjs +0 -2
  305. package/esm2022/lib/map/menu-button/menu-button.component.mjs +0 -57
  306. package/esm2022/lib/map/offline-button/index.mjs +0 -2
  307. package/esm2022/lib/map/offline-button/offline-button.component.mjs +0 -53
  308. package/esm2022/lib/map/rotation-button/index.mjs +0 -2
  309. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +0 -58
  310. package/esm2022/lib/map/shared/controllers/controller.mjs +0 -44
  311. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +0 -8
  312. package/esm2022/lib/map/shared/controllers/geolocation.mjs +0 -431
  313. package/esm2022/lib/map/shared/controllers/index.mjs +0 -5
  314. package/esm2022/lib/map/shared/controllers/view.mjs +0 -361
  315. package/esm2022/lib/map/shared/hover-feature.directive.mjs +0 -481
  316. package/esm2022/lib/map/shared/index.mjs +0 -15
  317. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +0 -238
  318. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +0 -122
  319. package/esm2022/lib/map/shared/map.abstract.mjs +0 -24
  320. package/esm2022/lib/map/shared/map.enums.mjs +0 -6
  321. package/esm2022/lib/map/shared/map.interface.mjs +0 -2
  322. package/esm2022/lib/map/shared/map.mjs +0 -201
  323. package/esm2022/lib/map/shared/map.service.mjs +0 -29
  324. package/esm2022/lib/map/shared/map.utils.mjs +0 -455
  325. package/esm2022/lib/map/shared/mapOffline.directive.mjs +0 -114
  326. package/esm2022/lib/map/shared/projection.interfaces.mjs +0 -2
  327. package/esm2022/lib/map/shared/projection.service.mjs +0 -67
  328. package/esm2022/lib/map/shared/projection.utils.mjs +0 -122
  329. package/esm2022/lib/map/swipe-control/index.mjs +0 -2
  330. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +0 -211
  331. package/esm2022/lib/map/utils/index.mjs +0 -2
  332. package/esm2022/lib/map/utils/layer-watcher.mjs +0 -112
  333. package/esm2022/lib/map/wake-lock-button/index.mjs +0 -2
  334. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +0 -103
  335. package/esm2022/lib/map/zoom-button/index.mjs +0 -2
  336. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +0 -35
  337. package/esm2022/lib/measure/index.mjs +0 -3
  338. package/esm2022/lib/measure/measure.module.mjs +0 -20
  339. package/esm2022/lib/measure/measurer/index.mjs +0 -6
  340. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +0 -40
  341. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +0 -38
  342. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +0 -143
  343. package/esm2022/lib/measure/measurer/measurer.component.mjs +0 -948
  344. package/esm2022/lib/measure/measurer/measurer.module.mjs +0 -20
  345. package/esm2022/lib/measure/shared/index.mjs +0 -4
  346. package/esm2022/lib/measure/shared/measure.enum.mjs +0 -37
  347. package/esm2022/lib/measure/shared/measure.interfaces.mjs +0 -2
  348. package/esm2022/lib/measure/shared/measure.utils.mjs +0 -497
  349. package/esm2022/lib/metadata/index.mjs +0 -4
  350. package/esm2022/lib/metadata/metadata-button/index.mjs +0 -2
  351. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +0 -96
  352. package/esm2022/lib/metadata/metadata.module.mjs +0 -29
  353. package/esm2022/lib/metadata/shared/index.mjs +0 -3
  354. package/esm2022/lib/metadata/shared/metadata.interface.mjs +0 -2
  355. package/esm2022/lib/metadata/shared/metadata.service.mjs +0 -18
  356. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +0 -130
  357. package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +0 -6
  358. package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +0 -2
  359. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +0 -172
  360. package/esm2022/lib/offline/geoDB/index.mjs +0 -5
  361. package/esm2022/lib/offline/index.mjs +0 -6
  362. package/esm2022/lib/offline/layerDB/index.mjs +0 -3
  363. package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +0 -2
  364. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +0 -83
  365. package/esm2022/lib/offline/offline.interface.mjs +0 -2
  366. package/esm2022/lib/offline/offline.provider.mjs +0 -50
  367. package/esm2022/lib/offline/shared/geo-network.service.mjs +0 -79
  368. package/esm2022/lib/offline/shared/index.mjs +0 -2
  369. package/esm2022/lib/overlay/index.mjs +0 -2
  370. package/esm2022/lib/overlay/shared/index.mjs +0 -4
  371. package/esm2022/lib/overlay/shared/overlay.enum.mjs +0 -8
  372. package/esm2022/lib/overlay/shared/overlay.mjs +0 -139
  373. package/esm2022/lib/overlay/shared/overlay.utils.mjs +0 -17
  374. package/esm2022/lib/print/index.mjs +0 -4
  375. package/esm2022/lib/print/print/print.component.mjs +0 -116
  376. package/esm2022/lib/print/print-form/index.mjs +0 -2
  377. package/esm2022/lib/print/print-form/print-form.component.mjs +0 -320
  378. package/esm2022/lib/print/print.module.mjs +0 -20
  379. package/esm2022/lib/print/shared/geopdf.mjs +0 -68
  380. package/esm2022/lib/print/shared/index.mjs +0 -5
  381. package/esm2022/lib/print/shared/print.interface.mjs +0 -2
  382. package/esm2022/lib/print/shared/print.service.mjs +0 -1136
  383. package/esm2022/lib/print/shared/print.type.mjs +0 -30
  384. package/esm2022/lib/query/index.mjs +0 -2
  385. package/esm2022/lib/query/query.module.mjs +0 -27
  386. package/esm2022/lib/query/shared/index.mjs +0 -8
  387. package/esm2022/lib/query/shared/query-search-source.mjs +0 -35
  388. package/esm2022/lib/query/shared/query-search-source.providers.mjs +0 -22
  389. package/esm2022/lib/query/shared/query.directive.mjs +0 -290
  390. package/esm2022/lib/query/shared/query.enums.mjs +0 -32
  391. package/esm2022/lib/query/shared/query.interfaces.mjs +0 -2
  392. package/esm2022/lib/query/shared/query.service.mjs +0 -753
  393. package/esm2022/lib/query/shared/query.utils.mjs +0 -45
  394. package/esm2022/lib/search/index.mjs +0 -10
  395. package/esm2022/lib/search/search-bar/search-bar.component.mjs +0 -483
  396. package/esm2022/lib/search/search-bar/search-bar.module.mjs +0 -19
  397. package/esm2022/lib/search/search-results/index.mjs +0 -5
  398. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +0 -101
  399. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +0 -433
  400. package/esm2022/lib/search/search-results/search-results-item.component.mjs +0 -119
  401. package/esm2022/lib/search/search-results/search-results.component.mjs +0 -297
  402. package/esm2022/lib/search/search-results/search-results.directive.mjs +0 -7
  403. package/esm2022/lib/search/search-results/search-results.module.mjs +0 -20
  404. package/esm2022/lib/search/search-selector/search-selector.component.mjs +0 -118
  405. package/esm2022/lib/search/search-selector/search-selector.module.mjs +0 -19
  406. package/esm2022/lib/search/search-settings/search-settings.component.mjs +0 -264
  407. package/esm2022/lib/search/search-settings/search-settings.module.mjs +0 -19
  408. package/esm2022/lib/search/search.module.mjs +0 -77
  409. package/esm2022/lib/search/shared/index.mjs +0 -10
  410. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +0 -328
  411. package/esm2022/lib/search/shared/search-source-service.providers.mjs +0 -20
  412. package/esm2022/lib/search/shared/search-source.service.mjs +0 -56
  413. package/esm2022/lib/search/shared/search.enums.mjs +0 -4
  414. package/esm2022/lib/search/shared/search.interfaces.mjs +0 -2
  415. package/esm2022/lib/search/shared/search.provider.mjs +0 -20
  416. package/esm2022/lib/search/shared/search.service.mjs +0 -149
  417. package/esm2022/lib/search/shared/search.utils.mjs +0 -92
  418. package/esm2022/lib/search/shared/sources/cadastre.mjs +0 -142
  419. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +0 -32
  420. package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +0 -2
  421. package/esm2022/lib/search/shared/sources/coordinates.mjs +0 -168
  422. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +0 -52
  423. package/esm2022/lib/search/shared/sources/icherche-icons.mjs +0 -32
  424. package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +0 -2
  425. package/esm2022/lib/search/shared/sources/icherche.mjs +0 -816
  426. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +0 -87
  427. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +0 -2
  428. package/esm2022/lib/search/shared/sources/ilayer.mjs +0 -339
  429. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +0 -58
  430. package/esm2022/lib/search/shared/sources/index.mjs +0 -23
  431. package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +0 -2
  432. package/esm2022/lib/search/shared/sources/nominatim.mjs +0 -263
  433. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +0 -31
  434. package/esm2022/lib/search/shared/sources/source.interfaces.mjs +0 -13
  435. package/esm2022/lib/search/shared/sources/source.mjs +0 -221
  436. package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +0 -2
  437. package/esm2022/lib/search/shared/sources/storedqueries.mjs +0 -454
  438. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +0 -56
  439. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +0 -2
  440. package/esm2022/lib/search/shared/sources/workspace.mjs +0 -192
  441. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +0 -31
  442. package/esm2022/lib/style/index.mjs +0 -5
  443. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +0 -360
  444. package/esm2022/lib/style/shared/datasource/index.mjs +0 -2
  445. package/esm2022/lib/style/shared/feature/feature-style.mjs +0 -162
  446. package/esm2022/lib/style/shared/feature/index.mjs +0 -2
  447. package/esm2022/lib/style/shared/font.enum.mjs +0 -17
  448. package/esm2022/lib/style/shared/index.mjs +0 -5
  449. package/esm2022/lib/style/shared/overlay/index.mjs +0 -3
  450. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +0 -39
  451. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +0 -88
  452. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +0 -78
  453. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +0 -27
  454. package/esm2022/lib/style/shared/vector/index.mjs +0 -4
  455. package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +0 -2
  456. package/esm2022/lib/style/style-list/index.mjs +0 -5
  457. package/esm2022/lib/style/style-list/style-list.interface.mjs +0 -2
  458. package/esm2022/lib/style/style-list/style-list.module.mjs +0 -23
  459. package/esm2022/lib/style/style-list/style-list.provider.mjs +0 -21
  460. package/esm2022/lib/style/style-list/style-list.service.mjs +0 -52
  461. package/esm2022/lib/style/style-modal/drawing/index.mjs +0 -2
  462. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +0 -193
  463. package/esm2022/lib/style/style-modal/index.mjs +0 -5
  464. package/esm2022/lib/style/style-modal/layer/index.mjs +0 -2
  465. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +0 -142
  466. package/esm2022/lib/style/style-modal/layer-button/index.mjs +0 -2
  467. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +0 -44
  468. package/esm2022/lib/style/style-modal/shared/index.mjs +0 -2
  469. package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +0 -2
  470. package/esm2022/lib/style/style-service/draw-style.service.mjs +0 -255
  471. package/esm2022/lib/style/style-service/index.mjs +0 -3
  472. package/esm2022/lib/style/style-service/style.service.mjs +0 -393
  473. package/esm2022/lib/style/style.module.mjs +0 -46
  474. package/esm2022/lib/toast/index.mjs +0 -2
  475. package/esm2022/lib/toast/toast.component.mjs +0 -99
  476. package/esm2022/lib/toast/toast.module.mjs +0 -24
  477. package/esm2022/lib/utils/googleLinks.mjs +0 -13
  478. package/esm2022/lib/utils/id-generator.mjs +0 -112
  479. package/esm2022/lib/utils/index.mjs +0 -5
  480. package/esm2022/lib/utils/osmLinks.mjs +0 -9
  481. package/esm2022/lib/utils/propertyTypeDetector/index.mjs +0 -3
  482. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +0 -2
  483. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +0 -64
  484. package/esm2022/lib/wkt/index.mjs +0 -2
  485. package/esm2022/lib/wkt/shared/index.mjs +0 -2
  486. package/esm2022/lib/wkt/shared/wkt.service.mjs +0 -235
  487. package/esm2022/lib/wkt/wkt.module.mjs +0 -25
  488. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +0 -36
  489. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +0 -19
  490. package/esm2022/lib/workspace/confirmation-popup/index.mjs +0 -3
  491. package/esm2022/lib/workspace/index.mjs +0 -8
  492. package/esm2022/lib/workspace/shared/edition-workspace.mjs +0 -301
  493. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +0 -720
  494. package/esm2022/lib/workspace/shared/feature-workspace.mjs +0 -41
  495. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +0 -113
  496. package/esm2022/lib/workspace/shared/index.mjs +0 -8
  497. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +0 -41
  498. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +0 -121
  499. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +0 -248
  500. package/esm2022/lib/workspace/shared/workspace.utils.mjs +0 -188
  501. package/esm2022/lib/workspace/widgets/index.mjs +0 -4
  502. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +0 -48
  503. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +0 -19
  504. package/esm2022/lib/workspace/widgets/widgets.mjs +0 -15
  505. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +0 -172
  506. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
  507. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +0 -137
  508. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +0 -19
  509. package/esm2022/lib/workspace/workspace.module.mjs +0 -32
  510. package/esm2022/public_api.mjs +0 -56
@@ -1,876 +0,0 @@
1
- import { AsyncPipe, KeyValuePipe, NgClass, NgFor, NgIf } from '@angular/common';
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { FormControl, FormsModule, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatButtonToggleModule } from '@angular/material/button-toggle';
6
- import { MatOptionModule } from '@angular/material/core';
7
- import { MatFormFieldModule } from '@angular/material/form-field';
8
- import { MatInputModule } from '@angular/material/input';
9
- import { MatSelectModule } from '@angular/material/select';
10
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
11
- import { MatTooltipModule } from '@angular/material/tooltip';
12
- import { ConfirmDialogService } from '@igo2/common/confirm-dialog';
13
- import { CustomHtmlComponent } from '@igo2/common/custom-html';
14
- import { SpinnerComponent } from '@igo2/common/spinner';
15
- import { ConfigService } from '@igo2/core/config';
16
- import { LanguageService } from '@igo2/core/language';
17
- import { IgoLanguageModule } from '@igo2/core/language';
18
- import { MessageService } from '@igo2/core/message';
19
- import { StorageService } from '@igo2/core/storage';
20
- import olPoint from 'ol/geom/Point';
21
- import { BehaviorSubject, lastValueFrom } from 'rxjs';
22
- import { skipWhile } from 'rxjs/operators';
23
- import { DownloadService } from '../../download/shared/download.service';
24
- import { isLayerGroup, isLayerItem } from '../../layer';
25
- import { LayerService } from '../../layer/shared/layer.service';
26
- import { VectorLayer } from '../../layer/shared/layers/vector-layer';
27
- import { computeProjectionsConstraints } from '../../map/shared';
28
- import { IgoMap } from '../../map/shared/map';
29
- import { StyleListService } from '../../style/style-list/style-list.service';
30
- import { StyleService } from '../../style/style-service/style.service';
31
- import { ExportService } from '../shared/export.service';
32
- import { CsvSeparator, ExportFormat, ExportFormatLegacy } from '../shared/export.type';
33
- import { handleFileExportError, handleFileExportSuccess, isCsvExport } from '../shared/export.utils';
34
- import { ImportService } from '../shared/import.service';
35
- import { handleFileImportError, handleFileImportSuccess } from '../shared/import.utils';
36
- import * as i0 from "@angular/core";
37
- import * as i1 from "../shared/import.service";
38
- import * as i2 from "../shared/export.service";
39
- import * as i3 from "@igo2/core/language";
40
- import * as i4 from "@igo2/core/message";
41
- import * as i5 from "../../style/style-list/style-list.service";
42
- import * as i6 from "../../style/style-service/style.service";
43
- import * as i7 from "@angular/forms";
44
- import * as i8 from "@igo2/core/config";
45
- import * as i9 from "@igo2/core/storage";
46
- import * as i10 from "../../download/shared/download.service";
47
- import * as i11 from "../../layer/shared/layer.service";
48
- import * as i12 from "@igo2/common/confirm-dialog";
49
- import * as i13 from "@angular/material/button-toggle";
50
- import * as i14 from "@angular/material/form-field";
51
- import * as i15 from "@angular/material/select";
52
- import * as i16 from "@angular/material/core";
53
- import * as i17 from "@angular/material/tooltip";
54
- import * as i18 from "@angular/material/button";
55
- import * as i19 from "@angular/material/slide-toggle";
56
- import * as i20 from "@angular/material/input";
57
- import * as i21 from "@ngx-translate/core";
58
- export class ImportExportComponent {
59
- importService;
60
- exportService;
61
- languageService;
62
- messageService;
63
- styleListService;
64
- styleService;
65
- formBuilder;
66
- config;
67
- storageService;
68
- downloadService;
69
- layerService;
70
- confirmDialogService;
71
- form;
72
- importForm;
73
- formats$ = new BehaviorSubject(undefined);
74
- exportableLayers$ = new BehaviorSubject([]);
75
- loading$ = new BehaviorSubject(false);
76
- forceNaming = false;
77
- controlFormat = 'format';
78
- csvSeparators = CsvSeparator;
79
- isCsvExport = isCsvExport;
80
- layers$$;
81
- exportableLayers$$;
82
- formats$$;
83
- formLayer$$;
84
- exportOptions$$;
85
- importHtmlClarifications;
86
- exportHtmlClarifications;
87
- espgCodeRegex = new RegExp('^\\d{4,6}');
88
- clientSideFileSizeMax;
89
- fileSizeMb;
90
- projections$ = new BehaviorSubject([]);
91
- projectionsConstraints;
92
- popupChecked = false;
93
- configFormats;
94
- previousLayerSpecs$ = new BehaviorSubject(undefined);
95
- selectFirstProj = false;
96
- map;
97
- contextUri;
98
- _projectionsLimitations = {};
99
- set projectionsLimitations(value) {
100
- this._projectionsLimitations = value;
101
- this.computeProjections();
102
- }
103
- get projectionsLimitations() {
104
- return this._projectionsLimitations || {};
105
- }
106
- /**
107
- * Store that holds the available workspaces.
108
- */
109
- store;
110
- selectedMode = 'import';
111
- selectMode = new EventEmitter();
112
- exportOptions$ = new BehaviorSubject(undefined);
113
- exportOptionsChange = new EventEmitter();
114
- get layers() {
115
- return this.form.get('layers').value;
116
- }
117
- set layers(value) {
118
- this.form.patchValue({ layers: value });
119
- }
120
- get inputProj() {
121
- return this.importForm.get('inputProj').value;
122
- }
123
- set inputProj(value) {
124
- this.importForm.patchValue({ inputProj: value });
125
- }
126
- get popupAllowed() {
127
- return (this.storageService.get('importExportPopupAllowed') || false);
128
- }
129
- set popupAllowed(value) {
130
- this.storageService.set('importExportPopupAllowed', value);
131
- }
132
- constructor(importService, exportService, languageService, messageService, styleListService, styleService, formBuilder, config, storageService, downloadService, layerService, confirmDialogService) {
133
- this.importService = importService;
134
- this.exportService = exportService;
135
- this.languageService = languageService;
136
- this.messageService = messageService;
137
- this.styleListService = styleListService;
138
- this.styleService = styleService;
139
- this.formBuilder = formBuilder;
140
- this.config = config;
141
- this.storageService = storageService;
142
- this.downloadService = downloadService;
143
- this.layerService = layerService;
144
- this.confirmDialogService = confirmDialogService;
145
- this.loadConfig();
146
- this.buildForm();
147
- this.computeProjections();
148
- this.importHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.importHtmlClarifications');
149
- this.exportHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.exportHtmlClarifications');
150
- }
151
- ngOnInit() {
152
- this.layers$$ = this.map.layerController.all$.subscribe((layers) => {
153
- const exportableLayers = layers.filter((layer) => {
154
- if (isLayerGroup(layer)) {
155
- return false;
156
- }
157
- return ((layer instanceof VectorLayer && layer.exportable === true) ||
158
- (layer.dataSource.options.download &&
159
- layer.dataSource.options.download.url));
160
- });
161
- this.exportableLayers$.next(exportableLayers);
162
- });
163
- const configFileSizeMb = this.config.getConfig('importExport.clientSideFileSizeMaxMb');
164
- this.clientSideFileSizeMax =
165
- (configFileSizeMb ? configFileSizeMb : 30) * Math.pow(1024, 2);
166
- this.fileSizeMb = this.clientSideFileSizeMax / Math.pow(1024, 2);
167
- this.exportOptions$$ = this.exportOptions$
168
- .pipe(skipWhile((exportOptions) => !exportOptions))
169
- .subscribe((exportOptions) => {
170
- this.form.patchValue(exportOptions, { emitEvent: true });
171
- if (exportOptions.layers) {
172
- this.computeFormats(exportOptions.layers.map((l) => this.map.layerController.getById(l)));
173
- }
174
- });
175
- this.formLayer$$ = this.form
176
- .get('format')
177
- .valueChanges.subscribe((format) => {
178
- if (!this.popupChecked &&
179
- this.form.get('layers').value?.length > 1 &&
180
- this.isOgreOrLink(format)) {
181
- if (!this.handlePopup(true)) {
182
- this.form.patchValue({ format: undefined }, { emitEvent: false });
183
- }
184
- }
185
- });
186
- this.formLayer$$ = this.form
187
- .get('layers')
188
- .valueChanges.subscribe((layersId) => {
189
- this.handlePreviousLayerSpecs();
190
- const selectedLayers = layersId instanceof Array ? layersId : [layersId];
191
- this.form.patchValue({ layers: selectedLayers }, { emitEvent: false });
192
- const layers = selectedLayers.map((l) => this.map.layerController.getById(l));
193
- this.computeFormats(layers);
194
- if (this.formats$.value.indexOf(this.form.value.format) === -1) {
195
- this.form.patchValue({ format: undefined });
196
- }
197
- this.loading$.next(true);
198
- const previousSpecs = [];
199
- layers.forEach((layer) => {
200
- if (layer instanceof VectorLayer &&
201
- layer.dataSource.ol.getFeatures().length === 0) {
202
- previousSpecs.push({
203
- id: layer.id,
204
- visible: layer.visible,
205
- opacity: layer.opacity,
206
- queryable: layer.queryable
207
- });
208
- layer.opacity = 0;
209
- layer.visible = true;
210
- }
211
- });
212
- this.previousLayerSpecs$.next(previousSpecs);
213
- setTimeout(() => {
214
- this.loading$.next(false);
215
- }, 500);
216
- });
217
- this.formats$$ = this.formats$
218
- .pipe(skipWhile((formats) => !formats))
219
- .subscribe((formats) => {
220
- if (formats.length === 1) {
221
- this.form.patchValue({ format: formats[0] });
222
- }
223
- });
224
- this.exportableLayers$$ = this.exportableLayers$
225
- .pipe(skipWhile((layers) => !layers))
226
- .subscribe((layers) => {
227
- if (layers.length === 1) {
228
- this.form.patchValue({ layers: layers[0].id });
229
- }
230
- });
231
- if (this.selectFirstProj) {
232
- if (this.projections$.value.length === 0) {
233
- this.importForm.patchValue({
234
- inputProj: {
235
- translateKey: 'nad83',
236
- alias: 'NAD83',
237
- code: 'EPSG:4326',
238
- zone: ''
239
- }
240
- });
241
- }
242
- else {
243
- this.importForm.patchValue({ inputProj: this.projections$.value[0] });
244
- }
245
- }
246
- else {
247
- this.importForm.patchValue({ inputProj: undefined });
248
- }
249
- }
250
- computeProjections() {
251
- this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
252
- const projections = [];
253
- if (this.projectionsConstraints.nad83) {
254
- projections.push({
255
- translateKey: 'nad83',
256
- alias: 'NAD83',
257
- code: 'EPSG:4269',
258
- zone: '',
259
- extent: undefined,
260
- def: undefined
261
- });
262
- }
263
- if (this.projectionsConstraints.wgs84) {
264
- projections.push({
265
- translateKey: 'wgs84',
266
- alias: 'WGS84',
267
- code: 'EPSG:4326',
268
- zone: '',
269
- extent: undefined,
270
- def: undefined
271
- });
272
- }
273
- if (this.projectionsConstraints.webMercator) {
274
- projections.push({
275
- translateKey: 'webMercator',
276
- alias: 'Web Mercator',
277
- code: 'EPSG:3857',
278
- zone: '',
279
- extent: undefined,
280
- def: undefined
281
- });
282
- }
283
- if (this.projectionsConstraints.mtm) {
284
- // all mtm zones
285
- const minZone = this.projectionsConstraints.mtmZone.minZone;
286
- const maxZone = this.projectionsConstraints.mtmZone.maxZone;
287
- for (let mtmZone = minZone; mtmZone <= maxZone; mtmZone++) {
288
- const code = mtmZone < 10 ? `EPSG:3218${mtmZone}` : `EPSG:321${80 + mtmZone}`;
289
- projections.push({
290
- translateKey: 'mtm',
291
- alias: `MTM ${mtmZone}`,
292
- code,
293
- zone: `${mtmZone}`,
294
- extent: undefined,
295
- def: undefined
296
- });
297
- }
298
- }
299
- if (this.projectionsConstraints.utm) {
300
- // all utm zones
301
- const minZone = this.projectionsConstraints.utmZone.minZone;
302
- const maxZone = this.projectionsConstraints.utmZone.maxZone;
303
- for (let utmZone = minZone; utmZone <= maxZone; utmZone++) {
304
- const code = utmZone < 10 ? `EPSG:3260${utmZone}` : `EPSG:326${utmZone}`;
305
- projections.push({
306
- translateKey: 'utm',
307
- alias: `UTM ${utmZone}`,
308
- code,
309
- zone: `${utmZone}`,
310
- extent: undefined,
311
- def: undefined
312
- });
313
- }
314
- }
315
- let configProjection = [];
316
- if (this.projectionsConstraints.projFromConfig) {
317
- configProjection = (this.config.getConfig('projections') ||
318
- []);
319
- }
320
- this.projections$.next(configProjection.concat(projections));
321
- }
322
- getLayerTitleById(id) {
323
- return this.map.layerController.getById(id)?.title;
324
- }
325
- layerHasSelectedFeatures(layer) {
326
- const wksFromLayer = this.exportService.getWorkspaceByLayerId(layer.id, this.store);
327
- if (wksFromLayer) {
328
- const recs = wksFromLayer.entityStore.stateView.firstBy((record) => {
329
- return record.state.selected === true;
330
- });
331
- return recs ? true : false;
332
- }
333
- }
334
- onlySelected(event, id) {
335
- let layersWithSelection = this.form.value.layersWithSelection;
336
- if (event.checked) {
337
- layersWithSelection.push(id);
338
- }
339
- else {
340
- layersWithSelection = layersWithSelection.filter((layerId) => layerId !== id);
341
- }
342
- this.form.patchValue({ layersWithSelection });
343
- }
344
- onlySelectedClick(event, id) {
345
- if (this.form.value.layers.find((layerId) => layerId === id)) {
346
- event.stopPropagation();
347
- }
348
- }
349
- inLayersIdToExportSelectionOnly(layer) {
350
- return this.form.value.layersWithSelection.find((layerId) => layerId === layer.id)
351
- ? true
352
- : false;
353
- }
354
- ngOnDestroy() {
355
- this.layers$$.unsubscribe();
356
- this.exportableLayers$$.unsubscribe();
357
- this.formats$$.unsubscribe();
358
- this.formLayer$$.unsubscribe();
359
- if (this.exportOptions$$) {
360
- this.exportOptions$$.unsubscribe();
361
- }
362
- this.exportOptionsChange.emit(this.form.value);
363
- this.handlePreviousLayerSpecs();
364
- }
365
- handlePreviousLayerSpecs() {
366
- const previousSpecs = this.previousLayerSpecs$.value;
367
- if (previousSpecs && previousSpecs.length) {
368
- previousSpecs.forEach((specs) => {
369
- const previousLayer = this.map.layerController.getById(specs.id);
370
- previousLayer.visible = specs.visible;
371
- previousLayer.opacity = specs.opacity;
372
- previousLayer.queryable = specs.queryable;
373
- });
374
- }
375
- this.previousLayerSpecs$.next(undefined);
376
- }
377
- importFiles(files) {
378
- let inputProj = this.inputProj.code;
379
- if (this.espgCodeRegex.test(inputProj)) {
380
- inputProj = `EPSG:${inputProj}`;
381
- }
382
- this.loading$.next(true);
383
- for (const file of files) {
384
- this.importService.import(file, inputProj).subscribe((features) => this.onFileImportSuccess(file, features), (error) => this.onFileImportError(file, error), () => {
385
- this.loading$.next(false);
386
- });
387
- }
388
- }
389
- handlePopup(preCheck = true) {
390
- const p1 = window.open('', 'popup', 'width=1, height=1');
391
- p1.close();
392
- const p2 = window.open('', 'popup', 'width=1, height=1');
393
- if (!p2 || p2.closed || typeof p2.closed === 'undefined' || p2 === null) {
394
- this.onPopupBlockedError(preCheck);
395
- this.popupAllowed = false;
396
- }
397
- else {
398
- p2.close();
399
- this.popupAllowed = true;
400
- this.popupChecked = true;
401
- }
402
- return this.popupAllowed;
403
- }
404
- isOgreOrLink(format) {
405
- const ogreFormats = Object.keys(ExportService.ogreFormats);
406
- return ogreFormats.indexOf(format) >= 0 || format === 'URL';
407
- }
408
- async handleExportFormSubmit(data) {
409
- this.loading$.next(true);
410
- if (!this.popupChecked &&
411
- data.layers.length > 1 &&
412
- this.isOgreOrLink(data.format) &&
413
- !this.popupAllowed) {
414
- this.handlePopup();
415
- }
416
- const isCSV = isCsvExport(data.format);
417
- if (data.format === 'Excel') {
418
- try {
419
- await this.exportService.exportExcel(this.map, this.store, data);
420
- this.loading$.next(false);
421
- return this.onFileExportSuccess();
422
- }
423
- catch (error) {
424
- this.onFileExportError(error);
425
- throw error;
426
- }
427
- }
428
- let fileName = '';
429
- for (const layerId of data.layers) {
430
- this.loading$.next(true);
431
- const layer = this.map.layerController.getById(layerId);
432
- if (isLayerGroup(layer)) {
433
- continue;
434
- }
435
- const features = await lastValueFrom(this.exportService.getFeatures(this.map, layer, data, this.store)).catch((error) => {
436
- this.onFileExportError(error);
437
- throw error;
438
- });
439
- const geomTypes = this.exportService.getGeomTypes(features, data.format);
440
- if (!isCSV || !data.combineLayers || data.layers.length === 1) {
441
- fileName = layer.title;
442
- if (data.name) {
443
- fileName = data.name;
444
- }
445
- }
446
- else {
447
- fileName = this.languageService.translate.instant('igo.geo.export.combinedLayers');
448
- }
449
- if (data.format === 'URL' && isLayerItem(layer)) {
450
- this.handleUrlExport(layer);
451
- }
452
- if (data.format === 'GPX') {
453
- this.validateGpxExport(geomTypes);
454
- }
455
- if (geomTypes.length === 0) {
456
- this.loading$.next(false);
457
- this.messageService.error('igo.geo.export.nothing.text', 'igo.geo.export.nothing.title', { timeOut: 20000 });
458
- }
459
- if (!isCSV || !data.combineLayers) {
460
- geomTypes.forEach((geomType) => {
461
- if (geomType.type) {
462
- fileName += geomType.type;
463
- }
464
- this.handleExport(geomType.features, data, fileName);
465
- });
466
- }
467
- this.loading$.next(false);
468
- }
469
- if (isCSV) {
470
- this.handleCsvExport(data, fileName);
471
- }
472
- }
473
- handleUrlExport(layer) {
474
- const { download = null } = layer.dataSource.options;
475
- if (download?.url || download?.dynamicUrl) {
476
- setTimeout(() => {
477
- const url = download.url ?? download.dynamicUrl;
478
- url.match(/service=wfs/gi)
479
- ? this.downloadService.open(layer)
480
- : window.open(url, '_blank');
481
- this.loading$.next(false);
482
- }, 500);
483
- return;
484
- }
485
- }
486
- validateGpxExport(geomTypes) {
487
- const gpxFeatureCnt = geomTypes.length;
488
- geomTypes = geomTypes.filter((geomType) => ['LineString', 'Point'].includes(geomType.type));
489
- const gpxFeatureCntPointOrPoly = geomTypes.length;
490
- if (gpxFeatureCnt > gpxFeatureCntPointOrPoly) {
491
- this.messageService.error('igo.geo.export.gpx.error.poly.text', 'igo.geo.export.gpx.error.poly.title', { timeOut: 20000 });
492
- }
493
- }
494
- async handleCsvExport(data, fileName) {
495
- const featuresCSV = [];
496
- if (data.combineLayers) {
497
- let previousFeature = undefined;
498
- const geomTypes = await this.getAllLayerGeomTypes(data);
499
- geomTypes.forEach((geomType) => {
500
- geomType.features.forEach((currentFeature) => {
501
- if (data.separator) {
502
- if (previousFeature) {
503
- if (currentFeature.get('_featureStore').layer.options.title !==
504
- previousFeature.get('_featureStore').layer.options.title) {
505
- const titleEmptyRows = this.createTitleEmptyRows(previousFeature, currentFeature);
506
- featuresCSV.push(titleEmptyRows[2]);
507
- featuresCSV.push(titleEmptyRows[0]);
508
- featuresCSV.push(titleEmptyRows[1]);
509
- }
510
- }
511
- else {
512
- const titleEmptyRows = this.createTitleEmptyRows(currentFeature, currentFeature);
513
- featuresCSV.push(titleEmptyRows[0]);
514
- }
515
- }
516
- featuresCSV.push(currentFeature);
517
- previousFeature = currentFeature;
518
- });
519
- });
520
- }
521
- this.handleExport(featuresCSV, data, fileName);
522
- }
523
- handleExport(features, options, fileName) {
524
- this.exportService
525
- .export(features, options, fileName, this.map.projectionCode)
526
- .subscribe({
527
- error: (error) => this.onFileExportError(error),
528
- complete: () => {
529
- this.onFileExportSuccess();
530
- features.forEach((feature) => {
531
- this.circleToPoint(feature);
532
- });
533
- this.loading$.next(false);
534
- }
535
- });
536
- }
537
- async getAllLayerGeomTypes(data) {
538
- return data.layers.reduce(async (typesPromise, layerId) => {
539
- const types = await typesPromise;
540
- const layer = this.map.layerController.getById(layerId);
541
- if (isLayerGroup(layer)) {
542
- return typesPromise;
543
- }
544
- const features = await lastValueFrom(this.exportService.getFeatures(this.map, layer, data, this.store)).catch((error) => {
545
- this.onFileExportError(error);
546
- throw error;
547
- });
548
- const geomTypes = this.exportService.getGeomTypes(features, data.format);
549
- return types.concat(geomTypes);
550
- }, Promise.resolve([]));
551
- }
552
- createTitleEmptyRows(previousFeature, currentFeature) {
553
- const titleRow = currentFeature.clone();
554
- const headerRow = currentFeature.clone();
555
- const emptyRow = currentFeature.clone();
556
- const previousFeatureKeys = previousFeature.getKeys();
557
- let firstKeyPrevious = '';
558
- for (const key in previousFeatureKeys) {
559
- if (previousFeatureKeys[key] !== 'geometry') {
560
- firstKeyPrevious = previousFeatureKeys[key];
561
- break;
562
- }
563
- }
564
- const currentFeatureKeys = currentFeature.getKeys();
565
- let firstKeyCurrent = '';
566
- for (const key in currentFeatureKeys) {
567
- if (currentFeatureKeys[key] !== 'geometry') {
568
- firstKeyCurrent = currentFeatureKeys[key];
569
- break;
570
- }
571
- }
572
- const allKeys = currentFeature.getKeys();
573
- previousFeatureKeys.forEach((previousKey) => {
574
- if (allKeys.includes(previousKey) && previousKey !== firstKeyPrevious) {
575
- allKeys.push(previousKey);
576
- }
577
- });
578
- allKeys.unshift(firstKeyPrevious);
579
- let firstKeyAll = '';
580
- for (const key in allKeys) {
581
- if (allKeys[key] !== 'geometry') {
582
- firstKeyAll = allKeys[key];
583
- break;
584
- }
585
- }
586
- allKeys.forEach((key) => {
587
- const sameKeys = previousFeatureKeys.length === currentFeatureKeys.length &&
588
- previousFeatureKeys.every((value, index) => value === currentFeatureKeys[index]);
589
- if (key === firstKeyAll && !sameKeys) {
590
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title +
591
- ' ===============>', true);
592
- headerRow.set(key, key, true);
593
- emptyRow.unset(key, true);
594
- }
595
- else if (key === firstKeyAll && sameKeys) {
596
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
597
- headerRow.set(key, key, true);
598
- emptyRow.unset(key, true);
599
- }
600
- else if (key === firstKeyCurrent) {
601
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
602
- headerRow.set(key, key, true);
603
- emptyRow.unset(key, true);
604
- }
605
- else if (key !== 'geometry') {
606
- titleRow.unset(key, true);
607
- headerRow.set(key, key, true);
608
- emptyRow.unset(key, true);
609
- }
610
- else {
611
- titleRow.unset(key, true);
612
- emptyRow.unset(key, true);
613
- }
614
- if (!currentFeatureKeys.includes(key)) {
615
- headerRow.unset(key, true);
616
- }
617
- });
618
- const titleEmptyRows = [titleRow, headerRow, emptyRow];
619
- return titleEmptyRows;
620
- }
621
- circleToPoint(feature) {
622
- const radius = feature.get('rad');
623
- if (radius) {
624
- const point = new olPoint([
625
- feature.get('longitude'),
626
- feature.get('latitude')
627
- ]);
628
- point.transform('EPSG:4326', feature.get('_projection'));
629
- feature.setGeometry(point);
630
- }
631
- }
632
- buildForm() {
633
- this.importForm = this.formBuilder.group({
634
- inputProj: ['', [Validators.required]]
635
- });
636
- const form = this.formBuilder.group({
637
- format: ['', [Validators.required]],
638
- layers: [[], [Validators.required]],
639
- layersWithSelection: [[]],
640
- combineLayers: [true, [Validators.required]],
641
- separator: [false, [Validators.required]],
642
- featureInMapExtent: [false, [Validators.required]]
643
- });
644
- if (this.forceNaming) {
645
- form.addControl('name', new FormControl('', [Validators.required]));
646
- }
647
- form
648
- .get('format')
649
- .valueChanges.subscribe((format) => this.handleCsvForm(form, format));
650
- this.form = form;
651
- }
652
- handleCsvForm(form, format) {
653
- format === 'CSV'
654
- ? form.addControl('csvSeparator', new FormControl('auto', [Validators.required]))
655
- : form.removeControl('csvSeparator');
656
- }
657
- onFileImportSuccess(file, features) {
658
- const importExportOptions = this.config.getConfig('importExport');
659
- const confirmDialogService = importExportOptions?.allowToStoreLayer
660
- ? this.confirmDialogService
661
- : undefined;
662
- if (!importExportOptions?.importWithStyle) {
663
- handleFileImportSuccess(file, features, this.map, this.contextUri, this.messageService, this.layerService, confirmDialogService);
664
- }
665
- else {
666
- handleFileImportSuccess(file, features, this.map, this.contextUri, this.messageService, this.layerService, confirmDialogService, this.styleListService, this.styleService);
667
- }
668
- }
669
- onFileImportError(file, error) {
670
- this.loading$.next(false);
671
- handleFileImportError(file, error, this.messageService, this.fileSizeMb);
672
- }
673
- onPopupBlockedError(preCheck = true) {
674
- this.loading$.next(false);
675
- const extraMessage = preCheck
676
- ? 'igo.geo.export.popupBlocked.selectAgain'
677
- : 'igo.geo.export.popupBlocked.retry';
678
- this.messageService.error('igo.geo.export.popupBlocked.text', 'igo.geo.export.popupBlocked.title', { timeOut: 20000 }, { extraMessage });
679
- }
680
- onFileExportError(error) {
681
- this.loading$.next(false);
682
- handleFileExportError(error, this.messageService);
683
- }
684
- loadConfig() {
685
- const forceNamingConfig = this.config.getConfig('importExport.forceNaming');
686
- this.forceNaming =
687
- forceNamingConfig !== undefined ? forceNamingConfig : false;
688
- this.configFormats = this.config.getConfig('importExport.formats');
689
- this.computeFormats();
690
- }
691
- computeFormats(layers) {
692
- let appliedformats = [...ExportFormat];
693
- const formatsType = {
694
- onlyUrl: false,
695
- onlyVector: false,
696
- vectorAndUrl: false,
697
- customList: false
698
- };
699
- const customList = [];
700
- if (layers?.length) {
701
- layers.forEach((layer) => {
702
- if (!layer || isLayerGroup(layer)) {
703
- return;
704
- }
705
- if (layer.dataSource.options.download?.allowedFormats) {
706
- formatsType.customList = true;
707
- customList.push({
708
- layer: layer.title,
709
- formats: this.validateListFormat(layer.dataSource.options.download.allowedFormats)
710
- });
711
- }
712
- else if (!(layer instanceof VectorLayer) &&
713
- layer.dataSource.options.download &&
714
- layer.dataSource.options.download.url) {
715
- formatsType.onlyUrl = true;
716
- }
717
- else if (layer.dataSource.options.download &&
718
- (layer.dataSource.options.download.url ||
719
- layer.dataSource.options.download.dynamicUrl)) {
720
- formatsType.vectorAndUrl = true;
721
- }
722
- else if (layer instanceof VectorLayer) {
723
- formatsType.onlyVector = true;
724
- }
725
- });
726
- const hasUrl = this.formats$.value.includes('URL');
727
- if (formatsType.onlyUrl === true && formatsType.onlyVector === false) {
728
- appliedformats = ['URL'];
729
- }
730
- else if (formatsType.onlyVector === true &&
731
- formatsType.onlyUrl === false) {
732
- this.computeFormats(); // reset
733
- if (hasUrl) {
734
- appliedformats = [...this.formats$.value].filter((key) => key !== 'URL');
735
- }
736
- }
737
- else if (formatsType.vectorAndUrl === true &&
738
- formatsType.onlyUrl === false &&
739
- formatsType.onlyVector === false) {
740
- this.computeFormats(); // reset
741
- if (!hasUrl) {
742
- const keys = [...this.formats$.value];
743
- keys.push('URL');
744
- appliedformats = keys;
745
- }
746
- }
747
- }
748
- appliedformats = this.getAvailableFormats(appliedformats);
749
- if (formatsType.customList) {
750
- let commonFormats;
751
- const layersWithCustomFormats = [];
752
- let previousCustomListFormats = customList[0].formats;
753
- customList.map((list) => {
754
- layersWithCustomFormats.push(list.layer);
755
- commonFormats = list.formats.filter((value) => previousCustomListFormats.includes(value));
756
- previousCustomListFormats = list.formats;
757
- });
758
- const finalFormats = commonFormats.filter((value) => appliedformats.includes(value));
759
- if (finalFormats.length > 0) {
760
- this.formats$.next(finalFormats);
761
- if (layers && layers.length) {
762
- if (layers.length > 1) {
763
- this.messageService.alert('igo.geo.export.customList.text', 'igo.geo.export.customList.title', undefined, { value: layersWithCustomFormats.join() });
764
- }
765
- }
766
- }
767
- else {
768
- this.formats$.next([]);
769
- this.messageService.alert('igo.geo.export.noFormat.text', 'igo.geo.export.noFormat.title');
770
- }
771
- return;
772
- }
773
- else {
774
- this.formats$.next(appliedformats);
775
- }
776
- }
777
- getAvailableFormats(layerFormats) {
778
- if (!this.configFormats) {
779
- return layerFormats;
780
- }
781
- const availableFormats = this.validateListFormat(this.configFormats);
782
- return layerFormats.filter((layerFormat) => availableFormats.includes(layerFormat));
783
- }
784
- validateListFormat(formats) {
785
- const allUppercaseFormats = [...ExportFormat, ...ExportFormatLegacy].map((f) => f.toUpperCase());
786
- return formats
787
- .filter((format) => {
788
- if (allUppercaseFormats.includes(format.toUpperCase())) {
789
- return format;
790
- }
791
- })
792
- .map((format) => {
793
- const csvFormats = ['CSV', 'CSVcomma', 'CSVsemicolon'].map((f) => f.toUpperCase());
794
- if (csvFormats.includes(format.toUpperCase())) {
795
- return 'CSV';
796
- }
797
- else if (this.compareString('Excel', format)) {
798
- return 'Excel';
799
- }
800
- else if (this.compareString('GML', format)) {
801
- return 'GML';
802
- }
803
- else if (this.compareString('GPX', format)) {
804
- return 'GPX';
805
- }
806
- else if (this.compareString('GeoJSON', format)) {
807
- return 'GeoJSON';
808
- }
809
- else if (this.compareString('KML', format)) {
810
- return 'KML';
811
- }
812
- else if (this.compareString('Shapefile', format)) {
813
- return 'Shapefile';
814
- }
815
- else if (this.compareString('URL', format)) {
816
- return 'URL';
817
- }
818
- });
819
- }
820
- compareString(value1, value2) {
821
- return value1.toUpperCase() === value2.toUpperCase();
822
- }
823
- modeChanged(mode) {
824
- this.selectMode.emit(mode);
825
- }
826
- onFileExportSuccess() {
827
- handleFileExportSuccess(this.messageService);
828
- }
829
- onImportExportChange(event) {
830
- this.selectedMode = event.value;
831
- }
832
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportExportComponent, deps: [{ token: i1.ImportService }, { token: i2.ExportService }, { token: i3.LanguageService }, { token: i4.MessageService }, { token: i5.StyleListService }, { token: i6.StyleService }, { token: i7.UntypedFormBuilder }, { token: i8.ConfigService }, { token: i9.StorageService }, { token: i10.DownloadService }, { token: i11.LayerService }, { token: i12.ConfirmDialogService }], target: i0.ɵɵFactoryTarget.Component });
833
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ImportExportComponent, isStandalone: true, selector: "igo-import-export", inputs: { selectFirstProj: "selectFirstProj", map: "map", contextUri: "contextUri", projectionsLimitations: "projectionsLimitations", store: "store", selectedMode: "selectedMode", exportOptions$: "exportOptions$" }, outputs: { selectMode: "selectMode", exportOptionsChange: "exportOptionsChange" }, providers: [ConfirmDialogService], ngImport: i0, template: "<div class=\"import-export-toggle\">\n <mat-button-toggle-group\n [value]=\"selectedMode\"\n (change)=\"onImportExportChange($event)\"\n >\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\n class=\"igo-form\"\n [formGroup]=\"importForm\"\n *ngIf=\"selectedMode === 'import'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.importProjPlaceholder' | translate\n }}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option\n *ngFor=\"let projection of projections$ | async\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle *ngIf=\"projection.translateKey\">\n {{\n 'igo.geo.importExportForm.projections.' + projection.translateKey\n | translate: projection\n }}\n </span>\n <span matListItemTitle *ngIf=\"!projection.translateKey\">\n {{ projection.alias }}\n </span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n importForm.invalid\n ? ('igo.geo.importExportForm.projections.choose' | translate)\n : ('igo.geo.importExportForm.importButton' | translate)\n \"\n class=\"igo-form-button-group\"\n >\n <button\n [disabled]=\"importForm.invalid || (loading$ | async)\"\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n >\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($any($event.target).files)\"\n />\n </div>\n</form>\n<section *ngIf=\"selectedMode === 'import'\">\n <div *ngIf=\"importHtmlClarifications === ''\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n <li>\n {{ 'igo.geo.importExportForm.importFormatAuthorized' | translate }}\n </li>\n <li>{{ 'igo.geo.importExportForm.importShpZip' | translate }}</li>\n </ul>\n </div>\n <igo-custom-html\n *ngIf=\"importHtmlClarifications !== ''\"\n [html]=\"importHtmlClarifications\"\n >\n </igo-custom-html>\n</section>\n\n<section\n *ngIf=\"(exportableLayers$ | async).length === 0 && selectedMode === 'export'\"\n>\n <h4>{{ 'igo.geo.importExportForm.exportNoLayersExportable' | translate }}</h4>\n</section>\n\n<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n *ngIf=\"(exportableLayers$ | async).length > 0 && selectedMode === 'export'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.exportLayerPlaceholder' | translate\n }}</mat-label>\n <mat-select [(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 }}\n {{\n (layers?.length === 2\n ? 'igo.geo.importExportForm.other'\n : 'igo.geo.importExportForm.others'\n ) | translate\n }})\n </span>\n </mat-select-trigger>\n <mat-option\n *ngFor=\"let layer of exportableLayers$ | async\"\n [ngClass]=\"{\n 'igo-export-layer-mat-option': layerHasSelectedFeatures(layer)\n }\"\n [value]=\"layer.id\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle>{{ layer.title }}</span>\n <span matListItemTitle>\n <mat-slide-toggle\n *ngIf=\"layerHasSelectedFeatures(layer)\"\n (click)=\"onlySelectedClick($event, layer.id)\"\n (checked)=\"inLayersIdToExportSelectionOnly(layer)\"\n (change)=\"onlySelected($event, layer.id)\"\n >\n <small>{{\n 'igo.geo.importExportForm.exportSelectedFeature' | translate\n }}</small>\n </mat-slide-toggle>\n </span>\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>{{\n 'igo.geo.importExportForm.exportFormatPlaceholder' | translate\n }}</mat-label>\n <mat-select formControlName=\"format\">\n <ng-container *ngIf=\"(formats$ | async).length !== 0\">\n <mat-option *ngFor=\"let format of formats$ | async\" [value]=\"format\">\n {{ 'igo.geo.export.format.' + format | 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\n class=\"igo-input-container\"\n *ngIf=\"forceNaming && form.value.format !== 'URL'\"\n >\n <mat-form-field>\n <input\n matInput\n formControlName=\"name\"\n placeholder=\"{{\n 'igo.geo.importExportForm.exportFileNamePlaceholder' | translate\n }}\"\n />\n </mat-form-field>\n </div>\n\n <ng-container *ngIf=\"this.isCsvExport(form.value.format)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{ 'igo.geo.export.separator' | translate }}</mat-label>\n <mat-select formControlName=\"csvSeparator\">\n <mat-option\n *ngFor=\"let separator of csvSeparators\"\n [value]=\"separator\"\n >\n {{ 'igo.geo.export.csv.separator.' + separator | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"layers.length > 1\" class=\"export-combine-layers\">\n <mat-slide-toggle\n formControlName=\"combineLayers\"\n [labelPosition]=\"'before'\"\n >\n {{ 'igo.geo.importExportForm.exportCombineResults' | translate }}\n </mat-slide-toggle>\n </div>\n\n <div\n *ngIf=\"layers.length > 1 && form.value.combineLayers\"\n class=\"export-separator\"\n >\n <mat-slide-toggle formControlName=\"separator\" [labelPosition]=\"'before'\">\n {{ 'igo.geo.importExportForm.exportSeparator' | translate }}\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <div class=\"export-options\" *ngIf=\"form.value.format !== 'URL'\">\n <mat-slide-toggle\n formControlName=\"featureInMapExtent\"\n [labelPosition]=\"'before'\"\n >\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 >\n {{\n form.value.format !== 'URL'\n ? ('igo.geo.importExportForm.exportButton' | translate)\n : form.value.layers.length > 1\n ? ('igo.geo.importExportForm.exportButtonLinks' | translate)\n : ('igo.geo.importExportForm.exportButtonLink' | translate)\n }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n\n <igo-custom-html\n *ngIf=\"exportHtmlClarifications !== ''\"\n [html]=\"exportHtmlClarifications\"\n >\n </igo-custom-html>\n</form>\n", styles: [":host mat-option.igo-export-layer-mat-option{height:5em;line-height:1em}:host .import-export-toggle{padding:10px;text-align:center}:host .import-export-toggle mat-button-toggle-group{width:100%}:host .import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}:host h4{padding:0 5px}:host .igo-form{padding:15px 5px}:host .igo-input-container mat-form-field{width:100%}:host .igo-form-button-group{text-align:center;padding-top:10px}:host igo-spinner{position:absolute;padding-left:10px}:host .export-options mat-slide-toggle,:host .export-combine-layers mat-slide-toggle,:host .export-separator mat-slide-toggle{width:100%;padding:10px}:host .export-options mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-separator mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .export-options mat-slide-toggle ::ng-deep .mdc-label,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-label,:host .export-separator mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .export-select-trigger{opacity:.75;font-size:.75em}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i13.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i13.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i14.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i14.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i15.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i15.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i16.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i18.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: SpinnerComponent, selector: "igo-spinner", inputs: ["shown"] }, { kind: "component", type: CustomHtmlComponent, selector: "igo-custom-html", inputs: ["html"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i19.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i20.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i21.TranslatePipe, name: "translate" }] });
834
- }
835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportExportComponent, decorators: [{
836
- type: Component,
837
- args: [{ selector: 'igo-import-export', standalone: true, imports: [
838
- MatButtonToggleModule,
839
- NgIf,
840
- FormsModule,
841
- ReactiveFormsModule,
842
- MatFormFieldModule,
843
- MatSelectModule,
844
- NgFor,
845
- MatOptionModule,
846
- MatTooltipModule,
847
- MatButtonModule,
848
- SpinnerComponent,
849
- CustomHtmlComponent,
850
- NgClass,
851
- MatSlideToggleModule,
852
- MatInputModule,
853
- AsyncPipe,
854
- KeyValuePipe,
855
- IgoLanguageModule
856
- ], providers: [ConfirmDialogService], template: "<div class=\"import-export-toggle\">\n <mat-button-toggle-group\n [value]=\"selectedMode\"\n (change)=\"onImportExportChange($event)\"\n >\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\n class=\"igo-form\"\n [formGroup]=\"importForm\"\n *ngIf=\"selectedMode === 'import'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.importProjPlaceholder' | translate\n }}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option\n *ngFor=\"let projection of projections$ | async\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle *ngIf=\"projection.translateKey\">\n {{\n 'igo.geo.importExportForm.projections.' + projection.translateKey\n | translate: projection\n }}\n </span>\n <span matListItemTitle *ngIf=\"!projection.translateKey\">\n {{ projection.alias }}\n </span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n importForm.invalid\n ? ('igo.geo.importExportForm.projections.choose' | translate)\n : ('igo.geo.importExportForm.importButton' | translate)\n \"\n class=\"igo-form-button-group\"\n >\n <button\n [disabled]=\"importForm.invalid || (loading$ | async)\"\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n >\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($any($event.target).files)\"\n />\n </div>\n</form>\n<section *ngIf=\"selectedMode === 'import'\">\n <div *ngIf=\"importHtmlClarifications === ''\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n <li>\n {{ 'igo.geo.importExportForm.importFormatAuthorized' | translate }}\n </li>\n <li>{{ 'igo.geo.importExportForm.importShpZip' | translate }}</li>\n </ul>\n </div>\n <igo-custom-html\n *ngIf=\"importHtmlClarifications !== ''\"\n [html]=\"importHtmlClarifications\"\n >\n </igo-custom-html>\n</section>\n\n<section\n *ngIf=\"(exportableLayers$ | async).length === 0 && selectedMode === 'export'\"\n>\n <h4>{{ 'igo.geo.importExportForm.exportNoLayersExportable' | translate }}</h4>\n</section>\n\n<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n *ngIf=\"(exportableLayers$ | async).length > 0 && selectedMode === 'export'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.exportLayerPlaceholder' | translate\n }}</mat-label>\n <mat-select [(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 }}\n {{\n (layers?.length === 2\n ? 'igo.geo.importExportForm.other'\n : 'igo.geo.importExportForm.others'\n ) | translate\n }})\n </span>\n </mat-select-trigger>\n <mat-option\n *ngFor=\"let layer of exportableLayers$ | async\"\n [ngClass]=\"{\n 'igo-export-layer-mat-option': layerHasSelectedFeatures(layer)\n }\"\n [value]=\"layer.id\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle>{{ layer.title }}</span>\n <span matListItemTitle>\n <mat-slide-toggle\n *ngIf=\"layerHasSelectedFeatures(layer)\"\n (click)=\"onlySelectedClick($event, layer.id)\"\n (checked)=\"inLayersIdToExportSelectionOnly(layer)\"\n (change)=\"onlySelected($event, layer.id)\"\n >\n <small>{{\n 'igo.geo.importExportForm.exportSelectedFeature' | translate\n }}</small>\n </mat-slide-toggle>\n </span>\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>{{\n 'igo.geo.importExportForm.exportFormatPlaceholder' | translate\n }}</mat-label>\n <mat-select formControlName=\"format\">\n <ng-container *ngIf=\"(formats$ | async).length !== 0\">\n <mat-option *ngFor=\"let format of formats$ | async\" [value]=\"format\">\n {{ 'igo.geo.export.format.' + format | 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\n class=\"igo-input-container\"\n *ngIf=\"forceNaming && form.value.format !== 'URL'\"\n >\n <mat-form-field>\n <input\n matInput\n formControlName=\"name\"\n placeholder=\"{{\n 'igo.geo.importExportForm.exportFileNamePlaceholder' | translate\n }}\"\n />\n </mat-form-field>\n </div>\n\n <ng-container *ngIf=\"this.isCsvExport(form.value.format)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{ 'igo.geo.export.separator' | translate }}</mat-label>\n <mat-select formControlName=\"csvSeparator\">\n <mat-option\n *ngFor=\"let separator of csvSeparators\"\n [value]=\"separator\"\n >\n {{ 'igo.geo.export.csv.separator.' + separator | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"layers.length > 1\" class=\"export-combine-layers\">\n <mat-slide-toggle\n formControlName=\"combineLayers\"\n [labelPosition]=\"'before'\"\n >\n {{ 'igo.geo.importExportForm.exportCombineResults' | translate }}\n </mat-slide-toggle>\n </div>\n\n <div\n *ngIf=\"layers.length > 1 && form.value.combineLayers\"\n class=\"export-separator\"\n >\n <mat-slide-toggle formControlName=\"separator\" [labelPosition]=\"'before'\">\n {{ 'igo.geo.importExportForm.exportSeparator' | translate }}\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <div class=\"export-options\" *ngIf=\"form.value.format !== 'URL'\">\n <mat-slide-toggle\n formControlName=\"featureInMapExtent\"\n [labelPosition]=\"'before'\"\n >\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 >\n {{\n form.value.format !== 'URL'\n ? ('igo.geo.importExportForm.exportButton' | translate)\n : form.value.layers.length > 1\n ? ('igo.geo.importExportForm.exportButtonLinks' | translate)\n : ('igo.geo.importExportForm.exportButtonLink' | translate)\n }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n\n <igo-custom-html\n *ngIf=\"exportHtmlClarifications !== ''\"\n [html]=\"exportHtmlClarifications\"\n >\n </igo-custom-html>\n</form>\n", styles: [":host mat-option.igo-export-layer-mat-option{height:5em;line-height:1em}:host .import-export-toggle{padding:10px;text-align:center}:host .import-export-toggle mat-button-toggle-group{width:100%}:host .import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}:host h4{padding:0 5px}:host .igo-form{padding:15px 5px}:host .igo-input-container mat-form-field{width:100%}:host .igo-form-button-group{text-align:center;padding-top:10px}:host igo-spinner{position:absolute;padding-left:10px}:host .export-options mat-slide-toggle,:host .export-combine-layers mat-slide-toggle,:host .export-separator mat-slide-toggle{width:100%;padding:10px}:host .export-options mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-separator mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .export-options mat-slide-toggle ::ng-deep .mdc-label,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-label,:host .export-separator mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .export-select-trigger{opacity:.75;font-size:.75em}\n"] }]
857
- }], ctorParameters: () => [{ type: i1.ImportService }, { type: i2.ExportService }, { type: i3.LanguageService }, { type: i4.MessageService }, { type: i5.StyleListService }, { type: i6.StyleService }, { type: i7.UntypedFormBuilder }, { type: i8.ConfigService }, { type: i9.StorageService }, { type: i10.DownloadService }, { type: i11.LayerService }, { type: i12.ConfirmDialogService }], propDecorators: { selectFirstProj: [{
858
- type: Input
859
- }], map: [{
860
- type: Input
861
- }], contextUri: [{
862
- type: Input
863
- }], projectionsLimitations: [{
864
- type: Input
865
- }], store: [{
866
- type: Input
867
- }], selectedMode: [{
868
- type: Input
869
- }], selectMode: [{
870
- type: Output
871
- }], exportOptions$: [{
872
- type: Input
873
- }], exportOptionsChange: [{
874
- type: Output
875
- }] } });
876
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFFWCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUVsQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUVMLG9CQUFvQixFQUNyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8s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Q2xCLGVBQWU7d0JBQ2YsS0FBSzt3QkFDTCxlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLG1CQUFtQjt3QkFDbkIsT0FBTzt3QkFDUCxvQkFBb0I7d0JBQ3BCLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxZQUFZO3dCQUNaLGlCQUFpQjtxQkFDbEIsYUFDVSxDQUFDLG9CQUFvQixDQUFDOzRaQTBDeEIsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFJRixzQkFBc0I7c0JBRHpCLEtBQUs7Z0JBWUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRSxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgS2V5VmFsdWVQaXBlLCBOZ0NsYXNzLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBGb3Jtc01vZHVsZSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQge1xuICBNYXRTbGlkZVRvZ2dsZUNoYW5nZSxcbiAgTWF0U2xpZGVUb2dnbGVNb2R1bGVcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgQ29uZmlybURpYWxvZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb21tb24vY29uZmlybS1kaWFsb2cnO1xuaW1wb3J0IHsgQ3VzdG9tSHRtbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9jdXN0b20taHRtbCc7XG5pbXBvcnQgeyBFbnRpdHlSZWNvcmQgfSBmcm9tICdAaWdvMi9jb21tb24vZW50aXR5JztcbmltcG9ydCB7IFNwaW5uZXJDb21wb25lbnQgfSBmcm9tICdAaWdvMi9jb21tb24vc3Bpbm5lcic7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVN0b3JlIH0gZnJvbSAnQGlnbzIvY29tbW9uL3dvcmtzcGFjZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL3N0b3JhZ2UnO1xuXG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xGZWF0dXJlIH0gZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IG9sUG9pbnQgZnJvbSAnb2wvZ2VvbS9Qb2ludCc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBza2lwV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvZGF0YXNvdXJjZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRG93bmxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZG93bmxvYWQvc2hhcmVkL2Rvd25sb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0xheWVyR3JvdXAsIGlzTGF5ZXJJdGVtIH0gZnJvbSAnLi4vLi4vbGF5ZXInO1xuaW1wb3J0IHsgTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW55TGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL2FueS1sYXllcic7XG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvbGF5ZXInO1xuaW1wb3J0IHsgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL3ZlY3Rvci1sYXllcic7XG5pbXBvcnQgeyBJbnB1dFByb2plY3Rpb25zLCBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucyB9IGZyb20gJy4uLy4uL21hcC8nO1xuaW1wb3J0IHsgY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHMgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkJztcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwJztcbmltcG9ydCB7IFN0eWxlTGlzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZS1saXN0L3N0eWxlLWxpc3Quc2VydmljZSc7XG5pbXBvcnQgeyBTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZS1zZXJ2aWNlL3N0eWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwb3J0T3B0aW9ucywgR2VvbWV0cnlDb2xsZWN0aW9uIH0gZnJvbSAnLi4vc2hhcmVkL2V4cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9leHBvcnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBBbnlFeHBvcnRGb3JtYXQsXG4gIENzdlNlcGFyYXRvcixcbiAgRXhwb3J0Rm9ybWF0LFxuICBFeHBvcnRGb3JtYXRMZWdhY3lcbn0gZnJvbSAnLi4vc2hhcmVkL2V4cG9ydC50eXBlJztcbmltcG9ydCB7XG4gIGhhbmRsZUZpbGVFeHBvcnRFcnJvcixcbiAgaGFuZGxlRmlsZUV4cG9ydFN1Y2Nlc3MsXG4gIGlzQ3N2RXhwb3J0XG59IGZyb20gJy4uL3NoYXJlZC9leHBvcnQudXRpbHMnO1xuaW1wb3J0IHsgSW1wb3J0RXhwb3J0U2VydmljZU9wdGlvbnMgfSBmcm9tICcuLi9zaGFyZWQvaW1wb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2ltcG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGhhbmRsZUZpbGVJbXBvcnRFcnJvcixcbiAgaGFuZGxlRmlsZUltcG9ydFN1Y2Nlc3Ncbn0gZnJvbSAnLi4vc2hhcmVkL2ltcG9ydC51dGlscyc7XG5cbnR5cGUgU2VsZWN0TW9kZSA9ICdpbXBvcnQnIHwgJ2V4cG9ydCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28taW1wb3J0LWV4cG9ydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbXBvcnQtZXhwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE5nRm9yLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBTcGlubmVyQ29tcG9uZW50LFxuICAgIEN1c3RvbUh0bWxDb21wb25lbnQsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgS2V5VmFsdWVQaXBlLFxuICAgIElnb0xhbmd1YWdlTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW0NvbmZpcm1EaWFsb2dTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBJbXBvcnRFeHBvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBwdWJsaWMgaW1wb3J0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHVibGljIGZvcm1hdHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFeHBvcnRGb3JtYXRbXT4odW5kZWZpbmVkKTtcbiAgcHVibGljIGV4cG9ydGFibGVMYXllcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYXllcltdPihbXSk7XG4gIHB1YmxpYyBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwdWJsaWMgZm9yY2VOYW1pbmcgPSBmYWxzZTtcbiAgcHVibGljIGNvbnRyb2xGb3JtYXQgPSAnZm9ybWF0JztcblxuICBjc3ZTZXBhcmF0b3JzID0gQ3N2U2VwYXJhdG9yO1xuICBpc0NzdkV4cG9ydCA9IGlzQ3N2RXhwb3J0O1xuXG4gIHByaXZhdGUgbGF5ZXJzJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBleHBvcnRhYmxlTGF5ZXJzJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtYXRzJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtTGF5ZXIkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGV4cG9ydE9wdGlvbnMkJDogU3Vic2NyaXB0aW9uO1xuXG4gIHB1YmxpYyBpbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnM6IHN0cmluZztcbiAgcHVibGljIGV4cG9ydEh0bWxDbGFyaWZpY2F0aW9uczogc3RyaW5nO1xuXG4gIHByaXZhdGUgZXNwZ0NvZGVSZWdleCA9IG5ldyBSZWdFeHAoJ15cXFxcZHs0LDZ9Jyk7XG4gIHByaXZhdGUgY2xpZW50U2lkZUZpbGVTaXplTWF4OiBudW1iZXI7XG4gIHB1YmxpYyBmaWxlU2l6ZU1iOiBudW1iZXI7XG5cbiAgcHVibGljIHByb2plY3Rpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SW5wdXRQcm9qZWN0aW9uc1tdPihbXSk7XG4gIHByaXZhdGUgcHJvamVjdGlvbnNDb25zdHJhaW50czogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnM7XG5cbiAgcHVibGljIHBvcHVwQ2hlY2tlZCA9IGZhbHNlO1xuICBwcml2YXRlIGNvbmZpZ0Zvcm1hdHM6IEFueUV4cG9ydEZvcm1hdFtdO1xuXG4gIHByaXZhdGUgcHJldmlvdXNMYXllclNwZWNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgICBvcGFjaXR5OiBudW1iZXI7XG4gICAgICBxdWVyeWFibGU6IGJvb2xlYW47XG4gICAgfVtdXG4gID4odW5kZWZpbmVkKTtcblxuICBASW5wdXQoKSBzZWxlY3RGaXJzdFByb2ogPSBmYWxzZTtcblxuICBASW5wdXQoKSBtYXA6IElnb01hcDtcblxuICBASW5wdXQoKSBjb250ZXh0VXJpOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfcHJvamVjdGlvbnNMaW1pdGF0aW9uczogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMgPSB7fTtcbiAgQElucHV0KClcbiAgc2V0IHByb2plY3Rpb25zTGltaXRhdGlvbnModmFsdWU6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zKSB7XG4gICAgdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMuY29tcHV0ZVByb2plY3Rpb25zKCk7XG4gIH1cbiAgZ2V0IHByb2plY3Rpb25zTGltaXRhdGlvbnMoKTogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0aW9uc0xpbWl0YXRpb25zIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIHRoYXQgaG9sZHMgdGhlIGF2YWlsYWJsZSB3b3Jrc3BhY2VzLlxuICAgKi9cbiAgQElucHV0KCkgc3RvcmU6IFdvcmtzcGFjZVN0b3JlO1xuXG4gIEBJbnB1dCgpIHNlbGVjdGVkTW9kZTogU2VsZWN0TW9kZSA9ICdpbXBvcnQnO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3RNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RNb2RlPigpO1xuXG4gIEBJbnB1dCgpIGV4cG9ydE9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFeHBvcnRPcHRpb25zPih1bmRlZmluZWQpO1xuXG4gIEBPdXRwdXQoKSBleHBvcnRPcHRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxFeHBvcnRPcHRpb25zPigpO1xuXG4gIGdldCBsYXllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2xheWVycycpLnZhbHVlO1xuICB9XG4gIHNldCBsYXllcnModmFsdWUpIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxheWVyczogdmFsdWUgfSk7XG4gIH1cblxuICBnZXQgaW5wdXRQcm9qKCkge1xuICAgIHJldHVybiB0aGlzLmltcG9ydEZvcm0uZ2V0KCdpbnB1dFByb2onKS52YWx1ZTtcbiAgfVxuICBzZXQgaW5wdXRQcm9qKHZhbHVlKSB7XG4gICAgdGhpcy5pbXBvcnRGb3JtLnBhdGNoVmFsdWUoeyBpbnB1dFByb2o6IHZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0IHBvcHVwQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCdpbXBvcnRFeHBvcnRQb3B1cEFsbG93ZWQnKSBhcyBib29sZWFuKSB8fCBmYWxzZVxuICAgICk7XG4gIH1cblxuICBzZXQgcG9wdXBBbGxvd2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2ltcG9ydEV4cG9ydFBvcHVwQWxsb3dlZCcsIHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW1wb3J0U2VydmljZTogSW1wb3J0U2VydmljZSxcbiAgICBwcml2YXRlIGV4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHN0eWxlTGlzdFNlcnZpY2U6IFN0eWxlTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdHlsZVNlcnZpY2U6IFN0eWxlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb3dubG9hZFNlcnZpY2U6IERvd25sb2FkU2VydmljZSxcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlybURpYWxvZ1NlcnZpY2U6IENvbmZpcm1EaWFsb2dTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMubG9hZENvbmZpZygpO1xuICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgdGhpcy5jb21wdXRlUHJvamVjdGlvbnMoKTtcbiAgICB0aGlzLmltcG9ydEh0bWxDbGFyaWZpY2F0aW9ucyA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMnXG4gICAgKTtcbiAgICB0aGlzLmV4cG9ydEh0bWxDbGFyaWZpY2F0aW9ucyA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMnXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubGF5ZXJzJCQgPSB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIuYWxsJC5zdWJzY3JpYmUoKGxheWVycykgPT4ge1xuICAgICAgY29uc3QgZXhwb3J0YWJsZUxheWVycyA9IGxheWVycy5maWx0ZXIoKGxheWVyKSA9PiB7XG4gICAgICAgIGlmIChpc0xheWVyR3JvdXAobGF5ZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKGxheWVyIGluc3RhbmNlb2YgVmVjdG9yTGF5ZXIgJiYgbGF5ZXIuZXhwb3J0YWJsZSA9PT0gdHJ1ZSkgfHxcbiAgICAgICAgICAobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkICYmXG4gICAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQudXJsKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmV4cG9ydGFibGVMYXllcnMkLm5leHQoZXhwb3J0YWJsZUxheWVycyBhcyBMYXllcltdKTtcbiAgICB9KTtcbiAgICBjb25zdCBjb25maWdGaWxlU2l6ZU1iID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKFxuICAgICAgJ2ltcG9ydEV4cG9ydC5jbGllbnRTaWRlRmlsZVNpemVNYXhNYidcbiAgICApO1xuICAgIHRoaXMuY2xpZW50U2lkZUZpbGVTaXplTWF4ID1cbiAgICAgIChjb25maWdGaWxlU2l6ZU1iID8gY29uZmlnRmlsZVNpemVNYiA6IDMwKSAqIE1hdGgucG93KDEwMjQsIDIpO1xuICAgIHRoaXMuZmlsZVNpemVNYiA9IHRoaXMuY2xpZW50U2lkZUZpbGVTaXplTWF4IC8gTWF0aC5wb3coMTAyNCwgMik7XG5cbiAgICB0aGlzLmV4cG9ydE9wdGlvbnMkJCA9IHRoaXMuZXhwb3J0T3B0aW9ucyRcbiAgICAgIC5waXBlKHNraXBXaGlsZSgoZXhwb3J0T3B0aW9ucykgPT4gIWV4cG9ydE9wdGlvbnMpKVxuICAgICAgLnN1YnNjcmliZSgoZXhwb3J0T3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShleHBvcnRPcHRpb25zLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKGV4cG9ydE9wdGlvbnMubGF5ZXJzKSB7XG4gICAgICAgICAgdGhpcy5jb21wdXRlRm9ybWF0cyhcbiAgICAgICAgICAgIGV4cG9ydE9wdGlvbnMubGF5ZXJzLm1hcCgobCkgPT4gdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLmdldEJ5SWQobCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5mb3JtTGF5ZXIkJCA9IHRoaXMuZm9ybVxuICAgICAgLmdldCgnZm9ybWF0JylcbiAgICAgIC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChmb3JtYXQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLnBvcHVwQ2hlY2tlZCAmJlxuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xheWVycycpLnZhbHVlPy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgdGhpcy5pc09ncmVPckxpbmsoZm9ybWF0KVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlUG9wdXAodHJ1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiB1bmRlZmluZWQgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmZvcm1MYXllciQkID0gdGhpcy5mb3JtXG4gICAgICAuZ2V0KCdsYXllcnMnKVxuICAgICAgLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGxheWVyc0lkKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUHJldmlvdXNMYXllclNwZWNzKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGF5ZXJzID1cbiAgICAgICAgICBsYXllcnNJZCBpbnN0YW5jZW9mIEFycmF5ID8gbGF5ZXJzSWQgOiBbbGF5ZXJzSWRdO1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxheWVyczogc2VsZWN0ZWRMYXllcnMgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICBjb25zdCBsYXllcnMgPSBzZWxlY3RlZExheWVycy5tYXAoKGwpID0+XG4gICAgICAgICAgdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLmdldEJ5SWQobClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb21wdXRlRm9ybWF0cyhsYXllcnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmZvcm1hdHMkLnZhbHVlLmluZGV4T2YodGhpcy5mb3JtLnZhbHVlLmZvcm1hdCkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBmb3JtYXQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTcGVjczoge1xuICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgdmlzaWJsZTogYm9vbGVhbjtcbiAgICAgICAgICBvcGFjaXR5OiBudW1iZXI7XG4gICAgICAgICAgcXVlcnlhYmxlOiBib29sZWFuO1xuICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllciAmJlxuICAgICAgICAgICAgbGF5ZXIuZGF0YVNvdXJjZS5vbC5nZXRGZWF0dXJlcygpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJldmlvdXNTcGVjcy5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IGxheWVyLmlkLFxuICAgICAgICAgICAgICB2aXNpYmxlOiBsYXllci52aXNpYmxlLFxuICAgICAgICAgICAgICBvcGFjaXR5OiBsYXllci5vcGFjaXR5LFxuICAgICAgICAgICAgICBxdWVyeWFibGU6IChsYXllciBhcyBhbnkpLnF1ZXJ5YWJsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsYXllci5vcGFjaXR5ID0gMDtcbiAgICAgICAgICAgIGxheWVyLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcmV2aW91c0xheWVyU3BlY3MkLm5leHQocHJldmlvdXNTcGVjcyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZm9ybWF0cyQkID0gdGhpcy5mb3JtYXRzJFxuICAgICAgLnBpcGUoc2tpcFdoaWxlKChmb3JtYXRzKSA9PiAhZm9ybWF0cykpXG4gICAgICAuc3Vic2NyaWJlKChmb3JtYXRzKSA9PiB7XG4gICAgICAgIGlmIChmb3JtYXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiBmb3JtYXRzWzBdIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuZXhwb3J0YWJsZUxheWVycyQkID0gdGhpcy5leHBvcnRhYmxlTGF5ZXJzJFxuICAgICAgLnBpcGUoc2tpcFdoaWxlKChsYXllcnMpID0+ICFsYXllcnMpKVxuICAgICAgLnN1YnNjcmliZSgobGF5ZXJzKSA9PiB7XG4gICAgICAgIGlmIChsYXllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBsYXllcnM6IGxheWVyc1swXS5pZCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RGaXJzdFByb2opIHtcbiAgICAgIGlmICh0aGlzLnByb2plY3Rpb25zJC52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5pbXBvcnRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGlucHV0UHJvajoge1xuICAgICAgICAgICAgdHJhbnNsYXRlS2V5OiAnbmFkODMnLFxuICAgICAgICAgICAgYWxpYXM6ICdOQUQ4MycsXG4gICAgICAgICAgICBjb2RlOiAnRVBTRzo0MzI2JyxcbiAgICAgICAgICAgIHpvbmU6ICcnXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW1wb3J0Rm9ybS5wYXRjaFZhbHVlKHsgaW5wdXRQcm9qOiB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVswXSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbXBvcnRGb3JtLnBhdGNoVmFsdWUoeyBpbnB1dFByb2o6IHVuZGVmaW5lZCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVQcm9qZWN0aW9ucygpIHtcbiAgICB0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMgPSBjb21wdXRlUHJvamVjdGlvbnNDb25zdHJhaW50cyhcbiAgICAgIHRoaXMucHJvamVjdGlvbnNMaW1pdGF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgcHJvamVjdGlvbnM6IElucHV0UHJvamVjdGlvbnNbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5uYWQ4Mykge1xuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ25hZDgzJyxcbiAgICAgICAgYWxpYXM6ICdOQUQ4MycsXG4gICAgICAgIGNvZGU6ICdFUFNHOjQyNjknLFxuICAgICAgICB6b25lOiAnJyxcbiAgICAgICAgZXh0ZW50OiB1bmRlZmluZWQsXG4gICAgICAgIGRlZjogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy53Z3M4NCkge1xuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3dnczg0JyxcbiAgICAgICAgYWxpYXM6ICdXR1M4NCcsXG4gICAgICAgIGNvZGU6ICdFUFNHOjQzMjYnLFxuICAgICAgICB6b25lOiAnJyxcbiAgICAgICAgZXh0ZW50OiB1bmRlZmluZWQsXG4gICAgICAgIGRlZjogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy53ZWJNZXJjYXRvcikge1xuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3dlYk1lcmNhdG9yJyxcbiAgICAgICAgYWxpYXM6ICdXZWIgTWVyY2F0b3InLFxuICAgICAgICBjb2RlOiAnRVBTRzozODU3JyxcbiAgICAgICAgem9uZTogJycsXG4gICAgICAgIGV4dGVudDogdW5kZWZpbmVkLFxuICAgICAgICBkZWY6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5tdG0pIHtcbiAgICAgIC8vIGFsbCBtdG0gem9uZXNcbiAgICAgIGNvbnN0IG1pblpvbmUgPSB0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubXRtWm9uZS5taW5ab25lO1xuICAgICAgY29uc3QgbWF4Wm9uZSA9IHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5tdG1ab25lLm1heFpvbmU7XG5cbiAgICAgIGZvciAobGV0IG10bVpvbmUgPSBtaW5ab25lOyBtdG1ab25lIDw9IG1heFpvbmU7IG10bVpvbmUrKykge1xuICAgICAgICBjb25zdCBjb2RlID1cbiAgICAgICAgICBtdG1ab25lIDwgMTAgPyBgRVBTRzozMjE4JHttdG1ab25lfWAgOiBgRVBTRzozMjEkezgwICsgbXRtWm9uZX1gO1xuICAgICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0cmFuc2xhdGVLZXk6ICdtdG0nLFxuICAgICAgICAgIGFsaWFzOiBgTVRNICR7bXRtWm9uZX1gLFxuICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgem9uZTogYCR7bXRtWm9uZX1gLFxuICAgICAgICAgIGV4dGVudDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRlZjogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMudXRtKSB7XG4gICAgICAvLyBhbGwgdXRtIHpvbmVzXG4gICAgICBjb25zdCBtaW5ab25lID0gdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bVpvbmUubWluWm9uZTtcbiAgICAgIGNvbnN0IG1heFpvbmUgPSB0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMudXRtWm9uZS5tYXhab25lO1xuXG4gICAgICBmb3IgKGxldCB1dG1ab25lID0gbWluWm9uZTsgdXRtWm9uZSA8PSBtYXhab25lOyB1dG1ab25lKyspIHtcbiAgICAgICAgY29uc3QgY29kZSA9XG4gICAgICAgICAgdXRtWm9uZSA8IDEwID8gYEVQU0c6MzI2MCR7dXRtWm9uZX1gIDogYEVQU0c6MzI2JHt1dG1ab25lfWA7XG4gICAgICAgIHByb2plY3Rpb25zLnB1c2goe1xuICAgICAgICAgIHRyYW5zbGF0ZUtleTogJ3V0bScsXG4gICAgICAgICAgYWxpYXM6IGBVVE0gJHt1dG1ab25lfWAsXG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICB6b25lOiBgJHt1dG1ab25lfWAsXG4gICAgICAgICAgZXh0ZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgZGVmOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbmZpZ1Byb2plY3Rpb246IElucHV0UHJvamVjdGlvbnNbXSA9IFtdO1xuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMucHJvakZyb21Db25maWcpIHtcbiAgICAgIGNvbmZpZ1Byb2plY3Rpb24gPSAodGhpcy5jb25maWcuZ2V0Q29uZmlnKCdwcm9qZWN0aW9ucycpIHx8XG4gICAgICAgIFtdKSBhcyBJbnB1dFByb2plY3Rpb25zW107XG4gICAgfVxuXG4gICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChjb25maWdQcm9qZWN0aW9uLmNvbmNhdChwcm9qZWN0aW9ucykpO1xuICB9XG5cbiAgcHVibGljIGdldExheWVyVGl0bGVCeUlkKGlkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLmdldEJ5SWQoaWQpPy50aXRsZTtcbiAgfVxuXG4gIGxheWVySGFzU2VsZWN0ZWRGZWF0dXJlcyhsYXllcjogTGF5ZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB3a3NGcm9tTGF5ZXIgPSB0aGlzLmV4cG9ydFNlcnZpY2UuZ2V0V29ya3NwYWNlQnlMYXllcklkKFxuICAgICAgbGF5ZXIuaWQsXG4gICAgICB0aGlzLnN0b3JlXG4gICAgKTtcbiAgICBpZiAod2tzRnJvbUxheWVyKSB7XG4gICAgICBjb25zdCByZWNzID0gd2tzRnJvbUxheWVyLmVudGl0eVN0b3JlLnN0YXRlVmlldy5maXJzdEJ5KFxuICAgICAgICAocmVjb3JkOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZT4pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlY3MgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9ubHlTZWxlY3RlZChldmVudDogTWF0U2xpZGVUb2dnbGVDaGFuZ2UsIGlkOiBzdHJpbmcpIHtcbiAgICBsZXQgbGF5ZXJzV2l0aFNlbGVjdGlvbiA9IHRoaXMuZm9ybS52YWx1ZS5sYXllcnNXaXRoU2VsZWN0aW9uO1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICBsYXllcnNXaXRoU2VsZWN0aW9uLnB1c2goaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXllcnNXaXRoU2VsZWN0aW9uID0gbGF5ZXJzV2l0aFNlbGVjdGlvbi5maWx0ZXIoXG4gICAgICAgIChsYXllcklkKSA9PiBsYXllcklkICE9PSBpZFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBsYXllcnNXaXRoU2VsZWN0aW9uIH0pO1xuICB9XG5cbiAgcHVibGljIG9ubHlTZWxlY3RlZENsaWNrKGV2ZW50LCBpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5sYXllcnMuZmluZCgobGF5ZXJJZCkgPT4gbGF5ZXJJZCA9PT0gaWQpKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5MYXllcnNJZFRvRXhwb3J0U2VsZWN0aW9uT25seShsYXllcjogTGF5ZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLnZhbHVlLmxheWVyc1dpdGhTZWxlY3Rpb24uZmluZChcbiAgICAgIChsYXllcklkKSA9PiBsYXllcklkID09PSBsYXllci5pZFxuICAgIClcbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubGF5ZXJzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmV4cG9ydGFibGVMYXllcnMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybWF0cyQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtTGF5ZXIkJC51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLmV4cG9ydE9wdGlvbnMkJCkge1xuICAgICAgdGhpcy5leHBvcnRPcHRpb25zJCQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5leHBvcnRPcHRpb25zQ2hhbmdlLmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcbiAgICB0aGlzLmhhbmRsZVByZXZpb3VzTGF5ZXJTcGVjcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQcmV2aW91c0xheWVyU3BlY3MoKSB7XG4gICAgY29uc3QgcHJldmlvdXNTcGVjcyA9IHRoaXMucHJldmlvdXNMYXllclNwZWNzJC52YWx1ZTtcbiAgICBpZiAocHJldmlvdXNTcGVjcyAmJiBwcmV2aW91c1NwZWNzLmxlbmd0aCkge1xuICAgICAgcHJldmlvdXNTcGVjcy5mb3JFYWNoKChzcGVjcykgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0xheWVyID0gdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLmdldEJ5SWQoc3BlY3MuaWQpO1xuICAgICAgICBwcmV2aW91c0xheWVyLnZpc2libGUgPSBzcGVjcy52aXNpYmxlO1xuICAgICAgICBwcmV2aW91c0xheWVyLm9wYWNpdHkgPSBzcGVjcy5vcGFjaXR5O1xuICAgICAgICAocHJldmlvdXNMYXllciBhcyBhbnkpLnF1ZXJ5YWJsZSA9IHNwZWNzLnF1ZXJ5YWJsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnByZXZpb3VzTGF5ZXJTcGVjcyQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgaW1wb3J0RmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGxldCBpbnB1dFByb2ogPSB0aGlzLmlucHV0UHJvai5jb2RlO1xuICAgIGlmICh0aGlzLmVzcGdDb2RlUmVnZXgudGVzdChpbnB1dFByb2opKSB7XG4gICAgICBpbnB1dFByb2ogPSBgRVBTRzoke2lucHV0UHJvan1gO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRoaXMuaW1wb3J0U2VydmljZS5pbXBvcnQoZmlsZSwgaW5wdXRQcm9qKS5zdWJzY3JpYmUoXG4gICAgICAgIChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB0aGlzLm9uRmlsZUltcG9ydFN1Y2Nlc3MoZmlsZSwgZmVhdHVyZXMpLFxuICAgICAgICAoZXJyb3I6IEVycm9yKSA9PiB0aGlzLm9uRmlsZUltcG9ydEVycm9yKGZpbGUsIGVycm9yKSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9wdXAocHJlQ2hlY2sgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcDEgPSB3aW5kb3cub3BlbignJywgJ3BvcHVwJywgJ3dpZHRoPTEsIGhlaWdodD0xJyk7XG4gICAgcDEuY2xvc2UoKTtcbiAgICBjb25zdCBwMiA9IHdpbmRvdy5vcGVuKCcnLCAncG9wdXAnLCAnd2lkdGg9MSwgaGVpZ2h0PTEnKTtcbiAgICBpZiAoIXAyIHx8IHAyLmNsb3NlZCB8fCB0eXBlb2YgcDIuY2xvc2VkID09PSAndW5kZWZpbmVkJyB8fCBwMiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5vblBvcHVwQmxvY2tlZEVycm9yKHByZUNoZWNrKTtcbiAgICAgIHRoaXMucG9wdXBBbGxvd2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAyLmNsb3NlKCk7XG4gICAgICB0aGlzLnBvcHVwQWxsb3dlZCA9IHRydWU7XG4gICAgICB0aGlzLnBvcHVwQ2hlY2tlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvcHVwQWxsb3dlZDtcbiAgfVxuXG4gIHByaXZhdGUgaXNPZ3JlT3JMaW5rKGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9ncmVGb3JtYXRzID0gT2JqZWN0LmtleXMoRXhwb3J0U2VydmljZS5vZ3JlRm9ybWF0cyk7XG4gICAgcmV0dXJuIG9ncmVGb3JtYXRzLmluZGV4T2YoZm9ybWF0KSA+PSAwIHx8IGZvcm1hdCA9PT0gJ1VSTCc7XG4gIH1cblxuICBhc3luYyBoYW5kbGVFeHBvcnRGb3JtU3VibWl0KGRhdGE6IEV4cG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5wb3B1cENoZWNrZWQgJiZcbiAgICAgIGRhdGEubGF5ZXJzLmxlbmd0aCA+IDEgJiZcbiAgICAgIHRoaXMuaXNPZ3JlT3JMaW5rKGRhdGEuZm9ybWF0KSAmJlxuICAgICAgIXRoaXMucG9wdXBBbGxvd2VkXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZVBvcHVwKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDU1YgPSBpc0NzdkV4cG9ydChkYXRhLmZvcm1hdCk7XG5cbiAgICBpZiAoZGF0YS5mb3JtYXQgPT09ICdFeGNlbCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnRFeGNlbCh0aGlzLm1hcCwgdGhpcy5zdG9yZSwgZGF0YSk7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9uRmlsZUV4cG9ydFN1Y2Nlc3MoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMub25GaWxlRXhwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZmlsZU5hbWUgPSAnJztcblxuICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiBkYXRhLmxheWVycykge1xuICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIuZ2V0QnlJZChsYXllcklkKTtcbiAgICAgIGlmIChpc0xheWVyR3JvdXAobGF5ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZ2V0RmVhdHVyZXModGhpcy5tYXAsIGxheWVyLCBkYXRhLCB0aGlzLnN0b3JlKVxuICAgICAgKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5vbkZpbGVFeHBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBnZW9tVHlwZXMgPSB0aGlzLmV4cG9ydFNlcnZpY2UuZ2V0R2VvbVR5cGVzKGZlYXR1cmVzLCBkYXRhLmZvcm1hdCk7XG4gICAgICBpZiAoIWlzQ1NWIHx8ICFkYXRhLmNvbWJpbmVMYXllcnMgfHwgZGF0YS5sYXllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbGVOYW1lID0gbGF5ZXIudGl0bGU7XG4gICAgICAgIGlmIChkYXRhLm5hbWUpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZU5hbWUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5leHBvcnQuY29tYmluZWRMYXllcnMnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmZvcm1hdCA9PT0gJ1VSTCcgJiYgaXNMYXllckl0ZW0obGF5ZXIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlVXJsRXhwb3J0KGxheWVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuZm9ybWF0ID09PSAnR1BYJykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlR3B4RXhwb3J0KGdlb21UeXBlcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZW9tVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgJ2lnby5nZW8uZXhwb3J0Lm5vdGhpbmcudGV4dCcsXG4gICAgICAgICAgJ2lnby5nZW8uZXhwb3J0Lm5vdGhpbmcudGl0bGUnLFxuICAgICAgICAgIHsgdGltZU91dDogMjAwMDAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQ1NWIHx8ICFkYXRhLmNvbWJpbmVMYXllcnMpIHtcbiAgICAgICAgZ2VvbVR5cGVzLmZvckVhY2goKGdlb21UeXBlKSA9PiB7XG4gICAgICAgICAgaWYgKGdlb21UeXBlLnR5cGUpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lICs9IGdlb21UeXBlLnR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaGFuZGxlRXhwb3J0KGdlb21UeXBlLmZlYXR1cmVzLCBkYXRhLCBmaWxlTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDU1YpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3N2RXhwb3J0KGRhdGEsIGZpbGVOYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVVybEV4cG9ydChsYXllcjogTGF5ZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvd25sb2FkID0gbnVsbCB9OiBEYXRhU291cmNlT3B0aW9ucyA9IGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucztcbiAgICBpZiAoZG93bmxvYWQ/LnVybCB8fCBkb3dubG9hZD8uZHluYW1pY1VybCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGRvd25sb2FkLnVybCA/PyBkb3dubG9hZC5keW5hbWljVXJsO1xuICAgICAgICB1cmwubWF0Y2goL3NlcnZpY2U9d2ZzL2dpKVxuICAgICAgICAgID8gdGhpcy5kb3dubG9hZFNlcnZpY2Uub3BlbihsYXllcilcbiAgICAgICAgICA6IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfSwgNTAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlR3B4RXhwb3J0KGdlb21UeXBlczogR2VvbWV0cnlDb2xsZWN0aW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCBncHhGZWF0dXJlQ250ID0gZ2VvbVR5cGVzLmxlbmd0aDtcbiAgICBnZW9tVHlwZXMgPSBnZW9tVHlwZXMuZmlsdGVyKChnZW9tVHlwZSkgPT5cbiAgICAgIFsnTGluZVN0cmluZycsICdQb2ludCddLmluY2x1ZGVzKGdlb21UeXBlLnR5cGUpXG4gICAgKTtcbiAgICBjb25zdCBncHhGZWF0dXJlQ250UG9pbnRPclBvbHkgPSBnZW9tVHlwZXMubGVuZ3RoO1xuICAgIGlmIChncHhGZWF0dXJlQ250ID4gZ3B4RmVhdHVyZUNudFBvaW50T3JQb2x5KSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAnaWdvLmdlby5leHBvcnQuZ3B4LmVycm9yLnBvbHkudGV4dCcsXG4gICAgICAgICdpZ28uZ2VvLmV4cG9ydC5ncHguZXJyb3IucG9seS50aXRsZScsXG4gICAgICAgIHsgdGltZU91dDogMjAwMDAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNzdkV4cG9ydChkYXRhOiBFeHBvcnRPcHRpb25zLCBmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmVhdHVyZXNDU1YgPSBbXTtcblxuICAgIGlmIChkYXRhLmNvbWJpbmVMYXllcnMpIHtcbiAgICAgIGxldCBwcmV2aW91c0ZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBnZW9tVHlwZXMgPSBhd2FpdCB0aGlzLmdldEFsbExheWVyR2VvbVR5cGVzKGRhdGEpO1xuICAgICAgZ2VvbVR5cGVzLmZvckVhY2goKGdlb21UeXBlKSA9PiB7XG4gICAgICAgIGdlb21UeXBlLmZlYXR1cmVzLmZvckVhY2goKGN1cnJlbnRGZWF0dXJlKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEuc2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNGZWF0dXJlKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjdXJyZW50RmVhdHVyZS5nZXQoJ19mZWF0dXJlU3RvcmUnKS5sYXllci5vcHRpb25zLnRpdGxlICE9PVxuICAgICAgICAgICAgICAgIHByZXZpb3VzRmVhdHVyZS5nZXQoJ19mZWF0dXJlU3RvcmUnKS5sYXllci5vcHRpb25zLnRpdGxlXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRW1wdHlSb3dzID0gdGhpcy5jcmVhdGVUaXRsZUVtcHR5Um93cyhcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRGZWF0dXJlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlc0NTVi5wdXNoKHRpdGxlRW1wdHlSb3dzWzJdKTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlc0NTVi5wdXNoKHRpdGxlRW1wdHlSb3dzWzBdKTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlc0NTVi5wdXNoKHRpdGxlRW1wdHlSb3dzWzFdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdGl0bGVFbXB0eVJvd3MgPSB0aGlzLmNyZWF0ZVRpdGxlRW1wdHlSb3dzKFxuICAgICAgICAgICAgICAgIGN1cnJlbnRGZWF0dXJlLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRGZWF0dXJlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZlYXR1cmVzQ1NWLnB1c2godGl0bGVFbXB0eVJvd3NbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmZWF0dXJlc0NTVi5wdXNoKGN1cnJlbnRGZWF0dXJlKTtcbiAgICAgICAgICBwcmV2aW91c0ZlYXR1cmUgPSBjdXJyZW50RmVhdHVyZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUV4cG9ydChmZWF0dXJlc0NTViwgZGF0YSwgZmlsZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHBvcnQoXG4gICAgZmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdLFxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnMsXG4gICAgZmlsZU5hbWU6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2VcbiAgICAgIC5leHBvcnQoZmVhdHVyZXMsIG9wdGlvbnMsIGZpbGVOYW1lLCB0aGlzLm1hcC5wcm9qZWN0aW9uQ29kZSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdGhpcy5vbkZpbGVFeHBvcnRFcnJvcihlcnJvciksXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkZpbGVFeHBvcnRTdWNjZXNzKCk7XG5cbiAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNpcmNsZVRvUG9pbnQoZmVhdHVyZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxsTGF5ZXJHZW9tVHlwZXMoXG4gICAgZGF0YTogRXhwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPEdlb21ldHJ5Q29sbGVjdGlvbltdPiB7XG4gICAgcmV0dXJuIGRhdGEubGF5ZXJzLnJlZHVjZShhc3luYyAodHlwZXNQcm9taXNlLCBsYXllcklkKSA9PiB7XG4gICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHR5cGVzUHJvbWlzZTtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLmdldEJ5SWQobGF5ZXJJZCk7XG4gICAgICBpZiAoaXNMYXllckdyb3VwKGxheWVyKSkge1xuICAgICAgICByZXR1cm4gdHlwZXNQcm9taXNlO1xuICAgICAgfVxuICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZ2V0RmVhdHVyZXModGhpcy5tYXAsIGxheWVyLCBkYXRhLCB0aGlzLnN0b3JlKVxuICAgICAgKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5vbkZpbGVFeHBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBnZW9tVHlwZXMgPSB0aGlzLmV4cG9ydFNlcnZpY2UuZ2V0R2VvbVR5cGVzKGZlYXR1cmVzLCBkYXRhLmZvcm1hdCk7XG4gICAgICByZXR1cm4gdHlwZXMuY29uY2F0KGdlb21UeXBlcyk7XG4gICAgfSwgUHJvbWlzZS5yZXNvbHZlKFtdKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRpdGxlRW1wdHlSb3dzKHByZXZpb3VzRmVhdHVyZSwgY3VycmVudEZlYXR1cmUpIHtcbiAgICBjb25zdCB0aXRsZVJvdyA9IGN1cnJlbnRGZWF0dXJlLmNsb25lKCk7XG4gICAgY29uc3QgaGVhZGVyUm93ID0gY3VycmVudEZlYXR1cmUuY2xvbmUoKTtcbiAgICBjb25zdCBlbXB0eVJvdyA9IGN1cnJlbnRGZWF0dXJlLmNsb25lKCk7XG4gICAgY29uc3QgcHJldmlvdXNGZWF0dXJlS2V5czogc3RyaW5nW10gPSBwcmV2aW91c0ZlYXR1cmUuZ2V0S2V5cygpO1xuICAgIGxldCBmaXJzdEtleVByZXZpb3VzID0gJyc7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldmlvdXNGZWF0dXJlS2V5cykge1xuICAgICAgaWYgKHByZXZpb3VzRmVhdHVyZUtleXNba2V5XSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICBmaXJzdEtleVByZXZpb3VzID0gcHJldmlvdXNGZWF0dXJlS2V5c1trZXldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RmVhdHVyZUtleXM6IHN0cmluZ1tdID0gY3VycmVudEZlYXR1cmUuZ2V0S2V5cygpO1xuICAgIGxldCBmaXJzdEtleUN1cnJlbnQgPSAnJztcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50RmVhdHVyZUtleXMpIHtcbiAgICAgIGlmIChjdXJyZW50RmVhdHVyZUtleXNba2V5XSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICBmaXJzdEtleUN1cnJlbnQgPSBjdXJyZW50RmVhdHVyZUtleXNba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFsbEtleXM6IHN0cmluZ1tdID0gY3VycmVudEZlYXR1cmUuZ2V0S2V5cygpO1xuICAgIHByZXZpb3VzRmVhdHVyZUtleXMuZm9yRWFjaCgocHJldmlvdXNLZXkpID0+IHtcbiAgICAgIGlmIChhbGxLZXlzLmluY2x1ZGVzKHByZXZpb3VzS2V5KSAmJiBwcmV2aW91c0tleSAhPT0gZmlyc3RLZXlQcmV2aW91cykge1xuICAgICAgICBhbGxLZXlzLnB1c2gocHJldmlvdXNLZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGFsbEtleXMudW5zaGlmdChmaXJzdEtleVByZXZpb3VzKTtcblxuICAgIGxldCBmaXJzdEtleUFsbCA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGFsbEtleXMpIHtcbiAgICAgIGlmIChhbGxLZXlzW2tleV0gIT09ICdnZW9tZXRyeScpIHtcbiAgICAgICAgZmlyc3RLZXlBbGwgPSBhbGxLZXlzW2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBhbGxLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3Qgc2FtZUtleXM6IGJvb2xlYW4gPVxuICAgICAgICBwcmV2aW91c0ZlYXR1cmVLZXlzLmxlbmd0aCA9PT0gY3VycmVudEZlYXR1cmVLZXlzLmxlbmd0aCAmJlxuICAgICAgICBwcmV2aW91c0ZlYXR1cmVLZXlzLmV2ZXJ5KFxuICAgICAgICAgICh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBjdXJyZW50RmVhdHVyZUtleXNbaW5kZXhdXG4gICAgICAgICk7XG4gICAgICBpZiAoa2V5ID09PSBmaXJzdEtleUFsbCAmJiAhc2FtZUtleXMpIHtcbiAgICAgICAgdGl0bGVSb3cuc2V0KFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjdXJyZW50RmVhdHVyZS5nZXQoJ19mZWF0dXJlU3RvcmUnKS5sYXllci5vcHRpb25zLnRpdGxlICtcbiAgICAgICAgICAgICcgPT09PT09PT09PT09PT09PicsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBoZWFkZXJSb3cuc2V0KGtleSwga2V5LCB0cnVlKTtcbiAgICAgICAgZW1wdHlSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBmaXJzdEtleUFsbCAmJiBzYW1lS2V5cykge1xuICAgICAgICB0aXRsZVJvdy5zZXQoXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGN1cnJlbnRGZWF0dXJlLmdldCgnX2ZlYXR1cmVTdG9yZScpLmxheWVyLm9wdGlvbnMudGl0bGUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBoZWFkZXJSb3cuc2V0KGtleSwga2V5LCB0cnVlKTtcbiAgICAgICAgZW1wdHlSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBmaXJzdEtleUN1cnJlbnQpIHtcbiAgICAgICAgdGl0bGVSb3cuc2V0KFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjdXJyZW50RmVhdHVyZS5nZXQoJ19mZWF0dXJlU3RvcmUnKS5sYXllci5vcHRpb25zLnRpdGxlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaGVhZGVyUm93LnNldChrZXksIGtleSwgdHJ1ZSk7XG4gICAgICAgIGVtcHR5Um93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICB0aXRsZVJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgICBoZWFkZXJSb3cuc2V0KGtleSwga2V5LCB0cnVlKTtcbiAgICAgICAgZW1wdHlSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpdGxlUm93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIGVtcHR5Um93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY3VycmVudEZlYXR1cmVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgaGVhZGVyUm93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdGl0bGVFbXB0eVJvd3MgPSBbdGl0bGVSb3csIGhlYWRlclJvdywgZW1wdHlSb3ddO1xuICAgIHJldHVybiB0aXRsZUVtcHR5Um93cztcbiAgfVxuXG4gIHByaXZhdGUgY2lyY2xlVG9Qb2ludChmZWF0dXJlOiBPbEZlYXR1cmUpIHtcbiAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IGZlYXR1cmUuZ2V0KCdyYWQnKTtcblxuICAgIGlmIChyYWRpdXMpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gbmV3IG9sUG9pbnQoW1xuICAgICAgICBmZWF0dXJlLmdldCgnbG9uZ2l0dWRlJyksXG4gICAgICAgIGZlYXR1cmUuZ2V0KCdsYXRpdHVkZScpXG4gICAgICBdKTtcbiAgICAgIHBvaW50LnRyYW5zZm9ybSgnRVBTRzo0MzI2JywgZmVhdHVyZS5nZXQoJ19wcm9qZWN0aW9uJykpO1xuICAgICAgZmVhdHVyZS5zZXRHZW9tZXRyeShwb2ludCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm0oKSB7XG4gICAgdGhpcy5pbXBvcnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBpbnB1dFByb2o6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZm9ybWF0OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBsYXllcnM6IFtbXSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGxheWVyc1dpdGhTZWxlY3Rpb246IFtbXV0sXG4gICAgICBjb21iaW5lTGF5ZXJzOiBbdHJ1ZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHNlcGFyYXRvcjogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZmVhdHVyZUluTWFwRXh0ZW50OiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmZvcmNlTmFtaW5nKSB7XG4gICAgICBmb3JtLmFkZENvbnRyb2woJ25hbWUnLCBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSkpO1xuICAgIH1cblxuICAgIGZvcm1cbiAgICAgIC5nZXQoJ2Zvcm1hdCcpXG4gICAgICAudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoZm9ybWF0OiBFeHBvcnRGb3JtYXQpID0+XG4gICAgICAgIHRoaXMuaGFuZGxlQ3N2Rm9ybShmb3JtLCBmb3JtYXQpXG4gICAgICApO1xuXG4gICAgdGhpcy5mb3JtID0gZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ3N2Rm9ybShmb3JtOiBGb3JtR3JvdXAsIGZvcm1hdDogRXhwb3J0Rm9ybWF0KTogdm9pZCB7XG4gICAgZm9ybWF0ID09PSAnQ1NWJ1xuICAgICAgPyBmb3JtLmFkZENvbnRyb2woXG4gICAgICAgICAgJ2NzdlNlcGFyYXRvcicsXG4gICAgICAgICAgbmV3IEZvcm1Db250cm9sKCdhdXRvJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICAgICAgICApXG4gICAgICA6IGZvcm0ucmVtb3ZlQ29udHJvbCgnY3N2U2VwYXJhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsZUltcG9ydFN1Y2Nlc3MoZmlsZTogRmlsZSwgZmVhdHVyZXM6IEZlYXR1cmVbXSkge1xuICAgIGNvbnN0IGltcG9ydEV4cG9ydE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoXG4gICAgICAnaW1wb3J0RXhwb3J0J1xuICAgICkgYXMgSW1wb3J0RXhwb3J0U2VydmljZU9wdGlvbnM7XG4gICAgY29uc3QgY29uZmlybURpYWxvZ1NlcnZpY2UgPSBpbXBvcnRFeHBvcnRPcHRpb25zPy5hbGxvd1RvU3RvcmVMYXllclxuICAgICAgPyB0aGlzLmNvbmZpcm1EaWFsb2dTZXJ2aWNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIWltcG9ydEV4cG9ydE9wdGlvbnM/LmltcG9ydFdpdGhTdHlsZSkge1xuICAgICAgaGFuZGxlRmlsZUltcG9ydFN1Y2Nlc3MoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGZlYXR1cmVzLFxuICAgICAgICB0aGlzLm1hcCxcbiAgICAgICAgdGhpcy5jb250ZXh0VXJpLFxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLFxuICAgICAgICB0aGlzLmxheWVyU2VydmljZSxcbiAgICAgICAgY29uZmlybURpYWxvZ1NlcnZpY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZUZpbGVJbXBvcnRTdWNjZXNzKFxuICAgICAgICBmaWxlLFxuICAgICAgICBmZWF0dXJlcyxcbiAgICAgICAgdGhpcy5tYXAsXG4gICAgICAgIHRoaXMuY29udGV4dFVyaSxcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZSxcbiAgICAgICAgdGhpcy5sYXllclNlcnZpY2UsXG4gICAgICAgIGNvbmZpcm1EaWFsb2dTZXJ2aWNlLFxuICAgICAgICB0aGlzLnN0eWxlTGlzdFNlcnZpY2UsXG4gICAgICAgIHRoaXMuc3R5bGVTZXJ2aWNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25GaWxlSW1wb3J0RXJyb3IoZmlsZTogRmlsZSwgZXJyb3I6IEVycm9yKSB7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICBoYW5kbGVGaWxlSW1wb3J0RXJyb3IoZmlsZSwgZXJyb3IsIHRoaXMubWVzc2FnZVNlcnZpY2UsIHRoaXMuZmlsZVNpemVNYik7XG4gIH1cblxuICBwcml2YXRlIG9uUG9wdXBCbG9ja2VkRXJyb3IocHJlQ2hlY2sgPSB0cnVlKSB7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICBjb25zdCBleHRyYU1lc3NhZ2UgPSBwcmVDaGVja1xuICAgICAgPyAnaWdvLmdlby5leHBvcnQucG9wdXBCbG9ja2VkLnNlbGVjdEFnYWluJ1xuICAgICAgOiAnaWdvLmdlby5leHBvcnQucG9wdXBCbG9ja2VkLnJldHJ5JztcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgJ2lnby5nZW8uZXhwb3J0LnBvcHVwQmxvY2tlZC50ZXh0JyxcbiAgICAgICdpZ28uZ2VvLmV4cG9ydC5wb3B1cEJsb2NrZWQudGl0bGUnLFxuICAgICAgeyB0aW1lT3V0OiAyMDAwMCB9LFxuICAgICAgeyBleHRyYU1lc3NhZ2UgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsZUV4cG9ydEVycm9yKGVycm9yOiBFcnJvcikge1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgaGFuZGxlRmlsZUV4cG9ydEVycm9yKGVycm9yLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbmZpZygpIHtcbiAgICBjb25zdCBmb3JjZU5hbWluZ0NvbmZpZyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnaW1wb3J0RXhwb3J0LmZvcmNlTmFtaW5nJyk7XG4gICAgdGhpcy5mb3JjZU5hbWluZyA9XG4gICAgICBmb3JjZU5hbWluZ0NvbmZpZyAhPT0gdW5kZWZpbmVkID8gZm9yY2VOYW1pbmdDb25maWcgOiBmYWxzZTtcblxuICAgIHRoaXMuY29uZmlnRm9ybWF0cyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnaW1wb3J0RXhwb3J0LmZvcm1hdHMnKTtcbiAgICB0aGlzLmNvbXB1dGVGb3JtYXRzKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVGb3JtYXRzKGxheWVycz86IEFueUxheWVyW10pIHtcbiAgICBsZXQgYXBwbGllZGZvcm1hdHM6IEV4cG9ydEZvcm1hdFtdID0gWy4uLkV4cG9ydEZvcm1hdF07XG4gICAgY29uc3QgZm9ybWF0c1R5cGUgPSB7XG4gICAgICBvbmx5VXJsOiBmYWxzZSxcbiAgICAgIG9ubHlWZWN0b3I6IGZhbHNlLFxuICAgICAgdmVjdG9yQW5kVXJsOiBmYWxzZSxcbiAgICAgIGN1c3RvbUxpc3Q6IGZhbHNlXG4gICAgfTtcbiAgICBjb25zdCBjdXN0b21MaXN0ID0gW107XG4gICAgaWYgKGxheWVycz8ubGVuZ3RoKSB7XG4gICAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgaWYgKCFsYXllciB8fCBpc0xheWVyR3JvdXAobGF5ZXIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQ/LmFsbG93ZWRGb3JtYXRzKSB7XG4gICAgICAgICAgZm9ybWF0c1R5cGUuY3VzdG9tTGlzdCA9IHRydWU7XG4gICAgICAgICAgY3VzdG9tTGlzdC5wdXNoKHtcbiAgICAgICAgICAgIGxheWVyOiBsYXllci50aXRsZSxcbiAgICAgICAgICAgIGZvcm1hdHM6IHRoaXMudmFsaWRhdGVMaXN0Rm9ybWF0KFxuICAgICAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQuYWxsb3dlZEZvcm1hdHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAhKGxheWVyIGluc3RhbmNlb2YgVmVjdG9yTGF5ZXIpICYmXG4gICAgICAgICAgbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkICYmXG4gICAgICAgICAgbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkLnVybFxuICAgICAgICApIHtcbiAgICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VXJsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQgJiZcbiAgICAgICAgICAobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkLnVybCB8fFxuICAgICAgICAgICAgbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkLmR5bmFtaWNVcmwpXG4gICAgICAgICkge1xuICAgICAgICAgIGZvcm1hdHNUeXBlLnZlY3RvckFuZFVybCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllcikge1xuICAgICAgICAgIGZvcm1hdHNUeXBlLm9ubHlWZWN0b3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGhhc1VybCA9IHRoaXMuZm9ybWF0cyQudmFsdWUuaW5jbHVkZXMoJ1VSTCcpO1xuXG4gICAgICBpZiAoZm9ybWF0c1R5cGUub25seVVybCA9PT0gdHJ1ZSAmJiBmb3JtYXRzVHlwZS5vbmx5VmVjdG9yID09PSBmYWxzZSkge1xuICAgICAgICBhcHBsaWVkZm9ybWF0cyA9IFsnVVJMJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VmVjdG9yID09PSB0cnVlICYmXG4gICAgICAgIGZvcm1hdHNUeXBlLm9ubHlVcmwgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb21wdXRlRm9ybWF0cygpOyAvLyByZXNldFxuICAgICAgICBpZiAoaGFzVXJsKSB7XG4gICAgICAgICAgYXBwbGllZGZvcm1hdHMgPSBbLi4udGhpcy5mb3JtYXRzJC52YWx1ZV0uZmlsdGVyKFxuICAgICAgICAgICAgKGtleSkgPT4ga2V5ICE9PSAnVVJMJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZvcm1hdHNUeXBlLnZlY3RvckFuZFVybCA9PT0gdHJ1ZSAmJlxuICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VXJsID09PSBmYWxzZSAmJlxuICAgICAgICBmb3JtYXRzVHlwZS5vbmx5VmVjdG9yID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29tcHV0ZUZvcm1hdHMoKTsgLy8gcmVzZXRcbiAgICAgICAgaWYgKCFoYXNVcmwpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gWy4uLnRoaXMuZm9ybWF0cyQudmFsdWVdO1xuICAgICAgICAgIGtleXMucHVzaCgnVVJMJyk7XG4gICAgICAgICAgYXBwbGllZGZvcm1hdHMgPSBrZXlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbGllZGZvcm1hdHMgPSB0aGlzLmdldEF2YWlsYWJsZUZvcm1hdHMoYXBwbGllZGZvcm1hdHMpO1xuXG4gICAgaWYgKGZvcm1hdHNUeXBlLmN1c3RvbUxpc3QpIHtcbiAgICAgIGxldCBjb21tb25Gb3JtYXRzO1xuICAgICAgY29uc3QgbGF5ZXJzV2l0aEN1c3RvbUZvcm1hdHMgPSBbXTtcbiAgICAgIGxldCBwcmV2aW91c0N1c3RvbUxpc3RGb3JtYXRzID0gY3VzdG9tTGlzdFswXS5mb3JtYXRzO1xuICAgICAgY3VzdG9tTGlzdC5tYXAoKGxpc3QpID0+IHtcbiAgICAgICAgbGF5ZXJzV2l0aEN1c3RvbUZvcm1hdHMucHVzaChsaXN0LmxheWVyKTtcbiAgICAgICAgY29tbW9uRm9ybWF0cyA9IGxpc3QuZm9ybWF0cy5maWx0ZXIoKHZhbHVlKSA9PlxuICAgICAgICAgIHByZXZpb3VzQ3VzdG9tTGlzdEZvcm1hdHMuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIHByZXZpb3VzQ3VzdG9tTGlzdEZvcm1hdHMgPSBsaXN0LmZvcm1hdHM7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZpbmFsRm9ybWF0cyA9IGNvbW1vbkZvcm1hdHMuZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgYXBwbGllZGZvcm1hdHMuaW5jbHVkZXModmFsdWUpXG4gICAgICApO1xuICAgICAgaWYgKGZpbmFsRm9ybWF0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZm9ybWF0cyQubmV4dChmaW5hbEZvcm1hdHMpO1xuXG4gICAgICAgIGlmIChsYXllcnMgJiYgbGF5ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChsYXllcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgICAgICAgICAgJ2lnby5nZW8uZXhwb3J0LmN1c3RvbUxpc3QudGV4dCcsXG4gICAgICAgICAgICAgICdpZ28uZ2VvLmV4cG9ydC5jdXN0b21MaXN0LnRpdGxlJyxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB7IHZhbHVlOiBsYXllcnNXaXRoQ3VzdG9tRm9ybWF0cy5qb2luKCkgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybWF0cyQubmV4dChbXSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgJ2lnby5nZW8uZXhwb3J0Lm5vRm9ybWF0LnRleHQnLFxuICAgICAgICAgICdpZ28uZ2VvLmV4cG9ydC5ub0Zvcm1hdC50aXRsZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtYXRzJC5uZXh0KGFwcGxpZWRmb3JtYXRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEF2YWlsYWJsZUZvcm1hdHMobGF5ZXJGb3JtYXRzOiBFeHBvcnRGb3JtYXRbXSk6IEV4cG9ydEZvcm1hdFtdIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnRm9ybWF0cykge1xuICAgICAgcmV0dXJuIGxheWVyRm9ybWF0cztcbiAgICB9XG4gICAgY29uc3QgYXZhaWxhYmxlRm9ybWF0cyA9IHRoaXMudmFsaWRhdGVMaXN0Rm9ybWF0KHRoaXMuY29uZmlnRm9ybWF0cyk7XG4gICAgcmV0dXJuIGxheWVyRm9ybWF0cy5maWx0ZXIoKGxheWVyRm9ybWF0KSA9PlxuICAgICAgYXZhaWxhYmxlRm9ybWF0cy5pbmNsdWRlcyhsYXllckZvcm1hdClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUxpc3RGb3JtYXQoZm9ybWF0czogQW55RXhwb3J0Rm9ybWF0W10pOiBFeHBvcnRGb3JtYXRbXSB7XG4gICAgY29uc3QgYWxsVXBwZXJjYXNlRm9ybWF0cyA9IFsuLi5FeHBvcnRGb3JtYXQsIC4uLkV4cG9ydEZvcm1hdExlZ2FjeV0ubWFwKFxuICAgICAgKGYpID0+IGYudG9VcHBlckNhc2UoKVxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ybWF0c1xuICAgICAgLmZpbHRlcigoZm9ybWF0KSA9PiB7XG4gICAgICAgIGlmIChhbGxVcHBlcmNhc2VGb3JtYXRzLmluY2x1ZGVzKGZvcm1hdC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAubWFwKChmb3JtYXQpID0+IHtcbiAgICAgICAgY29uc3QgY3N2Rm9ybWF0czogc3RyaW5nW10gPSAoXG4gICAgICAgICAgWydDU1YnLCAnQ1NWY29tbWEnLCAnQ1NWc2VtaWNvbG9uJ10gc2F0aXNmaWVzIEFueUV4cG9ydEZvcm1hdFtdXG4gICAgICAgICkubWFwKChmKSA9PiBmLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICBpZiAoY3N2Rm9ybWF0cy5pbmNsdWRlcyhmb3JtYXQudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgICAgICByZXR1cm4gJ0NTVic7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ0V4Y2VsJywgZm9ybWF0KSkge1xuICAgICAgICAgIHJldHVybiAnRXhjZWwnO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcGFyZVN0cmluZzxFeHBvcnRGb3JtYXQ+KCdHTUwnLCBmb3JtYXQpKSB7XG4gICAgICAgICAgcmV0dXJuICdHTUwnO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcGFyZVN0cmluZzxFeHBvcnRGb3JtYXQ+KCdHUFgnLCBmb3JtYXQpKSB7XG4gICAgICAgICAgcmV0dXJuICdHUFgnO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29tcGFyZVN0cmluZzxFeHBvcnRGb3JtYXQ+KCdHZW9KU09OJywgZm9ybWF0KSkge1xuICAgICAgICAgIHJldHVybiAnR2VvSlNPTic7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ0tNTCcsIGZvcm1hdCkpIHtcbiAgICAgICAgICByZXR1cm4gJ0tNTCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ1NoYXBlZmlsZScsIGZvcm1hdCkpIHtcbiAgICAgICAgICByZXR1cm4gJ1NoYXBlZmlsZSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ1VSTCcsIGZvcm1hdCkpIHtcbiAgICAgICAgICByZXR1cm4gJ1VSTCc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+KHZhbHVlMTogVCwgdmFsdWUyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUxLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlMi50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgcHVibGljIG1vZGVDaGFuZ2VkKG1vZGU6IFNlbGVjdE1vZGUpIHtcbiAgICB0aGlzLnNlbGVjdE1vZGUuZW1pdChtb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgb25GaWxlRXhwb3J0U3VjY2VzcygpIHtcbiAgICBoYW5kbGVGaWxlRXhwb3J0U3VjY2Vzcyh0aGlzLm1lc3NhZ2VTZXJ2aWNlKTtcbiAgfVxuXG4gIG9uSW1wb3J0RXhwb3J0Q2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGUgPSBldmVudC52YWx1ZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImltcG9ydC1leHBvcnQtdG9nZ2xlXCI+XG4gIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFxuICAgIFt2YWx1ZV09XCJzZWxlY3RlZE1vZGVcIlxuICAgIChjaGFuZ2UpPVwib25JbXBvcnRFeHBvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIidpbXBvcnQnXCI+XG4gICAgICB7eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydFRhYlRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCInZXhwb3J0J1wiPlxuICAgICAge3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRUYWJUaXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuPC9kaXY+XG5cbjxmb3JtXG4gIGNsYXNzPVwiaWdvLWZvcm1cIlxuICBbZm9ybUdyb3VwXT1cImltcG9ydEZvcm1cIlxuICAqbmdJZj1cInNlbGVjdGVkTW9kZSA9PT0gJ2ltcG9ydCdcIlxuPlxuICA8ZGl2IGNsYXNzPVwiaWdvLWlucHV0LWNvbnRhaW5lclwiPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWw+e3tcbiAgICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRQcm9qUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiaW5wdXRQcm9qXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHByb2plY3Rpb24gb2YgcHJvamVjdGlvbnMkIHwgYXN5bmNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJwcm9qZWN0aW9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIG1hdExpc3RJdGVtVGl0bGUgKm5nSWY9XCJwcm9qZWN0aW9uLnRyYW5zbGF0ZUtleVwiPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy4nICsgcHJvamVjdGlvbi50cmFuc2xhdGVLZXlcbiAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogcHJvamVjdGlvblxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1UaXRsZSAqbmdJZj1cIiFwcm9qZWN0aW9uLnRyYW5zbGF0ZUtleVwiPlxuICAgICAgICAgICAge3sgcHJvamVjdGlvbi5hbGlhcyB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgaW1wb3J0Rm9ybS5pbnZhbGlkXG4gICAgICAgID8gKCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMuY2hvb3NlJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgOiAoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRCdXR0b24nIHwgdHJhbnNsYXRlKVxuICAgIFwiXG4gICAgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cImltcG9ydEZvcm0uaW52YWxpZCB8fCAobG9hZGluZyQgfCBhc3luYylcIlxuICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICA+XG4gICAgICB7eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydEJ1dHRvbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8aWdvLXNwaW5uZXIgW3Nob3duXT1cImxvYWRpbmckIHwgYXN5bmNcIj48L2lnby1zcGlubmVyPlxuICAgIDxpbnB1dFxuICAgICAgaGlkZGVuXG4gICAgICAjZmlsZUlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBbc3R5bGUuZGlzcGxheV09XCInbm9uZSdcIlxuICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC52YWx1ZSA9IG51bGxcIlxuICAgICAgKGNoYW5nZSk9XCJpbXBvcnRGaWxlcygkYW55KCRldmVudC50YXJnZXQpLmZpbGVzKVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L2Zvcm0+XG48c2VjdGlvbiAqbmdJZj1cInNlbGVjdGVkTW9kZSA9PT0gJ2ltcG9ydCdcIj5cbiAgPGRpdiAqbmdJZj1cImltcG9ydEh0bWxDbGFyaWZpY2F0aW9ucyA9PT0gJydcIj5cbiAgICA8aDQ+e3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRDbGFyaWZpY2F0aW9ucycgfCB0cmFuc2xhdGUgfX08L2g0PlxuICAgIDx1bD5cbiAgICAgIDxsaT5cbiAgICAgICAge3tcbiAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydFNpemVNYXgnXG4gICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBzaXplOiBmaWxlU2l6ZU1iIH1cbiAgICAgICAgfX1cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+XG4gICAgICAgIHt7ICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0Rm9ybWF0QXV0aG9yaXplZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+e3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRTaHBaaXAnIHwgdHJhbnNsYXRlIH19PC9saT5cbiAgICA8L3VsPlxuICA8L2Rpdj5cbiAgPGlnby1jdXN0b20taHRtbFxuICAgICpuZ0lmPVwiaW1wb3J0SHRtbENsYXJpZmljYXRpb25zICE9PSAnJ1wiXG4gICAgW2h0bWxdPVwiaW1wb3J0SHRtbENsYXJpZmljYXRpb25zXCJcbiAgPlxuICA8L2lnby1jdXN0b20taHRtbD5cbjwvc2VjdGlvbj5cblxuPHNlY3Rpb25cbiAgKm5nSWY9XCIoZXhwb3J0YWJsZUxheWVycyQgfCBhc3luYykubGVuZ3RoID09PSAwICYmIHNlbGVjdGVkTW9kZSA9PT0gJ2V4cG9ydCdcIlxuPlxuICA8aDQ+e3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnROb0xheWVyc0V4cG9ydGFibGUnIHwgdHJhbnNsYXRlIH19PC9oND5cbjwvc2VjdGlvbj5cblxuPGZvcm1cbiAgY2xhc3M9XCJpZ28tZm9ybVwiXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICpuZ0lmPVwiKGV4cG9ydGFibGVMYXllcnMkIHwgYXN5bmMpLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRNb2RlID09PSAnZXhwb3J0J1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydExheWVyUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwibGF5ZXJzXCIgbXVsdGlwbGU+XG4gICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAge3sgbGF5ZXJzLmxlbmd0aCA/IGdldExheWVyVGl0bGVCeUlkKGxheWVyc1swXSkgOiAnJyB9fVxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGF5ZXJzLmxlbmd0aCA+IDFcIiBjbGFzcz1cImV4cG9ydC1zZWxlY3QtdHJpZ2dlclwiPlxuICAgICAgICAgICAgKCt7eyBsYXllcnMubGVuZ3RoIC0gMSB9fVxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgKGxheWVycz8ubGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgPyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLm90aGVyJ1xuICAgICAgICAgICAgICAgIDogJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5vdGhlcnMnXG4gICAgICAgICAgICAgICkgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19KVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGxheWVyIG9mIGV4cG9ydGFibGVMYXllcnMkIHwgYXN5bmNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdpZ28tZXhwb3J0LWxheWVyLW1hdC1vcHRpb24nOiBsYXllckhhc1NlbGVjdGVkRmVhdHVyZXMobGF5ZXIpXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImxheWVyLmlkXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIG1hdExpc3RJdGVtVGl0bGU+e3sgbGF5ZXIudGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1UaXRsZT5cbiAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICpuZ0lmPVwibGF5ZXJIYXNTZWxlY3RlZEZlYXR1cmVzKGxheWVyKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbmx5U2VsZWN0ZWRDbGljaygkZXZlbnQsIGxheWVyLmlkKVwiXG4gICAgICAgICAgICAgIChjaGVja2VkKT1cImluTGF5ZXJzSWRUb0V4cG9ydFNlbGVjdGlvbk9ubHkobGF5ZXIpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbmx5U2VsZWN0ZWQoJGV2ZW50LCBsYXllci5pZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c21hbGw+e3tcbiAgICAgICAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydFNlbGVjdGVkRmVhdHVyZScgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgfX08L3NtYWxsPlxuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydEZvcm1hdFBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVxuICAgICAgfX08L21hdC1sYWJlbD5cbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImZvcm1hdFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGZvcm1hdHMkIHwgYXN5bmMpLmxlbmd0aCAhPT0gMFwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBmb3JtYXQgb2YgZm9ybWF0cyQgfCBhc3luY1wiIFt2YWx1ZV09XCJmb3JtYXRcIj5cbiAgICAgICAgICAgIHt7ICdpZ28uZ2VvLmV4cG9ydC5mb3JtYXQuJyArIGZvcm1hdCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiKGZvcm1hdHMkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMFwiIGRpc2FibGVkPVwidHJ1ZVwiPlxuICAgICAgICAgIHt7ICdpZ28uZ2VvLmV4cG9ydC5ub0Zvcm1hdC50aXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIlxuICAgICpuZ0lmPVwiZm9yY2VOYW1pbmcgJiYgZm9ybS52YWx1ZS5mb3JtYXQgIT09ICdVUkwnXCJcbiAgPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e1xuICAgICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0RmlsZU5hbWVQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcbiAgICAgICAgfX1cIlxuICAgICAgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5pc0NzdkV4cG9ydChmb3JtLnZhbHVlLmZvcm1hdClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWdvLWlucHV0LWNvbnRhaW5lclwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLmV4cG9ydC5zZXBhcmF0b3InIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNzdlNlcGFyYXRvclwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VwYXJhdG9yIG9mIGNzdlNlcGFyYXRvcnNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlcGFyYXRvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ2lnby5nZW8uZXhwb3J0LmNzdi5zZXBhcmF0b3IuJyArIHNlcGFyYXRvciB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwibGF5ZXJzLmxlbmd0aCA+IDFcIiBjbGFzcz1cImV4cG9ydC1jb21iaW5lLWxheWVyc1wiPlxuICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tYmluZUxheWVyc1wiXG4gICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRDb21iaW5lUmVzdWx0cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwibGF5ZXJzLmxlbmd0aCA+IDEgJiYgZm9ybS52YWx1ZS5jb21iaW5lTGF5ZXJzXCJcbiAgICAgIGNsYXNzPVwiZXhwb3J0LXNlcGFyYXRvclwiXG4gICAgPlxuICAgICAgPG1hdC1zbGlkZS10b2dnbGUgZm9ybUNvbnRyb2xOYW1lPVwic2VwYXJhdG9yXCIgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIj5cbiAgICAgICAge3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRTZXBhcmF0b3InIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJleHBvcnQtb3B0aW9uc1wiICpuZ0lmPVwiZm9ybS52YWx1ZS5mb3JtYXQgIT09ICdVUkwnXCI+XG4gICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImZlYXR1cmVJbk1hcEV4dGVudFwiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgPlxuICAgICAge3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRGZWF0dXJlSW5FeHRlbnQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiaWdvLWZvcm0tYnV0dG9uLWdyb3VwXCI+XG4gICAgPGJ1dHRvblxuICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtLnZhbGlkIHx8IChsb2FkaW5nJCB8IGFzeW5jKVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlRXhwb3J0Rm9ybVN1Ym1pdChmb3JtLnZhbHVlKVwiXG4gICAgPlxuICAgICAge3tcbiAgICAgICAgZm9ybS52YWx1ZS5mb3JtYXQgIT09ICdVUkwnXG4gICAgICAgICAgPyAoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRCdXR0b24nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogZm9ybS52YWx1ZS5sYXllcnMubGVuZ3RoID4gMVxuICAgICAgICAgICAgPyAoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRCdXR0b25MaW5rcycgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6ICgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydEJ1dHRvbkxpbmsnIHwgdHJhbnNsYXRlKVxuICAgICAgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8aWdvLXNwaW5uZXIgW3Nob3duXT1cImxvYWRpbmckIHwgYXN5bmNcIj48L2lnby1zcGlubmVyPlxuICA8L2Rpdj5cblxuICA8aWdvLWN1c3RvbS1odG1sXG4gICAgKm5nSWY9XCJleHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgIT09ICcnXCJcbiAgICBbaHRtbF09XCJleHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnNcIlxuICA+XG4gIDwvaWdvLWN1c3RvbS1odG1sPlxuPC9mb3JtPlxuIl19