@igo2/geo 1.9.0 → 1.10.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 (387) hide show
  1. package/assets/icons/cross_black_18px.svg +88 -88
  2. package/assets/icons/place_blue_36px.svg +55 -55
  3. package/assets/icons/place_green_36px.svg +55 -55
  4. package/assets/icons/place_red_36px.svg +55 -55
  5. package/assets/icons/place_yellow_36px.svg +55 -55
  6. package/bundles/igo2-geo.umd.js +3651 -2762
  7. package/bundles/igo2-geo.umd.js.map +1 -1
  8. package/esm2015/lib/catalog/catalog-browser/catalog-browser-group.component.js +2 -2
  9. package/esm2015/lib/catalog/catalog-browser/catalog-browser-layer.component.js +2 -2
  10. package/esm2015/lib/catalog/catalog-browser/catalog-browser.module.js +1 -1
  11. package/esm2015/lib/catalog/catalog-library/add-catalog-dialog.component.js +72 -53
  12. package/esm2015/lib/catalog/catalog-library/catalog-library.component.js +2 -1
  13. package/esm2015/lib/catalog/catalog.module.js +1 -1
  14. package/esm2015/lib/catalog/shared/catalog.abstract.js +1 -1
  15. package/esm2015/lib/catalog/shared/catalog.interface.js +1 -1
  16. package/esm2015/lib/catalog/shared/catalog.service.js +13 -3
  17. package/esm2015/lib/catalog/shared/index.js +1 -1
  18. package/esm2015/lib/datasource/datasource.module.js +1 -1
  19. package/esm2015/lib/datasource/index.js +1 -1
  20. package/esm2015/lib/datasource/shared/capabilities.service.js +4 -4
  21. package/esm2015/lib/datasource/shared/datasources/carto-datasource.interface.js +1 -1
  22. package/esm2015/lib/datasource/shared/datasources/carto-datasource.js +2 -2
  23. package/esm2015/lib/datasource/shared/datasources/cluster-datasource.js +1 -1
  24. package/esm2015/lib/datasource/shared/datasources/data.service.js +1 -1
  25. package/esm2015/lib/datasource/shared/datasources/datasource.interface.js +1 -1
  26. package/esm2015/lib/datasource/shared/datasources/datasource.js +1 -1
  27. package/esm2015/lib/datasource/shared/datasources/mvt-datasource.interface.js +1 -1
  28. package/esm2015/lib/datasource/shared/datasources/mvt-datasource.js +2 -2
  29. package/esm2015/lib/datasource/shared/datasources/osm-datasource.interface.js +1 -1
  30. package/esm2015/lib/datasource/shared/datasources/websocket-datasource.interface.js +1 -1
  31. package/esm2015/lib/datasource/shared/datasources/websocket-datasource.js +1 -1
  32. package/esm2015/lib/datasource/shared/datasources/wfs-datasource.interface.js +1 -1
  33. package/esm2015/lib/datasource/shared/datasources/wfs.service.js +1 -1
  34. package/esm2015/lib/datasource/shared/datasources/wms-wfs.utils.js +1 -1
  35. package/esm2015/lib/datasource/shared/datasources/wmts-datasource.interface.js +1 -1
  36. package/esm2015/lib/datasource/shared/datasources/xyz-datasource.interface.js +1 -1
  37. package/esm2015/lib/datasource/shared/datasources/xyz-datasource.js +1 -1
  38. package/esm2015/lib/datasource/shared/index.js +1 -1
  39. package/esm2015/lib/datasource/shared/options/index.js +1 -1
  40. package/esm2015/lib/datasource/shared/options/options-api.interface.js +1 -1
  41. package/esm2015/lib/datasource/shared/options/options-api.providers.js +1 -1
  42. package/esm2015/lib/datasource/shared/options/options-api.service.js +1 -1
  43. package/esm2015/lib/datasource/shared/options/options.service.js +1 -1
  44. package/esm2015/lib/datasource/utils/esri-style-generator.js +1 -1
  45. package/esm2015/lib/datasource/utils/index.js +1 -1
  46. package/esm2015/lib/datasource/utils/tilegrid.js +1 -1
  47. package/esm2015/lib/directions/directions-buttons/directions-buttons.component.js +223 -0
  48. package/esm2015/lib/directions/directions-buttons/index.js +2 -0
  49. package/esm2015/lib/directions/directions-inputs/directions-inputs.component.js +300 -0
  50. package/esm2015/lib/directions/directions-inputs/index.js +2 -0
  51. package/esm2015/lib/directions/directions-results/directions-results.component.js +204 -0
  52. package/esm2015/lib/directions/directions-results/index.js +2 -0
  53. package/esm2015/lib/directions/directions-sources/directions-source.interface.js +1 -1
  54. package/esm2015/lib/directions/directions-sources/directions-source.js +1 -1
  55. package/esm2015/lib/directions/directions-sources/directions-source.provider.js +1 -1
  56. package/esm2015/lib/directions/directions-sources/index.js +1 -1
  57. package/esm2015/lib/directions/directions-sources/osrm-directions-source.js +11 -2
  58. package/esm2015/lib/directions/directions.component.js +314 -0
  59. package/esm2015/lib/directions/directions.module.js +31 -10
  60. package/esm2015/lib/directions/index.js +5 -2
  61. package/esm2015/lib/directions/shared/directions-source.service.js +1 -1
  62. package/esm2015/lib/directions/shared/directions.enum.js +20 -3
  63. package/esm2015/lib/directions/shared/directions.interface.js +1 -1
  64. package/esm2015/lib/directions/shared/directions.service.js +1 -1
  65. package/esm2015/lib/directions/shared/directions.utils.js +507 -0
  66. package/esm2015/lib/directions/shared/index.js +3 -1
  67. package/esm2015/lib/directions/shared/store.js +24 -0
  68. package/esm2015/lib/download/download-button/download-button.component.js +1 -1
  69. package/esm2015/lib/download/download-button/index.js +1 -1
  70. package/esm2015/lib/download/download.module.js +1 -1
  71. package/esm2015/lib/download/index.js +1 -1
  72. package/esm2015/lib/download/shared/download.interface.js +1 -1
  73. package/esm2015/lib/download/shared/download.service.js +1 -1
  74. package/esm2015/lib/download/shared/index.js +1 -1
  75. package/esm2015/lib/draw/draw/draw-popup.component.js +6 -5
  76. package/esm2015/lib/draw/draw/draw.component.js +22 -17
  77. package/esm2015/lib/draw/shared/draw.utils.js +1 -1
  78. package/esm2015/lib/feature/feature-details/feature-details.directive.js +1 -1
  79. package/esm2015/lib/feature/feature-details/feature-details.module.js +1 -1
  80. package/esm2015/lib/feature/feature-form/feature-form.component.js +1 -1
  81. package/esm2015/lib/feature/feature-form/feature-form.module.js +1 -1
  82. package/esm2015/lib/feature/feature.module.js +1 -1
  83. package/esm2015/lib/feature/index.js +1 -1
  84. package/esm2015/lib/feature/shared/feature.enums.js +1 -1
  85. package/esm2015/lib/feature/shared/feature.interfaces.js +1 -1
  86. package/esm2015/lib/feature/shared/index.js +1 -1
  87. package/esm2015/lib/feature/shared/strategies/in-map-extent.js +1 -1
  88. package/esm2015/lib/feature/shared/strategies/in-map-resolution.js +1 -1
  89. package/esm2015/lib/feature/shared/strategies/index.js +1 -1
  90. package/esm2015/lib/feature/shared/strategies/loading-layer.js +1 -1
  91. package/esm2015/lib/feature/shared/strategies/loading.js +1 -1
  92. package/esm2015/lib/feature/shared/strategies/selection.js +5 -9
  93. package/esm2015/lib/feature/shared/strategies.utils.js +1 -1
  94. package/esm2015/lib/filter/filter.module.js +7 -4
  95. package/esm2015/lib/filter/ogc-filter-button/index.js +1 -1
  96. package/esm2015/lib/filter/ogc-filter-button/ogc-filter-button.component.js +1 -1
  97. package/esm2015/lib/filter/ogc-filter-form/index.js +1 -1
  98. package/esm2015/lib/filter/ogc-filter-form/ogc-filter-form.component.js +3 -3
  99. package/esm2015/lib/filter/ogc-filter-selection/ogc-filter-selection.component.js +1 -1
  100. package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time.component.js +240 -121
  101. package/esm2015/lib/filter/ogc-filterable-form/index.js +1 -1
  102. package/esm2015/lib/filter/ogc-filterable-item/index.js +1 -1
  103. package/esm2015/lib/filter/ogc-filterable-item/ogc-filterable-item.component.js +2 -2
  104. package/esm2015/lib/filter/ogc-filterable-list/index.js +1 -1
  105. package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.js +1 -1
  106. package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list.component.js +1 -1
  107. package/esm2015/lib/filter/shared/filterable-datasource.pipe.js +1 -1
  108. package/esm2015/lib/filter/shared/index.js +1 -1
  109. package/esm2015/lib/filter/shared/ogc-filter.enum.js +1 -1
  110. package/esm2015/lib/filter/shared/ogc-filter.interface.js +1 -1
  111. package/esm2015/lib/filter/shared/ogc-filter.js +1 -1
  112. package/esm2015/lib/filter/shared/ogc-filter.service.js +1 -1
  113. package/esm2015/lib/filter/shared/spatial-filter.enum.js +1 -1
  114. package/esm2015/lib/filter/shared/spatial-filter.interface.js +1 -1
  115. package/esm2015/lib/filter/shared/time-filter.enum.js +1 -1
  116. package/esm2015/lib/filter/shared/time-filter.interface.js +1 -1
  117. package/esm2015/lib/filter/shared/time-filter.service.js +1 -1
  118. package/esm2015/lib/filter/spatial-filter/spatial-filter-item/index.js +1 -1
  119. package/esm2015/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.js +185 -95
  120. package/esm2015/lib/filter/spatial-filter/spatial-filter-list/index.js +1 -1
  121. package/esm2015/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.js +1 -1
  122. package/esm2015/lib/filter/spatial-filter/spatial-filter-type/index.js +1 -1
  123. package/esm2015/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.js +1 -1
  124. package/esm2015/lib/filter/time-filter-button/index.js +1 -1
  125. package/esm2015/lib/filter/time-filter-button/time-filter-button.component.js +1 -1
  126. package/esm2015/lib/filter/time-filter-form/index.js +1 -1
  127. package/esm2015/lib/filter/time-filter-form/time-filter-form.component.js +1 -1
  128. package/esm2015/lib/filter/time-filter-item/index.js +1 -1
  129. package/esm2015/lib/filter/time-filter-item/time-filter-item.component.js +2 -2
  130. package/esm2015/lib/filter/time-filter-list/index.js +1 -1
  131. package/esm2015/lib/filter/time-filter-list/time-filter-list-binding.directive.js +1 -1
  132. package/esm2015/lib/filter/time-filter-list/time-filter-list.component.js +1 -1
  133. package/esm2015/lib/geometry/geometry-form-field/geometry-form-field-input.component.js +3 -3
  134. package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.component.js +1 -1
  135. package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.module.js +1 -1
  136. package/esm2015/lib/geometry/geometry.module.js +1 -1
  137. package/esm2015/lib/geometry/index.js +1 -1
  138. package/esm2015/lib/geometry/shared/controls/draw.js +1 -1
  139. package/esm2015/lib/geometry/shared/controls/index.js +1 -1
  140. package/esm2015/lib/geometry/shared/geometry.errors.js +3 -3
  141. package/esm2015/lib/geometry/shared/index.js +1 -1
  142. package/esm2015/lib/import-export/export-button/export-button.component.js +1 -1
  143. package/esm2015/lib/import-export/export-button/index.js +1 -1
  144. package/esm2015/lib/import-export/import-export/import-export.component.js +179 -66
  145. package/esm2015/lib/import-export/import-export.module.js +1 -1
  146. package/esm2015/lib/import-export/index.js +1 -1
  147. package/esm2015/lib/import-export/shared/drop-geo-file.directive.js +1 -1
  148. package/esm2015/lib/import-export/shared/export.errors.js +1 -1
  149. package/esm2015/lib/import-export/shared/export.interface.js +1 -1
  150. package/esm2015/lib/import-export/shared/export.type.js +1 -1
  151. package/esm2015/lib/import-export/shared/export.utils.js +1 -1
  152. package/esm2015/lib/import-export/shared/import.interface.js +1 -1
  153. package/esm2015/lib/import-export/shared/import.service.js +1 -1
  154. package/esm2015/lib/import-export/shared/import.utils.js +1 -1
  155. package/esm2015/lib/import-export/shared/index.js +1 -1
  156. package/esm2015/lib/import-export/style-list/index.js +1 -1
  157. package/esm2015/lib/import-export/style-list/style-list.interface.js +1 -1
  158. package/esm2015/lib/import-export/style-list/style-list.module.js +1 -1
  159. package/esm2015/lib/import-export/style-list/style-list.provider.js +1 -1
  160. package/esm2015/lib/import-export/style-list/style-list.service.js +1 -1
  161. package/esm2015/lib/layer/index.js +1 -1
  162. package/esm2015/lib/layer/layer-item/index.js +1 -1
  163. package/esm2015/lib/layer/layer-item/layer-item.component.js +3 -3
  164. package/esm2015/lib/layer/layer-legend/index.js +1 -1
  165. package/esm2015/lib/layer/layer-legend/layer-legend.component.js +23 -16
  166. package/esm2015/lib/layer/layer-legend-item/index.js +1 -1
  167. package/esm2015/lib/layer/layer-legend-item/layer-legend-item.component.js +1 -1
  168. package/esm2015/lib/layer/layer-legend-list/index.js +1 -1
  169. package/esm2015/lib/layer/layer-legend-list/layer-legend-list-binding.directive.js +1 -1
  170. package/esm2015/lib/layer/layer-legend-list/layer-legend-list.component.js +5 -5
  171. package/esm2015/lib/layer/layer-list/index.js +1 -1
  172. package/esm2015/lib/layer/layer-list/layer-list-binding.directive.js +1 -1
  173. package/esm2015/lib/layer/layer-list/layer-list.component.js +44 -44
  174. package/esm2015/lib/layer/layer-list/layer-list.enum.js +1 -1
  175. package/esm2015/lib/layer/layer-list-tool/index.js +1 -1
  176. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.component.js +2 -2
  177. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.enum.js +1 -1
  178. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.interface.js +1 -1
  179. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.service.js +1 -1
  180. package/esm2015/lib/layer/layer.module.js +8 -5
  181. package/esm2015/lib/layer/shared/clusterParam.js +1 -1
  182. package/esm2015/lib/layer/shared/index.js +1 -1
  183. package/esm2015/lib/layer/shared/layer.enums.js +1 -1
  184. package/esm2015/lib/layer/shared/layer.service.js +20 -17
  185. package/esm2015/lib/layer/shared/layers/any-layer.interface.js +1 -1
  186. package/esm2015/lib/layer/shared/layers/any-layer.js +1 -1
  187. package/esm2015/lib/layer/shared/layers/image-layer.js +9 -4
  188. package/esm2015/lib/layer/shared/layers/index.js +1 -1
  189. package/esm2015/lib/layer/shared/layers/layer.js +15 -5
  190. package/esm2015/lib/layer/shared/layers/tile-layer.js +23 -3
  191. package/esm2015/lib/layer/shared/layers/vector-layer.interface.js +1 -1
  192. package/esm2015/lib/layer/shared/layers/vector-layer.js +20 -10
  193. package/esm2015/lib/layer/shared/layers/vectortile-layer.interface.js +1 -1
  194. package/esm2015/lib/layer/shared/layers/vectortile-layer.js +13 -3
  195. package/esm2015/lib/layer/shared/style.service.js +21 -16
  196. package/esm2015/lib/layer/shared/vector-style.interface.js +1 -1
  197. package/esm2015/lib/layer/track-feature-button/index.js +1 -1
  198. package/esm2015/lib/layer/track-feature-button/track-feature-button.component.js +1 -1
  199. package/esm2015/lib/layer/utils/index.js +2 -1
  200. package/esm2015/lib/layer/utils/layer.utils.js +11 -0
  201. package/esm2015/lib/layer/utils/layerSync-watcher.js +1 -1
  202. package/esm2015/lib/layer/utils/tile-watcher.js +1 -1
  203. package/esm2015/lib/map/baselayers-switcher/baselayers-switcher.animation.js +1 -1
  204. package/esm2015/lib/map/baselayers-switcher/index.js +1 -1
  205. package/esm2015/lib/map/baselayers-switcher/mini-basemap.component.js +1 -1
  206. package/esm2015/lib/map/geolocate-button/geolocate-button.component.js +1 -1
  207. package/esm2015/lib/map/geolocate-button/index.js +1 -1
  208. package/esm2015/lib/map/index.js +2 -1
  209. package/esm2015/lib/map/map-browser/index.js +1 -1
  210. package/esm2015/lib/map/map-browser/map-browser.component.js +1 -1
  211. package/esm2015/lib/map/map.module.js +10 -5
  212. package/esm2015/lib/map/menu-button/index.js +2 -0
  213. package/esm2015/lib/map/menu-button/menu-button.component.js +66 -0
  214. package/esm2015/lib/map/offline-button/index.js +1 -1
  215. package/esm2015/lib/map/offline-button/offline-button.component.js +1 -1
  216. package/esm2015/lib/map/rotation-button/index.js +1 -1
  217. package/esm2015/lib/map/rotation-button/rotation-button.component.js +1 -1
  218. package/esm2015/lib/map/shared/controllers/index.js +1 -1
  219. package/esm2015/lib/map/shared/hover-feature.directive.js +231 -80
  220. package/esm2015/lib/map/shared/map-pointer-position.directive.js +3 -1
  221. package/esm2015/lib/map/shared/map.enums.js +1 -1
  222. package/esm2015/lib/map/shared/map.interface.js +1 -1
  223. package/esm2015/lib/map/shared/map.js +38 -16
  224. package/esm2015/lib/map/shared/map.service.js +1 -1
  225. package/esm2015/lib/map/shared/map.utils.js +7 -3
  226. package/esm2015/lib/map/shared/projection.service.js +1 -1
  227. package/esm2015/lib/map/shared/projection.utils.js +1 -1
  228. package/esm2015/lib/map/swipe-control/swipe-control.component.js +1 -1
  229. package/esm2015/lib/map/zoom-button/index.js +1 -1
  230. package/esm2015/lib/map/zoom-button/zoom-button.component.js +1 -1
  231. package/esm2015/lib/measure/index.js +1 -1
  232. package/esm2015/lib/measure/measure.module.js +1 -1
  233. package/esm2015/lib/measure/measurer/measure-format.pipe.js +1 -1
  234. package/esm2015/lib/measure/measurer/measurer-dialog.component.js +188 -176
  235. package/esm2015/lib/measure/measurer/measurer-item.component.js +17 -12
  236. package/esm2015/lib/measure/measurer/measurer.component.js +170 -69
  237. package/esm2015/lib/measure/measurer/measurer.module.js +13 -8
  238. package/esm2015/lib/measure/shared/index.js +1 -1
  239. package/esm2015/lib/measure/shared/measure.enum.js +1 -1
  240. package/esm2015/lib/measure/shared/measure.interfaces.js +1 -1
  241. package/esm2015/lib/measure/shared/measure.utils.js +1 -1
  242. package/esm2015/lib/metadata/index.js +1 -1
  243. package/esm2015/lib/metadata/metadata-button/index.js +1 -1
  244. package/esm2015/lib/metadata/shared/index.js +1 -1
  245. package/esm2015/lib/metadata/shared/metadata.service.js +1 -1
  246. package/esm2015/lib/overlay/index.js +1 -1
  247. package/esm2015/lib/overlay/overlay.module.js +1 -1
  248. package/esm2015/lib/overlay/shared/index.js +1 -1
  249. package/esm2015/lib/overlay/shared/overlay-marker-style.utils.js +2 -2
  250. package/esm2015/lib/overlay/shared/overlay.directive.js +1 -1
  251. package/esm2015/lib/overlay/shared/overlay.enum.js +1 -1
  252. package/esm2015/lib/overlay/shared/overlay.service.js +1 -1
  253. package/esm2015/lib/print/index.js +1 -1
  254. package/esm2015/lib/print/print-form/index.js +1 -1
  255. package/esm2015/lib/print/print.module.js +1 -1
  256. package/esm2015/lib/print/shared/index.js +1 -1
  257. package/esm2015/lib/print/shared/print.service.js +1 -1
  258. package/esm2015/lib/query/index.js +1 -1
  259. package/esm2015/lib/query/query.module.js +1 -1
  260. package/esm2015/lib/query/shared/index.js +1 -1
  261. package/esm2015/lib/query/shared/query-search-source.js +1 -1
  262. package/esm2015/lib/query/shared/query-search-source.providers.js +1 -1
  263. package/esm2015/lib/query/shared/query.directive.js +4 -4
  264. package/esm2015/lib/query/shared/query.enums.js +1 -1
  265. package/esm2015/lib/query/shared/query.interfaces.js +1 -1
  266. package/esm2015/lib/query/shared/query.service.js +24 -3
  267. package/esm2015/lib/query/shared/query.utils.js +19 -1
  268. package/esm2015/lib/search/index.js +1 -1
  269. package/esm2015/lib/search/search-bar/search-bar.component.js +2 -2
  270. package/esm2015/lib/search/search-bar/search-bar.module.js +1 -1
  271. package/esm2015/lib/search/search-bar/search-url-param.directive.js +1 -1
  272. package/esm2015/lib/search/search-results/search-results-add-button.component.js +2 -2
  273. package/esm2015/lib/search/search-results/search-results-item.component.js +1 -1
  274. package/esm2015/lib/search/search-results/search-results.component.js +1 -1
  275. package/esm2015/lib/search/search-results/search-results.module.js +1 -1
  276. package/esm2015/lib/search/search-selector/search-selector.component.js +1 -1
  277. package/esm2015/lib/search/search-selector/search-selector.module.js +1 -1
  278. package/esm2015/lib/search/search-settings/search-settings.module.js +1 -1
  279. package/esm2015/lib/search/shared/index.js +1 -1
  280. package/esm2015/lib/search/shared/search-pointer-summary.directive.js +17 -6
  281. package/esm2015/lib/search/shared/search-source-service.providers.js +1 -1
  282. package/esm2015/lib/search/shared/search-source.service.js +1 -1
  283. package/esm2015/lib/search/shared/search.enums.js +1 -1
  284. package/esm2015/lib/search/shared/search.interfaces.js +1 -1
  285. package/esm2015/lib/search/shared/search.utils.js +1 -1
  286. package/esm2015/lib/search/shared/sources/cadastre.js +9 -2
  287. package/esm2015/lib/search/shared/sources/coordinates.interfaces.js +1 -1
  288. package/esm2015/lib/search/shared/sources/coordinates.js +9 -2
  289. package/esm2015/lib/search/shared/sources/icherche.js +17 -4
  290. package/esm2015/lib/search/shared/sources/ilayer.interfaces.js +1 -1
  291. package/esm2015/lib/search/shared/sources/ilayer.js +9 -2
  292. package/esm2015/lib/search/shared/sources/index.js +1 -1
  293. package/esm2015/lib/search/shared/sources/nominatim.interfaces.js +1 -1
  294. package/esm2015/lib/search/shared/sources/nominatim.js +9 -2
  295. package/esm2015/lib/search/shared/sources/storedqueries.interfaces.js +1 -1
  296. package/esm2015/lib/search/shared/sources/storedqueries.js +20 -12
  297. package/esm2015/lib/toast/index.js +1 -1
  298. package/esm2015/lib/toast/toast.component.js +1 -1
  299. package/esm2015/lib/toast/toast.module.js +1 -1
  300. package/esm2015/lib/utils/commonVectorStyle.interface.js +1 -1
  301. package/esm2015/lib/utils/googleLinks.js +1 -1
  302. package/esm2015/lib/utils/osmLinks.js +1 -1
  303. package/esm2015/lib/wkt/index.js +1 -1
  304. package/esm2015/lib/wkt/shared/index.js +1 -1
  305. package/esm2015/lib/wkt/shared/wkt.service.js +15 -15
  306. package/esm2015/lib/wkt/wkt.module.js +1 -1
  307. package/esm2015/lib/workspace/index.js +1 -1
  308. package/esm2015/lib/workspace/shared/feature-workspace.js +1 -1
  309. package/esm2015/lib/workspace/shared/feature-workspace.service.js +1 -1
  310. package/esm2015/lib/workspace/shared/index.js +1 -1
  311. package/esm2015/lib/workspace/shared/wfs-workspace.js +1 -1
  312. package/esm2015/lib/workspace/shared/wfs-workspace.service.js +1 -1
  313. package/esm2015/lib/workspace/shared/wms-workspace.service.js +1 -1
  314. package/esm2015/lib/workspace/widgets/index.js +1 -1
  315. package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.component.js +1 -1
  316. package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.module.js +1 -1
  317. package/esm2015/lib/workspace/widgets/widgets.js +1 -1
  318. package/esm2015/lib/workspace/workspace-selector/workspace-selector.directive.js +1 -1
  319. package/esm2015/lib/workspace/workspace-selector/workspace-selector.module.js +1 -1
  320. package/esm2015/lib/workspace/workspace-updator/workspace-updator.directive.js +1 -1
  321. package/esm2015/lib/workspace/workspace-updator/workspace-updator.module.js +1 -1
  322. package/esm2015/lib/workspace/workspace.module.js +1 -1
  323. package/fesm2015/igo2-geo.js +3221 -2431
  324. package/fesm2015/igo2-geo.js.map +1 -1
  325. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +1 -1
  326. package/lib/datasource/shared/datasources/datasource.interface.d.ts +1 -0
  327. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +29 -0
  328. package/lib/directions/directions-buttons/index.d.ts +1 -0
  329. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +45 -0
  330. package/lib/directions/directions-inputs/index.d.ts +1 -0
  331. package/lib/directions/directions-results/directions-results.component.d.ts +30 -0
  332. package/lib/directions/directions-results/index.d.ts +1 -0
  333. package/lib/directions/directions-sources/directions-source.d.ts +2 -2
  334. package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
  335. package/lib/directions/directions.component.d.ts +55 -0
  336. package/lib/directions/directions.module.d.ts +19 -16
  337. package/lib/directions/index.d.ts +4 -1
  338. package/lib/directions/shared/directions.enum.d.ts +16 -2
  339. package/lib/directions/shared/directions.interface.d.ts +53 -3
  340. package/lib/directions/shared/directions.service.d.ts +3 -3
  341. package/lib/directions/shared/directions.utils.d.ts +42 -0
  342. package/lib/directions/shared/index.d.ts +2 -0
  343. package/lib/directions/shared/store.d.ts +18 -0
  344. package/lib/draw/draw/draw-popup.component.d.ts +6 -2
  345. package/lib/feature/shared/strategies/selection.d.ts +1 -0
  346. package/lib/filter/filter.module.d.ts +1 -1
  347. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +6 -1
  348. package/lib/filter/shared/ogc-filter.interface.d.ts +1 -0
  349. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +7 -2
  350. package/lib/import-export/import-export/import-export.component.d.ts +2 -0
  351. package/lib/import-export/shared/export.interface.d.ts +2 -1
  352. package/lib/layer/layer-legend/layer-legend.component.d.ts +0 -1
  353. package/lib/layer/layer.module.d.ts +1 -1
  354. package/lib/layer/shared/layer.service.d.ts +1 -1
  355. package/lib/layer/shared/layers/layer.d.ts +1 -0
  356. package/lib/layer/shared/layers/tile-layer.d.ts +10 -1
  357. package/lib/layer/shared/layers/vector-layer.interface.d.ts +1 -0
  358. package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +1 -0
  359. package/lib/layer/shared/style.service.d.ts +4 -1
  360. package/lib/layer/shared/vector-style.interface.d.ts +9 -5
  361. package/lib/layer/utils/index.d.ts +1 -0
  362. package/lib/layer/utils/layer.utils.d.ts +2 -0
  363. package/lib/map/index.d.ts +1 -0
  364. package/lib/map/map.module.d.ts +8 -7
  365. package/lib/map/menu-button/index.d.ts +1 -0
  366. package/lib/map/menu-button/menu-button.component.d.ts +17 -0
  367. package/lib/map/shared/hover-feature.directive.d.ts +14 -5
  368. package/lib/map/shared/map.d.ts +2 -1
  369. package/lib/map/shared/map.interface.d.ts +1 -0
  370. package/lib/map/shared/map.utils.d.ts +1 -1
  371. package/lib/measure/measurer/measurer.component.d.ts +10 -0
  372. package/lib/measure/measurer/measurer.module.d.ts +4 -3
  373. package/lib/query/shared/query.interfaces.d.ts +2 -0
  374. package/lib/query/shared/query.service.d.ts +9 -1
  375. package/lib/query/shared/query.utils.d.ts +12 -0
  376. package/lib/search/shared/search-pointer-summary.directive.d.ts +6 -0
  377. package/lib/search/shared/search.interfaces.d.ts +1 -0
  378. package/ngcc.config.js +3 -3
  379. package/package.json +14 -13
  380. package/esm2015/lib/directions/directions-form/directions-form-binding.directive.js +0 -99
  381. package/esm2015/lib/directions/directions-form/directions-form.component.js +0 -1537
  382. package/esm2015/lib/directions/directions-form/directions-form.service.js +0 -26
  383. package/esm2015/lib/directions/directions-form/index.js +0 -4
  384. package/lib/directions/directions-form/directions-form-binding.directive.d.ts +0 -18
  385. package/lib/directions/directions-form/directions-form.component.d.ts +0 -137
  386. package/lib/directions/directions-form/directions-form.service.d.ts +0 -11
  387. package/lib/directions/directions-form/index.d.ts +0 -3
@@ -1,1537 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, Optional } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import { Subject, BehaviorSubject } from 'rxjs';
4
- import { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';
5
- import olFeature from 'ol/Feature';
6
- import OlGeoJSON from 'ol/format/GeoJSON';
7
- import * as olgeom from 'ol/geom';
8
- import * as olproj from 'ol/proj';
9
- import * as olstyle from 'ol/style';
10
- import * as olcondition from 'ol/events/condition';
11
- import * as olinteraction from 'ol/interaction';
12
- import * as olobservable from 'ol/Observable';
13
- import { Clipboard } from '@igo2/utils';
14
- import { getEntityTitle } from '@igo2/common';
15
- import { VectorLayer } from '../../layer/shared/layers/vector-layer';
16
- import { FeatureDataSource } from '../../datasource/shared/datasources/feature-datasource';
17
- import { FeatureMotion, FEATURE } from '../../feature/shared/feature.enums';
18
- import { moveToOlFeatures, tryBindStoreLayer } from '../../feature/shared/feature.utils';
19
- import { tryAddLoadingStrategy } from '../../feature/shared/strategies.utils';
20
- import { FeatureStoreLoadingStrategy } from '../../feature/shared/strategies/loading';
21
- import { roundCoordTo } from '../../map/shared/map.utils';
22
- import { createOverlayMarkerStyle } from '../../overlay/shared/overlay-marker-style.utils';
23
- import * as i0 from "@angular/core";
24
- import * as i1 from "@angular/forms";
25
- import * as i2 from "../shared/directions.service";
26
- import * as i3 from "@igo2/core";
27
- import * as i4 from "../../search/shared/search.service";
28
- import * as i5 from "../../query/shared/query.service";
29
- import * as i6 from "./directions-form.service";
30
- import * as i7 from "@angular/common";
31
- import * as i8 from "@angular/material/button";
32
- import * as i9 from "@angular/material/tooltip";
33
- import * as i10 from "@angular/material/icon";
34
- import * as i11 from "@angular/material/list";
35
- import * as i12 from "@angular/material/form-field";
36
- import * as i13 from "@angular/material/input";
37
- import * as i14 from "@angular/material/autocomplete";
38
- import * as i15 from "@angular/material/core";
39
- import * as i16 from "@angular/material/divider";
40
- import * as i17 from "@angular/material/select";
41
- import * as i18 from "@ngx-translate/core";
42
- function DirectionsFormComponent_div_1_button_4_Template(rf, ctx) { if (rf & 1) {
43
- const _r16 = i0.ɵɵgetCurrentView();
44
- i0.ɵɵelementStart(0, "button", 17);
45
- i0.ɵɵlistener("click", function DirectionsFormComponent_div_1_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const i_r7 = i0.ɵɵnextContext().index; const ctx_r14 = i0.ɵɵnextContext(); return ctx_r14.geolocateStop(i_r7); });
46
- i0.ɵɵpipe(1, "translate");
47
- i0.ɵɵelement(2, "mat-icon", 18);
48
- i0.ɵɵelementEnd();
49
- } if (rf & 2) {
50
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.geolocate"));
51
- } }
52
- function DirectionsFormComponent_div_1_button_8_Template(rf, ctx) { if (rf & 1) {
53
- const _r19 = i0.ɵɵgetCurrentView();
54
- i0.ɵɵelementStart(0, "button", 19);
55
- i0.ɵɵlistener("click", function DirectionsFormComponent_div_1_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const i_r7 = i0.ɵɵnextContext().index; const ctx_r17 = i0.ɵɵnextContext(); return ctx_r17.clearStop(i_r7); });
56
- i0.ɵɵelement(1, "mat-icon", 20);
57
- i0.ɵɵelementEnd();
58
- } }
59
- function DirectionsFormComponent_div_1_mat_optgroup_11_mat_option_1_Template(rf, ctx) { if (rf & 1) {
60
- const _r24 = i0.ɵɵgetCurrentView();
61
- i0.ɵɵelementStart(0, "mat-option", 23);
62
- i0.ɵɵlistener("onSelectionChange", function DirectionsFormComponent_div_1_mat_optgroup_11_mat_option_1_Template_mat_option_onSelectionChange_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r24); const result_r22 = restoredCtx.$implicit; const i_r7 = i0.ɵɵnextContext(2).index; const ctx_r23 = i0.ɵɵnextContext(); return ctx_r23.chooseProposal(result_r22, i_r7); });
63
- i0.ɵɵtext(1);
64
- i0.ɵɵelementEnd();
65
- } if (rf & 2) {
66
- const result_r22 = ctx.$implicit;
67
- i0.ɵɵproperty("value", result_r22.meta ? result_r22.meta.title : "")("matTooltip", result_r22.meta ? result_r22.meta.title : "");
68
- i0.ɵɵadvance(1);
69
- i0.ɵɵtextInterpolate1(" ", result_r22.meta ? result_r22.meta.title : "", " ");
70
- } }
71
- function DirectionsFormComponent_div_1_mat_optgroup_11_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵelementStart(0, "mat-optgroup", 21);
73
- i0.ɵɵtemplate(1, DirectionsFormComponent_div_1_mat_optgroup_11_mat_option_1_Template, 2, 3, "mat-option", 22);
74
- i0.ɵɵelementEnd();
75
- } if (rf & 2) {
76
- const source_r20 = ctx.$implicit;
77
- i0.ɵɵproperty("label", source_r20.source.title)("disabled", source_r20.source.enabled === false);
78
- i0.ɵɵadvance(1);
79
- i0.ɵɵproperty("ngForOf", source_r20.results);
80
- } }
81
- function DirectionsFormComponent_div_1_button_12_Template(rf, ctx) { if (rf & 1) {
82
- const _r28 = i0.ɵɵgetCurrentView();
83
- i0.ɵɵelementStart(0, "button", 24);
84
- i0.ɵɵlistener("click", function DirectionsFormComponent_div_1_button_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const i_r7 = i0.ɵɵnextContext().index; const ctx_r26 = i0.ɵɵnextContext(); return ctx_r26.removeStop(i_r7); });
85
- i0.ɵɵpipe(1, "translate");
86
- i0.ɵɵelement(2, "mat-icon", 25);
87
- i0.ɵɵelementEnd();
88
- } if (rf & 2) {
89
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.removeStop"));
90
- } }
91
- function DirectionsFormComponent_div_1_Template(rf, ctx) { if (rf & 1) {
92
- const _r30 = i0.ɵɵgetCurrentView();
93
- i0.ɵɵelementStart(0, "div", 8, 9);
94
- i0.ɵɵelementStart(2, "mat-list-item", 10);
95
- i0.ɵɵelementStart(3, "div", 11);
96
- i0.ɵɵtemplate(4, DirectionsFormComponent_div_1_button_4_Template, 3, 3, "button", 12);
97
- i0.ɵɵelementStart(5, "mat-form-field");
98
- i0.ɵɵelementStart(6, "input", 13);
99
- i0.ɵɵlistener("focus", function DirectionsFormComponent_div_1_Template_input_focus_6_listener() { const restoredCtx = i0.ɵɵrestoreView(_r30); const i_r7 = restoredCtx.index; const ctx_r29 = i0.ɵɵnextContext(); return ctx_r29.focus(i_r7); })("keyup", function DirectionsFormComponent_div_1_Template_input_keyup_6_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r30); const i_r7 = restoredCtx.index; const ctx_r31 = i0.ɵɵnextContext(); return ctx_r31.keyup(i_r7, $event); })("keydown.enter", function DirectionsFormComponent_div_1_Template_input_keydown_enter_6_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r32 = i0.ɵɵnextContext(); return ctx_r32.prevent($event); });
100
- i0.ɵɵpipe(7, "translate");
101
- i0.ɵɵelementEnd();
102
- i0.ɵɵtemplate(8, DirectionsFormComponent_div_1_button_8_Template, 2, 0, "button", 14);
103
- i0.ɵɵelementStart(9, "mat-autocomplete", null, 15);
104
- i0.ɵɵtemplate(11, DirectionsFormComponent_div_1_mat_optgroup_11_Template, 2, 3, "mat-optgroup", 16);
105
- i0.ɵɵelementEnd();
106
- i0.ɵɵelementEnd();
107
- i0.ɵɵtemplate(12, DirectionsFormComponent_div_1_button_12_Template, 3, 3, "button", 6);
108
- i0.ɵɵelementEnd();
109
- i0.ɵɵelementEnd();
110
- i0.ɵɵelementEnd();
111
- } if (rf & 2) {
112
- const stop_r6 = ctx.$implicit;
113
- const i_r7 = ctx.index;
114
- const _r11 = i0.ɵɵreference(10);
115
- const ctx_r0 = i0.ɵɵnextContext();
116
- i0.ɵɵadvance(2);
117
- i0.ɵɵproperty("formGroupName", i_r7);
118
- i0.ɵɵadvance(2);
119
- i0.ɵɵproperty("ngIf", ctx_r0.map.geolocationFeature);
120
- i0.ɵɵadvance(2);
121
- i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(7, 7, "igo.geo.directionsForm." + stop_r6.value.directionsText));
122
- i0.ɵɵproperty("matAutocomplete", _r11);
123
- i0.ɵɵadvance(2);
124
- i0.ɵɵproperty("ngIf", stop_r6.value && (stop_r6.value.stopPoint.length > 0 || stop_r6.value.stopProposals.length > 0));
125
- i0.ɵɵadvance(3);
126
- i0.ɵɵproperty("ngForOf", stop_r6.value.stopProposals);
127
- i0.ɵɵadvance(1);
128
- i0.ɵɵproperty("ngIf", i_r7 !== 0 && i_r7 !== ctx_r0.stops.length - 1);
129
- } }
130
- function DirectionsFormComponent_button_6_Template(rf, ctx) { if (rf & 1) {
131
- const _r34 = i0.ɵɵgetCurrentView();
132
- i0.ɵɵelementStart(0, "button", 3);
133
- i0.ɵɵlistener("click", function DirectionsFormComponent_button_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r33 = i0.ɵɵnextContext(); return ctx_r33.zoomRoute(); });
134
- i0.ɵɵpipe(1, "translate");
135
- i0.ɵɵelement(2, "mat-icon", 26);
136
- i0.ɵɵelementEnd();
137
- } if (rf & 2) {
138
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.zoomRoute"));
139
- } }
140
- function DirectionsFormComponent_button_7_Template(rf, ctx) { if (rf & 1) {
141
- const _r36 = i0.ɵɵgetCurrentView();
142
- i0.ɵɵelementStart(0, "button", 24);
143
- i0.ɵɵlistener("click", function DirectionsFormComponent_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r36); const ctx_r35 = i0.ɵɵnextContext(); return ctx_r35.resetForm(true); });
144
- i0.ɵɵpipe(1, "translate");
145
- i0.ɵɵelement(2, "mat-icon", 27);
146
- i0.ɵɵelementEnd();
147
- } if (rf & 2) {
148
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.resetDirectionsBtn"));
149
- } }
150
- function DirectionsFormComponent_button_8_Template(rf, ctx) { if (rf & 1) {
151
- const _r38 = i0.ɵɵgetCurrentView();
152
- i0.ɵɵelementStart(0, "button", 3);
153
- i0.ɵɵlistener("click", function DirectionsFormComponent_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r37 = i0.ɵɵnextContext(); return ctx_r37.copyDirectionsToClipboard(); });
154
- i0.ɵɵpipe(1, "translate");
155
- i0.ɵɵelement(2, "mat-icon", 28);
156
- i0.ɵɵelementEnd();
157
- } if (rf & 2) {
158
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.copy"));
159
- } }
160
- function DirectionsFormComponent_button_9_Template(rf, ctx) { if (rf & 1) {
161
- const _r40 = i0.ɵɵgetCurrentView();
162
- i0.ɵɵelementStart(0, "button", 3);
163
- i0.ɵɵlistener("click", function DirectionsFormComponent_button_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r40); const ctx_r39 = i0.ɵɵnextContext(); return ctx_r39.copyLinkToClipboard(); });
164
- i0.ɵɵpipe(1, "translate");
165
- i0.ɵɵelement(2, "mat-icon", 29);
166
- i0.ɵɵelementEnd();
167
- } if (rf & 2) {
168
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.link"));
169
- } }
170
- function DirectionsFormComponent_div_10_mat_form_field_1_mat_option_3_Template(rf, ctx) { if (rf & 1) {
171
- i0.ɵɵelementStart(0, "mat-option", 36);
172
- i0.ɵɵtext(1);
173
- i0.ɵɵelementEnd();
174
- } if (rf & 2) {
175
- const pathDirections_r45 = ctx.$implicit;
176
- const cnt_r46 = ctx.index;
177
- const ctx_r44 = i0.ɵɵnextContext(3);
178
- i0.ɵɵproperty("value", pathDirections_r45);
179
- i0.ɵɵadvance(1);
180
- i0.ɵɵtextInterpolate3(" Option ", cnt_r46 + 1, " : ", ctx_r44.formatDistance(pathDirections_r45.distance), " (", ctx_r44.formatDuration(pathDirections_r45.duration), ") ");
181
- } }
182
- function DirectionsFormComponent_div_10_mat_form_field_1_Template(rf, ctx) { if (rf & 1) {
183
- const _r48 = i0.ɵɵgetCurrentView();
184
- i0.ɵɵelementStart(0, "mat-form-field");
185
- i0.ɵɵelementStart(1, "mat-select", 34);
186
- i0.ɵɵlistener("selectionChange", function DirectionsFormComponent_div_10_mat_form_field_1_Template_mat_select_selectionChange_1_listener() { i0.ɵɵrestoreView(_r48); const ctx_r47 = i0.ɵɵnextContext(2); return ctx_r47.changeRoute(); })("ngModelChange", function DirectionsFormComponent_div_10_mat_form_field_1_Template_mat_select_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r48); const ctx_r49 = i0.ɵɵnextContext(2); return ctx_r49.activeRoute = $event; });
187
- i0.ɵɵpipe(2, "translate");
188
- i0.ɵɵtemplate(3, DirectionsFormComponent_div_10_mat_form_field_1_mat_option_3_Template, 2, 4, "mat-option", 35);
189
- i0.ɵɵelementEnd();
190
- i0.ɵɵelementEnd();
191
- } if (rf & 2) {
192
- const ctx_r41 = i0.ɵɵnextContext(2);
193
- i0.ɵɵadvance(1);
194
- i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(2, 3, "igo.geo.directionsForm.drivingOptions"));
195
- i0.ɵɵproperty("ngModel", ctx_r41.activeRoute);
196
- i0.ɵɵadvance(2);
197
- i0.ɵɵproperty("ngForOf", ctx_r41.routesResults);
198
- } }
199
- function DirectionsFormComponent_div_10_mat_divider_2_Template(rf, ctx) { if (rf & 1) {
200
- i0.ɵɵelement(0, "mat-divider");
201
- } }
202
- function DirectionsFormComponent_div_10_mat_list_item_8_Template(rf, ctx) { if (rf & 1) {
203
- const _r53 = i0.ɵɵgetCurrentView();
204
- i0.ɵɵelementStart(0, "mat-list-item", 37);
205
- i0.ɵɵlistener("mouseenter", function DirectionsFormComponent_div_10_mat_list_item_8_Template_mat_list_item_mouseenter_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r53); const step_r50 = restoredCtx.$implicit; const ctx_r52 = i0.ɵɵnextContext(2); return ctx_r52.showSegment(step_r50); })("click", function DirectionsFormComponent_div_10_mat_list_item_8_Template_mat_list_item_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r53); const step_r50 = restoredCtx.$implicit; const ctx_r54 = i0.ɵɵnextContext(2); return ctx_r54.showSegment(step_r50, true); });
206
- i0.ɵɵelement(1, "mat-icon", 38);
207
- i0.ɵɵelementStart(2, "h4", 39);
208
- i0.ɵɵtext(3);
209
- i0.ɵɵelementEnd();
210
- i0.ɵɵelementStart(4, "h4", 40);
211
- i0.ɵɵtext(5);
212
- i0.ɵɵelementEnd();
213
- i0.ɵɵelementEnd();
214
- } if (rf & 2) {
215
- const step_r50 = ctx.$implicit;
216
- const cnt_r51 = ctx.index;
217
- const ctx_r43 = i0.ɵɵnextContext(2);
218
- i0.ɵɵadvance(1);
219
- i0.ɵɵpropertyInterpolate("svgIcon", ctx_r43.formatStep(step_r50, cnt_r51).image);
220
- i0.ɵɵproperty("ngClass", ctx_r43.formatStep(step_r50, cnt_r51).cssClass);
221
- i0.ɵɵadvance(2);
222
- i0.ɵɵtextInterpolate2("", cnt_r51 + 1, ". ", ctx_r43.formatStep(step_r50, cnt_r51).instruction, "");
223
- i0.ɵɵadvance(2);
224
- i0.ɵɵtextInterpolate(ctx_r43.formatDistance(step_r50.distance));
225
- } }
226
- function DirectionsFormComponent_div_10_Template(rf, ctx) { if (rf & 1) {
227
- i0.ɵɵelementStart(0, "div", 11);
228
- i0.ɵɵtemplate(1, DirectionsFormComponent_div_10_mat_form_field_1_Template, 4, 5, "mat-form-field", 30);
229
- i0.ɵɵtemplate(2, DirectionsFormComponent_div_10_mat_divider_2_Template, 1, 0, "mat-divider", 30);
230
- i0.ɵɵelementStart(3, "mat-list");
231
- i0.ɵɵelementStart(4, "h2", 31);
232
- i0.ɵɵtext(5);
233
- i0.ɵɵelementEnd();
234
- i0.ɵɵelementStart(6, "h2", 32);
235
- i0.ɵɵtext(7);
236
- i0.ɵɵelementEnd();
237
- i0.ɵɵtemplate(8, DirectionsFormComponent_div_10_mat_list_item_8_Template, 6, 5, "mat-list-item", 33);
238
- i0.ɵɵelement(9, "mat-divider");
239
- i0.ɵɵelementEnd();
240
- i0.ɵɵelementEnd();
241
- } if (rf & 2) {
242
- const ctx_r5 = i0.ɵɵnextContext();
243
- i0.ɵɵadvance(1);
244
- i0.ɵɵproperty("ngIf", ctx_r5.routesResults && ctx_r5.routesResults.length > 1);
245
- i0.ɵɵadvance(1);
246
- i0.ɵɵproperty("ngIf", ctx_r5.routesResults && ctx_r5.routesResults.length === 0);
247
- i0.ɵɵadvance(3);
248
- i0.ɵɵtextInterpolate(ctx_r5.activeRoute.title);
249
- i0.ɵɵadvance(2);
250
- i0.ɵɵtextInterpolate2("", ctx_r5.formatDistance(ctx_r5.activeRoute.distance), ", ", ctx_r5.formatDuration(ctx_r5.activeRoute.duration), "");
251
- i0.ɵɵadvance(1);
252
- i0.ɵɵproperty("ngForOf", ctx_r5.activeRoute.steps);
253
- } }
254
- export class DirectionsFormComponent {
255
- constructor(formBuilder, directionsService, languageService, messageService, searchService, queryService, directionsFormService, changeDetectorRefs, route) {
256
- this.formBuilder = formBuilder;
257
- this.directionsService = directionsService;
258
- this.languageService = languageService;
259
- this.messageService = messageService;
260
- this.searchService = searchService;
261
- this.queryService = queryService;
262
- this.directionsFormService = directionsFormService;
263
- this.changeDetectorRefs = changeDetectorRefs;
264
- this.route = route;
265
- this.invalidKeys = ['Control', 'Shift', 'Alt'];
266
- this.subscriptions$$ = [];
267
- this.projection = 'EPSG:4326';
268
- this.routesQueries$$ = [];
269
- this.stream$ = new Subject();
270
- this.activeRoute$ = new BehaviorSubject(undefined);
271
- this.focusOnStop = false;
272
- this.focusKey = [];
273
- this.debounce = 200;
274
- this.length = 2;
275
- this.stopsStore$ = new BehaviorSubject(undefined);
276
- this.activeRouteDescription = new EventEmitter();
277
- }
278
- get activeRoute() {
279
- return this._activeRoute;
280
- }
281
- set activeRoute(value) {
282
- this._activeRoute = value;
283
- if (value && this.activeRoute$.getValue() && value.id !== this.activeRoute$.getValue().id) {
284
- this.activeRoute$.next(value);
285
- }
286
- this.activeRouteDescription.emit(this.directionsToText());
287
- }
288
- /**
289
- * The stops store
290
- */
291
- get stopsStore() {
292
- return this._stopsStore;
293
- }
294
- set stopsStore(value) {
295
- this._stopsStore = value;
296
- this.stopsStore$.next(value);
297
- }
298
- get routeFromFeatureDetail() {
299
- return this._routeFromFeatureDetail;
300
- }
301
- set routeFromFeatureDetail(value) {
302
- this._routeFromFeatureDetail = value;
303
- }
304
- changeRoute() {
305
- this.showRouteGeometry(true);
306
- }
307
- prevent(event) {
308
- event.preventDefault();
309
- }
310
- ngOnInit() {
311
- this.queryService.queryEnabled = false;
312
- this.focusOnStop = false;
313
- this.browserLanguage = this.languageService.getLanguage();
314
- this.stopsForm = this.formBuilder.group({
315
- directionsType: 'car',
316
- directionsMode: 'driving',
317
- stopOrderPriority: true,
318
- directionsFixedStartEnd: false,
319
- stops: this.formBuilder.array([
320
- this.createStop('start'),
321
- this.createStop('end')
322
- ])
323
- });
324
- setTimeout(() => {
325
- this.initStores();
326
- this.initOlInteraction();
327
- }, 1);
328
- this.subscribeToFormChange();
329
- this.routesQueries$$.push(this.stream$
330
- .pipe(debounceTime(this.debounce), distinctUntilChanged())
331
- .subscribe((term) => this.handleTermChanged(term)));
332
- this.stopsStore$.subscribe(() => {
333
- if (this.routeFromFeatureDetail === true) {
334
- this.directionsFormService.setStops([]);
335
- setTimeout(() => {
336
- this.resetForm(false);
337
- for (const feature of this.stopsStore.all()) {
338
- if (feature.properties.id && feature.properties.id.toString().startsWith('directionsStop')) {
339
- this.stopsStore.delete(feature);
340
- }
341
- }
342
- if (this.stopsStore.all().length === 2) {
343
- let i = 0;
344
- const coordinates = [];
345
- for (const feature of this.stopsStore.all()) {
346
- coordinates.push(feature.geometry.coordinates);
347
- this.handleLocationProposals(feature.geometry.coordinates, i);
348
- this.chooseProposal(feature, i);
349
- i++;
350
- }
351
- this.writeStopsToFormService(coordinates);
352
- const routeResponse = this.directionsService.route(coordinates, {});
353
- if (routeResponse) {
354
- routeResponse.map(res => this.routesQueries$$.push(res.subscribe(route => {
355
- this.routesResults = route;
356
- this.activeRoute = this.routesResults[0];
357
- this.showRouteGeometry(true);
358
- this.changeDetectorRefs.detectChanges();
359
- })));
360
- }
361
- }
362
- else if (this.stopsStore.all().length === 1) {
363
- this.handleLocationProposals(this.stopsStore.all()[0].geometry.coordinates, 1);
364
- this.chooseProposal(this.stopsStore.all()[0], 1);
365
- this.writeStopsToFormService(this.stopsStore.all()[0].geometry.coordinates);
366
- }
367
- }, 1);
368
- this.routeFromFeatureDetail = false;
369
- }
370
- });
371
- }
372
- ngOnDestroy() {
373
- this.unsubscribeRoutesQueries();
374
- this.unlistenSingleClick();
375
- this.queryService.queryEnabled = true;
376
- this.freezeStores();
377
- this.writeStopsToFormService();
378
- this.subscriptions$$.map(s => s.unsubscribe());
379
- }
380
- initStores() {
381
- const loadingStrategy = new FeatureStoreLoadingStrategy({
382
- motion: FeatureMotion.None
383
- });
384
- // STOP STORE
385
- const stopsStore = this.stopsStore;
386
- const stopsLayer = new VectorLayer({
387
- id: 'igo-direction-stops-layer',
388
- title: this.languageService.translate.instant('igo.geo.directionsForm.stopLayer'),
389
- zIndex: 911,
390
- source: new FeatureDataSource(),
391
- showInLayerList: true,
392
- workspace: {
393
- enabled: false,
394
- },
395
- linkedLayers: {
396
- linkId: 'igo-direction-stops-layer',
397
- links: [
398
- {
399
- bidirectionnal: false,
400
- syncedDelete: true,
401
- linkedIds: ['igo-direction-route-layer'],
402
- properties: []
403
- }
404
- ]
405
- },
406
- exportable: true,
407
- browsable: false,
408
- style: stopMarker
409
- });
410
- tryBindStoreLayer(stopsStore, stopsLayer);
411
- stopsStore.layer.visible = true;
412
- tryAddLoadingStrategy(stopsStore, loadingStrategy);
413
- // ROUTE AND VERTEX STORE
414
- const routeStore = this.routeStore;
415
- const routeLayer = new VectorLayer({
416
- id: 'igo-direction-route-layer',
417
- title: this.languageService.translate.instant('igo.geo.directionsForm.routeLayer'),
418
- zIndex: 910,
419
- source: new FeatureDataSource(),
420
- showInLayerList: true,
421
- workspace: {
422
- enabled: false,
423
- },
424
- linkedLayers: {
425
- linkId: 'igo-direction-route-layer'
426
- },
427
- exportable: true,
428
- browsable: false,
429
- style: stopMarker
430
- });
431
- tryBindStoreLayer(routeStore, routeLayer);
432
- routeStore.layer.visible = true;
433
- tryAddLoadingStrategy(routeStore, loadingStrategy);
434
- this.subscriptions$$.push(this.stopsStore.count$.subscribe(cnt => {
435
- cnt >= 1 ?
436
- this.stopsStore.layer.options.showInLayerList = true :
437
- this.stopsStore.layer.options.showInLayerList = false;
438
- }));
439
- this.subscriptions$$.push(this.routeStore.count$.subscribe(cnt => {
440
- cnt >= 1 ?
441
- this.routeStore.layer.options.showInLayerList = true :
442
- this.routeStore.layer.options.showInLayerList = false;
443
- }));
444
- }
445
- initOlInteraction() {
446
- let selectedStopFeature;
447
- this.selectStop = new olinteraction.Select({
448
- layers: [this.stopsStore.layer.ol],
449
- condition: olcondition.pointerMove,
450
- hitTolerance: 7,
451
- filter: feature => {
452
- return feature.get('type') === 'stop';
453
- }
454
- });
455
- this.selectStop.on('select', evt => {
456
- selectedStopFeature = evt.target.getFeatures()[0];
457
- });
458
- this.translateStop = new olinteraction.Translate({
459
- layers: [this.stopsStore.layer.ol],
460
- features: selectedStopFeature
461
- // TODO In Openlayers >= 6.x, filter is now allowed.
462
- });
463
- this.translateStop.on('translating', evt => {
464
- const features = evt.features;
465
- if (features.getLength() === 0) {
466
- return;
467
- }
468
- this.executeTranslation(features, false, 50, true);
469
- });
470
- this.translateStop.on('translateend', evt => {
471
- const features = evt.features;
472
- if (features.getLength() === 0) {
473
- return;
474
- }
475
- this.executeTranslation(features, true, 0, false);
476
- });
477
- this.selectedRoute = new olinteraction.Select({
478
- layers: [this.routeStore.layer.ol],
479
- condition: olcondition.click,
480
- hitTolerance: 7,
481
- filter: feature => {
482
- return feature.getId() === 'route';
483
- }
484
- });
485
- this.selectedRoute.on('select', evt => {
486
- if (this.focusOnStop === false) {
487
- const selectCoordinates = olproj.transform(evt.mapBrowserEvent.coordinate, this.map.projection, this.projection);
488
- this.addStop();
489
- const pos = this.stops.length - 2;
490
- this.stops.at(pos).patchValue({ stopCoordinates: selectCoordinates });
491
- this.handleLocationProposals(selectCoordinates, pos);
492
- this.addStopOverlay(selectCoordinates, pos);
493
- this.selectedRoute.getFeatures().clear();
494
- }
495
- this.selectedRoute.getFeatures().clear();
496
- });
497
- this.map.ol.addInteraction(this.selectStop);
498
- this.map.ol.addInteraction(this.translateStop);
499
- this.map.ol.addInteraction(this.selectedRoute);
500
- }
501
- subscribeToFormChange() {
502
- this.routesQueries$$.push(this.stopsForm.valueChanges
503
- .pipe(debounceTime(this.debounce))
504
- .subscribe(val => {
505
- this.writeStopsToFormService();
506
- }));
507
- }
508
- /**
509
- * Freeze any store, meaning the layer is removed, strategies are deactivated
510
- * and some listener removed
511
- * @internal
512
- */
513
- freezeStores() {
514
- const stopsStore = this.stopsStore;
515
- const routeStore = this.routeStore;
516
- this.map.ol.removeInteraction(this.selectStop);
517
- this.map.ol.removeInteraction(this.translateStop);
518
- this.map.ol.removeInteraction(this.selectedRoute);
519
- stopsStore.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
520
- routeStore.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
521
- }
522
- executeTranslation(features, reverseSearchProposal = false, delay = 0, overview = false) {
523
- this.routeStore.clear();
524
- const firstFeature = features.getArray()[0];
525
- const translatedID = firstFeature.getId();
526
- const translatedPos = translatedID.split('_');
527
- let p;
528
- switch (translatedPos[1]) {
529
- case 'start':
530
- p = 0;
531
- break;
532
- case 'end':
533
- p = this.stops.length - 1;
534
- break;
535
- default:
536
- p = Number(translatedPos[1]);
537
- break;
538
- }
539
- const translationCoordinates = olproj.transform(firstFeature.getGeometry().getCoordinates(), this.map.projection, this.projection);
540
- this.stops
541
- .at(p)
542
- .patchValue({
543
- stopCoordinates: translationCoordinates,
544
- stopProposals: []
545
- });
546
- if (reverseSearchProposal) {
547
- this.handleLocationProposals(translationCoordinates, p);
548
- }
549
- const directionsOptions = {
550
- steps: true,
551
- overview: false,
552
- alternatives: true
553
- };
554
- if (overview) {
555
- directionsOptions.overview = true;
556
- directionsOptions.steps = false;
557
- directionsOptions.alternatives = false;
558
- }
559
- if (delay > 0) {
560
- if (typeof this.lastTimeoutRequest !== 'undefined') {
561
- // cancel timeout when the mouse moves
562
- clearTimeout(this.lastTimeoutRequest);
563
- }
564
- this.lastTimeoutRequest = setTimeout(() => {
565
- this.getRoutes(undefined, directionsOptions);
566
- }, delay);
567
- }
568
- else {
569
- clearTimeout(this.lastTimeoutRequest);
570
- this.getRoutes(undefined, directionsOptions);
571
- }
572
- }
573
- handleLocationProposals(coordinates, stopIndex) {
574
- const groupedLocations = [];
575
- const roundedCoordinates = [
576
- coordinates[0].toFixed(5),
577
- coordinates[1].toFixed(5)
578
- ];
579
- this.stops
580
- .at(stopIndex)
581
- .patchValue({ stopPoint: roundedCoordinates.join(',') });
582
- this.searchService
583
- .reverseSearch(coordinates, { zoom: this.map.viewController.getZoom() })
584
- .map(res => this.routesQueries$$.push(res.request.pipe(map(f => f)).subscribe(results => {
585
- results.forEach(result => {
586
- if (groupedLocations.filter(f => f.source === result.source)
587
- .length === 0) {
588
- groupedLocations.push({
589
- source: result.source,
590
- results: results.map(r => r.data)
591
- });
592
- }
593
- });
594
- this.stops
595
- .at(stopIndex)
596
- .patchValue({ stopProposals: groupedLocations });
597
- // TODO: Prefer another source?
598
- if (results[0]) {
599
- if (results[0].source.getId() === 'icherchereverse') {
600
- // prefer address type.
601
- let resultPos = 0;
602
- for (let i = 0; i < results.length; i++) {
603
- const feature = results[i].data;
604
- if (feature.properties.type === 'adresses') {
605
- resultPos = i;
606
- break;
607
- }
608
- }
609
- this.stops.at(stopIndex).patchValue({
610
- stopPoint: getEntityTitle(results[resultPos])
611
- });
612
- if (results[resultPos].data.geometry.type === 'Point') {
613
- this.stops.at(stopIndex).patchValue({
614
- stopCoordinates: results[resultPos].data.geometry.coordinates
615
- });
616
- }
617
- else {
618
- // Not moving the translated point Only to suggest value into the UI.
619
- }
620
- }
621
- else if (results[0].source.getId() === 'coordinatesreverse') {
622
- this.stops.at(stopIndex).patchValue({
623
- stopPoint: [
624
- results[0].data.geometry.coordinates[0].toFixed(5),
625
- results[0].data.geometry.coordinates[1].toFixed(5)
626
- ].join(',')
627
- });
628
- if (results[0].data.geometry.type === 'Point') {
629
- this.stops.at(stopIndex).patchValue({
630
- stopCoordinates: results[0].data.geometry.coordinates
631
- });
632
- }
633
- else {
634
- // Not moving the translated point Only to suggest value into the UI.
635
- }
636
- }
637
- }
638
- else {
639
- this.stops
640
- .at(stopIndex)
641
- .patchValue({
642
- stopPoint: roundedCoordinates.join(','),
643
- stopProposals: []
644
- });
645
- }
646
- this.changeDetectorRefs.detectChanges();
647
- })));
648
- }
649
- directionsText(index, stopsCounts = this.stops.length) {
650
- if (index === 0) {
651
- return 'start';
652
- }
653
- else if (index === stopsCounts - 1 || stopsCounts === 1) {
654
- return 'end';
655
- }
656
- else {
657
- return 'intermediate';
658
- }
659
- }
660
- raiseStop(index) {
661
- if (index > 0) {
662
- this.moveStop(index, -1);
663
- }
664
- }
665
- lowerStop(index) {
666
- if (index < this.stops.length - 1) {
667
- this.moveStop(index, 1);
668
- }
669
- }
670
- moveStop(index, diff) {
671
- const fromValue = this.stops.at(index);
672
- this.removeStop(index);
673
- this.stops.insert(index + diff, fromValue);
674
- this.stops
675
- .at(index)
676
- .patchValue({ directionsText: this.directionsText(index) });
677
- this.stops
678
- .at(index + diff)
679
- .patchValue({ directionsText: this.directionsText(index + diff) });
680
- if (this.stops.at(index).value.stopCoordinates) {
681
- this.addStopOverlay(this.stops.at(index).value.stopCoordinates, index);
682
- }
683
- if (this.stops.at(index + diff).value.stopCoordinates) {
684
- this.addStopOverlay(this.stops.at(index + diff).value.stopCoordinates, index + diff);
685
- }
686
- }
687
- get stops() {
688
- return this.stopsForm.get('stops');
689
- }
690
- writeStopsToFormService(stopsArray) {
691
- if (stopsArray) {
692
- this.directionsFormService.setStops(stopsArray);
693
- }
694
- else {
695
- const stops = [];
696
- this.stops.value.forEach(stop => {
697
- if (stop.stopCoordinates instanceof Array) {
698
- stops.push(stop);
699
- }
700
- });
701
- this.directionsFormService.setStops(stops);
702
- }
703
- }
704
- addStop() {
705
- const insertIndex = this.stops.length - 1;
706
- this.stops.insert(insertIndex, this.createStop());
707
- }
708
- createStop(directionsPos = 'intermediate') {
709
- return this.formBuilder.group({
710
- stopPoint: [''],
711
- stopProposals: [[]],
712
- directionsText: directionsPos,
713
- stopCoordinates: ['', [Validators.required]]
714
- });
715
- }
716
- removeStop(index) {
717
- const id = this.getStopOverlayID(index);
718
- this.deleteStoreFeatureByID(this.stopsStore, id);
719
- this.stops.removeAt(index);
720
- let cnt = 0;
721
- this.stops.value.forEach(stop => {
722
- this.stops
723
- .at(cnt)
724
- .patchValue({ directionsText: this.directionsText(cnt) });
725
- this.addStopOverlay(this.stops.at(cnt).value.stopCoordinates, cnt);
726
- cnt++;
727
- });
728
- }
729
- resetForm(stop) {
730
- this.routesResults = undefined;
731
- const nbStops = this.stops.length;
732
- for (let i = 0; i < nbStops; i++) {
733
- this.stops.removeAt(0);
734
- }
735
- this.stops.insert(0, this.createStop('start'));
736
- this.stops.insert(1, this.createStop('end'));
737
- if (stop === true) {
738
- this.stopsStore.clear();
739
- }
740
- this.routeStore.clear();
741
- }
742
- formatStep(step, cnt) {
743
- return this.formatInstruction(step.maneuver.type, step.maneuver.modifier, step.name, step.maneuver.bearing_after, cnt, step.maneuver.exit, cnt === this.activeRoute.steps.length - 1);
744
- }
745
- formatInstruction(type, modifier, route, direction, stepPosition, exit, lastStep = false) {
746
- let directiveFr;
747
- let directiveEn;
748
- let image = 'forward';
749
- let cssClass = 'rotate-270';
750
- const translatedDirection = this.translateBearing(direction);
751
- const translatedModifier = this.translateModifier(modifier);
752
- const enPrefix = modifier === 'straight' ? '' : 'on the ';
753
- const frPrefix = modifier === 'straight' ? '' : 'à ';
754
- let frAggregatedDirection = frPrefix + translatedModifier;
755
- let enAggregatedDirection = enPrefix + translatedModifier;
756
- if (modifier && modifier.search('slight') >= 0) {
757
- enAggregatedDirection = translatedModifier;
758
- }
759
- if (modifier === 'uturn') {
760
- image = 'forward';
761
- cssClass = 'rotate-90';
762
- }
763
- else if (modifier === 'sharp right') {
764
- image = 'subdirectory-arrow-right';
765
- cssClass = 'icon-flipped';
766
- }
767
- else if (modifier === 'right') {
768
- image = 'subdirectory-arrow-right';
769
- cssClass = 'icon-flipped';
770
- }
771
- else if (modifier === 'slight right') {
772
- image = 'forward';
773
- cssClass = 'rotate-290';
774
- }
775
- else if (modifier === 'straight') {
776
- image = 'forward';
777
- }
778
- else if (modifier === 'slight left') {
779
- image = 'forward';
780
- cssClass = 'rotate-250';
781
- }
782
- else if (modifier === 'left') {
783
- image = 'subdirectory-arrow-left';
784
- cssClass = 'icon-flipped';
785
- }
786
- else if (modifier === 'sharp left') {
787
- image = 'subdirectory-arrow-left';
788
- cssClass = 'icon-flipped';
789
- }
790
- if (type === 'turn') {
791
- if (modifier === 'straight') {
792
- directiveFr = 'Continuer sur ' + route;
793
- directiveEn = 'Continue on ' + route;
794
- }
795
- else if (modifier === 'uturn') {
796
- directiveFr = 'Faire demi-tour sur ' + route;
797
- directiveEn = 'Make u-turn on ' + route;
798
- }
799
- else {
800
- directiveFr = 'Tourner ' + frAggregatedDirection + ' sur ' + route;
801
- directiveEn = 'Turn ' + translatedModifier + ' onto ' + route;
802
- }
803
- }
804
- else if (type === 'new name') {
805
- directiveFr =
806
- 'Continuer en direction ' + translatedDirection + ' sur ' + route;
807
- directiveEn = 'Head ' + translatedDirection + ' on ' + route;
808
- image = 'compass';
809
- cssClass = '';
810
- }
811
- else if (type === 'depart') {
812
- directiveFr =
813
- 'Aller en direction ' + translatedDirection + ' sur ' + route;
814
- directiveEn = 'Head ' + translatedDirection + ' on ' + route;
815
- image = 'compass';
816
- cssClass = '';
817
- }
818
- else if (type === 'arrive') {
819
- if (lastStep) {
820
- let coma = ', ';
821
- if (!translatedModifier) {
822
- frAggregatedDirection = '';
823
- enAggregatedDirection = '';
824
- coma = '';
825
- }
826
- directiveFr = 'Vous êtes arrivé' + coma + frAggregatedDirection;
827
- directiveEn =
828
- 'You have reached your destination' + coma + enAggregatedDirection;
829
- }
830
- else {
831
- directiveFr = 'Vous atteignez le point intermédiare sur ' + route;
832
- directiveEn = 'You have reached the intermediate stop onto ' + route;
833
- image = 'map-marker';
834
- cssClass = '';
835
- }
836
- }
837
- else if (type === 'merge') {
838
- directiveFr = 'Continuer sur ' + route;
839
- directiveEn = 'Continue on ' + route;
840
- image = 'forward';
841
- cssClass = 'rotate-270';
842
- }
843
- else if (type === 'on ramp') {
844
- directiveFr = "Prendre l'entrée d'autoroute " + frAggregatedDirection;
845
- directiveEn = 'Take the ramp ' + enAggregatedDirection;
846
- }
847
- else if (type === 'off ramp') {
848
- directiveFr = "Prendre la sortie d'autoroute " + frAggregatedDirection;
849
- directiveEn = 'Take exit ' + enAggregatedDirection;
850
- }
851
- else if (type === 'fork') {
852
- if (modifier.search('left') >= 0) {
853
- directiveFr = 'Garder la gauche sur ' + route;
854
- directiveEn = 'Merge left onto ' + route;
855
- }
856
- else if (modifier.search('right') >= 0) {
857
- directiveFr = 'Garder la droite sur ' + route;
858
- directiveEn = 'Merge right onto ' + route;
859
- }
860
- else {
861
- directiveFr = 'Continuer sur ' + route;
862
- directiveEn = 'Continue on ' + route;
863
- }
864
- }
865
- else if (type === 'end of road') {
866
- directiveFr =
867
- 'À la fin de la route, tourner ' + translatedModifier + ' sur ' + route;
868
- directiveEn =
869
- 'At the end of the road, turn ' + translatedModifier + ' onto ' + route;
870
- }
871
- else if (type === 'use lane') {
872
- directiveFr = 'Prendre la voie de ... ';
873
- directiveEn = 'Take the lane ...';
874
- }
875
- else if (type === 'continue' && modifier !== 'uturn') {
876
- directiveFr = 'Continuer sur ' + route;
877
- directiveEn = 'Continue on ' + route;
878
- image = 'forward';
879
- cssClass = 'rotate-270';
880
- }
881
- else if (type === 'roundabout') {
882
- directiveFr = 'Au rond-point, prendre la ' + exit;
883
- directiveFr += exit === 1 ? 're' : 'e';
884
- directiveFr += ' sortie vers ' + route;
885
- directiveEn = 'At the roundabout, take the ' + exit;
886
- directiveEn += exit === 1 ? 'st' : 'rd';
887
- directiveEn += ' exit towards ' + route;
888
- image = 'chart-donut';
889
- cssClass = '';
890
- }
891
- else if (type === 'rotary') {
892
- directiveFr = 'Rond-point rotary....';
893
- directiveEn = 'Roundabout rotary....';
894
- image = 'chart-donut';
895
- cssClass = '';
896
- }
897
- else if (type === 'roundabout turn') {
898
- directiveFr = 'Rond-point, prendre la ...';
899
- directiveEn = 'Roundabout, take the ...';
900
- image = 'chart-donut';
901
- cssClass = '';
902
- }
903
- else if (type === 'exit roundabout') {
904
- directiveFr = 'Poursuivre vers ' + route;
905
- directiveEn = 'Continue to ' + route;
906
- image = 'forward';
907
- cssClass = 'rotate-270';
908
- }
909
- else if (type === 'notification') {
910
- directiveFr = 'notification ....';
911
- directiveEn = 'notification ....';
912
- }
913
- else if (modifier === 'uturn') {
914
- directiveFr =
915
- 'Faire demi-tour et continuer en direction ' +
916
- translatedDirection +
917
- ' sur ' +
918
- route;
919
- directiveEn =
920
- 'Make u-turn and head ' + translatedDirection + ' on ' + route;
921
- }
922
- else {
923
- directiveFr = '???';
924
- directiveEn = '???';
925
- }
926
- if (lastStep) {
927
- image = 'flag-variant';
928
- cssClass = '';
929
- }
930
- if (stepPosition === 0) {
931
- image = 'compass';
932
- cssClass = '';
933
- }
934
- let directive;
935
- if (this.browserLanguage === 'fr') {
936
- directive = directiveFr;
937
- }
938
- else if (this.browserLanguage === 'en') {
939
- directive = directiveEn;
940
- }
941
- return { instruction: directive, image, cssClass };
942
- }
943
- translateModifier(modifier) {
944
- if (modifier === 'uturn') {
945
- return this.languageService.translate.instant('igo.geo.directions.uturn');
946
- }
947
- else if (modifier === 'sharp right') {
948
- return this.languageService.translate.instant('igo.geo.directions.sharp right');
949
- }
950
- else if (modifier === 'right') {
951
- return this.languageService.translate.instant('igo.geo.directions.right');
952
- }
953
- else if (modifier === 'slight right') {
954
- return this.languageService.translate.instant('igo.geo.directions.slight right');
955
- }
956
- else if (modifier === 'sharp left') {
957
- return this.languageService.translate.instant('igo.geo.directions.sharp left');
958
- }
959
- else if (modifier === 'left') {
960
- return this.languageService.translate.instant('igo.geo.directions.left');
961
- }
962
- else if (modifier === 'slight left') {
963
- return this.languageService.translate.instant('igo.geo.directions.slight left');
964
- }
965
- else if (modifier === 'straight') {
966
- return this.languageService.translate.instant('igo.geo.directions.straight');
967
- }
968
- else {
969
- return modifier;
970
- }
971
- }
972
- translateBearing(bearing) {
973
- if (bearing >= 337 || bearing < 23) {
974
- return this.languageService.translate.instant('igo.geo.cardinalPoints.n');
975
- }
976
- else if (bearing < 67) {
977
- return this.languageService.translate.instant('igo.geo.cardinalPoints.ne');
978
- }
979
- else if (bearing < 113) {
980
- return this.languageService.translate.instant('igo.geo.cardinalPoints.e');
981
- }
982
- else if (bearing < 157) {
983
- return this.languageService.translate.instant('igo.geo.cardinalPoints.se');
984
- }
985
- else if (bearing < 203) {
986
- return this.languageService.translate.instant('igo.geo.cardinalPoints.s');
987
- }
988
- else if (bearing < 247) {
989
- return this.languageService.translate.instant('igo.geo.cardinalPoints.sw');
990
- }
991
- else if (bearing < 293) {
992
- return this.languageService.translate.instant('igo.geo.cardinalPoints.w');
993
- }
994
- else if (bearing < 337) {
995
- return this.languageService.translate.instant('igo.geo.cardinalPoints.nw');
996
- }
997
- else {
998
- return;
999
- }
1000
- }
1001
- formatDistance(distance) {
1002
- if (distance === 0) {
1003
- return;
1004
- }
1005
- if (distance >= 100000) {
1006
- return Math.round(distance / 1000) + ' km';
1007
- }
1008
- if (distance >= 10000) {
1009
- return Math.round(distance / 100) / 10 + ' km';
1010
- }
1011
- if (distance >= 100) {
1012
- return Math.round(distance / 100) / 10 + ' km';
1013
- }
1014
- return distance + ' m';
1015
- }
1016
- formatDuration(duration, summary = false) {
1017
- if (duration >= 3600) {
1018
- const hour = Math.floor(duration / 3600);
1019
- const minute = Math.round((duration / 3600 - hour) * 60);
1020
- if (minute === 60) {
1021
- return hour + 1 + ' h';
1022
- }
1023
- return hour + ' h ' + minute + ' min';
1024
- }
1025
- if (duration >= 60) {
1026
- return Math.round(duration / 60) + ' min';
1027
- }
1028
- return duration + ' s';
1029
- }
1030
- showSegment(step, zoomToExtent = false) {
1031
- this.showRouteSegmentGeometry(step.geometry.coordinates, zoomToExtent);
1032
- }
1033
- showRouteSegmentGeometry(coordinates, zoomToExtent = false) {
1034
- const vertexId = 'vertex';
1035
- const geometry4326 = new olgeom.LineString(coordinates);
1036
- const geometryMapProjection = geometry4326.transform('EPSG:4326', this.map.projection);
1037
- const routeSegmentCoordinates = geometryMapProjection.getCoordinates();
1038
- const lastPoint = routeSegmentCoordinates[0];
1039
- const geometry = new olgeom.Point(lastPoint);
1040
- const feature = new olFeature({ geometry });
1041
- const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometry, {
1042
- featureProjection: this.map.projection,
1043
- dataProjection: this.map.projection
1044
- });
1045
- const previousVertex = this.routeStore.get(vertexId);
1046
- const previousVertexRevision = previousVertex
1047
- ? previousVertex.meta.revision
1048
- : 0;
1049
- const vertexFeature = {
1050
- type: FEATURE,
1051
- geometry: geojsonGeom,
1052
- projection: this.map.projection,
1053
- properties: {
1054
- id: vertexId,
1055
- type: 'vertex'
1056
- },
1057
- meta: {
1058
- id: vertexId,
1059
- revision: previousVertexRevision + 1
1060
- },
1061
- ol: feature
1062
- };
1063
- this.routeStore.update(vertexFeature);
1064
- if (zoomToExtent) {
1065
- this.map.viewController.zoomToExtent(feature.getGeometry().getExtent());
1066
- }
1067
- }
1068
- zoomRoute(extent) {
1069
- if (extent) {
1070
- this.map.viewController.zoomToExtent(extent);
1071
- }
1072
- else {
1073
- if (this.routeStore.layer) {
1074
- const routeFeature = this.routeStore.layer.ol
1075
- .getSource()
1076
- .getFeatures()
1077
- .find(f => f.getId() === 'route');
1078
- if (routeFeature) {
1079
- const routeExtent = routeFeature.getGeometry().getExtent();
1080
- this.map.viewController.zoomToExtent(routeExtent);
1081
- }
1082
- }
1083
- }
1084
- }
1085
- showRouteGeometry(moveToExtent = false) {
1086
- const geom = this.activeRoute.geometry.coordinates;
1087
- const geometry4326 = new olgeom.LineString(geom);
1088
- const geometryMapProjection = geometry4326.transform('EPSG:4326', this.map.projection);
1089
- if (moveToExtent) {
1090
- this.zoomRoute(geometryMapProjection.getExtent());
1091
- }
1092
- const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometryMapProjection, {
1093
- featureProjection: this.map.projection,
1094
- dataProjection: this.map.projection
1095
- });
1096
- const previousRoute = this.routeStore.get('route');
1097
- const previousRouteRevision = previousRoute
1098
- ? previousRoute.meta.revision
1099
- : 0;
1100
- const routeFeature = {
1101
- type: FEATURE,
1102
- geometry: geojsonGeom,
1103
- projection: this.map.projection,
1104
- properties: {
1105
- id: 'route',
1106
- type: 'route'
1107
- },
1108
- meta: {
1109
- id: 'route',
1110
- revision: previousRouteRevision + 1
1111
- },
1112
- ol: new olFeature({ geometry: geometryMapProjection })
1113
- };
1114
- this.routeStore.update(routeFeature);
1115
- }
1116
- getRoutes(moveToExtent = false, directionsOptions = {}) {
1117
- this.deleteStoreFeatureByID(this.routeStore, 'vertex');
1118
- this.writeStopsToFormService();
1119
- const coords = this.directionsFormService.getStopsCoordinates();
1120
- if (coords.length < 2) {
1121
- return;
1122
- }
1123
- const routeResponse = this.directionsService.route(coords, directionsOptions);
1124
- if (routeResponse) {
1125
- routeResponse.map(res => this.routesQueries$$.push(res.subscribe(route => {
1126
- this.routesResults = route;
1127
- this.activeRoute = this.routesResults[0];
1128
- this.showRouteGeometry(moveToExtent);
1129
- this.changeDetectorRefs.detectChanges();
1130
- })));
1131
- }
1132
- }
1133
- unlistenSingleClick() {
1134
- if (this.focusKey.length !== 0) {
1135
- this.focusKey.forEach(key => {
1136
- olobservable.unByKey(key);
1137
- });
1138
- }
1139
- }
1140
- unsubscribeRoutesQueries() {
1141
- this.routesQueries$$.forEach((sub) => sub.unsubscribe());
1142
- this.routesQueries$$ = [];
1143
- }
1144
- copyLinkToClipboard() {
1145
- const successful = Clipboard.copy(this.getUrl());
1146
- if (successful) {
1147
- const translate = this.languageService.translate;
1148
- const title = translate.instant('igo.geo.directionsForm.dialog.copyTitle');
1149
- const msg = translate.instant('igo.geo.directionsForm.dialog.copyMsgLink');
1150
- this.messageService.success(msg, title);
1151
- }
1152
- }
1153
- copyDirectionsToClipboard() {
1154
- const directionsBody = this.directionsToText();
1155
- const successful = Clipboard.copy(directionsBody);
1156
- if (successful) {
1157
- const translate = this.languageService.translate;
1158
- const title = translate.instant('igo.geo.directionsForm.dialog.copyTitle');
1159
- const msg = translate.instant('igo.geo.directionsForm.dialog.copyMsg');
1160
- this.messageService.success(msg, title);
1161
- }
1162
- }
1163
- directionsToText() {
1164
- const indent = '\t';
1165
- let activeRouteDirective = this.languageService.translate.instant('igo.geo.directionsForm.instructions') + ':\n';
1166
- let wayPointList = '';
1167
- const summary = this.languageService.translate.instant('igo.geo.directionsForm.summary') +
1168
- ': \n' +
1169
- indent +
1170
- this.activeRoute.title +
1171
- '\n' +
1172
- indent +
1173
- this.formatDistance(this.activeRoute.distance) +
1174
- '\n' +
1175
- indent +
1176
- this.formatDuration(this.activeRoute.duration) +
1177
- '\n\n' +
1178
- this.languageService.translate.instant('igo.geo.directionsForm.stopsList') +
1179
- ':\n';
1180
- const url = this.languageService.translate.instant('igo.geo.directionsForm.link') +
1181
- ':\n' +
1182
- indent +
1183
- this.getUrl();
1184
- let wayPointsCnt = 1;
1185
- this.stops.value.forEach(stop => {
1186
- let coord = '';
1187
- let stopPoint = '';
1188
- if (stop.stopPoint !== stop.stopCoordinates) {
1189
- stopPoint = stop.stopPoint;
1190
- coord =
1191
- ' (' +
1192
- [stop.stopCoordinates[1], stop.stopCoordinates[0]].join(',') +
1193
- ')';
1194
- }
1195
- else {
1196
- stopPoint = [stop.stopCoordinates[1], stop.stopCoordinates[0]].join(',');
1197
- }
1198
- wayPointList =
1199
- wayPointList +
1200
- indent +
1201
- wayPointsCnt.toLocaleString() +
1202
- '. ' +
1203
- stopPoint +
1204
- coord +
1205
- '\n';
1206
- wayPointsCnt++;
1207
- });
1208
- // Directions
1209
- let localCnt = 0;
1210
- this.activeRoute.steps.forEach(step => {
1211
- const instruction = this.formatStep(step, localCnt).instruction;
1212
- const distance = this.formatDistance(step.distance) === undefined
1213
- ? ''
1214
- : ' (' + this.formatDistance(step.distance) + ')';
1215
- activeRouteDirective =
1216
- activeRouteDirective +
1217
- indent +
1218
- (localCnt + 1).toLocaleString() +
1219
- '. ' +
1220
- instruction +
1221
- distance +
1222
- '\n';
1223
- localCnt++;
1224
- });
1225
- const directionsBody = summary + wayPointList + '\n' + url + '\n\n' + activeRouteDirective;
1226
- return directionsBody;
1227
- }
1228
- handleTermChanged(term) {
1229
- if (term !== undefined || term.length !== 0) {
1230
- const searchProposals = [];
1231
- if (this.search$$) {
1232
- this.search$$.unsubscribe();
1233
- }
1234
- const researches = this.searchService.search(term, { searchType: 'Feature' });
1235
- researches.map(res => this.search$$ =
1236
- res.request.subscribe(results => {
1237
- results
1238
- .filter(r => r.data.geometry)
1239
- .forEach(element => {
1240
- if (searchProposals.filter(r => r.source === element.source)
1241
- .length === 0) {
1242
- searchProposals.push({
1243
- source: element.source,
1244
- meta: element.meta,
1245
- results: results.map(r => r.data)
1246
- });
1247
- }
1248
- });
1249
- if (this.stops) {
1250
- this.stops
1251
- .at(this.currentStopIndex)
1252
- .patchValue({ stopProposals: searchProposals });
1253
- }
1254
- this.changeDetectorRefs.detectChanges();
1255
- }));
1256
- }
1257
- }
1258
- setTerm(term) {
1259
- this.term = term;
1260
- if (this.keyIsValid(term) &&
1261
- (term.length >= this.length || term.length === 0)) {
1262
- this.stream$.next(term);
1263
- }
1264
- }
1265
- keyIsValid(key) {
1266
- return this.invalidKeys.find(value => value === key) === undefined;
1267
- }
1268
- keyup(i, event) {
1269
- const term = event.target.value;
1270
- this.setTerm(term);
1271
- this.map.ol.un('singleclick', evt => {
1272
- this.handleMapClick(evt, i);
1273
- });
1274
- }
1275
- clearStop(stopIndex) {
1276
- // this.deleteDirectionsOverlaybyID(this.getStopOverlayID(stopIndex));
1277
- const id = this.getStopOverlayID(stopIndex);
1278
- this.deleteStoreFeatureByID(this.stopsStore, id);
1279
- this.routeStore.clear();
1280
- const stopsCounts = this.stops.length;
1281
- this.stops.removeAt(stopIndex);
1282
- this.stops.insert(stopIndex, this.createStop(this.directionsText(stopIndex, stopsCounts)));
1283
- this.routesResults = undefined;
1284
- this.getRoutes(false);
1285
- }
1286
- chooseProposal(proposal, i) {
1287
- if (proposal !== undefined) {
1288
- let geomCoord;
1289
- const geom = proposal.geometry;
1290
- if (geom.type === 'Point') {
1291
- geomCoord = geom.coordinates;
1292
- }
1293
- else if (geom.type.search('Line') >= 0) {
1294
- const line = new OlGeoJSON().readFeatures(geom);
1295
- geomCoord = line[0].getGeometry().getFirstCoordinate();
1296
- geomCoord = [geomCoord[0], geomCoord[1]];
1297
- }
1298
- else if (geom.type.search('Polygon') >= 0) {
1299
- const poly = new OlGeoJSON().readFeatures(geom);
1300
- geomCoord = poly[0].getGeometry().getType() === 'Polygon' ?
1301
- geomCoord = poly[0].getGeometry().getInteriorPoint().getFirstCoordinate() :
1302
- geomCoord = poly[0].getGeometry().getInteriorPoints().getFirstCoordinate();
1303
- geomCoord = [geomCoord[0], geomCoord[1]];
1304
- }
1305
- if (geomCoord !== undefined) {
1306
- this.stops.at(i).patchValue({ stopCoordinates: geomCoord });
1307
- this.addStopOverlay(geomCoord, i);
1308
- /* const proposalExtent = this.directionsStopsOverlayDataSource.ol
1309
- .getFeatureById(this.getStopOverlayID(i))
1310
- .getGeometry()
1311
- .getExtent();*/
1312
- /* if (!olextent.intersects(proposalExtent, this.map.viewController.getExtent())) {
1313
- this.map.viewController.moveToExtent(proposalExtent);
1314
- }*/
1315
- }
1316
- }
1317
- }
1318
- focus(i) {
1319
- this.unlistenSingleClick();
1320
- this.currentStopIndex = i;
1321
- this.focusOnStop = true;
1322
- this.focusKey.push(this.map.ol.once('singleclick', evt => {
1323
- this.handleMapClick(evt, i);
1324
- }));
1325
- }
1326
- handleMapClick(event, indexPos) {
1327
- if (this.currentStopIndex === undefined) {
1328
- this.addStop();
1329
- indexPos = this.stops.length - 2;
1330
- this.stops.at(indexPos).value.stopProposals = [];
1331
- }
1332
- else {
1333
- indexPos = this.currentStopIndex;
1334
- }
1335
- const clickCoordinates = olproj.transform(event.coordinate, this.map.projection, this.projection);
1336
- this.stops
1337
- .at(indexPos)
1338
- .patchValue({ stopProposals: [], stopCoordinates: clickCoordinates });
1339
- this.handleLocationProposals(clickCoordinates, indexPos);
1340
- this.addStopOverlay(clickCoordinates, indexPos);
1341
- setTimeout(() => {
1342
- this.focusOnStop = false; // prevent to trigger map click and Select on routes at same time.
1343
- }, 500);
1344
- }
1345
- geolocateStop(index) {
1346
- moveToOlFeatures(this.map, [this.map.geolocationFeature], FeatureMotion.Move);
1347
- const geolocateCoordinates = this.map.viewController.getCenter(this.projection);
1348
- this.stops.at(index).patchValue({ stopCoordinates: geolocateCoordinates });
1349
- this.addStopOverlay(geolocateCoordinates, index);
1350
- this.handleLocationProposals(geolocateCoordinates, index);
1351
- }
1352
- addStopOverlay(coordinates, index) {
1353
- const directionsText = this.directionsText(index);
1354
- let stopColor;
1355
- let stopText;
1356
- if (directionsText === 'start') {
1357
- stopColor = '#008000';
1358
- stopText = this.languageService.translate.instant('igo.geo.directionsForm.start');
1359
- }
1360
- else if (directionsText === 'end') {
1361
- stopColor = '#f64139';
1362
- stopText = this.languageService.translate.instant('igo.geo.directionsForm.end');
1363
- }
1364
- else {
1365
- stopColor = '#ffd700';
1366
- stopText =
1367
- this.languageService.translate.instant('igo.geo.directionsForm.intermediate') +
1368
- ' #' +
1369
- index;
1370
- }
1371
- const geometry = new olgeom.Point(olproj.transform(coordinates, this.projection, this.map.projection));
1372
- const stopID = this.getStopOverlayID(index);
1373
- const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometry, {
1374
- featureProjection: this.map.projection,
1375
- dataProjection: this.map.projection
1376
- });
1377
- const previousStop = this.stopsStore.get(stopID);
1378
- const previousStopRevision = previousStop ? previousStop.meta.revision : 0;
1379
- const stopFeature = {
1380
- type: FEATURE,
1381
- geometry: geojsonGeom,
1382
- projection: this.map.projection,
1383
- properties: {
1384
- id: stopID,
1385
- type: 'stop',
1386
- stopText,
1387
- stopColor,
1388
- stopOpacity: 1
1389
- },
1390
- meta: {
1391
- id: stopID,
1392
- revision: previousStopRevision + 1
1393
- },
1394
- ol: new olFeature({ geometry })
1395
- };
1396
- this.stopsStore.update(stopFeature);
1397
- this.getRoutes();
1398
- }
1399
- getStopOverlayID(index) {
1400
- let txt;
1401
- if (index === 0) {
1402
- txt = 'start';
1403
- }
1404
- else if (index === this.stops.length - 1) {
1405
- txt = 'end';
1406
- }
1407
- else {
1408
- txt = index;
1409
- }
1410
- return 'directionsStop_' + txt;
1411
- }
1412
- deleteStoreFeatureByID(store, id) {
1413
- const entity = store.get(id);
1414
- if (entity) {
1415
- store.delete(entity);
1416
- }
1417
- }
1418
- getUrl() {
1419
- if (!this.route) {
1420
- return;
1421
- }
1422
- const directionsKey = this.route.options.directionsCoordKey;
1423
- const stopsCoordinates = [];
1424
- if (this.directionsFormService &&
1425
- this.directionsFormService.getStopsCoordinates() &&
1426
- this.directionsFormService.getStopsCoordinates().length !== 0) {
1427
- this.directionsFormService.getStopsCoordinates().forEach(coord => {
1428
- stopsCoordinates.push(roundCoordTo(coord, 6));
1429
- });
1430
- }
1431
- let directionsUrl = '';
1432
- if (stopsCoordinates.length >= 2) {
1433
- directionsUrl = `${directionsKey}=${stopsCoordinates.join(';')}`;
1434
- }
1435
- return `${location.origin}${location.pathname}?tool=directions&sidenav=1&${directionsUrl}`;
1436
- }
1437
- }
1438
- DirectionsFormComponent.ɵfac = function DirectionsFormComponent_Factory(t) { return new (t || DirectionsFormComponent)(i0.ɵɵdirectiveInject(i1.FormBuilder), i0.ɵɵdirectiveInject(i2.DirectionsService), i0.ɵɵdirectiveInject(i3.LanguageService), i0.ɵɵdirectiveInject(i3.MessageService), i0.ɵɵdirectiveInject(i4.SearchService), i0.ɵɵdirectiveInject(i5.QueryService), i0.ɵɵdirectiveInject(i6.DirectionsFormService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.RouteService, 8)); };
1439
- DirectionsFormComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DirectionsFormComponent, selectors: [["igo-directions-form"]], inputs: { term: "term", debounce: "debounce", length: "length", map: "map", stopsStore: "stopsStore", routeFromFeatureDetail: "routeFromFeatureDetail", routeStore: "routeStore" }, outputs: { activeRouteDescription: "activeRouteDescription" }, decls: 11, vars: 10, consts: [[1, "igo-form", 3, "formGroup"], ["formArrayName", "stops", 4, "ngFor", "ngForOf"], [1, "igo-form-button-group"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "primary", 3, "matTooltip", "click"], ["svgIcon", "map-marker-plus"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "primary", 3, "matTooltip", "click", 4, "ngIf"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "warn", 3, "matTooltip", "click", 4, "ngIf"], ["class", "igo-input-container", 4, "ngIf"], ["formArrayName", "stops"], ["inputs", ""], [3, "formGroupName"], [1, "igo-input-container"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "click", 4, "ngIf"], ["matInput", "", "formControlName", "stopPoint", 3, "matAutocomplete", "placeholder", "focus", "keyup", "keydown.enter"], ["mat-button", "", "matSuffix", "", "mat-icon-button", "", "color", "warn", "aria-label", "Clear", 3, "click", 4, "ngIf"], ["auto", "matAutocomplete"], [3, "label", "disabled", 4, "ngFor", "ngForOf"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "click"], ["svgIcon", "crosshairs-gps"], ["mat-button", "", "matSuffix", "", "mat-icon-button", "", "color", "warn", "aria-label", "Clear", 3, "click"], ["svgIcon", "close"], [3, "label", "disabled"], ["matTooltipShowDelay", "500", 3, "value", "matTooltip", "onSelectionChange", 4, "ngFor", "ngForOf"], ["matTooltipShowDelay", "500", 3, "value", "matTooltip", "onSelectionChange"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "warn", 3, "matTooltip", "click"], ["svgIcon", "delete"], ["svgIcon", "magnify-plus-outline"], ["svgIcon", "file-restore"], ["svgIcon", "content-copy"], ["svgIcon", "link"], [4, "ngIf"], ["mat-header", "", 1, "igo-route-title", "mat-typography"], ["mat-subheader", ""], ["class", "igo-steps", "igoListItem", "", 3, "mouseenter", "click", 4, "ngFor", "ngForOf"], [3, "placeholder", "ngModel", "selectionChange", "ngModelChange"], [3, "value", 4, "ngFor", "ngForOf"], [3, "value"], ["igoListItem", "", 1, "igo-steps", 3, "mouseenter", "click"], ["mat-list-icon", "", 3, "ngClass", "svgIcon"], ["mat-line", ""], ["mat-line", "", 1, "right"]], template: function DirectionsFormComponent_Template(rf, ctx) { if (rf & 1) {
1440
- i0.ɵɵelementStart(0, "form", 0);
1441
- i0.ɵɵtemplate(1, DirectionsFormComponent_div_1_Template, 13, 9, "div", 1);
1442
- i0.ɵɵelementStart(2, "div", 2);
1443
- i0.ɵɵelementStart(3, "button", 3);
1444
- i0.ɵɵlistener("click", function DirectionsFormComponent_Template_button_click_3_listener() { return ctx.addStop(); });
1445
- i0.ɵɵpipe(4, "translate");
1446
- i0.ɵɵelement(5, "mat-icon", 4);
1447
- i0.ɵɵelementEnd();
1448
- i0.ɵɵtemplate(6, DirectionsFormComponent_button_6_Template, 3, 3, "button", 5);
1449
- i0.ɵɵtemplate(7, DirectionsFormComponent_button_7_Template, 3, 3, "button", 6);
1450
- i0.ɵɵtemplate(8, DirectionsFormComponent_button_8_Template, 3, 3, "button", 5);
1451
- i0.ɵɵtemplate(9, DirectionsFormComponent_button_9_Template, 3, 3, "button", 5);
1452
- i0.ɵɵelementEnd();
1453
- i0.ɵɵelementEnd();
1454
- i0.ɵɵtemplate(10, DirectionsFormComponent_div_10_Template, 10, 6, "div", 7);
1455
- } if (rf & 2) {
1456
- i0.ɵɵproperty("formGroup", ctx.stopsForm);
1457
- i0.ɵɵadvance(1);
1458
- i0.ɵɵproperty("ngForOf", ctx.stops.controls);
1459
- i0.ɵɵadvance(2);
1460
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(4, 8, "igo.geo.directionsForm.addStop"));
1461
- i0.ɵɵadvance(3);
1462
- i0.ɵɵproperty("ngIf", ctx.routesResults);
1463
- i0.ɵɵadvance(1);
1464
- i0.ɵɵproperty("ngIf", ctx.routesResults);
1465
- i0.ɵɵadvance(1);
1466
- i0.ɵɵproperty("ngIf", ctx.routesResults);
1467
- i0.ɵɵadvance(1);
1468
- i0.ɵɵproperty("ngIf", ctx.routesResults);
1469
- i0.ɵɵadvance(1);
1470
- i0.ɵɵproperty("ngIf", ctx.routesResults);
1471
- } }, directives: [i1.ɵNgNoValidate, i1.NgControlStatusGroup, i1.FormGroupDirective, i7.NgForOf, i8.MatButton, i9.MatTooltip, i10.MatIcon, i7.NgIf, i1.FormArrayName, i11.MatListItem, i1.FormGroupName, i12.MatFormField, i13.MatInput, i1.DefaultValueAccessor, i14.MatAutocompleteTrigger, i1.NgControlStatus, i1.FormControlName, i14.MatAutocomplete, i12.MatSuffix, i15.MatOptgroup, i15.MatOption, i11.MatList, i11.MatListSubheaderCssMatStyler, i16.MatDivider, i17.MatSelect, i1.NgModel, i11.MatListIconCssMatStyler, i7.NgClass, i15.MatLine], pipes: [i18.TranslatePipe], styles: ["mat-form-field[_ngcontent-%COMP%]{width:85%}.igo-route-title[_ngcontent-%COMP%]{font-weight:bold}.igo-steps[_ngcontent-%COMP%]{cursor:pointer}form[_ngcontent-%COMP%]{padding:10px}h3[_ngcontent-%COMP%]{padding-left:5px;padding-right:5px}.mat-line[_ngcontent-%COMP%]{word-wrap:break-word!important;white-space:pre-wrap!important}.mat-line.right[_ngcontent-%COMP%]{text-align:right}.rotate-90[_ngcontent-%COMP%]{transform:rotate(90deg)}.rotate-45[_ngcontent-%COMP%]{transform:rotate(45deg)}.rotate-270[_ngcontent-%COMP%]{transform:rotate(270deg)}.rotate-250[_ngcontent-%COMP%]{transform:rotate(250deg)}.rotate-290[_ngcontent-%COMP%]{transform:rotate(290deg)}.icon-flipped[_ngcontent-%COMP%]{transform:scaleY(-1)}"] });
1472
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DirectionsFormComponent, [{
1473
- type: Component,
1474
- args: [{
1475
- selector: 'igo-directions-form',
1476
- templateUrl: './directions-form.component.html',
1477
- styleUrls: ['./directions-form.component.scss']
1478
- }]
1479
- }], function () { return [{ type: i1.FormBuilder }, { type: i2.DirectionsService }, { type: i3.LanguageService }, { type: i3.MessageService }, { type: i4.SearchService }, { type: i5.QueryService }, { type: i6.DirectionsFormService }, { type: i0.ChangeDetectorRef }, { type: i3.RouteService, decorators: [{
1480
- type: Optional
1481
- }] }]; }, { term: [{
1482
- type: Input
1483
- }], debounce: [{
1484
- type: Input
1485
- }], length: [{
1486
- type: Input
1487
- }], map: [{
1488
- type: Input
1489
- }], stopsStore: [{
1490
- type: Input
1491
- }], routeFromFeatureDetail: [{
1492
- type: Input
1493
- }], routeStore: [{
1494
- type: Input
1495
- }], activeRouteDescription: [{
1496
- type: Output
1497
- }] }); })();
1498
- /**
1499
- * Create a style for the directions stops and routes
1500
- * @param feature OlFeature
1501
- * @returns OL style function
1502
- */
1503
- export function stopMarker(feature, resolution) {
1504
- const vertexStyle = [
1505
- new olstyle.Style({
1506
- geometry: feature.getGeometry(),
1507
- image: new olstyle.Circle({
1508
- radius: 7,
1509
- stroke: new olstyle.Stroke({ color: '#FF0000', width: 3 })
1510
- })
1511
- })
1512
- ];
1513
- const stopStyle = createOverlayMarkerStyle({
1514
- text: feature.get('stopText'),
1515
- opacity: feature.get('stopOpacity'),
1516
- markerColor: feature.get('stopColor'),
1517
- markerOutlineColor: [255, 255, 255]
1518
- });
1519
- const routeStyle = [
1520
- new olstyle.Style({
1521
- stroke: new olstyle.Stroke({ color: 'rgba(106, 121, 130, 0.75)', width: 10 })
1522
- }),
1523
- new olstyle.Style({
1524
- stroke: new olstyle.Stroke({ color: 'rgba(79, 169, 221, 0.75)', width: 6 })
1525
- })
1526
- ];
1527
- if (feature.get('type') === 'stop') {
1528
- return stopStyle;
1529
- }
1530
- if (feature.get('type') === 'vertex') {
1531
- return vertexStyle;
1532
- }
1533
- if (feature.get('type') === 'route') {
1534
- return routeStyle;
1535
- }
1536
- }
1537
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2RpcmVjdGlvbnMvZGlyZWN0aW9ucy1mb3JtL2RpcmVjdGlvbnMtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kaXJlY3Rpb25zL2RpcmVjdGlvbnMtZm9ybS9kaXJlY3Rpb25zLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFHWixRQUFRLEVBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGFBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUc5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBT3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFj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TyxDQUFDLEtBQUssQ0FBQztZQUNoQixNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUM5RSxDQUFDO1FBQ0YsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQzVFLENBQUM7S0FDSCxDQUFDO0lBRUYsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUNsQyxPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDcEMsT0FBTyxXQUFXLENBQUM7S0FDcEI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO1FBQ25DLE9BQU8sVUFBVSxDQUFDO0tBQ25CO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCBvbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCAqIGFzIG9sZ2VvbSBmcm9tICdvbC9nZW9tJztcbmltcG9ydCAqIGFzIG9scHJvaiBmcm9tICdvbC9wcm9qJztcbmltcG9ydCAqIGFzIG9sc3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xuaW1wb3J0ICogYXMgb2xjb25kaXRpb24gZnJvbSAnb2wvZXZlbnRzL2NvbmRpdGlvbic7XG5pbXBvcnQgKiBhcyBvbGludGVyYWN0aW9uIGZyb20gJ29sL2ludGVyYWN0aW9uJztcbmltcG9ydCAqIGFzIG9sb2JzZXJ2YWJsZSBmcm9tICdvbC9PYnNlcnZhYmxlJztcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5cbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BpZ28yL3V0aWxzJztcbmltcG9ydCB7XG4gIE1lc3NhZ2UsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTWVzc2FnZVNlcnZpY2UsXG4gIFJvdXRlU2VydmljZVxufSBmcm9tICdAaWdvMi9jb3JlJztcbmltcG9ydCB7IGdldEVudGl0eVRpdGxlIH0gZnJvbSAnQGlnbzIvY29tbW9uJztcblxuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zaGFyZWQvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL3ZlY3Rvci1sYXllcic7XG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2ZlYXR1cmUtZGF0YXNvdXJjZSc7XG5pbXBvcnQgeyBGZWF0dXJlTW90aW9uLCBGRUFUVVJFIH0gZnJvbSAnLi4vLi4vZmVhdHVyZS9zaGFyZWQvZmVhdHVyZS5lbnVtcyc7XG5pbXBvcnQge1xuICBtb3ZlVG9PbEZlYXR1cmVzLFxuICB0cnlCaW5kU3RvcmVMYXllclxufSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLnV0aWxzJztcbmltcG9ydCB7IHRyeUFkZExvYWRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0cmF0ZWdpZXMudXRpbHMnO1xuXG5pbXBvcnQgeyBEaXJlY3Rpb25zLCBEaXJlY3Rpb25zT3B0aW9ucywgU3RvcCB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlyZWN0aW9uc0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi9kaXJlY3Rpb25zLWZvcm0uc2VydmljZSc7XG5cbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3F1ZXJ5L3NoYXJlZC9xdWVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEZlYXR1cmVTdG9yZSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0b3JlJztcbmltcG9ydCB7IEZlYXR1cmUsIEZlYXR1cmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9zdHJhdGVnaWVzL2xvYWRpbmcnO1xuaW1wb3J0IHsgcm91bmRDb29yZFRvIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAudXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlIH0gZnJvbSAnLi4vLi4vb3ZlcmxheS9zaGFyZWQvb3ZlcmxheS1tYXJrZXItc3R5bGUudXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tZGlyZWN0aW9ucy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpcmVjdGlvbnMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RpcmVjdGlvbnMtZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERpcmVjdGlvbnNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRLZXlzID0gWydDb250cm9sJywgJ1NoaWZ0JywgJ0FsdCddO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyQkOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBzdG9wc0Zvcm06IEZvcm1Hcm91cDtcbiAgcHVibGljIHByb2plY3Rpb24gPSAnRVBTRzo0MzI2JztcbiAgcHVibGljIGN1cnJlbnRTdG9wSW5kZXg6IG51bWJlcjtcbiAgcHVibGljIHJvdXRlc1F1ZXJpZXMkJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWFyY2gkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHNlbGVjdFN0b3A7XG4gIHByaXZhdGUgdHJhbnNsYXRlU3RvcDtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJvdXRlO1xuXG4gIHByaXZhdGUgc3RyZWFtJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwdWJsaWMgcm91dGVzUmVzdWx0czogRGlyZWN0aW9uc1tdIHwgTWVzc2FnZVtdO1xuICBnZXQgYWN0aXZlUm91dGUoKTogRGlyZWN0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVJvdXRlO1xuICB9XG4gIHNldCBhY3RpdmVSb3V0ZSh2YWx1ZTogRGlyZWN0aW9ucykge1xuICAgIHRoaXMuX2FjdGl2ZVJvdXRlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuYWN0aXZlUm91dGUkLmdldFZhbHVlKCkgJiYgdmFsdWUuaWQgIT09IHRoaXMuYWN0aXZlUm91dGUkLmdldFZhbHVlKCkuaWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlUm91dGUkLm5leHQodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVJvdXRlRGVzY3JpcHRpb24uZW1pdCh0aGlzLmRpcmVjdGlvbnNUb1RleHQoKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWN0aXZlUm91dGU6IERpcmVjdGlvbnM7XG4gIHB1YmxpYyBhY3RpdmVSb3V0ZSQ6IEJlaGF2aW9yU3ViamVjdDxEaXJlY3Rpb25zPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBsYXN0VGltZW91dFJlcXVlc3Q7XG5cbiAgcHJpdmF0ZSBmb2N1c09uU3RvcCA9IGZhbHNlO1xuICBwcml2YXRlIGZvY3VzS2V5ID0gW107XG4gIHB1YmxpYyBpbml0aWFsU3RvcHNDb29yZHM7XG4gIHByaXZhdGUgYnJvd3Nlckxhbmd1YWdlO1xuXG4gIEBJbnB1dCgpIHRlcm06IHN0cmluZztcblxuICBASW5wdXQoKSBkZWJvdW5jZTogbnVtYmVyID0gMjAwO1xuXG4gIEBJbnB1dCgpIGxlbmd0aDogbnVtYmVyID0gMjtcblxuICBASW5wdXQoKSBtYXA6IElnb01hcDtcblxuICAvKipcbiAgICogVGhlIHN0b3BzIHN0b3JlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc3RvcHNTdG9yZSgpOiBGZWF0dXJlU3RvcmUge1xuICAgIHJldHVybiB0aGlzLl9zdG9wc1N0b3JlO1xuICB9XG4gIHNldCBzdG9wc1N0b3JlKHZhbHVlOiBGZWF0dXJlU3RvcmUpIHtcbiAgICB0aGlzLl9zdG9wc1N0b3JlID0gdmFsdWU7XG4gICAgdGhpcy5zdG9wc1N0b3JlJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9zdG9wc1N0b3JlOiBGZWF0dXJlU3RvcmU7XG5cbiAgc3RvcHNTdG9yZSQ6IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlU3RvcmU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlU3RvcmU+KHVuZGVmaW5lZCk7XG5cbiAgQElucHV0KClcbiAgZ2V0IHJvdXRlRnJvbUZlYXR1cmVEZXRhaWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlRnJvbUZlYXR1cmVEZXRhaWw7XG4gIH1cbiAgc2V0IHJvdXRlRnJvbUZlYXR1cmVEZXRhaWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yb3V0ZUZyb21GZWF0dXJlRGV0YWlsID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfcm91dGVGcm9tRmVhdHVyZURldGFpbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJvdXRlIGFuZCB2ZXJ0ZXggc3RvcmVcbiAgICovXG4gIEBJbnB1dCgpIHJvdXRlU3RvcmU6IEZlYXR1cmVTdG9yZTtcblxuICBAT3V0cHV0KCkgYWN0aXZlUm91dGVEZXNjcmlwdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGRpcmVjdGlvbnNTZXJ2aWNlOiBEaXJlY3Rpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlyZWN0aW9uc0Zvcm1TZXJ2aWNlOiBEaXJlY3Rpb25zRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZnM6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGU6IFJvdXRlU2VydmljZVxuICApIHt9XG5cbiAgY2hhbmdlUm91dGUoKSB7XG4gICAgdGhpcy5zaG93Um91dGVHZW9tZXRyeSh0cnVlKTtcbiAgfVxuXG4gIHByZXZlbnQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UucXVlcnlFbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c09uU3RvcCA9IGZhbHNlO1xuICAgIHRoaXMuYnJvd3Nlckxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UuZ2V0TGFuZ3VhZ2UoKTtcbiAgICB0aGlzLnN0b3BzRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZGlyZWN0aW9uc1R5cGU6ICdjYXInLFxuICAgICAgZGlyZWN0aW9uc01vZGU6ICdkcml2aW5nJywgLy8gbG9vcFxuICAgICAgc3RvcE9yZGVyUHJpb3JpdHk6IHRydWUsXG4gICAgICBkaXJlY3Rpb25zRml4ZWRTdGFydEVuZDogZmFsc2UsXG4gICAgICBzdG9wczogdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvcCgnc3RhcnQnKSxcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9wKCdlbmQnKVxuICAgICAgXSlcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbml0U3RvcmVzKCk7XG4gICAgICB0aGlzLmluaXRPbEludGVyYWN0aW9uKCk7XG4gICAgfSwgMSk7XG5cbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybUNoYW5nZSgpO1xuICAgIHRoaXMucm91dGVzUXVlcmllcyQkLnB1c2goXG4gICAgICB0aGlzLnN0cmVhbSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh0ZXJtOiBzdHJpbmcpID0+IHRoaXMuaGFuZGxlVGVybUNoYW5nZWQodGVybSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3RvcHNTdG9yZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJvdXRlRnJvbUZlYXR1cmVEZXRhaWwgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zRm9ybVNlcnZpY2Uuc2V0U3RvcHMoW10pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2V0Rm9ybShmYWxzZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMuc3RvcHNTdG9yZS5hbGwoKSkge1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcy5pZCAmJiBmZWF0dXJlLnByb3BlcnRpZXMuaWQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdkaXJlY3Rpb25zU3RvcCcpKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcHNTdG9yZS5kZWxldGUoZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc3RvcHNTdG9yZS5hbGwoKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLnN0b3BzU3RvcmUuYWxsKCkpIHtcbiAgICAgICAgICAgICAgY29vcmRpbmF0ZXMucHVzaChmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVMb2NhdGlvblByb3Bvc2FscyhmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCBpKTtcbiAgICAgICAgICAgICAgdGhpcy5jaG9vc2VQcm9wb3NhbChmZWF0dXJlLCBpKTtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53cml0ZVN0b3BzVG9Gb3JtU2VydmljZShjb29yZGluYXRlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUmVzcG9uc2UgPSB0aGlzLmRpcmVjdGlvbnNTZXJ2aWNlLnJvdXRlKGNvb3JkaW5hdGVzLCB7fSk7XG4gICAgICAgICAgICBpZiAocm91dGVSZXNwb25zZSkge1xuICAgICAgICAgICAgICByb3V0ZVJlc3BvbnNlLm1hcChyZXMgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlc1F1ZXJpZXMkJC5wdXNoKFxuICAgICAgICAgICAgICAgICAgcmVzLnN1YnNjcmliZShyb3V0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVzUmVzdWx0cyA9IHJvdXRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJvdXRlID0gdGhpcy5yb3V0ZXNSZXN1bHRzWzBdIGFzIERpcmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JvdXRlR2VvbWV0cnkodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWZzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0b3BzU3RvcmUuYWxsKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uUHJvcG9zYWxzKHRoaXMuc3RvcHNTdG9yZS5hbGwoKVswXS5nZW9tZXRyeS5jb29yZGluYXRlcywgMSk7XG4gICAgICAgICAgICB0aGlzLmNob29zZVByb3Bvc2FsKHRoaXMuc3RvcHNTdG9yZS5hbGwoKVswXSwgMSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlU3RvcHNUb0Zvcm1TZXJ2aWNlKHRoaXMuc3RvcHNTdG9yZS5hbGwoKVswXS5nZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxKTtcbiAgICAgICAgdGhpcy5yb3V0ZUZyb21GZWF0dXJlRGV0YWlsID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlUm91dGVzUXVlcmllcygpO1xuICAgIHRoaXMudW5saXN0ZW5TaW5nbGVDbGljaygpO1xuICAgIHRoaXMucXVlcnlTZXJ2aWNlLnF1ZXJ5RW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5mcmVlemVTdG9yZXMoKTtcbiAgICB0aGlzLndyaXRlU3RvcHNUb0Zvcm1TZXJ2aWNlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJCQubWFwKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0b3JlcygpIHtcbiAgICBjb25zdCBsb2FkaW5nU3RyYXRlZ3kgPSBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcbiAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lXG4gICAgfSk7XG5cbiAgICAvLyBTVE9QIFNUT1JFXG4gICAgY29uc3Qgc3RvcHNTdG9yZSA9IHRoaXMuc3RvcHNTdG9yZTtcbiAgICBjb25zdCBzdG9wc0xheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICAgIGlkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uc3RvcExheWVyJyksXG4gICAgICB6SW5kZXg6IDkxMSxcbiAgICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXG4gICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICAgIGxpbmtJZDogJ2lnby1kaXJlY3Rpb24tc3RvcHMtbGF5ZXInLFxuICAgICAgICBsaW5rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJpZGlyZWN0aW9ubmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHN5bmNlZERlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmtlZElkczogWydpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ10sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGV4cG9ydGFibGU6IHRydWUsXG4gICAgICBicm93c2FibGU6IGZhbHNlLFxuICAgICAgc3R5bGU6IHN0b3BNYXJrZXJcbiAgICB9KTtcbiAgICB0cnlCaW5kU3RvcmVMYXllcihzdG9wc1N0b3JlLCBzdG9wc0xheWVyKTtcbiAgICBzdG9wc1N0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xuICAgIHRyeUFkZExvYWRpbmdTdHJhdGVneShzdG9wc1N0b3JlLCBsb2FkaW5nU3RyYXRlZ3kpO1xuXG4gICAgLy8gUk9VVEUgQU5EIFZFUlRFWCBTVE9SRVxuICAgIGNvbnN0IHJvdXRlU3RvcmUgPSB0aGlzLnJvdXRlU3RvcmU7XG4gICAgY29uc3Qgcm91dGVMYXllciA9IG5ldyBWZWN0b3JMYXllcih7XG4gICAgICBpZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInLFxuICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnJvdXRlTGF5ZXInKSxcbiAgICAgIHpJbmRleDogOTEwLFxuICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICAgIHNob3dJbkxheWVyTGlzdDogdHJ1ZSxcbiAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBsaW5rZWRMYXllcnM6IHtcbiAgICAgICAgbGlua0lkOiAnaWdvLWRpcmVjdGlvbi1yb3V0ZS1sYXllcidcbiAgICAgIH0sXG4gICAgICBleHBvcnRhYmxlOiB0cnVlLFxuICAgICAgYnJvd3NhYmxlOiBmYWxzZSxcbiAgICAgIHN0eWxlOiBzdG9wTWFya2VyXG4gICAgfSk7XG4gICAgdHJ5QmluZFN0b3JlTGF5ZXIocm91dGVTdG9yZSwgcm91dGVMYXllcik7XG4gICAgcm91dGVTdG9yZS5sYXllci52aXNpYmxlID0gdHJ1ZTtcbiAgICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3kocm91dGVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2godGhpcy5zdG9wc1N0b3JlLmNvdW50JC5zdWJzY3JpYmUoY250ID0+IHtcbiAgICAgIGNudCA+PSAxID9cbiAgICAgICAgdGhpcy5zdG9wc1N0b3JlLmxheWVyLm9wdGlvbnMuc2hvd0luTGF5ZXJMaXN0ID0gdHJ1ZSA6XG4gICAgICAgIHRoaXMuc3RvcHNTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlO1xuICAgIH0pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2godGhpcy5yb3V0ZVN0b3JlLmNvdW50JC5zdWJzY3JpYmUoY250ID0+IHtcbiAgICAgIGNudCA+PSAxID9cbiAgICAgICAgdGhpcy5yb3V0ZVN0b3JlLmxheWVyLm9wdGlvbnMuc2hvd0luTGF5ZXJMaXN0ID0gdHJ1ZSA6XG4gICAgICAgIHRoaXMucm91dGVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9sSW50ZXJhY3Rpb24oKSB7XG4gICAgbGV0IHNlbGVjdGVkU3RvcEZlYXR1cmU7XG4gICAgdGhpcy5zZWxlY3RTdG9wID0gbmV3IG9saW50ZXJhY3Rpb24uU2VsZWN0KHtcbiAgICAgIGxheWVyczogW3RoaXMuc3RvcHNTdG9yZS5sYXllci5vbF0sXG4gICAgICBjb25kaXRpb246IG9sY29uZGl0aW9uLnBvaW50ZXJNb3ZlLFxuICAgICAgaGl0VG9sZXJhbmNlOiA3LFxuICAgICAgZmlsdGVyOiBmZWF0dXJlID0+IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09ICdzdG9wJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0U3RvcC5vbignc2VsZWN0JywgZXZ0ID0+IHtcbiAgICAgIHNlbGVjdGVkU3RvcEZlYXR1cmUgPSBldnQudGFyZ2V0LmdldEZlYXR1cmVzKClbMF07XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zbGF0ZVN0b3AgPSBuZXcgb2xpbnRlcmFjdGlvbi5UcmFuc2xhdGUoe1xuICAgICAgbGF5ZXJzOiBbdGhpcy5zdG9wc1N0b3JlLmxheWVyLm9sXSxcbiAgICAgIGZlYXR1cmVzOiBzZWxlY3RlZFN0b3BGZWF0dXJlXG4gICAgICAvLyBUT0RPIEluIE9wZW5sYXllcnMgPj0gNi54LCBmaWx0ZXIgaXMgbm93IGFsbG93ZWQuXG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zbGF0ZVN0b3Aub24oJ3RyYW5zbGF0aW5nJywgZXZ0ID0+IHtcbiAgICAgIGNvbnN0IGZlYXR1cmVzID0gZXZ0LmZlYXR1cmVzO1xuICAgICAgaWYgKGZlYXR1cmVzLmdldExlbmd0aCgpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0ZVRyYW5zbGF0aW9uKGZlYXR1cmVzLCBmYWxzZSwgNTAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50cmFuc2xhdGVTdG9wLm9uKCd0cmFuc2xhdGVlbmQnLCBldnQgPT4ge1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBldnQuZmVhdHVyZXM7XG4gICAgICBpZiAoZmVhdHVyZXMuZ2V0TGVuZ3RoKCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5leGVjdXRlVHJhbnNsYXRpb24oZmVhdHVyZXMsIHRydWUsIDAsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZSA9IG5ldyBvbGludGVyYWN0aW9uLlNlbGVjdCh7XG4gICAgICBsYXllcnM6IFt0aGlzLnJvdXRlU3RvcmUubGF5ZXIub2xdLFxuICAgICAgY29uZGl0aW9uOiBvbGNvbmRpdGlvbi5jbGljayxcbiAgICAgIGhpdFRvbGVyYW5jZTogNyxcbiAgICAgIGZpbHRlcjogZmVhdHVyZSA9PiB7XG4gICAgICAgIHJldHVybiBmZWF0dXJlLmdldElkKCkgPT09ICdyb3V0ZSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdXRlLm9uKCdzZWxlY3QnLCBldnQgPT4ge1xuICAgICAgaWYgKHRoaXMuZm9jdXNPblN0b3AgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdENvb3JkaW5hdGVzID0gb2xwcm9qLnRyYW5zZm9ybShcbiAgICAgICAgICAoZXZ0IGFzIGFueSkubWFwQnJvd3NlckV2ZW50LmNvb3JkaW5hdGUsXG4gICAgICAgICAgdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgICAgICB0aGlzLnByb2plY3Rpb25cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRTdG9wKCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuc3RvcHMubGVuZ3RoIC0gMjtcbiAgICAgICAgdGhpcy5zdG9wcy5hdChwb3MpLnBhdGNoVmFsdWUoeyBzdG9wQ29vcmRpbmF0ZXM6IHNlbGVjdENvb3JkaW5hdGVzIH0pO1xuICAgICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uUHJvcG9zYWxzKHNlbGVjdENvb3JkaW5hdGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIHBvcyk7XG4gICAgICAgIHRoaXMuYWRkU3RvcE92ZXJsYXkoc2VsZWN0Q29vcmRpbmF0ZXMgYXMgW251bWJlciwgbnVtYmVyXSwgcG9zKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRlLmdldEZlYXR1cmVzKCkuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZS5nZXRGZWF0dXJlcygpLmNsZWFyKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5vbC5hZGRJbnRlcmFjdGlvbih0aGlzLnNlbGVjdFN0b3ApO1xuICAgIHRoaXMubWFwLm9sLmFkZEludGVyYWN0aW9uKHRoaXMudHJhbnNsYXRlU3RvcCk7XG4gICAgdGhpcy5tYXAub2wuYWRkSW50ZXJhY3Rpb24odGhpcy5zZWxlY3RlZFJvdXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Gb3JtQ2hhbmdlKCkge1xuICAgIHRoaXMucm91dGVzUXVlcmllcyQkLnB1c2goXG4gICAgICB0aGlzLnN0b3BzRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKVxuICAgICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgICAgdGhpcy53cml0ZVN0b3BzVG9Gb3JtU2VydmljZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGFueSBzdG9yZSwgbWVhbmluZyB0aGUgbGF5ZXIgaXMgcmVtb3ZlZCwgc3RyYXRlZ2llcyBhcmUgZGVhY3RpdmF0ZWRcbiAgICogYW5kIHNvbWUgbGlzdGVuZXIgcmVtb3ZlZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgZnJlZXplU3RvcmVzKCkge1xuICAgIGNvbnN0IHN0b3BzU3RvcmUgPSB0aGlzLnN0b3BzU3RvcmU7XG4gICAgY29uc3Qgcm91dGVTdG9yZSA9IHRoaXMucm91dGVTdG9yZTtcblxuICAgIHRoaXMubWFwLm9sLnJlbW92ZUludGVyYWN0aW9uKHRoaXMuc2VsZWN0U3RvcCk7XG4gICAgdGhpcy5tYXAub2wucmVtb3ZlSW50ZXJhY3Rpb24odGhpcy50cmFuc2xhdGVTdG9wKTtcbiAgICB0aGlzLm1hcC5vbC5yZW1vdmVJbnRlcmFjdGlvbih0aGlzLnNlbGVjdGVkUm91dGUpO1xuICAgIHN0b3BzU3RvcmUuZGVhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSk7XG4gICAgcm91dGVTdG9yZS5kZWFjdGl2YXRlU3RyYXRlZ3lPZlR5cGUoRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVRyYW5zbGF0aW9uKFxuICAgIGZlYXR1cmVzLFxuICAgIHJldmVyc2VTZWFyY2hQcm9wb3NhbCA9IGZhbHNlLFxuICAgIGRlbGF5OiBudW1iZXIgPSAwLFxuICAgIG92ZXJ2aWV3OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5yb3V0ZVN0b3JlLmNsZWFyKCk7XG4gICAgY29uc3QgZmlyc3RGZWF0dXJlID0gZmVhdHVyZXMuZ2V0QXJyYXkoKVswXTtcbiAgICBjb25zdCB0cmFuc2xhdGVkSUQgPSBmaXJzdEZlYXR1cmUuZ2V0SWQoKTtcbiAgICBjb25zdCB0cmFuc2xhdGVkUG9zID0gdHJhbnNsYXRlZElELnNwbGl0KCdfJyk7XG4gICAgbGV0IHA7XG4gICAgc3dpdGNoICh0cmFuc2xhdGVkUG9zWzFdKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIHAgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIHAgPSB0aGlzLnN0b3BzLmxlbmd0aCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcCA9IE51bWJlcih0cmFuc2xhdGVkUG9zWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zbGF0aW9uQ29vcmRpbmF0ZXMgPSBvbHByb2oudHJhbnNmb3JtKFxuICAgICAgZmlyc3RGZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKSxcbiAgICAgIHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICB0aGlzLnByb2plY3Rpb25cbiAgICApO1xuICAgIHRoaXMuc3RvcHNcbiAgICAgIC5hdChwKVxuICAgICAgLnBhdGNoVmFsdWUoe1xuICAgICAgICBzdG9wQ29vcmRpbmF0ZXM6IHRyYW5zbGF0aW9uQ29vcmRpbmF0ZXMsXG4gICAgICAgIHN0b3BQcm9wb3NhbHM6IFtdXG4gICAgICB9KTtcbiAgICBpZiAocmV2ZXJzZVNlYXJjaFByb3Bvc2FsKSB7XG4gICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uUHJvcG9zYWxzKHRyYW5zbGF0aW9uQ29vcmRpbmF0ZXMgYXMgW251bWJlciwgbnVtYmVyXSwgcCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uc09wdGlvbnMgPSB7XG4gICAgICBzdGVwczogdHJ1ZSxcbiAgICAgIG92ZXJ2aWV3OiBmYWxzZSxcbiAgICAgIGFsdGVybmF0aXZlczogdHJ1ZVxuICAgIH0gYXMgRGlyZWN0aW9uc09wdGlvbnM7XG5cbiAgICBpZiAob3ZlcnZpZXcpIHtcbiAgICAgIGRpcmVjdGlvbnNPcHRpb25zLm92ZXJ2aWV3ID0gdHJ1ZTtcbiAgICAgIGRpcmVjdGlvbnNPcHRpb25zLnN0ZXBzID0gZmFsc2U7XG4gICAgICBkaXJlY3Rpb25zT3B0aW9ucy5hbHRlcm5hdGl2ZXMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMubGFzdFRpbWVvdXRSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBjYW5jZWwgdGltZW91dCB3aGVuIHRoZSBtb3VzZSBtb3Zlc1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0VGltZW91dFJlcXVlc3QpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VGltZW91dFJlcXVlc3QgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRSb3V0ZXModW5kZWZpbmVkLCBkaXJlY3Rpb25zT3B0aW9ucyk7XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxhc3RUaW1lb3V0UmVxdWVzdCk7XG4gICAgICB0aGlzLmdldFJvdXRlcyh1bmRlZmluZWQsIGRpcmVjdGlvbnNPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVMb2NhdGlvblByb3Bvc2Fscyhjb29yZGluYXRlczogW251bWJlciwgbnVtYmVyXSwgc3RvcEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBncm91cGVkTG9jYXRpb25zID0gW107XG4gICAgY29uc3Qgcm91bmRlZENvb3JkaW5hdGVzID0gW1xuICAgICAgY29vcmRpbmF0ZXNbMF0udG9GaXhlZCg1KSxcbiAgICAgIGNvb3JkaW5hdGVzWzFdLnRvRml4ZWQoNSlcbiAgICBdO1xuICAgIHRoaXMuc3RvcHNcbiAgICAgIC5hdChzdG9wSW5kZXgpXG4gICAgICAucGF0Y2hWYWx1ZSh7IHN0b3BQb2ludDogcm91bmRlZENvb3JkaW5hdGVzLmpvaW4oJywnKSB9KTtcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2VcbiAgICAgIC5yZXZlcnNlU2VhcmNoKGNvb3JkaW5hdGVzLCB7IHpvb206IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldFpvb20oKSB9KVxuICAgICAgLm1hcChyZXMgPT5cbiAgICAgICAgdGhpcy5yb3V0ZXNRdWVyaWVzJCQucHVzaChcbiAgICAgICAgICByZXMucmVxdWVzdC5waXBlKG1hcChmID0+IGYpKS5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdyb3VwZWRMb2NhdGlvbnMuZmlsdGVyKGYgPT4gZi5zb3VyY2UgPT09IHJlc3VsdC5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGdyb3VwZWRMb2NhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzLm1hcChyID0+IHIuZGF0YSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnN0b3BzXG4gICAgICAgICAgICAgIC5hdChzdG9wSW5kZXgpXG4gICAgICAgICAgICAgIC5wYXRjaFZhbHVlKHsgc3RvcFByb3Bvc2FsczogZ3JvdXBlZExvY2F0aW9ucyB9KTtcbiAgICAgICAgICAgIC8vIFRPRE86IFByZWZlciBhbm90aGVyIHNvdXJjZT9cbiAgICAgICAgICAgIGlmIChyZXN1bHRzWzBdKSB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHRzWzBdLnNvdXJjZS5nZXRJZCgpID09PSAnaWNoZXJjaGVyZXZlcnNlJykge1xuICAgICAgICAgICAgICAgIC8vIHByZWZlciBhZGRyZXNzIHR5cGUuXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlOiBhbnkgPSByZXN1bHRzW2ldLmRhdGE7XG4gICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnR5cGUgPT09ICdhZHJlc3NlcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0UG9zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcHMuYXQoc3RvcEluZGV4KS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgIHN0b3BQb2ludDogZ2V0RW50aXR5VGl0bGUocmVzdWx0c1tyZXN1bHRQb3NdKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW3Jlc3VsdFBvc10uZGF0YS5nZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0b3BzLmF0KHN0b3BJbmRleCkucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BDb29yZGluYXRlczpcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3Jlc3VsdFBvc10uZGF0YS5nZW9tZXRyeS5jb29yZGluYXRlc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5vdCBtb3ZpbmcgdGhlIHRyYW5zbGF0ZWQgcG9pbnQgT25seSB0byBzdWdnZXN0IHZhbHVlIGludG8gdGhlIFVJLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRzWzBdLnNvdXJjZS5nZXRJZCgpID09PSAnY29vcmRpbmF0ZXNyZXZlcnNlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcHMuYXQoc3RvcEluZGV4KS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgIHN0b3BQb2ludDogW1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzWzBdLmRhdGEuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0udG9GaXhlZCg1KSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1swXS5kYXRhLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLnRvRml4ZWQoNSlcbiAgICAgICAgICAgICAgICAgIF0uam9pbignLCcpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMF0uZGF0YS5nZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0b3BzLmF0KHN0b3BJbmRleCkucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BDb29yZGluYXRlczogcmVzdWx0c1swXS5kYXRhLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gTm90IG1vdmluZyB0aGUgdHJhbnNsYXRlZCBwb2ludCBPbmx5IHRvIHN1Z2dlc3QgdmFsdWUgaW50byB0aGUgVUkuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnN0b3BzXG4gICAgICAgICAgICAgICAgLmF0KHN0b3BJbmRleClcbiAgICAgICAgICAgICAgICAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICBzdG9wUG9pbnQ6IHJvdW5kZWRDb29yZGluYXRlcy5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgICBzdG9wUHJvcG9zYWxzOiBbXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZnMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBkaXJlY3Rpb25zVGV4dChpbmRleDogbnVtYmVyLCBzdG9wc0NvdW50cyA9IHRoaXMuc3RvcHMubGVuZ3RoKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHN0b3BzQ291bnRzIC0gMSB8fCBzdG9wc0NvdW50cyA9PT0gMSkge1xuICAgICAgcmV0dXJuICdlbmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2ludGVybWVkaWF0ZSc7XG4gICAgfVxuICB9XG5cbiAgcmFpc2VTdG9wKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICB0aGlzLm1vdmVTdG9wKGluZGV4LCAtMSk7XG4gICAgfVxuICB9XG5cbiAgbG93ZXJTdG9wKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPCB0aGlzLnN0b3BzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMubW92ZVN0b3AoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW92ZVN0b3AoaW5kZXgsIGRpZmYpIHtcbiAgICBjb25zdCBmcm9tVmFsdWUgPSB0aGlzLnN0b3BzLmF0KGluZGV4KTtcbiAgICB0aGlzLnJlbW92ZVN0b3AoaW5kZXgpO1xuICAgIHRoaXMuc3RvcHMuaW5zZXJ0KGluZGV4ICsgZGlmZiwgZnJvbVZhbHVlKTtcbiAgICB0aGlzLnN0b3BzXG4gICAgICAuYXQoaW5kZXgpXG4gICAgICAucGF0Y2hWYWx1ZSh7IGRpcmVjdGlvbnNUZXh0OiB0aGlzLmRpcmVjdGlvbnNUZXh0KGluZGV4KSB9KTtcbiAgICB0aGlzLnN0b3BzXG4gICAgICAuYXQoaW5kZXggKyBkaWZmKVxuICAgICAgLnBhdGNoVmFsdWUoeyBkaXJlY3Rpb25zVGV4dDogdGhpcy5kaXJlY3Rpb25zVGV4dChpbmRleCArIGRpZmYpIH0pO1xuICAgIGlmICh0aGlzLnN0b3BzLmF0KGluZGV4KS52YWx1ZS5zdG9wQ29vcmRpbmF0ZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcE92ZXJsYXkodGhpcy5zdG9wcy5hdChpbmRleCkudmFsdWUuc3RvcENvb3JkaW5hdGVzLCBpbmRleCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3BzLmF0KGluZGV4ICsgZGlmZikudmFsdWUuc3RvcENvb3JkaW5hdGVzKSB7XG4gICAgICB0aGlzLmFkZFN0b3BPdmVybGF5KFxuICAgICAgICB0aGlzLnN0b3BzLmF0KGluZGV4ICsgZGlmZikudmFsdWUuc3RvcENvb3JkaW5hdGVzLFxuICAgICAgICBpbmRleCArIGRpZmZcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0b3BzKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcHNGb3JtLmdldCgnc3RvcHMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVTdG9wc1RvRm9ybVNlcnZpY2Uoc3RvcHNBcnJheT8pIHtcbiAgICBpZiAoc3RvcHNBcnJheSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb25zRm9ybVNlcnZpY2Uuc2V0U3RvcHMoc3RvcHNBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0b3BzID0gW107XG4gICAgICB0aGlzLnN0b3BzLnZhbHVlLmZvckVhY2goc3RvcCA9PiB7XG4gICAgICAgIGlmIChzdG9wLnN0b3BDb29yZGluYXRlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgc3RvcHMucHVzaChzdG9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZS5zZXRTdG9wcyhzdG9wcyk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RvcCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnNlcnRJbmRleCA9IHRoaXMuc3RvcHMubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnN0b3BzLmluc2VydChpbnNlcnRJbmRleCwgdGhpcy5jcmVhdGVTdG9wKCkpO1xuICB9XG5cbiAgY3JlYXRlU3RvcChkaXJlY3Rpb25zUG9zID0gJ2ludGVybWVkaWF0ZScpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHN0b3BQb2ludDogWycnXSxcbiAgICAgIHN0b3BQcm9wb3NhbHM6IFtbXV0sXG4gICAgICBkaXJlY3Rpb25zVGV4dDogZGlyZWN0aW9uc1BvcyxcbiAgICAgIHN0b3BDb29yZGluYXRlczogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVTdG9wKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0U3RvcE92ZXJsYXlJRChpbmRleCk7XG4gICAgdGhpcy5kZWxldGVTdG9yZUZlYXR1cmVCeUlEKHRoaXMuc3RvcHNTdG9yZSwgaWQpO1xuICAgIHRoaXMuc3RvcHMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGxldCBjbnQgPSAwO1xuICAgIHRoaXMuc3RvcHMudmFsdWUuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgIHRoaXMuc3RvcHNcbiAgICAgICAgLmF0KGNudClcbiAgICAgICAgLnBhdGNoVmFsdWUoeyBkaXJlY3Rpb25zVGV4dDogdGhpcy5kaXJlY3Rpb25zVGV4dChjbnQpIH0pO1xuICAgICAgdGhpcy5hZGRTdG9wT3ZlcmxheSh0aGlzLnN0b3BzLmF0KGNudCkudmFsdWUuc3RvcENvb3JkaW5hdGVzLCBjbnQpO1xuICAgICAgY250Kys7XG4gICAgfSk7XG4gIH1cblxuICByZXNldEZvcm0oc3RvcDogYm9vbGVhbikge1xuICAgIHRoaXMucm91dGVzUmVzdWx0cyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBuYlN0b3BzID0gdGhpcy5zdG9wcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYlN0b3BzOyBpKyspIHtcbiAgICAgIHRoaXMuc3RvcHMucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHRoaXMuc3RvcHMuaW5zZXJ0KDAsIHRoaXMuY3JlYXRlU3RvcCgnc3RhcnQnKSk7XG4gICAgdGhpcy5zdG9wcy5pbnNlcnQoMSwgdGhpcy5jcmVhdGVTdG9wKCdlbmQnKSk7XG5cbiAgICBpZiAoc3RvcCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdG9wc1N0b3JlLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMucm91dGVTdG9yZS5jbGVhcigpO1xuICB9XG5cbiAgZm9ybWF0U3RlcChzdGVwLCBjbnQpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRJbnN0cnVjdGlvbihcbiAgICAgIHN0ZXAubWFuZXV2ZXIudHlwZSxcbiAgICAgIHN0ZXAubWFuZXV2ZXIubW9kaWZpZXIsXG4gICAgICBzdGVwLm5hbWUsXG4gICAgICBzdGVwLm1hbmV1dmVyLmJlYXJpbmdfYWZ0ZXIsXG4gICAgICBjbnQsXG4gICAgICBzdGVwLm1hbmV1dmVyLmV4aXQsXG4gICAgICBjbnQgPT09IHRoaXMuYWN0aXZlUm91dGUuc3RlcHMubGVuZ3RoIC0gMVxuICAgICk7XG4gIH1cblxuICBmb3JtYXRJbnN0cnVjdGlvbihcbiAgICB0eXBlLFxuICAgIG1vZGlmaWVyLFxuICAgIHJvdXRlLFxuICAgIGRpcmVjdGlvbixcbiAgICBzdGVwUG9zaXRpb24sXG4gICAgZXhpdCxcbiAgICBsYXN0U3RlcCA9IGZhbHNlXG4gICkge1xuICAgIGxldCBkaXJlY3RpdmVGcjtcbiAgICBsZXQgZGlyZWN0aXZlRW47XG4gICAgbGV0IGltYWdlID0gJ2ZvcndhcmQnO1xuICAgIGxldCBjc3NDbGFzcyA9ICdyb3RhdGUtMjcwJztcbiAgICBjb25zdCB0cmFuc2xhdGVkRGlyZWN0aW9uID0gdGhpcy50cmFuc2xhdGVCZWFyaW5nKGRpcmVjdGlvbik7XG4gICAgY29uc3QgdHJhbnNsYXRlZE1vZGlmaWVyID0gdGhpcy50cmFuc2xhdGVNb2RpZmllcihtb2RpZmllcik7XG4gICAgY29uc3QgZW5QcmVmaXggPSBtb2RpZmllciA9PT0gJ3N0cmFpZ2h0JyA/ICcnIDogJ29uIHRoZSAnO1xuICAgIGNvbnN0IGZyUHJlZml4ID0gbW9kaWZpZXIgPT09ICdzdHJhaWdodCcgPyAnJyA6ICfDoCAnO1xuXG4gICAgbGV0IGZyQWdncmVnYXRlZERpcmVjdGlvbiA9IGZyUHJlZml4ICsgdHJhbnNsYXRlZE1vZGlmaWVyO1xuICAgIGxldCBlbkFnZ3JlZ2F0ZWREaXJlY3Rpb24gPSBlblByZWZpeCArIHRyYW5zbGF0ZWRNb2RpZmllcjtcblxuICAgIGlmIChtb2RpZmllciAmJiBtb2RpZmllci5zZWFyY2goJ3NsaWdodCcpID49IDApIHtcbiAgICAgIGVuQWdncmVnYXRlZERpcmVjdGlvbiA9IHRyYW5zbGF0ZWRNb2RpZmllcjtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXIgPT09ICd1dHVybicpIHtcbiAgICAgIGltYWdlID0gJ2ZvcndhcmQnO1xuICAgICAgY3NzQ2xhc3MgPSAncm90YXRlLTkwJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgcmlnaHQnKSB7XG4gICAgICBpbWFnZSA9ICdzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQnO1xuICAgICAgY3NzQ2xhc3MgPSAnaWNvbi1mbGlwcGVkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAncmlnaHQnKSB7XG4gICAgICBpbWFnZSA9ICdzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQnO1xuICAgICAgY3NzQ2xhc3MgPSAnaWNvbi1mbGlwcGVkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IHJpZ2h0Jykge1xuICAgICAgaW1hZ2UgPSAnZm9yd2FyZCc7XG4gICAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjkwJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICBpbWFnZSA9ICdmb3J3YXJkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IGxlZnQnKSB7XG4gICAgICBpbWFnZSA9ICdmb3J3YXJkJztcbiAgICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNTAnO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdsZWZ0Jykge1xuICAgICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5LWFycm93LWxlZnQnO1xuICAgICAgY3NzQ2xhc3MgPSAnaWNvbi1mbGlwcGVkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgbGVmdCcpIHtcbiAgICAgIGltYWdlID0gJ3N1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0JztcbiAgICAgIGNzc0NsYXNzID0gJ2ljb24tZmxpcHBlZCc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd0dXJuJykge1xuICAgICAgaWYgKG1vZGlmaWVyID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICAgIGRpcmVjdGl2ZUZyID0gJ0NvbnRpbnVlciBzdXIgJyArIHJvdXRlO1xuICAgICAgICBkaXJlY3RpdmVFbiA9ICdDb250aW51ZSBvbiAnICsgcm91dGU7XG4gICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAndXR1cm4nKSB7XG4gICAgICAgIGRpcmVjdGl2ZUZyID0gJ0ZhaXJlIGRlbWktdG91ciBzdXIgJyArIHJvdXRlO1xuICAgICAgICBkaXJlY3RpdmVFbiA9ICdNYWtlIHUtdHVybiBvbiAnICsgcm91dGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXJlY3RpdmVGciA9ICdUb3VybmVyICcgKyBmckFnZ3JlZ2F0ZWREaXJlY3Rpb24gKyAnIHN1ciAnICsgcm91dGU7XG4gICAgICAgIGRpcmVjdGl2ZUVuID0gJ1R1cm4gJyArIHRyYW5zbGF0ZWRNb2RpZmllciArICcgb250byAnICsgcm91dGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmV3IG5hbWUnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9XG4gICAgICAgICdDb250aW51ZXIgZW4gZGlyZWN0aW9uICcgKyB0cmFuc2xhdGVkRGlyZWN0aW9uICsgJyBzdXIgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnSGVhZCAnICsgdHJhbnNsYXRlZERpcmVjdGlvbiArICcgb24gJyArIHJvdXRlO1xuICAgICAgaW1hZ2UgPSAnY29tcGFzcyc7XG4gICAgICBjc3NDbGFzcyA9ICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RlcGFydCcpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID1cbiAgICAgICAgJ0FsbGVyIGVuIGRpcmVjdGlvbiAnICsgdHJhbnNsYXRlZERpcmVjdGlvbiArICcgc3VyICcgKyByb3V0ZTtcbiAgICAgIGRpcmVjdGl2ZUVuID0gJ0hlYWQgJyArIHRyYW5zbGF0ZWREaXJlY3Rpb24gKyAnIG9uICcgKyByb3V0ZTtcbiAgICAgIGltYWdlID0gJ2NvbXBhc3MnO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJpdmUnKSB7XG4gICAgICBpZiAobGFzdFN0ZXApIHtcbiAgICAgICAgbGV0IGNvbWEgPSAnLCAnO1xuICAgICAgICBpZiAoIXRyYW5zbGF0ZWRNb2RpZmllcikge1xuICAgICAgICAgIGZyQWdncmVnYXRlZERpcmVjdGlvbiA9ICcnO1xuICAgICAgICAgIGVuQWdncmVnYXRlZERpcmVjdGlvbiA9ICcnO1xuICAgICAgICAgIGNvbWEgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBkaXJlY3RpdmVGciA9ICdWb3VzIMOqdGVzIGFycml2w6knICsgY29tYSArIGZyQWdncmVnYXRlZERpcmVjdGlvbjtcbiAgICAgICAgZGlyZWN0aXZlRW4gPVxuICAgICAgICAgICdZb3UgaGF2ZSByZWFjaGVkIHlvdXIgZGVzdGluYXRpb24nICsgY29tYSArIGVuQWdncmVnYXRlZERpcmVjdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGl2ZUZyID0gJ1ZvdXMgYXR0ZWlnbmV6IGxlIHBvaW50IGludGVybcOpZGlhcmUgc3VyICcgKyByb3V0ZTtcbiAgICAgICAgZGlyZWN0aXZlRW4gPSAnWW91IGhhdmUgcmVhY2hlZCB0aGUgaW50ZXJtZWRpYXRlIHN0b3Agb250byAnICsgcm91dGU7XG4gICAgICAgIGltYWdlID0gJ21hcC1tYXJrZXInO1xuICAgICAgICBjc3NDbGFzcyA9ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21lcmdlJykge1xuICAgICAgZGlyZWN0aXZlRnIgPSAnQ29udGludWVyIHN1ciAnICsgcm91dGU7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdDb250aW51ZSBvbiAnICsgcm91dGU7XG4gICAgICBpbWFnZSA9ICdmb3J3YXJkJztcbiAgICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29uIHJhbXAnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9IFwiUHJlbmRyZSBsJ2VudHLDqWUgZCdhdXRvcm91dGUgXCIgKyBmckFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgICBkaXJlY3RpdmVFbiA9ICdUYWtlIHRoZSByYW1wICcgKyBlbkFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2ZmIHJhbXAnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9IFwiUHJlbmRyZSBsYSBzb3J0aWUgZCdhdXRvcm91dGUgXCIgKyBmckFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgICBkaXJlY3RpdmVFbiA9ICdUYWtlIGV4aXQgJyArIGVuQWdncmVnYXRlZERpcmVjdGlvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmb3JrJykge1xuICAgICAgaWYgKG1vZGlmaWVyLnNlYXJjaCgnbGVmdCcpID49IDApIHtcbiAgICAgICAgZGlyZWN0aXZlRnIgPSAnR2FyZGVyIGxhIGdhdWNoZSBzdXIgJyArIHJvdXRlO1xuICAgICAgICBkaXJlY3RpdmVFbiA9ICdNZXJnZSBsZWZ0IG9udG8gJyArIHJvdXRlO1xuICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5zZWFyY2goJ3JpZ2h0JykgPj0gMCkge1xuICAgICAgICBkaXJlY3RpdmVGciA9ICdHYXJkZXIgbGEgZHJvaXRlIHN1ciAnICsgcm91dGU7XG4gICAgICAgIGRpcmVjdGl2ZUVuID0gJ01lcmdlIHJpZ2h0IG9udG8gJyArIHJvdXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyZWN0aXZlRnIgPSAnQ29udGludWVyIHN1ciAnICsgcm91dGU7XG4gICAgICAgIGRpcmVjdGl2ZUVuID0gJ0NvbnRpbnVlIG9uICcgKyByb3V0ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlbmQgb2Ygcm9hZCcpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID1cbiAgICAgICAgJ8OAIGxhIGZpbiBkZSBsYSByb3V0ZSwgdG91cm5lciAnICsgdHJhbnNsYXRlZE1vZGlmaWVyICsgJyBzdXIgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPVxuICAgICAgICAnQXQgdGhlIGVuZCBvZiB0aGUgcm9hZCwgdHVybiAnICsgdHJhbnNsYXRlZE1vZGlmaWVyICsgJyBvbnRvICcgKyByb3V0ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2UgbGFuZScpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID0gJ1ByZW5kcmUgbGEgdm9pZSBkZSAuLi4gJztcbiAgICAgIGRpcmVjdGl2ZUVuID0gJ1Rha2UgdGhlIGxhbmUgLi4uJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb250aW51ZScgJiYgbW9kaWZpZXIgIT09ICd1dHVybicpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID0gJ0NvbnRpbnVlciBzdXIgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnQ29udGludWUgb24gJyArIHJvdXRlO1xuICAgICAgaW1hZ2UgPSAnZm9yd2FyZCc7XG4gICAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjcwJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyb3VuZGFib3V0Jykge1xuICAgICAgZGlyZWN0aXZlRnIgPSAnQXUgcm9uZC1wb2ludCwgcHJlbmRyZSBsYSAnICsgZXhpdDtcbiAgICAgIGRpcmVjdGl2ZUZyICs9IGV4aXQgPT09IDEgPyAncmUnIDogJ2UnO1xuICAgICAgZGlyZWN0aXZlRnIgKz0gJyBzb3J0aWUgdmVycyAnICsgcm91dGU7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdBdCB0aGUgcm91bmRhYm91dCwgdGFrZSB0aGUgJyArIGV4aXQ7XG4gICAgICBkaXJlY3RpdmVFbiArPSBleGl0ID09PSAxID8gJ3N0JyA6ICdyZCc7XG4gICAgICBkaXJlY3RpdmVFbiArPSAnIGV4aXQgdG93YXJkcyAnICsgcm91dGU7XG4gICAgICBpbWFnZSA9ICdjaGFydC1kb251dCc7XG4gICAgICBjc3NDbGFzcyA9ICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JvdGFyeScpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID0gJ1JvbmQtcG9pbnQgcm90YXJ5Li4uLic7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdSb3VuZGFib3V0IHJvdGFyeS4uLi4nO1xuICAgICAgaW1hZ2UgPSAnY2hhcnQtZG9udXQnO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyb3VuZGFib3V0IHR1cm4nKSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICdSb25kLXBvaW50LCBwcmVuZHJlIGxhIC4uLic7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdSb3VuZGFib3V0LCB0YWtlIHRoZSAuLi4nO1xuICAgICAgaW1hZ2UgPSAnY2hhcnQtZG9udXQnO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleGl0IHJvdW5kYWJvdXQnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICdQb3Vyc3VpdnJlIHZlcnMgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnQ29udGludWUgdG8gJyArIHJvdXRlO1xuICAgICAgaW1hZ2UgPSAnZm9yd2FyZCc7XG4gICAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjcwJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdub3RpZmljYXRpb24nKSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICdub3RpZmljYXRpb24gLi4uLic7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdub3RpZmljYXRpb24gLi4uLic7XG4gICAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3V0dXJuJykge1xuICAgICAgZGlyZWN0aXZlRnIgPVxuICAgICAgICAnRmFpcmUgZGVtaS10b3VyIGV0IGNvbnRpbnVlciBlbiBkaXJlY3Rpb24gJyArXG4gICAgICAgIHRyYW5zbGF0ZWREaXJlY3Rpb24gK1xuICAgICAgICAnIHN1ciAnICtcbiAgICAgICAgcm91dGU7XG4gICAgICBkaXJlY3RpdmVFbiA9XG4gICAgICAgICdNYWtlIHUtdHVybiBhbmQgaGVhZCAnICsgdHJhbnNsYXRlZERpcmVjdGlvbiArICcgb24gJyArIHJvdXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICc/Pz8nO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnPz8/JztcbiAgICB9XG5cbiAgICBpZiAobGFzdFN0ZXApIHtcbiAgICAgIGltYWdlID0gJ2ZsYWctdmFyaWFudCc7XG4gICAgICBjc3NDbGFzcyA9ICcnO1xuICAgIH1cbiAgICBpZiAoc3RlcFBvc2l0aW9uID09PSAwKSB7XG4gICAgICBpbWFnZSA9ICdjb21wYXNzJztcbiAgICAgIGNzc0NsYXNzID0gJyc7XG4gICAgfVxuXG4gICAgbGV0IGRpcmVjdGl2ZTtcbiAgICBpZiAodGhpcy5icm93c2VyTGFuZ3VhZ2UgPT09ICdmcicpIHtcbiAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZUZyO1xuICAgIH0gZWxzZSBpZiAodGhpcy5icm93c2VyTGFuZ3VhZ2UgPT09ICdlbicpIHtcbiAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZUVuO1xuICAgIH1cblxuICAgIHJldHVybiB7IGluc3RydWN0aW9uOiBkaXJlY3RpdmUsIGltYWdlLCBjc3NDbGFzcyB9O1xuICB9XG5cbiAgdHJhbnNsYXRlTW9kaWZpZXIobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXIgPT09ICd1dHVybicpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnV0dXJuJyk7XG4gICAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3NoYXJwIHJpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zLnNoYXJwIHJpZ2h0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAncmlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5yaWdodCcpO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzbGlnaHQgcmlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuc2xpZ2h0IHJpZ2h0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgbGVmdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5zaGFycCBsZWZ0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnbGVmdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLmxlZnQnKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IGxlZnQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuc2xpZ2h0IGxlZnQnXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzdHJhaWdodCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5zdHJhaWdodCdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb2RpZmllcjtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVCZWFyaW5nKGJlYXJpbmcpIHtcbiAgICBpZiAoYmVhcmluZyA+PSAzMzcgfHwgYmVhcmluZyA8IDIzKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMubicpO1xuICAgIH0gZWxzZSBpZiAoYmVhcmluZyA8IDY3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLm5lJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAxMTMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5lJyk7XG4gICAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMTU3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLnNlJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAyMDMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5zJyk7XG4gICAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMjQ3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLnN3J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAyOTMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy53Jyk7XG4gICAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMzM3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLm53J1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdERpc3RhbmNlKGRpc3RhbmNlKSB7XG4gICAgaWYgKGRpc3RhbmNlID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkaXN0YW5jZSA+PSAxMDAwMDApIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGRpc3RhbmNlIC8gMTAwMCkgKyAnIGttJztcbiAgICB9XG4gICAgaWYgKGRpc3RhbmNlID49IDEwMDAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChkaXN0YW5jZSAvIDEwMCkgLyAxMCArICcga20nO1xuICAgIH1cbiAgICBpZiAoZGlzdGFuY2UgPj0gMTAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChkaXN0YW5jZSAvIDEwMCkgLyAxMCArICcga20nO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2UgKyAnIG0nO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlciwgc3VtbWFyeSA9IGZhbHNlKSB7XG4gICAgaWYgKGR1cmF0aW9uID49IDM2MDApIHtcbiAgICAgIGNvbnN0IGhvdXIgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gMzYwMCk7XG4gICAgICBjb25zdCBtaW51dGUgPSBNYXRoLnJvdW5kKChkdXJhdGlvbiAvIDM2MDAgLSBob3VyKSAqIDYwKTtcbiAgICAgIGlmIChtaW51dGUgPT09IDYwKSB7XG4gICAgICAgIHJldHVybiBob3VyICsgMSArICcgaCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gaG91ciArICcgaCAnICsgbWludXRlICsgJyBtaW4nO1xuICAgIH1cblxuICAgIGlmIChkdXJhdGlvbiA+PSA2MCkge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoZHVyYXRpb24gLyA2MCkgKyAnIG1pbic7XG4gICAgfVxuICAgIHJldHVybiBkdXJhdGlvbiArICcgcyc7XG4gIH1cblxuICBzaG93U2VnbWVudChzdGVwLCB6b29tVG9FeHRlbnQgPSBmYWxzZSkge1xuICAgIHRoaXMuc2hvd1JvdXRlU2VnbWVudEdlb21ldHJ5KHN0ZXAuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHpvb21Ub0V4dGVudCk7XG4gIH1cblxuICBzaG93Um91dGVTZWdtZW50R2VvbWV0cnkoY29vcmRpbmF0ZXMsIHpvb21Ub0V4dGVudCA9IGZhbHNlKSB7XG4gICAgY29uc3QgdmVydGV4SWQgPSAndmVydGV4JztcbiAgICBjb25zdCBnZW9tZXRyeTQzMjYgPSBuZXcgb2xnZW9tLkxpbmVTdHJpbmcoY29vcmRpbmF0ZXMpO1xuICAgIGNvbnN0IGdlb21ldHJ5TWFwUHJvamVjdGlvbiA9IGdlb21ldHJ5NDMyNi50cmFuc2Zvcm0oXG4gICAgICAnRVBTRzo0MzI2JyxcbiAgICAgIHRoaXMubWFwLnByb2plY3Rpb25cbiAgICApO1xuICAgIGNvbnN0IHJvdXRlU2VnbWVudENvb3JkaW5hdGVzID0gKGdlb21ldHJ5TWFwUHJvamVjdGlvbiBhcyBhbnkpLmdldENvb3JkaW5hdGVzKCk7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gcm91dGVTZWdtZW50Q29vcmRpbmF0ZXNbMF07XG5cbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBvbGdlb20uUG9pbnQobGFzdFBvaW50KTtcbiAgICBjb25zdCBmZWF0dXJlID0gbmV3IG9sRmVhdHVyZSh7IGdlb21ldHJ5IH0pO1xuXG4gICAgY29uc3QgZ2VvanNvbkdlb20gPSBuZXcgT2xHZW9KU09OKCkud3JpdGVHZW9tZXRyeU9iamVjdChnZW9tZXRyeSwge1xuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICBkYXRhUHJvamVjdGlvbjogdGhpcy5tYXAucHJvamVjdGlvblxuICAgIH0pIGFzIEZlYXR1cmVHZW9tZXRyeTtcblxuICAgIGNvbnN0IHByZXZpb3VzVmVydGV4ID0gdGhpcy5yb3V0ZVN0b3JlLmdldCh2ZXJ0ZXhJZCk7XG4gICAgY29uc3QgcHJldmlvdXNWZXJ0ZXhSZXZpc2lvbiA9IHByZXZpb3VzVmVydGV4XG4gICAgICA/IHByZXZpb3VzVmVydGV4Lm1ldGEucmV2aXNpb25cbiAgICAgIDogMDtcblxuICAgIGNvbnN0IHZlcnRleEZlYXR1cmU6IEZlYXR1cmUgPSB7XG4gICAgICB0eXBlOiBGRUFUVVJFLFxuICAgICAgZ2VvbWV0cnk6IGdlb2pzb25HZW9tLFxuICAgICAgcHJvamVjdGlvbjogdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaWQ6IHZlcnRleElkLFxuICAgICAgICB0eXBlOiAndmVydGV4J1xuICAgICAgfSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgaWQ6IHZlcnRleElkLFxuICAgICAgICByZXZpc2lvbjogcHJldmlvdXNWZXJ0ZXhSZXZpc2lvbiArIDFcbiAgICAgIH0sXG4gICAgICBvbDogZmVhdHVyZVxuICAgIH07XG4gICAgdGhpcy5yb3V0ZVN0b3JlLnVwZGF0ZSh2ZXJ0ZXhGZWF0dXJlKTtcbiAgICBpZiAoem9vbVRvRXh0ZW50KSB7XG4gICAgICB0aGlzLm1hcC52aWV3Q29udHJvbGxlci56b29tVG9FeHRlbnQoZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldEV4dGVudCgpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKTtcbiAgICB9XG4gIH1cblxuICB6b29tUm91dGUoZXh0ZW50Pykge1xuICAgIGlmIChleHRlbnQpIHtcbiAgICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLnpvb21Ub0V4dGVudChleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5yb3V0ZVN0b3JlLmxheWVyKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlRmVhdHVyZSA9IHRoaXMucm91dGVTdG9yZS5sYXllci5vbFxuICAgICAgICAgIC5nZXRTb3VyY2UoKVxuICAgICAgICAgIC5nZXRGZWF0dXJlcygpXG4gICAgICAgICAgLmZpbmQoZiA9PiBmLmdldElkKCkgPT09ICdyb3V0ZScpO1xuICAgICAgICBpZiAocm91dGVGZWF0dXJlKSB7XG4gICAgICAgICAgY29uc3Qgcm91dGVFeHRlbnQgPSByb3V0ZUZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRFeHRlbnQoKTtcbiAgICAgICAgICB0aGlzLm1hcC52aWV3Q29udHJvbGxlci56b29tVG9FeHRlbnQocm91dGVFeHRlbnQgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dSb3V0ZUdlb21ldHJ5KG1vdmVUb0V4dGVudCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2VvbSA9IHRoaXMuYWN0aXZlUm91dGUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgZ2VvbWV0cnk0MzI2ID0gbmV3IG9sZ2VvbS5MaW5lU3RyaW5nKGdlb20pO1xuICAgIGNvbnN0IGdlb21ldHJ5TWFwUHJvamVjdGlvbiA9IGdlb21ldHJ5NDMyNi50cmFuc2Zvcm0oXG4gICAgICAnRVBTRzo0MzI2JyxcbiAgICAgIHRoaXMubWFwLnByb2plY3Rpb25cbiAgICApO1xuICAgIGlmIChtb3ZlVG9FeHRlbnQpIHtcbiAgICAgIHRoaXMuem9vbVJvdXRlKGdlb21ldHJ5TWFwUHJvamVjdGlvbi5nZXRFeHRlbnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvanNvbkdlb20gPSBuZXcgT2xHZW9KU09OKCkud3JpdGVHZW9tZXRyeU9iamVjdChcbiAgICAgIGdlb21ldHJ5TWFwUHJvamVjdGlvbixcbiAgICAgIHtcbiAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICAgIGRhdGFQcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uXG4gICAgICB9XG4gICAgKSBhcyBGZWF0dXJlR2VvbWV0cnk7XG5cbiAgICBjb25zdCBwcmV2aW91c1JvdXRlID0gdGhpcy5yb3V0ZVN0b3JlLmdldCgncm91dGUnKTtcbiAgICBjb25zdCBwcmV2aW91c1JvdXRlUmV2aXNpb24gPSBwcmV2aW91c1JvdXRlXG4gICAgICA/IHByZXZpb3VzUm91dGUubWV0YS5yZXZpc2lvblxuICAgICAgOiAwO1xuXG4gICAgY29uc3Qgcm91dGVGZWF0dXJlOiBGZWF0dXJlID0ge1xuICAgICAgdHlwZTogRkVBVFVSRSxcbiAgICAgIGdlb21ldHJ5OiBnZW9qc29uR2VvbSxcbiAgICAgIHByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGlkOiAncm91dGUnLFxuICAgICAgICB0eXBlOiAncm91dGUnXG4gICAgICB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBpZDogJ3JvdXRlJyxcbiAgICAgICAgcmV2aXNpb246IHByZXZpb3VzUm91dGVSZXZpc2lvbiArIDFcbiAgICAgIH0sXG4gICAgICBvbDogbmV3IG9sRmVhdHVyZSh7IGdlb21ldHJ5OiBnZW9tZXRyeU1hcFByb2plY3Rpb24gfSlcbiAgICB9O1xuICAgIHRoaXMucm91dGVTdG9yZS51cGRhdGUocm91dGVGZWF0dXJlKTtcbiAgfVxuXG4gIGdldFJvdXRlcyhcbiAgICBtb3ZlVG9FeHRlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBkaXJlY3Rpb25zT3B0aW9uczogRGlyZWN0aW9uc09wdGlvbnMgPSB7fVxuICApIHtcbiAgICB0aGlzLmRlbGV0ZVN0b3JlRmVhdHVyZUJ5SUQodGhpcy5yb3V0ZVN0b3JlLCAndmVydGV4Jyk7XG4gICAgdGhpcy53cml0ZVN0b3BzVG9Gb3JtU2VydmljZSgpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZGlyZWN0aW9uc0Zvcm1TZXJ2aWNlLmdldFN0b3BzQ29vcmRpbmF0ZXMoKTtcbiAgICBpZiAoY29vcmRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm91dGVSZXNwb25zZSA9IHRoaXMuZGlyZWN0aW9uc1NlcnZpY2Uucm91dGUoXG4gICAgICBjb29yZHMsXG4gICAgICBkaXJlY3Rpb25zT3B0aW9uc1xuICAgICk7XG4gICAgaWYgKHJvdXRlUmVzcG9uc2UpIHtcbiAgICAgIHJvdXRlUmVzcG9uc2UubWFwKHJlcyA9PlxuICAgICAgICB0aGlzLnJvdXRlc1F1ZXJpZXMkJC5wdXNoKFxuICAgICAgICAgIHJlcy5zdWJzY3JpYmUocm91dGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXNSZXN1bHRzID0gcm91dGU7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVJvdXRlID0gdGhpcy5yb3V0ZXNSZXN1bHRzWzBdIGFzIERpcmVjdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnNob3dSb3V0ZUdlb21ldHJ5KG1vdmVUb0V4dGVudCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVubGlzdGVuU2luZ2xlQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNLZXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzS2V5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgb2xvYnNlcnZhYmxlLnVuQnlLZXkoa2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVSb3V0ZXNRdWVyaWVzKCkge1xuICAgIHRoaXMucm91dGVzUXVlcmllcyQkLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5yb3V0ZXNRdWVyaWVzJCQgPSBbXTtcbiAgfVxuXG4gIGNvcHlMaW5rVG9DbGlwYm9hcmQoKSB7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IENsaXBib2FyZC5jb3B5KHRoaXMuZ2V0VXJsKCkpO1xuICAgIGlmIChzdWNjZXNzZnVsKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5kaWFsb2cuY29weVRpdGxlJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG1zZyA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5kaWFsb2cuY29weU1zZ0xpbmsnXG4gICAgICApO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzKG1zZywgdGl0bGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlEaXJlY3Rpb25zVG9DbGlwYm9hcmQoKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uc0JvZHkgPSB0aGlzLmRpcmVjdGlvbnNUb1RleHQoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gQ2xpcGJvYXJkLmNvcHkoZGlyZWN0aW9uc0JvZHkpO1xuICAgIGlmIChzdWNjZXNzZnVsKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5kaWFsb2cuY29weVRpdGxlJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG1zZyA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmRpYWxvZy5jb3B5TXNnJyk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MobXNnLCB0aXRsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXJlY3Rpb25zVG9UZXh0KCkge1xuICAgIGNvbnN0IGluZGVudCA9ICdcXHQnO1xuICAgIGxldCBhY3RpdmVSb3V0ZURpcmVjdGl2ZSA9XG4gICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uaW5zdHJ1Y3Rpb25zJ1xuICAgICAgKSArICc6XFxuJztcbiAgICBsZXQgd2F5UG9pbnRMaXN0ID0gJyc7XG4gICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5zdW1tYXJ5JykgK1xuICAgICAgJzogXFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5hY3RpdmVSb3V0ZS50aXRsZSArXG4gICAgICAnXFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5mb3JtYXREaXN0YW5jZSh0aGlzLmFjdGl2ZVJvdXRlLmRpc3RhbmNlKSArXG4gICAgICAnXFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5mb3JtYXREdXJhdGlvbih0aGlzLmFjdGl2ZVJvdXRlLmR1cmF0aW9uKSArXG4gICAgICAnXFxuXFxuJyArXG4gICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uc3RvcHNMaXN0J1xuICAgICAgKSArXG4gICAgICAnOlxcbic7XG5cbiAgICBjb25zdCB1cmwgPVxuICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ubGluaycpICtcbiAgICAgICc6XFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5nZXRVcmwoKTtcblxuICAgIGxldCB3YXlQb2ludHNDbnQgPSAxO1xuICAgIHRoaXMuc3RvcHMudmFsdWUuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgIGxldCBjb29yZCA9ICcnO1xuICAgICAgbGV0IHN0b3BQb2ludCA9ICcnO1xuICAgICAgaWYgKHN0b3Auc3RvcFBvaW50ICE9PSBzdG9wLnN0b3BDb29yZGluYXRlcykge1xuICAgICAgICBzdG9wUG9pbnQgPSBzdG9wLnN0b3BQb2ludDtcbiAgICAgICAgY29vcmQgPVxuICAgICAgICAgICcgKCcgK1xuICAgICAgICAgIFtzdG9wLnN0b3BDb29yZGluYXRlc1sxXSwgc3RvcC5zdG9wQ29vcmRpbmF0ZXNbMF1dLmpvaW4oJywnKSArXG4gICAgICAgICAgJyknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RvcFBvaW50ID0gW3N0b3Auc3RvcENvb3JkaW5hdGVzWzFdLCBzdG9wLnN0b3BDb29yZGluYXRlc1swXV0uam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgd2F5UG9pbnRMaXN0ID1cbiAgICAgICAgd2F5UG9pbnRMaXN0ICtcbiAgICAgICAgaW5kZW50ICtcbiAgICAgICAgd2F5UG9pbnRzQ250LnRvTG9jYWxlU3RyaW5nKCkgK1xuICAgICAgICAnLiAnICtcbiAgICAgICAgc3RvcFBvaW50ICtcbiAgICAgICAgY29vcmQgK1xuICAgICAgICAnXFxuJztcbiAgICAgIHdheVBvaW50c0NudCsrO1xuICAgIH0pO1xuXG4gICAgLy8gRGlyZWN0aW9uc1xuICAgIGxldCBsb2NhbENudCA9IDA7XG4gICAgdGhpcy5hY3RpdmVSb3V0ZS5zdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB0aGlzLmZvcm1hdFN0ZXAoc3RlcCwgbG9jYWxDbnQpLmluc3RydWN0aW9uO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPVxuICAgICAgICB0aGlzLmZvcm1hdERpc3RhbmNlKHN0ZXAuZGlzdGFuY2UpID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnICgnICsgdGhpcy5mb3JtYXREaXN0YW5jZShzdGVwLmRpc3RhbmNlKSArICcpJztcbiAgICAgIGFjdGl2ZVJvdXRlRGlyZWN0aXZlID1cbiAgICAgICAgYWN0aXZlUm91dGVEaXJlY3RpdmUgK1xuICAgICAgICBpbmRlbnQgK1xuICAgICAgICAobG9jYWxDbnQgKyAxKS50b0xvY2FsZVN0cmluZygpICtcbiAgICAgICAgJy4gJyArXG4gICAgICAgIGluc3RydWN0aW9uICtcbiAgICAgICAgZGlzdGFuY2UgK1xuICAgICAgICAnXFxuJztcbiAgICAgIGxvY2FsQ250Kys7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaXJlY3Rpb25zQm9keSA9XG4gICAgICBzdW1tYXJ5ICsgd2F5UG9pbnRMaXN0ICsgJ1xcbicgKyB1cmwgKyAnXFxuXFxuJyArIGFjdGl2ZVJvdXRlRGlyZWN0aXZlO1xuXG4gICAgcmV0dXJuIGRpcmVjdGlvbnNCb2R5O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXJtQ2hhbmdlZCh0ZXJtOiBzdHJpbmcpIHtcbiAgICBpZiAodGVybSAhPT0gdW5kZWZpbmVkIHx8IHRlcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hQcm9wb3NhbHMgPSBbXTtcbiAgICAgIGlmICh0aGlzLnNlYXJjaCQkKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoJCQudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc2VhcmNoZXMgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoKHRlcm0sIHtzZWFyY2hUeXBlOiAnRmVhdHVyZSd9KTtcbiAgICAgIHJlc2VhcmNoZXMubWFwKHJlcyA9PlxuICAgICAgICB0aGlzLnNlYXJjaCQkID1cbiAgICAgICAgcmVzLnJlcXVlc3Quc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIHJlc3VsdHNcbiAgICAgICAgICAgIC5maWx0ZXIociA9PiByLmRhdGEuZ2VvbWV0cnkpXG4gICAgICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNlYXJjaFByb3Bvc2Fscy5maWx0ZXIociA9PiByLnNvdXJjZSA9PT0gZWxlbWVudC5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFByb3Bvc2Fscy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogZWxlbWVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICBtZXRhOiBlbGVtZW50Lm1ldGEsXG4gICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzLm1hcChyID0+IHIuZGF0YSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHNcbiAgICAgICAgICAgICAgLmF0KHRoaXMuY3VycmVudFN0b3BJbmRleClcbiAgICAgICAgICAgICAgLnBhdGNoVmFsdWUoeyBzdG9wUHJvcG9zYWxzOiBzZWFyY2hQcm9wb3NhbHMgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWZzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0VGVybSh0ZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgIGlmIChcbiAgICAgIHRoaXMua2V5SXNWYWxpZCh0ZXJtKSAmJlxuICAgICAgKHRlcm0ubGVuZ3RoID49IHRoaXMubGVuZ3RoIHx8IHRlcm0ubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgdGhpcy5zdHJlYW0kLm5leHQodGVybSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBrZXlJc1ZhbGlkKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZEtleXMuZmluZCh2YWx1ZSA9PiB2YWx1ZSA9PT0ga2V5KSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAga2V5dXAoaSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCB0ZXJtID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnNldFRlcm0odGVybSk7XG4gICAgdGhpcy5tYXAub2wudW4oJ3NpbmdsZWNsaWNrJywgZXZ0ID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlTWFwQ2xpY2soZXZ0LCBpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyU3RvcChzdG9wSW5kZXgpIHtcbiAgICAvLyB0aGlzLmRlbGV0ZURpcmVjdGlvbnNPdmVybGF5YnlJRCh0aGlzLmdldFN0b3BPdmVybGF5SUQoc3RvcEluZGV4KSk7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFN0b3BPdmVybGF5SUQoc3RvcEluZGV4KTtcbiAgICB0aGlzLmRlbGV0ZVN0b3JlRmVhdHVyZUJ5SUQodGhpcy5zdG9wc1N0b3JlLCBpZCk7XG4gICAgdGhpcy5yb3V0ZVN0b3JlLmNsZWFyKCk7XG4gICAgY29uc3Qgc3RvcHNDb3VudHMgPSB0aGlzLnN0b3BzLmxlbmd0aDtcbiAgICB0aGlzLnN0b3BzLnJlbW92ZUF0KHN0b3BJbmRleCk7XG4gICAgdGhpcy5zdG9wcy5pbnNlcnQoXG4gICAgICBzdG9wSW5kZXgsXG4gICAgICB0aGlzLmNyZWF0ZVN0b3AodGhpcy5kaXJlY3Rpb25zVGV4dChzdG9wSW5kZXgsIHN0b3BzQ291bnRzKSlcbiAgICApO1xuICAgIHRoaXMucm91dGVzUmVzdWx0cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmdldFJvdXRlcyhmYWxzZSk7XG4gIH1cblxuICBjaG9vc2VQcm9wb3NhbChwcm9wb3NhbCwgaSkge1xuICAgIGlmIChwcm9wb3NhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgZ2VvbUNvb3JkO1xuICAgICAgY29uc3QgZ2VvbSA9IChwcm9wb3NhbCBhcyBhbnkpLmdlb21ldHJ5O1xuICAgICAgaWYgKGdlb20udHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBnZW9tQ29vcmQgPSBnZW9tLmNvb3JkaW5hdGVzO1xuICAgICAgfSBlbHNlIGlmIChnZW9tLnR5cGUuc2VhcmNoKCdMaW5lJykgPj0gMCkge1xuICAgICAgICBjb25zdCBsaW5lID0gbmV3IE9sR2VvSlNPTigpLnJlYWRGZWF0dXJlcyhnZW9tKTtcbiAgICAgICAgZ2VvbUNvb3JkID0gbGluZVswXS5nZXRHZW9tZXRyeSgpLmdldEZpcnN0Q29vcmRpbmF0ZSgpO1xuICAgICAgICBnZW9tQ29vcmQgPSBbZ2VvbUNvb3JkWzBdLCBnZW9tQ29vcmRbMV1dO1xuICAgICAgfSBlbHNlIGlmIChnZW9tLnR5cGUuc2VhcmNoKCdQb2x5Z29uJykgPj0gMCkge1xuICAgICAgICBjb25zdCBwb2x5ID0gbmV3IE9sR2VvSlNPTigpLnJlYWRGZWF0dXJlcyhnZW9tKTtcbiAgICAgICAgZ2VvbUNvb3JkID0gcG9seVswXS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSA9PT0gJ1BvbHlnb24nID9cbiAgICAgICAgICBnZW9tQ29vcmQgPSAgcG9seVswXS5nZXRHZW9tZXRyeSgpLmdldEludGVyaW9yUG9pbnQoKS5nZXRGaXJzdENvb3JkaW5hdGUoKSA6XG4gICAgICAgICAgZ2VvbUNvb3JkID0gIHBvbHlbMF0uZ2V0R2VvbWV0cnkoKS5nZXRJbnRlcmlvclBvaW50cygpLmdldEZpcnN0Q29vcmRpbmF0ZSgpO1xuICAgICAgICBnZW9tQ29vcmQgPSBbZ2VvbUNvb3JkWzBdLCBnZW9tQ29vcmRbMV1dO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2VvbUNvb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zdG9wcy5hdChpKS5wYXRjaFZhbHVlKHsgc3RvcENvb3JkaW5hdGVzOiBnZW9tQ29vcmQgfSk7XG4gICAgICAgIHRoaXMuYWRkU3RvcE92ZXJsYXkoZ2VvbUNvb3JkLCBpKTtcbiAgICAgICAgLyogIGNvbnN0IHByb3Bvc2FsRXh0ZW50ID0gdGhpcy5kaXJlY3Rpb25zU3RvcHNPdmVybGF5RGF0YVNvdXJjZS5vbFxuICAgICAgICAgIC5nZXRGZWF0dXJlQnlJZCh0aGlzLmdldFN0b3BPdmVybGF5SUQoaSkpXG4gICAgICAgICAgLmdldEdlb21ldHJ5KClcbiAgICAgICAgICAuZ2V0RXh0ZW50KCk7Ki9cblxuICAgICAgICAvKiBpZiAoIW9sZXh0ZW50LmludGVyc2VjdHMocHJvcG9zYWxFeHRlbnQsIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpKSkge1xuICAgICAgICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLm1vdmVUb0V4dGVudChwcm9wb3NhbEV4dGVudCk7XG4gICAgICAgIH0qL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvY3VzKGkpIHtcbiAgICB0aGlzLnVubGlzdGVuU2luZ2xlQ2xpY2soKTtcbiAgICB0aGlzLmN1cnJlbnRTdG9wSW5kZXggPSBpO1xuICAgIHRoaXMuZm9jdXNPblN0b3AgPSB0cnVlO1xuICAgIHRoaXMuZm9jdXNLZXkucHVzaChcbiAgICAgIHRoaXMubWFwLm9sLm9uY2UoJ3NpbmdsZWNsaWNrJywgZXZ0ID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVNYXBDbGljayhldnQsIGkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNYXBDbGljayhldmVudCwgaW5kZXhQb3M/KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0b3BJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFN0b3AoKTtcbiAgICAgIGluZGV4UG9zID0gdGhpcy5zdG9wcy5sZW5ndGggLSAyO1xuICAgICAgdGhpcy5zdG9wcy5hdChpbmRleFBvcykudmFsdWUuc3RvcFByb3Bvc2FscyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleFBvcyA9IHRoaXMuY3VycmVudFN0b3BJbmRleDtcbiAgICB9XG4gICAgY29uc3QgY2xpY2tDb29yZGluYXRlcyA9IG9scHJvai50cmFuc2Zvcm0oXG4gICAgICBldmVudC5jb29yZGluYXRlLFxuICAgICAgdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgIHRoaXMucHJvamVjdGlvblxuICAgICk7XG4gICAgdGhpcy5zdG9wc1xuICAgICAgLmF0KGluZGV4UG9zKVxuICAgICAgLnBhdGNoVmFsdWUoeyBzdG9wUHJvcG9zYWxzOiBbXSwgc3RvcENvb3JkaW5hdGVzOiBjbGlja0Nvb3JkaW5hdGVzIH0pO1xuXG4gICAgdGhpcy5oYW5kbGVMb2NhdGlvblByb3Bvc2FscyhjbGlja0Nvb3JkaW5hdGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIGluZGV4UG9zKTtcbiAgICB0aGlzLmFkZFN0b3BPdmVybGF5KGNsaWNrQ29vcmRpbmF0ZXMgYXMgW251bWJlciwgbnVtYmVyXSwgaW5kZXhQb3MpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c09uU3RvcCA9IGZhbHNlOyAvLyBwcmV2ZW50IHRvIHRyaWdnZXIgbWFwIGNsaWNrIGFuZCBTZWxlY3Qgb24gcm91dGVzIGF0IHNhbWUgdGltZS5cbiAgICB9LCA1MDApO1xuICB9XG5cbiAgZ2VvbG9jYXRlU3RvcChpbmRleDogbnVtYmVyKSB7XG4gICAgbW92ZVRvT2xGZWF0dXJlcyhcbiAgICAgIHRoaXMubWFwLFxuICAgICAgW3RoaXMubWFwLmdlb2xvY2F0aW9uRmVhdHVyZV0sXG4gICAgICBGZWF0dXJlTW90aW9uLk1vdmVcbiAgICApO1xuICAgIGNvbnN0IGdlb2xvY2F0ZUNvb3JkaW5hdGVzID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKFxuICAgICAgdGhpcy5wcm9qZWN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnN0b3BzLmF0KGluZGV4KS5wYXRjaFZhbHVlKHsgc3RvcENvb3JkaW5hdGVzOiBnZW9sb2NhdGVDb29yZGluYXRlcyB9KTtcbiAgICB0aGlzLmFkZFN0b3BPdmVybGF5KGdlb2xvY2F0ZUNvb3JkaW5hdGVzLCBpbmRleCk7XG4gICAgdGhpcy5oYW5kbGVMb2NhdGlvblByb3Bvc2FscyhnZW9sb2NhdGVDb29yZGluYXRlcywgaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGFkZFN0b3BPdmVybGF5KGNvb3JkaW5hdGVzOiBbbnVtYmVyLCBudW1iZXJdLCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uc1RleHQgPSB0aGlzLmRpcmVjdGlvbnNUZXh0KGluZGV4KTtcbiAgICBsZXQgc3RvcENvbG9yO1xuICAgIGxldCBzdG9wVGV4dDtcbiAgICBpZiAoZGlyZWN0aW9uc1RleHQgPT09ICdzdGFydCcpIHtcbiAgICAgIHN0b3BDb2xvciA9ICcjMDA4MDAwJztcbiAgICAgIHN0b3BUZXh0ID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnN0YXJ0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbnNUZXh0ID09PSAnZW5kJykge1xuICAgICAgc3RvcENvbG9yID0gJyNmNjQxMzknO1xuICAgICAgc3RvcFRleHQgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uZW5kJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcENvbG9yID0gJyNmZmQ3MDAnO1xuICAgICAgc3RvcFRleHQgPVxuICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5pbnRlcm1lZGlhdGUnXG4gICAgICAgICkgK1xuICAgICAgICAnICMnICtcbiAgICAgICAgaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgb2xnZW9tLlBvaW50KFxuICAgICAgb2xwcm9qLnRyYW5zZm9ybShjb29yZGluYXRlcywgdGhpcy5wcm9qZWN0aW9uLCB0aGlzLm1hcC5wcm9qZWN0aW9uKVxuICAgICk7XG5cbiAgICBjb25zdCBzdG9wSUQgPSB0aGlzLmdldFN0b3BPdmVybGF5SUQoaW5kZXgpO1xuICAgIGNvbnN0IGdlb2pzb25HZW9tID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoZ2VvbWV0cnksIHtcbiAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uLFxuICAgICAgZGF0YVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb25cbiAgICB9KSBhcyBGZWF0dXJlR2VvbWV0cnk7XG5cbiAgICBjb25zdCBwcmV2aW91c1N0b3AgPSB0aGlzLnN0b3BzU3RvcmUuZ2V0KHN0b3BJRCk7XG4gICAgY29uc3QgcHJldmlvdXNTdG9wUmV2aXNpb24gPSBwcmV2aW91c1N0b3AgPyBwcmV2aW91c1N0b3AubWV0YS5yZXZpc2lvbiA6IDA7XG5cbiAgICBjb25zdCBzdG9wRmVhdHVyZTogRmVhdHVyZSA9IHtcbiAgICAgIHR5cGU6IEZFQVRVUkUsXG4gICAgICBnZW9tZXRyeTogZ2VvanNvbkdlb20sXG4gICAgICBwcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDogc3RvcElELFxuICAgICAgICB0eXBlOiAnc3RvcCcsXG4gICAgICAgIHN0b3BUZXh0LFxuICAgICAgICBzdG9wQ29sb3IsXG4gICAgICAgIHN0b3BPcGFjaXR5OiAxXG4gICAgICB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBpZDogc3RvcElELFxuICAgICAgICByZXZpc2lvbjogcHJldmlvdXNTdG9wUmV2aXNpb24gKyAxXG4gICAgICB9LFxuICAgICAgb2w6IG5ldyBvbEZlYXR1cmUoeyBnZW9tZXRyeSB9KVxuICAgIH07XG4gICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZShzdG9wRmVhdHVyZSk7XG4gICAgdGhpcy5nZXRSb3V0ZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9wT3ZlcmxheUlEKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCB0eHQ7XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0eHQgPSAnc3RhcnQnO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuc3RvcHMubGVuZ3RoIC0gMSkge1xuICAgICAgdHh0ID0gJ2VuZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4dCA9IGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gJ2RpcmVjdGlvbnNTdG9wXycgKyB0eHQ7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlU3RvcmVGZWF0dXJlQnlJRChzdG9yZSwgaWQpIHtcbiAgICBjb25zdCBlbnRpdHkgPSBzdG9yZS5nZXQoaWQpO1xuICAgIGlmIChlbnRpdHkpIHtcbiAgICAgIHN0b3JlLmRlbGV0ZShlbnRpdHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXJsKCkge1xuICAgIGlmICghdGhpcy5yb3V0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbnNLZXkgPSB0aGlzLnJvdXRlLm9wdGlvbnMuZGlyZWN0aW9uc0Nvb3JkS2V5O1xuICAgIGNvbnN0IHN0b3BzQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZSAmJlxuICAgICAgdGhpcy5kaXJlY3Rpb25zRm9ybVNlcnZpY2UuZ2V0U3RvcHNDb29yZGluYXRlcygpICYmXG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZS5nZXRTdG9wc0Nvb3JkaW5hdGVzKCkubGVuZ3RoICE9PSAwXG4gICAgKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZS5nZXRTdG9wc0Nvb3JkaW5hdGVzKCkuZm9yRWFjaChjb29yZCA9PiB7XG4gICAgICAgIHN0b3BzQ29vcmRpbmF0ZXMucHVzaChyb3VuZENvb3JkVG8oY29vcmQsIDYpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgZGlyZWN0aW9uc1VybCA9ICcnO1xuICAgIGlmIChzdG9wc0Nvb3JkaW5hdGVzLmxlbmd0aCA+PSAyKSB7XG4gICAgICBkaXJlY3Rpb25zVXJsID0gYCR7ZGlyZWN0aW9uc0tleX09JHtzdG9wc0Nvb3JkaW5hdGVzLmpvaW4oJzsnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtsb2NhdGlvbi5vcmlnaW59JHtsb2NhdGlvbi5wYXRobmFtZX0/dG9vbD1kaXJlY3Rpb25zJnNpZGVuYXY9MSYke2RpcmVjdGlvbnNVcmx9YDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIGZvciB0aGUgZGlyZWN0aW9ucyBzdG9wcyBhbmQgcm91dGVzXG4gKiBAcGFyYW0gZmVhdHVyZSBPbEZlYXR1cmVcbiAqIEByZXR1cm5zIE9MIHN0eWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9wTWFya2VyKFxuICBmZWF0dXJlOiBvbEZlYXR1cmU8T2xHZW9tZXRyeT4sXG4gIHJlc29sdXRpb246IG51bWJlclxuKTogb2xzdHlsZS5TdHlsZSB8IG9sc3R5bGUuU3R5bGVbXSB7XG4gIGNvbnN0IHZlcnRleFN0eWxlID0gW1xuICAgIG5ldyBvbHN0eWxlLlN0eWxlKHtcbiAgICAgIGdlb21ldHJ5OiBmZWF0dXJlLmdldEdlb21ldHJ5KCksXG4gICAgICBpbWFnZTogbmV3IG9sc3R5bGUuQ2lyY2xlKHtcbiAgICAgICAgcmFkaXVzOiA3LFxuICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7IGNvbG9yOiAnI0ZGMDAwMCcsIHdpZHRoOiAzIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIF07XG5cbiAgY29uc3Qgc3RvcFN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKHtcbiAgICB0ZXh0OiBmZWF0dXJlLmdldCgnc3RvcFRleHQnKSxcbiAgICBvcGFjaXR5OiBmZWF0dXJlLmdldCgnc3RvcE9wYWNpdHknKSxcbiAgICBtYXJrZXJDb2xvcjogZmVhdHVyZS5nZXQoJ3N0b3BDb2xvcicpLFxuICAgIG1hcmtlck91dGxpbmVDb2xvcjogWzI1NSwgMjU1LCAyNTVdfSk7XG5cbiAgY29uc3Qgcm91dGVTdHlsZSA9IFtcbiAgICBuZXcgb2xzdHlsZS5TdHlsZSh7XG4gICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7IGNvbG9yOiAncmdiYSgxMDYsIDEyMSwgMTMwLCAwLjc1KScsIHdpZHRoOiAxMCB9KVxuICAgIH0pLFxuICAgIG5ldyBvbHN0eWxlLlN0eWxlKHtcbiAgICAgIHN0cm9rZTogbmV3IG9sc3R5bGUuU3Ryb2tlKHsgY29sb3I6ICdyZ2JhKDc5LCAxNjksIDIyMSwgMC43NSknLCB3aWR0aDogNiB9KVxuICAgIH0pXG4gIF07XG5cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09ICdzdG9wJykge1xuICAgIHJldHVybiBzdG9wU3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09ICd2ZXJ0ZXgnKSB7XG4gICAgcmV0dXJuIHZlcnRleFN0eWxlO1xuICB9XG4gIGlmIChmZWF0dXJlLmdldCgndHlwZScpID09PSAncm91dGUnKSB7XG4gICAgcmV0dXJuIHJvdXRlU3R5bGU7XG4gIH1cbn1cbiIsIjxmb3JtIGNsYXNzPVwiaWdvLWZvcm1cIiBbZm9ybUdyb3VwXT1cInN0b3BzRm9ybVwiPlxyXG4gIDwhLS0gPGRpdiBjbGFzcz1cImlnby1mb3JtLWJ1dHRvbi1ncm91cFwiPlxyXG5cclxuICA8L2Rpdj4gLS0+XHJcbiAgPGRpdiAjaW5wdXRzIGZvcm1BcnJheU5hbWU9XCJzdG9wc1wiICpuZ0Zvcj1cImxldCBzdG9wIG9mIHN0b3BzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwibWFwLmdlb2xvY2F0aW9uRmVhdHVyZVwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uZ2VvbG9jYXRlJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJnZW9sb2NhdGVTdG9wKGkpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNyb3NzaGFpcnMtZ3BzXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwic3RvcFBvaW50XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLicrc3RvcC52YWx1ZS5kaXJlY3Rpb25zVGV4dCB8IHRyYW5zbGF0ZX19XCIgKGZvY3VzKT1cImZvY3VzKGkpXCJcclxuICAgICAgICAgICAgKGtleXVwKT1cImtleXVwKGksJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cInByZXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgIG1hdC1idXR0b24gXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzdG9wLnZhbHVlICYmIChzdG9wLnZhbHVlLnN0b3BQb2ludC5sZW5ndGggPiAwIHx8IHN0b3AudmFsdWUuc3RvcFByb3Bvc2Fscy5sZW5ndGggPiAwKVwiXHJcbiAgICAgICAgICAgICAgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBhcmlhLWxhYmVsPVwiQ2xlYXJcIiAoY2xpY2spPVwiY2xlYXJTdG9wKGkpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgKm5nRm9yPVwibGV0IHNvdXJjZSBvZiBzdG9wLnZhbHVlLnN0b3BQcm9wb3NhbHNcIiBbbGFiZWxdPVwic291cmNlLnNvdXJjZS50aXRsZVwiIFtkaXNhYmxlZF09XCJzb3VyY2Uuc291cmNlLmVuYWJsZWQgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHJlc3VsdCBvZiBzb3VyY2UucmVzdWx0c1wiIFt2YWx1ZV09XCJyZXN1bHQubWV0YSA/IHJlc3VsdC5tZXRhLnRpdGxlIDogJydcIiBcclxuICAgICAgICAgICAgICAob25TZWxlY3Rpb25DaGFuZ2UpPVwiY2hvb3NlUHJvcG9zYWwocmVzdWx0LGkpXCJcclxuICAgICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwicmVzdWx0Lm1ldGEgPyByZXN1bHQubWV0YS50aXRsZSA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZXN1bHQubWV0YSA/IHJlc3VsdC5tZXRhLnRpdGxlIDogJycgfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxyXG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImlnby1mb3JtLWJ1dHRvbi1ncm91cFwiPiAtLT5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ucmFpc2VTdG9wJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiIChjbGljayk9XCJyYWlzZVN0b3AoaSlcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhcnJvdy11cHdhcmRcIj48L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gc3RvcHMubGVuZ3RoIC0gMVwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ubG93ZXJTdG9wJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiIChjbGljayk9XCJsb3dlclN0b3AoaSlcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhcnJvdy1kb3dud2FyZFwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDAgJiYgaSAhPT0gc3RvcHMubGVuZ3RoIC0gMVwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ucmVtb3ZlU3RvcCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwicmVtb3ZlU3RvcChpKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9tYXQtbGlzdC1pdGVtPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5hZGRTdG9wJyB8IHRyYW5zbGF0ZVwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJhZGRTdG9wKClcIj5cclxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJtYXAtbWFya2VyLXBsdXNcIj48L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uem9vbVJvdXRlJyB8IHRyYW5zbGF0ZVwiICpuZ0lmPVwicm91dGVzUmVzdWx0c1wiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIChjbGljayk9XCJ6b29tUm91dGUoKVwiPlxyXG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm1hZ25pZnktcGx1cy1vdXRsaW5lXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnJlc2V0RGlyZWN0aW9uc0J0bicgfCB0cmFuc2xhdGVcIiAqbmdJZj1cInJvdXRlc1Jlc3VsdHNcIiBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAoY2xpY2spPVwicmVzZXRGb3JtKHRydWUpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZmlsZS1yZXN0b3JlXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJyb3V0ZXNSZXN1bHRzXCIgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmNvcHknIHwgdHJhbnNsYXRlXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNvcHlEaXJlY3Rpb25zVG9DbGlwYm9hcmQoKVwiPlxyXG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvbnRlbnQtY29weVwiPjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwicm91dGVzUmVzdWx0c1wiIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5saW5rJyB8IHRyYW5zbGF0ZVwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjb3B5TGlua1RvQ2xpcGJvYXJkKClcIj5cclxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJsaW5rXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuPC9mb3JtPlxyXG5cclxuPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cInJvdXRlc1Jlc3VsdHNcIj5cclxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJyb3V0ZXNSZXN1bHRzICYmIHJvdXRlc1Jlc3VsdHMubGVuZ3RoID4gMVwiPlxyXG4gICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7eydpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmRyaXZpbmdPcHRpb25zJyB8IHRyYW5zbGF0ZX19XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VSb3V0ZSgpXCIgWyhuZ01vZGVsKV09XCJhY3RpdmVSb3V0ZVwiPlxyXG4gICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgcGF0aERpcmVjdGlvbnMgb2Ygcm91dGVzUmVzdWx0czsgbGV0IGNudCA9IGluZGV4O1wiIFt2YWx1ZV09XCJwYXRoRGlyZWN0aW9uc1wiPlxyXG4gICAgICAgIE9wdGlvbiB7e2NudCArIDF9fSA6IHt7Zm9ybWF0RGlzdGFuY2UocGF0aERpcmVjdGlvbnMuZGlzdGFuY2UpfX0gKHt7Zm9ybWF0RHVyYXRpb24ocGF0aERpcmVjdGlvbnMuZHVyYXRpb24pfX0pXHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbWF0LXNlbGVjdD5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJyb3V0ZXNSZXN1bHRzICYmIHJvdXRlc1Jlc3VsdHMubGVuZ3RoID09PSAwXCI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgPG1hdC1saXN0PlxyXG4gICAgPGgyIG1hdC1oZWFkZXIgY2xhc3M9XCJpZ28tcm91dGUtdGl0bGUgbWF0LXR5cG9ncmFwaHlcIj57e2FjdGl2ZVJvdXRlLnRpdGxlfX08L2gyPlxyXG4gICAgPGgyIG1hdC1zdWJoZWFkZXI+e3tmb3JtYXREaXN0YW5jZShhY3RpdmVSb3V0ZS5kaXN0YW5jZSl9fSwge3tmb3JtYXREdXJhdGlvbihhY3RpdmVSb3V0ZS5kdXJhdGlvbil9fTwvaDI+XHJcblxyXG4gICAgPG1hdC1saXN0LWl0ZW0gXHJcbiAgICBjbGFzcz1cImlnby1zdGVwc1wiXHJcbiAgICAobW91c2VlbnRlcik9XCJzaG93U2VnbWVudChzdGVwKVwiIFxyXG4gICAgKGNsaWNrKT1cInNob3dTZWdtZW50KHN0ZXAsdHJ1ZSlcIiBcclxuICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIGFjdGl2ZVJvdXRlLnN0ZXBzOyBsZXQgY250ID0gaW5kZXg7XCJcclxuICAgICAgaWdvTGlzdEl0ZW0+XHJcbiAgICAgIDxtYXQtaWNvbiBbbmdDbGFzc109XCJmb3JtYXRTdGVwKHN0ZXAsY250KS5jc3NDbGFzc1wiIG1hdC1saXN0LWljb24gc3ZnSWNvbj1cInt7Zm9ybWF0U3RlcChzdGVwLGNudCkuaW1hZ2V9fVwiPjwvbWF0LWljb24+XHJcblxyXG4gICAgICA8aDQgbWF0LWxpbmU+e3tjbnQgKzF9fS4ge3tmb3JtYXRTdGVwKHN0ZXAsY250KS5pbnN0cnVjdGlvbn19PC9oND5cclxuICAgICAgPGg0IG1hdC1saW5lIGNsYXNzPVwicmlnaHRcIj57e2Zvcm1hdERpc3RhbmNlKHN0ZXAuZGlzdGFuY2UpfX08L2g0PlxyXG4gICAgPC9tYXQtbGlzdC1pdGVtPlxyXG5cclxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG5cclxuICA8L21hdC1saXN0PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==