geonetwork-ui 2.4.0-dev.e97caaf2 → 2.4.0-dev.f5019723

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 (671) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +4 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/common/license.mjs +64 -0
  3. package/esm2022/libs/api/metadata-converter/src/lib/common/url.mjs +14 -0
  4. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.mjs +254 -0
  5. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/index.mjs +2 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/namespaces.mjs +17 -0
  7. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.mjs +196 -0
  8. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.mjs +46 -0
  9. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.mjs +74 -0
  10. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/utils/uri.mjs +2 -0
  11. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.mjs +27 -0
  12. package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +11 -1
  13. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +10 -3
  14. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +6 -6
  15. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +7 -4
  16. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +17 -29
  17. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +8 -15
  18. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +6 -6
  19. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +54 -54
  20. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +35 -3
  21. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +78 -39
  22. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +41 -7
  23. package/esm2022/libs/common/domain/src/lib/model/record/contact.model.mjs +1 -1
  24. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  25. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  26. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  27. package/esm2022/libs/data-access/gn4/src/fixtures/site.fixtures.mjs +5 -5
  28. package/esm2022/libs/data-access/gn4/src/fixtures/ui.fixtures.mjs +3 -3
  29. package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +7 -4
  30. package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +6 -6
  31. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
  32. package/esm2022/libs/feature/dataviz/src/lib/feature-dataviz.module.mjs +10 -7
  33. package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +40 -50
  34. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +1 -1
  35. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +1 -1
  36. package/esm2022/libs/feature/editor/src/index.mjs +2 -1
  37. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +5 -5
  38. package/esm2022/libs/feature/editor/src/lib/components/contact-card/contact-card.component.mjs +4 -16
  39. package/esm2022/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.mjs +4 -2
  40. package/esm2022/libs/feature/editor/src/lib/components/import-record/import-record.component.mjs +95 -0
  41. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +71 -0
  42. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.mjs +109 -0
  43. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.mjs +15 -32
  44. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date-updated/form-field-date-updated.component.mjs +19 -0
  45. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +23 -10
  46. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +3 -3
  47. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +38 -60
  48. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.mjs +148 -0
  49. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +86 -11
  50. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +4 -8
  51. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +36 -7
  52. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.mjs +35 -59
  53. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +4 -4
  54. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +14 -5
  55. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +2 -2
  56. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +3 -3
  57. package/esm2022/libs/feature/editor/src/lib/components/wizard/wizard.component.mjs +3 -3
  58. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +41 -7
  59. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +1 -1
  60. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +5 -5
  61. package/esm2022/libs/feature/map/src/index.mjs +2 -9
  62. package/esm2022/libs/feature/map/src/lib/+state/map.actions.mjs +4 -7
  63. package/esm2022/libs/feature/map/src/lib/+state/map.facade.mjs +9 -15
  64. package/esm2022/libs/feature/map/src/lib/+state/map.reducer.mjs +13 -44
  65. package/esm2022/libs/feature/map/src/lib/+state/map.selectors.mjs +3 -2
  66. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +16 -16
  67. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +16 -10
  68. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +10 -8
  69. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +11 -7
  70. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +10 -6
  71. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +1 -2
  72. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +4 -44
  73. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +43 -29
  74. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +17 -8
  75. package/esm2022/libs/feature/map/src/lib/map-state-container/map-state-container.component.mjs +27 -0
  76. package/esm2022/libs/feature/map/src/lib/style/map-style.fixtures.mjs +3 -3
  77. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +4 -168
  78. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  79. package/esm2022/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.mjs +21 -17
  80. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +14 -8
  81. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +40 -52
  82. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -2
  83. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +1 -1
  84. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +3 -3
  85. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +12 -6
  86. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +7 -7
  87. package/esm2022/libs/ui/catalog/src/lib/ui-catalog.module.mjs +1 -6
  88. package/esm2022/libs/ui/dataviz/src/lib/table/table.fixtures.mjs +3 -3
  89. package/esm2022/libs/ui/elements/src/index.mjs +2 -2
  90. package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +2 -2
  91. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +1 -1
  92. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +2 -2
  93. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +6 -6
  94. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  95. package/esm2022/libs/ui/inputs/src/index.mjs +5 -1
  96. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +7 -4
  97. package/esm2022/libs/ui/inputs/src/lib/badge/badge.component.mjs +5 -3
  98. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +8 -1
  99. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +11 -4
  100. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +9 -3
  101. package/esm2022/libs/ui/inputs/src/lib/file-input/file-input.component.mjs +87 -0
  102. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +5 -4
  103. package/esm2022/libs/ui/inputs/src/lib/search-input/search-input.component.mjs +6 -4
  104. package/esm2022/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.mjs +4 -4
  105. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +4 -3
  106. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +2 -7
  107. package/esm2022/libs/ui/inputs/src/lib/url-input/url-input.component.mjs +3 -3
  108. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  109. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +5 -3
  110. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  111. package/esm2022/libs/ui/layout/src/lib/modal-dialog/modal-dialog.component.mjs +29 -0
  112. package/esm2022/libs/ui/layout/src/lib/sortable-list/sortable-list.component.mjs +43 -0
  113. package/esm2022/libs/ui/map/src/index.mjs +4 -3
  114. package/esm2022/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.mjs +8 -6
  115. package/esm2022/libs/ui/map/src/lib/components/map-container/map-container.component.mjs +137 -0
  116. package/esm2022/libs/ui/map/src/lib/components/map-container/map-settings.token.mjs +13 -0
  117. package/esm2022/libs/ui/map/src/lib/map-utils.mjs +37 -0
  118. package/esm2022/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.mjs +7 -7
  119. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +8 -8
  120. package/esm2022/libs/util/app-config/src/index.mjs +2 -1
  121. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +10 -10
  122. package/esm2022/libs/util/app-config/src/lib/map-layers.mjs +27 -0
  123. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +1 -1
  124. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +1 -1
  125. package/esm2022/libs/util/shared/src/lib/services/theme.service.mjs +2 -1
  126. package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -1
  127. package/esm2022/translations/de.json +28 -2
  128. package/esm2022/translations/en.json +59 -33
  129. package/esm2022/translations/es.json +26 -0
  130. package/esm2022/translations/fr.json +90 -64
  131. package/esm2022/translations/it.json +28 -2
  132. package/esm2022/translations/nl.json +26 -0
  133. package/esm2022/translations/pt.json +26 -0
  134. package/fesm2022/geonetwork-ui.mjs +9462 -8515
  135. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  136. package/libs/api/metadata-converter/src/index.d.ts +3 -0
  137. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  138. package/libs/api/metadata-converter/src/lib/common/license.d.ts +3 -0
  139. package/libs/api/metadata-converter/src/lib/common/license.d.ts.map +1 -0
  140. package/libs/api/metadata-converter/src/lib/common/url.d.ts +7 -0
  141. package/libs/api/metadata-converter/src/lib/common/url.d.ts.map +1 -0
  142. package/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.d.ts +13 -0
  143. package/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.d.ts.map +1 -0
  144. package/libs/api/metadata-converter/src/lib/dcat-ap/index.d.ts +2 -0
  145. package/libs/api/metadata-converter/src/lib/dcat-ap/index.d.ts.map +1 -0
  146. package/libs/api/metadata-converter/src/lib/dcat-ap/namespaces.d.ts +16 -0
  147. package/libs/api/metadata-converter/src/lib/dcat-ap/namespaces.d.ts.map +1 -0
  148. package/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.d.ts +20 -0
  149. package/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.d.ts.map +1 -0
  150. package/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.d.ts +9 -0
  151. package/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.d.ts.map +1 -0
  152. package/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.d.ts +8 -0
  153. package/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.d.ts.map +1 -0
  154. package/libs/api/metadata-converter/src/lib/dcat-ap/utils/uri.d.ts +2 -0
  155. package/libs/api/metadata-converter/src/lib/dcat-ap/utils/uri.d.ts.map +1 -0
  156. package/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.d.ts +6 -0
  157. package/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.d.ts.map +1 -0
  158. package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -1
  159. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +3 -3
  160. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  161. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -1
  162. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +2 -2
  163. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  164. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +1 -2
  165. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  166. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  167. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +4 -5
  168. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  169. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +10 -11
  170. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  171. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +58 -0
  172. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  173. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +12 -7
  174. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  175. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +21 -2
  176. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  177. package/libs/common/domain/src/lib/model/record/contact.model.d.ts +1 -1
  178. package/libs/common/domain/src/lib/model/record/contact.model.d.ts.map +1 -1
  179. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -6
  180. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  181. package/libs/common/domain/src/lib/platform.service.interface.d.ts +15 -0
  182. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  183. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +7 -0
  184. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  185. package/libs/data-access/gn4/src/fixtures/site.fixtures.d.ts +2 -2
  186. package/libs/data-access/gn4/src/fixtures/site.fixtures.d.ts.map +1 -1
  187. package/libs/data-access/gn4/src/fixtures/ui.fixtures.d.ts +1 -1
  188. package/libs/data-access/gn4/src/fixtures/ui.fixtures.d.ts.map +1 -1
  189. package/libs/feature/catalog/src/lib/feature-catalog.module.d.ts +2 -1
  190. package/libs/feature/catalog/src/lib/feature-catalog.module.d.ts.map +1 -1
  191. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts +2 -2
  192. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  193. package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts +10 -9
  194. package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts.map +1 -1
  195. package/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.d.ts +13 -20
  196. package/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.d.ts.map +1 -1
  197. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +6 -6
  198. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  199. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +3 -3
  200. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  201. package/libs/feature/editor/src/index.d.ts +1 -0
  202. package/libs/feature/editor/src/index.d.ts.map +1 -1
  203. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -1
  204. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts +1 -5
  205. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts.map +1 -1
  206. package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts +2 -1
  207. package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts.map +1 -1
  208. package/libs/feature/editor/src/lib/components/import-record/import-record.component.d.ts +34 -0
  209. package/libs/feature/editor/src/lib/components/import-record/import-record.component.d.ts.map +1 -0
  210. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts +15 -0
  211. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -0
  212. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.d.ts +38 -0
  213. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.d.ts.map +1 -0
  214. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts +2 -5
  215. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts.map +1 -1
  216. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date-updated/form-field-date-updated.component.d.ts +9 -0
  217. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-date-updated/form-field-date-updated.component.d.ts.map +1 -0
  218. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts +5 -2
  219. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  220. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +6 -13
  221. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts.map +1 -1
  222. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.d.ts +35 -0
  223. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.d.ts.map +1 -0
  224. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +20 -2
  225. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -1
  226. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts +1 -3
  227. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts.map +1 -1
  228. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +7 -2
  229. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  230. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts +9 -15
  231. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts.map +1 -1
  232. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +5 -3
  233. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  234. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +1 -1
  235. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  236. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +3 -2
  237. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  238. package/libs/feature/editor/src/lib/fields.config.d.ts +10 -1
  239. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  240. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +6 -0
  241. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -1
  242. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  243. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  244. package/libs/feature/map/src/index.d.ts +1 -8
  245. package/libs/feature/map/src/index.d.ts.map +1 -1
  246. package/libs/feature/map/src/lib/+state/map.actions.d.ts +13 -39
  247. package/libs/feature/map/src/lib/+state/map.actions.d.ts.map +1 -1
  248. package/libs/feature/map/src/lib/+state/map.facade.d.ts +9 -10
  249. package/libs/feature/map/src/lib/+state/map.facade.d.ts.map +1 -1
  250. package/libs/feature/map/src/lib/+state/map.reducer.d.ts +4 -2
  251. package/libs/feature/map/src/lib/+state/map.reducer.d.ts.map +1 -1
  252. package/libs/feature/map/src/lib/+state/map.selectors.d.ts +6 -1
  253. package/libs/feature/map/src/lib/+state/map.selectors.d.ts.map +1 -1
  254. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts +7 -9
  255. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  256. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -1
  257. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +2 -2
  258. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  259. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +1 -1
  260. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -1
  261. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +1 -1
  262. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -1
  263. package/libs/feature/map/src/lib/constant/index.d.ts +0 -1
  264. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  265. package/libs/feature/map/src/lib/feature-map.module.d.ts +12 -18
  266. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  267. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +7 -7
  268. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -1
  269. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +4 -3
  270. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  271. package/libs/feature/map/src/lib/map-state-container/map-state-container.component.d.ts +14 -0
  272. package/libs/feature/map/src/lib/map-state-container/map-state-container.component.d.ts.map +1 -0
  273. package/libs/feature/map/src/lib/style/map-style.fixtures.d.ts +2 -2
  274. package/libs/feature/map/src/lib/style/map-style.fixtures.d.ts.map +1 -1
  275. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +0 -30
  276. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  277. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +3 -3
  278. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  279. package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts +10 -7
  280. package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts.map +1 -1
  281. package/libs/feature/record/src/lib/feature-record.module.d.ts +13 -11
  282. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  283. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +14 -20
  284. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  285. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  286. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  287. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +5 -3
  288. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  289. package/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.d.ts +1 -1
  290. package/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.d.ts.map +1 -1
  291. package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts +9 -10
  292. package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts.map +1 -1
  293. package/libs/ui/dataviz/src/lib/table/table.fixtures.d.ts +2 -2
  294. package/libs/ui/dataviz/src/lib/table/table.fixtures.d.ts.map +1 -1
  295. package/libs/ui/elements/src/index.d.ts +1 -1
  296. package/libs/ui/elements/src/index.d.ts.map +1 -1
  297. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +2 -2
  298. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
  299. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +7 -7
  300. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts.map +1 -1
  301. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +2 -2
  302. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  303. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts +2 -2
  304. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts.map +1 -1
  305. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  306. package/libs/ui/inputs/src/index.d.ts +4 -0
  307. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  308. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
  309. package/libs/ui/inputs/src/lib/badge/badge.component.d.ts.map +1 -1
  310. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  311. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  312. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -1
  313. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  314. package/libs/ui/inputs/src/lib/file-input/file-input.component.d.ts +24 -0
  315. package/libs/ui/inputs/src/lib/file-input/file-input.component.d.ts.map +1 -0
  316. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +1 -1
  317. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
  318. package/libs/ui/inputs/src/lib/search-input/search-input.component.d.ts +1 -1
  319. package/libs/ui/inputs/src/lib/search-input/search-input.component.d.ts.map +1 -1
  320. package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts +0 -1
  321. package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts.map +1 -1
  322. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  323. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +25 -26
  324. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  325. package/libs/ui/layout/src/index.d.ts +2 -0
  326. package/libs/ui/layout/src/index.d.ts.map +1 -1
  327. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts +2 -2
  328. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts.map +1 -1
  329. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +1 -1
  330. package/libs/ui/layout/src/lib/modal-dialog/modal-dialog.component.d.ts +20 -0
  331. package/libs/ui/layout/src/lib/modal-dialog/modal-dialog.component.d.ts.map +1 -0
  332. package/libs/ui/layout/src/lib/sortable-list/sortable-list.component.d.ts +14 -0
  333. package/libs/ui/layout/src/lib/sortable-list/sortable-list.component.d.ts.map +1 -0
  334. package/libs/ui/map/src/index.d.ts +3 -2
  335. package/libs/ui/map/src/index.d.ts.map +1 -1
  336. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts +3 -4
  337. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts.map +1 -1
  338. package/libs/ui/map/src/lib/components/map-container/map-container.component.d.ts +37 -0
  339. package/libs/ui/map/src/lib/components/map-container/map-container.component.d.ts.map +1 -0
  340. package/libs/ui/map/src/lib/components/map-container/map-settings.token.d.ts +18 -0
  341. package/libs/ui/map/src/lib/components/map-container/map-settings.token.d.ts.map +1 -0
  342. package/libs/ui/map/src/lib/map-utils.d.ts +7 -0
  343. package/libs/ui/map/src/lib/map-utils.d.ts.map +1 -0
  344. package/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.d.ts +3 -3
  345. package/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.d.ts.map +1 -1
  346. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +3 -3
  347. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  348. package/libs/util/app-config/src/index.d.ts +1 -0
  349. package/libs/util/app-config/src/index.d.ts.map +1 -1
  350. package/libs/util/app-config/src/lib/fixtures.d.ts +8 -8
  351. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  352. package/libs/util/app-config/src/lib/map-layers.d.ts +4 -0
  353. package/libs/util/app-config/src/lib/map-layers.d.ts.map +1 -0
  354. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  355. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  356. package/libs/util/shared/src/lib/links/link-utils.d.ts +6 -6
  357. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  358. package/libs/util/shared/src/lib/services/theme.service.d.ts.map +1 -1
  359. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -1
  360. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -1
  361. package/package.json +5 -3
  362. package/src/libs/api/metadata-converter/src/index.ts +3 -0
  363. package/src/libs/api/metadata-converter/src/lib/common/license.ts +66 -0
  364. package/src/libs/api/metadata-converter/src/lib/common/url.ts +15 -0
  365. package/src/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.ts +378 -0
  366. package/src/libs/api/metadata-converter/src/lib/dcat-ap/index.ts +1 -0
  367. package/src/libs/api/metadata-converter/src/lib/dcat-ap/namespaces.ts +17 -0
  368. package/src/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.ts +370 -0
  369. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/graph-utils.ts +95 -0
  370. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/individual-name.ts +20 -0
  371. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/keyword.mapper.ts +16 -0
  372. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/role.mapper.ts +48 -0
  373. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/serialize-to-xml.ts +97 -0
  374. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/status.mapper.ts +19 -0
  375. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/update-frequency.mapper.ts +67 -0
  376. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/uri.ts +1 -0
  377. package/src/libs/api/metadata-converter/src/lib/dcat-ap/write-parts.ts +68 -0
  378. package/src/libs/api/metadata-converter/src/lib/find-converter.ts +13 -0
  379. package/src/libs/api/metadata-converter/src/lib/fixtures/eu.dcat-ap.records.ts +272 -0
  380. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +1 -1
  381. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +1 -1
  382. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  383. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +1 -1
  384. package/src/libs/api/metadata-converter/src/lib/fixtures/opendataswiss.records.ts +110 -0
  385. package/src/libs/api/metadata-converter/src/lib/fixtures/sextant.records.ts +85 -0
  386. package/src/libs/api/metadata-converter/src/lib/fixtures/vlaanderen.dcat-ap.records.ts +73 -0
  387. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +18 -16
  388. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +5 -6
  389. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +12 -4
  390. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +21 -43
  391. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +5 -14
  392. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +13 -15
  393. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +133 -156
  394. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +37 -2
  395. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +132 -68
  396. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -3
  397. package/src/libs/common/domain/src/lib/model/record/contact.model.ts +1 -1
  398. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +7 -7
  399. package/src/libs/common/domain/src/lib/platform.service.interface.ts +26 -0
  400. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +10 -0
  401. package/src/libs/common/fixtures/src/index.ts +4 -1
  402. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +37 -37
  403. package/src/libs/common/fixtures/src/lib/elasticsearch/{aggregations-request.ts → aggregations-request.fixtures.ts} +1 -3
  404. package/src/libs/common/fixtures/src/lib/elasticsearch/{aggregations-response.ts → aggregations-response.fixtures.ts} +6 -8
  405. package/src/libs/common/fixtures/src/lib/elasticsearch/{full-response.ts → full-response.fixtures.ts} +1 -3
  406. package/src/libs/common/fixtures/src/lib/elasticsearch/index.ts +5 -5
  407. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +1 -3
  408. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata.fixtures.ts +1739 -1742
  409. package/src/libs/common/fixtures/src/lib/elasticsearch/{search-requests.ts → search-requests.fixtures.ts} +1 -3
  410. package/src/libs/common/fixtures/src/lib/elasticsearch/{search-responses.ts → search-responses.fixtures.ts} +4 -6
  411. package/src/libs/common/fixtures/src/lib/geojson.fixtures.ts +57178 -57195
  412. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +2 -4
  413. package/src/libs/common/fixtures/src/lib/individual.fixtures.ts +61 -0
  414. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +233 -164
  415. package/src/libs/common/fixtures/src/lib/map/index.ts +1 -0
  416. package/src/libs/common/fixtures/src/lib/map/map-context.fixtures.ts +53 -0
  417. package/src/libs/common/fixtures/src/lib/ol-feature.fixtures.ts +10 -0
  418. package/src/libs/common/fixtures/src/lib/organisations.fixture.ts +35 -11
  419. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +9 -7
  420. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +9 -9
  421. package/src/libs/common/fixtures/src/lib/repository.fixtures.ts +4 -4
  422. package/src/libs/common/fixtures/src/lib/search/aggregations.ts +2 -3
  423. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +14 -15
  424. package/src/libs/common/fixtures/src/lib/user.fixtures.ts +45 -15
  425. package/src/libs/data-access/gn4/src/fixtures/site.fixtures.ts +4 -4
  426. package/src/libs/data-access/gn4/src/fixtures/ui.fixtures.ts +2 -2
  427. package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +5 -1
  428. package/src/libs/feature/catalog/src/lib/sources/sources.fixture.ts +1 -1
  429. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +3 -3
  430. package/src/libs/feature/dataviz/src/lib/feature-dataviz.module.ts +6 -2
  431. package/src/libs/feature/dataviz/src/lib/figure/figure.fixtures.ts +2 -2
  432. package/src/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.html +5 -2
  433. package/src/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.ts +38 -78
  434. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +6 -6
  435. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +4 -4
  436. package/src/libs/feature/editor/src/index.ts +1 -0
  437. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +11 -4
  438. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.html +12 -24
  439. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.ts +1 -13
  440. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.ts +1 -0
  441. package/src/libs/feature/editor/src/lib/components/import-record/import-record.component.html +47 -0
  442. package/src/libs/feature/editor/src/lib/components/import-record/import-record.component.ts +132 -0
  443. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.html +35 -0
  444. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +79 -0
  445. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.html +40 -0
  446. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.ts +170 -0
  447. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.css +4 -0
  448. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.html +13 -23
  449. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.ts +11 -50
  450. package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-resource-updated/form-field-resource-updated.component.ts → form-field-date-updated/form-field-date-updated.component.ts} +4 -4
  451. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +3 -2
  452. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +35 -3
  453. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +8 -0
  454. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +1 -4
  455. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.ts +41 -83
  456. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.html +34 -0
  457. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.ts +182 -0
  458. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +11 -5
  459. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +93 -4
  460. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +13 -6
  461. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +0 -9
  462. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +7 -2
  463. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +62 -6
  464. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.css +4 -0
  465. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.html +23 -3
  466. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.ts +37 -69
  467. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +4 -0
  468. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +16 -14
  469. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +1 -1
  470. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +34 -20
  471. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +12 -3
  472. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +1 -1
  473. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +31 -29
  474. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +2 -1
  475. package/src/libs/feature/editor/src/lib/components/wizard/wizard.component.html +2 -6
  476. package/src/libs/feature/editor/src/lib/fields.config.ts +45 -6
  477. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +12 -0
  478. package/src/libs/feature/editor/src/lib/services/editor.service.ts +7 -3
  479. package/src/libs/feature/map/src/index.ts +1 -8
  480. package/src/libs/feature/map/src/lib/+state/map.actions.ts +10 -25
  481. package/src/libs/feature/map/src/lib/+state/map.facade.ts +11 -15
  482. package/src/libs/feature/map/src/lib/+state/map.reducer.ts +16 -53
  483. package/src/libs/feature/map/src/lib/+state/map.selectors.ts +7 -2
  484. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +18 -21
  485. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +17 -11
  486. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +11 -12
  487. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +12 -10
  488. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +11 -9
  489. package/src/libs/feature/map/src/lib/constant/index.ts +0 -1
  490. package/src/libs/feature/map/src/lib/feature-map.module.ts +0 -26
  491. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +38 -20
  492. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +2 -2
  493. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +15 -5
  494. package/src/libs/feature/map/src/lib/map-state-container/map-state-container.component.html +4 -0
  495. package/src/libs/feature/map/src/lib/map-state-container/map-state-container.component.ts +29 -0
  496. package/src/libs/feature/map/src/lib/style/map-style.fixtures.ts +29 -27
  497. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +1 -229
  498. package/src/libs/feature/record/src/lib/data-view/data-view.component.ts +3 -3
  499. package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +29 -20
  500. package/src/libs/feature/record/src/lib/feature-record.module.ts +11 -3
  501. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +4 -4
  502. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +45 -72
  503. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +5 -1
  504. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +1 -1
  505. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -0
  506. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +5 -1
  507. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +14 -3
  508. package/src/libs/feature/search/src/lib/state/fixtures/search-state.fixtures.ts +2 -2
  509. package/src/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.ts +8 -1
  510. package/src/libs/ui/catalog/src/lib/ui-catalog.module.ts +0 -3
  511. package/src/libs/ui/dataviz/src/lib/chart/chart.fixtures.ts +2 -2
  512. package/src/libs/ui/dataviz/src/lib/table/table.fixtures.ts +2 -2
  513. package/src/libs/ui/elements/src/index.ts +1 -1
  514. package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +4 -4
  515. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +7 -7
  516. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +3 -3
  517. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +13 -20
  518. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +1 -1
  519. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +5 -0
  520. package/src/libs/ui/inputs/src/index.ts +4 -0
  521. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.css +25 -18
  522. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +38 -24
  523. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +4 -1
  524. package/src/libs/ui/inputs/src/lib/badge/badge.component.html +11 -3
  525. package/src/libs/ui/inputs/src/lib/badge/badge.component.ts +2 -1
  526. package/src/libs/ui/inputs/src/lib/button/button.component.ts +15 -1
  527. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +7 -2
  528. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +14 -6
  529. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +7 -1
  530. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.css +7 -2
  531. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.html +28 -23
  532. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +7 -1
  533. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.css +4 -0
  534. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.html +7 -3
  535. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.ts +2 -1
  536. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +4 -0
  537. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +30 -22
  538. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +2 -1
  539. package/src/libs/ui/inputs/src/lib/search-input/search-input.component.ts +5 -1
  540. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +4 -3
  541. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +0 -1
  542. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +1 -2
  543. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +1 -1
  544. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -1
  545. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +0 -3
  546. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.html +1 -1
  547. package/src/libs/ui/layout/src/index.ts +2 -0
  548. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +8 -3
  549. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +4 -3
  550. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +1 -1
  551. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +2 -2
  552. package/src/libs/ui/layout/src/lib/modal-dialog/modal-dialog.component.html +15 -0
  553. package/src/libs/ui/layout/src/lib/modal-dialog/modal-dialog.component.ts +44 -0
  554. package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.html +37 -0
  555. package/src/libs/ui/{elements → layout}/src/lib/sortable-list/sortable-list.component.ts +13 -16
  556. package/src/libs/ui/map/src/index.ts +3 -2
  557. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.html +1 -1
  558. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.ts +8 -5
  559. package/src/libs/ui/map/src/lib/components/map-container/map-container.component.css +0 -0
  560. package/src/libs/ui/map/src/lib/components/map-container/map-container.component.ts +203 -0
  561. package/src/libs/ui/map/src/lib/components/map-container/map-settings.token.ts +23 -0
  562. package/src/libs/ui/map/src/lib/map-utils.ts +54 -0
  563. package/src/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.ts +7 -6
  564. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +20 -9
  565. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +5 -6
  566. package/src/libs/util/app-config/src/index.ts +1 -0
  567. package/src/libs/util/app-config/src/lib/fixtures.ts +9 -9
  568. package/src/libs/util/app-config/src/lib/map-layers.ts +31 -0
  569. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +4 -3
  570. package/src/libs/util/shared/src/lib/links/link-utils.ts +6 -6
  571. package/src/libs/util/shared/src/lib/services/theme.service.ts +1 -0
  572. package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +4 -1
  573. package/tailwind.base.config.js +1 -0
  574. package/tailwind.base.css +38 -6
  575. package/translations/de.json +28 -2
  576. package/translations/en.json +59 -33
  577. package/translations/es.json +26 -0
  578. package/translations/fr.json +90 -64
  579. package/translations/it.json +28 -2
  580. package/translations/nl.json +26 -0
  581. package/translations/pt.json +26 -0
  582. package/translations/sk.json +26 -0
  583. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +0 -96
  584. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +0 -19
  585. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-date/form-field-temporal-extents-date.component.mjs +0 -17
  586. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-range/form-field-temporal-extents-range.component.mjs +0 -17
  587. package/esm2022/libs/feature/map/src/lib/+state/map.effects.mjs +0 -15
  588. package/esm2022/libs/feature/map/src/lib/+state/map.models.mjs +0 -2
  589. package/esm2022/libs/feature/map/src/lib/constant/map-options.mjs +0 -8
  590. package/esm2022/libs/feature/map/src/lib/constant/style.constant.mjs +0 -17
  591. package/esm2022/libs/feature/map/src/lib/feature-info/feature-info.service.mjs +0 -38
  592. package/esm2022/libs/feature/map/src/lib/manager/map-instance.directive.mjs +0 -19
  593. package/esm2022/libs/feature/map/src/lib/manager/map-manager.service.mjs +0 -19
  594. package/esm2022/libs/feature/map/src/lib/map-container/map-container.component.mjs +0 -27
  595. package/esm2022/libs/feature/map/src/lib/map-context/component/map-context.component.mjs +0 -46
  596. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +0 -10
  597. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +0 -289
  598. package/esm2022/libs/ui/elements/src/lib/sortable-list/sortable-list.component.mjs +0 -39
  599. package/esm2022/libs/ui/map/src/lib/components/map/map.component.mjs +0 -40
  600. package/esm2022/libs/ui/map/src/lib/ui-map.module.mjs +0 -33
  601. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +0 -27
  602. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +0 -1
  603. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +0 -9
  604. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +0 -1
  605. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-date/form-field-temporal-extents-date.component.d.ts +0 -8
  606. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-date/form-field-temporal-extents-date.component.d.ts.map +0 -1
  607. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-range/form-field-temporal-extents-range.component.d.ts +0 -8
  608. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-range/form-field-temporal-extents-range.component.d.ts.map +0 -1
  609. package/libs/feature/map/src/lib/+state/map.effects.d.ts +0 -9
  610. package/libs/feature/map/src/lib/+state/map.effects.d.ts.map +0 -1
  611. package/libs/feature/map/src/lib/+state/map.models.d.ts +0 -9
  612. package/libs/feature/map/src/lib/+state/map.models.d.ts.map +0 -1
  613. package/libs/feature/map/src/lib/constant/map-options.d.ts +0 -9
  614. package/libs/feature/map/src/lib/constant/map-options.d.ts.map +0 -1
  615. package/libs/feature/map/src/lib/constant/style.constant.d.ts +0 -4
  616. package/libs/feature/map/src/lib/constant/style.constant.d.ts.map +0 -1
  617. package/libs/feature/map/src/lib/feature-info/feature-info.service.d.ts +0 -16
  618. package/libs/feature/map/src/lib/feature-info/feature-info.service.d.ts.map +0 -1
  619. package/libs/feature/map/src/lib/manager/map-instance.directive.d.ts +0 -9
  620. package/libs/feature/map/src/lib/manager/map-instance.directive.d.ts.map +0 -1
  621. package/libs/feature/map/src/lib/manager/map-manager.service.d.ts +0 -11
  622. package/libs/feature/map/src/lib/manager/map-manager.service.d.ts.map +0 -1
  623. package/libs/feature/map/src/lib/map-container/map-container.component.d.ts +0 -12
  624. package/libs/feature/map/src/lib/map-container/map-container.component.d.ts.map +0 -1
  625. package/libs/feature/map/src/lib/map-context/component/map-context.component.d.ts +0 -26
  626. package/libs/feature/map/src/lib/map-context/component/map-context.component.d.ts.map +0 -1
  627. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +0 -77
  628. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +0 -1
  629. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +0 -26
  630. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +0 -1
  631. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts +0 -17
  632. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts.map +0 -1
  633. package/libs/ui/map/src/lib/components/map/map.component.d.ts +0 -19
  634. package/libs/ui/map/src/lib/components/map/map.component.d.ts.map +0 -1
  635. package/libs/ui/map/src/lib/ui-map.module.d.ts +0 -13
  636. package/libs/ui/map/src/lib/ui-map.module.d.ts.map +0 -1
  637. package/src/libs/common/fixtures/src/lib/ol-feature.fixture.ts +0 -7
  638. package/src/libs/common/fixtures/src/lib/utils/freeze.ts +0 -10
  639. package/src/libs/common/fixtures/src/lib/utils/index.ts +0 -1
  640. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +0 -9
  641. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +0 -113
  642. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-date/form-field-temporal-extents-date.component.html +0 -7
  643. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-date/form-field-temporal-extents-date.component.ts +0 -16
  644. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-range/form-field-temporal-extents-range.component.html +0 -13
  645. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents-range/form-field-temporal-extents-range.component.ts +0 -16
  646. package/src/libs/feature/map/src/lib/+state/map.effects.ts +0 -7
  647. package/src/libs/feature/map/src/lib/+state/map.models.ts +0 -9
  648. package/src/libs/feature/map/src/lib/constant/map-options.ts +0 -17
  649. package/src/libs/feature/map/src/lib/feature-info/feature-info.service.ts +0 -42
  650. package/src/libs/feature/map/src/lib/manager/map-instance.directive.ts +0 -10
  651. package/src/libs/feature/map/src/lib/manager/map-manager.service.ts +0 -13
  652. package/src/libs/feature/map/src/lib/map-container/map-container.component.html +0 -1
  653. package/src/libs/feature/map/src/lib/map-container/map-container.component.ts +0 -26
  654. package/src/libs/feature/map/src/lib/map-context/component/map-context.component.html +0 -1
  655. package/src/libs/feature/map/src/lib/map-context/component/map-context.component.ts +0 -57
  656. package/src/libs/feature/map/src/lib/map-context/map-context.fixtures.ts +0 -51
  657. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +0 -95
  658. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +0 -318
  659. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.html +0 -29
  660. package/src/libs/ui/map/src/lib/components/map/map.component.ts +0 -57
  661. package/src/libs/ui/map/src/lib/ui-map.module.ts +0 -19
  662. /package/src/libs/feature/editor/src/lib/components/{overview-upload/overview-upload.component.css → import-record/import-record.component.css} +0 -0
  663. /package/src/libs/feature/editor/src/lib/components/{record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css → online-resource-card/online-resource-card.component.css} +0 -0
  664. /package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-temporal-extents/form-field-temporal-extents-date/form-field-temporal-extents-date.component.css → form-field-contacts/form-field-contacts.component.css} +0 -0
  665. /package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-temporal-extents/form-field-temporal-extents-range/form-field-temporal-extents-range.component.css → form-field-date-updated/form-field-date-updated.component.css} +0 -0
  666. /package/src/libs/feature/editor/src/lib/components/record-form/form-field/{form-field-resource-updated/form-field-resource-updated.component.html → form-field-date-updated/form-field-date-updated.component.html} +0 -0
  667. /package/src/libs/feature/{map/src/lib/map-container/map-container.component.css → editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.css} +0 -0
  668. /package/src/libs/feature/map/src/lib/{map-context/component/map-context.component.css → map-state-container/map-state-container.component.css} +0 -0
  669. /package/src/libs/ui/{map/src/lib/components/map/map.component.css → layout/src/lib/modal-dialog/modal-dialog.component.css} +0 -0
  670. /package/src/libs/ui/{elements → layout}/src/lib/sortable-list/sortable-list.component.css +0 -0
  671. /package/src/libs/ui/map/src/lib/components/{map/map.component.html → map-container/map-container.component.html} +0 -0
@@ -1,6 +1,6 @@
1
1
  import format from 'date-fns/format';
2
- import { fallback, filterArray, getAtIndex, map, mapArray, noop, pipe, tap, } from '../function-utils';
3
- import { addAttribute, appendChildren, createChild, createElement, findChildElement, findChildOrCreate, findChildrenElement, findNestedChildOrCreate, findNestedElements, readAttribute, removeAllChildren, removeChildren, removeChildrenByName, setTextContent, } from '../xml-utils';
2
+ import { filterArray, map, mapArray, noop, pipe, tap, } from '../function-utils';
3
+ import { addAttribute, appendChildren, createChild, createElement, findChildOrCreate, findChildrenElement, findNestedChildOrCreate, findNestedElement, findNestedElements, readAttribute, removeAllChildren, removeChildren, removeChildrenByName, setTextContent, } from '../xml-utils';
4
4
  import { readKind } from './read-parts';
5
5
  import { writeGeometry } from './utils/geometry';
6
6
  import { namePartsToFull } from './utils/individual-name';
@@ -14,7 +14,7 @@ export function writeAnchor(url, text) {
14
14
  return tap(pipe(findChildOrCreate('gmx:Anchor'), addAttribute('xlink:href', url.toString()), text ? setTextContent(text) : noop));
15
15
  }
16
16
  export function writeDateTime(date) {
17
- return tap(pipe(findChildOrCreate('gco:DateTime'), setTextContent(format(date, "yyyy-MM-dd'T'HH:mm:ss"))));
17
+ return pipe(findChildOrCreate('gco:DateTime'), setTextContent(format(date, "yyyy-MM-dd'T'HH:mm:ss")));
18
18
  }
19
19
  export function writeDate(date) {
20
20
  return tap(pipe(findChildOrCreate('gco:Date'), setTextContent(format(date, 'yyyy-MM-dd'))));
@@ -86,7 +86,7 @@ export function getRoleCode(role) {
86
86
  throw new Error(`Could not determine role code from role: ${role}`);
87
87
  }
88
88
  }
89
- export function getDistributionProtocol(distribution) {
89
+ export function getServiceDistributionProtocol(distribution) {
90
90
  switch (distribution.accessServiceProtocol.toLowerCase()) {
91
91
  case 'wfs':
92
92
  return 'OGC:WFS';
@@ -148,27 +148,23 @@ export function getISODuration(updateFrequency) {
148
148
  const hours = duration.hours > 0 ? `T${duration.hours}H` : '';
149
149
  return `P${duration.years}Y${duration.months}M${duration.days}D${hours}`;
150
150
  }
151
- export function appendResponsibleParty(contact) {
151
+ function appendResponsibleParty(contact) {
152
152
  const fullName = namePartsToFull(contact.firstName, contact.lastName);
153
153
  const createAddress = pipe(createElement('gmd:address'), createChild('gmd:CI_Address'), appendChildren(pipe(createElement('gmd:electronicMailAddress'), writeCharacterString(contact.email))), contact.address
154
154
  ? appendChildren(pipe(createElement('gmd:deliveryPoint'), writeCharacterString(contact.address)))
155
155
  : noop);
156
156
  const createContact = pipe(createElement('gmd:contactInfo'), createChild('gmd:CI_Contact'), contact.phone
157
157
  ? appendChildren(pipe(createElement('gmd:phone'), createChild('gmd:CI_Telephone'), createChild('gmd:voice'), writeCharacterString(contact.phone)))
158
- : noop, appendChildren(createAddress), 'website' in contact.organization
158
+ : noop, appendChildren(createAddress), contact.organization?.website
159
159
  ? appendChildren(pipe(createElement('gmd:onlineResource'), createChild('gmd:CI_OnlineResource'), writeLinkage(contact.organization.website)))
160
160
  : noop);
161
161
  return appendChildren(pipe(createElement('gmd:CI_ResponsibleParty'), fullName
162
162
  ? appendChildren(pipe(createElement('gmd:individualName'), writeCharacterString(fullName)))
163
163
  : noop, contact.position
164
164
  ? appendChildren(pipe(createElement('gmd:positionName'), writeCharacterString(contact.position)))
165
- : noop, appendChildren(pipe(createElement('gmd:organisationName'), writeCharacterString(contact.organization.name)), createContact, pipe(createElement('gmd:role'), createChild('gmd:CI_RoleCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode'), addAttribute('codeListValue', getRoleCode(contact.role))))));
166
- }
167
- export function updateCitationDate(date, type) {
168
- return pipe(findNestedElements('gmd:date', 'gmd:CI_Date'), filterArray(pipe(findChildElement('gmd:CI_DateTypeCode'), readAttribute('codeListValue'), map((value) => value === type))), getAtIndex(0), findChildElement('gmd:date'), removeAllChildren(), writeDateTime(date));
169
- }
170
- export function appendCitationDate(date, type) {
171
- return appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type)))));
165
+ : noop, contact.organization?.name
166
+ ? appendChildren(pipe(createElement('gmd:organisationName'), writeCharacterString(contact.organization.name)))
167
+ : noop, appendChildren(createContact, pipe(createElement('gmd:role'), createChild('gmd:CI_RoleCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode'), addAttribute('codeListValue', getRoleCode(contact.role))))));
172
168
  }
173
169
  export function removeKeywords() {
174
170
  return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
@@ -224,10 +220,10 @@ export function createLicense(license) {
224
220
  ? writeAnchor(license.url, license.text)
225
221
  : writeCharacterString(license.text))));
226
222
  }
227
- export function removeDistributions() {
223
+ export function removeOnlineResources() {
228
224
  return pipe(removeChildrenByName('gmd:distributionInfo'));
229
225
  }
230
- function appendDistributionFormat(mimeType) {
226
+ function appendOnlineResourceFormat(mimeType) {
231
227
  return appendChildren(pipe(createElement('gmd:distributionFormat'), createChild('gmd:MD_Format'), appendChildren(pipe(createElement('gmd:name'), writeCharacterString(mimeType)), pipe(createElement('gmd:version'), writeCharacterString('1.0') // hardcoding this as it most likely won't be used but is mandatory
232
228
  ))));
233
229
  }
@@ -235,31 +231,33 @@ export function createDistributionInfo() {
235
231
  return pipe(createElement('gmd:distributionInfo'), createChild('gmd:MD_Distribution'));
236
232
  }
237
233
  // apply to MD_Distribution
238
- export function appendDistribution(distribution, appendFormatFn) {
234
+ export function appendOnlineResource(onlineResource, appendFormatFn) {
239
235
  let name;
240
236
  let functionCode;
241
237
  let protocol;
242
- if (distribution.type === 'service') {
243
- name = distribution.identifierInService; // this is for GeoNetwork to know the layer name
238
+ if (onlineResource.type === 'service') {
239
+ name = onlineResource.identifierInService; // this is for GeoNetwork to know the layer name
244
240
  functionCode = 'download';
245
- protocol = getDistributionProtocol(distribution);
241
+ protocol = getServiceDistributionProtocol(onlineResource);
246
242
  }
247
- else if (distribution.type === 'download') {
248
- name = distribution.name;
243
+ else if (onlineResource.type === 'download') {
244
+ name = onlineResource.name;
249
245
  functionCode = 'download';
250
246
  protocol = 'WWW:DOWNLOAD';
251
247
  }
252
248
  else {
253
- name = distribution.name;
249
+ name = onlineResource.name;
254
250
  functionCode = 'information';
255
251
  protocol = 'WWW:LINK';
256
252
  }
257
- const appendTransferOptions = appendChildren(pipe(createElement('gmd:transferOptions'), createChild('gmd:MD_DigitalTransferOptions'), createChild('gmd:onLine'), createChild('gmd:CI_OnlineResource'), writeLinkage(distribution.url), 'description' in distribution
258
- ? appendChildren(pipe(createElement('gmd:description'), writeCharacterString(distribution.description)))
253
+ const appendTransferOptions = appendChildren(pipe(createElement('gmd:transferOptions'), createChild('gmd:MD_DigitalTransferOptions'), createChild('gmd:onLine'), createChild('gmd:CI_OnlineResource'), writeLinkage(onlineResource.url), 'description' in onlineResource
254
+ ? appendChildren(pipe(createElement('gmd:description'), writeCharacterString(onlineResource.description)))
259
255
  : noop, name !== undefined
260
256
  ? appendChildren(pipe(createElement('gmd:name'), writeCharacterString(name)))
261
257
  : noop, appendChildren(pipe(createElement('gmd:protocol'), writeCharacterString(protocol)), pipe(createElement('gmd:function'), createChild('gmd:CI_OnLineFunctionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_OnLineFunctionCode'), addAttribute('codeListValue', functionCode)))));
262
- return pipe('mimeType' in distribution ? appendFormatFn(distribution.mimeType) : noop, appendTransferOptions);
258
+ return pipe('mimeType' in onlineResource
259
+ ? appendFormatFn(onlineResource.mimeType)
260
+ : noop, appendTransferOptions);
263
261
  }
264
262
  /**
265
263
  * Looks for srv:SV_ServiceIdentification or gmd:MD_DataIdentification element
@@ -285,24 +283,6 @@ export function writeUniqueIdentifier(record, rootEl) {
285
283
  export function writeKind(record, rootEl) {
286
284
  pipe(findNestedChildOrCreate('gmd:hierarchyLevel', 'gmd:MD_ScopeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ScopeCode'), addAttribute('codeListValue', record.kind))(rootEl);
287
285
  }
288
- export function writeOwnerOrganization(record, rootEl) {
289
- // if no contact matches the owner org, create an empty one
290
- const ownerContact = record.contacts.find((contact) => contact.organization.name === record.ownerOrganization.name);
291
- pipe(findChildOrCreate('gmd:contact'), removeAllChildren(), appendResponsibleParty(ownerContact
292
- ? {
293
- ...ownerContact,
294
- // owner responsible party is always point of contact
295
- role: 'point_of_contact',
296
- }
297
- : {
298
- organization: record.ownerOrganization,
299
- email: '',
300
- role: 'point_of_contact',
301
- }))(rootEl);
302
- }
303
- export function writeRecordUpdated(record, rootEl) {
304
- pipe(findChildOrCreate('gmd:dateStamp'), removeAllChildren(), writeDateTime(record.recordUpdated))(rootEl);
305
- }
306
286
  export function writeTitle(record, rootEl) {
307
287
  pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation', 'gmd:title'), writeCharacterString(record.title))(rootEl);
308
288
  }
@@ -341,20 +321,32 @@ export function writeUpdateFrequency(record, rootEl) {
341
321
  ? pipe(createChild('gmd:userDefinedMaintenanceFrequency'), createChild('gts:TM_PeriodDuration'), setTextContent(getISODuration(record.updateFrequency)))
342
322
  : pipe(createChild('gmd:maintenanceAndUpdateFrequency'), createChild('gmd:MD_MaintenanceFrequencyCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_MaintenanceFrequencyCode'), addAttribute('codeListValue', getMaintenanceFrequencyCode(record.updateFrequency))))(rootEl);
343
323
  }
324
+ export function writeRecordUpdated(record, rootEl) {
325
+ pipe(findChildOrCreate('gmd:dateStamp'), removeAllChildren(), writeDateTime(record.recordUpdated))(rootEl);
326
+ }
327
+ export function removeResourceDate(type) {
328
+ return pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), removeChildren(pipe(findNestedElements('gmd:date'), filterArray(pipe(findNestedElement('gmd:CI_Date', 'gmd:dateType', 'gmd:CI_DateTypeCode'), readAttribute('codeListValue'), map((value) => value === type))))));
329
+ }
330
+ export function appendResourceDate(date, type) {
331
+ return pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type))))));
332
+ }
344
333
  export function writeResourceCreated(record, rootEl) {
345
- if (!('resourceCreated' in record))
334
+ removeResourceDate('creation')(rootEl);
335
+ if (!record.resourceCreated)
346
336
  return;
347
- pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), fallback(updateCitationDate(record.resourceCreated, 'creation'), appendCitationDate(record.resourceCreated, 'creation')))(rootEl);
337
+ appendResourceDate(record.resourceCreated, 'creation')(rootEl);
348
338
  }
349
339
  export function writeResourceUpdated(record, rootEl) {
350
- if (!('resourceUpdated' in record))
340
+ removeResourceDate('revision')(rootEl);
341
+ if (!record.resourceUpdated)
351
342
  return;
352
- pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), fallback(updateCitationDate(record.resourceUpdated, 'revision'), appendCitationDate(record.resourceUpdated, 'revision')))(rootEl);
343
+ appendResourceDate(record.resourceUpdated, 'revision')(rootEl);
353
344
  }
354
345
  export function writeResourcePublished(record, rootEl) {
355
- if (!('resourcePublished' in record))
346
+ removeResourceDate('publication')(rootEl);
347
+ if (!record.resourcePublished)
356
348
  return;
357
- pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:citation', 'gmd:CI_Citation'), fallback(updateCitationDate(record.resourcePublished, 'publication'), appendCitationDate(record.resourcePublished, 'publication')))(rootEl);
349
+ appendResourceDate(record.resourcePublished, 'publication')(rootEl);
358
350
  }
359
351
  export function writeSpatialRepresentation(record, rootEl) {
360
352
  pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_SpatialRepresentationTypeCode'), addAttribute('codeListValue', record.spatialRepresentation))(rootEl);
@@ -364,9 +356,6 @@ export function writeGraphicOverviews(record, rootEl) {
364
356
  ? appendChildren(pipe(createElement('gmd:fileDescription'), writeCharacterString(overview.description)))
365
357
  : noop))))(rootEl);
366
358
  }
367
- export function writeDistributions(record, rootEl) {
368
- pipe(removeDistributions(), appendChildren(...record.distributions.map((d) => pipe(createDistributionInfo(), appendDistribution(d, appendDistributionFormat)))))(rootEl);
369
- }
370
359
  export function writeLineage(record, rootEl) {
371
360
  pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), writeCharacterString(record.lineage))(rootEl);
372
361
  }
@@ -401,8 +390,19 @@ export function createOnlineResource(onlineResource) {
401
390
  : noop, appendChildren(pipe(createElement('gmd:protocol'), writeCharacterString(protocol)), pipe(createElement('gmd:function'), createChild('gmd:CI_OnLineFunctionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_OnLineFunctionCode'), addAttribute('codeListValue', functionCode)))));
402
391
  return pipe(createElement('gmd:distributionInfo'), createChild('gmd:MD_Distribution'), appendTransferOptions);
403
392
  }
393
+ export function appendDatasetOnlineResources(record, rootEl) {
394
+ appendChildren(...record.onlineResources.map((d) => pipe(createDistributionInfo(), appendOnlineResource(d, appendOnlineResourceFormat))))(rootEl);
395
+ }
396
+ export function appendServiceOnlineResources(record, rootEl) {
397
+ appendChildren(...record.onlineResources.map(createOnlineResource))(rootEl);
398
+ }
404
399
  export function writeOnlineResources(record, rootEl) {
405
- pipe(removeDistributions(), appendChildren(...record.onlineResources.map(createOnlineResource)))(rootEl);
400
+ removeOnlineResources()(rootEl);
401
+ if (record.kind === 'dataset') {
402
+ appendDatasetOnlineResources(record, rootEl);
403
+ return;
404
+ }
405
+ appendServiceOnlineResources(record, rootEl);
406
406
  }
407
407
  export function writeTemporalExtents(record, rootEl) {
408
408
  pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:temporalElement'), appendChildren(...record.temporalExtents.map((extent) => pipe(createElement('gmd:temporalElement'), createChild('gmd:EX_TemporalExtent'), appendChildren('start' in extent && 'end' in extent
@@ -433,4 +433,4 @@ export function writeSpatialExtents(record, rootEl) {
433
433
  };
434
434
  pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:geographicElement'), appendChildren(...record.spatialExtents.map((extent) => pipe(createElement('gmd:geographicElement'), appendChildren(appendBoundingPolygon(extent.geometry), appendGeographicBoundingBox(extent.bbox), appendGeographicDescription(extent.description))))))(rootEl);
435
435
  }
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGFydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS93cml0ZS1wYXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFFcEMsT0FBTyxFQUVMLFFBQVEsRUFDUixXQUFXLEVBQ1gsVUFBVSxFQUNWLEdBQUcsRUFDSCxRQUFRLEVBQ1IsSUFBSSxFQUNKLElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBRUwsWUFBWSxFQUNaLGNBQWMsRUFDZCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLGNBQWMsQ0FBQTtBQUNyQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFekQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxJQUFZO0lBRVosT0FBTyxHQUFHLENBQ1IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3JFLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDMUIsR0FBUTtJQUVSLE9BQU8sR0FBRyxDQUNSLElBQUksQ0FDRix1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQ2pELGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFB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QUFJLGVBQWUsQ0FBQyxZQUFZLElBQUksQ0FBQztnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTs7Z0JBQ25ELFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ25FLE1BQUs7UUFDUCxLQUFLLE1BQU07WUFDVCxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUEsQ0FBQyxnRUFBZ0U7WUFDdEksTUFBSztRQUNQLEtBQUssT0FBTztZQUNWLElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBOztnQkFDckQsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDbEUsTUFBSztRQUNQLEtBQUssTUFBTTtZQUNULElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBOztnQkFDcEQsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEUsTUFBSztLQUNSO0lBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDN0QsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFBO0FBQzFFLENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBbUI7SUFD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XG4gIERhdGFzZXREaXN0cmlidXRpb24sXG4gIERhdGFzZXRSZWNvcmQsXG4gIERhdGFzZXRTZXJ2aWNlRGlzdHJpYnV0aW9uLFxuICBJbmRpdmlkdWFsLFxuICBLZXl3b3JkLFxuICBSZWNvcmRTdGF0dXMsXG4gIFJvbGUsXG4gIFNlcnZpY2VFbmRwb2ludCxcbiAgU2VydmljZU9ubGluZVJlc291cmNlLFxuICBTZXJ2aWNlUmVjb3JkLFxuICBVcGRhdGVGcmVxdWVuY3lDb2RlLFxuICBVcGRhdGVGcmVxdWVuY3lDdXN0b20sXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL2RvbWFpbi9zcmMvbGliL21vZGVsL3JlY29yZCdcbmltcG9ydCB7IFRoZXNhdXJ1c01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vZG9tYWluL3NyYy9saWIvbW9kZWwvdGhlc2F1cnVzJ1xuaW1wb3J0IGZvcm1hdCBmcm9tICdkYXRlLWZucy9mb3JtYXQnXG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJ2dlb2pzb24nXG5pbXBvcnQge1xuICBDaGFpbmFibGVGdW5jdGlvbixcbiAgZmFsbGJhY2ssXG4gIGZpbHRlckFycmF5LFxuICBnZXRBdEluZGV4LFxuICBtYXAsXG4gIG1hcEFycmF5LFxuICBub29wLFxuICBwaXBlLFxuICB0YXAsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHtcbiAgWG1sRWxlbWVudCxcbiAgYWRkQXR0cmlidXRlLFxuICBhcHBlbmRDaGlsZHJlbixcbiAgY3JlYXRlQ2hpbGQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGZpbmRDaGlsZEVsZW1lbnQsXG4gIGZpbmRDaGlsZE9yQ3JlYXRlLFxuICBmaW5kQ2hpbGRyZW5FbGVtZW50LFxuICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSxcbiAgZmluZE5lc3RlZEVsZW1lbnRzLFxuICByZWFkQXR0cmlidXRlLFxuICByZW1vdmVBbGxDaGlsZHJlbixcbiAgcmVtb3ZlQ2hpbGRyZW4sXG4gIHJlbW92ZUNoaWxkcmVuQnlOYW1lLFxuICBzZXRUZXh0Q29udGVudCxcbn0gZnJvbSAnLi4veG1sLXV0aWxzJ1xuaW1wb3J0IHsgcmVhZEtpbmQgfSBmcm9tICcuL3JlYWQtcGFydHMnXG5pbXBvcnQgeyB3cml0ZUdlb21ldHJ5IH0gZnJvbSAnLi91dGlscy9nZW9tZXRyeSdcbmltcG9ydCB7IG5hbWVQYXJ0c1RvRnVsbCB9IGZyb20gJy4vdXRpbHMvaW5kaXZpZHVhbC1uYW1lJ1xuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDaGFyYWN0ZXJTdHJpbmcoXG4gIHRleHQ6IHN0cmluZ1xuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoZmluZENoaWxkT3JDcmVhdGUoJ2djbzpDaGFyYWN0ZXJTdHJpbmcnKSwgc2V0VGV4dENvbnRlbnQodGV4dCkpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlTGlua2FnZShcbiAgdXJsOiBVUkxcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHRhcChcbiAgICBwaXBlKFxuICAgICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpsaW5rYWdlJywgJ2dtZDpVUkwnKSxcbiAgICAgIHNldFRleHRDb250ZW50KHVybC50b1N0cmluZygpKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVBbmNob3IoXG4gIHVybDogVVJMLFxuICB0ZXh0Pzogc3RyaW5nXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbXg6QW5jaG9yJyksXG4gICAgICBhZGRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCB1cmwudG9TdHJpbmcoKSksXG4gICAgICB0ZXh0ID8gc2V0VGV4dENvbnRlbnQodGV4dCkgOiBub29wXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURhdGVUaW1lKFxuICBkYXRlOiBEYXRlXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnY286RGF0ZVRpbWUnKSxcbiAgICAgIHNldFRleHRDb250ZW50KGZvcm1hdChkYXRlLCBcInl5eXktTU0tZGQnVCdISDptbTpzc1wiKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGF0ZShcbiAgZGF0ZTogRGF0ZVxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ2NvOkRhdGUnKSxcbiAgICAgIHNldFRleHRDb250ZW50KGZvcm1hdChkYXRlLCAneXl5eS1NTS1kZCcpKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZWNpbWFsKFxuICBkZWNpbWFsOiBudW1iZXJcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHRhcChcbiAgICBwaXBlKGZpbmRDaGlsZE9yQ3JlYXRlKCdnY286RGVjaW1hbCcpLCBzZXRUZXh0Q29udGVudChkZWNpbWFsLnRvU3RyaW5nKCkpKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmVzc0NvZGUoc3RhdHVzOiBSZWNvcmRTdGF0dXMpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICByZXR1cm4gJ2NvbXBsZXRlZCdcbiAgICBjYXNlICdkZXByZWNhdGVkJzpcbiAgICAgIHJldHVybiAnZGVwcmVjYXRlZCdcbiAgICBjYXNlICdvbmdvaW5nJzpcbiAgICAgIHJldHVybiAnb25Hb2luZydcbiAgICBjYXNlICdyZW1vdmVkJzpcbiAgICAgIHJldHVybiAncmVtb3ZlZCdcbiAgICBjYXNlICd1bmRlcl9kZXZlbG9wbWVudCc6XG4gICAgICByZXR1cm4gJ3VuZGVyRGV2ZWxvcG1lbnQnXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJvZ3Jlc3MgY29kZSBmcm9tIHN0YXR1czogJHtzdGF0dXN9YFxuICAgICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb2xlQ29kZShyb2xlOiBSb2xlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChyb2xlKSB7XG4gICAgY2FzZSAnYXV0aG9yJzpcbiAgICAgIHJldHVybiAnYXV0aG9yJ1xuICAgIGNhc2UgJ2NvbGxhYm9yYXRvcic6XG4gICAgICByZXR1cm4gJ2NvbGxhYm9yYXRvcidcbiAgICBjYXNlICdjb250cmlidXRvcic6XG4gICAgICByZXR1cm4gJ2NvbnRyaWJ1dG9yJ1xuICAgIGNhc2UgJ2N1c3RvZGlhbic6XG4gICAgICByZXR1cm4gJ2N1c3RvZGlhbidcbiAgICBjYXNlICdkaXN0cmlidXRvcic6XG4gICAgICByZXR1cm4gJ2Rpc3RyaWJ1dG9yJ1xuICAgIGNhc2UgJ2VkaXRvcic6XG4gICAgICByZXR1cm4gJ2VkaXRvcidcbiAgICBjYXNlICdmdW5kZXInOlxuICAgICAgcmV0dXJuICdmdW5kZXInXG4gICAgY2FzZSAnbWVkaWF0b3InOlxuICAgICAgcmV0dXJuICdtZWRpYXRvcidcbiAgICBjYXNlICdvcmlnaW5hdG9yJzpcbiAgICAgIHJldHVybiAnb3JpZ2luYXRvcidcbiAgICBjYXNlICdvdGhlcic6XG4gICAgICByZXR1cm4gJ290aGVyJ1xuICAgIGNhc2UgJ293bmVyJzpcbiAgICAgIHJldHVybiAnb3duZXInXG4gICAgY2FzZSAncG9pbnRfb2ZfY29udGFjdCc6XG4gICAgICByZXR1cm4gJ3BvaW50T2ZDb250YWN0J1xuICAgIGNhc2UgJ3ByaW5jaXBhbF9pbnZlc3RpZ2F0b3InOlxuICAgICAgcmV0dXJuICdwcmluY2lwYWxJbnZlc3RpZ2F0b3InXG4gICAgY2FzZSAncHJvY2Vzc29yJzpcbiAgICAgIHJldHVybiAncHJvY2Vzc29yJ1xuICAgIGNhc2UgJ3B1Ymxpc2hlcic6XG4gICAgICByZXR1cm4gJ3B1Ymxpc2hlcidcbiAgICBjYXNlICdyZXNvdXJjZV9wcm92aWRlcic6XG4gICAgICByZXR1cm4gJ3Jlc291cmNlUHJvdmlkZXInXG4gICAgY2FzZSAncmlnaHRzX2hvbGRlcic6XG4gICAgICByZXR1cm4gJ3JpZ2h0c0hvbGRlcidcbiAgICBjYXNlICdzcG9uc29yJzpcbiAgICAgIHJldHVybiAnc3BvbnNvcidcbiAgICBjYXNlICdzdGFrZWhvbGRlcic6XG4gICAgICByZXR1cm4gJ3N0YWtlaG9sZGVyJ1xuICAgIGNhc2UgJ3Vuc3BlY2lmaWVkJzpcbiAgICAgIHJldHVybiAndW5zcGVjaWZpZWQnXG4gICAgY2FzZSAndXNlcic6XG4gICAgICByZXR1cm4gJ3VzZXInXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSByb2xlIGNvZGUgZnJvbSByb2xlOiAke3JvbGV9YClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdHJpYnV0aW9uUHJvdG9jb2woXG4gIGRpc3RyaWJ1dGlvbjogRGF0YXNldFNlcnZpY2VEaXN0cmlidXRpb25cbik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZGlzdHJpYnV0aW9uLmFjY2Vzc1NlcnZpY2VQcm90b2NvbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnd2ZzJzpcbiAgICAgIHJldHVybiAnT0dDOldGUydcbiAgICBjYXNlICd3bXMnOlxuICAgICAgcmV0dXJuICdPR0M6V01TJ1xuICAgIGNhc2UgJ3dwcyc6XG4gICAgICByZXR1cm4gJ09HQzpXUFMnXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkaXN0cmlidXRpb24uYWNjZXNzU2VydmljZVByb3RvY29sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlRnJlcXVlbmN5Q29kZShcbiAgdXBkYXRlRnJlcXVlbmN5OiBVcGRhdGVGcmVxdWVuY3lDb2RlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgc3dpdGNoICh1cGRhdGVGcmVxdWVuY3kpIHtcbiAgICBjYXNlICdhc05lZWRlZCc6XG4gICAgICByZXR1cm4gJ2FzTmVlZGVkJ1xuICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgcmV0dXJuICd1bmtub3duJ1xuICAgIGNhc2UgJ2lycmVndWxhcic6XG4gICAgICByZXR1cm4gJ2lycmVndWxhcidcbiAgICBjYXNlICdub3RQbGFubmVkJzpcbiAgICAgIHJldHVybiAnbm90UGxhbm5lZCdcbiAgICBjYXNlICdjb250aW51YWwnOlxuICAgICAgcmV0dXJuICdjb250aW51YWwnXG4gICAgY2FzZSAncGVyaW9kaWMnOlxuICAgICAgcmV0dXJuICdwZXJpb2RpYydcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPRHVyYXRpb24odXBkYXRlRnJlcXVlbmN5OiBVcGRhdGVGcmVxdWVuY3lDdXN0b20pOiBzdHJpbmcge1xuICBjb25zdCBkdXJhdGlvbiA9IHtcbiAgICB5ZWFyczogMCxcbiAgICBtb250aHM6IDAsXG4gICAgd2Vla3M6IDAsXG4gICAgZGF5czogMCxcbiAgICBob3VyczogMCxcbiAgfVxuICBzd2l0Y2ggKHVwZGF0ZUZyZXF1ZW5jeS5wZXIpIHtcbiAgICBjYXNlICdkYXknOlxuICAgICAgaWYgKHVwZGF0ZUZyZXF1ZW5jeS51cGRhdGVkVGltZXMgPD0gMSkgZHVyYXRpb24uZGF5cyA9IDFcbiAgICAgIGVsc2UgZHVyYXRpb24uaG91cnMgPSBNYXRoLnJvdW5kKDI0IC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICBkdXJhdGlvbi5kYXlzID0gTWF0aC5yb3VuZCg3IC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyAtIDAuMDAwMSkgLy8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCAnMiB0aW1lcyBwZXIgd2VlaycgPSAnZXZlcnkgMyBkYXlzJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdtb250aCc6XG4gICAgICBpZiAodXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyA8PSAxKSBkdXJhdGlvbi5tb250aHMgPSAxXG4gICAgICBlbHNlIGR1cmF0aW9uLmRheXMgPSBNYXRoLnJvdW5kKDMwIC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAneWVhcic6XG4gICAgICBpZiAodXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyA8PSAxKSBkdXJhdGlvbi55ZWFycyA9IDFcbiAgICAgIGVsc2UgZHVyYXRpb24ubW9udGhzID0gTWF0aC5yb3VuZCgxMiAvIHVwZGF0ZUZyZXF1ZW5jeS51cGRhdGVkVGltZXMpXG4gICAgICBicmVha1xuICB9XG4gIGNvbnN0IGhvdXJzID0gZHVyYXRpb24uaG91cnMgPiAwID8gYFQke2R1cmF0aW9uLmhvdXJzfUhgIDogJydcbiAgcmV0dXJuIGBQJHtkdXJhdGlvbi55ZWFyc31ZJHtkdXJhdGlvbi5tb250aHN9TSR7ZHVyYXRpb24uZGF5c31EJHtob3Vyc31gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRSZXNwb25zaWJsZVBhcnR5KGNvbnRhY3Q6IEluZGl2aWR1YWwpIHtcbiAgY29uc3QgZnVsbE5hbWUgPSBuYW1lUGFydHNUb0Z1bGwoY29udGFjdC5maXJzdE5hbWUsIGNvbnRhY3QubGFzdE5hbWUpXG5cbiAgY29uc3QgY3JlYXRlQWRkcmVzcyA9IHBpcGUoXG4gICAgY3JlYXRlRWxlbWVudCgnZ21kOmFkZHJlc3MnKSxcbiAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX0FkZHJlc3MnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDplbGVjdHJvbmljTWFpbEFkZHJlc3MnKSxcbiAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoY29udGFjdC5lbWFpbClcbiAgICAgIClcbiAgICApLFxuICAgIGNvbnRhY3QuYWRkcmVzc1xuICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRlbGl2ZXJ5UG9pbnQnKSxcbiAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QuYWRkcmVzcylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDogbm9vcFxuICApXG5cbiAgY29uc3QgY3JlYXRlQ29udGFjdCA9IHBpcGUoXG4gICAgY3JlYXRlRWxlbWVudCgnZ21kOmNvbnRhY3RJbmZvJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9Db250YWN0JyksXG4gICAgY29udGFjdC5waG9uZVxuICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBob25lJyksXG4gICAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX1RlbGVwaG9uZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDp2b2ljZScpLFxuICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoY29udGFjdC5waG9uZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDogbm9vcCxcbiAgICBhcHBlbmRDaGlsZHJlbihjcmVhdGVBZGRyZXNzKSxcbiAgICAnd2Vic2l0ZScgaW4gY29udGFjdC5vcmdhbml6YXRpb25cbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpvbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgd3JpdGVMaW5rYWdlKGNvbnRhY3Qub3JnYW5pemF0aW9uLndlYnNpdGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIHJldHVybiBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknKSxcbiAgICAgIGZ1bGxOYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6aW5kaXZpZHVhbE5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoZnVsbE5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBjb250YWN0LnBvc2l0aW9uXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cG9zaXRpb25OYW1lJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QucG9zaXRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6b3JnYW5pc2F0aW9uTmFtZScpLFxuICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3Qub3JnYW5pemF0aW9uLm5hbWUpXG4gICAgICAgICksXG4gICAgICAgIGNyZWF0ZUNvbnRhY3QsXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnJvbGUnKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX1JvbGVDb2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZ2V0Um9sZUNvZGUoY29udGFjdC5yb2xlKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2l0YXRpb25EYXRlKFxuICBkYXRlOiBEYXRlLFxuICB0eXBlOiAncmV2aXNpb24nIHwgJ2NyZWF0aW9uJyB8ICdwdWJsaWNhdGlvbidcbikge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpkYXRlJywgJ2dtZDpDSV9EYXRlJyksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6Q0lfRGF0ZVR5cGVDb2RlJyksXG4gICAgICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSxcbiAgICAgICAgbWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT09IHR5cGUpXG4gICAgICApXG4gICAgKSxcbiAgICBnZXRBdEluZGV4KDApLFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkYXRlJyksXG4gICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKSxcbiAgICB3cml0ZURhdGVUaW1lKGRhdGUpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZENpdGF0aW9uRGF0ZShcbiAgZGF0ZTogRGF0ZSxcbiAgdHlwZTogJ3JldmlzaW9uJyB8ICdjcmVhdGlvbicgfCAncHVibGljYXRpb24nXG4pIHtcbiAgcmV0dXJuIGFwcGVuZENoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGF0ZScpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9EYXRlJyksXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6ZGF0ZScpLCB3cml0ZURhdGVUaW1lKGRhdGUpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGF0ZVR5cGUnKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX0RhdGVUeXBlQ29kZScpLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNDSV9EYXRlVHlwZUNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCB0eXBlKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVLZXl3b3JkcygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKHBpcGUoZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6ZGVzY3JpcHRpdmVLZXl3b3JkcycpKSlcbn1cblxuLy8gcmV0dXJucyBhIDxnbWQ6dGhlc2F1cnVzTmFtZT4gZWxlbWVudFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRoZXNhdXJ1cyh0aGVzYXVydXM6IFRoZXNhdXJ1c01vZGVsKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp0aGVzYXVydXNOYW1lJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9DaXRhdGlvbicpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRpdGxlJyksXG4gICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKHRoZXNhdXJ1cy5uYW1lIHx8IHRoZXNhdXJ1cy5pZClcbiAgICAgICksXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6aWRlbnRpZmllcicpLFxuICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0lkZW50aWZpZXInKSxcbiAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpjb2RlJyksXG4gICAgICAgICAgICB0aGVzYXVydXMudXJsXG4gICAgICAgICAgICAgID8gd3JpdGVBbmNob3IodGhlc2F1cnVzLnVybCwgdGhlc2F1cnVzLmlkKVxuICAgICAgICAgICAgICA6IHdyaXRlQ2hhcmFjdGVyU3RyaW5nKHRoZXNhdXJ1cy5pZClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZEtleXdvcmRzKGtleXdvcmRzOiBLZXl3b3JkW10pIHtcbiAgLy8ga2V5d29yZHMgYXJlIGdyb3VwZWQgYnkgdGhlc2F1cnVzIGlmIHRoZXkgaGF2ZSBvbmUsIG90aGVyd2lzZSBieSB0eXBlXG4gIGNvbnN0IGtleXdvcmRzQnlUaGVzYXVydXM6IEtleXdvcmRbXVtdID0ga2V5d29yZHMucmVkdWNlKChhY2MsIGtleXdvcmQpID0+IHtcbiAgICBjb25zdCB0aGVzYXVydXNJZCA9IGtleXdvcmQudGhlc2F1cnVzPy5pZFxuICAgIGNvbnN0IHR5cGUgPSBrZXl3b3JkLnR5cGVcbiAgICBsZXQgZXhpc3RpbmdHcm91cCA9IGFjYy5maW5kKChncm91cCkgPT5cbiAgICAgIHRoZXNhdXJ1c0lkXG4gICAgICAgID8gZ3JvdXBbMF0udGhlc2F1cnVzPy5pZCA9PT0gdGhlc2F1cnVzSWRcbiAgICAgICAgOiBncm91cFswXS50eXBlID09PSB0eXBlICYmICFncm91cFswXS50aGVzYXVydXNcbiAgICApXG4gICAgaWYgKCFleGlzdGluZ0dyb3VwKSB7XG4gICAgICBleGlzdGluZ0dyb3VwID0gW11cbiAgICAgIGFjYy5wdXNoKGV4aXN0aW5nR3JvdXApXG4gICAgfVxuICAgIGV4aXN0aW5nR3JvdXAucHVzaChrZXl3b3JkKVxuICAgIHJldHVybiBhY2NcbiAgfSwgW10pXG4gIHJldHVybiBhcHBlbmRDaGlsZHJlbihcbiAgICAuLi5rZXl3b3Jkc0J5VGhlc2F1cnVzLm1hcCgoa2V5d29yZHMpID0+XG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGVzY3JpcHRpdmVLZXl3b3JkcycpLFxuICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0tleXdvcmRzJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dHlwZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9LZXl3b3JkVHlwZUNvZGUnKSxcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfS2V5d29yZFR5cGVDb2RlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIGtleXdvcmRzWzBdLnR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBrZXl3b3Jkc1swXS50aGVzYXVydXNcbiAgICAgICAgICA/IGFwcGVuZENoaWxkcmVuKGNyZWF0ZVRoZXNhdXJ1cyhrZXl3b3Jkc1swXS50aGVzYXVydXMpKVxuICAgICAgICAgIDogbm9vcCxcbiAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgLi4ua2V5d29yZHMubWFwKChrZXl3b3JkKSA9PlxuICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmtleXdvcmQnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoa2V5d29yZC5sYWJlbClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnN0cmFpbnQoXG4gIGNvbnN0cmFpbnQ6IENvbnN0cmFpbnQsXG4gIHR5cGU6ICdsZWdhbCcgfCAnc2VjdXJpdHknIHwgJ290aGVyJ1xuKSB7XG4gIGlmICh0eXBlID09PSAnc2VjdXJpdHknKSB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9TZWN1cml0eUNvbnN0cmFpbnRzJyksXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Y2xhc3NpZmljYXRpb24nKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0NsYXNzaWZpY2F0aW9uQ29kZScpLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9DbGFzc2lmaWNhdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCAncmVzdHJpY3RlZCcpXG4gICAgICAgICksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb25zdHJhaW50LnRleHQpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xlZ2FsJykge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmFjY2Vzc0NvbnN0cmFpbnRzJyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUmVzdHJpY3Rpb25Db2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ290aGVyUmVzdHJpY3Rpb25zJylcbiAgICAgICAgKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6b3RoZXJDb25zdHJhaW50cycpLFxuICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnN0cmFpbnQudGV4dClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9Db25zdHJhaW50cycpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoY29uc3RyYWludC50ZXh0KVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlT3RoZXJDb25zdHJhaW50cygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6TURfQ29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICAgICAgICAoYXJyYXkpID0+IGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlU2VjdXJpdHlDb25zdHJhaW50cygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6TURfU2VjdXJpdHlDb25zdHJhaW50cycsICdnbWQ6dXNlTGltaXRhdGlvbicpLFxuICAgICAgICAgIChhcnJheSkgPT4gYXJyYXkubGVuZ3RoID4gMFxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMZWdhbENvbnN0cmFpbnRzKCkge1xuICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4oXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgICBmaWx0ZXJBcnJheShcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDphY2Nlc3NDb25zdHJhaW50cycsXG4gICAgICAgICAgICAnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgICAgKHJlc3RyaWN0aW9uQ29kZXMpID0+XG4gICAgICAgICAgICByZXN0cmljdGlvbkNvZGVzLmV2ZXJ5KChjb2RlKSA9PiBjb2RlICE9PSAnbGljZW5zZScpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxpY2Vuc2VzKCkge1xuICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4oXG4gICAgcGlwZShcbiAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgICBmaWx0ZXJBcnJheShcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDphY2Nlc3NDb25zdHJhaW50cycsXG4gICAgICAgICAgICAnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgICAgKHJlc3RyaWN0aW9uQ29kZXMpID0+XG4gICAgICAgICAgICByZXN0cmljdGlvbkNvZGVzLnNvbWUoKGNvZGUpID0+IGNvZGUgPT09ICdsaWNlbnNlJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGljZW5zZShsaWNlbnNlOiBDb25zdHJhaW50KSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6YWNjZXNzQ29uc3RyYWludHMnKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnKSxcbiAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUmVzdHJpY3Rpb25Db2RlJ1xuICAgICAgICApLFxuICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCAnbGljZW5zZScpXG4gICAgICApLFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmFjY2Vzc0NvbnN0cmFpbnRzJyksXG4gICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgKSxcbiAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ290aGVyUmVzdHJpY3Rpb25zJylcbiAgICAgICksXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6b3RoZXJDb25zdHJhaW50cycpLFxuICAgICAgICAndXJsJyBpbiBsaWNlbnNlXG4gICAgICAgICAgPyB3cml0ZUFuY2hvcihsaWNlbnNlLnVybCwgbGljZW5zZS50ZXh0KVxuICAgICAgICAgIDogd3JpdGVDaGFyYWN0ZXJTdHJpbmcobGljZW5zZS50ZXh0KVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlzdHJpYnV0aW9ucygpIHtcbiAgcmV0dXJuIHBpcGUocmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpkaXN0cmlidXRpb25JbmZvJykpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZERpc3RyaWJ1dGlvbkZvcm1hdChtaW1lVHlwZTogc3RyaW5nKSB7XG4gIHJldHVybiBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRpc3RyaWJ1dGlvbkZvcm1hdCcpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9Gb3JtYXQnKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDpuYW1lJyksIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKG1pbWVUeXBlKSksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnZlcnNpb24nKSxcbiAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZygnMS4wJykgLy8gaGFyZGNvZGluZyB0aGlzIGFzIGl0IG1vc3QgbGlrZWx5IHdvbid0IGJlIHVzZWQgYnV0IGlzIG1hbmRhdG9yeVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXN0cmlidXRpb25JbmZvKCkge1xuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uSW5mbycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfRGlzdHJpYnV0aW9uJylcbiAgKVxufVxuXG4vLyBhcHBseSB0byBNRF9EaXN0cmlidXRpb25cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmREaXN0cmlidXRpb24oXG4gIGRpc3RyaWJ1dGlvbjogRGF0YXNldERpc3RyaWJ1dGlvbixcbiAgYXBwZW5kRm9ybWF0Rm46IChcbiAgICBtaW1lVHlwZTogc3RyaW5nXG4gICkgPT4gQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD5cbikge1xuICBsZXQgbmFtZTogc3RyaW5nXG4gIGxldCBmdW5jdGlvbkNvZGU6IHN0cmluZ1xuICBsZXQgcHJvdG9jb2w6IHN0cmluZ1xuICBpZiAoZGlzdHJpYnV0aW9uLnR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgIG5hbWUgPSBkaXN0cmlidXRpb24uaWRlbnRpZmllckluU2VydmljZSAvLyB0aGlzIGlzIGZvciBHZW9OZXR3b3JrIHRvIGtub3cgdGhlIGxheWVyIG5hbWVcbiAgICBmdW5jdGlvbkNvZGUgPSAnZG93bmxvYWQnXG4gICAgcHJvdG9jb2wgPSBnZXREaXN0cmlidXRpb25Qcm90b2NvbChkaXN0cmlidXRpb24pXG4gIH0gZWxzZSBpZiAoZGlzdHJpYnV0aW9uLnR5cGUgPT09ICdkb3dubG9hZCcpIHtcbiAgICBuYW1lID0gZGlzdHJpYnV0aW9uLm5hbWVcbiAgICBmdW5jdGlvbkNvZGUgPSAnZG93bmxvYWQnXG4gICAgcHJvdG9jb2wgPSAnV1dXOkRPV05MT0FEJ1xuICB9IGVsc2Uge1xuICAgIG5hbWUgPSBkaXN0cmlidXRpb24ubmFtZVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdpbmZvcm1hdGlvbidcbiAgICBwcm90b2NvbCA9ICdXV1c6TElOSydcbiAgfVxuICBjb25zdCBhcHBlbmRUcmFuc2Zlck9wdGlvbnMgPSBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaWdpdGFsVHJhbnNmZXJPcHRpb25zJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOm9uTGluZScpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgd3JpdGVMaW5rYWdlKGRpc3RyaWJ1dGlvbi51cmwpLFxuICAgICAgJ2Rlc2NyaXB0aW9uJyBpbiBkaXN0cmlidXRpb25cbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhkaXN0cmlidXRpb24uZGVzY3JpcHRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBuYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcobmFtZSkpXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocHJvdG9jb2wpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNDSV9PbkxpbmVGdW5jdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBmdW5jdGlvbkNvZGUpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgJ21pbWVUeXBlJyBpbiBkaXN0cmlidXRpb24gPyBhcHBlbmRGb3JtYXRGbihkaXN0cmlidXRpb24ubWltZVR5cGUpIDogbm9vcCxcbiAgICBhcHBlbmRUcmFuc2Zlck9wdGlvbnNcbiAgKVxufVxuXG4vKipcbiAqIExvb2tzIGZvciBzcnY6U1ZfU2VydmljZUlkZW50aWZpY2F0aW9uIG9yIGdtZDpNRF9EYXRhSWRlbnRpZmljYXRpb24gZWxlbWVudFxuICogZGVwZW5kaW5nIG9uIHJlY29yZCB0eXBlLCBjcmVhdGUgaWYgbWlzc2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSB7XG4gIHJldHVybiAocm9vdEVsOiBYbWxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgICBsZXQgZWx0TmFtZSA9ICdnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uJ1xuICAgIGlmIChraW5kID09PSAnc2VydmljZScpIGVsdE5hbWUgPSAnc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbidcbiAgICByZXR1cm4gZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDppZGVudGlmaWNhdGlvbkluZm8nLCBlbHROYW1lKShyb290RWwpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPckNyZWF0ZURpc3RyaWJ1dGlvbigpIHtcbiAgcmV0dXJuIChyb290RWw6IFhtbEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLFxuICAgICAgJ2dtZDpNRF9EaXN0cmlidXRpb24nXG4gICAgKShyb290RWwpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVW5pcXVlSWRlbnRpZmllcihcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZmlsZUlkZW50aWZpZXInKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQudW5pcXVlSWRlbnRpZmllcilcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUtpbmQocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmhpZXJhcmNoeUxldmVsJywgJ2dtZDpNRF9TY29wZUNvZGUnKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfU2NvcGVDb2RlJ1xuICAgICksXG4gICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgcmVjb3JkLmtpbmQpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPd25lck9yZ2FuaXphdGlvbihcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICAvLyBpZiBubyBjb250YWN0IG1hdGNoZXMgdGhlIG93bmVyIG9yZywgY3JlYXRlIGFuIGVtcHR5IG9uZVxuICBjb25zdCBvd25lckNvbnRhY3Q6IEluZGl2aWR1YWwgPSByZWNvcmQuY29udGFjdHMuZmluZChcbiAgICAoY29udGFjdCkgPT4gY29udGFjdC5vcmdhbml6YXRpb24ubmFtZSA9PT0gcmVjb3JkLm93bmVyT3JnYW5pemF0aW9uLm5hbWVcbiAgKVxuICBwaXBlKFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6Y29udGFjdCcpLFxuICAgIHJlbW92ZUFsbENoaWxkcmVuKCksXG4gICAgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShcbiAgICAgIG93bmVyQ29udGFjdFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLm93bmVyQ29udGFjdCxcbiAgICAgICAgICAgIC8vIG93bmVyIHJlc3BvbnNpYmxlIHBhcnR5IGlzIGFsd2F5cyBwb2ludCBvZiBjb250YWN0XG4gICAgICAgICAgICByb2xlOiAncG9pbnRfb2ZfY29udGFjdCcsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbjogcmVjb3JkLm93bmVyT3JnYW5pemF0aW9uLFxuICAgICAgICAgICAgZW1haWw6ICcnLFxuICAgICAgICAgICAgcm9sZTogJ3BvaW50X29mX2NvbnRhY3QnLFxuICAgICAgICAgIH1cbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVSZWNvcmRVcGRhdGVkKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2dtZDpkYXRlU3RhbXAnKSxcbiAgICByZW1vdmVBbGxDaGlsZHJlbigpLFxuICAgIHdyaXRlRGF0ZVRpbWUocmVjb3JkLnJlY29yZFVwZGF0ZWQpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVUaXRsZShyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocmVjb3JkLnRpdGxlKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQWJzdHJhY3QocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6YWJzdHJhY3QnKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQuYWJzdHJhY3QpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVTdGF0dXMocmVjb3JkOiBEYXRhc2V0UmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6c3RhdHVzJywgJ2dtZDpNRF9Qcm9ncmVzc0NvZGUnKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUHJvZ3Jlc3NDb2RlJ1xuICAgICksXG4gICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZ2V0UHJvZ3Jlc3NDb2RlKHJlY29yZC5zdGF0dXMpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29udGFjdHMocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmNvbnRhY3QnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5jb250YWN0cy5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOmNvbnRhY3QnKSwgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0KSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb250YWN0c0ZvclJlc291cmNlKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpjb250YWN0JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQuY29udGFjdHNGb3JSZXNvdXJjZS5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgICAgICAgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlS2V5d29yZHMocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIHJlbW92ZUtleXdvcmRzKCksXG4gICAgYXBwZW5kS2V5d29yZHMocmVjb3JkLmtleXdvcmRzKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVG9waWNzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnRvcGljQ2F0ZWdvcnknKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC50b3BpY3MubWFwKCh0b3BpYykgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dG9waWNDYXRlZ29yeScpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfVG9waWNDYXRlZ29yeUNvZGUnKSxcbiAgICAgICAgICBzZXRUZXh0Q29udGVudCh0b3BpYylcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpY2Vuc2VzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMaWNlbnNlcygpLFxuICAgIGFwcGVuZENoaWxkcmVuKC4uLnJlY29yZC5saWNlbnNlcy5tYXAoY3JlYXRlTGljZW5zZSkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMZWdhbENvbnN0cmFpbnRzKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMZWdhbENvbnN0cmFpbnRzKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQubGVnYWxDb25zdHJhaW50cy5tYXAoKGMpID0+IGNyZWF0ZUNvbnN0cmFpbnQoYywgJ2xlZ2FsJykpXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU2VjdXJpdHlDb25zdHJhaW50cyhcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlU2VjdXJpdHlDb25zdHJhaW50cygpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLnNlY3VyaXR5Q29uc3RyYWludHMubWFwKChjKSA9PiBjcmVhdGVDb25zdHJhaW50KGMsICdzZWN1cml0eScpKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU90aGVyQ29uc3RyYWludHMoXG4gIHJlY29yZDogQ2F0YWxvZ1JlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIHJlbW92ZU90aGVyQ29uc3RyYWludHMoKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5vdGhlckNvbnN0cmFpbnRzLm1hcCgoYykgPT4gY3JlYXRlQ29uc3RyYWludChjLCAnb3RoZXInKSlcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVVcGRhdGVGcmVxdWVuY3koXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6cmVzb3VyY2VNYWludGVuYW5jZScpLFxuICAgIHJlbW92ZUFsbENoaWxkcmVuKCksXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJyksXG4gICAgdHlwZW9mIHJlY29yZC51cGRhdGVGcmVxdWVuY3kgPT09ICdvYmplY3QnXG4gICAgICA/IHBpcGUoXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDp1c2VyRGVmaW5lZE1haW50ZW5hbmNlRnJlcXVlbmN5JyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2d0czpUTV9QZXJpb2REdXJhdGlvbicpLFxuICAgICAgICAgIHNldFRleHRDb250ZW50KGdldElTT0R1cmF0aW9uKHJlY29yZC51cGRhdGVGcmVxdWVuY3kpKVxuICAgICAgICApXG4gICAgICA6IHBpcGUoXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDptYWludGVuYW5jZUFuZFVwZGF0ZUZyZXF1ZW5jeScpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfTWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX01haW50ZW5hbmNlRnJlcXVlbmN5Q29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdFZhbHVlJyxcbiAgICAgICAgICAgIGdldE1haW50ZW5hbmNlRnJlcXVlbmN5Q29kZShyZWNvcmQudXBkYXRlRnJlcXVlbmN5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmVzb3VyY2VDcmVhdGVkKFxuICByZWNvcmQ6IERhdGFzZXRSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIGlmICghKCdyZXNvdXJjZUNyZWF0ZWQnIGluIHJlY29yZCkpIHJldHVyblxuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nKSxcbiAgICBmYWxsYmFjayhcbiAgICAgIHVwZGF0ZUNpdGF0aW9uRGF0ZShyZWNvcmQucmVzb3VyY2VDcmVhdGVkLCAnY3JlYXRpb24nKSxcbiAgICAgIGFwcGVuZENpdGF0aW9uRGF0ZShyZWNvcmQucmVzb3VyY2VDcmVhdGVkLCAnY3JlYXRpb24nKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVJlc291cmNlVXBkYXRlZChcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBpZiAoISgncmVzb3VyY2VVcGRhdGVkJyBpbiByZWNvcmQpKSByZXR1cm5cbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6Y2l0YXRpb24nLCAnZ21kOkNJX0NpdGF0aW9uJyksXG4gICAgZmFsbGJhY2soXG4gICAgICB1cGRhdGVDaXRhdGlvbkRhdGUocmVjb3JkLnJlc291cmNlVXBkYXRlZCwgJ3JldmlzaW9uJyksXG4gICAgICBhcHBlbmRDaXRhdGlvbkRhdGUocmVjb3JkLnJlc291cmNlVXBkYXRlZCwgJ3JldmlzaW9uJylcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVSZXNvdXJjZVB1Ymxpc2hlZChcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBpZiAoISgncmVzb3VyY2VQdWJsaXNoZWQnIGluIHJlY29yZCkpIHJldHVyblxuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nKSxcbiAgICBmYWxsYmFjayhcbiAgICAgIHVwZGF0ZUNpdGF0aW9uRGF0ZShyZWNvcmQucmVzb3VyY2VQdWJsaXNoZWQsICdwdWJsaWNhdGlvbicpLFxuICAgICAgYXBwZW5kQ2l0YXRpb25EYXRlKHJlY29yZC5yZXNvdXJjZVB1Ymxpc2hlZCwgJ3B1YmxpY2F0aW9uJylcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVTcGF0aWFsUmVwcmVzZW50YXRpb24oXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKFxuICAgICAgJ2dtZDpzcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlJyxcbiAgICAgICdnbWQ6TURfU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZUNvZGUnXG4gICAgKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZUNvZGUnXG4gICAgKSxcbiAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCByZWNvcmQuc3BhdGlhbFJlcHJlc2VudGF0aW9uKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlR3JhcGhpY092ZXJ2aWV3cyhcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpncmFwaGljT3ZlcnZpZXcnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5vdmVydmlld3MubWFwKChvdmVydmlldykgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Z3JhcGhpY092ZXJ2aWV3JyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9Ccm93c2VHcmFwaGljJyksXG4gICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZmlsZU5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob3ZlcnZpZXcudXJsLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nIGluIG92ZXJ2aWV3XG4gICAgICAgICAgICA/IGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZmlsZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvdmVydmlldy5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbm9vcFxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGlzdHJpYnV0aW9ucyhyZWNvcmQ6IERhdGFzZXRSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIHJlbW92ZURpc3RyaWJ1dGlvbnMoKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5kaXN0cmlidXRpb25zLm1hcCgoZCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVEaXN0cmlidXRpb25JbmZvKCksXG4gICAgICAgICAgYXBwZW5kRGlzdHJpYnV0aW9uKGQsIGFwcGVuZERpc3RyaWJ1dGlvbkZvcm1hdClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpbmVhZ2UocmVjb3JkOiBEYXRhc2V0UmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZShcbiAgICAgICdnbWQ6ZGF0YVF1YWxpdHlJbmZvJyxcbiAgICAgICdnbWQ6RFFfRGF0YVF1YWxpdHknLFxuICAgICAgJ2dtZDpsaW5lYWdlJyxcbiAgICAgICdnbWQ6TElfTGluZWFnZScsXG4gICAgICAnZ21kOnN0YXRlbWVudCdcbiAgICApLFxuICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKHJlY29yZC5saW5lYWdlKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VFbmRwb2ludFByb3RvY29sKGVuZHBvaW50OiBTZXJ2aWNlRW5kcG9pbnQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGVuZHBvaW50LnByb3RvY29sLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd3ZnMnOlxuICAgICAgcmV0dXJuICdPR0M6V0ZTJ1xuICAgIGNhc2UgJ3dtcyc6XG4gICAgICByZXR1cm4gJ09HQzpXTVMnXG4gICAgY2FzZSAnd3BzJzpcbiAgICAgIHJldHVybiAnT0dDOldQUydcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGVuZHBvaW50LnByb3RvY29sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9ubGluZVJlc291cmNlKG9ubGluZVJlc291cmNlOiBTZXJ2aWNlT25saW5lUmVzb3VyY2UpIHtcbiAgbGV0IGxpbmthZ2VVcmwsIGZ1bmN0aW9uQ29kZSwgcHJvdG9jb2xcbiAgaWYgKG9ubGluZVJlc291cmNlLnR5cGUgPT09ICdlbmRwb2ludCcpIHtcbiAgICBsaW5rYWdlVXJsID0gb25saW5lUmVzb3VyY2UuZW5kcG9pbnRVcmwudG9TdHJpbmcoKVxuICAgIHByb3RvY29sID0gZ2V0U2VydmljZUVuZHBvaW50UHJvdG9jb2wob25saW5lUmVzb3VyY2UpXG4gICAgZnVuY3Rpb25Db2RlID0gJ2Rvd25sb2FkJ1xuICB9IGVsc2Uge1xuICAgIGxpbmthZ2VVcmwgPSBvbmxpbmVSZXNvdXJjZS51cmwudG9TdHJpbmcoKVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdpbmZvcm1hdGlvbidcbiAgICBwcm90b2NvbCA9ICdXV1c6TElOSydcbiAgfVxuICBjb25zdCBhcHBlbmRUcmFuc2Zlck9wdGlvbnMgPSBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaWdpdGFsVHJhbnNmZXJPcHRpb25zJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOm9uTGluZScpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgd3JpdGVMaW5rYWdlKGxpbmthZ2VVcmwpLFxuICAgICAgJ2Rlc2NyaXB0aW9uJyBpbiBvbmxpbmVSZXNvdXJjZVxuICAgICAgICA/IGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKG9ubGluZVJlc291cmNlLmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgOiBub29wLFxuICAgICAgJ25hbWUnIGluIG9ubGluZVJlc291cmNlXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6bmFtZScpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvbmxpbmVSZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgOiBub29wLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOnByb3RvY29sJyksIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKHByb3RvY29sKSksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmZ1bmN0aW9uJyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbkxpbmVGdW5jdGlvbkNvZGUnKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjQ0lfT25MaW5lRnVuY3Rpb25Db2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZnVuY3Rpb25Db2RlKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkaXN0cmlidXRpb25JbmZvJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaXN0cmlidXRpb24nKSxcbiAgICBhcHBlbmRUcmFuc2Zlck9wdGlvbnNcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPbmxpbmVSZXNvdXJjZXMoXG4gIHJlY29yZDogU2VydmljZVJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICByZW1vdmVEaXN0cmlidXRpb25zKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oLi4ucmVjb3JkLm9ubGluZVJlc291cmNlcy5tYXAoY3JlYXRlT25saW5lUmVzb3VyY2UpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVGVtcG9yYWxFeHRlbnRzKFxuICByZWNvcmQ6IERhdGFzZXRSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmV4dGVudCcsICdnbWQ6RVhfRXh0ZW50JyksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDp0ZW1wb3JhbEVsZW1lbnQnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC50ZW1wb3JhbEV4dGVudHMubWFwKChleHRlbnQpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRlbXBvcmFsRWxlbWVudCcpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6RVhfVGVtcG9yYWxFeHRlbnQnKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgICdzdGFydCcgaW4gZXh0ZW50ICYmICdlbmQnIGluIGV4dGVudFxuICAgICAgICAgICAgICA/IHBpcGUoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZXh0ZW50JyksXG4gICAgICAgICAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21sOlRpbWVQZXJpb2QnKSxcbiAgICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtbDpiZWdpblBvc2l0aW9uJyksXG4gICAgICAgICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudC5zdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNldFRleHRDb250ZW50KGZvcm1hdChleHRlbnQuc3RhcnQsICd5eXl5LU1NLWRkJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYWRkQXR0cmlidXRlKCdpbmRldGVybWluYXRlUG9zaXRpb24nLCAndW5rbm93bicpXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtbDplbmRQb3NpdGlvbicpLFxuICAgICAgICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQuZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0VGV4dENvbnRlbnQoZm9ybWF0KGV4dGVudC5lbmQsICd5eXl5LU1NLWRkJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYWRkQXR0cmlidXRlKCdpbmRldGVybWluYXRlUG9zaXRpb24nLCAndW5rbm93bicpXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHBpcGUoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZXh0ZW50JyksXG4gICAgICAgICAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21sOlRpbWVJbnN0YW50JyksXG4gICAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWw6dGltZVBvc2l0aW9uJyksXG4gICAgICAgICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudC5zdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNldFRleHRDb250ZW50KGZvcm1hdChleHRlbnQuc3RhcnQsICd5eXl5LU1NLWRkJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYWRkQXR0cmlidXRlKCdpbmRldGVybWluYXRlUG9zaXRpb24nLCAndW5rbm93bicpXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVNwYXRpYWxFeHRlbnRzKHJlY29yZDogRGF0YXNldFJlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIGNvbnN0IGFwcGVuZEJvdW5kaW5nUG9seWdvbiA9IChnZW9tZXRyeT86IEdlb21ldHJ5KSA9PiB7XG4gICAgaWYgKCFnZW9tZXRyeSkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpFWF9Cb3VuZGluZ1BvbHlnb24nKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpwb2x5Z29uJyksXG4gICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oKCkgPT4gd3JpdGVHZW9tZXRyeShnZW9tZXRyeSkpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICBjb25zdCBhcHBlbmRHZW9ncmFwaGljQm91bmRpbmdCb3ggPSAoXG4gICAgYmJveD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICkgPT4ge1xuICAgIGlmICghYmJveCkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpFWF9HZW9ncmFwaGljQm91bmRpbmdCb3gnKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDp3ZXN0Qm91bmRMb25naXR1ZGUnKSwgd3JpdGVEZWNpbWFsKGJib3hbMF0pKSxcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6ZWFzdEJvdW5kTG9uZ2l0dWRlJyksIHdyaXRlRGVjaW1hbChiYm94WzJdKSksXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOnNvdXRoQm91bmRMYXRpdHVkZScpLCB3cml0ZURlY2ltYWwoYmJveFsxXSkpLFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDpub3J0aEJvdW5kTGF0aXR1ZGUnKSwgd3JpdGVEZWNpbWFsKGJib3hbM10pKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGFwcGVuZEdlb2dyYXBoaWNEZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghZGVzY3JpcHRpb24pIHJldHVybiBudWxsXG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6RVhfR2VvZ3JhcGhpY0Rlc2NyaXB0aW9uJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOmdlb2dyYXBoaWNJZGVudGlmaWVyJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0lkZW50aWZpZXInKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Y29kZScpLFxuICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoZGVzY3JpcHRpb24pXG4gICAgKVxuICB9XG5cbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZXh0ZW50JywgJ2dtZDpFWF9FeHRlbnQnKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmdlb2dyYXBoaWNFbGVtZW50JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQuc3BhdGlhbEV4dGVudHMubWFwKChleHRlbnQpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmdlb2dyYXBoaWNFbGVtZW50JyksXG4gICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBhcHBlbmRCb3VuZGluZ1BvbHlnb24oZXh0ZW50Lmdlb21ldHJ5KSxcbiAgICAgICAgICAgIGFwcGVuZEdlb2dyYXBoaWNCb3VuZGluZ0JveChleHRlbnQuYmJveCksXG4gICAgICAgICAgICBhcHBlbmRHZW9ncmFwaGljRGVzY3JpcHRpb24oZXh0ZW50LmRlc2NyaXB0aW9uKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG4iXX0=
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGFydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS93cml0ZS1wYXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFFcEMsT0FBTyxFQUVMLFdBQVcsRUFDWCxHQUFHLEVBQ0gsUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixjQUFjLEdBRWYsTUFBTSxjQUFjLENBQUE7QUFDckIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXpELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsSUFBWTtJQUVaLE9BQU8sR0FBRyxDQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNyRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQVE7SUFFUixPQUFPLEdBQUcsQ0FDUixJQUFJLENBQ0YsdUJBQXVCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUNqRCxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQy9CLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUN6QixHQUFRLEVBQ1IsSUFBYTtJQUViLE9BQU8sR0FBRyxDQUNSLElBQUksQ0FDRixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFDL0IsWUFBWSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDMUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkMsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQzNCLElBQVU7SUFFVixPQUFPLElBQUksQ0FDVCxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsRUFDakMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUN0RCxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQ3ZCLElBQVU7SUFFVixPQUFPLEdBQUcsQ0FDUixJQUFJLENBQ0YsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQzdCLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQzNDLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixPQUFlO0lBRWYsT0FBTyxHQUFHLENBQ1IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUMzRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBb0I7SUFDbEQsUUFBUSxNQUFNLEVBQUU7UUFDZCxLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQVksQ0FBQTtRQUNyQixLQUFLLFNBQVM7WUFDWixPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLFNBQVM7WUFDWixPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLG1CQUFtQjtZQUN0QixPQUFPLGtCQUFrQixDQUFBO1FBQzNCO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FDYixrREFBa0QsTUFBTSxFQUFFLENBQzNELENBQUE7S0FDSjtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVU7SUFDcEMsUUFBUSxJQUFJLEVBQUU7UUFDWixLQUFLLFFBQVE7WUFDWCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixLQUFLLGNBQWM7WUFDakIsT0FBTyxjQUFjLENBQUE7UUFDdkIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3RCLEtBQUssV0FBVztZQUNkLE9BQU8sV0FBVyxDQUFBO1FBQ3BCLEtBQUssYUFBYTtZQUNoQixPQUFPLGFBQWEsQ0FBQTtRQUN0QixLQUFLLFFBQVE7WUFDWCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixLQUFLLFFBQVE7WUFDWCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixLQUFLLFVBQVU7WUFDYixPQUFPLFVBQVUsQ0FBQTtRQUNuQixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQVksQ0FBQTtRQUNyQixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQTtRQUNoQixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQTtRQUNoQixLQUFLLGtCQUFrQjtZQUNyQixPQUFPLGdCQUFnQixDQUFBO1FBQ3pCLEtBQUssd0JBQXdCO1lBQzNCLE9BQU8sdUJBQXVCLENBQUE7UUFDaEMsS0FBSyxXQUFXO1lBQ2QsT0FBTyxXQUFXLENBQUE7UUFDcEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxXQUFXLENBQUE7UUFDcEIsS0FBSyxtQkFBbUI7WUFDdEIsT0FBTyxrQkFBa0IsQ0FBQTtRQUMzQixLQUFLLGVBQWU7WUFDbEIsT0FBTyxjQUFjLENBQUE7UUFDdkIsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUE7UUFDbEIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3RCLEtBQUssYUFBYTtZQUNoQixPQUFPLGFBQWEsQ0FBQTtRQUN0QixLQUFLLE1BQU07WUFDVCxPQUFPLE1BQU0sQ0FBQTtRQUNmO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxFQUFFLENBQUMsQ0FBQTtLQUN0RTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsOEJBQThCLENBQzVDLFlBQXdDO0lBRXhDLFFBQVEsWUFBWSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxFQUFFO1FBQ3hELEtBQUssS0FBSztZQUNSLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLEtBQUssS0FBSztZQUNSLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLEtBQUssS0FBSztZQUNSLE9BQU8sU0FBUyxDQUFBO1FBQ2xCO1lBQ0UsT0FBTyxZQUFZLENBQUMscUJBQXFCLENBQUE7S0FDNUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxlQUFvQztJQUVwQyxRQUFRLGVBQWUsRUFBRTtRQUN2QixLQUFLLFVBQVU7WUFDYixPQUFPLFVBQVUsQ0FBQTtRQUNuQixLQUFLLFNBQVM7WUFDWixPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQVksQ0FBQTtRQUNyQixLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLFVBQVU7WUFDYixPQUFPLFVBQVUsQ0FBQTtLQUNwQjtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLGVBQXNDO0lBQ25FLE1BQU0sUUFBUSxHQUFHO1FBQ2YsS0FBSyxFQUFFLENBQUM7UUFDUixNQUFNLEVBQUUsQ0FBQztRQUNULEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxFQUFFLENBQUM7UUFDUCxLQUFLLEVBQUUsQ0FBQztLQUNULENBQUE7SUFDRCxRQUFRLGVBQWUsQ0FBQyxHQUFHLEVBQUU7UUFDM0IsS0FBSyxLQUFLO1lBQ1IsSUFBSSxlQUFlLENBQUMsWUFBWSxJQUFJLENBQUM7Z0JBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUE7O2dCQUNuRCxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNuRSxNQUFLO1FBQ1AsS0FBSyxNQUFNO1lBQ1QsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFBLENBQUMsZ0VBQWdFO1lBQ3RJLE1BQUs7UUFDUCxLQUFLLE9BQU87WUFDVixJQUFJLGVBQWUsQ0FBQyxZQUFZLElBQUksQ0FBQztnQkFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTs7Z0JBQ3JELFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2xFLE1BQUs7UUFDUCxLQUFLLE1BQU07WUFDVCxJQUFJLGVBQWUsQ0FBQyxZQUFZLElBQUksQ0FBQztnQkFBRSxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTs7Z0JBQ3BELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ3BFLE1BQUs7S0FDUjtJQUNELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzdELE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQTtBQUMxRSxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxPQUFtQjtJQUNqRCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFckUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUN4QixhQUFhLENBQUMsYUFBYSxDQUFDLEVBQzVCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM3QixjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxFQUMxQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQ3BDLENBQ0YsRUFDRCxPQUFPLENBQUMsT0FBTztRQUNiLENBQUMsQ0FBQyxjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUNsQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQ3RDLENBQ0Y7UUFDSCxDQUFDLENBQUMsSUFBSSxDQUNULENBQUE7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQ3hCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNoQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFDN0IsT0FBTyxDQUFDLEtBQUs7UUFDWCxDQUFDLENBQUMsY0FBYyxDQUNaLElBQUksQ0FDRixhQUFhLENBQUMsV0FBVyxDQUFDLEVBQzFCLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUMvQixXQUFXLENBQUMsV0FBVyxDQUFDLEVBQ3hCLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FDcEMsQ0FDRjtRQUNILENBQUMsQ0FBQyxJQUFJLEVBQ1IsY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUM3QixPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU87UUFDM0IsQ0FBQyxDQUFDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEVBQ25DLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUNwQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FDM0MsQ0FDRjtRQUNILENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQTtJQUVELE9BQU8sY0FBYyxDQUNuQixJQUFJLENBQ0YsYUFBYSxDQUFDLHlCQUF5QixDQUFDLEVBQ3hDLFFBQVE7UUFDTixDQUFDLENBQUMsY0FBYyxDQUNaLElBQUksQ0FDRixhQUFhLENBQUMsb0JBQW9CLENBQUMsRUFDbkMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQy9CLENBQ0Y7UUFDSCxDQUFDLENBQUMsSUFBSSxFQUNSLE9BQU8sQ0FBQyxRQUFRO1FBQ2QsQ0FBQyxDQUFDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEVBQ2pDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FDdkMsQ0FDRjtRQUNILENBQUMsQ0FBQyxJQUFJLEVBRVIsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJO1FBQ3hCLENBQUMsQ0FBQyxjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNyQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUNoRCxDQUNGO1FBQ0gsQ0FBQyxDQUFDLElBQUksRUFDUixjQUFjLENBQ1osYUFBYSxFQUNiLElBQUksQ0FDRixhQUFhLENBQUMsVUFBVSxDQUFDLEVBQ3pCLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUM5QixZQUFZLENBQ1YsVUFBVSxFQUNWLDJFQUEyRSxDQUM1RSxFQUNELFlBQVksQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUNGLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjO0lBQzVCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM1RSxDQUFDO0FBRUQsd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxlQUFlLENBQUMsU0FBeUI7SUFDdkQsT0FBTyxJQUFJLENBQ1QsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEVBQ2xDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUM5QixjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFDMUIsb0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQ3JELEVBQ0QsSUFBSSxDQUNGLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMvQixXQUFXLENBQUMsbUJBQW1CLENBQUMsRUFDaEMsY0FBYyxDQUNaLElBQUksQ0FDRixhQUFhLENBQUMsVUFBVSxDQUFDLEVBQ3pCLFNBQVMsQ0FBQyxHQUFHO1FBQ1gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FDdkMsQ0FDRixDQUNGLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBbUI7SUFDaEQsd0VBQXdFO0lBQ3hFLE1BQU0sbUJBQW1CLEdBQWdCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDeEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUE7UUFDekMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtRQUN6QixJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDckMsV0FBVztZQUNULENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxXQUFXO1lBQ3hDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ2xELENBQUE7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLGFBQWEsR0FBRyxFQUFFLENBQUE7WUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtTQUN4QjtRQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDTixPQUFPLGNBQWMsQ0FDbkIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQ0YsYUFBYSxDQUFDLHlCQUF5QixDQUFDLEVBQ3hDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUM5QixjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFDekIsV0FBVyxDQUFDLHdCQUF3QixDQUFDLEVBQ3JDLFlBQVksQ0FDVixVQUFVLEVBQ1Ysa0ZBQWtGLENBQ25GLEVBQ0QsWUFBWSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQ2hELENBQ0YsRUFDRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNuQixDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLElBQUksRUFDUixjQUFjLENBQ1osR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxDQUNGLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFDNUIsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUNwQyxDQUNGLENBQ0YsQ0FDRixDQUNGLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFVBQXNCLEVBQ3RCLElBQW9DO0lBRXBDLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUN2QixPQUFPLElBQUksQ0FDVCxhQUFhLENBQUMseUJBQXlCLENBQUMsRUFDeEMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLEVBQ3pDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEVBQ25DLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxFQUN4QyxZQUFZLENBQ1YsVUFBVSxFQUNWLHFGQUFxRixDQUN0RixFQUNELFlBQVksQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQzVDLEVBQ0QsSUFBSSxDQUNGLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUNsQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQ3RDLENBQ0YsQ0FDRixDQUFBO0tBQ0Y7U0FBTSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQ1QsYUFBYSxDQUFDLHlCQUF5QixDQUFDLEVBQ3hDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUN0QyxjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUN0QyxXQUFXLENBQUMsd0JBQXdCLENBQUMsRUFDckMsWUFBWSxDQUNWLFVBQVUsRUFDVixrRkFBa0YsQ0FDbkYsRUFDRCxZQUFZLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLENBQ25ELEVBQ0QsSUFBSSxDQUNGLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNyQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQ3RDLENBQ0YsQ0FDRixDQUFBO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FDVCxhQUFhLENBQUMseUJBQXlCLENBQUMsRUFDeEMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQ2pDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEVBQ2xDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FDdEMsQ0FDRixDQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPLGNBQWMsQ0FDbkIsSUFBSSxDQUNGLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLEVBQzlDLFdBQVcsQ0FDVCxJQUFJLENBQ0Ysa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsbUJBQW1CLENBQUMsRUFDN0QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUM1QixDQUNGLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyxjQUFjLENBQ25CLElBQUksQ0FDRixtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxFQUM5QyxXQUFXLENBQ1QsSUFBSSxDQUNGLGtCQUFrQixDQUFDLDRCQUE0QixFQUFFLG1CQUFtQixDQUFDLEVBQ3JFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDNUIsQ0FDRixDQUNGLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE9BQU8sY0FBYyxDQUNuQixJQUFJLENBQ0YsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsRUFDOUMsV0FBVyxDQUNULElBQUksQ0FDRixrQkFBa0IsQ0FDaEIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qix3QkFBd0IsQ0FDekIsRUFDRCxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQ3hDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUNuQixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FDdkQsQ0FDRixDQUNGLENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYztJQUM1QixPQUFPLGNBQWMsQ0FDbkIsSUFBSSxDQUNGLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLEVBQzlDLFdBQVcsQ0FDVCxJQUFJLENBQ0Ysa0JBQWtCLENBQ2hCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsd0JBQXdCLENBQ3pCLEVBQ0QsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUN4QyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FDbkIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQ3RELENBQ0YsQ0FDRixDQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFtQjtJQUMvQyxPQUFPLElBQUksQ0FDVCxhQUFhLENBQUMseUJBQXlCLENBQUMsRUFDeEMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLEVBQ3RDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEVBQ3RDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxFQUNyQyxZQUFZLENBQ1YsVUFBVSxFQUNWLGtGQUFrRixDQUNuRixFQUNELFlBQVksQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQ3pDLEVBQ0QsSUFBSSxDQUNGLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUN0QyxXQUFXLENBQUMsd0JBQXdCLENBQUMsRUFDckMsWUFBWSxDQUNWLFVBQVUsRUFDVixrRkFBa0YsQ0FDbkYsRUFDRCxZQUFZLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLENBQ25ELEVBQ0QsSUFBSSxDQUNGLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNyQyxLQUFLLElBQUksT0FBTztRQUNkLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQ3ZDLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFBO0FBQzNELENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLFFBQWdCO0lBQ2xELE9BQU8sY0FBYyxDQUNuQixJQUFJLENBQ0YsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEVBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFDNUIsY0FBYyxDQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsRUFDL0QsSUFBSSxDQUNGLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFDNUIsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsbUVBQW1FO0tBQ2hHLENBQ0YsQ0FDRixDQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxPQUFPLElBQUksQ0FDVCxhQUFhLENBQUMsc0JBQXNCLENBQUMsRUFDckMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQ25DLENBQUE7QUFDSCxDQUFDO0FBRUQsMkJBQTJCO0FBQzNCLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsY0FBcUMsRUFDckMsY0FFOEM7SUFFOUMsSUFBSSxJQUFZLENBQUE7SUFDaEIsSUFBSSxZQUFvQixDQUFBO0lBQ3hCLElBQUksUUFBZ0IsQ0FBQTtJQUNwQixJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ3JDLElBQUksR0FBRyxjQUFjLENBQUMsbUJBQW1CLENBQUEsQ0FBQyxnREFBZ0Q7UUFDMUYsWUFBWSxHQUFHLFVBQVUsQ0FBQTtRQUN6QixRQUFRLEdBQUcsOEJBQThCLENBQUMsY0FBYyxDQUFDLENBQUE7S0FDMUQ7U0FBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO1FBQzdDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFBO1FBQzFCLFlBQVksR0FBRyxVQUFVLENBQUE7UUFDekIsUUFBUSxHQUFHLGNBQWMsQ0FBQTtLQUMxQjtTQUFNO1FBQ0wsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUE7UUFDMUIsWUFBWSxHQUFHLGFBQWEsQ0FBQTtRQUM1QixRQUFRLEdBQUcsVUFBVSxDQUFBO0tBQ3RCO0lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQzFDLElBQUksQ0FDRixhQUFhLENBQUMscUJBQXFCLENBQUMsRUFDcEMsV0FBVyxDQUFDLCtCQUErQixDQUFDLEVBQzVDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFDekIsV0FBVyxDQUFDLHVCQUF1QixDQUFDLEVBQ3BDLFlBQVksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQ2hDLGFBQWEsSUFBSSxjQUFjO1FBQzdCLENBQUMsQ0FBQyxjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNoQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQ2pELENBQ0Y7UUFDSCxDQUFDLENBQUMsSUFBSSxFQUNSLElBQUksS0FBSyxTQUFTO1FBQ2hCLENBQUMsQ0FBQyxjQUFjLENBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUM1RDtRQUNILENBQUMsQ0FBQyxJQUFJLEVBQ1IsY0FBYyxDQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsRUFDbkUsSUFBSSxDQUNGLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFDN0IsV0FBVyxDQUFDLDJCQUEyQixDQUFDLEVBQ3hDLFlBQVksQ0FDVixVQUFVLEVBQ1YscUZBQXFGLENBQ3RGLEVBQ0QsWUFBWSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FDNUMsQ0FDRixDQUNGLENBQ0YsQ0FBQTtJQUNELE9BQU8sSUFBSSxDQUNULFVBQVUsSUFBSSxjQUFjO1FBQzFCLENBQUMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUN6QyxDQUFDLENBQUMsSUFBSSxFQUNSLHFCQUFxQixDQUN0QixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTyxDQUFDLE1BQWtCLEVBQUUsRUFBRTtRQUM1QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDN0IsSUFBSSxPQUFPLEdBQUcsMkJBQTJCLENBQUE7UUFDekMsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sR0FBRyw4QkFBOEIsQ0FBQTtRQUNoRSxPQUFPLHVCQUF1QixDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNFLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxNQUFrQixFQUFFLEVBQUU7UUFDNUIsT0FBTyx1QkFBdUIsQ0FDNUIsc0JBQXNCLEVBQ3RCLHFCQUFxQixDQUN0QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ1gsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsTUFBcUIsRUFDckIsTUFBa0I7SUFFbEIsSUFBSSxDQUNGLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLEVBQ3ZDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUM5QyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBcUIsRUFBRSxNQUFrQjtJQUNqRSxJQUFJLENBQ0YsdUJBQXVCLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsRUFDakUsWUFBWSxDQUNWLFVBQVUsRUFDViw0RUFBNEUsQ0FDN0UsRUFDRCxZQUFZLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FDM0MsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQXFCLEVBQUUsTUFBa0I7SUFDbEUsSUFBSSxDQUNGLDBCQUEwQixFQUFFLEVBQzVCLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLENBQUMsRUFDdkUsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUNuQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBcUIsRUFBRSxNQUFrQjtJQUNyRSxJQUFJLENBQ0YsMEJBQTBCLEVBQUUsRUFDNUIsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEVBQ2pDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDdEMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQXFCLEVBQUUsTUFBa0I7SUFDbkUsSUFBSSxDQUNGLDBCQUEwQixFQUFFLEVBQzVCLHVCQUF1QixDQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxFQUM1RCxZQUFZLENBQ1YsVUFBVSxFQUNWLCtFQUErRSxDQUNoRixFQUNELFlBQVksQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUM5RCxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBcUIsRUFBRSxNQUFrQjtJQUNyRSxJQUFJLENBQ0Ysb0JBQW9CLENBQUMsYUFBYSxDQUFDLEVBQ25DLGNBQWMsQ0FDWixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUNwRSxDQUNGLENBQ0YsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1QixvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUMxQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFDbkMsY0FBYyxDQUNaLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzVDLElBQUksQ0FDRixhQUFhLENBQUMsb0JBQW9CLENBQUMsRUFDbkMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQ2hDLENBQ0YsQ0FDRixDQUNGLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFxQixFQUFFLE1BQWtCO0lBQ3JFLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1QixjQUFjLEVBQUUsRUFDaEIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDaEMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQXFCLEVBQUUsTUFBa0I7SUFDbkUsSUFBSSxDQUNGLDBCQUEwQixFQUFFLEVBQzVCLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLEVBQ3pDLGNBQWMsQ0FDWixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxDQUNGLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUNsQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsRUFDdkMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUN0QixDQUNGLENBQ0YsQ0FDRixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBcUIsRUFBRSxNQUFrQjtJQUNyRSxJQUFJLENBQ0YsMEJBQTBCLEVBQUUsRUFDNUIsY0FBYyxFQUFFLEVBQ2hCLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQ3RELENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUFxQixFQUNyQixNQUFrQjtJQUVsQixJQUFJLENBQ0YsMEJBQTBCLEVBQUUsRUFDNUIsc0JBQXNCLEVBQUUsRUFDeEIsY0FBYyxDQUNaLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQ3BFLENBQ0YsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1Qix5QkFBeUIsRUFBRSxFQUMzQixjQUFjLENBQ1osR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FDMUUsQ0FDRixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsTUFBcUIsRUFDckIsTUFBa0I7SUFFbEIsSUFBSSxDQUNGLDBCQUEwQixFQUFFLEVBQzVCLHNCQUFzQixFQUFFLEVBQ3hCLGNBQWMsQ0FDWixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUNwRSxDQUNGLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUFxQixFQUNyQixNQUFrQjtJQUVsQixJQUFJLENBQ0YsMEJBQTBCLEVBQUUsRUFDNUIsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsRUFDNUMsaUJBQWlCLEVBQUUsRUFDbkIsaUJBQWlCLENBQUMsK0JBQStCLENBQUMsRUFDbEQsT0FBTyxNQUFNLENBQUMsZUFBZSxLQUFLLFFBQVE7UUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FDRixXQUFXLENBQUMscUNBQXFDLENBQUMsRUFDbEQsV0FBVyxDQUFDLHVCQUF1QixDQUFDLEVBQ3BDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQ3ZEO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FDRixXQUFXLENBQUMsbUNBQW1DLENBQUMsRUFDaEQsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLEVBQzlDLFlBQVksQ0FDVixVQUFVLEVBQ1YsMkZBQTJGLENBQzVGLEVBQ0QsWUFBWSxDQUNWLGVBQWUsRUFDZiwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQ3BELENBQ0YsQ0FDTixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFxQixFQUFFLE1BQWtCO0lBQzFFLElBQUksQ0FDRixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsRUFDbEMsaUJBQWlCLEVBQUUsRUFDbkIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FDcEMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLElBQTZDO0lBRTdDLE9BQU8sSUFBSSxDQUNULDBCQUEwQixFQUFFLEVBQzVCLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxFQUMxRCxjQUFjLENBQ1osSUFBSSxDQUNGLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUM5QixXQUFXLENBQ1QsSUFBSSxDQUNGLGlCQUFpQixDQUNmLGFBQWEsRUFDYixjQUFjLEVBQ2QscUJBQXFCLENBQ3RCLEVBQ0QsYUFBYSxDQUFDLGVBQWUsQ0FBQyxFQUM5QixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FDL0IsQ0FDRixDQUNGLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBVSxFQUNWLElBQTZDO0lBRTdDLE9BQU8sSUFBSSxDQUNULDBCQUEwQixFQUFFLEVBQzVCLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxFQUMxRCxjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFDekIsV0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUMxQixjQUFjLENBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDcEQsSUFBSSxDQUNGLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFDN0IsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEVBQ2xDLFlBQVksQ0FDVixVQUFVLEVBQ1YsK0VBQStFLENBQ2hGLEVBQ0QsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FDcEMsQ0FDRixDQUNGLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsTUFBcUIsRUFDckIsTUFBa0I7SUFFbEIsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1FBQUUsT0FBTTtJQUNuQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ2hFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtRQUFFLE9BQU07SUFDbkMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFxQixFQUNyQixNQUFrQjtJQUVsQixrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQjtRQUFFLE9BQU07SUFDckMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3JFLENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1Qix1QkFBdUIsQ0FDckIsK0JBQStCLEVBQy9CLHNDQUFzQyxDQUN2QyxFQUNELFlBQVksQ0FDVixVQUFVLEVBQ1YsZ0dBQWdHLENBQ2pHLEVBQ0QsWUFBWSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FDNUQsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1QixvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUMzQyxjQUFjLENBQ1osR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ25DLElBQUksQ0FDRixhQUFhLENBQUMscUJBQXFCLENBQUMsRUFDcEMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEVBQ25DLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUM3QixvQkFBb0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQzlDLENBQ0YsRUFDRCxhQUFhLElBQUksUUFBUTtRQUN2QixDQUFDLENBQUMsY0FBYyxDQUNaLElBQUksQ0FDRixhQUFhLENBQUMscUJBQXFCLENBQUMsRUFDcEMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUMzQyxDQUNGO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUNGLENBQ0YsQ0FDRixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBcUIsRUFBRSxNQUFrQjtJQUNwRSxJQUFJLENBQ0YsdUJBQXVCLENBQ3JCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixlQUFlLENBQ2hCLEVBQ0Qsb0JBQW9CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUNyQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxRQUF5QjtJQUNsRSxRQUFRLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUU7UUFDdkMsS0FBSyxLQUFLO1lBQ1IsT0FBTyxTQUFTLENBQUE7UUFDbEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxTQUFTLENBQUE7UUFDbEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxTQUFTLENBQUE7UUFDbEI7WUFDRSxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUE7S0FDM0I7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLGNBQXFDO0lBQ3hFLElBQUksVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUE7SUFDdEMsSUFBSSxjQUFjLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUN0QyxVQUFVLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUNsRCxRQUFRLEdBQUcsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDckQsWUFBWSxHQUFHLFVBQVUsQ0FBQTtLQUMxQjtTQUFNO1FBQ0wsVUFBVSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDMUMsWUFBWSxHQUFHLGFBQWEsQ0FBQTtRQUM1QixRQUFRLEdBQUcsVUFBVSxDQUFBO0tBQ3RCO0lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQzFDLElBQUksQ0FDRixhQUFhLENBQUMscUJBQXFCLENBQUMsRUFDcEMsV0FBVyxDQUFDLCtCQUErQixDQUFDLEVBQzVDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFDekIsV0FBVyxDQUFDLHVCQUF1QixDQUFDLEVBQ3BDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFDeEIsYUFBYSxJQUFJLGNBQWM7UUFDN0IsQ0FBQyxDQUFDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQ2hDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FDakQsQ0FDRjtRQUNILENBQUMsQ0FBQyxJQUFJLEVBQ1IsTUFBTSxJQUFJLGNBQWM7UUFDdEIsQ0FBQyxDQUFDLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUN6QixvQkFBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQzFDLENBQ0Y7UUFDSCxDQUFDLENBQUMsSUFBSSxFQUNSLGNBQWMsQ0FDWixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQ25FLElBQUksQ0FDRixhQUFhLENBQUMsY0FBYyxDQUFDLEVBQzdCLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxFQUN4QyxZQUFZLENBQ1YsVUFBVSxFQUNWLHFGQUFxRixDQUN0RixFQUNELFlBQVksQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQzVDLENBQ0YsQ0FDRixDQUNGLENBQUE7SUFDRCxPQUFPLElBQUksQ0FDVCxhQUFhLENBQUMsc0JBQXNCLENBQUMsRUFDckMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEVBQ2xDLHFCQUFxQixDQUN0QixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsTUFBcUIsRUFDckIsTUFBa0I7SUFFbEIsY0FBYyxDQUNaLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNsQyxJQUFJLENBQ0Ysc0JBQXNCLEVBQUUsRUFDeEIsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLENBQ3BELENBQ0YsQ0FDRixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsTUFBcUIsRUFDckIsTUFBa0I7SUFFbEIsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzdFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLHFCQUFxQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUM3Qiw0QkFBNEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDNUMsT0FBTTtLQUNQO0lBQ0QsNEJBQTRCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLE1BQXFCLEVBQ3JCLE1BQWtCO0lBRWxCLElBQUksQ0FDRiwwQkFBMEIsRUFBRSxFQUM1Qix1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEVBQ3RELG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLEVBQzNDLGNBQWMsQ0FDWixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDdkMsSUFBSSxDQUNGLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUNwQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsRUFDcEMsY0FBYyxDQUNaLE9BQU8sSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU07UUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FDRixhQUFhLENBQUMsWUFBWSxDQUFDLEVBQzNCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM3QixjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUNsQyxJQUFJLENBQ0YsTUFBTSxDQUFDLEtBQUs7WUFDVixDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLENBQ3JELENBQ0YsRUFDRCxJQUFJLENBQ0YsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQ2hDLElBQUksQ0FDRixNQUFNLENBQUMsR0FBRztZQUNSLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDbEQsQ0FBQyxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLENBQUMsQ0FDckQsQ0FDRixDQUNGLENBQ0Y7UUFDSCxDQUFDLENBQUMsSUFBSSxDQUNGLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFDM0IsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQzlCLGNBQWMsQ0FDWixJQUFJLENBQ0YsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEVBQ2pDLElBQUksQ0FDRixNQUFNLENBQUMsS0FBSztZQUNWLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLENBQUMsQ0FDckQsQ0FDRixDQUNGLENBQ0YsQ0FDTixDQUNGLENBQ0YsQ0FDRixDQUNGLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQXFCLEVBQUUsTUFBa0I7SUFDM0UsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFFBQW1CLEVBQUUsRUFBRTtRQUNwRCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFCLE9BQU8sSUFBSSxDQUNULGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUN2QyxjQUFjLENBQ1osSUFBSSxDQUNGLGFBQWEsQ0FBQyxhQUFhLENBQUMsRUFDNUIsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUM5QyxDQUNGLENBQ0YsQ0FBQTtJQUNILENBQUMsQ0FBQTtJQUVELE1BQU0sMkJBQTJCLEdBQUcsQ0FDbEMsSUFBdUMsRUFDdkMsRUFBRTtRQUNGLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDdEIsT0FBTyxJQUFJLENBQ1QsYUFBYSxDQUFDLDhCQUE4QixDQUFDLEVBQzdDLGNBQWMsQ0FDWixJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JFLENBQ0YsQ0FBQTtJQUNILENBQUMsQ0FBQTtJQUVELE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxXQUFvQixFQUFFLEVBQUU7UUFDM0QsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUM3QixPQUFPLElBQUksQ0FDVCxhQUFhLENBQUMsOEJBQThCLENBQUMsRUFDN0MsV0FBVyxDQUFDLDBCQUEwQixDQUFDLEVBQ3ZDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUNoQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQ3ZCLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUNsQyxDQUFBO0lBQ0gsQ0FBQyxDQUFBO0lBRUQsSUFBSSxDQUNGLDBCQUEwQixFQUFFLEVBQzVCLHVCQUF1QixDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsRUFDdEQsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsRUFDN0MsY0FBYyxDQUNaLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQ0YsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEVBQ3RDLGNBQWMsQ0FDWixxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ3RDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDeEMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUNoRCxDQUNGLENBQ0YsQ0FDRixDQUNGLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2F0YWxvZ1JlY29yZCxcbiAgQ29uc3RyYWludCxcbiAgRGF0YXNldE9ubGluZVJlc291cmNlLFxuICBEYXRhc2V0UmVjb3JkLFxuICBEYXRhc2V0U2VydmljZURpc3RyaWJ1dGlvbixcbiAgSW5kaXZpZHVhbCxcbiAgS2V5d29yZCxcbiAgUmVjb3JkU3RhdHVzLFxuICBSb2xlLFxuICBTZXJ2aWNlRW5kcG9pbnQsXG4gIFNlcnZpY2VPbmxpbmVSZXNvdXJjZSxcbiAgU2VydmljZVJlY29yZCxcbiAgVXBkYXRlRnJlcXVlbmN5Q29kZSxcbiAgVXBkYXRlRnJlcXVlbmN5Q3VzdG9tLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5pbXBvcnQgeyBUaGVzYXVydXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL2RvbWFpbi9zcmMvbGliL21vZGVsL3RoZXNhdXJ1cydcbmltcG9ydCBmb3JtYXQgZnJvbSAnZGF0ZS1mbnMvZm9ybWF0J1xuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICdnZW9qc29uJ1xuaW1wb3J0IHtcbiAgQ2hhaW5hYmxlRnVuY3Rpb24sXG4gIGZpbHRlckFycmF5LFxuICBtYXAsXG4gIG1hcEFycmF5LFxuICBub29wLFxuICBwaXBlLFxuICB0YXAsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHtcbiAgYWRkQXR0cmlidXRlLFxuICBhcHBlbmRDaGlsZHJlbixcbiAgY3JlYXRlQ2hpbGQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGZpbmRDaGlsZE9yQ3JlYXRlLFxuICBmaW5kQ2hpbGRyZW5FbGVtZW50LFxuICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSxcbiAgZmluZE5lc3RlZEVsZW1lbnQsXG4gIGZpbmROZXN0ZWRFbGVtZW50cyxcbiAgcmVhZEF0dHJpYnV0ZSxcbiAgcmVtb3ZlQWxsQ2hpbGRyZW4sXG4gIHJlbW92ZUNoaWxkcmVuLFxuICByZW1vdmVDaGlsZHJlbkJ5TmFtZSxcbiAgc2V0VGV4dENvbnRlbnQsXG4gIFhtbEVsZW1lbnQsXG59IGZyb20gJy4uL3htbC11dGlscydcbmltcG9ydCB7IHJlYWRLaW5kIH0gZnJvbSAnLi9yZWFkLXBhcnRzJ1xuaW1wb3J0IHsgd3JpdGVHZW9tZXRyeSB9IGZyb20gJy4vdXRpbHMvZ2VvbWV0cnknXG5pbXBvcnQgeyBuYW1lUGFydHNUb0Z1bGwgfSBmcm9tICcuL3V0aWxzL2luZGl2aWR1YWwtbmFtZSdcblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKFxuICB0ZXh0OiBzdHJpbmdcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHRhcChcbiAgICBwaXBlKGZpbmRDaGlsZE9yQ3JlYXRlKCdnY286Q2hhcmFjdGVyU3RyaW5nJyksIHNldFRleHRDb250ZW50KHRleHQpKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpbmthZ2UoXG4gIHVybDogVVJMXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShcbiAgICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6bGlua2FnZScsICdnbWQ6VVJMJyksXG4gICAgICBzZXRUZXh0Q29udGVudCh1cmwudG9TdHJpbmcoKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQW5jaG9yKFxuICB1cmw6IFVSTCxcbiAgdGV4dD86IHN0cmluZ1xuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gdGFwKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ214OkFuY2hvcicpLFxuICAgICAgYWRkQXR0cmlidXRlKCd4bGluazpocmVmJywgdXJsLnRvU3RyaW5nKCkpLFxuICAgICAgdGV4dCA/IHNldFRleHRDb250ZW50KHRleHQpIDogbm9vcFxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEYXRlVGltZShcbiAgZGF0ZTogRGF0ZVxuKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgWG1sRWxlbWVudD4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRPckNyZWF0ZSgnZ2NvOkRhdGVUaW1lJyksXG4gICAgc2V0VGV4dENvbnRlbnQoZm9ybWF0KGRhdGUsIFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzXCIpKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURhdGUoXG4gIGRhdGU6IERhdGVcbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFhtbEVsZW1lbnQ+IHtcbiAgcmV0dXJuIHRhcChcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkT3JDcmVhdGUoJ2djbzpEYXRlJyksXG4gICAgICBzZXRUZXh0Q29udGVudChmb3JtYXQoZGF0ZSwgJ3l5eXktTU0tZGQnKSlcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGVjaW1hbChcbiAgZGVjaW1hbDogbnVtYmVyXG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PiB7XG4gIHJldHVybiB0YXAoXG4gICAgcGlwZShmaW5kQ2hpbGRPckNyZWF0ZSgnZ2NvOkRlY2ltYWwnKSwgc2V0VGV4dENvbnRlbnQoZGVjaW1hbC50b1N0cmluZygpKSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NDb2RlKHN0YXR1czogUmVjb3JkU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgcmV0dXJuICdjb21wbGV0ZWQnXG4gICAgY2FzZSAnZGVwcmVjYXRlZCc6XG4gICAgICByZXR1cm4gJ2RlcHJlY2F0ZWQnXG4gICAgY2FzZSAnb25nb2luZyc6XG4gICAgICByZXR1cm4gJ29uR29pbmcnXG4gICAgY2FzZSAncmVtb3ZlZCc6XG4gICAgICByZXR1cm4gJ3JlbW92ZWQnXG4gICAgY2FzZSAndW5kZXJfZGV2ZWxvcG1lbnQnOlxuICAgICAgcmV0dXJuICd1bmRlckRldmVsb3BtZW50J1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2dyZXNzIGNvZGUgZnJvbSBzdGF0dXM6ICR7c3RhdHVzfWBcbiAgICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZUNvZGUocm9sZTogUm9sZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAocm9sZSkge1xuICAgIGNhc2UgJ2F1dGhvcic6XG4gICAgICByZXR1cm4gJ2F1dGhvcidcbiAgICBjYXNlICdjb2xsYWJvcmF0b3InOlxuICAgICAgcmV0dXJuICdjb2xsYWJvcmF0b3InXG4gICAgY2FzZSAnY29udHJpYnV0b3InOlxuICAgICAgcmV0dXJuICdjb250cmlidXRvcidcbiAgICBjYXNlICdjdXN0b2RpYW4nOlxuICAgICAgcmV0dXJuICdjdXN0b2RpYW4nXG4gICAgY2FzZSAnZGlzdHJpYnV0b3InOlxuICAgICAgcmV0dXJuICdkaXN0cmlidXRvcidcbiAgICBjYXNlICdlZGl0b3InOlxuICAgICAgcmV0dXJuICdlZGl0b3InXG4gICAgY2FzZSAnZnVuZGVyJzpcbiAgICAgIHJldHVybiAnZnVuZGVyJ1xuICAgIGNhc2UgJ21lZGlhdG9yJzpcbiAgICAgIHJldHVybiAnbWVkaWF0b3InXG4gICAgY2FzZSAnb3JpZ2luYXRvcic6XG4gICAgICByZXR1cm4gJ29yaWdpbmF0b3InXG4gICAgY2FzZSAnb3RoZXInOlxuICAgICAgcmV0dXJuICdvdGhlcidcbiAgICBjYXNlICdvd25lcic6XG4gICAgICByZXR1cm4gJ293bmVyJ1xuICAgIGNhc2UgJ3BvaW50X29mX2NvbnRhY3QnOlxuICAgICAgcmV0dXJuICdwb2ludE9mQ29udGFjdCdcbiAgICBjYXNlICdwcmluY2lwYWxfaW52ZXN0aWdhdG9yJzpcbiAgICAgIHJldHVybiAncHJpbmNpcGFsSW52ZXN0aWdhdG9yJ1xuICAgIGNhc2UgJ3Byb2Nlc3Nvcic6XG4gICAgICByZXR1cm4gJ3Byb2Nlc3NvcidcbiAgICBjYXNlICdwdWJsaXNoZXInOlxuICAgICAgcmV0dXJuICdwdWJsaXNoZXInXG4gICAgY2FzZSAncmVzb3VyY2VfcHJvdmlkZXInOlxuICAgICAgcmV0dXJuICdyZXNvdXJjZVByb3ZpZGVyJ1xuICAgIGNhc2UgJ3JpZ2h0c19ob2xkZXInOlxuICAgICAgcmV0dXJuICdyaWdodHNIb2xkZXInXG4gICAgY2FzZSAnc3BvbnNvcic6XG4gICAgICByZXR1cm4gJ3Nwb25zb3InXG4gICAgY2FzZSAnc3Rha2Vob2xkZXInOlxuICAgICAgcmV0dXJuICdzdGFrZWhvbGRlcidcbiAgICBjYXNlICd1bnNwZWNpZmllZCc6XG4gICAgICByZXR1cm4gJ3Vuc3BlY2lmaWVkJ1xuICAgIGNhc2UgJ3VzZXInOlxuICAgICAgcmV0dXJuICd1c2VyJ1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcm9sZSBjb2RlIGZyb20gcm9sZTogJHtyb2xlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VEaXN0cmlidXRpb25Qcm90b2NvbChcbiAgZGlzdHJpYnV0aW9uOiBEYXRhc2V0U2VydmljZURpc3RyaWJ1dGlvblxuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChkaXN0cmlidXRpb24uYWNjZXNzU2VydmljZVByb3RvY29sLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd3ZnMnOlxuICAgICAgcmV0dXJuICdPR0M6V0ZTJ1xuICAgIGNhc2UgJ3dtcyc6XG4gICAgICByZXR1cm4gJ09HQzpXTVMnXG4gICAgY2FzZSAnd3BzJzpcbiAgICAgIHJldHVybiAnT0dDOldQUydcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbi5hY2Nlc3NTZXJ2aWNlUHJvdG9jb2xcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlKFxuICB1cGRhdGVGcmVxdWVuY3k6IFVwZGF0ZUZyZXF1ZW5jeUNvZGVcbik6IHN0cmluZyB8IG51bGwge1xuICBzd2l0Y2ggKHVwZGF0ZUZyZXF1ZW5jeSkge1xuICAgIGNhc2UgJ2FzTmVlZGVkJzpcbiAgICAgIHJldHVybiAnYXNOZWVkZWQnXG4gICAgY2FzZSAndW5rbm93bic6XG4gICAgICByZXR1cm4gJ3Vua25vd24nXG4gICAgY2FzZSAnaXJyZWd1bGFyJzpcbiAgICAgIHJldHVybiAnaXJyZWd1bGFyJ1xuICAgIGNhc2UgJ25vdFBsYW5uZWQnOlxuICAgICAgcmV0dXJuICdub3RQbGFubmVkJ1xuICAgIGNhc2UgJ2NvbnRpbnVhbCc6XG4gICAgICByZXR1cm4gJ2NvbnRpbnVhbCdcbiAgICBjYXNlICdwZXJpb2RpYyc6XG4gICAgICByZXR1cm4gJ3BlcmlvZGljJ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJU09EdXJhdGlvbih1cGRhdGVGcmVxdWVuY3k6IFVwZGF0ZUZyZXF1ZW5jeUN1c3RvbSk6IHN0cmluZyB7XG4gIGNvbnN0IGR1cmF0aW9uID0ge1xuICAgIHllYXJzOiAwLFxuICAgIG1vbnRoczogMCxcbiAgICB3ZWVrczogMCxcbiAgICBkYXlzOiAwLFxuICAgIGhvdXJzOiAwLFxuICB9XG4gIHN3aXRjaCAodXBkYXRlRnJlcXVlbmN5LnBlcikge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgICBpZiAodXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcyA8PSAxKSBkdXJhdGlvbi5kYXlzID0gMVxuICAgICAgZWxzZSBkdXJhdGlvbi5ob3VycyA9IE1hdGgucm91bmQoMjQgLyB1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICd3ZWVrJzpcbiAgICAgIGR1cmF0aW9uLmRheXMgPSBNYXRoLnJvdW5kKDcgLyB1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzIC0gMC4wMDAxKSAvLyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0ICcyIHRpbWVzIHBlciB3ZWVrJyA9ICdldmVyeSAzIGRheXMnXG4gICAgICBicmVha1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGlmICh1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzIDw9IDEpIGR1cmF0aW9uLm1vbnRocyA9IDFcbiAgICAgIGVsc2UgZHVyYXRpb24uZGF5cyA9IE1hdGgucm91bmQoMzAgLyB1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGlmICh1cGRhdGVGcmVxdWVuY3kudXBkYXRlZFRpbWVzIDw9IDEpIGR1cmF0aW9uLnllYXJzID0gMVxuICAgICAgZWxzZSBkdXJhdGlvbi5tb250aHMgPSBNYXRoLnJvdW5kKDEyIC8gdXBkYXRlRnJlcXVlbmN5LnVwZGF0ZWRUaW1lcylcbiAgICAgIGJyZWFrXG4gIH1cbiAgY29uc3QgaG91cnMgPSBkdXJhdGlvbi5ob3VycyA+IDAgPyBgVCR7ZHVyYXRpb24uaG91cnN9SGAgOiAnJ1xuICByZXR1cm4gYFAke2R1cmF0aW9uLnllYXJzfVkke2R1cmF0aW9uLm1vbnRoc31NJHtkdXJhdGlvbi5kYXlzfUQke2hvdXJzfWBcbn1cblxuZnVuY3Rpb24gYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0OiBJbmRpdmlkdWFsKSB7XG4gIGNvbnN0IGZ1bGxOYW1lID0gbmFtZVBhcnRzVG9GdWxsKGNvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lKVxuXG4gIGNvbnN0IGNyZWF0ZUFkZHJlc3MgPSBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDphZGRyZXNzJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9BZGRyZXNzJyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZWxlY3Ryb25pY01haWxBZGRyZXNzJyksXG4gICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QuZW1haWwpXG4gICAgICApXG4gICAgKSxcbiAgICBjb250YWN0LmFkZHJlc3NcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZWxpdmVyeVBvaW50JyksXG4gICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb250YWN0LmFkZHJlc3MpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUNvbnRhY3QgPSBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpjb250YWN0SW5mbycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfQ29udGFjdCcpLFxuICAgIGNvbnRhY3QucGhvbmVcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpwaG9uZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9UZWxlcGhvbmUnKSxcbiAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6dm9pY2UnKSxcbiAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QucGhvbmUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3AsXG4gICAgYXBwZW5kQ2hpbGRyZW4oY3JlYXRlQWRkcmVzcyksXG4gICAgY29udGFjdC5vcmdhbml6YXRpb24/LndlYnNpdGVcbiAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpvbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgICAgICAgd3JpdGVMaW5rYWdlKGNvbnRhY3Qub3JnYW5pemF0aW9uLndlYnNpdGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG5vb3BcbiAgKVxuXG4gIHJldHVybiBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknKSxcbiAgICAgIGZ1bGxOYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6aW5kaXZpZHVhbE5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoZnVsbE5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBjb250YWN0LnBvc2l0aW9uXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cG9zaXRpb25OYW1lJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnRhY3QucG9zaXRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG5cbiAgICAgIGNvbnRhY3Qub3JnYW5pemF0aW9uPy5uYW1lXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6b3JnYW5pc2F0aW9uTmFtZScpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb250YWN0Lm9yZ2FuaXphdGlvbi5uYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgOiBub29wLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIGNyZWF0ZUNvbnRhY3QsXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnJvbGUnKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX1JvbGVDb2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZ2V0Um9sZUNvZGUoY29udGFjdC5yb2xlKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlS2V5d29yZHMoKSB7XG4gIHJldHVybiByZW1vdmVDaGlsZHJlbihwaXBlKGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRlc2NyaXB0aXZlS2V5d29yZHMnKSkpXG59XG5cbi8vIHJldHVybnMgYSA8Z21kOnRoZXNhdXJ1c05hbWU+IGVsZW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUaGVzYXVydXModGhlc2F1cnVzOiBUaGVzYXVydXNNb2RlbCkge1xuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dGhlc2F1cnVzTmFtZScpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfQ2l0YXRpb24nKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp0aXRsZScpLFxuICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyh0aGVzYXVydXMubmFtZSB8fCB0aGVzYXVydXMuaWQpXG4gICAgICApLFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmlkZW50aWZpZXInKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9JZGVudGlmaWVyJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Y29kZScpLFxuICAgICAgICAgICAgdGhlc2F1cnVzLnVybFxuICAgICAgICAgICAgICA/IHdyaXRlQW5jaG9yKHRoZXNhdXJ1cy51cmwsIHRoZXNhdXJ1cy5pZClcbiAgICAgICAgICAgICAgOiB3cml0ZUNoYXJhY3RlclN0cmluZyh0aGVzYXVydXMuaWQpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRLZXl3b3JkcyhrZXl3b3JkczogS2V5d29yZFtdKSB7XG4gIC8vIGtleXdvcmRzIGFyZSBncm91cGVkIGJ5IHRoZXNhdXJ1cyBpZiB0aGV5IGhhdmUgb25lLCBvdGhlcndpc2UgYnkgdHlwZVxuICBjb25zdCBrZXl3b3Jkc0J5VGhlc2F1cnVzOiBLZXl3b3JkW11bXSA9IGtleXdvcmRzLnJlZHVjZSgoYWNjLCBrZXl3b3JkKSA9PiB7XG4gICAgY29uc3QgdGhlc2F1cnVzSWQgPSBrZXl3b3JkLnRoZXNhdXJ1cz8uaWRcbiAgICBjb25zdCB0eXBlID0ga2V5d29yZC50eXBlXG4gICAgbGV0IGV4aXN0aW5nR3JvdXAgPSBhY2MuZmluZCgoZ3JvdXApID0+XG4gICAgICB0aGVzYXVydXNJZFxuICAgICAgICA/IGdyb3VwWzBdLnRoZXNhdXJ1cz8uaWQgPT09IHRoZXNhdXJ1c0lkXG4gICAgICAgIDogZ3JvdXBbMF0udHlwZSA9PT0gdHlwZSAmJiAhZ3JvdXBbMF0udGhlc2F1cnVzXG4gICAgKVxuICAgIGlmICghZXhpc3RpbmdHcm91cCkge1xuICAgICAgZXhpc3RpbmdHcm91cCA9IFtdXG4gICAgICBhY2MucHVzaChleGlzdGluZ0dyb3VwKVxuICAgIH1cbiAgICBleGlzdGluZ0dyb3VwLnB1c2goa2V5d29yZClcbiAgICByZXR1cm4gYWNjXG4gIH0sIFtdKVxuICByZXR1cm4gYXBwZW5kQ2hpbGRyZW4oXG4gICAgLi4ua2V5d29yZHNCeVRoZXNhdXJ1cy5tYXAoKGtleXdvcmRzKSA9PlxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRlc2NyaXB0aXZlS2V5d29yZHMnKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9LZXl3b3JkcycpLFxuICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnR5cGUnKSxcbiAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfS2V5d29yZFR5cGVDb2RlJyksXG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX0tleXdvcmRUeXBlQ29kZSdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBrZXl3b3Jkc1swXS50eXBlKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAga2V5d29yZHNbMF0udGhlc2F1cnVzXG4gICAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihjcmVhdGVUaGVzYXVydXMoa2V5d29yZHNbMF0udGhlc2F1cnVzKSlcbiAgICAgICAgICA6IG5vb3AsXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIC4uLmtleXdvcmRzLm1hcCgoa2V5d29yZCkgPT5cbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDprZXl3b3JkJyksXG4gICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGtleXdvcmQubGFiZWwpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25zdHJhaW50KFxuICBjb25zdHJhaW50OiBDb25zdHJhaW50LFxuICB0eXBlOiAnbGVnYWwnIHwgJ3NlY3VyaXR5JyB8ICdvdGhlcidcbikge1xuICBpZiAodHlwZSA9PT0gJ3NlY3VyaXR5Jykge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfU2VjdXJpdHlDb25zdHJhaW50cycpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmNsYXNzaWZpY2F0aW9uJyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9DbGFzc2lmaWNhdGlvbkNvZGUnKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfQ2xhc3NpZmljYXRpb25Db2RlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ3Jlc3RyaWN0ZWQnKVxuICAgICAgICApLFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcoY29uc3RyYWludC50ZXh0KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsZWdhbCcpIHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpyZXNvdXJjZUNvbnN0cmFpbnRzJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnKSxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDphY2Nlc3NDb25zdHJhaW50cycpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsICdvdGhlclJlc3RyaWN0aW9ucycpXG4gICAgICAgICksXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhjb25zdHJhaW50LnRleHQpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfQ29uc3RyYWludHMnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGNvbnN0cmFpbnQudGV4dClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU90aGVyQ29uc3RyYWludHMoKSB7XG4gIHJldHVybiByZW1vdmVDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGZpbHRlckFycmF5KFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOk1EX0NvbnN0cmFpbnRzJywgJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgICAgICAgKGFycmF5KSA9PiBhcnJheS5sZW5ndGggPiAwXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVNlY3VyaXR5Q29uc3RyYWludHMoKSB7XG4gIHJldHVybiByZW1vdmVDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnKSxcbiAgICAgIGZpbHRlckFycmF5KFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOk1EX1NlY3VyaXR5Q29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICAgICAgICAoYXJyYXkpID0+IGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGVnYWxDb25zdHJhaW50cygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJyxcbiAgICAgICAgICAgICdnbWQ6YWNjZXNzQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICAgIChyZXN0cmljdGlvbkNvZGVzKSA9PlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25Db2Rlcy5ldmVyeSgoY29kZSkgPT4gY29kZSAhPT0gJ2xpY2Vuc2UnKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMaWNlbnNlcygpIHtcbiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgICAgZmlsdGVyQXJyYXkoXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJyxcbiAgICAgICAgICAgICdnbWQ6YWNjZXNzQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICAgIChyZXN0cmljdGlvbkNvZGVzKSA9PlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25Db2Rlcy5zb21lKChjb2RlKSA9PiBjb2RlID09PSAnbGljZW5zZScpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpY2Vuc2UobGljZW5zZTogQ29uc3RyYWludCkge1xuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmFjY2Vzc0NvbnN0cmFpbnRzJyksXG4gICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAnY29kZUxpc3QnLFxuICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX1Jlc3RyaWN0aW9uQ29kZSdcbiAgICAgICAgKSxcbiAgICAgICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgJ2xpY2Vuc2UnKVxuICAgICAgKSxcbiAgICAgIHBpcGUoXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDphY2Nlc3NDb25zdHJhaW50cycpLFxuICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZScpLFxuICAgICAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9SZXN0cmljdGlvbkNvZGUnXG4gICAgICAgICksXG4gICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsICdvdGhlclJlc3RyaWN0aW9ucycpXG4gICAgICApLFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgJ3VybCcgaW4gbGljZW5zZVxuICAgICAgICAgID8gd3JpdGVBbmNob3IobGljZW5zZS51cmwsIGxpY2Vuc2UudGV4dClcbiAgICAgICAgICA6IHdyaXRlQ2hhcmFjdGVyU3RyaW5nKGxpY2Vuc2UudGV4dClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9ubGluZVJlc291cmNlcygpIHtcbiAgcmV0dXJuIHBpcGUocmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpkaXN0cmlidXRpb25JbmZvJykpXG59XG5cbmZ1bmN0aW9uIGFwcGVuZE9ubGluZVJlc291cmNlRm9ybWF0KG1pbWVUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFwcGVuZENoaWxkcmVuKFxuICAgIHBpcGUoXG4gICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uRm9ybWF0JyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0Zvcm1hdCcpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcobWltZVR5cGUpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dmVyc2lvbicpLFxuICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKCcxLjAnKSAvLyBoYXJkY29kaW5nIHRoaXMgYXMgaXQgbW9zdCBsaWtlbHkgd29uJ3QgYmUgdXNlZCBidXQgaXMgbWFuZGF0b3J5XG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3RyaWJ1dGlvbkluZm8oKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkaXN0cmlidXRpb25JbmZvJyksXG4gICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaXN0cmlidXRpb24nKVxuICApXG59XG5cbi8vIGFwcGx5IHRvIE1EX0Rpc3RyaWJ1dGlvblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZE9ubGluZVJlc291cmNlKFxuICBvbmxpbmVSZXNvdXJjZTogRGF0YXNldE9ubGluZVJlc291cmNlLFxuICBhcHBlbmRGb3JtYXRGbjogKFxuICAgIG1pbWVUeXBlOiBzdHJpbmdcbiAgKSA9PiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBYbWxFbGVtZW50PlxuKSB7XG4gIGxldCBuYW1lOiBzdHJpbmdcbiAgbGV0IGZ1bmN0aW9uQ29kZTogc3RyaW5nXG4gIGxldCBwcm90b2NvbDogc3RyaW5nXG4gIGlmIChvbmxpbmVSZXNvdXJjZS50eXBlID09PSAnc2VydmljZScpIHtcbiAgICBuYW1lID0gb25saW5lUmVzb3VyY2UuaWRlbnRpZmllckluU2VydmljZSAvLyB0aGlzIGlzIGZvciBHZW9OZXR3b3JrIHRvIGtub3cgdGhlIGxheWVyIG5hbWVcbiAgICBmdW5jdGlvbkNvZGUgPSAnZG93bmxvYWQnXG4gICAgcHJvdG9jb2wgPSBnZXRTZXJ2aWNlRGlzdHJpYnV0aW9uUHJvdG9jb2wob25saW5lUmVzb3VyY2UpXG4gIH0gZWxzZSBpZiAob25saW5lUmVzb3VyY2UudHlwZSA9PT0gJ2Rvd25sb2FkJykge1xuICAgIG5hbWUgPSBvbmxpbmVSZXNvdXJjZS5uYW1lXG4gICAgZnVuY3Rpb25Db2RlID0gJ2Rvd25sb2FkJ1xuICAgIHByb3RvY29sID0gJ1dXVzpET1dOTE9BRCdcbiAgfSBlbHNlIHtcbiAgICBuYW1lID0gb25saW5lUmVzb3VyY2UubmFtZVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdpbmZvcm1hdGlvbidcbiAgICBwcm90b2NvbCA9ICdXV1c6TElOSydcbiAgfVxuICBjb25zdCBhcHBlbmRUcmFuc2Zlck9wdGlvbnMgPSBhcHBlbmRDaGlsZHJlbihcbiAgICBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpNRF9EaWdpdGFsVHJhbnNmZXJPcHRpb25zJyksXG4gICAgICBjcmVhdGVDaGlsZCgnZ21kOm9uTGluZScpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScpLFxuICAgICAgd3JpdGVMaW5rYWdlKG9ubGluZVJlc291cmNlLnVybCksXG4gICAgICAnZGVzY3JpcHRpb24nIGluIG9ubGluZVJlc291cmNlXG4gICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGVzY3JpcHRpb24nKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob25saW5lUmVzb3VyY2UuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBuYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcobmFtZSkpXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vb3AsXG4gICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSwgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocHJvdG9jb2wpKSxcbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdCcsXG4gICAgICAgICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNDSV9PbkxpbmVGdW5jdGlvbkNvZGUnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhZGRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnLCBmdW5jdGlvbkNvZGUpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgJ21pbWVUeXBlJyBpbiBvbmxpbmVSZXNvdXJjZVxuICAgICAgPyBhcHBlbmRGb3JtYXRGbihvbmxpbmVSZXNvdXJjZS5taW1lVHlwZSlcbiAgICAgIDogbm9vcCxcbiAgICBhcHBlbmRUcmFuc2Zlck9wdGlvbnNcbiAgKVxufVxuXG4vKipcbiAqIExvb2tzIGZvciBzcnY6U1ZfU2VydmljZUlkZW50aWZpY2F0aW9uIG9yIGdtZDpNRF9EYXRhSWRlbnRpZmljYXRpb24gZWxlbWVudFxuICogZGVwZW5kaW5nIG9uIHJlY29yZCB0eXBlLCBjcmVhdGUgaWYgbWlzc2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSB7XG4gIHJldHVybiAocm9vdEVsOiBYbWxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgICBsZXQgZWx0TmFtZSA9ICdnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uJ1xuICAgIGlmIChraW5kID09PSAnc2VydmljZScpIGVsdE5hbWUgPSAnc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbidcbiAgICByZXR1cm4gZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDppZGVudGlmaWNhdGlvbkluZm8nLCBlbHROYW1lKShyb290RWwpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPckNyZWF0ZURpc3RyaWJ1dGlvbigpIHtcbiAgcmV0dXJuIChyb290RWw6IFhtbEVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLFxuICAgICAgJ2dtZDpNRF9EaXN0cmlidXRpb24nXG4gICAgKShyb290RWwpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVW5pcXVlSWRlbnRpZmllcihcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZmlsZUlkZW50aWZpZXInKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQudW5pcXVlSWRlbnRpZmllcilcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUtpbmQocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmhpZXJhcmNoeUxldmVsJywgJ2dtZDpNRF9TY29wZUNvZGUnKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfU2NvcGVDb2RlJ1xuICAgICksXG4gICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgcmVjb3JkLmtpbmQpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVUaXRsZShyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcocmVjb3JkLnRpdGxlKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQWJzdHJhY3QocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6YWJzdHJhY3QnKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQuYWJzdHJhY3QpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVTdGF0dXMocmVjb3JkOiBEYXRhc2V0UmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6c3RhdHVzJywgJ2dtZDpNRF9Qcm9ncmVzc0NvZGUnKSxcbiAgICBhZGRBdHRyaWJ1dGUoXG4gICAgICAnY29kZUxpc3QnLFxuICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjTURfUHJvZ3Jlc3NDb2RlJ1xuICAgICksXG4gICAgYWRkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJywgZ2V0UHJvZ3Jlc3NDb2RlKHJlY29yZC5zdGF0dXMpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQ29udGFjdHMocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmNvbnRhY3QnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5jb250YWN0cy5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOmNvbnRhY3QnKSwgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0KSlcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb250YWN0c0ZvclJlc291cmNlKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgcmVtb3ZlQ2hpbGRyZW5CeU5hbWUoJ2dtZDpjb250YWN0JyksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQuY29udGFjdHNGb3JSZXNvdXJjZS5tYXAoKGNvbnRhY3QpID0+XG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JyksXG4gICAgICAgICAgYXBwZW5kUmVzcG9uc2libGVQYXJ0eShjb250YWN0KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlS2V5d29yZHMocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIHJlbW92ZUtleXdvcmRzKCksXG4gICAgYXBwZW5kS2V5d29yZHMocmVjb3JkLmtleXdvcmRzKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVG9waWNzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnRvcGljQ2F0ZWdvcnknKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC50b3BpY3MubWFwKCh0b3BpYykgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dG9waWNDYXRlZ29yeScpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfVG9waWNDYXRlZ29yeUNvZGUnKSxcbiAgICAgICAgICBzZXRUZXh0Q29udGVudCh0b3BpYylcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUxpY2Vuc2VzKHJlY29yZDogQ2F0YWxvZ1JlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMaWNlbnNlcygpLFxuICAgIGFwcGVuZENoaWxkcmVuKC4uLnJlY29yZC5saWNlbnNlcy5tYXAoY3JlYXRlTGljZW5zZSkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMZWdhbENvbnN0cmFpbnRzKFxuICByZWNvcmQ6IENhdGFsb2dSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVMZWdhbENvbnN0cmFpbnRzKCksXG4gICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAuLi5yZWNvcmQubGVnYWxDb25zdHJhaW50cy5tYXAoKGMpID0+IGNyZWF0ZUNvbnN0cmFpbnQoYywgJ2xlZ2FsJykpXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU2VjdXJpdHlDb25zdHJhaW50cyhcbiAgcmVjb3JkOiBDYXRhbG9nUmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgcmVtb3ZlU2VjdXJpdHlDb25zdHJhaW50cygpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLnNlY3VyaXR5Q29uc3RyYWludHMubWFwKChjKSA9PiBjcmVhdGVDb25zdHJhaW50KGMsICdzZWN1cml0eScpKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU90aGVyQ29uc3RyYWludHMoXG4gIHJlY29yZDogQ2F0YWxvZ1JlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIHJlbW92ZU90aGVyQ29uc3RyYWludHMoKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5vdGhlckNvbnN0cmFpbnRzLm1hcCgoYykgPT4gY3JlYXRlQ29uc3RyYWludChjLCAnb3RoZXInKSlcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVVcGRhdGVGcmVxdWVuY3koXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6cmVzb3VyY2VNYWludGVuYW5jZScpLFxuICAgIHJlbW92ZUFsbENoaWxkcmVuKCksXG4gICAgZmluZENoaWxkT3JDcmVhdGUoJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJyksXG4gICAgdHlwZW9mIHJlY29yZC51cGRhdGVGcmVxdWVuY3kgPT09ICdvYmplY3QnXG4gICAgICA/IHBpcGUoXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDp1c2VyRGVmaW5lZE1haW50ZW5hbmNlRnJlcXVlbmN5JyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2d0czpUTV9QZXJpb2REdXJhdGlvbicpLFxuICAgICAgICAgIHNldFRleHRDb250ZW50KGdldElTT0R1cmF0aW9uKHJlY29yZC51cGRhdGVGcmVxdWVuY3kpKVxuICAgICAgICApXG4gICAgICA6IHBpcGUoXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDptYWludGVuYW5jZUFuZFVwZGF0ZUZyZXF1ZW5jeScpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfTWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI01EX01haW50ZW5hbmNlRnJlcXVlbmN5Q29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdjb2RlTGlzdFZhbHVlJyxcbiAgICAgICAgICAgIGdldE1haW50ZW5hbmNlRnJlcXVlbmN5Q29kZShyZWNvcmQudXBkYXRlRnJlcXVlbmN5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmVjb3JkVXBkYXRlZChyZWNvcmQ6IENhdGFsb2dSZWNvcmQsIHJvb3RFbDogWG1sRWxlbWVudCkge1xuICBwaXBlKFxuICAgIGZpbmRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZGF0ZVN0YW1wJyksXG4gICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKSxcbiAgICB3cml0ZURhdGVUaW1lKHJlY29yZC5yZWNvcmRVcGRhdGVkKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVJlc291cmNlRGF0ZShcbiAgdHlwZTogJ3JldmlzaW9uJyB8ICdjcmVhdGlvbicgfCAncHVibGljYXRpb24nXG4pIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmNpdGF0aW9uJywgJ2dtZDpDSV9DaXRhdGlvbicpLFxuICAgIHJlbW92ZUNoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6ZGF0ZScpLFxuICAgICAgICBmaWx0ZXJBcnJheShcbiAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAgICAgICAgICdnbWQ6Q0lfRGF0ZScsXG4gICAgICAgICAgICAgICdnbWQ6ZGF0ZVR5cGUnLFxuICAgICAgICAgICAgICAnZ21kOkNJX0RhdGVUeXBlQ29kZSdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgICAgICAgICBtYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHlwZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFJlc291cmNlRGF0ZShcbiAgZGF0ZTogRGF0ZSxcbiAgdHlwZTogJ3JldmlzaW9uJyB8ICdjcmVhdGlvbicgfCAncHVibGljYXRpb24nXG4pIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkQ2hpbGRPckNyZWF0ZSgnZ21kOmNpdGF0aW9uJywgJ2dtZDpDSV9DaXRhdGlvbicpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgcGlwZShcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOmRhdGUnKSxcbiAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9EYXRlJyksXG4gICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOmRhdGUnKSwgd3JpdGVEYXRlVGltZShkYXRlKSksXG4gICAgICAgICAgcGlwZShcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkYXRlVHlwZScpLFxuICAgICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpDSV9EYXRlVHlwZUNvZGUnKSxcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTkxMzkvcmVzb3VyY2VzL2dteENvZGVsaXN0cy54bWwjQ0lfRGF0ZVR5cGVDb2RlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIHR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVJlc291cmNlQ3JlYXRlZChcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICByZW1vdmVSZXNvdXJjZURhdGUoJ2NyZWF0aW9uJykocm9vdEVsKVxuICBpZiAoIXJlY29yZC5yZXNvdXJjZUNyZWF0ZWQpIHJldHVyblxuICBhcHBlbmRSZXNvdXJjZURhdGUocmVjb3JkLnJlc291cmNlQ3JlYXRlZCwgJ2NyZWF0aW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVSZXNvdXJjZVVwZGF0ZWQoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcmVtb3ZlUmVzb3VyY2VEYXRlKCdyZXZpc2lvbicpKHJvb3RFbClcbiAgaWYgKCFyZWNvcmQucmVzb3VyY2VVcGRhdGVkKSByZXR1cm5cbiAgYXBwZW5kUmVzb3VyY2VEYXRlKHJlY29yZC5yZXNvdXJjZVVwZGF0ZWQsICdyZXZpc2lvbicpKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUmVzb3VyY2VQdWJsaXNoZWQoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcmVtb3ZlUmVzb3VyY2VEYXRlKCdwdWJsaWNhdGlvbicpKHJvb3RFbClcbiAgaWYgKCFyZWNvcmQucmVzb3VyY2VQdWJsaXNoZWQpIHJldHVyblxuICBhcHBlbmRSZXNvdXJjZURhdGUocmVjb3JkLnJlc291cmNlUHVibGlzaGVkLCAncHVibGljYXRpb24nKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVNwYXRpYWxSZXByZXNlbnRhdGlvbihcbiAgcmVjb3JkOiBEYXRhc2V0UmVjb3JkLFxuICByb290RWw6IFhtbEVsZW1lbnRcbikge1xuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOnNwYXRpYWxSZXByZXNlbnRhdGlvblR5cGUnLFxuICAgICAgJ2dtZDpNRF9TcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlQ29kZSdcbiAgICApLFxuICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICdjb2RlTGlzdCcsXG4gICAgICAnaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTEzOS9yZXNvdXJjZXMvZ214Q29kZWxpc3RzLnhtbCNNRF9TcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlQ29kZSdcbiAgICApLFxuICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIHJlY29yZC5zcGF0aWFsUmVwcmVzZW50YXRpb24pXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVHcmFwaGljT3ZlcnZpZXdzKFxuICByZWNvcmQ6IERhdGFzZXRSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIHBpcGUoXG4gICAgZmluZE9yQ3JlYXRlSWRlbnRpZmljYXRpb24oKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOmdyYXBoaWNPdmVydmlldycpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLm92ZXJ2aWV3cy5tYXAoKG92ZXJ2aWV3KSA9PlxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpncmFwaGljT3ZlcnZpZXcnKSxcbiAgICAgICAgICBjcmVhdGVDaGlsZCgnZ21kOk1EX0Jyb3dzZUdyYXBoaWMnKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpmaWxlTmFtZScpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvdmVydmlldy51cmwudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgICdkZXNjcmlwdGlvbicgaW4gb3ZlcnZpZXdcbiAgICAgICAgICAgID8gYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpmaWxlRGVzY3JpcHRpb24nKSxcbiAgICAgICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyU3RyaW5nKG92ZXJ2aWV3LmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBub29wXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVMaW5lYWdlKHJlY29yZDogRGF0YXNldFJlY29yZCwgcm9vdEVsOiBYbWxFbGVtZW50KSB7XG4gIHBpcGUoXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoXG4gICAgICAnZ21kOmRhdGFRdWFsaXR5SW5mbycsXG4gICAgICAnZ21kOkRRX0RhdGFRdWFsaXR5JyxcbiAgICAgICdnbWQ6bGluZWFnZScsXG4gICAgICAnZ21kOkxJX0xpbmVhZ2UnLFxuICAgICAgJ2dtZDpzdGF0ZW1lbnQnXG4gICAgKSxcbiAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhyZWNvcmQubGluZWFnZSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRW5kcG9pbnRQcm90b2NvbChlbmRwb2ludDogU2VydmljZUVuZHBvaW50KTogc3RyaW5nIHtcbiAgc3dpdGNoIChlbmRwb2ludC5wcm90b2NvbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnd2ZzJzpcbiAgICAgIHJldHVybiAnT0dDOldGUydcbiAgICBjYXNlICd3bXMnOlxuICAgICAgcmV0dXJuICdPR0M6V01TJ1xuICAgIGNhc2UgJ3dwcyc6XG4gICAgICByZXR1cm4gJ09HQzpXUFMnXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBlbmRwb2ludC5wcm90b2NvbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPbmxpbmVSZXNvdXJjZShvbmxpbmVSZXNvdXJjZTogU2VydmljZU9ubGluZVJlc291cmNlKSB7XG4gIGxldCBsaW5rYWdlVXJsLCBmdW5jdGlvbkNvZGUsIHByb3RvY29sXG4gIGlmIChvbmxpbmVSZXNvdXJjZS50eXBlID09PSAnZW5kcG9pbnQnKSB7XG4gICAgbGlua2FnZVVybCA9IG9ubGluZVJlc291cmNlLmVuZHBvaW50VXJsLnRvU3RyaW5nKClcbiAgICBwcm90b2NvbCA9IGdldFNlcnZpY2VFbmRwb2ludFByb3RvY29sKG9ubGluZVJlc291cmNlKVxuICAgIGZ1bmN0aW9uQ29kZSA9ICdkb3dubG9hZCdcbiAgfSBlbHNlIHtcbiAgICBsaW5rYWdlVXJsID0gb25saW5lUmVzb3VyY2UudXJsLnRvU3RyaW5nKClcbiAgICBmdW5jdGlvbkNvZGUgPSAnaW5mb3JtYXRpb24nXG4gICAgcHJvdG9jb2wgPSAnV1dXOkxJTksnXG4gIH1cbiAgY29uc3QgYXBwZW5kVHJhbnNmZXJPcHRpb25zID0gYXBwZW5kQ2hpbGRyZW4oXG4gICAgcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDp0cmFuc2Zlck9wdGlvbnMnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpvbkxpbmUnKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfT25saW5lUmVzb3VyY2UnKSxcbiAgICAgIHdyaXRlTGlua2FnZShsaW5rYWdlVXJsKSxcbiAgICAgICdkZXNjcmlwdGlvbicgaW4gb25saW5lUmVzb3VyY2VcbiAgICAgICAgPyBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhvbmxpbmVSZXNvdXJjZS5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIDogbm9vcCxcbiAgICAgICduYW1lJyBpbiBvbmxpbmVSZXNvdXJjZVxuICAgICAgICA/IGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOm5hbWUnKSxcbiAgICAgICAgICAgICAgd3JpdGVDaGFyYWN0ZXJTdHJpbmcob25saW5lUmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIDogbm9vcCxcbiAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDpwcm90b2NvbCcpLCB3cml0ZUNoYXJhY3RlclN0cmluZyhwcm90b2NvbCkpLFxuICAgICAgICBwaXBlKFxuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpmdW5jdGlvbicpLFxuICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Q0lfT25MaW5lRnVuY3Rpb25Db2RlJyksXG4gICAgICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAgICAgJ2NvZGVMaXN0JyxcbiAgICAgICAgICAgICdodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLzE5MTM5L3Jlc291cmNlcy9nbXhDb2RlbGlzdHMueG1sI0NJX09uTGluZUZ1bmN0aW9uQ29kZSdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFkZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScsIGZ1bmN0aW9uQ29kZSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKVxuICByZXR1cm4gcGlwZShcbiAgICBjcmVhdGVFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uSW5mbycpLFxuICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfRGlzdHJpYnV0aW9uJyksXG4gICAgYXBwZW5kVHJhbnNmZXJPcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZERhdGFzZXRPbmxpbmVSZXNvdXJjZXMoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgLi4ucmVjb3JkLm9ubGluZVJlc291cmNlcy5tYXAoKGQpID0+XG4gICAgICBwaXBlKFxuICAgICAgICBjcmVhdGVEaXN0cmlidXRpb25JbmZvKCksXG4gICAgICAgIGFwcGVuZE9ubGluZVJlc291cmNlKGQsIGFwcGVuZE9ubGluZVJlc291cmNlRm9ybWF0KVxuICAgICAgKVxuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRTZXJ2aWNlT25saW5lUmVzb3VyY2VzKFxuICByZWNvcmQ6IFNlcnZpY2VSZWNvcmQsXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKSB7XG4gIGFwcGVuZENoaWxkcmVuKC4uLnJlY29yZC5vbmxpbmVSZXNvdXJjZXMubWFwKGNyZWF0ZU9ubGluZVJlc291cmNlKSkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPbmxpbmVSZXNvdXJjZXMoXG4gIHJlY29yZDogQ2F0YWxvZ1JlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcmVtb3ZlT25saW5lUmVzb3VyY2VzKCkocm9vdEVsKVxuXG4gIGlmIChyZWNvcmQua2luZCA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgYXBwZW5kRGF0YXNldE9ubGluZVJlc291cmNlcyhyZWNvcmQsIHJvb3RFbClcbiAgICByZXR1cm5cbiAgfVxuICBhcHBlbmRTZXJ2aWNlT25saW5lUmVzb3VyY2VzKHJlY29yZCwgcm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVUZW1wb3JhbEV4dGVudHMoXG4gIHJlY29yZDogRGF0YXNldFJlY29yZCxcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pIHtcbiAgcGlwZShcbiAgICBmaW5kT3JDcmVhdGVJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRDaGlsZE9yQ3JlYXRlKCdnbWQ6ZXh0ZW50JywgJ2dtZDpFWF9FeHRlbnQnKSxcbiAgICByZW1vdmVDaGlsZHJlbkJ5TmFtZSgnZ21kOnRlbXBvcmFsRWxlbWVudCcpLFxuICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgLi4ucmVjb3JkLnRlbXBvcmFsRXh0ZW50cy5tYXAoKGV4dGVudCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6dGVtcG9yYWxFbGVtZW50JyksXG4gICAgICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpFWF9UZW1wb3JhbEV4dGVudCcpLFxuICAgICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgJ3N0YXJ0JyBpbiBleHRlbnQgJiYgJ2VuZCcgaW4gZXh0ZW50XG4gICAgICAgICAgICAgID8gcGlwZShcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpleHRlbnQnKSxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWw6VGltZVBlcmlvZCcpLFxuICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21sOmJlZ2luUG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0VGV4dENvbnRlbnQoZm9ybWF0KGV4dGVudC5zdGFydCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRBdHRyaWJ1dGUoJ2luZGV0ZXJtaW5hdGVQb3NpdGlvbicsICd1bmtub3duJylcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21sOmVuZFBvc2l0aW9uJyksXG4gICAgICAgICAgICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudC5lbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXRUZXh0Q29udGVudChmb3JtYXQoZXh0ZW50LmVuZCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRBdHRyaWJ1dGUoJ2luZGV0ZXJtaW5hdGVQb3NpdGlvbicsICd1bmtub3duJylcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogcGlwZShcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpleHRlbnQnKSxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUNoaWxkKCdnbWw6VGltZUluc3RhbnQnKSxcbiAgICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtbDp0aW1lUG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICBwaXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0VGV4dENvbnRlbnQoZm9ybWF0KGV4dGVudC5zdGFydCwgJ3l5eXktTU0tZGQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRBdHRyaWJ1dGUoJ2luZGV0ZXJtaW5hdGVQb3NpdGlvbicsICd1bmtub3duJylcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3BhdGlhbEV4dGVudHMocmVjb3JkOiBEYXRhc2V0UmVjb3JkLCByb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgY29uc3QgYXBwZW5kQm91bmRpbmdQb2x5Z29uID0gKGdlb21ldHJ5PzogR2VvbWV0cnkpID0+IHtcbiAgICBpZiAoIWdlb21ldHJ5KSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkVYX0JvdW5kaW5nUG9seWdvbicpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOnBvbHlnb24nKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbigoKSA9PiB3cml0ZUdlb21ldHJ5KGdlb21ldHJ5KSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGFwcGVuZEdlb2dyYXBoaWNCb3VuZGluZ0JveCA9IChcbiAgICBiYm94PzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbiAgKSA9PiB7XG4gICAgaWYgKCFiYm94KSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBwaXBlKFxuICAgICAgY3JlYXRlRWxlbWVudCgnZ21kOkVYX0dlb2dyYXBoaWNCb3VuZGluZ0JveCcpLFxuICAgICAgYXBwZW5kQ2hpbGRyZW4oXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOndlc3RCb3VuZExvbmdpdHVkZScpLCB3cml0ZURlY2ltYWwoYmJveFswXSkpLFxuICAgICAgICBwaXBlKGNyZWF0ZUVsZW1lbnQoJ2dtZDplYXN0Qm91bmRMb25naXR1ZGUnKSwgd3JpdGVEZWNpbWFsKGJib3hbMl0pKSxcbiAgICAgICAgcGlwZShjcmVhdGVFbGVtZW50KCdnbWQ6c291dGhCb3VuZExhdGl0dWRlJyksIHdyaXRlRGVjaW1hbChiYm94WzFdKSksXG4gICAgICAgIHBpcGUoY3JlYXRlRWxlbWVudCgnZ21kOm5vcnRoQm91bmRMYXRpdHVkZScpLCB3cml0ZURlY2ltYWwoYmJveFszXSkpXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgY29uc3QgYXBwZW5kR2VvZ3JhcGhpY0Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdGlvbikgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ2dtZDpFWF9HZW9ncmFwaGljRGVzY3JpcHRpb24nKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6Z2VvZ3JhcGhpY0lkZW50aWZpZXInKSxcbiAgICAgIGNyZWF0ZUNoaWxkKCdnbWQ6TURfSWRlbnRpZmllcicpLFxuICAgICAgY3JlYXRlQ2hpbGQoJ2dtZDpjb2RlJyksXG4gICAgICB3cml0ZUNoYXJhY3RlclN0cmluZyhkZXNjcmlwdGlvbilcbiAgICApXG4gIH1cblxuICBwaXBlKFxuICAgIGZpbmRPckNyZWF0ZUlkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZENoaWxkT3JDcmVhdGUoJ2dtZDpleHRlbnQnLCAnZ21kOkVYX0V4dGVudCcpLFxuICAgIHJlbW92ZUNoaWxkcmVuQnlOYW1lKCdnbWQ6Z2VvZ3JhcGhpY0VsZW1lbnQnKSxcbiAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgIC4uLnJlY29yZC5zcGF0aWFsRXh0ZW50cy5tYXAoKGV4dGVudCkgPT5cbiAgICAgICAgcGlwZShcbiAgICAgICAgICBjcmVhdGVFbGVtZW50KCdnbWQ6Z2VvZ3JhcGhpY0VsZW1lbnQnKSxcbiAgICAgICAgICBhcHBlbmRDaGlsZHJlbihcbiAgICAgICAgICAgIGFwcGVuZEJvdW5kaW5nUG9seWdvbihleHRlbnQuZ2VvbWV0cnkpLFxuICAgICAgICAgICAgYXBwZW5kR2VvZ3JhcGhpY0JvdW5kaW5nQm94KGV4dGVudC5iYm94KSxcbiAgICAgICAgICAgIGFwcGVuZEdlb2dyYXBoaWNEZXNjcmlwdGlvbihleHRlbnQuZGVzY3JpcHRpb24pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApKHJvb3RFbClcbn1cbiJdfQ==