@igo2/geo 18.0.0-next.8 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +4 -6
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +13 -10
  3. package/esm2022/lib/datasource/shared/capabilities.service.mjs +1 -1
  4. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
  5. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +9 -1
  6. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
  7. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +8 -1
  8. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
  9. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +8 -1
  10. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
  11. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +8 -1
  12. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
  13. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +8 -1
  14. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
  15. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +8 -1
  16. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
  17. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +4 -1
  18. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
  19. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
  20. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +8 -1
  21. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
  22. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  23. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +8 -1
  24. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  25. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +8 -1
  26. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
  27. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
  28. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +151 -102
  29. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +177 -83
  30. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +93 -44
  31. package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
  32. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
  33. package/esm2022/lib/directions/directions.component.mjs +55 -31
  34. package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
  35. package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
  36. package/esm2022/lib/directions/shared/directions.service.mjs +122 -96
  37. package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
  38. package/esm2022/lib/directions/shared/store.mjs +2 -2
  39. package/esm2022/lib/download/download-button/download-button.component.mjs +8 -20
  40. package/esm2022/lib/download/shared/download.service.mjs +1 -1
  41. package/esm2022/lib/draw/draw/draw-popup.component.mjs +1 -1
  42. package/esm2022/lib/draw/draw/draw.component.mjs +5 -12
  43. package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
  44. package/esm2022/lib/environment/environment.interface.mjs +1 -1
  45. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +2 -2
  46. package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
  47. package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
  48. package/esm2022/lib/feature/shared/store.mjs +1 -1
  49. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
  50. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
  51. package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
  52. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
  53. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
  54. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +5 -3
  55. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +1 -1
  56. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +8 -1
  57. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1 -1
  58. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -8
  59. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -8
  60. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
  61. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +13 -10
  62. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
  63. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +4 -2
  64. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +5 -16
  65. package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -17
  66. package/esm2022/lib/import-export/import-export/import-export.component.mjs +23 -12
  67. package/esm2022/lib/import-export/shared/export.service.mjs +7 -4
  68. package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
  69. package/esm2022/lib/layer/index.mjs +10 -5
  70. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  71. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  72. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +61 -128
  73. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +5 -8
  74. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +5 -6
  75. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +14 -21
  76. package/esm2022/lib/layer/layer-list/index.mjs +1 -3
  77. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +176 -775
  78. package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
  79. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +51 -84
  80. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
  81. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +56 -16
  82. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  83. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  84. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  85. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
  86. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  87. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  88. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  89. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  90. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  91. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  92. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  93. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  94. package/esm2022/lib/layer/layer.module.mjs +51 -33
  95. package/esm2022/lib/layer/shared/index.mjs +2 -1
  96. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  97. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  98. package/esm2022/lib/layer/shared/layer.service.mjs +56 -14
  99. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  100. package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
  101. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  102. package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
  103. package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
  104. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  105. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  106. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  107. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
  108. package/esm2022/lib/layer/shared/layers/layer.mjs +113 -113
  109. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  110. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  111. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  112. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  113. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
  114. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +9 -3
  115. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
  116. package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
  117. package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
  118. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
  119. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -6
  120. package/esm2022/lib/map/map-center/map-center.component.mjs +1 -2
  121. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
  122. package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
  123. package/esm2022/lib/map/shared/hover-feature.directive.mjs +1 -9
  124. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
  125. package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
  126. package/esm2022/lib/map/shared/map.mjs +7 -243
  127. package/esm2022/lib/map/shared/map.service.mjs +1 -1
  128. package/esm2022/lib/map/shared/map.utils.mjs +3 -3
  129. package/esm2022/lib/map/shared/mapOffline.directive.mjs +9 -5
  130. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +1 -3
  131. package/esm2022/lib/map/utils/index.mjs +2 -0
  132. package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
  133. package/esm2022/lib/measure/measurer/measurer.component.mjs +7 -25
  134. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -18
  135. package/esm2022/lib/offline/offline.provider.mjs +10 -11
  136. package/esm2022/lib/print/shared/print.service.mjs +3 -3
  137. package/esm2022/lib/query/shared/query.directive.mjs +9 -5
  138. package/esm2022/lib/query/shared/query.service.mjs +7 -7
  139. package/esm2022/lib/query/shared/query.utils.mjs +5 -1
  140. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +15 -9
  141. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +1 -10
  142. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
  143. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
  144. package/esm2022/lib/search/shared/sources/workspace.mjs +1 -1
  145. package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
  146. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -17
  147. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +17 -2
  148. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +22 -4
  149. package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
  150. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
  151. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +6 -2
  152. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +4 -3
  153. package/fesm2022/igo2-geo.mjs +22502 -21440
  154. package/fesm2022/igo2-geo.mjs.map +1 -1
  155. package/lib/datasource/shared/capabilities.service.d.ts +7 -2
  156. package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +1 -0
  157. package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +1 -0
  158. package/lib/datasource/shared/datasources/carto-datasource.d.ts +1 -0
  159. package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +0 -2
  160. package/lib/datasource/shared/datasources/cluster-datasource.d.ts +1 -0
  161. package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +0 -1
  162. package/lib/datasource/shared/datasources/datasource.d.ts +1 -0
  163. package/lib/datasource/shared/datasources/datasource.interface.d.ts +1 -2
  164. package/lib/datasource/shared/datasources/feature-datasource.d.ts +1 -0
  165. package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +0 -3
  166. package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +1 -0
  167. package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +0 -2
  168. package/lib/datasource/shared/datasources/mvt-datasource.d.ts +1 -0
  169. package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +0 -2
  170. package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +0 -2
  171. package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +1 -0
  172. package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +0 -2
  173. package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +0 -2
  174. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +1 -0
  175. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +3 -4
  176. package/lib/datasource/shared/datasources/wms-datasource.d.ts +1 -0
  177. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +6 -6
  178. package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +0 -2
  179. package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +0 -2
  180. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
  181. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
  182. package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
  183. package/lib/directions/directions-sources/directions-source.d.ts +2 -2
  184. package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
  185. package/lib/directions/directions.component.d.ts +5 -5
  186. package/lib/directions/shared/directions.enum.d.ts +42 -1
  187. package/lib/directions/shared/directions.interface.d.ts +50 -25
  188. package/lib/directions/shared/directions.service.d.ts +46 -8
  189. package/lib/directions/shared/directions.utils.d.ts +102 -23
  190. package/lib/directions/shared/store.d.ts +3 -3
  191. package/lib/download/download-button/download-button.component.d.ts +4 -8
  192. package/lib/download/shared/download.service.d.ts +1 -1
  193. package/lib/draw/draw/draw.component.d.ts +2 -2
  194. package/lib/draw/shared/draw.utils.d.ts +2 -1
  195. package/lib/environment/environment.interface.d.ts +2 -0
  196. package/lib/feature/shared/feature-store.utils.d.ts +1 -1
  197. package/lib/feature/shared/feature.interfaces.d.ts +1 -1
  198. package/lib/feature/shared/store.d.ts +1 -1
  199. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
  200. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +1 -1
  201. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
  202. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
  203. package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
  204. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
  205. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
  206. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
  207. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  208. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
  209. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  210. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
  211. package/lib/import-export/export-button/export-button.component.d.ts +3 -7
  212. package/lib/import-export/import-export/import-export.component.d.ts +1 -2
  213. package/lib/import-export/shared/export.service.d.ts +2 -2
  214. package/lib/layer/index.d.ts +9 -4
  215. package/lib/layer/layer-group/index.d.ts +1 -0
  216. package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
  217. package/lib/layer/layer-item/layer-item.component.d.ts +19 -38
  218. package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
  219. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
  220. package/lib/layer/layer-list/index.d.ts +0 -2
  221. package/lib/layer/layer-list/layer-list.component.d.ts +51 -123
  222. package/lib/layer/layer-list-tool/index.d.ts +0 -1
  223. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
  224. package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
  225. package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
  226. package/lib/layer/layer-search/index.d.ts +1 -0
  227. package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
  228. package/lib/layer/layer-unavailable/index.d.ts +2 -0
  229. package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
  230. package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
  231. package/lib/layer/layer-viewer/index.d.ts +2 -0
  232. package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
  233. package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
  234. package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
  235. package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
  236. package/lib/layer/layer-visibility-button/index.d.ts +1 -0
  237. package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
  238. package/lib/layer/layer.module.d.ts +18 -6
  239. package/lib/layer/shared/index.d.ts +1 -0
  240. package/lib/layer/shared/layer-controller.d.ts +81 -0
  241. package/lib/layer/shared/layer-selection.d.ts +14 -0
  242. package/lib/layer/shared/layer.service.d.ts +12 -3
  243. package/lib/layer/shared/layers/any-layer.d.ts +3 -6
  244. package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
  245. package/lib/layer/shared/layers/image-layer.d.ts +5 -2
  246. package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
  247. package/lib/layer/shared/layers/index.d.ts +5 -0
  248. package/lib/layer/shared/layers/layer-base.d.ts +75 -0
  249. package/lib/layer/shared/layers/layer-group.d.ts +32 -0
  250. package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
  251. package/lib/layer/shared/layers/layer.d.ts +27 -44
  252. package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
  253. package/lib/layer/shared/layers/linked/index.d.ts +3 -0
  254. package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
  255. package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
  256. package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
  257. package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
  258. package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
  259. package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
  260. package/lib/layer/utils/layer.utils.d.ts +12 -2
  261. package/lib/layer/utils/outputLegend.d.ts +2 -2
  262. package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
  263. package/lib/map/shared/hover-feature.directive.d.ts +0 -1
  264. package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
  265. package/lib/map/shared/map.abstract.d.ts +12 -29
  266. package/lib/map/shared/map.d.ts +10 -85
  267. package/lib/map/shared/map.service.d.ts +1 -1
  268. package/lib/map/shared/map.utils.d.ts +5 -3
  269. package/lib/map/utils/index.d.ts +1 -0
  270. package/lib/map/utils/layer-watcher.d.ts +18 -8
  271. package/lib/measure/measurer/measurer.component.d.ts +0 -8
  272. package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
  273. package/lib/offline/offline.provider.d.ts +1 -1
  274. package/lib/query/shared/query.service.d.ts +1 -1
  275. package/lib/query/shared/query.utils.d.ts +2 -1
  276. package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
  277. package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
  278. package/lib/search/shared/sources/cadastre.providers.d.ts +1 -1
  279. package/lib/search/shared/sources/coordinates.providers.d.ts +1 -1
  280. package/lib/search/shared/sources/icherche.providers.d.ts +1 -1
  281. package/lib/search/shared/sources/ilayer.interfaces.d.ts +1 -1
  282. package/lib/search/shared/sources/ilayer.providers.d.ts +1 -1
  283. package/lib/search/shared/sources/nominatim.providers.d.ts +1 -1
  284. package/lib/search/shared/sources/storedqueries.providers.d.ts +2 -2
  285. package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
  286. package/lib/search/shared/sources/workspace.providers.d.ts +1 -1
  287. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  288. package/locale/en.geo.json +106 -89
  289. package/locale/fr.geo.json +105 -89
  290. package/package.json +5 -5
  291. package/src/geo-theme.scss +1 -1
  292. package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
  293. package/src/lib/directions/directions.theming.scss +2 -0
  294. package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
  295. package/src/lib/layer/layer-item/layer-item.theme.scss +12 -9
  296. package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
  297. package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
  298. package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
  299. package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
  300. package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
  301. package/src/lib/layer/layer.theming.scss +14 -3
  302. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
  303. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
  304. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
  305. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
  306. package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
  307. package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
  308. package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
@@ -1,5 +1,6 @@
1
+ import { FlatTreeControl } from '@angular/cdk/tree';
1
2
  import { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, Input, Output } from '@angular/core';
3
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
3
4
  import { FormsModule } from '@angular/forms';
4
5
  import { MatBadgeModule } from '@angular/material/badge';
5
6
  import { MatButtonModule } from '@angular/material/button';
@@ -9,823 +10,223 @@ import { MatIconModule } from '@angular/material/icon';
9
10
  import { MatMenuModule } from '@angular/material/menu';
10
11
  import { MatSliderModule } from '@angular/material/slider';
11
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
+ import { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';
14
+ import { TreeDragDropDirective } from '@igo2/common/drag-drop';
15
+ import { IgoIconComponent, VECTOR_SQUARE_ICON } from '@igo2/common/icon';
12
16
  import { ListComponent, ListItemDirective } from '@igo2/common/list';
13
17
  import { PanelComponent } from '@igo2/common/panel';
14
18
  import { IgoLanguageModule } from '@igo2/core/language';
15
- import * as olextent from 'ol/extent';
16
- import { BehaviorSubject, EMPTY, ReplaySubject, timer } from 'rxjs';
17
- import { debounce } from 'rxjs/operators';
18
- import scrollIntoView from 'scroll-into-view-if-needed';
19
- import { getAllChildLayersByProperty, getRootParentByProperty } from '../../map/shared/linkedLayers.utils';
20
- import { IgoMap } from '../../map/shared/map';
21
- import { LayerItemComponent } from '../layer-item/layer-item.component';
22
- import { LayerListToolComponent } from '../layer-list-tool/layer-list-tool.component';
23
- import { LinkedProperties } from '../shared/layers/layer.interface';
24
- import { LayerListControlsEnum, LayerListDisplacement } from './layer-list.enum';
25
- import { LayerListSelectVisibleEnum } from './layer-list.enum';
19
+ import { MessageService } from '@igo2/core/message';
20
+ import { LayerGroupComponent } from '../layer-group';
21
+ import { LayerItemComponent } from '../layer-item';
22
+ import { LayerListToolComponent } from '../layer-list-tool';
23
+ import { isLayerGroup, isLayerItem } from '../utils/layer.utils';
26
24
  import * as i0 from "@angular/core";
27
- import * as i1 from "@angular/material/checkbox";
28
- import * as i2 from "@angular/material/divider";
29
- import * as i3 from "@angular/material/button";
30
- import * as i4 from "@angular/material/tooltip";
31
- import * as i5 from "@angular/material/icon";
32
- import * as i6 from "@angular/material/badge";
33
- import * as i7 from "@angular/material/menu";
34
- import * as i8 from "@angular/material/slider";
35
- import * as i9 from "@angular/forms";
36
- import * as i10 from "@ngx-translate/core";
37
- // TODO: This class could use a clean up. Also, some methods could be moved ealsewhere
25
+ import * as i1 from "@igo2/core/message";
26
+ import * as i2 from "@angular/material/button";
27
+ import * as i3 from "@angular/material/icon";
28
+ import * as i4 from "@angular/material/tree";
38
29
  export class LayerListComponent {
39
- elRef;
40
- orderable = true;
41
- thresholdToFilterAndSort = 5;
42
- layers$ = new BehaviorSubject([]);
43
- change$ = new ReplaySubject(1);
44
- showToolbar$ = new BehaviorSubject(false);
45
- layerTool;
46
- hideSelectedLayers = true;
47
- activeLayer$ = new BehaviorSubject(undefined);
48
- layersChecked = [];
49
- selection;
50
- change$$;
51
- layers$$;
52
- layerItemChangeDetection$ = new BehaviorSubject(undefined);
53
- templateLayerToolbar;
54
- layersAreAllVisible = true;
55
- ogcButton = true;
56
- timeButton = true;
57
- get map() {
58
- return this._map;
59
- }
60
- set map(value) {
61
- this._map = value;
62
- }
63
- _map;
64
- set layers(value) {
65
- this._layers = this.removeProblemLayerInList(value);
66
- this.next();
30
+ messageService;
31
+ toggleOpacity = false;
32
+ isInit;
33
+ controller;
34
+ set layers(layers) {
35
+ this._layers = layers;
36
+ this.updateDatasource(layers ?? []);
67
37
  }
68
38
  get layers() {
69
39
  return this._layers;
70
40
  }
71
41
  _layers;
72
- set activeLayer(value) {
73
- this._activeLayer = value;
74
- this.activeLayer$.next(value);
75
- }
76
- get activeLayer() {
77
- return this._activeLayer;
78
- }
79
- _activeLayer;
80
- floatLabel = 'auto';
81
- layerFilterAndSortOptions = {};
82
- excludeBaseLayers = false;
83
- toggleLegendOnVisibilityChange = false;
84
- expandLegendOfVisibleLayers = false;
85
- updateLegendOnResolutionChange = false;
86
- queryBadge = false;
87
- appliedFilterAndSort = new EventEmitter();
88
- get keyword() {
89
- return this._keyword;
90
- }
91
- set keyword(value) {
92
- this._keyword = value;
93
- this.next();
94
- }
95
- _keyword = undefined;
96
- get onlyVisible() {
97
- return this._onlyVisible;
98
- }
99
- set onlyVisible(value) {
100
- this._onlyVisible = value;
101
- this.next();
102
- }
103
- _onlyVisible = false;
104
- get sortAlpha() {
105
- return this._sortedAlpha;
106
- }
107
- set sortAlpha(value) {
108
- this._sortedAlpha = value;
109
- this.next();
110
- }
111
- _sortedAlpha = false;
112
- get opacity() {
113
- return Math.round(this.activeLayer$.getValue().opacity * 100);
114
- }
115
- set opacity(opacity) {
116
- this.activeLayer$.getValue().opacity = opacity / 100;
117
- }
118
- get badgeOpacity() {
119
- if (this.opacity === 100) {
120
- return;
121
- }
122
- return this.opacity;
123
- }
124
- get raiseDisabled() {
125
- if (!this.orderable ||
126
- this.activeLayer.baseLayer ||
127
- this.getUpperLayer().id === this.activeLayer.id ||
128
- this.isUpperBaselayer(this.activeLayer)) {
129
- return true;
130
- }
131
- return false;
132
- }
133
- get lowerDisabled() {
134
- if (!this.orderable ||
135
- this.activeLayer.baseLayer ||
136
- this.getLowerLayer().id === this.activeLayer.id ||
137
- this.isLowerBaselayer(this.activeLayer)) {
138
- return true;
139
- }
140
- return false;
141
- }
142
- get raiseDisabledSelection() {
143
- if (this.layersChecked.length === 0 ||
144
- !this.orderable ||
145
- !this.raisableLayers(this.layersChecked) ||
146
- this.selectAllCheck === true) {
147
- return true;
148
- }
149
- return false;
150
- }
151
- get lowerDisabledSelection() {
152
- if (this.layersChecked.length === 0 ||
153
- !this.orderable ||
154
- !this.lowerableLayers(this.layersChecked) ||
155
- this.selectAllCheck === true) {
156
- return true;
157
- }
158
- return false;
159
- }
160
- get checkOpacity() {
161
- return this.layersCheckedOpacity() * 100;
162
- }
163
- set checkOpacity(opacity) {
164
- for (const layer of this.layersChecked) {
165
- layer.opacity = opacity / 100;
166
- }
167
- }
168
- get layerListDisplacement() {
169
- return LayerListDisplacement;
170
- }
171
- toggleOpacity = false;
172
- selectAllCheck;
173
- selectAllCheck$ = new BehaviorSubject(undefined);
174
- selectAllCheck$$;
175
- constructor(elRef) {
176
- this.elRef = elRef;
177
- }
178
- /**
179
- * Subscribe to the search term stream and trigger researches
180
- * @internal
181
- */
182
- ngOnInit() {
183
- this.change$$ = this.change$
184
- .pipe(debounce(() => {
185
- return this.layers.length === 0 ? EMPTY : timer(50);
186
- }))
187
- .subscribe(() => {
188
- this.showToolbar$.next(this.computeShowToolbar());
189
- this.layers$.next(this.computeLayers(this.layers.slice(0)));
190
- this.appliedFilterAndSort.emit({
191
- keyword: this.keyword,
192
- sortAlpha: this.sortAlpha,
193
- onlyVisible: this.onlyVisible
194
- });
195
- });
196
- this.selectAllCheck$$ = this.selectAllCheck$.subscribe((value) => {
197
- this.selectAllCheck = value;
198
- });
199
- this.layers$$ = this.layers$.subscribe(() => {
200
- if (this.layers) {
201
- let checks = 0;
202
- for (const layer of this.layers) {
203
- layer.status$.subscribe((valStatus) => {
204
- if (valStatus === 0) {
205
- this.map.removeLayer(layer);
206
- }
207
- });
208
- if (layer.options.active) {
209
- this.activeLayer = layer;
210
- this.layerTool = true;
211
- }
212
- if (layer.options.check) {
213
- checks += 1;
214
- }
215
- }
216
- if (this.excludeBaseLayers) {
217
- this.selectAllCheck =
218
- checks ===
219
- this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length
220
- ? true
221
- : false;
222
- }
223
- else {
224
- this.selectAllCheck =
225
- checks === this.layers.filter((lay) => lay.showInLayerList).length
226
- ? true
227
- : false;
228
- }
229
- }
230
- });
231
- }
232
- ngOnDestroy() {
233
- this.change$$.unsubscribe();
234
- this.selectAllCheck$$.unsubscribe();
235
- this.layers$$.unsubscribe();
236
- }
237
- activeLayerExtentIsValid(layer) {
238
- let valid = false;
239
- if (layer.options.showButtonZoomToExtent === false) {
240
- return false;
241
- }
242
- const layerExtent = layer.options.extent;
243
- const maxLayerZoomExtent = this.map.viewController.maxLayerZoomExtent;
244
- if (layerExtent) {
245
- if (maxLayerZoomExtent) {
246
- valid = olextent.containsExtent(maxLayerZoomExtent, layerExtent);
247
- }
248
- else {
249
- valid = true;
250
- }
251
- }
252
- return valid;
253
- }
254
- activeLayersExtentAreValid(layers) {
255
- let valid = false;
256
- const layersExtent = olextent.createEmpty();
257
- const maxLayerZoomExtent = this.map.viewController.maxLayerZoomExtent;
258
- for (const layer of layers) {
259
- const layerExtent = layer.options.extent;
260
- if (layerExtent && !layerExtent.includes(Infinity)) {
261
- olextent.extend(layersExtent, layerExtent);
262
- }
263
- }
264
- if (!olextent.isEmpty(layersExtent)) {
265
- if (maxLayerZoomExtent) {
266
- valid = olextent.containsExtent(maxLayerZoomExtent, layersExtent);
267
- }
268
- else {
269
- valid = true;
270
- }
271
- }
272
- return valid;
273
- }
274
- zoomLayerExtents(layer) {
275
- this.map.viewController.zoomToExtent(layer.options.extent);
276
- }
277
- zoomLayersExtents(layers) {
278
- const layersExtent = olextent.createEmpty();
279
- for (const layer of layers) {
280
- const layerExtent = layer.options.extent;
281
- if (layerExtent) {
282
- olextent.extend(layersExtent, layerExtent);
283
- }
284
- }
285
- this.map.viewController.zoomToExtent(layersExtent);
286
- }
287
- changeOpacity(event) {
288
- this.opacity = event.value;
289
- }
290
- clearKeyword() {
291
- this.keyword = undefined;
292
- }
293
- getLowerLayer() {
294
- return this.layers
295
- .filter((l) => !l.baseLayer)
296
- .reduce((prev, current) => {
297
- return prev.zIndex < current.zIndex ? prev : current;
298
- }, { zIndex: undefined, id: undefined });
299
- }
300
- isLowerBaselayer(layer) {
301
- const index = this.layers.findIndex((lay) => layer.id === lay.id);
302
- if (this.layers &&
303
- this.layers[index + 1] &&
304
- this.layers[index + 1].baseLayer === true) {
305
- return true;
306
- }
307
- return false;
308
- }
309
- getUpperLayer() {
310
- return this.layers
311
- .filter((l) => !l.baseLayer)
312
- .reduce((prev, current) => {
313
- return prev.zIndex > current.zIndex ? prev : current;
314
- }, { zIndex: undefined, id: undefined });
315
- }
316
- isUpperBaselayer(layer) {
317
- const index = this.layers.findIndex((lay) => layer.id === lay.id);
318
- if (this.layers &&
319
- this.layers[index - 1] &&
320
- this.layers[index - 1].baseLayer === true) {
321
- return true;
322
- }
323
- return false;
324
- }
325
- moveActiveLayer(activeLayer, actiontype, fromUi = false) {
326
- const sortedLayersToMove = [];
327
- getRootParentByProperty(this.map, activeLayer, LinkedProperties.ZINDEX);
328
- let rootParentByProperty = getRootParentByProperty(this.map, activeLayer, LinkedProperties.ZINDEX);
329
- if (!rootParentByProperty) {
330
- rootParentByProperty = activeLayer;
331
- }
332
- const layersToMove = [rootParentByProperty];
333
- getAllChildLayersByProperty(this.map, rootParentByProperty, layersToMove, LinkedProperties.ZINDEX);
334
- this.layers.map((layer) => {
335
- if (layersToMove.indexOf(layer) !== -1) {
336
- sortedLayersToMove.push(layer);
337
- }
338
- });
339
- if (actiontype === LayerListDisplacement.Raise) {
340
- this.raiseLayers(sortedLayersToMove, fromUi);
341
- }
342
- else if (actiontype === LayerListDisplacement.Lower) {
343
- this.lowerLayers(sortedLayersToMove, fromUi);
344
- }
345
- }
346
- /*
347
- * For selection mode disabled attribute
348
- */
349
- raisableLayers(layers) {
350
- let response = false;
351
- let base = 0;
352
- for (const layer of layers) {
353
- const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
354
- const currentLayer = this.layers[mapIndex];
355
- if (currentLayer.baseLayer) {
356
- base += 1;
357
- }
358
- const previousLayer = this.layers[mapIndex - 1];
359
- if (previousLayer &&
360
- previousLayer.baseLayer !== true &&
361
- !layers.find((lay) => previousLayer.id === lay.id) &&
362
- currentLayer.baseLayer !== true) {
363
- response = true;
364
- }
365
- }
366
- if ((this.layersChecked.length === 1 && this.layersChecked[0].baseLayer) ||
367
- base === this.layersChecked.length) {
368
- response = false;
369
- }
370
- return response;
371
- }
372
- /*
373
- * When multiple layers is selected but some may be allow to move
374
- */
375
- raisableLayer(index) {
376
- if (index < 1) {
377
- return false;
378
- }
379
- if (this.layers[index - 1].options.check) {
380
- return this.raisableLayer(index - 1);
381
- }
382
- return true;
383
- }
384
- raiseLayers(layers, fromUi = true) {
385
- const layersToRaise = [];
386
- for (const layer of layers) {
387
- const index = this.layers.findIndex((lay) => lay.id === layer.id);
388
- if (this.raisableLayer(index)) {
389
- layersToRaise.push(layer);
390
- }
391
- }
392
- this.map.raiseLayers(layersToRaise);
393
- if (fromUi) {
394
- setTimeout(() => {
395
- const checkItems = this.elRef.nativeElement.getElementsByClassName('mat-checkbox-checked');
396
- const itemFocused = this.elRef.nativeElement.getElementsByClassName('igo-layer-item-focused');
397
- let targetToScroll;
398
- if (checkItems.length) {
399
- targetToScroll = checkItems[0];
400
- }
401
- if (itemFocused.length) {
402
- targetToScroll = itemFocused[0];
403
- }
404
- if (targetToScroll) {
405
- scrollIntoView(targetToScroll, {
406
- scrollMode: 'if-needed',
407
- behavior: 'smooth',
408
- block: 'end',
409
- inline: 'nearest'
410
- });
411
- }
412
- }, 100);
42
+ isDesktop;
43
+ isDragDropDisabled;
44
+ selectAll;
45
+ viewerOptions;
46
+ activeChange = new EventEmitter();
47
+ _transformer = (layer, level) => {
48
+ return {
49
+ id: layer.id || layer.options.name,
50
+ isGroup: !!isLayerGroup(layer),
51
+ descendantLevels: isLayerGroup(layer)
52
+ ? layer.descendantsLevel
53
+ : undefined,
54
+ level: level,
55
+ data: layer,
56
+ disabled: false
57
+ };
58
+ };
59
+ treeControl = new FlatTreeControl((node) => node.level, (node) => node.isGroup);
60
+ treeFlattener = new MatTreeFlattener(this._transformer, (node) => node.level, (node) => node.isGroup, (node) => node.children
61
+ .filter((layer) => layer.showInLayerList)
62
+ .sort((a, b) => a.zIndex + b.zIndex));
63
+ dataSource;
64
+ constructor(messageService) {
65
+ this.messageService = messageService;
66
+ this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener, []);
67
+ }
68
+ isGroup = (_, node) => node.isGroup;
69
+ isLayerGroup = isLayerGroup;
70
+ isLayerItem = isLayerItem;
71
+ isSelected = (layer) => this.controller.isSelected(layer);
72
+ isDescendantSelection = (layer) => this.controller.isDescendantSelection(layer);
73
+ toggleActive(layer) {
74
+ const isSelected = this.controller.isSelected(layer);
75
+ this.controller.clearSelection();
76
+ if (!isSelected) {
77
+ this.controller.select(layer);
78
+ }
79
+ this.activeChange.emit(layer);
80
+ }
81
+ handleSelect(checked, layer) {
82
+ checked ? this.controller.select(layer) : this.controller.deselect(layer);
83
+ }
84
+ getLayerType(layer) {
85
+ return layer.type === 'raster'
86
+ ? 'raster'
87
+ : layer.id.includes('measure')
88
+ ? 'measure'
89
+ : layer.id.includes('draw')
90
+ ? 'draw'
91
+ : 'vector';
92
+ }
93
+ getLayerIcon(layer) {
94
+ const type = this.getLayerType(layer);
95
+ return type === 'raster'
96
+ ? layer.baseLayer
97
+ ? 'wallpaper'
98
+ : 'image'
99
+ : type === 'measure'
100
+ ? 'square_foot'
101
+ : type === 'draw'
102
+ ? 'draw'
103
+ : VECTOR_SQUARE_ICON;
104
+ }
105
+ dropNode({ node, ref, position }) {
106
+ let nodesToDrop = [node.data];
107
+ if (this.controller.hasSelection) {
108
+ // The selection could contains data from the outside the TreeController
109
+ nodesToDrop = this.controller.selected.filter((layer) => !!this.findNodeByLayerId(layer.id));
110
+ }
111
+ if (node.isGroup) {
112
+ nodesToDrop = nodesToDrop.filter((nodeDrop) => !node.data.isDescendant(nodeDrop));
113
+ }
114
+ if (ref.isGroup) {
115
+ const isSelected = nodesToDrop.some((nodeDrop) => nodeDrop.id === ref.id);
116
+ if (isSelected) {
117
+ nodesToDrop = nodesToDrop.filter((nodeDrop) => nodeDrop.id !== ref.id);
118
+ }
119
+ }
120
+ if (!nodesToDrop.includes(node.data)) {
121
+ nodesToDrop.push(node.data);
122
+ }
123
+ switch (position) {
124
+ case 'above':
125
+ this.controller.moveAbove(ref.data, ...nodesToDrop);
126
+ break;
127
+ case 'inside':
128
+ this.controller.moveInside(ref.data, ...nodesToDrop);
129
+ break;
130
+ default:
131
+ this.controller.moveBelow(ref.data, ...nodesToDrop);
132
+ break;
413
133
  }
414
134
  }
415
- /*
416
- * For selection mode disabled attribute
417
- */
418
- lowerableLayers(layers) {
419
- let response = false;
420
- let base = 0;
421
- for (const layer of layers) {
422
- const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
423
- const currentLayer = this.layers[mapIndex];
424
- if (currentLayer.baseLayer) {
425
- base += 1;
426
- }
427
- const nextLayer = this.layers[mapIndex + 1];
428
- if (nextLayer &&
429
- nextLayer.baseLayer !== true &&
430
- !layers.find((lay) => nextLayer.id === lay.id)) {
431
- response = true;
432
- }
433
- }
434
- if ((this.layersChecked.length === 1 && this.layersChecked[0].baseLayer) ||
435
- base === this.layersChecked.length) {
436
- response = false;
437
- }
438
- return response;
135
+ dropNodeError(details) {
136
+ this.messageService.alert(details.message, 'igo.geo.layer.layer', null, details.params);
439
137
  }
440
- /*
441
- * When multiple layers is selected but some may be allow to move
442
- */
443
- lowerableLayer(index) {
444
- if (index >
445
- this.layers.filter((lay) => lay.baseLayer !== true).length - 2) {
446
- return false;
447
- }
448
- if (this.layers[index + 1].options.check) {
449
- return this.lowerableLayer(index + 1);
138
+ dragStart() {
139
+ if (this.viewerOptions.mode === 'selection') {
140
+ return;
450
141
  }
451
- return true;
142
+ this.controller.clearSelection();
452
143
  }
453
- lowerLayers(layers, fromUi = true) {
454
- const layersToLower = [];
455
- for (const layer of layers) {
456
- const index = this.layers.findIndex((lay) => lay.id === layer.id);
457
- if (this.lowerableLayer(index)) {
458
- layersToLower.push(layer);
459
- }
460
- }
461
- this.map.lowerLayers(layersToLower);
462
- if (fromUi) {
463
- setTimeout(() => {
464
- const checkItems = this.elRef.nativeElement.getElementsByClassName('mat-checkbox-checked');
465
- const itemFocused = this.elRef.nativeElement.getElementsByClassName('igo-layer-item-focused');
466
- let targetToScroll;
467
- if (checkItems.length) {
468
- targetToScroll = checkItems[checkItems.length - 1];
469
- }
470
- if (itemFocused.length) {
471
- targetToScroll = itemFocused[0];
472
- }
473
- if (targetToScroll) {
474
- scrollIntoView(targetToScroll, {
475
- scrollMode: 'if-needed',
476
- behavior: 'smooth',
477
- block: 'end',
478
- inline: 'nearest'
479
- });
480
- }
481
- }, 100);
482
- }
144
+ handleNodeToggle(node) {
145
+ node.data.expanded = this.treeControl.isExpanded(node);
483
146
  }
484
- next() {
485
- this.change$.next();
147
+ findNodeByLayerId(id) {
148
+ return this.treeControl.dataNodes.find((node) => node.id === id);
486
149
  }
487
- computeLayers(layers) {
488
- let layersOut = this.filterLayers(layers);
489
- if (this.sortAlpha) {
490
- layersOut = this.sortLayersByTitle(layersOut);
491
- }
492
- else {
493
- layersOut = this.sortLayersByZindex(layersOut);
150
+ updateDatasource(layers) {
151
+ const expansionModel = this.treeControl.expansionModel;
152
+ this.dataSource.data = layers;
153
+ this.isInit
154
+ ? this.restoreModel(expansionModel, (node) => this.treeControl.expand(node))
155
+ : this.expandGroup(layers);
156
+ if (!this.isInit && layers.length) {
157
+ this.isInit = true;
494
158
  }
495
- return layersOut;
496
- }
497
- onKeywordChange(term) {
498
- this.keyword = term;
499
159
  }
500
- onAppliedFilterAndSortChange(appliedFilter) {
501
- this.keyword = appliedFilter.keyword;
502
- this.onlyVisible = appliedFilter.onlyVisible;
503
- this.sortAlpha = appliedFilter.sortAlpha;
504
- }
505
- filterLayers(layers) {
506
- if (this.layerFilterAndSortOptions.showToolbar === LayerListControlsEnum.never) {
507
- return layers;
508
- }
509
- if (!this.keyword && !this.onlyVisible) {
510
- return layers;
511
- }
512
- const keepLayerIds = layers.map((layer) => layer.id);
160
+ /** Recursive */
161
+ expandGroup(layers) {
513
162
  layers.forEach((layer) => {
514
- const layerOptions = layer.options || {};
515
- const dataSourceOptions = layer.dataSource.options || {};
516
- const metadata = layerOptions.metadata || {};
517
- const keywords = metadata.keywordList || [];
518
- const layerKeywords = keywords.map((kw) => {
519
- return kw.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
520
- });
521
- if (this.keyword && layer.title) {
522
- const localKeyword = this.keyword
523
- .normalize('NFD')
524
- .replace(/[\u0300-\u036f]/g, '');
525
- const layerTitle = layer.title
526
- .normalize('NFD')
527
- .replace(/[\u0300-\u036f]/g, '');
528
- const dataSourceType = dataSourceOptions.type || '';
529
- const keywordRegex = new RegExp(localKeyword, 'gi');
530
- const keywordInList = layerKeywords.find((kw) => keywordRegex.test(kw)) !==
531
- undefined;
532
- if (!keywordRegex.test(layerTitle) &&
533
- !(this.keyword.toLowerCase() === dataSourceType.toLowerCase()) &&
534
- !keywordInList) {
535
- const index = keepLayerIds.indexOf(layer.id);
536
- if (index > -1) {
537
- keepLayerIds.splice(index, 1);
538
- }
539
- }
163
+ if (!isLayerGroup(layer)) {
164
+ return;
540
165
  }
541
- if (this.onlyVisible && layer.visible === false) {
542
- const index = keepLayerIds.indexOf(layer.id);
543
- if (index > -1) {
544
- keepLayerIds.splice(index, 1);
166
+ if (layer.expanded) {
167
+ const node = this.findNodeByLayerId(layer.id);
168
+ if (!node) {
169
+ return;
545
170
  }
171
+ this.treeControl.expand(node);
546
172
  }
173
+ this.expandGroup(layer.children);
547
174
  });
548
- return layers.filter((layer) => keepLayerIds.indexOf(layer.id) !== -1);
549
- }
550
- sortLayersByZindex(layers) {
551
- return layers.sort((layer1, layer2) => layer2.zIndex - layer1.zIndex);
552
175
  }
553
- sortLayersByTitle(layers) {
554
- return layers.sort((a, b) => {
555
- if (this.normalize(a.title) < this.normalize(b.title)) {
556
- return -1;
176
+ restoreModel(model, callback) {
177
+ const ids = Array.from(model['_selection']).map((value) => value['id']);
178
+ model.clear();
179
+ this.treeControl.dataNodes.forEach((node) => {
180
+ if (model.isSelected(node) || ids.includes(node.id)) {
181
+ callback(node);
557
182
  }
558
- if (this.normalize(a.title) > this.normalize(b.title)) {
559
- return 1;
560
- }
561
- return 0;
562
183
  });
563
184
  }
564
- normalize(str) {
565
- return str
566
- .normalize('NFD')
567
- .replace(/[\u0300-\u036f]/g, '')
568
- .toLowerCase();
569
- }
570
- computeShowToolbar() {
571
- switch (this.layerFilterAndSortOptions.showToolbar) {
572
- case LayerListControlsEnum.always:
573
- return true;
574
- case LayerListControlsEnum.never:
575
- return false;
576
- default:
577
- if (this.layers.length >= this.thresholdToFilterAndSort ||
578
- this.keyword ||
579
- this.onlyVisible) {
580
- return true;
581
- }
582
- return false;
583
- }
584
- }
585
- toggleLayerTool(layer) {
586
- this.toggleOpacity = false;
587
- if (this.layerTool && layer === this.activeLayer) {
588
- this.layerTool = false;
589
- }
590
- else {
591
- this.layerTool = true;
592
- }
593
- for (const lay of this.layers) {
594
- lay.options.active = false;
595
- }
596
- layer.options.active = true;
597
- this.activeLayer = layer;
598
- }
599
- removeLayers(layers) {
600
- if (layers && layers.length > 0) {
601
- this.layersChecked = [];
602
- for (const layer of layers) {
603
- if (layer.options.removable !== false) {
604
- layer.map.removeLayer(layer);
605
- }
606
- else {
607
- this.layersChecked.push(layer);
608
- }
609
- }
610
- }
611
- else if (!layers && this.activeLayer.options.removable !== false) {
612
- this.activeLayer.map.removeLayer(this.activeLayer);
613
- this.layerTool = false;
614
- }
615
- }
616
- toggleVisibility(layers) {
617
- if (layers && layers.length > 0) {
618
- for (const layer of layers) {
619
- layer.visible = this.hideSelectedLayers;
620
- }
621
- }
622
- this.layerItemChangeDetection$.next(true);
623
- }
624
- isLayerRemovable(layer) {
625
- return layer.options.removable !== false;
626
- }
627
- isAllLayersRemovable(layers) {
628
- return layers.every((l) => this.isLayerRemovable(l));
629
- }
630
- get statusSelectedLayersCheck() {
631
- let statusSelectedLayers = LayerListSelectVisibleEnum.NULL;
632
- let findTrue = false;
633
- let findFalse = false;
634
- if (this.layersChecked.length === 0) {
635
- statusSelectedLayers = LayerListSelectVisibleEnum.NULL;
636
- }
637
- else {
638
- statusSelectedLayers = LayerListSelectVisibleEnum.MIXED;
639
- this.hideSelectedLayers = false;
640
- for (const layer2 of this.layersChecked) {
641
- if (layer2.visible === true) {
642
- findTrue = true;
643
- }
644
- if (layer2.visible === false) {
645
- findFalse = true;
646
- }
647
- }
648
- if (findTrue === true && findFalse === false) {
649
- statusSelectedLayers = LayerListSelectVisibleEnum.ALL_VISIBLE;
650
- }
651
- if (findTrue === false && findFalse === true) {
652
- statusSelectedLayers = LayerListSelectVisibleEnum.ALL_HIDDEN;
653
- this.hideSelectedLayers = true;
654
- }
655
- }
656
- return statusSelectedLayers;
657
- }
658
- layersCheck(event) {
659
- event.layer.options.check = event.check;
660
- if (event.check === true) {
661
- const eventMapIndex = this.layers.findIndex((layer) => event.layer.id === layer.id);
662
- for (const layer of this.layersChecked) {
663
- const mapIndex = this.layers.findIndex((lay) => layer.id === lay.id);
664
- if (eventMapIndex < mapIndex) {
665
- this.layersChecked.splice(this.layersChecked.findIndex((lay) => layer.id === lay.id), 0, event.layer);
666
- if (this.excludeBaseLayers) {
667
- if (this.layersChecked.length ===
668
- this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length) {
669
- this.selectAllCheck = true;
670
- }
671
- else {
672
- this.selectAllCheck = false;
673
- }
674
- }
675
- else if (!this.excludeBaseLayers) {
676
- if (this.layersChecked.length ===
677
- this.layers.filter((lay) => lay.showInLayerList).length) {
678
- this.selectAllCheck = true;
679
- }
680
- else {
681
- this.selectAllCheck = false;
682
- }
683
- }
684
- return;
685
- }
686
- }
687
- this.layersChecked.push(event.layer);
688
- }
689
- else {
690
- const index = this.layersChecked.findIndex((layer) => event.layer.id === layer.id);
691
- this.layersChecked.splice(index, 1);
692
- }
693
- if (this.excludeBaseLayers) {
694
- if (this.layersChecked.length ===
695
- this.layers.filter((lay) => lay.baseLayer !== true && lay.showInLayerList).length) {
696
- this.selectAllCheck = true;
697
- }
698
- else {
699
- this.selectAllCheck = false;
700
- }
701
- }
702
- else if (!this.excludeBaseLayers) {
703
- if (this.layersChecked.length ===
704
- this.layers.filter((lay) => lay.showInLayerList).length) {
705
- this.selectAllCheck = true;
706
- }
707
- else {
708
- this.selectAllCheck = false;
709
- }
710
- }
711
- }
712
- toggleSelectionMode(value) {
713
- this.selection = value;
714
- this.activeLayer = undefined;
715
- if (value === true) {
716
- this.layerTool = false;
717
- for (const layer of this.layers) {
718
- if (layer.options.check) {
719
- this.layersChecked.push(layer);
720
- }
721
- }
722
- }
723
- }
724
- layersCheckedOpacity() {
725
- if (this.layersChecked.length > 1) {
726
- return 1;
727
- }
728
- else {
729
- const opacity = [];
730
- for (const layer of this.layersChecked) {
731
- opacity.push(layer.opacity);
732
- }
733
- return opacity;
734
- }
735
- }
736
- selectAll() {
737
- if (!this.selectAllCheck) {
738
- for (const layer of this.layers) {
739
- if (this.excludeBaseLayers &&
740
- layer.baseLayer !== true &&
741
- layer.showInLayerList) {
742
- layer.options.check = true;
743
- this.layersChecked.push(layer);
744
- }
745
- else if (!this.excludeBaseLayers && layer.showInLayerList) {
746
- layer.options.check = true;
747
- this.layersChecked.push(layer);
748
- }
749
- }
750
- this.selectAllCheck$.next(true);
751
- }
752
- else {
753
- for (const layer of this.layers) {
754
- layer.options.check = false;
755
- }
756
- this.layersChecked = [];
757
- this.selectAllCheck$.next(false);
758
- }
759
- }
760
- isScrolledIntoView(elemSource, elem) {
761
- const docViewTop = elemSource.scrollTop;
762
- const docViewBottom = docViewTop + elemSource.clientHeight;
763
- const elemTop = elem.offsetTop;
764
- const elemBottom = elemTop + elem.clientHeight;
765
- return elemBottom <= docViewBottom && elemTop >= docViewTop;
766
- }
767
- removeProblemLayerInList(layersList) {
768
- for (const layer of layersList) {
769
- if (layer.olLoadingProblem === true) {
770
- this.map.removeLayer(layer);
771
- }
772
- }
773
- return layersList;
774
- }
775
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
776
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LayerListComponent, isStandalone: true, selector: "igo-layer-list", inputs: { layersAreAllVisible: "layersAreAllVisible", ogcButton: "ogcButton", timeButton: "timeButton", map: "map", layers: "layers", floatLabel: "floatLabel", layerFilterAndSortOptions: "layerFilterAndSortOptions", excludeBaseLayers: "excludeBaseLayers", toggleLegendOnVisibilityChange: "toggleLegendOnVisibilityChange", expandLegendOfVisibleLayers: "expandLegendOfVisibleLayers", updateLegendOnResolutionChange: "updateLegendOnResolutionChange", queryBadge: "queryBadge" }, outputs: { appliedFilterAndSort: "appliedFilterAndSort" }, queries: [{ propertyName: "templateLayerToolbar", first: true, predicate: ["igoLayerItemToolbar"], descendants: true }], ngImport: i0, template: "<igo-layer-list-tool\n *ngIf=\"showToolbar$ | async\"\n floatLabel=\"auto\"\n [layersAreAllVisible]=\"layersAreAllVisible\"\n [term]=\"layerFilterAndSortOptions.keyword\"\n [onlyVisible]=\"layerFilterAndSortOptions.onlyVisible\"\n [sortAlpha]=\"layerFilterAndSortOptions.sortAlpha\"\n (appliedFilterAndSort)=\"onAppliedFilterAndSortChange($event)\"\n (selection)=\"toggleSelectionMode($event)\"\n>\n</igo-layer-list-tool>\n\n<div *ngIf=\"selection\" class=\"select-all\">\n <mat-checkbox\n class=\"select-all-checkbox\"\n [color]=\"!selectAllCheck && layersChecked.length > 0 ? 'accent' : 'primary'\"\n (change)=\"selectAll()\"\n [checked]=\"selectAllCheck\"\n [indeterminate]=\"!selectAllCheck && layersChecked.length > 0\"\n >\n {{\n selectAllCheck\n ? ('igo.geo.layer.deselectAll' | translate)\n : ('igo.geo.layer.selectAll' | translate)\n }}\n </mat-checkbox>\n</div>\n<mat-divider></mat-divider>\n\n<igo-list #igoList [navigation]=\"false\" [selection]=\"false\">\n <ng-template ngFor let-layer let-i=\"index\" [ngForOf]=\"layers$ | async\">\n <igo-layer-item\n *ngIf=\"!(excludeBaseLayers && layer.baseLayer)\"\n igoListItem\n [layer]=\"layer\"\n [activeLayer]=\"activeLayer\"\n [orderable]=\"orderable && !layer.baseLayer\"\n [lowerDisabled]=\"getLowerLayer().id === layer.id\"\n [raiseDisabled]=\"getUpperLayer().id === layer.id\"\n [queryBadge]=\"queryBadge\"\n [expandLegendIfVisible]=\"expandLegendOfVisibleLayers\"\n [updateLegendOnResolutionChange]=\"updateLegendOnResolutionChange\"\n [toggleLegendOnVisibilityChange]=\"toggleLegendOnVisibilityChange\"\n [selectionMode]=\"selection\"\n [selectAll]=\"selectAllCheck\"\n [layerCheck]=\"layer.options.check\"\n [changeDetection]=\"layerItemChangeDetection$\"\n (action)=\"toggleLayerTool($event)\"\n (checkbox)=\"layersCheck($event)\"\n >\n </igo-layer-item>\n </ng-template>\n</igo-list>\n\n<igo-panel\n *ngIf=\"!selection && layerTool && activeLayer\"\n class=\"igo-layer-actions-container\"\n [title]=\"activeLayer.title\"\n>\n <div class=\"igo-layer-button-group\">\n <button\n *ngIf=\"isLayerRemovable(activeLayer)\"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.removeLayer' | translate\"\n (click)=\"removeLayers()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Lower, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabled\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Raise, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabled\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <!-- <label>{{ 'igo.geo.layer.opacity' | translate }} </label> -->\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"badgeOpacity\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"medium\"\n >opacity</mat-icon\n >\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"panel-opacity-menu\">\n <mat-slider\n id=\"opacity-slider\"\n color=\"primary\"\n discrete\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n (click)=\"$event.stopPropagation()\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n #ngSlider\n ><input\n matSliderThumb\n [value]=\"opacity\"\n (input)=\"\n changeOpacity({\n source: ngSliderThumb,\n parent: ngSlider,\n value: ngSliderThumb.value\n })\n \"\n #ngSliderThumb=\"matSliderThumb\"\n />\n </mat-slider>\n </mat-menu>\n\n <button\n *ngIf=\"activeLayerExtentIsValid(activeLayer)\"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayer' | translate\"\n (click)=\"zoomLayerExtents(activeLayer)\"\n >\n <mat-icon matBadgeColor=\"primary\" matBadgeSize=\"medium\"\n >frame_inspect</mat-icon\n >\n </button>\n\n <ng-container\n igoLayerItemToolbar\n [ngTemplateOutlet]=\"templateLayerToolbar\"\n [ngTemplateOutletContext]=\"{ layer: activeLayer }\"\n >\n </ng-container>\n\n <ng-content select=\"[igoLayerItemToolbar]\"></ng-content>\n </div>\n</igo-panel>\n\n<igo-panel\n *ngIf=\"selection && layers.length > 0\"\n class=\"igo-layer-actions-container\"\n [title]=\"'igo.geo.layer.tools' | translate\"\n>\n <div class=\"actions-buttons-multi\">\n <button\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n isAllLayersRemovable(layersChecked)\n ? ('igo.geo.layer.removeSelectedLayers' | translate)\n : ('igo.geo.layer.removeSelectedLayersRestriction' | translate)\n \"\n (click)=\"removeLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"'!'\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"isAllLayersRemovable(layersChecked)\"\n >delete</mat-icon\n >\n </button>\n\n <button\n class=\"eye-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? ('igo.geo.layer.showSelectedLayers' | translate)\n : ('igo.geo.layer.hideSelectedLayers' | translate)\n \"\n (click)=\"toggleVisibility(layersChecked)\"\n >\n <mat-icon>{{\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? 'visibility_off'\n : 'visibility'\n }}</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabledSelection\"\n (click)=\"lowerLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabledSelection\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabledSelection\"\n (click)=\"raiseLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabledSelection\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon>opacity</mat-icon>\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"mat-menu-opacity-slider\">\n <div id=\"opacity-menu\">\n <!-- TODO: The 'tickInterval' property no longer exists -->\n <mat-slider\n *ngIf=\"layersChecked.length\"\n id=\"opacity-slider\"\n color=\"primary\"\n thumbLabel\n showTickMarks\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [(ngModel)]=\"checkOpacity\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n (click)=\"$event.stopPropagation()\"\n ><input matSliderThumb />\n </mat-slider>\n </div>\n </mat-menu>\n\n <button\n *ngIf=\"\n layersChecked.length !== 0 && activeLayersExtentAreValid(layersChecked)\n \"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayers' | translate\"\n (click)=\"zoomLayersExtents(layersChecked)\"\n >\n <mat-icon>frame_inspect</mat-icon>\n </button>\n </div>\n</igo-panel>\n", styles: [":host{display:flex;flex-direction:column;height:100%}:host igo-list{flex:1;padding-top:8px}:host mat-form-field.inputFilter{width:calc(100% - 100px);max-width:200px}:host .igo-layer-actions-container{padding:0 6px 0 4px}:host .igo-layer-actions-container>div{text-align:center}:host mat-list-item ::ng-deep .mdc-list-item__content{margin-bottom:10px}:host .igo-layer-button-group,:host .actions-buttons-multi{display:flex;align-items:center;flex-direction:row-reverse;overflow-x:auto;overflow-y:hidden}:host .igo-layer-button-group::-webkit-scrollbar,:host .actions-buttons-multi::-webkit-scrollbar{height:4px}:host .igo-layer-button-group::-webkit-scrollbar-track,:host .actions-buttons-multi::-webkit-scrollbar-track{background:#f1f1f1}:host .igo-layer-button-group::-webkit-scrollbar-thumb,:host .actions-buttons-multi::-webkit-scrollbar-thumb{background:#888}:host .igo-layer-button-group::-webkit-scrollbar-thumb:hover,:host .actions-buttons-multi::-webkit-scrollbar-thumb:hover{background:#555}:host .igo-layer-button-group{padding-top:5px}:host igo-panel{height:unset}:host .select-all{display:flex;align-items:center;height:48px;padding:0 16px}::ng-deep .panel-opacity-menu{overflow:visible!important}::ng-deep .panel-opacity-menu #opacity-slider{margin:0 16px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LayerListToolComponent, selector: "igo-layer-list-tool", inputs: ["layersAreAllVisible", "floatLabel", "onlyVisible", "sortAlpha", "term"], outputs: ["appliedFilterAndSort", "selection"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i2.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: ListComponent, selector: "igo-list", inputs: ["navigation", "selection"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: LayerItemComponent, selector: "igo-layer-item", inputs: ["activeLayer", "selectAll", "layerCheck", "layer", "toggleLegendOnVisibilityChange", "expandLegendIfVisible", "updateLegendOnResolutionChange", "orderable", "lowerDisabled", "raiseDisabled", "queryBadge", "selectionMode", "changeDetection"], outputs: ["action", "checkbox"] }, { kind: "directive", type: ListItemDirective, selector: "[igoListItem]", inputs: ["color", "focused", "selected", "disabled"], outputs: ["beforeSelect", "beforeFocus", "beforeUnselect", "beforeUnfocus", "beforeDisable", "beforeEnable", "focus", "unfocus", "select", "unselect", "disable", "enable"] }, { kind: "component", type: PanelComponent, selector: "igo-panel", inputs: ["title", "withHeader", "cursorPointer"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i6.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i8.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i8.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
185
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, deps: [{ token: i1.MessageService }], target: i0.ɵɵFactoryTarget.Component });
186
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LayerListComponent, isStandalone: true, selector: "igo-layer-list", inputs: { controller: "controller", layers: "layers", isDesktop: "isDesktop", isDragDropDisabled: "isDragDropDisabled", selectAll: "selectAll", viewerOptions: "viewerOptions" }, outputs: { activeChange: "activeChange" }, ngImport: i0, template: "<mat-tree\n [class.--not-desktop]=\"!isDesktop\"\n igoTreeDragDrop\n [treeDragDropIsDisabled]=\"isDragDropDisabled\"\n [maxLevel]=\"viewerOptions?.group?.maxHierarchyLevel\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n (dragStart)=\"dragStart()\"\n (onDrop)=\"dropNode($event)\"\n (onDropError)=\"dropNodeError($event)\"\n>\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-item\n [matTreeNodePadding]=\"node.level === 0 ? 1 : node.level\"\n [matTreeNodePaddingIndent]=\"node.level === 0 ? 16 : 24 + 16 / node.level\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [visible]=\"node.data.visible\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n </igo-layer-item>\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: isGroup\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-group\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"24\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (expand)=\"treeControl.toggle(node); handleNodeToggle(node)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"layer-indicator\"\n [attr.aria-label]=\"'Toggle ' + node.data.title\"\n (click)=\"handleNodeToggle(node)\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{\n treeControl.isExpanded(node)\n ? 'keyboard_arrow_down'\n : 'keyboard_arrow_right'\n }}\n </mat-icon>\n </button>\n </igo-layer-group>\n </mat-tree-node>\n</mat-tree>\n", styles: [".--not-desktop igo-layer-group ::ng-deep .list-secondary-actions button,.--not-desktop igo-layer-item ::ng-deep .list-secondary-actions button{visibility:visible!important}.tree-node-item{flex:1}mat-tree-node{position:relative;min-height:40px}mat-tree-node:hover:after,mat-tree-node.--drag-hover:after{content:\"\";position:absolute;inset:0;border-style:solid;border-width:1px;border-color:transparent;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: TreeDragDropDirective, selector: "[igoTreeDragDrop]", inputs: ["treeControl", "maxLevel", "treeDragDropIsDisabled"], outputs: ["dragStart", "onDrop", "onDropError"] }, { kind: "component", type: LayerGroupComponent, selector: "igo-layer-group", inputs: ["layer", "viewerOptions", "selected", "selectionDisabled"], outputs: ["action", "visibilityChange", "expand", "selectChange"] }, { kind: "component", type: LayerItemComponent, selector: "igo-layer-item", inputs: ["layer", "visible", "selected", "selectionDisabled", "viewerOptions"], outputs: ["action", "selectChange", "visibilityChange"] }, { kind: "ngmodule", type: IgoLanguageModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
777
187
  }
778
188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayerListComponent, decorators: [{
779
189
  type: Component,
780
190
  args: [{ selector: 'igo-layer-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
781
191
  NgIf,
782
- LayerListToolComponent,
192
+ NgFor,
193
+ NgTemplateOutlet,
194
+ FormsModule,
195
+ AsyncPipe,
196
+ MatBadgeModule,
197
+ MatButtonModule,
783
198
  MatCheckboxModule,
784
199
  MatDividerModule,
200
+ MatIconModule,
201
+ MatMenuModule,
202
+ MatSliderModule,
203
+ MatTreeModule,
204
+ MatTooltipModule,
205
+ TreeDragDropDirective,
206
+ LayerListToolComponent,
207
+ LayerGroupComponent,
785
208
  ListComponent,
786
- NgFor,
787
209
  LayerItemComponent,
788
210
  ListItemDirective,
789
211
  PanelComponent,
790
- MatButtonModule,
791
- MatTooltipModule,
792
- MatIconModule,
793
- MatBadgeModule,
794
- MatMenuModule,
795
- MatSliderModule,
796
- NgTemplateOutlet,
797
- FormsModule,
798
- AsyncPipe,
799
- IgoLanguageModule
800
- ], template: "<igo-layer-list-tool\n *ngIf=\"showToolbar$ | async\"\n floatLabel=\"auto\"\n [layersAreAllVisible]=\"layersAreAllVisible\"\n [term]=\"layerFilterAndSortOptions.keyword\"\n [onlyVisible]=\"layerFilterAndSortOptions.onlyVisible\"\n [sortAlpha]=\"layerFilterAndSortOptions.sortAlpha\"\n (appliedFilterAndSort)=\"onAppliedFilterAndSortChange($event)\"\n (selection)=\"toggleSelectionMode($event)\"\n>\n</igo-layer-list-tool>\n\n<div *ngIf=\"selection\" class=\"select-all\">\n <mat-checkbox\n class=\"select-all-checkbox\"\n [color]=\"!selectAllCheck && layersChecked.length > 0 ? 'accent' : 'primary'\"\n (change)=\"selectAll()\"\n [checked]=\"selectAllCheck\"\n [indeterminate]=\"!selectAllCheck && layersChecked.length > 0\"\n >\n {{\n selectAllCheck\n ? ('igo.geo.layer.deselectAll' | translate)\n : ('igo.geo.layer.selectAll' | translate)\n }}\n </mat-checkbox>\n</div>\n<mat-divider></mat-divider>\n\n<igo-list #igoList [navigation]=\"false\" [selection]=\"false\">\n <ng-template ngFor let-layer let-i=\"index\" [ngForOf]=\"layers$ | async\">\n <igo-layer-item\n *ngIf=\"!(excludeBaseLayers && layer.baseLayer)\"\n igoListItem\n [layer]=\"layer\"\n [activeLayer]=\"activeLayer\"\n [orderable]=\"orderable && !layer.baseLayer\"\n [lowerDisabled]=\"getLowerLayer().id === layer.id\"\n [raiseDisabled]=\"getUpperLayer().id === layer.id\"\n [queryBadge]=\"queryBadge\"\n [expandLegendIfVisible]=\"expandLegendOfVisibleLayers\"\n [updateLegendOnResolutionChange]=\"updateLegendOnResolutionChange\"\n [toggleLegendOnVisibilityChange]=\"toggleLegendOnVisibilityChange\"\n [selectionMode]=\"selection\"\n [selectAll]=\"selectAllCheck\"\n [layerCheck]=\"layer.options.check\"\n [changeDetection]=\"layerItemChangeDetection$\"\n (action)=\"toggleLayerTool($event)\"\n (checkbox)=\"layersCheck($event)\"\n >\n </igo-layer-item>\n </ng-template>\n</igo-list>\n\n<igo-panel\n *ngIf=\"!selection && layerTool && activeLayer\"\n class=\"igo-layer-actions-container\"\n [title]=\"activeLayer.title\"\n>\n <div class=\"igo-layer-button-group\">\n <button\n *ngIf=\"isLayerRemovable(activeLayer)\"\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.removeLayer' | translate\"\n (click)=\"removeLayers()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Lower, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabled\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabled\"\n (click)=\"moveActiveLayer(activeLayer, layerListDisplacement.Raise, true)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabled\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <!-- <label>{{ 'igo.geo.layer.opacity' | translate }} </label> -->\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"badgeOpacity\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"medium\"\n >opacity</mat-icon\n >\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"panel-opacity-menu\">\n <mat-slider\n id=\"opacity-slider\"\n color=\"primary\"\n discrete\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n (click)=\"$event.stopPropagation()\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n #ngSlider\n ><input\n matSliderThumb\n [value]=\"opacity\"\n (input)=\"\n changeOpacity({\n source: ngSliderThumb,\n parent: ngSlider,\n value: ngSliderThumb.value\n })\n \"\n #ngSliderThumb=\"matSliderThumb\"\n />\n </mat-slider>\n </mat-menu>\n\n <button\n *ngIf=\"activeLayerExtentIsValid(activeLayer)\"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayer' | translate\"\n (click)=\"zoomLayerExtents(activeLayer)\"\n >\n <mat-icon matBadgeColor=\"primary\" matBadgeSize=\"medium\"\n >frame_inspect</mat-icon\n >\n </button>\n\n <ng-container\n igoLayerItemToolbar\n [ngTemplateOutlet]=\"templateLayerToolbar\"\n [ngTemplateOutletContext]=\"{ layer: activeLayer }\"\n >\n </ng-container>\n\n <ng-content select=\"[igoLayerItemToolbar]\"></ng-content>\n </div>\n</igo-panel>\n\n<igo-panel\n *ngIf=\"selection && layers.length > 0\"\n class=\"igo-layer-actions-container\"\n [title]=\"'igo.geo.layer.tools' | translate\"\n>\n <div class=\"actions-buttons-multi\">\n <button\n class=\"delete-button\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n isAllLayersRemovable(layersChecked)\n ? ('igo.geo.layer.removeSelectedLayers' | translate)\n : ('igo.geo.layer.removeSelectedLayersRestriction' | translate)\n \"\n (click)=\"removeLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"'!'\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"isAllLayersRemovable(layersChecked)\"\n >delete</mat-icon\n >\n </button>\n\n <button\n class=\"eye-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matTooltip]=\"\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? ('igo.geo.layer.showSelectedLayers' | translate)\n : ('igo.geo.layer.hideSelectedLayers' | translate)\n \"\n (click)=\"toggleVisibility(layersChecked)\"\n >\n <mat-icon>{{\n statusSelectedLayersCheck === 'ALL_HIDDEN'\n ? 'visibility_off'\n : 'visibility'\n }}</mat-icon>\n </button>\n\n <button\n class=\"down-button\"\n mat-icon-button\n color=\"primary\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterLowerLayer' | translate)\n : ('igo.geo.layer.lowerLayer' | translate)\n \"\n [disabled]=\"lowerDisabledSelection\"\n (click)=\"lowerLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"lowerDisabledSelection\"\n >arrow_downward</mat-icon\n >\n </button>\n\n <button\n class=\"up-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n sortAlpha || onlyVisible || keyword\n ? ('igo.geo.layer.filterRaiseLayer' | translate)\n : ('igo.geo.layer.raiseLayer' | translate)\n \"\n [disabled]=\"raiseDisabledSelection\"\n (click)=\"raiseLayers(layersChecked)\"\n >\n <mat-icon\n aria-hidden=\"false\"\n [matBadge]=\"sortAlpha || onlyVisible || keyword ? '!' : ''\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\"\n [matBadgeHidden]=\"raiseDisabledSelection\"\n >arrow_upward</mat-icon\n >\n </button>\n\n <button\n class=\"opacity-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [disabled]=\"layersChecked.length === 0\"\n [matMenuTriggerFor]=\"opacityMenu\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n >\n <mat-icon>opacity</mat-icon>\n </button>\n\n <mat-menu #opacityMenu=\"matMenu\" class=\"mat-menu-opacity-slider\">\n <div id=\"opacity-menu\">\n <!-- TODO: The 'tickInterval' property no longer exists -->\n <mat-slider\n *ngIf=\"layersChecked.length\"\n id=\"opacity-slider\"\n color=\"primary\"\n thumbLabel\n showTickMarks\n step=\"5\"\n [min]=\"0\"\n [max]=\"100\"\n [(ngModel)]=\"checkOpacity\"\n [matTooltip]=\"'igo.geo.layer.opacity' | translate\"\n matTooltipShowDelay=\"500\"\n tooltip-position=\"below\"\n (click)=\"$event.stopPropagation()\"\n ><input matSliderThumb />\n </mat-slider>\n </div>\n </mat-menu>\n\n <button\n *ngIf=\"\n layersChecked.length !== 0 && activeLayersExtentAreValid(layersChecked)\n \"\n class=\"zoomLayer-button\"\n color=\"primary\"\n mat-icon-button\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.layer.zoomLayers' | translate\"\n (click)=\"zoomLayersExtents(layersChecked)\"\n >\n <mat-icon>frame_inspect</mat-icon>\n </button>\n </div>\n</igo-panel>\n", styles: [":host{display:flex;flex-direction:column;height:100%}:host igo-list{flex:1;padding-top:8px}:host mat-form-field.inputFilter{width:calc(100% - 100px);max-width:200px}:host .igo-layer-actions-container{padding:0 6px 0 4px}:host .igo-layer-actions-container>div{text-align:center}:host mat-list-item ::ng-deep .mdc-list-item__content{margin-bottom:10px}:host .igo-layer-button-group,:host .actions-buttons-multi{display:flex;align-items:center;flex-direction:row-reverse;overflow-x:auto;overflow-y:hidden}:host .igo-layer-button-group::-webkit-scrollbar,:host .actions-buttons-multi::-webkit-scrollbar{height:4px}:host .igo-layer-button-group::-webkit-scrollbar-track,:host .actions-buttons-multi::-webkit-scrollbar-track{background:#f1f1f1}:host .igo-layer-button-group::-webkit-scrollbar-thumb,:host .actions-buttons-multi::-webkit-scrollbar-thumb{background:#888}:host .igo-layer-button-group::-webkit-scrollbar-thumb:hover,:host .actions-buttons-multi::-webkit-scrollbar-thumb:hover{background:#555}:host .igo-layer-button-group{padding-top:5px}:host igo-panel{height:unset}:host .select-all{display:flex;align-items:center;height:48px;padding:0 16px}::ng-deep .panel-opacity-menu{overflow:visible!important}::ng-deep .panel-opacity-menu #opacity-slider{margin:0 16px}\n"] }]
801
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { templateLayerToolbar: [{
802
- type: ContentChild,
803
- args: ['igoLayerItemToolbar', /* TODO: add static flag */ {}]
804
- }], layersAreAllVisible: [{
805
- type: Input
806
- }], ogcButton: [{
807
- type: Input
808
- }], timeButton: [{
809
- type: Input
810
- }], map: [{
811
- type: Input
212
+ IgoLanguageModule,
213
+ IgoIconComponent
214
+ ], template: "<mat-tree\n [class.--not-desktop]=\"!isDesktop\"\n igoTreeDragDrop\n [treeDragDropIsDisabled]=\"isDragDropDisabled\"\n [maxLevel]=\"viewerOptions?.group?.maxHierarchyLevel\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n (dragStart)=\"dragStart()\"\n (onDrop)=\"dropNode($event)\"\n (onDropError)=\"dropNodeError($event)\"\n>\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-item\n [matTreeNodePadding]=\"node.level === 0 ? 1 : node.level\"\n [matTreeNodePaddingIndent]=\"node.level === 0 ? 16 : 24 + 16 / node.level\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [visible]=\"node.data.visible\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n </igo-layer-item>\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: isGroup\"\n [class.--selected]=\"isSelected(node.data)\"\n [class.--children-selected]=\"isDescendantSelection(node.data)\"\n >\n <igo-layer-group\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"24\"\n class=\"tree-node-item\"\n [layer]=\"node.data\"\n [viewerOptions]=\"viewerOptions\"\n [selected]=\"isSelected(node.data) || isDescendantSelection(node.data)\"\n [selectionDisabled]=\"isDescendantSelection(node.data)\"\n (action)=\"toggleActive($event)\"\n (expand)=\"treeControl.toggle(node); handleNodeToggle(node)\"\n (selectChange)=\"handleSelect($event, node.data)\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"layer-indicator\"\n [attr.aria-label]=\"'Toggle ' + node.data.title\"\n (click)=\"handleNodeToggle(node)\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{\n treeControl.isExpanded(node)\n ? 'keyboard_arrow_down'\n : 'keyboard_arrow_right'\n }}\n </mat-icon>\n </button>\n </igo-layer-group>\n </mat-tree-node>\n</mat-tree>\n", styles: [".--not-desktop igo-layer-group ::ng-deep .list-secondary-actions button,.--not-desktop igo-layer-item ::ng-deep .list-secondary-actions button{visibility:visible!important}.tree-node-item{flex:1}mat-tree-node{position:relative;min-height:40px}mat-tree-node:hover:after,mat-tree-node.--drag-hover:after{content:\"\";position:absolute;inset:0;border-style:solid;border-width:1px;border-color:transparent;pointer-events:none}\n"] }]
215
+ }], ctorParameters: () => [{ type: i1.MessageService }], propDecorators: { controller: [{
216
+ type: Input,
217
+ args: [{ required: true }]
812
218
  }], layers: [{
219
+ type: Input,
220
+ args: [{ required: true }]
221
+ }], isDesktop: [{
813
222
  type: Input
814
- }], floatLabel: [{
815
- type: Input
816
- }], layerFilterAndSortOptions: [{
817
- type: Input
818
- }], excludeBaseLayers: [{
819
- type: Input
820
- }], toggleLegendOnVisibilityChange: [{
821
- type: Input
822
- }], expandLegendOfVisibleLayers: [{
223
+ }], isDragDropDisabled: [{
823
224
  type: Input
824
- }], updateLegendOnResolutionChange: [{
225
+ }], selectAll: [{
825
226
  type: Input
826
- }], queryBadge: [{
227
+ }], viewerOptions: [{
827
228
  type: Input
828
- }], appliedFilterAndSort: [{
229
+ }], activeChange: [{
829
230
  type: Output
830
231
  }] } });
831
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9sYXllci1saXN0L2xheWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvbGF5ZXItbGlzdC9sYXllci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQW1CLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFP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QUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxTQUFTO3dCQUNULGlCQUFpQjtxQkFDbEI7K0VBeUJELG9CQUFvQjtzQkFEbkIsWUFBWTt1QkFBQyxxQkFBcUIsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFO2dCQUcxRCxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdGLEdBQUc7c0JBRE4sS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUs7Z0JBbUJHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBRUcsMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUVHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdERpdmlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaXZpZGVyJztcbmltcG9ydCB7IEZsb2F0TGFiZWxUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRTbGlkZXJDaGFuZ2UsIE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IExpc3RDb21wb25lbnQsIExpc3RJdGVtRGlyZWN0aXZlIH0gZnJvbSAnQGlnbzIvY29tbW9uL2xpc3QnO1xuaW1wb3J0IHsgUGFuZWxDb21wb25lbnQgfSBmcm9tICdAaWdvMi9jb21tb24vcGFuZWwnO1xuaW1wb3J0IHsgSWdvTGFuZ3VhZ2VNb2R1bGUgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcblxuaW1wb3J0ICogYXMgb2xleHRlbnQgZnJvbSAnb2wvZXh0ZW50JztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBFTVBUWSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICB0aW1lclxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHNjcm9sbEludG9WaWV3IGZyb20gJ3Njcm9sbC1pbnRvLXZpZXctaWYtbmVlZGVkJztcblxuaW1wb3J0IHtcbiAgZ2V0QWxsQ2hpbGRMYXllcnNCeVByb3BlcnR5LFxuICBnZXRSb290UGFyZW50QnlQcm9wZXJ0eVxufSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL2xpbmtlZExheWVycy51dGlscyc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQge1xuICBNZXRhZGF0YUxheWVyT3B0aW9ucyxcbiAgTWV0YWRhdGFPcHRpb25zXG59IGZyb20gJy4uLy4uL21ldGFkYXRhL3NoYXJlZC9tZXRhZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItaXRlbS9sYXllci1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYXllckxpc3RUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sL2xheWVyLWxpc3QtdG9vbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zIH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sL2xheWVyLWxpc3QtdG9vbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyJztcbmltcG9ydCB7IExpbmtlZFByb3BlcnRpZXMgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMYXllckxpc3RDb250cm9sc0VudW0sXG4gIExheWVyTGlzdERpc3BsYWNlbWVudFxufSBmcm9tICcuL2xheWVyLWxpc3QuZW51bSc7XG5pbXBvcnQgeyBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSB9IGZyb20gJy4vbGF5ZXItbGlzdC5lbnVtJztcblxuLy8gVE9ETzogVGhpcyBjbGFzcyBjb3VsZCB1c2UgYSBjbGVhbiB1cC4gQWxzbywgc29tZSBtZXRob2RzIGNvdWxkIGJlIG1vdmVkIGVhbHNld2hlcmVcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1sYXllci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xheWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYXllci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBMYXllckxpc3RUb29sQ29tcG9uZW50LFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdERpdmlkZXJNb2R1bGUsXG4gICAgTGlzdENvbXBvbmVudCxcbiAgICBOZ0ZvcixcbiAgICBMYXllckl0ZW1Db21wb25lbnQsXG4gICAgTGlzdEl0ZW1EaXJlY3RpdmUsXG4gICAgUGFuZWxDb21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRCYWRnZU1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdFNsaWRlck1vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBJZ29MYW5ndWFnZU1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExheWVyTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgb3JkZXJhYmxlID0gdHJ1ZTtcbiAgdGhyZXNob2xkVG9GaWx0ZXJBbmRTb3J0ID0gNTtcblxuICBsYXllcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYXllcltdPihbXSk7XG5cbiAgY2hhbmdlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuXG4gIHNob3dUb29sYmFyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyBsYXllclRvb2w6IGJvb2xlYW47XG5cbiAgcHVibGljIGhpZGVTZWxlY3RlZExheWVycyA9IHRydWU7XG4gIGFjdGl2ZUxheWVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGF5ZXI+KHVuZGVmaW5lZCk7XG5cbiAgbGF5ZXJzQ2hlY2tlZDogTGF5ZXJbXSA9IFtdO1xuICBwdWJsaWMgc2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIHByaXZhdGUgY2hhbmdlJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBsYXllcnMkJDogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgbGF5ZXJJdGVtQ2hhbmdlRGV0ZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcblxuICBAQ29udGVudENoaWxkKCdpZ29MYXllckl0ZW1Ub29sYmFyJywgLyogVE9ETzogYWRkIHN0YXRpYyBmbGFnICovIHt9KVxuICB0ZW1wbGF0ZUxheWVyVG9vbGJhcjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKSBsYXllcnNBcmVBbGxWaXNpYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBvZ2NCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHRpbWVCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtYXAoKTogSWdvTWFwIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwO1xuICB9XG4gIHNldCBtYXAodmFsdWU6IElnb01hcCkge1xuICAgIHRoaXMuX21hcCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX21hcDogSWdvTWFwO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsYXllcnModmFsdWU6IExheWVyW10pIHtcbiAgICB0aGlzLl9sYXllcnMgPSB0aGlzLnJlbW92ZVByb2JsZW1MYXllckluTGlzdCh2YWx1ZSk7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cbiAgZ2V0IGxheWVycygpOiBMYXllcltdIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5ZXJzO1xuICB9XG4gIHByaXZhdGUgX2xheWVyczogTGF5ZXJbXTtcblxuICBzZXQgYWN0aXZlTGF5ZXIodmFsdWU6IExheWVyKSB7XG4gICAgdGhpcy5fYWN0aXZlTGF5ZXIgPSB2YWx1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBnZXQgYWN0aXZlTGF5ZXIoKTogTGF5ZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVMYXllcjtcbiAgfVxuICBwcml2YXRlIF9hY3RpdmVMYXllcjogTGF5ZXI7XG5cbiAgQElucHV0KCkgZmxvYXRMYWJlbDogRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG5cbiAgQElucHV0KCkgbGF5ZXJGaWx0ZXJBbmRTb3J0T3B0aW9uczogTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zID0ge307XG5cbiAgQElucHV0KCkgZXhjbHVkZUJhc2VMYXllcnMgPSBmYWxzZTtcblxuICBASW5wdXQoKSB0b2dnbGVMZWdlbmRPblZpc2liaWxpdHlDaGFuZ2UgPSBmYWxzZTtcblxuICBASW5wdXQoKSBleHBhbmRMZWdlbmRPZlZpc2libGVMYXllcnMgPSBmYWxzZTtcblxuICBASW5wdXQoKSB1cGRhdGVMZWdlbmRPblJlc29sdXRpb25DaGFuZ2UgPSBmYWxzZTtcblxuICBASW5wdXQoKSBxdWVyeUJhZGdlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGFwcGxpZWRGaWx0ZXJBbmRTb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxMYXllckxpc3RDb250cm9sc09wdGlvbnM+KCk7XG5cbiAgZ2V0IGtleXdvcmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5d29yZDtcbiAgfVxuICBzZXQga2V5d29yZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fa2V5d29yZCA9IHZhbHVlO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX2tleXdvcmQgPSB1bmRlZmluZWQ7XG5cbiAgZ2V0IG9ubHlWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vbmx5VmlzaWJsZTtcbiAgfVxuICBzZXQgb25seVZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vbmx5VmlzaWJsZSA9IHZhbHVlO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX29ubHlWaXNpYmxlID0gZmFsc2U7XG5cbiAgZ2V0IHNvcnRBbHBoYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydGVkQWxwaGE7XG4gIH1cbiAgc2V0IHNvcnRBbHBoYSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NvcnRlZEFscGhhID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfc29ydGVkQWxwaGEgPSBmYWxzZTtcblxuICBnZXQgb3BhY2l0eSgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmFjdGl2ZUxheWVyJC5nZXRWYWx1ZSgpLm9wYWNpdHkgKiAxMDApO1xuICB9XG4gIHNldCBvcGFjaXR5KG9wYWNpdHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlTGF5ZXIkLmdldFZhbHVlKCkub3BhY2l0eSA9IG9wYWNpdHkgLyAxMDA7XG4gIH1cblxuICBnZXQgYmFkZ2VPcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLm9wYWNpdHkgPT09IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGFjaXR5O1xuICB9XG5cbiAgZ2V0IHJhaXNlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMub3JkZXJhYmxlIHx8XG4gICAgICB0aGlzLmFjdGl2ZUxheWVyLmJhc2VMYXllciB8fFxuICAgICAgdGhpcy5nZXRVcHBlckxheWVyKCkuaWQgPT09IHRoaXMuYWN0aXZlTGF5ZXIuaWQgfHxcbiAgICAgIHRoaXMuaXNVcHBlckJhc2VsYXllcih0aGlzLmFjdGl2ZUxheWVyKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBsb3dlckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLm9yZGVyYWJsZSB8fFxuICAgICAgdGhpcy5hY3RpdmVMYXllci5iYXNlTGF5ZXIgfHxcbiAgICAgIHRoaXMuZ2V0TG93ZXJMYXllcigpLmlkID09PSB0aGlzLmFjdGl2ZUxheWVyLmlkIHx8XG4gICAgICB0aGlzLmlzTG93ZXJCYXNlbGF5ZXIodGhpcy5hY3RpdmVMYXllcilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgcmFpc2VEaXNhYmxlZFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAhdGhpcy5vcmRlcmFibGUgfHxcbiAgICAgICF0aGlzLnJhaXNhYmxlTGF5ZXJzKHRoaXMubGF5ZXJzQ2hlY2tlZCkgfHxcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPT09IHRydWVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgbG93ZXJEaXNhYmxlZFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAhdGhpcy5vcmRlcmFibGUgfHxcbiAgICAgICF0aGlzLmxvd2VyYWJsZUxheWVycyh0aGlzLmxheWVyc0NoZWNrZWQpIHx8XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGNoZWNrT3BhY2l0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5sYXllcnNDaGVja2VkT3BhY2l0eSgpICogMTAwO1xuICB9XG4gIHNldCBjaGVja09wYWNpdHkob3BhY2l0eTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVyc0NoZWNrZWQpIHtcbiAgICAgIGxheWVyLm9wYWNpdHkgPSBvcGFjaXR5IC8gMTAwO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXllckxpc3REaXNwbGFjZW1lbnQoKTogdHlwZW9mIExheWVyTGlzdERpc3BsYWNlbWVudCB7XG4gICAgcmV0dXJuIExheWVyTGlzdERpc3BsYWNlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVPcGFjaXR5ID0gZmFsc2U7XG5cbiAgcHVibGljIHNlbGVjdEFsbENoZWNrOiBib29sZWFuO1xuICBwdWJsaWMgc2VsZWN0QWxsQ2hlY2skID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHNlbGVjdEFsbENoZWNrJCQ6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNlYXJjaCB0ZXJtIHN0cmVhbSBhbmQgdHJpZ2dlciByZXNlYXJjaGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2UkJCA9IHRoaXMuY2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sYXllcnMubGVuZ3RoID09PSAwID8gRU1QVFkgOiB0aW1lcig1MCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VG9vbGJhciQubmV4dCh0aGlzLmNvbXB1dGVTaG93VG9vbGJhcigpKTtcbiAgICAgICAgdGhpcy5sYXllcnMkLm5leHQodGhpcy5jb21wdXRlTGF5ZXJzKHRoaXMubGF5ZXJzLnNsaWNlKDApKSk7XG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlckFuZFNvcnQuZW1pdCh7XG4gICAgICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgICAgIHNvcnRBbHBoYTogdGhpcy5zb3J0QWxwaGEsXG4gICAgICAgICAgb25seVZpc2libGU6IHRoaXMub25seVZpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2skJCA9IHRoaXMuc2VsZWN0QWxsQ2hlY2skLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5ZXJzJCQgPSB0aGlzLmxheWVycyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmxheWVycykge1xuICAgICAgICBsZXQgY2hlY2tzID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICAgIGxheWVyLnN0YXR1cyQuc3Vic2NyaWJlKCh2YWxTdGF0dXMpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWxTdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYXllci5vcHRpb25zLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVMYXllciA9IGxheWVyO1xuICAgICAgICAgICAgdGhpcy5sYXllclRvb2wgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGF5ZXIub3B0aW9ucy5jaGVjaykge1xuICAgICAgICAgICAgY2hlY2tzICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9XG4gICAgICAgICAgICBjaGVja3MgPT09XG4gICAgICAgICAgICB0aGlzLmxheWVycy5maWx0ZXIoXG4gICAgICAgICAgICAgIChsYXkpID0+IGxheS5iYXNlTGF5ZXIgIT09IHRydWUgJiYgbGF5LnNob3dJbkxheWVyTGlzdFxuICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9XG4gICAgICAgICAgICBjaGVja3MgPT09IHRoaXMubGF5ZXJzLmZpbHRlcigobGF5KSA9PiBsYXkuc2hvd0luTGF5ZXJMaXN0KS5sZW5ndGhcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2hhbmdlJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlbGVjdEFsbENoZWNrJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmxheWVycyQkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhY3RpdmVMYXllckV4dGVudElzVmFsaWQobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgaWYgKGxheWVyLm9wdGlvbnMuc2hvd0J1dHRvblpvb21Ub0V4dGVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcbiAgICBjb25zdCBtYXhMYXllclpvb21FeHRlbnQgPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5tYXhMYXllclpvb21FeHRlbnQ7XG5cbiAgICBpZiAobGF5ZXJFeHRlbnQpIHtcbiAgICAgIGlmIChtYXhMYXllclpvb21FeHRlbnQpIHtcbiAgICAgICAgdmFsaWQgPSBvbGV4dGVudC5jb250YWluc0V4dGVudChtYXhMYXllclpvb21FeHRlbnQsIGxheWVyRXh0ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgYWN0aXZlTGF5ZXJzRXh0ZW50QXJlVmFsaWQobGF5ZXJzOiBMYXllcltdKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XG4gICAgY29uc3QgbGF5ZXJzRXh0ZW50ID0gb2xleHRlbnQuY3JlYXRlRW1wdHkoKTtcbiAgICBjb25zdCBtYXhMYXllclpvb21FeHRlbnQgPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5tYXhMYXllclpvb21FeHRlbnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcblxuICAgICAgaWYgKGxheWVyRXh0ZW50ICYmICFsYXllckV4dGVudC5pbmNsdWRlcyhJbmZpbml0eSkpIHtcbiAgICAgICAgb2xleHRlbnQuZXh0ZW5kKGxheWVyc0V4dGVudCwgbGF5ZXJFeHRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb2xleHRlbnQuaXNFbXB0eShsYXllcnNFeHRlbnQpKSB7XG4gICAgICBpZiAobWF4TGF5ZXJab29tRXh0ZW50KSB7XG4gICAgICAgIHZhbGlkID0gb2xleHRlbnQuY29udGFpbnNFeHRlbnQobWF4TGF5ZXJab29tRXh0ZW50LCBsYXllcnNFeHRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICB6b29tTGF5ZXJFeHRlbnRzKGxheWVyOiBMYXllcikge1xuICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLnpvb21Ub0V4dGVudChsYXllci5vcHRpb25zLmV4dGVudCk7XG4gIH1cblxuICB6b29tTGF5ZXJzRXh0ZW50cyhsYXllcnM6IExheWVyW10pIHtcbiAgICBjb25zdCBsYXllcnNFeHRlbnQgPSBvbGV4dGVudC5jcmVhdGVFbXB0eSgpIGFzIFtcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlcixcbiAgICAgIG51bWJlclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJFeHRlbnQgPSBsYXllci5vcHRpb25zLmV4dGVudDtcblxuICAgICAgaWYgKGxheWVyRXh0ZW50KSB7XG4gICAgICAgIG9sZXh0ZW50LmV4dGVuZChsYXllcnNFeHRlbnQsIGxheWVyRXh0ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuem9vbVRvRXh0ZW50KGxheWVyc0V4dGVudCk7XG4gIH1cblxuICBjaGFuZ2VPcGFjaXR5KGV2ZW50OiBNYXRTbGlkZXJDaGFuZ2UpIHtcbiAgICB0aGlzLm9wYWNpdHkgPSBldmVudC52YWx1ZTtcbiAgfVxuXG4gIGNsZWFyS2V5d29yZCgpIHtcbiAgICB0aGlzLmtleXdvcmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRMb3dlckxheWVyKCkge1xuICAgIHJldHVybiB0aGlzLmxheWVyc1xuICAgICAgLmZpbHRlcigobCkgPT4gIWwuYmFzZUxheWVyKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJldi56SW5kZXggPCBjdXJyZW50LnpJbmRleCA/IHByZXYgOiBjdXJyZW50O1xuICAgICAgICB9LFxuICAgICAgICB7IHpJbmRleDogdW5kZWZpbmVkLCBpZDogdW5kZWZpbmVkIH1cbiAgICAgICk7XG4gIH1cblxuICBpc0xvd2VyQmFzZWxheWVyKGxheWVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5maW5kSW5kZXgoKGxheSkgPT4gbGF5ZXIuaWQgPT09IGxheS5pZCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXllcnMgJiZcbiAgICAgIHRoaXMubGF5ZXJzW2luZGV4ICsgMV0gJiZcbiAgICAgIHRoaXMubGF5ZXJzW2luZGV4ICsgMV0uYmFzZUxheWVyID09PSB0cnVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0VXBwZXJMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgIC5maWx0ZXIoKGwpID0+ICFsLmJhc2VMYXllcilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByZXYuekluZGV4ID4gY3VycmVudC56SW5kZXggPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgfSxcbiAgICAgICAgeyB6SW5kZXg6IHVuZGVmaW5lZCwgaWQ6IHVuZGVmaW5lZCB9XG4gICAgICApO1xuICB9XG5cbiAgaXNVcHBlckJhc2VsYXllcihsYXllcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KChsYXkpID0+IGxheWVyLmlkID09PSBsYXkuaWQpO1xuICAgIGlmIChcbiAgICAgIHRoaXMubGF5ZXJzICYmXG4gICAgICB0aGlzLmxheWVyc1tpbmRleCAtIDFdICYmXG4gICAgICB0aGlzLmxheWVyc1tpbmRleCAtIDFdLmJhc2VMYXllciA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1vdmVBY3RpdmVMYXllcihcbiAgICBhY3RpdmVMYXllcjogTGF5ZXIsXG4gICAgYWN0aW9udHlwZTogTGF5ZXJMaXN0RGlzcGxhY2VtZW50LFxuICAgIGZyb21VaSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IHNvcnRlZExheWVyc1RvTW92ZSA9IFtdO1xuICAgIGdldFJvb3RQYXJlbnRCeVByb3BlcnR5KHRoaXMubWFwLCBhY3RpdmVMYXllciwgTGlua2VkUHJvcGVydGllcy5aSU5ERVgpO1xuICAgIGxldCByb290UGFyZW50QnlQcm9wZXJ0eSA9IGdldFJvb3RQYXJlbnRCeVByb3BlcnR5KFxuICAgICAgdGhpcy5tYXAsXG4gICAgICBhY3RpdmVMYXllcixcbiAgICAgIExpbmtlZFByb3BlcnRpZXMuWklOREVYXG4gICAgKTtcbiAgICBpZiAoIXJvb3RQYXJlbnRCeVByb3BlcnR5KSB7XG4gICAgICByb290UGFyZW50QnlQcm9wZXJ0eSA9IGFjdGl2ZUxheWVyO1xuICAgIH1cbiAgICBjb25zdCBsYXllcnNUb01vdmUgPSBbcm9vdFBhcmVudEJ5UHJvcGVydHldO1xuICAgIGdldEFsbENoaWxkTGF5ZXJzQnlQcm9wZXJ0eShcbiAgICAgIHRoaXMubWFwLFxuICAgICAgcm9vdFBhcmVudEJ5UHJvcGVydHksXG4gICAgICBsYXllcnNUb01vdmUsXG4gICAgICBMaW5rZWRQcm9wZXJ0aWVzLlpJTkRFWFxuICAgICk7XG5cbiAgICB0aGlzLmxheWVycy5tYXAoKGxheWVyKSA9PiB7XG4gICAgICBpZiAobGF5ZXJzVG9Nb3ZlLmluZGV4T2YobGF5ZXIpICE9PSAtMSkge1xuICAgICAgICBzb3J0ZWRMYXllcnNUb01vdmUucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYWN0aW9udHlwZSA9PT0gTGF5ZXJMaXN0RGlzcGxhY2VtZW50LlJhaXNlKSB7XG4gICAgICB0aGlzLnJhaXNlTGF5ZXJzKHNvcnRlZExheWVyc1RvTW92ZSwgZnJvbVVpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbnR5cGUgPT09IExheWVyTGlzdERpc3BsYWNlbWVudC5Mb3dlcikge1xuICAgICAgdGhpcy5sb3dlckxheWVycyhzb3J0ZWRMYXllcnNUb01vdmUsIGZyb21VaSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogRm9yIHNlbGVjdGlvbiBtb2RlIGRpc2FibGVkIGF0dHJpYnV0ZVxuICAgKi9cbiAgcmFpc2FibGVMYXllcnMobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBtYXBJbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXllci5pZCA9PT0gbGF5LmlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50TGF5ZXIuYmFzZUxheWVyKSB7XG4gICAgICAgIGJhc2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXNMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4IC0gMV07XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzTGF5ZXIgJiZcbiAgICAgICAgcHJldmlvdXNMYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgIWxheWVycy5maW5kKChsYXkpID0+IHByZXZpb3VzTGF5ZXIuaWQgPT09IGxheS5pZCkgJiZcbiAgICAgICAgY3VycmVudExheWVyLmJhc2VMYXllciAhPT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxheWVyc0NoZWNrZWRbMF0uYmFzZUxheWVyKSB8fFxuICAgICAgYmFzZSA9PT0gdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzcG9uc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLypcbiAgICogV2hlbiBtdWx0aXBsZSBsYXllcnMgaXMgc2VsZWN0ZWQgYnV0IHNvbWUgbWF5IGJlIGFsbG93IHRvIG1vdmVcbiAgICovXG4gIHJhaXNhYmxlTGF5ZXIoaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXllcnNbaW5kZXggLSAxXS5vcHRpb25zLmNoZWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYWlzYWJsZUxheWVyKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmFpc2VMYXllcnMobGF5ZXJzOiBMYXllcltdLCBmcm9tVWkgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5ZXJzVG9SYWlzZSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXkuaWQgPT09IGxheWVyLmlkKTtcbiAgICAgIGlmICh0aGlzLnJhaXNhYmxlTGF5ZXIoaW5kZXgpKSB7XG4gICAgICAgIGxheWVyc1RvUmFpc2UucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubWFwLnJhaXNlTGF5ZXJzKGxheWVyc1RvUmFpc2UpO1xuICAgIGlmIChmcm9tVWkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja0l0ZW1zID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICAgJ21hdC1jaGVja2JveC1jaGVja2VkJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdGVtRm9jdXNlZCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICdpZ28tbGF5ZXItaXRlbS1mb2N1c2VkJ1xuICAgICAgICApO1xuICAgICAgICBsZXQgdGFyZ2V0VG9TY3JvbGw7XG4gICAgICAgIGlmIChjaGVja0l0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIHRhcmdldFRvU2Nyb2xsID0gY2hlY2tJdGVtc1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbUZvY3VzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgdGFyZ2V0VG9TY3JvbGwgPSBpdGVtRm9jdXNlZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9TY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXRUb1Njcm9sbCwge1xuICAgICAgICAgICAgc2Nyb2xsTW9kZTogJ2lmLW5lZWRlZCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ2VuZCcsXG4gICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICAvKlxuICAgKiBGb3Igc2VsZWN0aW9uIG1vZGUgZGlzYWJsZWQgYXR0cmlidXRlXG4gICAqL1xuICBsb3dlcmFibGVMYXllcnMobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XG4gICAgbGV0IGJhc2UgPSAwO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBtYXBJbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXllci5pZCA9PT0gbGF5LmlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllciA9IHRoaXMubGF5ZXJzW21hcEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50TGF5ZXIuYmFzZUxheWVyKSB7XG4gICAgICAgIGJhc2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dExheWVyID0gdGhpcy5sYXllcnNbbWFwSW5kZXggKyAxXTtcbiAgICAgIGlmIChcbiAgICAgICAgbmV4dExheWVyICYmXG4gICAgICAgIG5leHRMYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgIWxheWVycy5maW5kKChsYXkpID0+IG5leHRMYXllci5pZCA9PT0gbGF5LmlkKVxuICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxheWVyc0NoZWNrZWRbMF0uYmFzZUxheWVyKSB8fFxuICAgICAgYmFzZSA9PT0gdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzcG9uc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLypcbiAgICogV2hlbiBtdWx0aXBsZSBsYXllcnMgaXMgc2VsZWN0ZWQgYnV0IHNvbWUgbWF5IGJlIGFsbG93IHRvIG1vdmVcbiAgICovXG4gIGxvd2VyYWJsZUxheWVyKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICBpbmRleCA+XG4gICAgICB0aGlzLmxheWVycy5maWx0ZXIoKGxheSkgPT4gbGF5LmJhc2VMYXllciAhPT0gdHJ1ZSkubGVuZ3RoIC0gMlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxheWVyc1tpbmRleCArIDFdLm9wdGlvbnMuY2hlY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmxvd2VyYWJsZUxheWVyKGluZGV4ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbG93ZXJMYXllcnMobGF5ZXJzOiBMYXllcltdLCBmcm9tVWkgPSB0cnVlKSB7XG4gICAgY29uc3QgbGF5ZXJzVG9Mb3dlciA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleCgobGF5KSA9PiBsYXkuaWQgPT09IGxheWVyLmlkKTtcbiAgICAgIGlmICh0aGlzLmxvd2VyYWJsZUxheWVyKGluZGV4KSkge1xuICAgICAgICBsYXllcnNUb0xvd2VyLnB1c2gobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hcC5sb3dlckxheWVycyhsYXllcnNUb0xvd2VyKTtcbiAgICBpZiAoZnJvbVVpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tJdGVtcyA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICdtYXQtY2hlY2tib3gtY2hlY2tlZCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXRlbUZvY3VzZWQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAnaWdvLWxheWVyLWl0ZW0tZm9jdXNlZCdcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHRhcmdldFRvU2Nyb2xsO1xuICAgICAgICBpZiAoY2hlY2tJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0YXJnZXRUb1Njcm9sbCA9IGNoZWNrSXRlbXNbY2hlY2tJdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbUZvY3VzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgdGFyZ2V0VG9TY3JvbGwgPSBpdGVtRm9jdXNlZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9TY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXRUb1Njcm9sbCwge1xuICAgICAgICAgICAgc2Nyb2xsTW9kZTogJ2lmLW5lZWRlZCcsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgICAgICBibG9jazogJ2VuZCcsXG4gICAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG5leHQoKSB7XG4gICAgdGhpcy5jaGFuZ2UkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUxheWVycyhsYXllcnM6IExheWVyW10pOiBMYXllcltdIHtcbiAgICBsZXQgbGF5ZXJzT3V0ID0gdGhpcy5maWx0ZXJMYXllcnMobGF5ZXJzKTtcbiAgICBpZiAodGhpcy5zb3J0QWxwaGEpIHtcbiAgICAgIGxheWVyc091dCA9IHRoaXMuc29ydExheWVyc0J5VGl0bGUobGF5ZXJzT3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXJzT3V0ID0gdGhpcy5zb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzT3V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc091dDtcbiAgfVxuXG4gIG9uS2V5d29yZENoYW5nZSh0ZXJtKSB7XG4gICAgdGhpcy5rZXl3b3JkID0gdGVybTtcbiAgfVxuXG4gIG9uQXBwbGllZEZpbHRlckFuZFNvcnRDaGFuZ2UoYXBwbGllZEZpbHRlcjogTGF5ZXJMaXN0Q29udHJvbHNPcHRpb25zKSB7XG4gICAgdGhpcy5rZXl3b3JkID0gYXBwbGllZEZpbHRlci5rZXl3b3JkO1xuICAgIHRoaXMub25seVZpc2libGUgPSBhcHBsaWVkRmlsdGVyLm9ubHlWaXNpYmxlO1xuICAgIHRoaXMuc29ydEFscGhhID0gYXBwbGllZEZpbHRlci5zb3J0QWxwaGE7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckxheWVycyhsYXllcnM6IExheWVyW10pOiBMYXllcltdIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMuc2hvd1Rvb2xiYXIgPT09IExheWVyTGlzdENvbnRyb2xzRW51bS5uZXZlclxuICAgICkge1xuICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleXdvcmQgJiYgIXRoaXMub25seVZpc2libGUpIHtcbiAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcExheWVySWRzID0gbGF5ZXJzLm1hcCgobGF5ZXI6IExheWVyKSA9PiBsYXllci5pZCk7XG5cbiAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXI6IExheWVyKSA9PiB7XG4gICAgICBjb25zdCBsYXllck9wdGlvbnMgPSAobGF5ZXIub3B0aW9ucyBhcyBNZXRhZGF0YUxheWVyT3B0aW9ucykgfHwge307XG4gICAgICBjb25zdCBkYXRhU291cmNlT3B0aW9ucyA9IGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucyB8fCB7fTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gbGF5ZXJPcHRpb25zLm1ldGFkYXRhIHx8ICh7fSBhcyBNZXRhZGF0YU9wdGlvbnMpO1xuICAgICAgY29uc3Qga2V5d29yZHMgPSBtZXRhZGF0YS5rZXl3b3JkTGlzdCB8fCBbXTtcbiAgICAgIGNvbnN0IGxheWVyS2V5d29yZHMgPSBrZXl3b3Jkcy5tYXAoKGt3OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGt3Lm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmtleXdvcmQgJiYgbGF5ZXIudGl0bGUpIHtcbiAgICAgICAgY29uc3QgbG9jYWxLZXl3b3JkID0gdGhpcy5rZXl3b3JkXG4gICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xuICAgICAgICBjb25zdCBsYXllclRpdGxlID0gbGF5ZXIudGl0bGVcbiAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZU9wdGlvbnMudHlwZSB8fCAnJztcbiAgICAgICAgY29uc3Qga2V5d29yZFJlZ2V4ID0gbmV3IFJlZ0V4cChsb2NhbEtleXdvcmQsICdnaScpO1xuICAgICAgICBjb25zdCBrZXl3b3JkSW5MaXN0ID1cbiAgICAgICAgICBsYXllcktleXdvcmRzLmZpbmQoKGt3OiBzdHJpbmcpID0+IGtleXdvcmRSZWdleC50ZXN0KGt3KSkgIT09XG4gICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWtleXdvcmRSZWdleC50ZXN0KGxheWVyVGl0bGUpICYmXG4gICAgICAgICAgISh0aGlzLmtleXdvcmQudG9Mb3dlckNhc2UoKSA9PT0gZGF0YVNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKSkgJiZcbiAgICAgICAgICAha2V5d29yZEluTGlzdFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGtlZXBMYXllcklkcy5pbmRleE9mKGxheWVyLmlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAga2VlcExheWVySWRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ubHlWaXNpYmxlICYmIGxheWVyLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2VlcExheWVySWRzLmluZGV4T2YobGF5ZXIuaWQpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGtlZXBMYXllcklkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXJzLmZpbHRlcihcbiAgICAgIChsYXllcjogTGF5ZXIpID0+IGtlZXBMYXllcklkcy5pbmRleE9mKGxheWVyLmlkKSAhPT0gLTFcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzOiBMYXllcltdKSB7XG4gICAgcmV0dXJuIGxheWVycy5zb3J0KChsYXllcjEsIGxheWVyMikgPT4gbGF5ZXIyLnpJbmRleCAtIGxheWVyMS56SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0TGF5ZXJzQnlUaXRsZShsYXllcnM6IExheWVyW10pIHtcbiAgICByZXR1cm4gbGF5ZXJzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZShhLnRpdGxlKSA8IHRoaXMubm9ybWFsaXplKGIudGl0bGUpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZShhLnRpdGxlKSA+IHRoaXMubm9ybWFsaXplKGIudGl0bGUpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHJcbiAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXG4gICAgICAudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZVNob3dUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodGhpcy5sYXllckZpbHRlckFuZFNvcnRPcHRpb25zLnNob3dUb29sYmFyKSB7XG4gICAgICBjYXNlIExheWVyTGlzdENvbnRyb2xzRW51bS5hbHdheXM6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBMYXllckxpc3RDb250cm9sc0VudW0ubmV2ZXI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmxheWVycy5sZW5ndGggPj0gdGhpcy50aHJlc2hvbGRUb0ZpbHRlckFuZFNvcnQgfHxcbiAgICAgICAgICB0aGlzLmtleXdvcmQgfHxcbiAgICAgICAgICB0aGlzLm9ubHlWaXNpYmxlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVMYXllclRvb2wobGF5ZXIpIHtcbiAgICB0aGlzLnRvZ2dsZU9wYWNpdHkgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5sYXllclRvb2wgJiYgbGF5ZXIgPT09IHRoaXMuYWN0aXZlTGF5ZXIpIHtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLmxheWVycykge1xuICAgICAgbGF5Lm9wdGlvbnMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGxheWVyLm9wdGlvbnMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyID0gbGF5ZXI7XG4gIH1cblxuICByZW1vdmVMYXllcnMobGF5ZXJzPzogTGF5ZXJbXSkge1xuICAgIGlmIChsYXllcnMgJiYgbGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLm9wdGlvbnMucmVtb3ZhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgIGxheWVyLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnB1c2gobGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghbGF5ZXJzICYmIHRoaXMuYWN0aXZlTGF5ZXIub3B0aW9ucy5yZW1vdmFibGUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFjdGl2ZUxheWVyLm1hcC5yZW1vdmVMYXllcih0aGlzLmFjdGl2ZUxheWVyKTtcbiAgICAgIHRoaXMubGF5ZXJUb29sID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVmlzaWJpbGl0eShsYXllcnM/OiBMYXllcltdKSB7XG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgbGF5ZXIudmlzaWJsZSA9IHRoaXMuaGlkZVNlbGVjdGVkTGF5ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxheWVySXRlbUNoYW5nZURldGVjdGlvbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIGlzTGF5ZXJSZW1vdmFibGUobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheWVyLm9wdGlvbnMucmVtb3ZhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzQWxsTGF5ZXJzUmVtb3ZhYmxlKGxheWVyczogTGF5ZXJbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsYXllcnMuZXZlcnkoKGwpID0+IHRoaXMuaXNMYXllclJlbW92YWJsZShsKSk7XG4gIH1cblxuICBnZXQgc3RhdHVzU2VsZWN0ZWRMYXllcnNDaGVjaygpOiBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSB7XG4gICAgbGV0IHN0YXR1c1NlbGVjdGVkTGF5ZXJzOiBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bSA9XG4gICAgICBMYXllckxpc3RTZWxlY3RWaXNpYmxlRW51bS5OVUxMO1xuICAgIGxldCBmaW5kVHJ1ZSA9IGZhbHNlO1xuICAgIGxldCBmaW5kRmFsc2UgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdGF0dXNTZWxlY3RlZExheWVycyA9IExheWVyTGlzdFNlbGVjdFZpc2libGVFbnVtLk5VTEw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzID0gTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0uTUlYRUQ7XG4gICAgICB0aGlzLmhpZGVTZWxlY3RlZExheWVycyA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGxheWVyMiBvZiB0aGlzLmxheWVyc0NoZWNrZWQpIHtcbiAgICAgICAgaWYgKGxheWVyMi52aXNpYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgZmluZFRydWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXllcjIudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmaW5kRmFsc2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5kVHJ1ZSA9PT0gdHJ1ZSAmJiBmaW5kRmFsc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHN0YXR1c1NlbGVjdGVkTGF5ZXJzID0gTGF5ZXJMaXN0U2VsZWN0VmlzaWJsZUVudW0uQUxMX1ZJU0lCTEU7XG4gICAgICB9XG4gICAgICBpZiAoZmluZFRydWUgPT09IGZhbHNlICYmIGZpbmRGYWxzZSA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVycyA9IExheWVyTGlzdFNlbGVjdFZpc2libGVFbnVtLkFMTF9ISURERU47XG4gICAgICAgIHRoaXMuaGlkZVNlbGVjdGVkTGF5ZXJzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdHVzU2VsZWN0ZWRMYXllcnM7XG4gIH1cblxuICBsYXllcnNDaGVjayhldmVudDogeyBsYXllcjogTGF5ZXI7IGNoZWNrOiBib29sZWFuIH0pIHtcbiAgICBldmVudC5sYXllci5vcHRpb25zLmNoZWNrID0gZXZlbnQuY2hlY2s7XG4gICAgaWYgKGV2ZW50LmNoZWNrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBldmVudE1hcEluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KFxuICAgICAgICAobGF5ZXIpID0+IGV2ZW50LmxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICAgIGNvbnN0IG1hcEluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KChsYXkpID0+IGxheWVyLmlkID09PSBsYXkuaWQpO1xuICAgICAgICBpZiAoZXZlbnRNYXBJbmRleCA8IG1hcEluZGV4KSB7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnNwbGljZShcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5maW5kSW5kZXgoKGxheSkgPT4gbGF5ZXIuaWQgPT09IGxheS5pZCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZXZlbnQubGF5ZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZUJhc2VMYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChsYXkpID0+IGxheS5iYXNlTGF5ZXIgIT09IHRydWUgJiYgbGF5LnNob3dJbkxheWVyTGlzdFxuICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZXhjbHVkZUJhc2VMYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmlsdGVyKChsYXkpID0+IGxheS5zaG93SW5MYXllckxpc3QpLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5wdXNoKGV2ZW50LmxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVyc0NoZWNrZWQuZmluZEluZGV4KFxuICAgICAgICAobGF5ZXIpID0+IGV2ZW50LmxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgKTtcbiAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09XG4gICAgICAgIHRoaXMubGF5ZXJzLmZpbHRlcihcbiAgICAgICAgICAobGF5KSA9PiBsYXkuYmFzZUxheWVyICE9PSB0cnVlICYmIGxheS5zaG93SW5MYXllckxpc3RcbiAgICAgICAgKS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5sZW5ndGggPT09XG4gICAgICAgIHRoaXMubGF5ZXJzLmZpbHRlcigobGF5KSA9PiBsYXkuc2hvd0luTGF5ZXJMaXN0KS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVTZWxlY3Rpb25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmFjdGl2ZUxheWVyID0gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sYXllclRvb2wgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLm9wdGlvbnMuY2hlY2spIHtcbiAgICAgICAgICB0aGlzLmxheWVyc0NoZWNrZWQucHVzaChsYXllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsYXllcnNDaGVja2VkT3BhY2l0eSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmxheWVyc0NoZWNrZWQubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnNDaGVja2VkKSB7XG4gICAgICAgIG9wYWNpdHkucHVzaChsYXllci5vcGFjaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcGFjaXR5O1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEFsbCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0QWxsQ2hlY2spIHtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZXhjbHVkZUJhc2VMYXllcnMgJiZcbiAgICAgICAgICBsYXllci5iYXNlTGF5ZXIgIT09IHRydWUgJiZcbiAgICAgICAgICBsYXllci5zaG93SW5MYXllckxpc3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGF5ZXIub3B0aW9ucy5jaGVjayA9IHRydWU7XG4gICAgICAgICAgdGhpcy5sYXllcnNDaGVja2VkLnB1c2gobGF5ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmV4Y2x1ZGVCYXNlTGF5ZXJzICYmIGxheWVyLnNob3dJbkxheWVyTGlzdCkge1xuICAgICAgICAgIGxheWVyLm9wdGlvbnMuY2hlY2sgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubGF5ZXJzQ2hlY2tlZC5wdXNoKGxheWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RBbGxDaGVjayQubmV4dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBsYXllci5vcHRpb25zLmNoZWNrID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmxheWVyc0NoZWNrZWQgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2skLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2Nyb2xsZWRJbnRvVmlldyhlbGVtU291cmNlLCBlbGVtKSB7XG4gICAgY29uc3QgZG9jVmlld1RvcCA9IGVsZW1Tb3VyY2Uuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IGRvY1ZpZXdCb3R0b20gPSBkb2NWaWV3VG9wICsgZWxlbVNvdXJjZS5jbGllbnRIZWlnaHQ7XG5cbiAgICBjb25zdCBlbGVtVG9wID0gZWxlbS5vZmZzZXRUb3A7XG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IGVsZW1Ub3AgKyBlbGVtLmNsaWVudEhlaWdodDtcbiAgICByZXR1cm4gZWxlbUJvdHRvbSA8PSBkb2NWaWV3Qm90dG9tICYmIGVsZW1Ub3AgPj0gZG9jVmlld1RvcDtcbiAgfVxuXG4gIHJlbW92ZVByb2JsZW1MYXllckluTGlzdChsYXllcnNMaXN0OiBMYXllcltdKTogTGF5ZXJbXSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnNMaXN0KSB7XG4gICAgICBpZiAobGF5ZXIub2xMb2FkaW5nUHJvYmxlbSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNMaXN0O1xuICB9XG59XG4iLCI8aWdvLWxheWVyLWxpc3QtdG9vbFxuICAqbmdJZj1cInNob3dUb29sYmFyJCB8IGFzeW5jXCJcbiAgZmxvYXRMYWJlbD1cImF1dG9cIlxuICBbbGF5ZXJzQXJlQWxsVmlzaWJsZV09XCJsYXllcnNBcmVBbGxWaXNpYmxlXCJcbiAgW3Rlcm1dPVwibGF5ZXJGaWx0ZXJBbmRTb3J0T3B0aW9ucy5rZXl3b3JkXCJcbiAgW29ubHlWaXNpYmxlXT1cImxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMub25seVZpc2libGVcIlxuICBbc29ydEFscGhhXT1cImxheWVyRmlsdGVyQW5kU29ydE9wdGlvbnMuc29ydEFscGhhXCJcbiAgKGFwcGxpZWRGaWx0ZXJBbmRTb3J0KT1cIm9uQXBwbGllZEZpbHRlckFuZFNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gIChzZWxlY3Rpb24pPVwidG9nZ2xlU2VsZWN0aW9uTW9kZSgkZXZlbnQpXCJcbj5cbjwvaWdvLWxheWVyLWxpc3QtdG9vbD5cblxuPGRpdiAqbmdJZj1cInNlbGVjdGlvblwiIGNsYXNzPVwic2VsZWN0LWFsbFwiPlxuICA8bWF0LWNoZWNrYm94XG4gICAgY2xhc3M9XCJzZWxlY3QtYWxsLWNoZWNrYm94XCJcbiAgICBbY29sb3JdPVwiIXNlbGVjdEFsbENoZWNrICYmIGxheWVyc0NoZWNrZWQubGVuZ3RoID4gMCA/ICdhY2NlbnQnIDogJ3ByaW1hcnknXCJcbiAgICAoY2hhbmdlKT1cInNlbGVjdEFsbCgpXCJcbiAgICBbY2hlY2tlZF09XCJzZWxlY3RBbGxDaGVja1wiXG4gICAgW2luZGV0ZXJtaW5hdGVdPVwiIXNlbGVjdEFsbENoZWNrICYmIGxheWVyc0NoZWNrZWQubGVuZ3RoID4gMFwiXG4gID5cbiAgICB7e1xuICAgICAgc2VsZWN0QWxsQ2hlY2tcbiAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZGVzZWxlY3RBbGwnIHwgdHJhbnNsYXRlKVxuICAgICAgICA6ICgnaWdvLmdlby5sYXllci5zZWxlY3RBbGwnIHwgdHJhbnNsYXRlKVxuICAgIH19XG4gIDwvbWF0LWNoZWNrYm94PlxuPC9kaXY+XG48bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cblxuPGlnby1saXN0ICNpZ29MaXN0IFtuYXZpZ2F0aW9uXT1cImZhbHNlXCIgW3NlbGVjdGlvbl09XCJmYWxzZVwiPlxuICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWxheWVyIGxldC1pPVwiaW5kZXhcIiBbbmdGb3JPZl09XCJsYXllcnMkIHwgYXN5bmNcIj5cbiAgICA8aWdvLWxheWVyLWl0ZW1cbiAgICAgICpuZ0lmPVwiIShleGNsdWRlQmFzZUxheWVycyAmJiBsYXllci5iYXNlTGF5ZXIpXCJcbiAgICAgIGlnb0xpc3RJdGVtXG4gICAgICBbbGF5ZXJdPVwibGF5ZXJcIlxuICAgICAgW2FjdGl2ZUxheWVyXT1cImFjdGl2ZUxheWVyXCJcbiAgICAgIFtvcmRlcmFibGVdPVwib3JkZXJhYmxlICYmICFsYXllci5iYXNlTGF5ZXJcIlxuICAgICAgW2xvd2VyRGlzYWJsZWRdPVwiZ2V0TG93ZXJMYXllcigpLmlkID09PSBsYXllci5pZFwiXG4gICAgICBbcmFpc2VEaXNhYmxlZF09XCJnZXRVcHBlckxheWVyKCkuaWQgPT09IGxheWVyLmlkXCJcbiAgICAgIFtxdWVyeUJhZGdlXT1cInF1ZXJ5QmFkZ2VcIlxuICAgICAgW2V4cGFuZExlZ2VuZElmVmlzaWJsZV09XCJleHBhbmRMZWdlbmRPZlZpc2libGVMYXllcnNcIlxuICAgICAgW3VwZGF0ZUxlZ2VuZE9uUmVzb2x1dGlvbkNoYW5nZV09XCJ1cGRhdGVMZWdlbmRPblJlc29sdXRpb25DaGFuZ2VcIlxuICAgICAgW3RvZ2dsZUxlZ2VuZE9uVmlzaWJpbGl0eUNoYW5nZV09XCJ0b2dnbGVMZWdlbmRPblZpc2liaWxpdHlDaGFuZ2VcIlxuICAgICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uXCJcbiAgICAgIFtzZWxlY3RBbGxdPVwic2VsZWN0QWxsQ2hlY2tcIlxuICAgICAgW2xheWVyQ2hlY2tdPVwibGF5ZXIub3B0aW9ucy5jaGVja1wiXG4gICAgICBbY2hhbmdlRGV0ZWN0aW9uXT1cImxheWVySXRlbUNoYW5nZURldGVjdGlvbiRcIlxuICAgICAgKGFjdGlvbik9XCJ0b2dnbGVMYXllclRvb2woJGV2ZW50KVwiXG4gICAgICAoY2hlY2tib3gpPVwibGF5ZXJzQ2hlY2soJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvaWdvLWxheWVyLWl0ZW0+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lnby1saXN0PlxuXG48aWdvLXBhbmVsXG4gICpuZ0lmPVwiIXNlbGVjdGlvbiAmJiBsYXllclRvb2wgJiYgYWN0aXZlTGF5ZXJcIlxuICBjbGFzcz1cImlnby1sYXllci1hY3Rpb25zLWNvbnRhaW5lclwiXG4gIFt0aXRsZV09XCJhY3RpdmVMYXllci50aXRsZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJpZ28tbGF5ZXItYnV0dG9uLWdyb3VwXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJpc0xheWVyUmVtb3ZhYmxlKGFjdGl2ZUxheWVyKVwiXG4gICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIucmVtb3ZlTGF5ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJyZW1vdmVMYXllcnMoKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRvd24tYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBzb3J0QWxwaGEgfHwgb25seVZpc2libGUgfHwga2V5d29yZFxuICAgICAgICAgID8gKCdpZ28uZ2VvLmxheWVyLmZpbHRlckxvd2VyTGF5ZXInIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLmxvd2VyTGF5ZXInIHwgdHJhbnNsYXRlKVxuICAgICAgXCJcbiAgICAgIFtkaXNhYmxlZF09XCJsb3dlckRpc2FibGVkXCJcbiAgICAgIChjbGljayk9XCJtb3ZlQWN0aXZlTGF5ZXIoYWN0aXZlTGF5ZXIsIGxheWVyTGlzdERpc3BsYWNlbWVudC5Mb3dlciwgdHJ1ZSlcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cInNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkID8gJyEnIDogJydcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJsb3dlckRpc2FibGVkXCJcbiAgICAgICAgPmFycm93X2Rvd253YXJkPC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJ1cC1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIHNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkXG4gICAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZmlsdGVyUmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2lnby5nZW8ubGF5ZXIucmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cInJhaXNlRGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVBY3RpdmVMYXllcihhY3RpdmVMYXllciwgbGF5ZXJMaXN0RGlzcGxhY2VtZW50LlJhaXNlLCB0cnVlKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICBbbWF0QmFkZ2VdPVwic29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmQgPyAnIScgOiAnJ1wiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cInJhaXNlRGlzYWJsZWRcIlxuICAgICAgICA+YXJyb3dfdXB3YXJkPC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSA8bGFiZWw+e3sgJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGUgfX0gPC9sYWJlbD4gLS0+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJvcGFjaXR5LWJ1dHRvblwiXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3BhY2l0eU1lbnVcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cImJhZGdlT3BhY2l0eVwiXG4gICAgICAgIG1hdEJhZGdlQ29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCJcbiAgICAgICAgPm9wYWNpdHk8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8bWF0LW1lbnUgI29wYWNpdHlNZW51PVwibWF0TWVudVwiIGNsYXNzPVwicGFuZWwtb3BhY2l0eS1tZW51XCI+XG4gICAgICA8bWF0LXNsaWRlclxuICAgICAgICBpZD1cIm9wYWNpdHktc2xpZGVyXCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgZGlzY3JldGVcbiAgICAgICAgc3RlcD1cIjVcIlxuICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLm9wYWNpdHknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAjbmdTbGlkZXJcbiAgICAgICAgPjxpbnB1dFxuICAgICAgICAgIG1hdFNsaWRlclRodW1iXG4gICAgICAgICAgW3ZhbHVlXT1cIm9wYWNpdHlcIlxuICAgICAgICAgIChpbnB1dCk9XCJcbiAgICAgICAgICAgIGNoYW5nZU9wYWNpdHkoe1xuICAgICAgICAgICAgICBzb3VyY2U6IG5nU2xpZGVyVGh1bWIsXG4gICAgICAgICAgICAgIHBhcmVudDogbmdTbGlkZXIsXG4gICAgICAgICAgICAgIHZhbHVlOiBuZ1NsaWRlclRodW1iLnZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIFwiXG4gICAgICAgICAgI25nU2xpZGVyVGh1bWI9XCJtYXRTbGlkZXJUaHVtYlwiXG4gICAgICAgIC8+XG4gICAgICA8L21hdC1zbGlkZXI+XG4gICAgPC9tYXQtbWVudT5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiYWN0aXZlTGF5ZXJFeHRlbnRJc1ZhbGlkKGFjdGl2ZUxheWVyKVwiXG4gICAgICBjbGFzcz1cInpvb21MYXllci1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIuem9vbUxheWVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAoY2xpY2spPVwiem9vbUxheWVyRXh0ZW50cyhhY3RpdmVMYXllcilcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBtYXRCYWRnZUNvbG9yPVwicHJpbWFyeVwiIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgID5mcmFtZV9pbnNwZWN0PC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgaWdvTGF5ZXJJdGVtVG9vbGJhclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVMYXllclRvb2xiYXJcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbGF5ZXI6IGFjdGl2ZUxheWVyIH1cIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ29MYXllckl0ZW1Ub29sYmFyXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L2lnby1wYW5lbD5cblxuPGlnby1wYW5lbFxuICAqbmdJZj1cInNlbGVjdGlvbiAmJiBsYXllcnMubGVuZ3RoID4gMFwiXG4gIGNsYXNzPVwiaWdvLWxheWVyLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgW3RpdGxlXT1cIidpZ28uZ2VvLmxheWVyLnRvb2xzJyB8IHRyYW5zbGF0ZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWJ1dHRvbnMtbXVsdGlcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW2Rpc2FibGVkXT1cImxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBpc0FsbExheWVyc1JlbW92YWJsZShsYXllcnNDaGVja2VkKVxuICAgICAgICAgID8gKCdpZ28uZ2VvLmxheWVyLnJlbW92ZVNlbGVjdGVkTGF5ZXJzJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnaWdvLmdlby5sYXllci5yZW1vdmVTZWxlY3RlZExheWVyc1Jlc3RyaWN0aW9uJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICAoY2xpY2spPVwicmVtb3ZlTGF5ZXJzKGxheWVyc0NoZWNrZWQpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgIFttYXRCYWRnZV09XCInISdcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJpc0FsbExheWVyc1JlbW92YWJsZShsYXllcnNDaGVja2VkKVwiXG4gICAgICAgID5kZWxldGU8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImV5ZS1idXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW2Rpc2FibGVkXT1cImxheWVyc0NoZWNrZWQubGVuZ3RoID09PSAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVyc0NoZWNrID09PSAnQUxMX0hJRERFTidcbiAgICAgICAgICA/ICgnaWdvLmdlby5sYXllci5zaG93U2VsZWN0ZWRMYXllcnMnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdpZ28uZ2VvLmxheWVyLmhpZGVTZWxlY3RlZExheWVycycgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVZpc2liaWxpdHkobGF5ZXJzQ2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj57e1xuICAgICAgICBzdGF0dXNTZWxlY3RlZExheWVyc0NoZWNrID09PSAnQUxMX0hJRERFTidcbiAgICAgICAgICA/ICd2aXNpYmlsaXR5X29mZidcbiAgICAgICAgICA6ICd2aXNpYmlsaXR5J1xuICAgICAgfX08L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJkb3duLWJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCJcbiAgICAgICAgc29ydEFscGhhIHx8IG9ubHlWaXNpYmxlIHx8IGtleXdvcmRcbiAgICAgICAgICA/ICgnaWdvLmdlby5sYXllci5maWx0ZXJMb3dlckxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnaWdvLmdlby5sYXllci5sb3dlckxheWVyJyB8IHRyYW5zbGF0ZSlcbiAgICAgIFwiXG4gICAgICBbZGlzYWJsZWRdPVwibG93ZXJEaXNhYmxlZFNlbGVjdGlvblwiXG4gICAgICAoY2xpY2spPVwibG93ZXJMYXllcnMobGF5ZXJzQ2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgW21hdEJhZGdlXT1cInNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkID8gJyEnIDogJydcIlxuICAgICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXG4gICAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJsb3dlckRpc2FibGVkU2VsZWN0aW9uXCJcbiAgICAgICAgPmFycm93X2Rvd253YXJkPC9tYXQtaWNvblxuICAgICAgPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJ1cC1idXR0b25cIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIHNvcnRBbHBoYSB8fCBvbmx5VmlzaWJsZSB8fCBrZXl3b3JkXG4gICAgICAgICAgPyAoJ2lnby5nZW8ubGF5ZXIuZmlsdGVyUmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2lnby5nZW8ubGF5ZXIucmFpc2VMYXllcicgfCB0cmFuc2xhdGUpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cInJhaXNlRGlzYWJsZWRTZWxlY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cInJhaXNlTGF5ZXJzKGxheWVyc0NoZWNrZWQpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgIFttYXRCYWRnZV09XCJzb3J0QWxwaGEgfHwgb25seVZpc2libGUgfHwga2V5d29yZCA/ICchJyA6ICcnXCJcbiAgICAgICAgbWF0QmFkZ2VDb2xvcj1cIndhcm5cIlxuICAgICAgICBtYXRCYWRnZVNpemU9XCJtZWRpdW1cIlxuICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwicmFpc2VEaXNhYmxlZFNlbGVjdGlvblwiXG4gICAgICAgID5hcnJvd191cHdhcmQ8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm9wYWNpdHktYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFtkaXNhYmxlZF09XCJsYXllcnNDaGVja2VkLmxlbmd0aCA9PT0gMFwiXG4gICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3BhY2l0eU1lbnVcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIub3BhY2l0eScgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5vcGFjaXR5PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxtYXQtbWVudSAjb3BhY2l0eU1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJtYXQtbWVudS1vcGFjaXR5LXNsaWRlclwiPlxuICAgICAgPGRpdiBpZD1cIm9wYWNpdHktbWVudVwiPlxuICAgICAgICA8IS0tIFRPRE86IFRoZSAndGlja0ludGVydmFsJyBwcm9wZXJ0eSBubyBsb25nZXIgZXhpc3RzIC0tPlxuICAgICAgICA8bWF0LXNsaWRlclxuICAgICAgICAgICpuZ0lmPVwibGF5ZXJzQ2hlY2tlZC5sZW5ndGhcIlxuICAgICAgICAgIGlkPVwib3BhY2l0eS1zbGlkZXJcIlxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgIHNob3dUaWNrTWFya3NcbiAgICAgICAgICBzdGVwPVwiNVwiXG4gICAgICAgICAgW21pbl09XCIwXCJcbiAgICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGVja09wYWNpdHlcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLm9wYWNpdHknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID48aW5wdXQgbWF0U2xpZGVyVGh1bWIgLz5cbiAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbWVudT5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGxheWVyc0NoZWNrZWQubGVuZ3RoICE9PSAwICYmIGFjdGl2ZUxheWVyc0V4dGVudEFyZVZhbGlkKGxheWVyc0NoZWNrZWQpXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJ6b29tTGF5ZXItYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLnpvb21MYXllcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJ6b29tTGF5ZXJzRXh0ZW50cyhsYXllcnNDaGVja2VkKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmZyYW1lX2luc3BlY3Q8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvaWdvLXBhbmVsPlxuIl19
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9sYXllci1saXN0L2xheWVyLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvbGF5ZXItbGlzdC9sYXllci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixh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L2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRTbGlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZXInO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHtcbiAgTWF0VHJlZUZsYXREYXRhU291cmNlLFxuICBNYXRUcmVlRmxhdHRlbmVyLFxuICBNYXRUcmVlTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuXG5pbXBvcnQge1xuICBEcm9wUGVybWlzc2lvbixcbiAgVHJlZURyYWdEcm9wRGlyZWN0aXZlLFxuICBUcmVlRHJvcEV2ZW50LFxuICBUcmVlRmxhdE5vZGVcbn0gZnJvbSAnQGlnbzIvY29tbW9uL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBJY29uU3ZnLFxuICBJZ29JY29uQ29tcG9uZW50LFxuICBWRUNUT1JfU1FVQVJFX0lDT05cbn0gZnJvbSAnQGlnbzIvY29tbW9uL2ljb24nO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAaWdvMi9jb21tb24vbGlzdCc7XG5pbXBvcnQgeyBQYW5lbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9wYW5lbCc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBMYXllckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHsgTGF5ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItaXRlbSc7XG5pbXBvcnQgeyBMYXllckxpc3RUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5ZXItbGlzdC10b29sJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJWaWV3ZXJPcHRpb25zIH0gZnJvbSAnLi4vbGF5ZXItdmlld2VyL2xheWVyLXZpZXdlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGF5ZXJUeXBlIH0gZnJvbSAnLi4vc2hhcmVkJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJDb250cm9sbGVyIH0gZnJvbSAnLi4vc2hhcmVkL2xheWVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHR5cGUgeyBBbnlMYXllciB9IGZyb20gJy4uL3NoYXJlZC9sYXllcnMvYW55LWxheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXIgfSBmcm9tICcuLi9zaGFyZWQvbGF5ZXJzL2xheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXJHcm91cCB9IGZyb20gJy4uL3NoYXJlZC9sYXllcnMvbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHsgaXNMYXllckdyb3VwLCBpc0xheWVySXRlbSB9IGZyb20gJy4uL3V0aWxzL2xheWVyLnV0aWxzJztcblxudHlwZSBMYXllckZsYXROb2RlPFQgPSBBbnlMYXllcj4gPSBUcmVlRmxhdE5vZGU8VD47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1sYXllci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xheWVyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYXllci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBOZ0ZvcixcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBNYXRCYWRnZU1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0U2xpZGVyTW9kdWxlLFxuICAgIE1hdFRyZWVNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBUcmVlRHJhZ0Ryb3BEaXJlY3RpdmUsXG4gICAgTGF5ZXJMaXN0VG9vbENvbXBvbmVudCxcbiAgICBMYXllckdyb3VwQ29tcG9uZW50LFxuICAgIExpc3RDb21wb25lbnQsXG4gICAgTGF5ZXJJdGVtQ29tcG9uZW50LFxuICAgIExpc3RJdGVtRGlyZWN0aXZlLFxuICAgIFBhbmVsQ29tcG9uZW50LFxuICAgIElnb0xhbmd1YWdlTW9kdWxlLFxuICAgIElnb0ljb25Db21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMYXllckxpc3RDb21wb25lbnQge1xuICBwdWJsaWMgdG9nZ2xlT3BhY2l0eSA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29udHJvbGxlcjogTGF5ZXJDb250cm9sbGVyO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBsYXllcnMobGF5ZXJzOiBBbnlMYXllcltdKSB7XG4gICAgdGhpcy5fbGF5ZXJzID0gbGF5ZXJzO1xuICAgIHRoaXMudXBkYXRlRGF0YXNvdXJjZShsYXllcnMgPz8gW10pO1xuICB9XG4gIGdldCBsYXllcnMoKTogQW55TGF5ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVycztcbiAgfVxuICBwcml2YXRlIF9sYXllcnM6IEFueUxheWVyW107XG5cbiAgQElucHV0KCkgaXNEZXNrdG9wOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0RyYWdEcm9wRGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdEFsbDogYm9vbGVhbjtcbiAgQElucHV0KCkgdmlld2VyT3B0aW9uczogTGF5ZXJWaWV3ZXJPcHRpb25zO1xuXG4gIEBPdXRwdXQoKSBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFueUxheWVyPigpO1xuXG4gIHByaXZhdGUgX3RyYW5zZm9ybWVyID0gKGxheWVyOiBBbnlMYXllciwgbGV2ZWw6IG51bWJlcik6IExheWVyRmxhdE5vZGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogbGF5ZXIuaWQgfHwgbGF5ZXIub3B0aW9ucy5uYW1lLFxuICAgICAgaXNHcm91cDogISFpc0xheWVyR3JvdXAobGF5ZXIpLFxuICAgICAgZGVzY2VuZGFudExldmVsczogaXNMYXllckdyb3VwKGxheWVyKVxuICAgICAgICA/IGxheWVyLmRlc2NlbmRhbnRzTGV2ZWxcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICBkYXRhOiBsYXllcixcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gIH07XG5cbiAgdHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPExheWVyRmxhdE5vZGU+KFxuICAgIChub2RlKSA9PiBub2RlLmxldmVsLFxuICAgIChub2RlKSA9PiBub2RlLmlzR3JvdXBcbiAgKTtcblxuICB0cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXG4gICAgdGhpcy5fdHJhbnNmb3JtZXIsXG4gICAgKG5vZGUpID0+IG5vZGUubGV2ZWwsXG4gICAgKG5vZGUpID0+IG5vZGUuaXNHcm91cCxcbiAgICAobm9kZSkgPT5cbiAgICAgIChub2RlIGFzIExheWVyR3JvdXApLmNoaWxkcmVuXG4gICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5zaG93SW5MYXllckxpc3QpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnpJbmRleCArIGIuekluZGV4KVxuICApO1xuXG4gIGRhdGFTb3VyY2U6IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxBbnlMYXllciwgTGF5ZXJGbGF0Tm9kZT47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKFxuICAgICAgdGhpcy50cmVlQ29udHJvbCxcbiAgICAgIHRoaXMudHJlZUZsYXR0ZW5lcixcbiAgICAgIFtdXG4gICAgKTtcbiAgfVxuXG4gIGlzR3JvdXAgPSAoXzogbnVtYmVyLCBub2RlOiBMYXllckZsYXROb2RlKSA9PiBub2RlLmlzR3JvdXA7XG5cbiAgaXNMYXllckdyb3VwID0gaXNMYXllckdyb3VwO1xuICBpc0xheWVySXRlbSA9IGlzTGF5ZXJJdGVtO1xuXG4gIGlzU2VsZWN0ZWQgPSAobGF5ZXI6IEFueUxheWVyKTogYm9vbGVhbiA9PiB0aGlzLmNvbnRyb2xsZXIuaXNTZWxlY3RlZChsYXllcik7XG4gIGlzRGVzY2VuZGFudFNlbGVjdGlvbiA9IChsYXllcjogQW55TGF5ZXIpOiBib29sZWFuID0+XG4gICAgdGhpcy5jb250cm9sbGVyLmlzRGVzY2VuZGFudFNlbGVjdGlvbihsYXllcik7XG5cbiAgdG9nZ2xlQWN0aXZlKGxheWVyOiBBbnlMYXllcik6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmNvbnRyb2xsZXIuaXNTZWxlY3RlZChsYXllcik7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuY2xlYXJTZWxlY3Rpb24oKTtcblxuICAgIGlmICghaXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNlbGVjdChsYXllcik7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQobGF5ZXIpO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0KGNoZWNrZWQ6IGJvb2xlYW4sIGxheWVyOiBBbnlMYXllcik6IHZvaWQge1xuICAgIGNoZWNrZWQgPyB0aGlzLmNvbnRyb2xsZXIuc2VsZWN0KGxheWVyKSA6IHRoaXMuY29udHJvbGxlci5kZXNlbGVjdChsYXllcik7XG4gIH1cblxuICBnZXRMYXllclR5cGUobGF5ZXI6IExheWVyKTogTGF5ZXJUeXBlIHwgJ21lYXN1cmUnIHwgJ2RyYXcnIHtcbiAgICByZXR1cm4gbGF5ZXIudHlwZSA9PT0gJ3Jhc3RlcidcbiAgICAgID8gJ3Jhc3RlcidcbiAgICAgIDogbGF5ZXIuaWQuaW5jbHVkZXMoJ21lYXN1cmUnKVxuICAgICAgICA/ICdtZWFzdXJlJ1xuICAgICAgICA6IGxheWVyLmlkLmluY2x1ZGVzKCdkcmF3JylcbiAgICAgICAgICA/ICdkcmF3J1xuICAgICAgICAgIDogJ3ZlY3Rvcic7XG4gIH1cblxuICBnZXRMYXllckljb24obGF5ZXI6IExheWVyKTogc3RyaW5nIHwgSWNvblN2ZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0TGF5ZXJUeXBlKGxheWVyKTtcbiAgICByZXR1cm4gdHlwZSA9PT0gJ3Jhc3RlcidcbiAgICAgID8gbGF5ZXIuYmFzZUxheWVyXG4gICAgICAgID8gJ3dhbGxwYXBlcidcbiAgICAgICAgOiAnaW1hZ2UnXG4gICAgICA6IHR5cGUgPT09ICdtZWFzdXJlJ1xuICAgICAgICA/ICdzcXVhcmVfZm9vdCdcbiAgICAgICAgOiB0eXBlID09PSAnZHJhdydcbiAgICAgICAgICA/ICdkcmF3J1xuICAgICAgICAgIDogVkVDVE9SX1NRVUFSRV9JQ09OO1xuICB9XG5cbiAgZHJvcE5vZGUoeyBub2RlLCByZWYsIHBvc2l0aW9uIH06IFRyZWVEcm9wRXZlbnQ8QW55TGF5ZXI+KTogdm9pZCB7XG4gICAgbGV0IG5vZGVzVG9Ecm9wID0gW25vZGUuZGF0YV07XG5cbiAgICBpZiAodGhpcy5jb250cm9sbGVyLmhhc1NlbGVjdGlvbikge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbiBjb3VsZCBjb250YWlucyBkYXRhIGZyb20gdGhlIG91dHNpZGUgdGhlIFRyZWVDb250cm9sbGVyXG4gICAgICBub2Rlc1RvRHJvcCA9IHRoaXMuY29udHJvbGxlci5zZWxlY3RlZC5maWx0ZXIoXG4gICAgICAgIChsYXllcikgPT4gISF0aGlzLmZpbmROb2RlQnlMYXllcklkKGxheWVyLmlkKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pc0dyb3VwKSB7XG4gICAgICBub2Rlc1RvRHJvcCA9IG5vZGVzVG9Ecm9wLmZpbHRlcihcbiAgICAgICAgKG5vZGVEcm9wKSA9PiAhKG5vZGUuZGF0YSBhcyBMYXllckdyb3VwKS5pc0Rlc2NlbmRhbnQobm9kZURyb3ApXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWYuaXNHcm91cCkge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGVzVG9Ecm9wLnNvbWUoKG5vZGVEcm9wKSA9PiBub2RlRHJvcC5pZCA9PT0gcmVmLmlkKTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIG5vZGVzVG9Ecm9wID0gbm9kZXNUb0Ryb3AuZmlsdGVyKChub2RlRHJvcCkgPT4gbm9kZURyb3AuaWQgIT09IHJlZi5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2Rlc1RvRHJvcC5pbmNsdWRlcyhub2RlLmRhdGEpKSB7XG4gICAgICBub2Rlc1RvRHJvcC5wdXNoKG5vZGUuZGF0YSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAnYWJvdmUnOlxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubW92ZUFib3ZlKHJlZi5kYXRhLCAuLi5ub2Rlc1RvRHJvcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5zaWRlJzpcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1vdmVJbnNpZGUocmVmLmRhdGEgYXMgTGF5ZXJHcm91cCwgLi4ubm9kZXNUb0Ryb3ApO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1vdmVCZWxvdyhyZWYuZGF0YSwgLi4ubm9kZXNUb0Ryb3ApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBkcm9wTm9kZUVycm9yKGRldGFpbHM6IERyb3BQZXJtaXNzaW9uKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgIGRldGFpbHMubWVzc2FnZSxcbiAgICAgICdpZ28uZ2VvLmxheWVyLmxheWVyJyxcbiAgICAgIG51bGwsXG4gICAgICBkZXRhaWxzLnBhcmFtc1xuICAgICk7XG4gIH1cblxuICBkcmFnU3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyT3B0aW9ucy5tb2RlID09PSAnc2VsZWN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbGxlci5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgaGFuZGxlTm9kZVRvZ2dsZShub2RlOiBMYXllckZsYXROb2RlPExheWVyR3JvdXA+KTogdm9pZCB7XG4gICAgbm9kZS5kYXRhLmV4cGFuZGVkID0gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTm9kZUJ5TGF5ZXJJZChpZDogc3RyaW5nKTogTGF5ZXJGbGF0Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YXNvdXJjZShsYXllcnM6IEFueUxheWVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBleHBhbnNpb25Nb2RlbCA9IHRoaXMudHJlZUNvbnRyb2wuZXhwYW5zaW9uTW9kZWw7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBsYXllcnM7XG5cbiAgICB0aGlzLmlzSW5pdFxuICAgICAgPyB0aGlzLnJlc3RvcmVNb2RlbChleHBhbnNpb25Nb2RlbCwgKG5vZGUpID0+XG4gICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSlcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmV4cGFuZEdyb3VwKGxheWVycyk7XG5cbiAgICBpZiAoIXRoaXMuaXNJbml0ICYmIGxheWVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVjdXJzaXZlICovXG4gIHByaXZhdGUgZXhwYW5kR3JvdXAobGF5ZXJzOiBBbnlMYXllcltdKTogdm9pZCB7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICBpZiAoIWlzTGF5ZXJHcm91cChsYXllcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGxheWVyLmV4cGFuZGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlMYXllcklkKGxheWVyLmlkKTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGFuZEdyb3VwKGxheWVyLmNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU1vZGVsKFxuICAgIG1vZGVsOiBTZWxlY3Rpb25Nb2RlbDxMYXllckZsYXROb2RlPixcbiAgICBjYWxsYmFjazogKG5vZGU6IExheWVyRmxhdE5vZGUpID0+IHZvaWRcbiAgKSB7XG4gICAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20obW9kZWxbJ19zZWxlY3Rpb24nXSkubWFwKFxuICAgICAgKHZhbHVlKSA9PiB2YWx1ZVsnaWQnXVxuICAgICk7XG4gICAgbW9kZWwuY2xlYXIoKTtcbiAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBpZiAobW9kZWwuaXNTZWxlY3RlZChub2RlKSB8fCBpZHMuaW5jbHVkZXMobm9kZS5pZCkpIHtcbiAgICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxtYXQtdHJlZVxuICBbY2xhc3MuLS1ub3QtZGVza3RvcF09XCIhaXNEZXNrdG9wXCJcbiAgaWdvVHJlZURyYWdEcm9wXG4gIFt0cmVlRHJhZ0Ryb3BJc0Rpc2FibGVkXT1cImlzRHJhZ0Ryb3BEaXNhYmxlZFwiXG4gIFttYXhMZXZlbF09XCJ2aWV3ZXJPcHRpb25zPy5ncm91cD8ubWF4SGllcmFyY2h5TGV2ZWxcIlxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgKGRyYWdTdGFydCk9XCJkcmFnU3RhcnQoKVwiXG4gIChvbkRyb3ApPVwiZHJvcE5vZGUoJGV2ZW50KVwiXG4gIChvbkRyb3BFcnJvcik9XCJkcm9wTm9kZUVycm9yKCRldmVudClcIlxuPlxuICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgbGVhZiBub2RlcyAtLT5cbiAgPG1hdC10cmVlLW5vZGVcbiAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiXG4gICAgW2NsYXNzLi0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlLmRhdGEpXCJcbiAgICBbY2xhc3MuLS1jaGlsZHJlbi1zZWxlY3RlZF09XCJpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gID5cbiAgICA8aWdvLWxheWVyLWl0ZW1cbiAgICAgIFttYXRUcmVlTm9kZVBhZGRpbmddPVwibm9kZS5sZXZlbCA9PT0gMCA/IDEgOiBub2RlLmxldmVsXCJcbiAgICAgIFttYXRUcmVlTm9kZVBhZGRpbmdJbmRlbnRdPVwibm9kZS5sZXZlbCA9PT0gMCA/IDE2IDogMjQgKyAxNiAvIG5vZGUubGV2ZWxcIlxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtaXRlbVwiXG4gICAgICBbbGF5ZXJdPVwibm9kZS5kYXRhXCJcbiAgICAgIFt2aXNpYmxlXT1cIm5vZGUuZGF0YS52aXNpYmxlXCJcbiAgICAgIFt2aWV3ZXJPcHRpb25zXT1cInZpZXdlck9wdGlvbnNcIlxuICAgICAgW3NlbGVjdGVkXT1cImlzU2VsZWN0ZWQobm9kZS5kYXRhKSB8fCBpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gICAgICBbc2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNEZXNjZW5kYW50U2VsZWN0aW9uKG5vZGUuZGF0YSlcIlxuICAgICAgKGFjdGlvbik9XCJ0b2dnbGVBY3RpdmUoJGV2ZW50KVwiXG4gICAgICAoc2VsZWN0Q2hhbmdlKT1cImhhbmRsZVNlbGVjdCgkZXZlbnQsIG5vZGUuZGF0YSlcIlxuICAgID5cbiAgICA8L2lnby1sYXllci1pdGVtPlxuICA8L21hdC10cmVlLW5vZGU+XG4gIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBleHBhbmRhYmxlIG5vZGVzIC0tPlxuICA8bWF0LXRyZWUtbm9kZVxuICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBpc0dyb3VwXCJcbiAgICBbY2xhc3MuLS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG5vZGUuZGF0YSlcIlxuICAgIFtjbGFzcy4tLWNoaWxkcmVuLXNlbGVjdGVkXT1cImlzRGVzY2VuZGFudFNlbGVjdGlvbihub2RlLmRhdGEpXCJcbiAgPlxuICAgIDxpZ28tbGF5ZXItZ3JvdXBcbiAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgW21hdFRyZWVOb2RlUGFkZGluZ0luZGVudF09XCIyNFwiXG4gICAgICBjbGFzcz1cInRyZWUtbm9kZS1pdGVtXCJcbiAgICAgIFtsYXllcl09XCJub2RlLmRhdGFcIlxuICAgICAgW3ZpZXdlck9wdGlvbnNdPVwidmlld2VyT3B0aW9uc1wiXG4gICAgICBbc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlLmRhdGEpIHx8IGlzRGVzY2VuZGFudFNlbGVjdGlvbihub2RlLmRhdGEpXCJcbiAgICAgIFtzZWxlY3Rpb25EaXNhYmxlZF09XCJpc0Rlc2NlbmRhbnRTZWxlY3Rpb24obm9kZS5kYXRhKVwiXG4gICAgICAoYWN0aW9uKT1cInRvZ2dsZUFjdGl2ZSgkZXZlbnQpXCJcbiAgICAgIChleHBhbmQpPVwidHJlZUNvbnRyb2wudG9nZ2xlKG5vZGUpOyBoYW5kbGVOb2RlVG9nZ2xlKG5vZGUpXCJcbiAgICAgIChzZWxlY3RDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0KCRldmVudCwgbm9kZS5kYXRhKVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcbiAgICAgICAgY2xhc3M9XCJsYXllci1pbmRpY2F0b3JcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIG5vZGUuZGF0YS50aXRsZVwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVOb2RlVG9nZ2xlKG5vZGUpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiPlxuICAgICAgICAgIHt7XG4gICAgICAgICAgICB0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXG4gICAgICAgICAgICAgID8gJ2tleWJvYXJkX2Fycm93X2Rvd24nXG4gICAgICAgICAgICAgIDogJ2tleWJvYXJkX2Fycm93X3JpZ2h0J1xuICAgICAgICAgIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2lnby1sYXllci1ncm91cD5cbiAgPC9tYXQtdHJlZS1ub2RlPlxuPC9tYXQtdHJlZT5cbiJdfQ==