@softheon/armature 10.45.3 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/assets/styles/material-overrides.scss +103 -88
  2. package/assets/styles/sof-styles.scss +442 -376
  3. package/esm2020/lib/alert-banner/alert-banner-api.mjs +10 -0
  4. package/esm2020/lib/alert-banner/alert-banner.module.mjs +41 -0
  5. package/esm2020/lib/alert-banner/components/alert-banner/alert-banner.component.mjs +83 -0
  6. package/esm2020/lib/alert-banner/models/alert-banner-config.mjs +2 -0
  7. package/esm2020/lib/alert-banner/models/alert-banner-context.mjs +2 -0
  8. package/esm2020/lib/alert-banner/models/constants.mjs +16 -0
  9. package/esm2020/lib/alert-banner/services/alert-banner.service.mjs +44 -0
  10. package/esm2020/lib/armature.module.mjs +176 -0
  11. package/esm2020/lib/base-components/base-component-api.mjs +9 -0
  12. package/esm2020/lib/base-components/base-component.module.mjs +93 -0
  13. package/esm2020/lib/base-components/sof-alert/sof-alert.component.mjs +79 -0
  14. package/esm2020/lib/base-components/sof-banner/sof-banner.component.mjs +49 -0
  15. package/esm2020/lib/base-components/sof-button-toggle-group/sof-button-toggle-group.component.mjs +188 -0
  16. package/esm2020/lib/base-components/sof-modal/sof-modal.component.mjs +58 -0
  17. package/esm2020/lib/base-components/sof-progress-bar/sof-progress-bar.component.mjs +79 -0
  18. package/esm2020/lib/component-save-print/components/component-save-print/component-save-print.component.mjs +91 -0
  19. package/esm2020/lib/component-save-print/services/component-save-print.service.mjs +30 -0
  20. package/esm2020/lib/component-save-print/sof-ar-component-save-print.module.mjs +32 -0
  21. package/esm2020/lib/core/client-generated/api/session.service.mjs +242 -0
  22. package/esm2020/lib/core/client-generated/configuration.mjs +59 -0
  23. package/esm2020/lib/core/client-generated/encoder.mjs +17 -0
  24. package/esm2020/lib/core/client-generated/model/applicationUserModel.mjs +20 -0
  25. package/esm2020/lib/core/client-generated/model/assertedUserModel.mjs +2 -0
  26. package/esm2020/lib/core/client-generated/model/brandingModel.mjs +2 -0
  27. package/esm2020/lib/core/client-generated/model/errorModel.mjs +13 -0
  28. package/esm2020/lib/core/client-generated/model/folderLink.mjs +13 -0
  29. package/esm2020/lib/core/client-generated/model/identityProfile.mjs +2 -0
  30. package/esm2020/lib/core/client-generated/model/models.mjs +20 -0
  31. package/esm2020/lib/core/client-generated/model/oAuthModel.mjs +13 -0
  32. package/esm2020/lib/core/client-generated/model/preferencesRow.mjs +13 -0
  33. package/esm2020/lib/core/client-generated/model/rolesRow.mjs +13 -0
  34. package/esm2020/lib/core/client-generated/model/sessionGetResponseModel.mjs +2 -0
  35. package/esm2020/lib/core/client-generated/model/sessionPostRequestModel.mjs +2 -0
  36. package/esm2020/lib/core/client-generated/model/sessionPostResponseModel.mjs +2 -0
  37. package/esm2020/lib/core/client-generated/model/sessionPutRequestModel.mjs +2 -0
  38. package/esm2020/lib/core/client-generated/model/sessionPutResponseModel.mjs +2 -0
  39. package/esm2020/lib/core/client-generated/model/sessionResponseModel.mjs +2 -0
  40. package/esm2020/lib/core/client-generated/model/settingsProfile.mjs +2 -0
  41. package/esm2020/lib/core/client-generated/model/themePaletteColorsModel.mjs +13 -0
  42. package/esm2020/lib/core/client-generated/model/themePaletteModel.mjs +2 -0
  43. package/esm2020/lib/core/client-generated/model/trackingModel.mjs +13 -0
  44. package/esm2020/lib/core/client-generated/model/validationRecordsRow.mjs +13 -0
  45. package/esm2020/lib/core/client-generated/variables.mjs +9 -0
  46. package/esm2020/lib/core/components/app-template/app-template.component.mjs +250 -0
  47. package/esm2020/lib/core/functions/guid.mjs +11 -0
  48. package/esm2020/lib/core/functions/naming-convention.mjs +33 -0
  49. package/esm2020/lib/core/initializer/abstract-startup-service.mjs +4 -0
  50. package/esm2020/lib/core/initializer/initializer.service.mjs +189 -0
  51. package/esm2020/lib/core/interceptors/armature-auth-token-append.interceptor.mjs +73 -0
  52. package/esm2020/lib/core/models/base-config.mjs +2 -0
  53. package/esm2020/lib/core/models/constants.mjs +13 -0
  54. package/esm2020/lib/core/models/data-store-config.mjs +4 -0
  55. package/esm2020/lib/core/models/header-config.mjs +2 -0
  56. package/esm2020/lib/core/models/http-verbs.mjs +9 -0
  57. package/esm2020/lib/core/models/navigation-config.mjs +2 -0
  58. package/esm2020/lib/core/models/oidc-auth-settings.mjs +2 -0
  59. package/esm2020/lib/core/models/route-path.mjs +7 -0
  60. package/esm2020/lib/core/models/session-config.mjs +4 -0
  61. package/esm2020/lib/core/models/styles.mjs +2 -0
  62. package/esm2020/lib/core/models/typed-session.mjs +4 -0
  63. package/esm2020/lib/core/models/user-entity-service-config.mjs +12 -0
  64. package/esm2020/lib/core/services/authorization.service.mjs +175 -0
  65. package/esm2020/lib/core/services/banner.service.mjs +43 -0
  66. package/esm2020/lib/core/services/base-config.service.mjs +32 -0
  67. package/esm2020/lib/core/services/custom-auth-config.service.mjs +4 -0
  68. package/esm2020/lib/core/services/default-config.service.mjs +19 -0
  69. package/esm2020/lib/core/services/session.service.mjs +385 -0
  70. package/esm2020/lib/core/services/user-entity.service.mjs +140 -0
  71. package/esm2020/lib/distributed-cache/client-generated/api/api.mjs +4 -0
  72. package/esm2020/lib/distributed-cache/client-generated/api/cache.service.mjs +213 -0
  73. package/esm2020/lib/distributed-cache/client-generated/configuration.mjs +59 -0
  74. package/esm2020/lib/distributed-cache/client-generated/encoder.mjs +17 -0
  75. package/esm2020/lib/distributed-cache/client-generated/model/cacheExpirationType.mjs +16 -0
  76. package/esm2020/lib/distributed-cache/client-generated/model/createCacheEntryRequestModel.mjs +2 -0
  77. package/esm2020/lib/distributed-cache/client-generated/model/models.mjs +5 -0
  78. package/esm2020/lib/distributed-cache/client-generated/model/retrieveCacheEntryResponseModel.mjs +13 -0
  79. package/esm2020/lib/distributed-cache/client-generated/model/updateCacheEntryRequestModel.mjs +13 -0
  80. package/esm2020/lib/distributed-cache/client-generated/variables.mjs +9 -0
  81. package/esm2020/lib/distributed-cache/distributed-cache-api.mjs +8 -0
  82. package/esm2020/lib/distributed-cache/distributed-cache.module.mjs +38 -0
  83. package/esm2020/lib/distributed-cache/models/constants.mjs +3 -0
  84. package/esm2020/lib/distributed-cache/models/policy-person.mjs +9 -0
  85. package/esm2020/lib/distributed-cache/services/server-cache.service.mjs +48 -0
  86. package/esm2020/lib/error/components/error-common/error-common.component.mjs +25 -0
  87. package/esm2020/lib/error/error-api.mjs +7 -0
  88. package/esm2020/lib/error/error.module.mjs +31 -0
  89. package/esm2020/lib/error/models/error-common-config.mjs +8 -0
  90. package/esm2020/lib/faq/components/faq/faq.component.mjs +40 -0
  91. package/esm2020/lib/faq/faq-api.mjs +8 -0
  92. package/esm2020/lib/faq/faq.module.mjs +41 -0
  93. package/esm2020/lib/faq/models/faq-config.mjs +4 -0
  94. package/esm2020/lib/faq/models/faq.mjs +8 -0
  95. package/esm2020/lib/footer/components/footer/footer.component.mjs +25 -0
  96. package/esm2020/lib/footer/components/site-map/site-map.component.mjs +25 -0
  97. package/esm2020/lib/footer/footer-api.mjs +10 -0
  98. package/esm2020/lib/footer/footer.module.mjs +45 -0
  99. package/esm2020/lib/footer/models/enum/site-map-direction.mjs +15 -0
  100. package/esm2020/lib/footer/models/footer-config.mjs +4 -0
  101. package/esm2020/lib/footer/models/site-map-models.mjs +2 -0
  102. package/esm2020/lib/forms/components/sof-address/sof-address.component.mjs +110 -0
  103. package/esm2020/lib/forms/directives/alphanumeric/alphanumeric.directive.mjs +78 -0
  104. package/esm2020/lib/forms/directives/input-trim/input-trim.directive.mjs +110 -0
  105. package/esm2020/lib/forms/directives/letters-only/letters-only.directive.mjs +72 -0
  106. package/esm2020/lib/forms/directives/numbers-only/numbers-only.directive.mjs +60 -0
  107. package/esm2020/lib/forms/forms-api.mjs +19 -0
  108. package/esm2020/lib/forms/forms.module.mjs +83 -0
  109. package/esm2020/lib/forms/models/address.mjs +2 -0
  110. package/esm2020/lib/forms/models/constants.mjs +10 -0
  111. package/esm2020/lib/forms/models/county.mjs +2 -0
  112. package/esm2020/lib/forms/models/enums/states.mjs +58 -0
  113. package/esm2020/lib/forms/pipes/phone-format.pipe.mjs +33 -0
  114. package/esm2020/lib/forms/services/alert.service.mjs +167 -0
  115. package/esm2020/lib/header/components/header/header.component.mjs +161 -0
  116. package/esm2020/lib/header/components/mobile-header-menu/mobile-header-menu.component.mjs +39 -0
  117. package/esm2020/lib/header/header-api.mjs +12 -0
  118. package/esm2020/lib/header/header.module.mjs +85 -0
  119. package/esm2020/lib/header/models/header-auth.settings.mjs +32 -0
  120. package/esm2020/lib/header/models/header-language.settings.mjs +2 -0
  121. package/esm2020/lib/header/models/header-theme.settings.mjs +2 -0
  122. package/esm2020/lib/header/models/header.settings.mjs +2 -0
  123. package/esm2020/lib/header/models/mobile-header-nav.settings.mjs +2 -0
  124. package/esm2020/lib/navigation/components/navigation/navigation.component.mjs +555 -0
  125. package/esm2020/lib/navigation/models/nav-theme.settings.mjs +2 -0
  126. package/esm2020/lib/navigation/models/nav.settings.mjs +2 -0
  127. package/esm2020/lib/navigation/models/navigation.mjs +2 -0
  128. package/esm2020/lib/navigation/navigation-api.mjs +9 -0
  129. package/esm2020/lib/navigation/navigation.module.mjs +126 -0
  130. package/esm2020/lib/oauth/models/constants.mjs +6 -0
  131. package/esm2020/lib/oauth/models/generated/accountManagementAssertionModel.mjs +2 -0
  132. package/esm2020/lib/oauth/models/generated/accountManagementRefreshRequestModel.mjs +2 -0
  133. package/esm2020/lib/oauth/models/generated/accountManagementResponseModel.mjs +2 -0
  134. package/esm2020/lib/oauth/models/generated/coverageDetail.mjs +19 -0
  135. package/esm2020/lib/oauth/models/generated/finance.mjs +13 -0
  136. package/esm2020/lib/oauth/models/generated/iSsoResponseModel.mjs +13 -0
  137. package/esm2020/lib/oauth/models/generated/iSsoResponseModelAccountManagementAssertionModel.mjs +2 -0
  138. package/esm2020/lib/oauth/models/generated/person.mjs +13 -0
  139. package/esm2020/lib/oauth/models/generated/policy.mjs +2 -0
  140. package/esm2020/lib/oauth/models/generated/refreshResponseModel.mjs +13 -0
  141. package/esm2020/lib/oauth/models/hybrid-saml-oauth-config.mjs +4 -0
  142. package/esm2020/lib/oauth/oauth-api.mjs +15 -0
  143. package/esm2020/lib/oauth/oauth.module.mjs +29 -0
  144. package/esm2020/lib/oauth/services/hybrid-saml-oauth.service.mjs +201 -0
  145. package/esm2020/lib/rbac/directives/rbac-action.directive.mjs +50 -0
  146. package/esm2020/lib/rbac/models/access-token-claims.mjs +23 -0
  147. package/esm2020/lib/rbac/models/constants.mjs +4 -0
  148. package/esm2020/lib/rbac/models/decoded-access-token.mjs +69 -0
  149. package/esm2020/lib/rbac/models/rbac-config.mjs +4 -0
  150. package/esm2020/lib/rbac/models/role-access.mjs +10 -0
  151. package/esm2020/lib/rbac/rbac-api.mjs +15 -0
  152. package/esm2020/lib/rbac/rbac.module.mjs +51 -0
  153. package/esm2020/lib/rbac/services/ar-role-nav.service.mjs +91 -0
  154. package/esm2020/lib/rbac/services/oauth2-role.service.mjs +114 -0
  155. package/esm2020/lib/rbac/services/role-nav.service.mjs +4 -0
  156. package/esm2020/lib/resize-panels/components/resize-panels/resize-panels.component.mjs +156 -0
  157. package/esm2020/lib/resize-panels/models/resize-event.mjs +2 -0
  158. package/esm2020/lib/resize-panels/resize-panels-api.mjs +5 -0
  159. package/esm2020/lib/resize-panels/resize-panels.module.mjs +23 -0
  160. package/esm2020/lib/rum/models/arm-error.mjs +29 -0
  161. package/esm2020/lib/rum/models/rum-config.mjs +4 -0
  162. package/esm2020/lib/rum/rum-api.mjs +10 -0
  163. package/esm2020/lib/rum/rum.module.mjs +48 -0
  164. package/esm2020/lib/rum/services/rum.service.mjs +115 -0
  165. package/esm2020/lib/rum/services/shared-error.service.mjs +45 -0
  166. package/esm2020/lib/rum/services/softheon-error-handler.service.mjs +76 -0
  167. package/esm2020/lib/saml/components/redirect-saml/redirect-saml.component.mjs +79 -0
  168. package/esm2020/lib/saml/models/i-saml-request.mjs +2 -0
  169. package/esm2020/lib/saml/models/i-saml-response.mjs +2 -0
  170. package/esm2020/lib/saml/models/redirect-saml-request.mjs +4 -0
  171. package/esm2020/lib/saml/models/sso-gateway-model.mjs +4 -0
  172. package/esm2020/lib/saml/saml-api.mjs +15 -0
  173. package/esm2020/lib/saml/saml.module.mjs +43 -0
  174. package/esm2020/lib/saml/services/entry/abstract-saml-entry.service.mjs +4 -0
  175. package/esm2020/lib/saml/services/entry/sso-gateway-entry.service.mjs +36 -0
  176. package/esm2020/lib/saml/services/send-off/abstract-saml.service.mjs +4 -0
  177. package/esm2020/lib/saml/services/send-off/saml.service.mjs +39 -0
  178. package/esm2020/lib/sof-pipe/constants/constants.mjs +17 -0
  179. package/esm2020/lib/sof-pipe/models/sof-date-pipe-format.mjs +2 -0
  180. package/esm2020/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.mjs +39 -0
  181. package/esm2020/lib/sof-pipe/pipes/sof-date/sof-date.pipe.mjs +59 -0
  182. package/esm2020/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.mjs +28 -0
  183. package/esm2020/lib/sof-pipe/sof-pipe.api.mjs +9 -0
  184. package/esm2020/lib/sof-pipe/sof-pipe.module.mjs +39 -0
  185. package/esm2020/lib/theming/directives/css-override.directive.mjs +69 -0
  186. package/esm2020/lib/theming/models/css-override.mjs +11 -0
  187. package/esm2020/lib/theming/services/theme.service.mjs +167 -0
  188. package/esm2020/lib/theming/theme-api.mjs +6 -0
  189. package/esm2020/lib/theming/theme.module.mjs +31 -0
  190. package/esm2020/public-api.mjs +48 -0
  191. package/esm2020/softheon-armature.mjs +5 -0
  192. package/fesm2015/softheon-armature.mjs +6767 -0
  193. package/fesm2015/softheon-armature.mjs.map +1 -0
  194. package/fesm2020/softheon-armature.mjs +6829 -0
  195. package/fesm2020/softheon-armature.mjs.map +1 -0
  196. package/index.d.ts +5 -0
  197. package/lib/alert-banner/alert-banner.module.d.ts +9 -0
  198. package/lib/alert-banner/components/alert-banner/alert-banner.component.d.ts +3 -0
  199. package/lib/alert-banner/services/alert-banner.service.d.ts +3 -0
  200. package/lib/armature.module.d.ts +15 -0
  201. package/lib/base-components/base-component.module.d.ts +24 -0
  202. package/lib/base-components/sof-alert/sof-alert.component.d.ts +3 -0
  203. package/lib/base-components/sof-banner/sof-banner.component.d.ts +3 -0
  204. package/lib/base-components/sof-button-toggle-group/sof-button-toggle-group.component.d.ts +3 -0
  205. package/lib/base-components/sof-modal/sof-modal.component.d.ts +3 -0
  206. package/lib/base-components/sof-progress-bar/sof-progress-bar.component.d.ts +3 -0
  207. package/lib/component-save-print/components/component-save-print/component-save-print.component.d.ts +3 -0
  208. package/lib/component-save-print/services/component-save-print.service.d.ts +3 -0
  209. package/lib/component-save-print/sof-ar-component-save-print.module.d.ts +6 -0
  210. package/lib/core/client-generated/api/session.service.d.ts +3 -11
  211. package/lib/core/components/app-template/app-template.component.d.ts +3 -0
  212. package/lib/core/initializer/initializer.service.d.ts +3 -0
  213. package/lib/core/interceptors/armature-auth-token-append.interceptor.d.ts +3 -0
  214. package/lib/core/models/http-verbs.d.ts +1 -1
  215. package/lib/core/services/authorization.service.d.ts +3 -0
  216. package/lib/core/services/banner.service.d.ts +3 -0
  217. package/lib/core/services/base-config.service.d.ts +3 -0
  218. package/lib/core/services/default-config.service.d.ts +3 -0
  219. package/lib/core/services/session.service.d.ts +3 -0
  220. package/lib/core/services/user-entity.service.d.ts +3 -0
  221. package/lib/distributed-cache/client-generated/api/cache.service.d.ts +3 -11
  222. package/lib/distributed-cache/client-generated/model/cacheExpirationType.d.ts +1 -1
  223. package/lib/distributed-cache/distributed-cache.module.d.ts +5 -0
  224. package/lib/distributed-cache/services/server-cache.service.d.ts +3 -0
  225. package/lib/error/components/error-common/error-common.component.d.ts +3 -0
  226. package/lib/error/error.module.d.ts +8 -0
  227. package/lib/faq/components/faq/faq.component.d.ts +3 -0
  228. package/lib/faq/faq.module.d.ts +12 -0
  229. package/lib/footer/components/footer/footer.component.d.ts +3 -0
  230. package/lib/footer/components/site-map/site-map.component.d.ts +3 -0
  231. package/lib/footer/footer.module.d.ts +11 -0
  232. package/lib/forms/components/sof-address/sof-address.component.d.ts +3 -0
  233. package/lib/forms/directives/alphanumeric/alphanumeric.directive.d.ts +3 -0
  234. package/lib/forms/directives/input-trim/input-trim.directive.d.ts +3 -0
  235. package/lib/forms/directives/letters-only/letters-only.directive.d.ts +3 -0
  236. package/lib/forms/directives/numbers-only/numbers-only.directive.d.ts +3 -0
  237. package/lib/forms/forms.module.d.ts +17 -0
  238. package/lib/forms/pipes/phone-format.pipe.d.ts +3 -0
  239. package/lib/forms/services/alert.service.d.ts +3 -0
  240. package/lib/header/components/header/header.component.d.ts +4 -1
  241. package/lib/header/components/mobile-header-menu/mobile-header-menu.component.d.ts +3 -0
  242. package/lib/header/header.module.d.ts +18 -0
  243. package/lib/navigation/components/navigation/navigation.component.d.ts +6 -3
  244. package/lib/navigation/navigation.module.d.ts +22 -0
  245. package/lib/oauth/oauth.module.d.ts +6 -0
  246. package/lib/oauth/services/hybrid-saml-oauth.service.d.ts +3 -0
  247. package/lib/rbac/directives/rbac-action.directive.d.ts +3 -0
  248. package/lib/rbac/rbac.module.d.ts +6 -0
  249. package/lib/rbac/services/ar-role-nav.service.d.ts +3 -0
  250. package/lib/rbac/services/oauth2-role.service.d.ts +3 -0
  251. package/lib/resize-panels/components/resize-panels/resize-panels.component.d.ts +3 -0
  252. package/lib/resize-panels/resize-panels.module.d.ts +6 -0
  253. package/lib/rum/rum.module.d.ts +5 -0
  254. package/lib/rum/services/rum.service.d.ts +3 -0
  255. package/lib/rum/services/shared-error.service.d.ts +3 -0
  256. package/lib/rum/services/softheon-error-handler.service.d.ts +3 -0
  257. package/lib/saml/components/redirect-saml/redirect-saml.component.d.ts +3 -0
  258. package/lib/saml/saml.module.d.ts +6 -0
  259. package/lib/saml/services/entry/sso-gateway-entry.service.d.ts +3 -0
  260. package/lib/saml/services/send-off/saml.service.d.ts +3 -0
  261. package/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.d.ts +3 -0
  262. package/lib/sof-pipe/pipes/sof-date/sof-date.pipe.d.ts +3 -0
  263. package/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.d.ts +3 -0
  264. package/lib/sof-pipe/sof-pipe.module.d.ts +8 -0
  265. package/lib/theming/directives/css-override.directive.d.ts +3 -0
  266. package/lib/theming/services/theme.service.d.ts +3 -0
  267. package/lib/theming/theme.module.d.ts +6 -0
  268. package/package.json +39 -27
  269. package/bundles/softheon-armature.umd.js +0 -7210
  270. package/bundles/softheon-armature.umd.js.map +0 -1
  271. package/bundles/softheon-armature.umd.min.js +0 -16
  272. package/bundles/softheon-armature.umd.min.js.map +0 -1
  273. package/esm2015/lib/alert-banner/alert-banner-api.js +0 -10
  274. package/esm2015/lib/alert-banner/alert-banner.module.js +0 -30
  275. package/esm2015/lib/alert-banner/components/alert-banner/alert-banner.component.js +0 -78
  276. package/esm2015/lib/alert-banner/models/alert-banner-config.js +0 -2
  277. package/esm2015/lib/alert-banner/models/alert-banner-context.js +0 -2
  278. package/esm2015/lib/alert-banner/models/constants.js +0 -16
  279. package/esm2015/lib/alert-banner/services/alert-banner.service.js +0 -43
  280. package/esm2015/lib/armature.module.js +0 -142
  281. package/esm2015/lib/base-components/base-component-api.js +0 -9
  282. package/esm2015/lib/base-components/base-component.module.js +0 -61
  283. package/esm2015/lib/base-components/sof-alert/sof-alert.component.js +0 -67
  284. package/esm2015/lib/base-components/sof-banner/sof-banner.component.js +0 -44
  285. package/esm2015/lib/base-components/sof-button-toggle-group/sof-button-toggle-group.component.js +0 -169
  286. package/esm2015/lib/base-components/sof-modal/sof-modal.component.js +0 -49
  287. package/esm2015/lib/base-components/sof-progress-bar/sof-progress-bar.component.js +0 -76
  288. package/esm2015/lib/component-save-print/components/component-save-print/component-save-print.component.js +0 -97
  289. package/esm2015/lib/component-save-print/services/component-save-print.service.js +0 -29
  290. package/esm2015/lib/component-save-print/sof-ar-component-save-print.module.js +0 -25
  291. package/esm2015/lib/core/client-generated/api/session.service.js +0 -235
  292. package/esm2015/lib/core/client-generated/configuration.js +0 -59
  293. package/esm2015/lib/core/client-generated/encoder.js +0 -17
  294. package/esm2015/lib/core/client-generated/model/applicationUserModel.js +0 -20
  295. package/esm2015/lib/core/client-generated/model/assertedUserModel.js +0 -2
  296. package/esm2015/lib/core/client-generated/model/brandingModel.js +0 -2
  297. package/esm2015/lib/core/client-generated/model/errorModel.js +0 -13
  298. package/esm2015/lib/core/client-generated/model/folderLink.js +0 -13
  299. package/esm2015/lib/core/client-generated/model/identityProfile.js +0 -2
  300. package/esm2015/lib/core/client-generated/model/models.js +0 -20
  301. package/esm2015/lib/core/client-generated/model/oAuthModel.js +0 -13
  302. package/esm2015/lib/core/client-generated/model/preferencesRow.js +0 -13
  303. package/esm2015/lib/core/client-generated/model/rolesRow.js +0 -13
  304. package/esm2015/lib/core/client-generated/model/sessionGetResponseModel.js +0 -2
  305. package/esm2015/lib/core/client-generated/model/sessionPostRequestModel.js +0 -2
  306. package/esm2015/lib/core/client-generated/model/sessionPostResponseModel.js +0 -2
  307. package/esm2015/lib/core/client-generated/model/sessionPutRequestModel.js +0 -2
  308. package/esm2015/lib/core/client-generated/model/sessionPutResponseModel.js +0 -2
  309. package/esm2015/lib/core/client-generated/model/sessionResponseModel.js +0 -2
  310. package/esm2015/lib/core/client-generated/model/settingsProfile.js +0 -2
  311. package/esm2015/lib/core/client-generated/model/themePaletteColorsModel.js +0 -13
  312. package/esm2015/lib/core/client-generated/model/themePaletteModel.js +0 -2
  313. package/esm2015/lib/core/client-generated/model/trackingModel.js +0 -13
  314. package/esm2015/lib/core/client-generated/model/validationRecordsRow.js +0 -13
  315. package/esm2015/lib/core/client-generated/variables.js +0 -9
  316. package/esm2015/lib/core/components/app-template/app-template.component.js +0 -249
  317. package/esm2015/lib/core/functions/guid.js +0 -11
  318. package/esm2015/lib/core/functions/naming-convention.js +0 -33
  319. package/esm2015/lib/core/initializer/abstract-startup-service.js +0 -4
  320. package/esm2015/lib/core/initializer/initializer.service.js +0 -206
  321. package/esm2015/lib/core/interceptors/armature-auth-token-append.interceptor.js +0 -75
  322. package/esm2015/lib/core/models/base-config.js +0 -2
  323. package/esm2015/lib/core/models/constants.js +0 -13
  324. package/esm2015/lib/core/models/data-store-config.js +0 -4
  325. package/esm2015/lib/core/models/header-config.js +0 -2
  326. package/esm2015/lib/core/models/http-verbs.js +0 -9
  327. package/esm2015/lib/core/models/navigation-config.js +0 -2
  328. package/esm2015/lib/core/models/oidc-auth-settings.js +0 -2
  329. package/esm2015/lib/core/models/route-path.js +0 -7
  330. package/esm2015/lib/core/models/session-config.js +0 -4
  331. package/esm2015/lib/core/models/styles.js +0 -2
  332. package/esm2015/lib/core/models/typed-session.js +0 -4
  333. package/esm2015/lib/core/models/user-entity-service-config.js +0 -12
  334. package/esm2015/lib/core/services/authorization.service.js +0 -178
  335. package/esm2015/lib/core/services/banner.service.js +0 -42
  336. package/esm2015/lib/core/services/base-config.service.js +0 -31
  337. package/esm2015/lib/core/services/custom-auth-config.service.js +0 -4
  338. package/esm2015/lib/core/services/default-config.service.js +0 -18
  339. package/esm2015/lib/core/services/session.service.js +0 -386
  340. package/esm2015/lib/core/services/user-entity.service.js +0 -147
  341. package/esm2015/lib/distributed-cache/client-generated/api/api.js +0 -4
  342. package/esm2015/lib/distributed-cache/client-generated/api/cache.service.js +0 -206
  343. package/esm2015/lib/distributed-cache/client-generated/configuration.js +0 -59
  344. package/esm2015/lib/distributed-cache/client-generated/encoder.js +0 -17
  345. package/esm2015/lib/distributed-cache/client-generated/model/cacheExpirationType.js +0 -16
  346. package/esm2015/lib/distributed-cache/client-generated/model/createCacheEntryRequestModel.js +0 -2
  347. package/esm2015/lib/distributed-cache/client-generated/model/models.js +0 -5
  348. package/esm2015/lib/distributed-cache/client-generated/model/retrieveCacheEntryResponseModel.js +0 -13
  349. package/esm2015/lib/distributed-cache/client-generated/model/updateCacheEntryRequestModel.js +0 -13
  350. package/esm2015/lib/distributed-cache/client-generated/variables.js +0 -9
  351. package/esm2015/lib/distributed-cache/distributed-cache-api.js +0 -8
  352. package/esm2015/lib/distributed-cache/distributed-cache.module.js +0 -26
  353. package/esm2015/lib/distributed-cache/models/constants.js +0 -3
  354. package/esm2015/lib/distributed-cache/models/policy-person.js +0 -9
  355. package/esm2015/lib/distributed-cache/services/server-cache.service.js +0 -52
  356. package/esm2015/lib/error/components/error-common/error-common.component.js +0 -24
  357. package/esm2015/lib/error/error-api.js +0 -7
  358. package/esm2015/lib/error/error.module.js +0 -22
  359. package/esm2015/lib/error/models/error-common-config.js +0 -8
  360. package/esm2015/lib/faq/components/faq/faq.component.js +0 -35
  361. package/esm2015/lib/faq/faq-api.js +0 -8
  362. package/esm2015/lib/faq/faq.module.js +0 -32
  363. package/esm2015/lib/faq/models/faq-config.js +0 -4
  364. package/esm2015/lib/faq/models/faq.js +0 -8
  365. package/esm2015/lib/footer/components/footer/footer.component.js +0 -25
  366. package/esm2015/lib/footer/components/site-map/site-map.component.js +0 -23
  367. package/esm2015/lib/footer/footer-api.js +0 -10
  368. package/esm2015/lib/footer/footer.module.js +0 -30
  369. package/esm2015/lib/footer/models/enum/site-map-direction.js +0 -15
  370. package/esm2015/lib/footer/models/footer-config.js +0 -4
  371. package/esm2015/lib/footer/models/site-map-models.js +0 -2
  372. package/esm2015/lib/forms/components/sof-address/sof-address.component.js +0 -99
  373. package/esm2015/lib/forms/directives/alphanumeric/alphanumeric.directive.js +0 -75
  374. package/esm2015/lib/forms/directives/input-trim/input-trim.directive.js +0 -97
  375. package/esm2015/lib/forms/directives/letters-only/letters-only.directive.js +0 -68
  376. package/esm2015/lib/forms/directives/numbers-only/numbers-only.directive.js +0 -58
  377. package/esm2015/lib/forms/forms-api.js +0 -19
  378. package/esm2015/lib/forms/forms.module.js +0 -63
  379. package/esm2015/lib/forms/models/address.js +0 -2
  380. package/esm2015/lib/forms/models/constants.js +0 -10
  381. package/esm2015/lib/forms/models/county.js +0 -2
  382. package/esm2015/lib/forms/models/enums/states.js +0 -58
  383. package/esm2015/lib/forms/pipes/phone-format.pipe.js +0 -29
  384. package/esm2015/lib/forms/services/alert.service.js +0 -170
  385. package/esm2015/lib/header/components/header/header.component.js +0 -157
  386. package/esm2015/lib/header/components/mobile-header-menu/mobile-header-menu.component.js +0 -37
  387. package/esm2015/lib/header/header-api.js +0 -12
  388. package/esm2015/lib/header/header.module.js +0 -51
  389. package/esm2015/lib/header/models/header-auth.settings.js +0 -32
  390. package/esm2015/lib/header/models/header-language.settings.js +0 -2
  391. package/esm2015/lib/header/models/header-theme.settings.js +0 -2
  392. package/esm2015/lib/header/models/header.settings.js +0 -2
  393. package/esm2015/lib/header/models/mobile-header-nav.settings.js +0 -2
  394. package/esm2015/lib/navigation/components/navigation/navigation.component.js +0 -542
  395. package/esm2015/lib/navigation/models/nav-theme.settings.js +0 -2
  396. package/esm2015/lib/navigation/models/nav.settings.js +0 -2
  397. package/esm2015/lib/navigation/models/navigation.js +0 -2
  398. package/esm2015/lib/navigation/navigation-api.js +0 -9
  399. package/esm2015/lib/navigation/navigation.module.js +0 -67
  400. package/esm2015/lib/oauth/models/constants.js +0 -6
  401. package/esm2015/lib/oauth/models/generated/accountManagementAssertionModel.js +0 -2
  402. package/esm2015/lib/oauth/models/generated/accountManagementRefreshRequestModel.js +0 -2
  403. package/esm2015/lib/oauth/models/generated/accountManagementResponseModel.js +0 -2
  404. package/esm2015/lib/oauth/models/generated/coverageDetail.js +0 -19
  405. package/esm2015/lib/oauth/models/generated/finance.js +0 -13
  406. package/esm2015/lib/oauth/models/generated/iSsoResponseModel.js +0 -13
  407. package/esm2015/lib/oauth/models/generated/iSsoResponseModelAccountManagementAssertionModel.js +0 -2
  408. package/esm2015/lib/oauth/models/generated/person.js +0 -13
  409. package/esm2015/lib/oauth/models/generated/policy.js +0 -2
  410. package/esm2015/lib/oauth/models/generated/refreshResponseModel.js +0 -13
  411. package/esm2015/lib/oauth/models/hybrid-saml-oauth-config.js +0 -4
  412. package/esm2015/lib/oauth/oauth-api.js +0 -15
  413. package/esm2015/lib/oauth/oauth.module.js +0 -20
  414. package/esm2015/lib/oauth/services/hybrid-saml-oauth.service.js +0 -202
  415. package/esm2015/lib/rbac/directives/rbac-action.directive.js +0 -52
  416. package/esm2015/lib/rbac/models/access-token-claims.js +0 -23
  417. package/esm2015/lib/rbac/models/constants.js +0 -4
  418. package/esm2015/lib/rbac/models/decoded-access-token.js +0 -69
  419. package/esm2015/lib/rbac/models/rbac-config.js +0 -4
  420. package/esm2015/lib/rbac/models/role-access.js +0 -10
  421. package/esm2015/lib/rbac/rbac-api.js +0 -15
  422. package/esm2015/lib/rbac/rbac.module.js +0 -43
  423. package/esm2015/lib/rbac/services/ar-role-nav.service.js +0 -90
  424. package/esm2015/lib/rbac/services/oauth2-role.service.js +0 -120
  425. package/esm2015/lib/rbac/services/role-nav.service.js +0 -4
  426. package/esm2015/lib/resize-panels/components/resize-panels/resize-panels.component.js +0 -142
  427. package/esm2015/lib/resize-panels/models/resize-event.js +0 -2
  428. package/esm2015/lib/resize-panels/resize-panels-api.js +0 -5
  429. package/esm2015/lib/resize-panels/resize-panels.module.js +0 -18
  430. package/esm2015/lib/rum/models/arm-error.js +0 -29
  431. package/esm2015/lib/rum/models/rum-config.js +0 -4
  432. package/esm2015/lib/rum/rum-api.js +0 -10
  433. package/esm2015/lib/rum/rum.module.js +0 -40
  434. package/esm2015/lib/rum/services/rum.service.js +0 -118
  435. package/esm2015/lib/rum/services/shared-error.service.js +0 -46
  436. package/esm2015/lib/rum/services/softheon-error-handler.service.js +0 -81
  437. package/esm2015/lib/saml/components/redirect-saml/redirect-saml.component.js +0 -76
  438. package/esm2015/lib/saml/models/i-saml-request.js +0 -2
  439. package/esm2015/lib/saml/models/i-saml-response.js +0 -2
  440. package/esm2015/lib/saml/models/redirect-saml-request.js +0 -4
  441. package/esm2015/lib/saml/models/sso-gateway-model.js +0 -4
  442. package/esm2015/lib/saml/saml-api.js +0 -15
  443. package/esm2015/lib/saml/saml.module.js +0 -36
  444. package/esm2015/lib/saml/services/entry/abstract-saml-entry.service.js +0 -4
  445. package/esm2015/lib/saml/services/entry/sso-gateway-entry.service.js +0 -35
  446. package/esm2015/lib/saml/services/send-off/abstract-saml.service.js +0 -9
  447. package/esm2015/lib/saml/services/send-off/saml.service.js +0 -41
  448. package/esm2015/lib/sof-pipe/constants/constants.js +0 -17
  449. package/esm2015/lib/sof-pipe/models/sof-date-pipe-format.js +0 -2
  450. package/esm2015/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.js +0 -33
  451. package/esm2015/lib/sof-pipe/pipes/sof-date/sof-date.pipe.js +0 -54
  452. package/esm2015/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.js +0 -24
  453. package/esm2015/lib/sof-pipe/sof-pipe.api.js +0 -9
  454. package/esm2015/lib/sof-pipe/sof-pipe.module.js +0 -28
  455. package/esm2015/lib/theming/directives/css-override.directive.js +0 -67
  456. package/esm2015/lib/theming/models/css-override.js +0 -11
  457. package/esm2015/lib/theming/services/theme.service.js +0 -166
  458. package/esm2015/lib/theming/theme-api.js +0 -6
  459. package/esm2015/lib/theming/theme.module.js +0 -24
  460. package/esm2015/public-api.js +0 -48
  461. package/esm2015/softheon-armature.js +0 -12
  462. package/fesm2015/softheon-armature.js +0 -6515
  463. package/fesm2015/softheon-armature.js.map +0 -1
  464. package/softheon-armature.d.ts +0 -11
  465. package/softheon-armature.metadata.json +0 -1
@@ -0,0 +1,555 @@
1
+ import { STEPPER_GLOBAL_OPTIONS } from '@angular/cdk/stepper';
2
+ import { Component, EventEmitter, Input, Optional, Output, ViewChild, ViewChildren } from '@angular/core';
3
+ import { NavigationEnd } from '@angular/router';
4
+ import { Subscription } from 'rxjs';
5
+ import { filter } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/cdk/layout";
8
+ import * as i2 from "@angular/router";
9
+ import * as i3 from "../../../core/services/banner.service";
10
+ import * as i4 from "../../../core/services/authorization.service";
11
+ import * as i5 from "../../../core/services/base-config.service";
12
+ import * as i6 from "@angular/common";
13
+ import * as i7 from "@angular/flex-layout/flex";
14
+ import * as i8 from "@angular/flex-layout/extended";
15
+ import * as i9 from "@angular/material/sidenav";
16
+ import * as i10 from "@angular/material/button";
17
+ import * as i11 from "@angular/material/list";
18
+ import * as i12 from "@angular/material/tooltip";
19
+ import * as i13 from "@angular/material/expansion";
20
+ import * as i14 from "@angular/material/menu";
21
+ import * as i15 from "@angular/material/stepper";
22
+ import * as i16 from "@angular/material/progress-bar";
23
+ import * as i17 from "@ngx-translate/core";
24
+ // TODO: see how this can fit with the `sof-progress-bar` component. Possibly combine them
25
+ /**
26
+ * The Navigation Component
27
+ */
28
+ export class ArmatureNavigationComponent {
29
+ /** gets the non used language */
30
+ get otherLangText() {
31
+ return this.languageSettings?.languages?.find(x => x !== this.currentLang);
32
+ }
33
+ /**
34
+ * the constructor
35
+ * @param changeDetectorRef the change detector reference
36
+ * @param media the media matcher
37
+ * @param router The router
38
+ * @param bannerService The Banner Service
39
+ * @param activatedRoute The activated route
40
+ * @param configService The config service
41
+ */
42
+ constructor(changeDetectorRef, media, router, bannerService, authorizationService, configService) {
43
+ this.changeDetectorRef = changeDetectorRef;
44
+ this.media = media;
45
+ this.router = router;
46
+ this.bannerService = bannerService;
47
+ this.authorizationService = authorizationService;
48
+ this.configService = configService;
49
+ /** Component Input - the navigation settings */
50
+ this.settings = {};
51
+ /** Component Input - the navigation settings */
52
+ this.advancedSettings = {};
53
+ /** Component Input - the navigation settings */
54
+ this.themeSettings = {};
55
+ /** Component Input - the navigation language settings */
56
+ this.languageSettings = {};
57
+ /** Sets language **/
58
+ this.setLanguage$ = new EventEmitter();
59
+ /** Whether side nav is open or not */
60
+ this.isNavOpen = false;
61
+ /** Mobile SubNav - whether or not the mobile SubNav is open */
62
+ this.isMobileSubNavOpen = false;
63
+ /** The selected parent index */
64
+ this.selectedParentIndex = 0;
65
+ /** The selected child index */
66
+ this.selectedChildIndexes = {};
67
+ /** The navigation progress count */
68
+ this.navProgressCount = 0;
69
+ /** True if the expansion panel is open */
70
+ this.panelOpenState = false;
71
+ /** The nav bind subscription */
72
+ this.navBindSub = new Subscription();
73
+ /** Whether we should the message */
74
+ this.showMessage = false;
75
+ /** Whether should show check mark or not */
76
+ this.showCheckMark = true;
77
+ /** The nav bind subscription */
78
+ this.logInSubscription = new Subscription();
79
+ /** The banner subscription */
80
+ this.bannerSubscription = new Subscription();
81
+ /** The config subscription */
82
+ this.configSubscription = new Subscription();
83
+ /** The sidenav subscription */
84
+ this.sideNavSub = new Subscription();
85
+ this.mobileQuery = media.matchMedia('(max-width: 959px)');
86
+ this._mobileQueryListener = () => {
87
+ changeDetectorRef.detectChanges();
88
+ // close the sidenav when screen size is changed
89
+ if (!this.mobileQuery.matches && this.settings.menuStyle === 'progress') {
90
+ this.sidenav.close();
91
+ }
92
+ };
93
+ // below if statement is for edge support since addEventListener doesn't exist for MediaQueryLists
94
+ if (this.mobileQuery.addEventListener) {
95
+ this.mobileQuery.addEventListener('change', this._mobileQueryListener);
96
+ }
97
+ else {
98
+ this.mobileQuery.addListener(this._mobileQueryListener);
99
+ }
100
+ }
101
+ /** On Init - configure the settings */
102
+ ngOnInit() {
103
+ this.bannerSubscription.add(this.bannerService.showBanner$.subscribe(val => this.showMessage = val));
104
+ this.bannerSubscription.add(this.bannerService.message$.subscribe(val => this.message = val));
105
+ this.bannerSubscription.add(this.bannerService.showCheckMark$.subscribe(val => this.showCheckMark = val));
106
+ this.footerNavigationData = this.navigationData?.filter(node => node?.altLocation == true);
107
+ this.footerItemCount = this.footerNavigationData ? this.footerNavigationData.length : 0;
108
+ this.navigationData = this.navigationData?.filter(node => node?.altLocation != true);
109
+ // if parents have no route, grab first route of child
110
+ this.navigationData?.forEach(n => {
111
+ if (!n.route) {
112
+ n.route = n.subNodes && n.subNodes.length > 0 ? n.subNodes[0].route : undefined;
113
+ }
114
+ // enable all pages by default
115
+ if (n.isDisabled == null) {
116
+ n.isDisabled = false;
117
+ }
118
+ });
119
+ this.initBasicSettings();
120
+ this.initAdvancedSettings();
121
+ this.initThemeSettings();
122
+ // init binding for progress nav
123
+ if (this.settings.menuStyle === 'progress') {
124
+ // set the first node and child node as visited
125
+ if (this.navigationData.length > 0) {
126
+ this.navigationData[0].visited = true;
127
+ this.navigate(this.navigationData[0].route);
128
+ if (this.navigationData[0].subNodes && this.navigationData[0].subNodes.length > 0) {
129
+ this.navigationData[0].subNodes[0].visited = true;
130
+ this.navigate(this.navigationData[0].subNodes[0].route);
131
+ }
132
+ }
133
+ // set initial progress bar
134
+ this.navProgressCount = (this.selectedParentIndex + 1) / this.navigationData.length * 100;
135
+ this.navBindSub.add(this.router.events.pipe(filter(event => event instanceof NavigationEnd))
136
+ .subscribe((event) => {
137
+ // find parent index with active child
138
+ this.getActiveParentAndChild(event.url);
139
+ }));
140
+ this.settings.allowNavToggle = false;
141
+ }
142
+ this.logInSubscription = this.authorizationService.isLoggedIn$.subscribe(value => {
143
+ if (value) {
144
+ this.userName = this.authorizationService.userName();
145
+ }
146
+ });
147
+ if (this.configService) {
148
+ this.configSubscription = this.configService.config$.subscribe(config => {
149
+ if (config) {
150
+ if (config?.navigation?.settings?.resetNav) {
151
+ this.navProgressCount = 0;
152
+ this.selectedParentIndex = 0;
153
+ this.navigate(this.navigationData[0].route);
154
+ if (this.stepper) {
155
+ this.stepper.selectedIndex = 0;
156
+ setTimeout(() => {
157
+ this.stepper.reset();
158
+ this.innerSteppers?.forEach(stepper => {
159
+ stepper.selectedIndex = 0;
160
+ stepper.reset();
161
+ });
162
+ });
163
+ }
164
+ this.navigationData.forEach(n => {
165
+ n.visited = false;
166
+ n.complete = false;
167
+ n.subNodes?.forEach(s => {
168
+ s.visited = false;
169
+ s.complete = false;
170
+ });
171
+ });
172
+ // reset back to false to avoid multiple triggers on future calls
173
+ config.navigation.settings.resetNav = false;
174
+ this.configService.config = config;
175
+ }
176
+ // if the values were changed and not null, it means that the nav was toggled to progress
177
+ if (config?.navigation?.settings?.toggleProgressNavParentIndex != null
178
+ && this.toggleProgressNavParentIndex != config?.navigation?.settings?.toggleProgressNavParentIndex
179
+ && this.toggleProgressNavChildIndex != config?.navigation?.settings?.toggleProgressNavChildIndex
180
+ && config?.navigation?.settings?.toggleProgressNavChildIndex != null) {
181
+ this.toggleProgressNavParentIndex = config.navigation.settings.toggleProgressNavParentIndex;
182
+ this.toggleProgressNavChildIndex = config.navigation.settings.toggleProgressNavChildIndex;
183
+ // add the router sub
184
+ this.navBindSub.add(this.router.events.pipe(filter(event => event instanceof NavigationEnd))
185
+ .subscribe((event) => {
186
+ // find parent index with active child
187
+ this.getActiveParentAndChild(event.url);
188
+ }));
189
+ // if the child node index is valid
190
+ if (config.navigation.nodes[this.toggleProgressNavParentIndex].subNodes?.length > this.toggleProgressNavChildIndex) {
191
+ this.setNodeStates(config.navigation.nodes[this.toggleProgressNavParentIndex], config.navigation.nodes[this.toggleProgressNavParentIndex].subNodes[this.toggleProgressNavChildIndex]);
192
+ }
193
+ else {
194
+ this.setNodeStates(config.navigation.nodes[this.toggleProgressNavParentIndex], null);
195
+ }
196
+ }
197
+ else {
198
+ // Update the indexes
199
+ this.toggleProgressNavParentIndex = config?.navigation?.settings?.toggleProgressNavParentIndex;
200
+ this.toggleProgressNavChildIndex = config?.navigation?.settings?.toggleProgressNavChildIndex;
201
+ }
202
+ }
203
+ });
204
+ }
205
+ }
206
+ /** Life cycle hook for after component view initialization */
207
+ ngAfterViewInit() {
208
+ if (this.settings.menuStyle === 'stepper') {
209
+ this.bindStepperToRoutes();
210
+ setTimeout(() => {
211
+ this.stepper.steps.forEach((step, index) => {
212
+ step.select = () => {
213
+ this.selectedParentIndex = index;
214
+ this.navigate(this.navigationData[index].route);
215
+ };
216
+ });
217
+ this.innerSteppers.forEach((stepper, index) => {
218
+ stepper.steps.forEach((step, jindex) => {
219
+ step.select = () => {
220
+ this.selectedChildIndexes[index] = jindex;
221
+ this.navigate(this.navigationData[index].subNodes[jindex].route);
222
+ };
223
+ });
224
+ });
225
+ });
226
+ }
227
+ this.sideNavSub = this.sidenav.openedChange.subscribe(drawerState => {
228
+ this.isNavOpen = drawerState;
229
+ });
230
+ }
231
+ /** On Destroy */
232
+ ngOnDestroy() {
233
+ this.mobileQuery.removeEventListener('change', this._mobileQueryListener);
234
+ this.navBindSub.unsubscribe();
235
+ this.logInSubscription.unsubscribe();
236
+ this.bannerSubscription.unsubscribe();
237
+ this.configSubscription.unsubscribe();
238
+ this.sideNavSub.unsubscribe();
239
+ }
240
+ /**
241
+ * Mobile SubNav - open the SubNav
242
+ * @param nav the nav data to be passed to the SubNav
243
+ */
244
+ openMobileSubNav(nav) {
245
+ this.isMobileSubNavOpen = true;
246
+ this.currentMobileNav = nav;
247
+ this.sidenav.open();
248
+ }
249
+ /**
250
+ * Mobile SubNav - closes the SubNav
251
+ */
252
+ closeMobileSubNav() {
253
+ this.isMobileSubNavOpen = false;
254
+ this.sidenav.close();
255
+ }
256
+ /**
257
+ * Sets the theme color
258
+ * @param variable the css variable name
259
+ * @param color the color
260
+ */
261
+ setThemeColor(variable, color) {
262
+ document.documentElement.style.setProperty(`--sof-nav-${variable}`, color);
263
+ }
264
+ /**
265
+ * Determines the step state
266
+ * @param parentIndex The parent index
267
+ * @param childIndex The child index
268
+ * @returns The step state
269
+ */
270
+ determineStepState(parentIndex, childIndex) {
271
+ // not passed && not active
272
+ if (childIndex === -1) {
273
+ if (!this.stepper) {
274
+ return 'number';
275
+ }
276
+ // not passed && active
277
+ if (parentIndex === this.stepper.selectedIndex) {
278
+ this.navigationData[parentIndex].visited = true;
279
+ return 'active';
280
+ }
281
+ // passed but nav back
282
+ else if (parentIndex > this.stepper.selectedIndex && this.navigationData[parentIndex].visited) {
283
+ this.stepper.steps.find((s, index) => index === parentIndex)
284
+ .reset();
285
+ return 'active';
286
+ }
287
+ // passed && not active
288
+ else if (parentIndex < this.stepper.selectedIndex) {
289
+ this.navigationData[parentIndex].visited = true;
290
+ return 'done';
291
+ }
292
+ else {
293
+ return 'number';
294
+ }
295
+ }
296
+ else {
297
+ if (!this.innerSteppers) {
298
+ return 'none';
299
+ }
300
+ const innerStepper = this.innerSteppers.find((s, index) => index === parentIndex);
301
+ if (childIndex === innerStepper.selectedIndex) {
302
+ this.navigationData[parentIndex].subNodes[childIndex].visited = true;
303
+ return 'active';
304
+ }
305
+ else if (childIndex > innerStepper.selectedIndex && this.navigationData[parentIndex].subNodes[childIndex].visited) {
306
+ innerStepper.steps.find((s, index) => index === childIndex)
307
+ .reset();
308
+ return 'active';
309
+ }
310
+ else if (childIndex < innerStepper.selectedIndex) {
311
+ this.navigationData[parentIndex].subNodes[childIndex].visited = true;
312
+ return 'done';
313
+ }
314
+ else {
315
+ return 'none';
316
+ }
317
+ }
318
+ }
319
+ /**
320
+ * Navigates to the provided route
321
+ * @param route The route
322
+ */
323
+ navigate(route) {
324
+ // tslint:disable-next-line: no-floating-promises
325
+ this.router.navigateByUrl(route);
326
+ }
327
+ /**
328
+ * Navigates to given step
329
+ * @param stepNumber The step number to navigate to
330
+ */
331
+ navigateToStep(stepNumber) {
332
+ if (stepNumber < this.selectedParentIndex) {
333
+ // tslint:disable-next-line: no-floating-promises
334
+ this.router.navigateByUrl(this.navigationData[stepNumber].route);
335
+ }
336
+ }
337
+ /**
338
+ * Gets the active parent and child nodes
339
+ * @param url The router url
340
+ */
341
+ getActiveParentAndChild(url) {
342
+ let childIndex;
343
+ let parentIndex = this.navigationData.findIndex(n => {
344
+ childIndex = n.subNodes?.findIndex(s => url.includes(s.route.replace('.', '')));
345
+ return childIndex > -1 || this.router.url.includes(n.route.replace('.', ''));
346
+ });
347
+ if (parentIndex == -1) {
348
+ parentIndex = 0;
349
+ }
350
+ // set the active parent node and sub node
351
+ this.activeParentNode = this.navigationData[parentIndex];
352
+ this.activeSubNode = childIndex > -1 && this.activeParentNode.subNodes.length > 0 ? this.activeParentNode.subNodes[childIndex] : null;
353
+ // compute the progress bar
354
+ this.navProgressCount = (parentIndex + 1) / this.navigationData.length * 100;
355
+ // set the node states
356
+ this.setNodeStates(this.activeParentNode, this.activeSubNode);
357
+ }
358
+ /**
359
+ * Sets the complete and visited states for all NavNodes
360
+ * @param parentNode The parent node
361
+ * @param childNode The child node
362
+ */
363
+ setNodeStates(parentNode, childNode) {
364
+ if (childNode) {
365
+ this.activeSubNode = childNode;
366
+ let childIndex = parentNode.subNodes.indexOf(childNode) > -1 ? parentNode.subNodes.indexOf(childNode) : 0;
367
+ // all subnodes before this were completed and visited
368
+ parentNode.subNodes.slice(0, childIndex).forEach(element => {
369
+ element.complete = true;
370
+ element.visited = true;
371
+ });
372
+ }
373
+ this.activeParentNode = parentNode;
374
+ // set all previous nodes to complete
375
+ let parentIndex = this.navigationData.indexOf(parentNode) > -1 ? this.navigationData.indexOf(parentNode) : 0;
376
+ this.navigationData.slice(0, parentIndex).forEach(d => {
377
+ d.complete = true;
378
+ // set all subnodes of previous nodes to complete only if the node was not disabled
379
+ if (!d.isDisabled) {
380
+ d.subNodes.forEach(s => {
381
+ s.complete = true;
382
+ s.visited = true;
383
+ });
384
+ }
385
+ });
386
+ // set the current nodes as visited
387
+ parentNode.visited = true;
388
+ if (childNode) {
389
+ childNode.visited = true;
390
+ }
391
+ }
392
+ /**
393
+ * Closes the expansion panel and navigates to the given node
394
+ * @param el The mat expansion panel
395
+ * @param index The parent node index
396
+ */
397
+ disablePanel(el, index) {
398
+ el.close();
399
+ this.navigate(this.navigationData[index].route);
400
+ }
401
+ /**
402
+ * Hides the message
403
+ */
404
+ hide() {
405
+ this.showMessage = false;
406
+ }
407
+ /**
408
+ * Logs out once user is authorized
409
+ * */
410
+ logOut() {
411
+ this.authorizationService.authorizeUser();
412
+ }
413
+ /**
414
+ * Closes mobile navigation after selection.
415
+ */
416
+ closeNavigationForMobile() {
417
+ if (this.mobileQuery.matches) {
418
+ this.sidenav.close();
419
+ }
420
+ }
421
+ /**
422
+ * Is the navigation selected
423
+ */
424
+ isNavSelected(node) {
425
+ return this.router.isActive(node.route, { paths: 'exact', queryParams: 'exact', fragment: 'ignored', matrixParams: 'ignored' });
426
+ }
427
+ /** Sets the width for the side nav */
428
+ setNavWidth(width) {
429
+ return width.includes('%') || width.includes('px') ? width : width + 'px';
430
+ }
431
+ /** Binds the stepper to the router */
432
+ bindStepperToRoutes() {
433
+ // find parents
434
+ setTimeout(() => {
435
+ // find parent index with active child
436
+ let childIndex;
437
+ let parentIndex = this.navigationData.findIndex(n => {
438
+ childIndex = n.subNodes?.findIndex(s => this.router.url.includes(s.route.replace('.', '')));
439
+ return childIndex > -1 || this.router.url.includes(n.route.replace('.', ''));
440
+ });
441
+ // if no children or no indexes activate first parent
442
+ if (parentIndex === -1) {
443
+ parentIndex = 0;
444
+ }
445
+ this.selectedParentIndex = parentIndex;
446
+ if (childIndex > -1) {
447
+ this.innerSteppers.find((is, index) => index === parentIndex).selectedIndex = childIndex;
448
+ }
449
+ });
450
+ // find parents
451
+ this.navBindSub.add(this.router.events.pipe(filter(event => event instanceof NavigationEnd))
452
+ .subscribe((event) => {
453
+ // find parent index with active child
454
+ let childIndex;
455
+ let parentIndex = this.navigationData.findIndex(n => {
456
+ childIndex = n.subNodes?.findIndex(s => event.urlAfterRedirects.includes(s.route.replace('.', '')));
457
+ return childIndex > -1 || event.urlAfterRedirects.includes(n.route.replace('.', ''));
458
+ });
459
+ // if no children or no indexes activate first parent
460
+ if (parentIndex === -1) {
461
+ parentIndex = 0;
462
+ }
463
+ this.selectedParentIndex = parentIndex;
464
+ if (childIndex > -1) {
465
+ this.innerSteppers.find((is, index) => index === parentIndex).selectedIndex = childIndex;
466
+ }
467
+ }));
468
+ }
469
+ /** Initializes the advanced nav settings */
470
+ initAdvancedSettings() {
471
+ this.advancedSettings.topGapDesktop = this.advancedSettings.topGapDesktop || 0;
472
+ this.advancedSettings.topGapMobile = this.advancedSettings.topGapMobile || this.settings.headerHeight;
473
+ this.advancedSettings.marginTopDesktop = this.advancedSettings.marginTopDesktop || 0;
474
+ this.advancedSettings.marginTopMobile = this.advancedSettings.marginTopMobile || 0;
475
+ }
476
+ /** Initializes the nav theme settings */
477
+ initThemeSettings() {
478
+ this.themeSettings.contentBgColor ? this.setThemeColor('content-bg-color', this.themeSettings.contentBgColor) : undefined;
479
+ this.themeSettings.fontColor ? this.setThemeColor('font-color', this.themeSettings.fontColor) : undefined;
480
+ this.themeSettings.fontColor = this.themeSettings.fontColor || '#000';
481
+ this.themeSettings.mobileBgColor = this.themeSettings.mobileBgColor || '#ffffff';
482
+ this.themeSettings.bgGradientColor1 ? this.setThemeColor('bg-gradient-color-1', this.themeSettings.bgGradientColor1) : undefined;
483
+ this.themeSettings.bgGradientColor2 ? this.setThemeColor('bg-gradient-color-2', this.themeSettings.bgGradientColor2) : undefined;
484
+ this.themeSettings.borderRightColor ? this.setThemeColor('border-right-color', this.themeSettings.borderRightColor) : undefined;
485
+ this.themeSettings.listBorderColor ? this.setThemeColor('list-border-color', this.themeSettings.listBorderColor) : undefined;
486
+ this.themeSettings.highlightGradient1 ? this.setThemeColor('highlight-gradient-1', this.themeSettings.highlightGradient1) : undefined;
487
+ this.themeSettings.highlightGradient2 ? this.setThemeColor('highlight-gradient-2', this.themeSettings.highlightGradient2) : undefined;
488
+ this.themeSettings.subHighlightBorderColor ?
489
+ this.setThemeColor('sub-highlight-border-color', this.themeSettings.subHighlightBorderColor) : undefined;
490
+ this.themeSettings.subHighlightBgColor ?
491
+ this.setThemeColor('sub-highlight-bg-color', this.themeSettings.subHighlightBgColor) : undefined;
492
+ }
493
+ /** Initializes the basic nav settings */
494
+ initBasicSettings() {
495
+ this.settings.fontAwesomeMenuIcon = this.settings.fontAwesomeMenuIcon || 'fas fa-angle-double-left';
496
+ this.settings.fontAwesomeMenuIconClosed = this.settings.fontAwesomeMenuIconClosed || 'fas fa-angle-double-right';
497
+ this.settings.allowNavToggle = this.settings.allowNavToggle == null ? true : this.settings.allowNavToggle;
498
+ this.settings.mainMenuText ? this.mainMenuText = this.settings.mainMenuText : this.mainMenuText = 'Main Menu';
499
+ this.settings.headerHeight = this.settings.headerHeight || 60;
500
+ this.settings.menuButtonSRText = this.settings.menuButtonSRText || 'Menu Button';
501
+ this.settings.menuStyle = this.settings.menuStyle || 'static';
502
+ this.settings.displayNumbers = this.settings.displayNumbers == null ? true : this.settings.displayNumbers;
503
+ this.settings.progressSectionCompleteIcon = this.settings.progressSectionCompleteIcon || 'fas fa-check-circle';
504
+ this.settings.progressSectionFutureIcon = this.settings.progressSectionFutureIcon || 'far fa-circle';
505
+ this.settings.progressSectionCurrentIcon = this.settings.progressSectionCurrentIcon || 'fas fa-circle';
506
+ this.settings.progressMenuCompleteIcon = this.settings.progressMenuCompleteIcon || 'far fa-check';
507
+ this.settings.showProgressBar = this.settings.showProgressBar == null ? true : this.settings.showProgressBar;
508
+ this.settings.sideNavWidthDesktop = this.settings.sideNavWidthDesktop || '350';
509
+ this.settings.sideNavWidthMobile = this.settings.sideNavWidthMobile || '350';
510
+ this.settings.overrideNavigation = this.settings.overrideNavigation || false;
511
+ this.settings.progressMenuWidth = this.settings.progressMenuWidth || '280';
512
+ this.settings.useCustomMobileFooter = this.settings.useCustomMobileFooter != null ? this.settings.useCustomMobileFooter : false;
513
+ }
514
+ }
515
+ ArmatureNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: ArmatureNavigationComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MediaMatcher }, { token: i2.Router }, { token: i3.BannerService }, { token: i4.AuthorizationService }, { token: i5.BaseConfigService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
516
+ ArmatureNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.5", type: ArmatureNavigationComponent, selector: "sof-ar-navigation", inputs: { navigationData: "navigationData", settings: "settings", advancedSettings: "advancedSettings", themeSettings: "themeSettings", languageSettings: "languageSettings", currentLang: "currentLang", logOutText: "logOutText" }, outputs: { setLanguage$: "setLanguage$" }, providers: [{
517
+ provide: STEPPER_GLOBAL_OPTIONS, useValue: { displayDefaultIndicatorType: false }
518
+ }], viewQueries: [{ propertyName: "stepper", first: true, predicate: ["vertStepper"], descendants: true }, { propertyName: "sidenav", first: true, predicate: ["snav"], descendants: true }, { propertyName: "expansionPanel", first: true, predicate: ["panel"], descendants: true }, { propertyName: "innerSteppers", predicate: ["vertStepperInner"], descendants: true }], ngImport: i0, template: "<div class=\"sof-ar-nav-container\"\r\n [style.top]=\"mobileQuery.matches && advancedSettings.topGapMobile ? advancedSettings.topGapMobile + 'px' : settings.headerHeight + 'px'\"\r\n [class.sof-ar-nav-mobile]=\"mobileQuery.matches\">\r\n <div *ngIf=\"showMessage\" m-a-0 fxLayout=\"row\" fxLayoutAlign=\"space-between center\" sws-alert--secondary role=\"alert\">\r\n <div fxLayout=\"row\" aria-hidden=\"true\">\r\n <i *ngIf=\"showCheckMark\" m-r-5 m-l-5 class=\"fas fa-check-circle icon-container\"></i>\r\n <p class=\"message-container\" m-r-5 m-l-5 [innerHtml]=\"message | translate\"></p>\r\n </div>\r\n <div fxLayout=\"column\">\r\n <button id=\"btnClose\" (click)=\"hide()\" mat-icon-button [attr.aria-label]=\"'common.close' | translate\">\r\n <span aria-hidden=\"true\">\r\n <i class=\"fal fa-times fa-lg\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n <button id=\"sof-ar-nav-btn-menu\" aria-label=\"Menu Button\" mat-icon-button [disableRipple]=\"true\"\r\n (click)=\"snav.toggle()\" class=\"sof-ar-nav-menu-btn\"\r\n [class.hidden]=\"!(mobileQuery.matches || settings.allowNavToggle) || settings.hideNavigation\">\r\n <span *ngIf=\"isNavOpen; else closedIcon\" aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIcon}} menu-icon\"></i>\r\n </span>\r\n <ng-template #closedIcon>\r\n <span aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIconClosed}} menu-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"sr-only\">{{settings.menuButtonSRText | translate}}</span>\r\n </button>\r\n\r\n <mat-sidenav-container autosize class=\"sof-ar-nav-sidenav-container\" [style.marginTop.px]=\"\r\n mobileQuery.matches ? advancedSettings.marginTopMobile : advancedSettings.marginTopDesktop\">\r\n <mat-sidenav [disableClose]=\"!mobileQuery.matches\" class=\"sof-ar-nav-sidenav\" #snav [mode]=\"mobileQuery.matches ? 'over' : 'side'\"\r\n [fixedInViewport]=\"mobileQuery.matches\" [fixedTopGap]=\"mobileQuery.matches ? advancedSettings.topGapMobile : advancedSettings.topGapDesktop\"\r\n [opened]=\"!mobileQuery.matches && !settings.hideNavigation && settings.menuStyle!='progress' \"\r\n [style.width]=\"mobileQuery.matches ? setNavWidth(settings.sideNavWidthMobile) : setNavWidth(settings.sideNavWidthDesktop)\"\r\n [ngStyle]=\"{background:mobileQuery.matches ? themeSettings?.mobileBgColor : undefined}\">\r\n <ng-container *ngIf=\"mobileQuery.matches && userName && !settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{userName}}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"mobileQuery.matches && settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{settings.customUserName | translate}}\r\n </span>\r\n </ng-container>\r\n <!-- Nav Header Content -->\r\n <ng-content select=\"[sof-ar-nav-header]\"> </ng-content>\r\n\r\n <!-- Static Navigation -->\r\n <div class=\"nav-content-item sidenav-background\" *ngIf=\"settings.menuStyle === 'static'\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of navigationData\">\r\n <ng-container *ngIf=\"nav?.subNodes?.length && !nav.hidden\">\r\n <mat-accordion>\r\n <mat-expansion-panel [expanded]=\"nav.expanded\">\r\n <mat-expansion-panel-header [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\">\r\n <!-- Navigation -->\r\n <ng-container>\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </mat-expansion-panel-header>\r\n <!-- SubNav -->\r\n <ng-container>\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(subnav) }\" class=\"subnav-content\"\r\n [disableRipple]=\"true\" *ngFor=\"let subnav of nav?.subNodes\" (click)=\"closeNavigationForMobile()\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLinkActive]=\"['sof-ar-nav-sub-active-route']\" [routerLink]=\"subnav.route\">\r\n {{subnav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <!-- If subnodes are not there -->\r\n <ng-container>\r\n <ng-container *ngIf=\"!nav?.subNodes?.length && !nav?.hidden\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\" class=\"nav-header\"\r\n [disableRipple]=\"true\" (click)=\"closeNavigationForMobile()\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Stepper -->\r\n <mat-vertical-stepper *ngIf=\"settings.menuStyle === 'stepper'\" [selectedIndex]=\"selectedParentIndex\" #vertStepper\r\n [linear]=\"false\" class=\"sidenav-background\">\r\n <!-- Alternate step states for nav, icaons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n\r\n <!-- nav steps -->\r\n <ng-container *ngFor=\"let nav of navigationData; let i = index\">\r\n <mat-step *ngIf=\"!nav?.hidden\" state=\"{{ determineStepState(i, -1) }}\">\r\n <ng-template matStepLabel *ngIf=\"!nav.hidden\">\r\n <div id=\"divStep{{ i }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ nav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"step{{ i }}\" fxFlex=\"100%\" class=\"mat-button step-link\" [routerLink]=\"nav.route\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLinkActive]=\"['step-active']\">\r\n {{ nav.text | translate }}\r\n </a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"nav.stepContent | translate\"></p>\r\n <!-- sub nav -->\r\n <mat-vertical-stepper *ngIf=\"nav?.subNodes\" [selectedIndex]=\"selectedChildIndexes[i]\" [linear]=\"false\"\r\n #vertStepperInner>\r\n <!-- Alternate step states for sub nav, icons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fas fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"none\">\r\n <span></span>\r\n </ng-template>\r\n <!-- sub nav steps -->\r\n <ng-container *ngFor=\"let subnav of nav?.subNodes; let j = index\">\r\n <mat-step state=\"{{ determineStepState(i, j) }}\" *ngIf=\"!subnav.hidden\">\r\n <ng-template matStepLabel>\r\n <div id=\"divSubStep{{ i }}-{{ j }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ subnav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"subStep{{ i }}-{{ j }}\" class=\"mat-button step-link\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLink]=\"subnav.route\"\r\n [routerLinkActive]=\"['step-active']\">{{ subnav.text | translate }}</a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"subnav.stepContent | translate\"></p>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n\r\n <!-- Nav Footer -->\r\n <div class=\"nav-footer-item\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of footerNavigationData\">\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list class=\"nav-header\" [disableRipple]=\"true\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list>\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- the mobile progress menu-->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <div class=\"sidenav-background\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <mat-accordion>\r\n <div *ngFor=\"let step of navigationData; let i = index\">\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length > 0 && !step.hidden\">\r\n <mat-expansion-panel hideToggle class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" (opened)=\"panelOpenState = true\"\r\n (closed)=\"panelOpenState = false\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div style=\"width: -webkit-fill-available;\"\r\n [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n <span *ngIf=\"!panelOpenState\">\r\n <i class=\"fas fa-chevron-down panel-icon\"></i>\r\n </span>\r\n <span *ngIf=\"panelOpenState\">\r\n <i class=\"fas fa-chevron-up panel-icon\"></i>\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <!-- mobile sub menu -->\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"mobileMenu{{ idx }}\" mat-button class=\"step-link progress-menu-mobile-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\" [ngClass]=\"{'disabled':(!subNode.visited) && !settings.overrideNavigation && !subNode.complete,'color-primary':subNode.complete,'progress-menu-active':subNode===activeSubNode}\">{{ subNode.text | translate }}</span>\r\n </button>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n <!-- if there are no subNodes -->\r\n <ng-container *ngIf=\"(!step.subNodes || step.subNodes.length==0) && !step.hidden\">\r\n <mat-expansion-panel #panel hideToggle (opened)=\"disablePanel(panel,i)\" class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </div>\r\n </mat-accordion>\r\n </div>\r\n\r\n <!-- the progress menu language and logout buttons-->\r\n <div class=\"nav-footer-item progress-footer\">\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <!-- Horizontal Progress -->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <mat-progress-bar *ngIf=\"settings?.showProgressBar\" mode=\"determinate\" [value]=\"navProgressCount\"\r\n style=\"height: 9px\" color=\"accent\">\r\n </mat-progress-bar>\r\n <div fxHide.lt-md class=\"step-titles center\" fxLayout=\"row\" style=\"justify-content:center !important\" [class.hidden]=\"settings.hideNavigation\">\r\n <div *ngFor=\"let step of navigationData; let i = index\" class=\"horizontal-progress-div\">\r\n <ng-container *ngIf=\"!step.subNodes?.length && !step.hidden\">\r\n <button mat-button [routerLink]=\"step.route\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n </ng-container>\r\n <!-- if there are subnodes create menus for each step -->\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length && !step.hidden\">\r\n <button [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\"\r\n mat-button [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [matMenuTriggerFor]=\"menu\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" class=\"sof-ar-mat-menu progress-menu-panel\">\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [ngStyle]=\"{width:settings.progressMenuWidth+'px'}\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"submenu{{ idx }}\" mat-button class=\"step-link progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode,'disabled':!subNode.visited && !settings.overrideNavigation}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\">{{ subNode.text |translate }}</span>\r\n </button>\r\n </div>\r\n </mat-menu>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mobile-progress-container\" fxHide.gt-sm>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-content sof-ar-nav-content></ng-content>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n <!-- The progress menu parent node icon template-->\r\n <ng-template #progressParentNodeIcons let-step='step'>\r\n <span *ngIf=\"step.complete && step != activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCompleteIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"step === activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!step.complete && step != activeParentNode\" [ngClass]=\"{'disabled':!step.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The progress menu sub node icon template-->\r\n <ng-template #progressSubNodeIcons let-subNode='subNode'>\r\n <span *ngIf=\"subNode.complete &&activeSubNode !=subNode\">\r\n <i class=\"{{settings.progressMenuCompleteIcon}} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"activeSubNode ===subNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!subNode.complete &&activeSubNode !=subNode\" [ngClass]=\"{'disabled':!subNode.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The navigation footer template for language and logout buttons -->\r\n <ng-template #navigationFooter>\r\n <ng-content select=\"[sof-ar-nav-mobile-footer]\"> </ng-content>\r\n <ng-container *ngIf=\"!settings.useCustomMobileFooter\">\r\n <!-- The language button -->\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length > 2 && mobileQuery.matches\">\r\n <button id=\"sof-ar-nav-lang-dropdown\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\" [matMenuTriggerFor]=\"headerLanguageMenu\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{languageSettings.buttonText | translate}}\r\n </button>\r\n <mat-menu #headerLanguageMenu=\"matMenu\" class=\"sof-ar-mat-menu\">\r\n <button mat-menu-item *ngFor=\"let lang of languageSettings.languages\" (click)=\"setLanguage$.emit(lang)\"\r\n id=\"apply-lang-btn-{{lang}}\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n <div fxFlex=\"auto\">\r\n {{ lang | translate }}\r\n </div>\r\n <div fxFlex=\"auto\" fxLayoutAlign=\"end end\">\r\n <i *ngIf=\"currentLang === lang\" class=\"fad fa-check selected-language-icon\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length === 2 && mobileQuery.matches\">\r\n <button *ngIf=\"languageSettings?.languages.length === 2\" id=\"sof-ar-nav-lang-button\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\" (click)=\"setLanguage$.emit()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{otherLangText | translate}}\r\n </button>\r\n </ng-container>\r\n <!-- The logout button-->\r\n <ng-container *ngIf=\"mobileQuery.matches && userName\">\r\n <button id=\"sof-ar-header-lang-button\" mat-stroked-button class=\"navigationFooter\" (click)=\"logOut()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"fas fa-sign-out-alt\"></i>\r\n </span>\r\n {{logOutText | translate}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n</div>\r\n", styles: [":root{--primary-color-50-parts: #edf4ff;--primary-color-100-parts: #b9d4fc;--primary-color-200-parts: #8ab7fb;--primary-color-300-parts: #5b9af9;--primary-color-400-parts: #3784f7;--primary-color-500-parts: #146ef6;--primary-color-600-parts: #1266f5;--primary-color-700-parts: #0e5bf3;--primary-color-800-parts: #0b51f2;--primary-color-900-parts: #063fef;--primary-color-A100-parts: #ffffff;--primary-color-A200-parts: #e4e9ff;--primary-color-A400-parts: #b1c0ff;--primary-color-A700-parts: #97acff;--primary-color-contrast-50-parts: rgba(0, 0, 0, .87);--primary-color-contrast-100-parts: rgba(0, 0, 0, .87);--primary-color-contrast-200-parts: rgba(0, 0, 0, .87);--primary-color-contrast-300-parts: rgba(0, 0, 0, .87);--primary-color-contrast-400-parts: rgba(255, 255, 255, 1);--primary-color-contrast-500-parts: rgba(255, 255, 255, 1);--primary-color-contrast-600-parts: rgba(255, 255, 255, 1);--primary-color-contrast-700-parts: rgba(255, 255, 255, 1);--primary-color-contrast-800-parts: rgba(255, 255, 255, 1);--primary-color-contrast-900-parts: rgba(255, 255, 255, 1);--primary-color-contrast-A100-parts: rgba(0, 0, 0, .87);--primary-color-contrast-A200-parts: rgba(0, 0, 0, .87);--primary-color-contrast-A400-parts: rgba(0, 0, 0, .87);--primary-color-contrast-A700-parts: rgba(0, 0, 0, .87);--primary-color-50-parts-rgb: 237, 244, 255;--primary-color-100-parts-rgb: 185, 212, 252;--primary-color-200-parts-rgb: 138, 183, 251;--primary-color-300-parts-rgb: 91, 154, 249;--primary-color-400-parts-rgb: 55, 132, 247;--primary-color-500-parts-rgb: 20, 110, 246;--primary-color-600-parts-rgb: 18, 102, 245;--primary-color-700-parts-rgb: 14, 91, 243;--primary-color-800-parts-rgb: 11, 81, 242;--primary-color-900-parts-rgb: 6, 63, 239;--primary-color-A100-parts-rgb: 255, 255, 255;--primary-color-A200-parts-rgb: 228, 233, 255;--primary-color-A400-parts-rgb: 177, 192, 255;--primary-color-A700-parts-rgb: 151, 172, 255;--accent-color-50-parts: #e0f2f1;--accent-color-100-parts: #b2dfdb;--accent-color-200-parts: #80cbc4;--accent-color-300-parts: #4db6ac;--accent-color-400-parts: #26a69a;--accent-color-500-parts: #009688;--accent-color-600-parts: #00897b;--accent-color-700-parts: #00796b;--accent-color-800-parts: #00695c;--accent-color-900-parts: #004d40;--accent-color-A100-parts: #a7ffeb;--accent-color-A200-parts: #64ffda;--accent-color-A400-parts: #1de9b6;--accent-color-A700-parts: #00bfa5;--accent-color-contrast-50-parts: #000000;--accent-color-contrast-100-parts: #000000;--accent-color-contrast-200-parts: #000000;--accent-color-contrast-300-parts: #000000;--accent-color-contrast-400-parts: #000000;--accent-color-contrast-500-parts: #ffffff;--accent-color-contrast-600-parts: #ffffff;--accent-color-contrast-700-parts: #ffffff;--accent-color-contrast-800-parts: #ffffff;--accent-color-contrast-900-parts: #ffffff;--accent-color-contrast-A100-parts: #000000;--accent-color-contrast-A200-parts: #000000;--accent-color-contrast-A400-parts: #000000;--accent-color-contrast-A700-parts: #000000;--accent-color-50-parts-rgb: 224, 242, 241;--accent-color-100-parts-rgb: 178, 223, 219;--accent-color-200-parts-rgb: 128, 203, 196;--accent-color-300-parts-rgb: 77, 182, 172;--accent-color-400-parts-rgb: 38, 166, 154;--accent-color-500-parts-rgb: 0, 150, 136;--accent-color-600-parts-rgb: 0, 137, 123;--accent-color-700-parts-rgb: 0, 121, 107;--accent-color-800-parts-rgb: 0, 105, 92;--accent-color-900-parts-rgb: 0, 77, 64;--accent-color-A100-parts-rgb: 167, 255, 235;--accent-color-A200-parts-rgb: 100, 255, 218;--accent-color-A400-parts-rgb: 29, 233, 182;--accent-color-A700-parts-rgb: 0, 191, 165;--warn-color-50-parts: #fdf3e7;--warn-color-100-parts: #fbe1c3;--warn-color-200-parts: #f9ce9c;--warn-color-300-parts: #f6ba74;--warn-color-400-parts: #f4ab56;--warn-color-500-parts: #f29c38;--warn-color-600-parts: #f09432;--warn-color-700-parts: #ee8a2b;--warn-color-800-parts: #ec8024;--warn-color-900-parts: #e86e17;--warn-color-A100-parts: #ffffff;--warn-color-A200-parts: #fff0e6;--warn-color-A400-parts: #ffd0b3;--warn-color-A700-parts: #ffc19a;--warn-color-contrast-50-parts: rgba(0, 0, 0, .87);--warn-color-contrast-100-parts: rgba(0, 0, 0, .87);--warn-color-contrast-200-parts: rgba(0, 0, 0, .87);--warn-color-contrast-300-parts: rgba(0, 0, 0, .87);--warn-color-contrast-400-parts: rgba(0, 0, 0, .87);--warn-color-contrast-500-parts: rgba(0, 0, 0, .87);--warn-color-contrast-600-parts: rgba(0, 0, 0, .87);--warn-color-contrast-700-parts: rgba(0, 0, 0, .87);--warn-color-contrast-800-parts: rgba(0, 0, 0, .87);--warn-color-contrast-900-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A100-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A200-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A400-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A700-parts: rgba(0, 0, 0, .87);--warn-color-50-parts-rgb: 253, 243, 231;--warn-color-100-parts-rgb: 251, 225, 195;--warn-color-200-parts-rgb: 249, 206, 156;--warn-color-300-parts-rgb: 246, 186, 116;--warn-color-400-parts-rgb: 244, 171, 86;--warn-color-500-parts-rgb: 242, 156, 56;--warn-color-600-parts-rgb: 240, 148, 50;--warn-color-700-parts-rgb: 238, 138, 43;--warn-color-800-parts-rgb: 236, 128, 36;--warn-color-900-parts-rgb: 232, 110, 23;--warn-color-A100-parts-rgb: 255, 255, 255;--warn-color-A200-parts-rgb: 255, 240, 230;--warn-color-A400-parts-rgb: 255, 208, 179;--warn-color-A700-parts-rgb: 255, 193, 154;--info-color-50-parts: #e7f3fb;--info-color-100-parts: #c2e0f4;--info-color-200-parts: #9acced;--info-color-300-parts: #71b7e6;--info-color-400-parts: #52a7e0;--info-color-500-parts: #3498db;--info-color-600-parts: #2f90d7;--info-color-700-parts: #2785d2;--info-color-800-parts: #217bcd;--info-color-900-parts: #156ac4;--info-color-A100-parts: #f5f9ff;--info-color-A200-parts: #c2ddff;--info-color-A400-parts: #8fc1ff;--info-color-A700-parts: #75b3ff;--info-color-contrast-50-parts: rgba(0, 0, 0, .87);--info-color-contrast-100-parts: rgba(0, 0, 0, .87);--info-color-contrast-200-parts: rgba(0, 0, 0, .87);--info-color-contrast-300-parts: rgba(0, 0, 0, .87);--info-color-contrast-400-parts: rgba(255, 255, 255, 1);--info-color-contrast-500-parts: rgba(255, 255, 255, 1);--info-color-contrast-600-parts: rgba(255, 255, 255, 1);--info-color-contrast-700-parts: rgba(255, 255, 255, 1);--info-color-contrast-800-parts: rgba(255, 255, 255, 1);--info-color-contrast-900-parts: rgba(255, 255, 255, 1);--info-color-contrast-A100-parts: rgba(0, 0, 0, .87);--info-color-contrast-A200-parts: rgba(0, 0, 0, .87);--info-color-contrast-A400-parts: rgba(0, 0, 0, .87);--info-color-contrast-A700-parts: rgba(0, 0, 0, .87);--info-color-50-parts-rgb: 231, 243, 251;--info-color-100-parts-rgb: 194, 224, 244;--info-color-200-parts-rgb: 154, 204, 237;--info-color-300-parts-rgb: 113, 183, 230;--info-color-400-parts-rgb: 82, 167, 224;--info-color-500-parts-rgb: 52, 152, 219;--info-color-600-parts-rgb: 47, 144, 215;--info-color-700-parts-rgb: 39, 133, 210;--info-color-800-parts-rgb: 33, 123, 205;--info-color-900-parts-rgb: 21, 106, 196;--info-color-A100-parts-rgb: 245, 249, 255;--info-color-A200-parts-rgb: 194, 221, 255;--info-color-A400-parts-rgb: 143, 193, 255;--info-color-A700-parts-rgb: 117, 179, 255;--success-color-50-parts: #edf5eb;--success-color-100-parts: #d1e6ce;--success-color-200-parts: #b3d6ae;--success-color-300-parts: #95c58d;--success-color-400-parts: #7eb874;--success-color-500-parts: #67ac5c;--success-color-600-parts: #5fa554;--success-color-700-parts: #549b4a;--success-color-800-parts: #4a9241;--success-color-900-parts: #398230;--success-color-A100-parts: #d0ffcb;--success-color-A200-parts: #a2ff98;--success-color-A400-parts: #74ff65;--success-color-A700-parts: #5dff4c;--success-color-contrast-50-parts: rgba(0, 0, 0, .87);--success-color-contrast-100-parts: rgba(0, 0, 0, .87);--success-color-contrast-200-parts: rgba(0, 0, 0, .87);--success-color-contrast-300-parts: rgba(0, 0, 0, .87);--success-color-contrast-400-parts: rgba(0, 0, 0, .87);--success-color-contrast-500-parts: rgba(0, 0, 0, .87);--success-color-contrast-600-parts: rgba(0, 0, 0, .87);--success-color-contrast-700-parts: rgba(255, 255, 255, 1);--success-color-contrast-800-parts: rgba(255, 255, 255, 1);--success-color-contrast-900-parts: rgba(255, 255, 255, 1);--success-color-contrast-A100-parts: rgba(0, 0, 0, .87);--success-color-contrast-A200-parts: rgba(0, 0, 0, .87);--success-color-contrast-A400-parts: rgba(0, 0, 0, .87);--success-color-contrast-A700-parts: rgba(0, 0, 0, .87);--success-color-50-parts-rgb: 237, 245, 235;--success-color-100-parts-rgb: 209, 230, 206;--success-color-200-parts-rgb: 179, 214, 174;--success-color-300-parts-rgb: 149, 197, 141;--success-color-400-parts-rgb: 126, 184, 116;--success-color-500-parts-rgb: 103, 172, 92;--success-color-600-parts-rgb: 95, 165, 84;--success-color-700-parts-rgb: 84, 155, 74;--success-color-800-parts-rgb: 74, 146, 65;--success-color-900-parts-rgb: 57, 130, 48;--success-color-A100-parts-rgb: 208, 255, 203;--success-color-A200-parts-rgb: 162, 255, 152;--success-color-A400-parts-rgb: 116, 255, 101;--success-color-A700-parts-rgb: 93, 255, 76;--error-color-50-parts: #fceae8;--error-color-100-parts: #f8c9c5;--error-color-200-parts: #f3a69e;--error-color-300-parts: #ee8277;--error-color-400-parts: #eb6759;--error-color-500-parts: #e74c3c;--error-color-600-parts: #e44536;--error-color-700-parts: #e03c2e;--error-color-800-parts: #dd3327;--error-color-900-parts: #d7241a;--error-color-A100-parts: #ffffff;--error-color-A200-parts: #ffd9d7;--error-color-A400-parts: #ffa8a4;--error-color-A700-parts: #ff8f8b;--error-color-contrast-50-parts: rgba(0, 0, 0, .87);--error-color-contrast-100-parts: rgba(0, 0, 0, .87);--error-color-contrast-200-parts: rgba(0, 0, 0, .87);--error-color-contrast-300-parts: rgba(0, 0, 0, .87);--error-color-contrast-400-parts: rgba(0, 0, 0, .87);--error-color-contrast-500-parts: rgba(255, 255, 255, 1);--error-color-contrast-600-parts: rgba(255, 255, 255, 1);--error-color-contrast-700-parts: rgba(255, 255, 255, 1);--error-color-contrast-800-parts: rgba(255, 255, 255, 1);--error-color-contrast-900-parts: rgba(255, 255, 255, 1);--error-color-contrast-A100-parts: rgba(0, 0, 0, .87);--error-color-contrast-A200-parts: rgba(0, 0, 0, .87);--error-color-contrast-A400-parts: rgba(0, 0, 0, .87);--error-color-contrast-A700-parts: rgba(0, 0, 0, .87);--error-color-50-parts-rgb: 252, 234, 232;--error-color-100-parts-rgb: 248, 201, 197;--error-color-200-parts-rgb: 248, 201, 197;--error-color-300-parts-rgb: 238, 130, 119;--error-color-400-parts-rgb: 235, 103, 89;--error-color-500-parts-rgb: 231, 76, 60;--error-color-600-parts-rgb: 228, 69, 54;--error-color-700-parts-rgb: 224, 60, 46;--error-color-800-parts-rgb: 221, 51, 39;--error-color-900-parts-rgb: 215, 36, 26;--error-color-A100-parts-rgb: 255, 255, 255;--error-color-A200-parts-rgb: 255, 217, 215;--error-color-A400-parts-rgb: 255, 168, 164;--error-color-A700-parts-rgb: 255, 143, 139;--neutral-color-50-parts: #fafafa;--neutral-color-100-parts: #f5f5f5;--neutral-color-200-parts: #eeeeee;--neutral-color-300-parts: #e0e0e0;--neutral-color-400-parts: #bdbdbd;--neutral-color-500-parts: #9e9e9e;--neutral-color-600-parts: #757575;--neutral-color-700-parts: #616161;--neutral-color-800-parts: #424242;--neutral-color-900-parts: #212121;--neutral-color-A100-parts: #ffffff;--neutral-color-A200-parts: #ffffff;--neutral-color-A400-parts: #ffffff;--neutral-color-A700-parts: #ffffff;--neutral-color-contrast-50-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-100-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-200-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-300-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-400-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-500-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-600-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-700-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-800-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-900-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-A100-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-A200-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-A400-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-A700-parts: rgba(0, 0, 0, .87);--neutral-color-50-parts-rgb: 250, 250, 250;--neutral-color-100-parts-rgb: 245, 245, 245;--neutral-color-200-parts-rgb: 238, 238, 238;--neutral-color-300-parts-rgb: 224, 224, 224;--neutral-color-400-parts-rgb: 189, 189, 189;--neutral-color-500-parts-rgb: 158, 158, 158;--neutral-color-600-parts-rgb: 117, 117, 117;--neutral-color-700-parts-rgb: 97, 97, 97;--neutral-color-800-parts-rgb: 66, 66, 66;--neutral-color-900-parts-rgb: 33, 33, 33;--neutral-color-A100-parts-rgb: 255, 255, 255;--neutral-color-A200-parts-rgb: 255, 255, 255;--neutral-color-A400-parts-rgb: 255, 255, 255;--neutral-color-A700-parts-rgb: 255, 255, 255}.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale3d(0,0,0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}@keyframes cdk-text-field-autofill-start{}@keyframes cdk-text-field-autofill-end{}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}.mat-focus-indicator{position:relative}.mat-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border:var(--mat-focus-indicator-border-width, 3px) var(--mat-focus-indicator-border-style, solid) var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-focus-indicator-display: block}.mat-mdc-focus-indicator{position:relative}.mat-mdc-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-mdc-focus-indicator-display, none);border:var(--mat-mdc-focus-indicator-border-width, 3px) var(--mat-mdc-focus-indicator-border-style, solid) var(--mat-mdc-focus-indicator-border-color, transparent);border-radius:var(--mat-mdc-focus-indicator-border-radius, 4px)}.mat-mdc-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-mdc-focus-indicator-display: block}.mat-ripple-element{background-color:#0000001a}.mat-mdc-option{color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, .87))}.mat-mdc-option:hover:not(.mdc-list-item--disabled),.mat-mdc-option:focus:not(.mdc-list-item--disabled),.mat-mdc-option.mat-mdc-option-active,.mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mdc-theme-primary, var(--primary-color-500-parts))}.mat-accent .mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mdc-theme-secondary, var(--accent-color-500-parts))}.mat-warn .mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mdc-theme-error, #f44336)}.mat-mdc-optgroup-label{color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, .87))}.mat-pseudo-checkbox{color:#0000008a}.mat-pseudo-checkbox:after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:var(--primary-color-500-parts)}.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate,.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate{background:var(--accent-color-500-parts)}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa;color:#000000de}.mat-elevation-z0,.mat-mdc-elevation-specific.mat-elevation-z0{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f}.mat-elevation-z1,.mat-mdc-elevation-specific.mat-elevation-z1{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.mat-elevation-z2,.mat-mdc-elevation-specific.mat-elevation-z2{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.mat-elevation-z3,.mat-mdc-elevation-specific.mat-elevation-z3{box-shadow:0 3px 3px -2px #0003,0 3px 4px #00000024,0 1px 8px #0000001f}.mat-elevation-z4,.mat-mdc-elevation-specific.mat-elevation-z4{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.mat-elevation-z5,.mat-mdc-elevation-specific.mat-elevation-z5{box-shadow:0 3px 5px -1px #0003,0 5px 8px #00000024,0 1px 14px #0000001f}.mat-elevation-z6,.mat-mdc-elevation-specific.mat-elevation-z6{box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.mat-elevation-z7,.mat-mdc-elevation-specific.mat-elevation-z7{box-shadow:0 4px 5px -2px #0003,0 7px 10px 1px #00000024,0 2px 16px 1px #0000001f}.mat-elevation-z8,.mat-mdc-elevation-specific.mat-elevation-z8{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.mat-elevation-z9,.mat-mdc-elevation-specific.mat-elevation-z9{box-shadow:0 5px 6px -3px #0003,0 9px 12px 1px #00000024,0 3px 16px 2px #0000001f}.mat-elevation-z10,.mat-mdc-elevation-specific.mat-elevation-z10{box-shadow:0 6px 6px -3px #0003,0 10px 14px 1px #00000024,0 4px 18px 3px #0000001f}.mat-elevation-z11,.mat-mdc-elevation-specific.mat-elevation-z11{box-shadow:0 6px 7px -4px #0003,0 11px 15px 1px #00000024,0 4px 20px 3px #0000001f}.mat-elevation-z12,.mat-mdc-elevation-specific.mat-elevation-z12{box-shadow:0 7px 8px -4px #0003,0 12px 17px 2px #00000024,0 5px 22px 4px #0000001f}.mat-elevation-z13,.mat-mdc-elevation-specific.mat-elevation-z13{box-shadow:0 7px 8px -4px #0003,0 13px 19px 2px #00000024,0 5px 24px 4px #0000001f}.mat-elevation-z14,.mat-mdc-elevation-specific.mat-elevation-z14{box-shadow:0 7px 9px -4px #0003,0 14px 21px 2px #00000024,0 5px 26px 4px #0000001f}.mat-elevation-z15,.mat-mdc-elevation-specific.mat-elevation-z15{box-shadow:0 8px 9px -5px #0003,0 15px 22px 2px #00000024,0 6px 28px 5px #0000001f}.mat-elevation-z16,.mat-mdc-elevation-specific.mat-elevation-z16{box-shadow:0 8px 10px -5px #0003,0 16px 24px 2px #00000024,0 6px 30px 5px #0000001f}.mat-elevation-z17,.mat-mdc-elevation-specific.mat-elevation-z17{box-shadow:0 8px 11px -5px #0003,0 17px 26px 2px #00000024,0 6px 32px 5px #0000001f}.mat-elevation-z18,.mat-mdc-elevation-specific.mat-elevation-z18{box-shadow:0 9px 11px -5px #0003,0 18px 28px 2px #00000024,0 7px 34px 6px #0000001f}.mat-elevation-z19,.mat-mdc-elevation-specific.mat-elevation-z19{box-shadow:0 9px 12px -6px #0003,0 19px 29px 2px #00000024,0 7px 36px 6px #0000001f}.mat-elevation-z20,.mat-mdc-elevation-specific.mat-elevation-z20{box-shadow:0 10px 13px -6px #0003,0 20px 31px 3px #00000024,0 8px 38px 7px #0000001f}.mat-elevation-z21,.mat-mdc-elevation-specific.mat-elevation-z21{box-shadow:0 10px 13px -6px #0003,0 21px 33px 3px #00000024,0 8px 40px 7px #0000001f}.mat-elevation-z22,.mat-mdc-elevation-specific.mat-elevation-z22{box-shadow:0 10px 14px -6px #0003,0 22px 35px 3px #00000024,0 8px 42px 7px #0000001f}.mat-elevation-z23,.mat-mdc-elevation-specific.mat-elevation-z23{box-shadow:0 11px 14px -7px #0003,0 23px 36px 3px #00000024,0 9px 44px 8px #0000001f}.mat-elevation-z24,.mat-mdc-elevation-specific.mat-elevation-z24{box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-theme-loaded-marker{display:none}.mat-mdc-option{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 16px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, .03125em)}::ng-deep :root{--sof-nav-content-bg-color: #fffdfd;--sof-nav-font-color: #eee;--sof-nav-bg-gradient-color-1: #fff;--sof-nav-bg-gradient-color-2: #fff;--sof-nav-border-right-color: transparent;--sof-nav-list-border-color: #cfd8dc;--sof-nav-highlight-gradient-1: mat.get-color-from-palette($my-app-primary, 100);--sof-nav-highlight-gradient-2: rgba(255, 255, 255, 0);--sof-nav-sub-highlight-border-color: #616161;--sof-nav-sub-highlight-bg-color: #424242}.sof-ar-nav-sidenav{background:rgb(0,0,0);border-right-color:var(--sof-nav-border-right-color);background:linear-gradient(-180deg,var(--sof-nav-bg-gradient-color-1) 0%,var(--sof-nav-bg-gradient-color-2) 100%);overflow:hidden}.sof-ar-nav-sidenav *{color:var(--sof-nav-font-color)!important}::ng-deep [sof-ar-nav-footer] *,::ng-deep [sof-ar-nav-header] *{color:var(--sof-nav-font-color)!important}::ng-deep .sof-ar-nav-active-route:active{background:rgb(0,0,0)!important;background:linear-gradient(90deg,var(--sof-nav-highlight-gradient-1) 0%,var(--sof-nav-highlight-gradient-2) 80%)!important;border-bottom-right-radius:8px!important;border-top-right-radius:8px!important}::ng-deep .sof-ar-nav-sub-active-route{background:var(--sof-nav-sub-highlight-bg-color);margin-right:-4px;position:relative}::ng-deep .sof-ar-nav-sub-active-route:focus,::ng-deep .sof-ar-nav-sub-active-route:active{background:var(--sof-nav-sub-highlight-bg-color)!important}::ng-deep .sof-ar-nav-sub-active-route:before{content:\"\";display:block;position:absolute;top:0;height:inherit}::ng-deep .mat-drawer-container{background:var(--sof-nav-content-bg-color)!important}.sof-ar-nav-container{display:flex;flex-direction:column;position:absolute;bottom:0;left:0;right:0}h1.example-app-name{margin-left:8px}.sof-ar-nav-sidenav-container{flex:1}.example-is-mobile .example-sidenav-container{flex:1 0 auto}.hidden{display:none!important}.sof-ar-nav-buffer{height:40px}button.nav-item{border:0;background:transparent}.nav-item{font-size:15px!important;font-weight:500!important}.nav-item.mat-mdc-list-item-interactive:focus:before,.nav-item.mat-mdc-list-item-interactive:hover:before{opacity:0!important}.mat-expansion-indicator{border-bottom-right-radius:11px!important}.nav-footer-item{background:#FAFAFA;position:absolute;bottom:0%;width:18rem}.progress-footer{display:flex;width:100%;z-index:2}.panel-icon{float:right;color:#000!important}.user-name{display:inline-block;height:3.5rem;padding-left:.5rem;padding-top:3rem;padding-right:.5rem;font-size:larger;font-weight:800}::ng-deep .mat-mdc-list-base{padding:0!important}::ng-deep .mat-drawer-inner-container{min-width:275px;overflow:hidden!important}::ng-deep .mat-drawer-inner-container:hover{overflow:overlay!important}::ng-deep .icon-styling{padding-right:10px;padding-left:10px;width:24px;text-align:left}::ng-deep .nav-icon{margin-left:auto;padding-left:30px}::ng-deep .nav-item{font-family:Poppins;font-weight:500;padding-top:2px!important;padding-left:0!important}::ng-deep [sof-ar-nav-footer] hr{margin:5px 10px;opacity:.5}.subnav-content{padding:0;height:48px!important}.nav-header{height:64px!important}.mat-mdc-list-item{background-color:transparent;display:inline!important}::ng-deep .mdc-list-item__content{padding:0 4px!important;padding-left:1.5rem!important}::ng-deep .subnav-item{padding-left:1rem!important}::ng-deep .visible-mobile{display:none}@media only screen and (max-width: 959px){::ng-deep .visible-mobile{display:block}}@media (max-width: 959px){::ng-deep .sof-ar-fixed-nav{position:fixed;z-index:2;width:100%!important;box-sizing:border-box}}::ng-deep .sof-ar-nav-menu-btn{position:fixed!important;z-index:2!important;top:1.25%;width:44px!important;height:40px!important;color:var(--primary-color-500-parts)!important;background:var(--primary-color-50-parts)!important;border-radius:8px!important;padding:0!important}@media (max-width: 959px){::ng-deep .sof-ar-nav-menu-btn{margin-left:2%!important}}@media (min-width: 959px){::ng-deep .sof-ar-nav-menu-btn{margin-left:11px!important}}::ng-deep .sof-ar-nav-menu-btn:hover .mdc-icon-button__ripple,::ng-deep .sof-ar-nav-menu-btn:focus .mdc-icon-button__ripple{border-radius:inherit!important}@media only screen and (min-width: 959px){::ng-deep .mat-mdc-list-base:not(.subnav-item):not(.custom-nav):before{content:\"\";display:block;height:1px;margin-left:auto;width:calc(100% - 40px)}::ng-deep .mat-mdc-list-base:not(.subnav-item):not(.custom-nav):after{content:\"\";display:block;height:1px;margin-left:auto;width:calc(100% - 40px);margin-bottom:-1px}}::ng-deep .mat-step-text-label{color:#fff;font-family:Poppins,sans-serif!important;font-size:1.3em}::ng-deep .mat-expansion-indicator{padding:1em!important}::ng-deep .mat-stepper-vertical{background-color:transparent!important}.mat-mdc-nav-list{width:100%;margin-top:3px;margin-bottom:3px}.mat-mdc-nav-list:hover{border-bottom-right-radius:8px!important;border-top-right-radius:8px!important;background:var(--sof-nav-highlight-gradient-1)!important}.mat-expansion-panel-header{padding:0;height:64px!important;margin-top:3px;margin-bottom:3px}.mat-expansion-panel-header:hover,.sof-ar-nav-selected{background:var(--sof-nav-highlight-gradient-1)!important;border-bottom-right-radius:8px!important;border-top-right-radius:8px!important}.mat-expansion-panel{display:inline}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.step-active{border-bottom:3px solid var(--primary-color-500-parts);border-bottom-left-radius:0;border-bottom-right-radius:0}::ng-deep .mat-vertical-content{padding-bottom:0!important}.step-link{padding-left:0!important;padding-right:0!important}.step-titles{padding-top:20px;padding-bottom:20px}.step-titles>button{font-family:Poppins,sans-serif!important;font-size:16px!important;font-weight:500!important;color:#000;background-color:transparent!important}.step-active{border-bottom:0!important}::ng-deep .progress-menu-active,progress-menu-active *{color:#000!important}::ng-deep .color-primary,.color-primary *{color:var(--primary-color-500-parts)!important}.sof-ar-nav-sidenav{max-width:-webkit-fill-available}.nav-menu-btn-text{white-space:normal}.progress-menu-btn{width:-webkit-fill-available;text-align:left;padding:12px 16px!important;font-size:16px!important;height:-moz-fit-content;height:fit-content}::ng-deep .disabled,.disabled *,.progress-menu-btn:disabled,.progress-menu-mobile-btn:disabled,.mat-expansion-panel-header:disabled{color:#333c!important}.progress-nav-icon{margin-right:10px;font-size:14px}::ng-deep .progress-menu-mobile-btn{display:flex!important}::ng-deep .progress-nav-menu{display:flex!important}.progress-menu-mobile-btn{padding:12px 24px!important;width:-webkit-fill-available;text-align:left;height:-moz-fit-content;height:fit-content}.progress-mobile-panel-title{width:-webkit-fill-available;font-size:16px;font-family:Poppins,sans-serif!important;padding-left:24px}.progress-mobile-expansion-panel{margin:0!important}::ng-deep .progress-mobile-expansion-panel .mat-expansion-panel-body{background:var(--primary-color-50-parts)!important;padding:0!important;font-size:16px!important}::ng-deep .mat-mdc-menu-panel{max-width:unset!important}::ng-deep .progress-menu-panel{background:var(--primary-color-50-parts)!important}::ng-deep .cdk-overlay-container .cdk-overlay-pane{transform:none!important}::ng-deep .cdk-overlay-container .cdk-overlay-pane .step-option{margin-top:33px!important}.mobile-progress-container{padding-bottom:24px}.step-titles-mobile{padding-top:25px;padding-bottom:25px;background-color:transparent}.step-titles-mobile ::ng-deep .mat-mdc-select-trigger{padding-left:17px;padding-right:20px}.step-done{color:var(--accent-color-900-parts)!important;cursor:pointer}.step-future{color:var(--primary-color-900-parts)!important;opacity:.7}::ng-deep .mat-form-field-appearance-outline .mat-mdc-form-field-infix{padding-left:.5em!important;padding-right:.5em!important}::ng-deep .mdc-floating-label{padding-left:.5em!important;padding-right:.5em!important}::ng-deep .mat-form-field-appearance-outline .mat-mdc-form-field-icon-prefix{top:0!important}::ng-deep .mat-form-field-appearance-outline .mat-mdc-form-field-icon-suffix{top:0!important}[sws-alert--secondary]{max-height:90px;min-height:52px;padding:0 0 0 24px;margin:2px 5px;border-radius:5px;font-weight:700;font-size:16px;background:rgba(29,190,104,.1);border:2px solid #2b9c62;color:#2b9c62}.icon-container{align-self:center}.message-container{margin-left:10px;line-height:1.8}#btnClose{color:#000}.navigationFooter{width:100%;border:none;height:64px!important;font-family:Poppins;font-weight:500;font-size:15px!important;position:relative;text-align:left;padding-left:1.5rem}.navigationFooter:hover{color:unset!important}.nav-item-margin{position:relative;display:flex!important;width:inherit!important;height:inherit!important}.sof-ar-nav-menu-icon{font-size:23px}.menu-icon{color:var(--primary-color-800-parts)!important}.sidenav-background{background:transparent!important}::ng-deep .mat-expansion-panel-body{padding:0!important}::ng-deep .subnav-content>a>.mdc-list-item__content{padding:0 4px!important;padding-left:4.25rem!important}::ng-deep .nav-content-item{margin-right:24px;margin-top:24px}.sof-ar-nav-header-text{font-family:Poppins;font-weight:500;font-size:14px;line-height:175%;letter-spacing:.14em}\n"], dependencies: [{ kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i7.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i8.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i8.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i8.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i9.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i9.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i9.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i11.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i13.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i13.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i13.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i13.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i13.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i14.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i14.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i15.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i15.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i15.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i15.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "component", type: i16.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: i17.TranslatePipe, name: "translate" }] });
519
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: ArmatureNavigationComponent, decorators: [{
520
+ type: Component,
521
+ args: [{ selector: 'sof-ar-navigation', providers: [{
522
+ provide: STEPPER_GLOBAL_OPTIONS, useValue: { displayDefaultIndicatorType: false }
523
+ }], template: "<div class=\"sof-ar-nav-container\"\r\n [style.top]=\"mobileQuery.matches && advancedSettings.topGapMobile ? advancedSettings.topGapMobile + 'px' : settings.headerHeight + 'px'\"\r\n [class.sof-ar-nav-mobile]=\"mobileQuery.matches\">\r\n <div *ngIf=\"showMessage\" m-a-0 fxLayout=\"row\" fxLayoutAlign=\"space-between center\" sws-alert--secondary role=\"alert\">\r\n <div fxLayout=\"row\" aria-hidden=\"true\">\r\n <i *ngIf=\"showCheckMark\" m-r-5 m-l-5 class=\"fas fa-check-circle icon-container\"></i>\r\n <p class=\"message-container\" m-r-5 m-l-5 [innerHtml]=\"message | translate\"></p>\r\n </div>\r\n <div fxLayout=\"column\">\r\n <button id=\"btnClose\" (click)=\"hide()\" mat-icon-button [attr.aria-label]=\"'common.close' | translate\">\r\n <span aria-hidden=\"true\">\r\n <i class=\"fal fa-times fa-lg\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n <button id=\"sof-ar-nav-btn-menu\" aria-label=\"Menu Button\" mat-icon-button [disableRipple]=\"true\"\r\n (click)=\"snav.toggle()\" class=\"sof-ar-nav-menu-btn\"\r\n [class.hidden]=\"!(mobileQuery.matches || settings.allowNavToggle) || settings.hideNavigation\">\r\n <span *ngIf=\"isNavOpen; else closedIcon\" aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIcon}} menu-icon\"></i>\r\n </span>\r\n <ng-template #closedIcon>\r\n <span aria-hidden=\"true\" class=\"sof-ar-nav-menu-icon\">\r\n <i class=\"{{settings.fontAwesomeMenuIconClosed}} menu-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <span class=\"sr-only\">{{settings.menuButtonSRText | translate}}</span>\r\n </button>\r\n\r\n <mat-sidenav-container autosize class=\"sof-ar-nav-sidenav-container\" [style.marginTop.px]=\"\r\n mobileQuery.matches ? advancedSettings.marginTopMobile : advancedSettings.marginTopDesktop\">\r\n <mat-sidenav [disableClose]=\"!mobileQuery.matches\" class=\"sof-ar-nav-sidenav\" #snav [mode]=\"mobileQuery.matches ? 'over' : 'side'\"\r\n [fixedInViewport]=\"mobileQuery.matches\" [fixedTopGap]=\"mobileQuery.matches ? advancedSettings.topGapMobile : advancedSettings.topGapDesktop\"\r\n [opened]=\"!mobileQuery.matches && !settings.hideNavigation && settings.menuStyle!='progress' \"\r\n [style.width]=\"mobileQuery.matches ? setNavWidth(settings.sideNavWidthMobile) : setNavWidth(settings.sideNavWidthDesktop)\"\r\n [ngStyle]=\"{background:mobileQuery.matches ? themeSettings?.mobileBgColor : undefined}\">\r\n <ng-container *ngIf=\"mobileQuery.matches && userName && !settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{userName}}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"mobileQuery.matches && settings.customUserName\">\r\n <span class=\"user-name\">\r\n {{settings.customUserName | translate}}\r\n </span>\r\n </ng-container>\r\n <!-- Nav Header Content -->\r\n <ng-content select=\"[sof-ar-nav-header]\"> </ng-content>\r\n\r\n <!-- Static Navigation -->\r\n <div class=\"nav-content-item sidenav-background\" *ngIf=\"settings.menuStyle === 'static'\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of navigationData\">\r\n <ng-container *ngIf=\"nav?.subNodes?.length && !nav.hidden\">\r\n <mat-accordion>\r\n <mat-expansion-panel [expanded]=\"nav.expanded\">\r\n <mat-expansion-panel-header [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\">\r\n <!-- Navigation -->\r\n <ng-container>\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <a class=\"nav-item\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"{{nav?.fontAwesomeIcon}}\"></i>\r\n </span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </mat-expansion-panel-header>\r\n <!-- SubNav -->\r\n <ng-container>\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(subnav) }\" class=\"subnav-content\"\r\n [disableRipple]=\"true\" *ngFor=\"let subnav of nav?.subNodes\" (click)=\"closeNavigationForMobile()\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLinkActive]=\"['sof-ar-nav-sub-active-route']\" [routerLink]=\"subnav.route\">\r\n {{subnav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <!-- If subnodes are not there -->\r\n <ng-container>\r\n <ng-container *ngIf=\"!nav?.subNodes?.length && !nav?.hidden\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list [ngClass]=\"{ 'sof-ar-nav-selected': isNavSelected(nav) }\" class=\"nav-header\"\r\n [disableRipple]=\"true\" (click)=\"closeNavigationForMobile()\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list [disableRipple]=\"true\">\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n <span class=\"sof-ar-nav-header-text\">{{nav.text | translate}}</span>\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Stepper -->\r\n <mat-vertical-stepper *ngIf=\"settings.menuStyle === 'stepper'\" [selectedIndex]=\"selectedParentIndex\" #vertStepper\r\n [linear]=\"false\" class=\"sidenav-background\">\r\n <!-- Alternate step states for nav, icaons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n\r\n <!-- nav steps -->\r\n <ng-container *ngFor=\"let nav of navigationData; let i = index\">\r\n <mat-step *ngIf=\"!nav?.hidden\" state=\"{{ determineStepState(i, -1) }}\">\r\n <ng-template matStepLabel *ngIf=\"!nav.hidden\">\r\n <div id=\"divStep{{ i }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ nav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"step{{ i }}\" fxFlex=\"100%\" class=\"mat-button step-link\" [routerLink]=\"nav.route\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLinkActive]=\"['step-active']\">\r\n {{ nav.text | translate }}\r\n </a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"nav.stepContent | translate\"></p>\r\n <!-- sub nav -->\r\n <mat-vertical-stepper *ngIf=\"nav?.subNodes\" [selectedIndex]=\"selectedChildIndexes[i]\" [linear]=\"false\"\r\n #vertStepperInner>\r\n <!-- Alternate step states for sub nav, icons should always be white only worked with styles -->\r\n <ng-template matStepperIcon=\"create\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"edit\">\r\n <span>\r\n <i class=\"fad fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"done\">\r\n <span>\r\n <i class=\"fas fa-check\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"active\">\r\n <span>\r\n <i class=\"fas fa-pencil-alt\" style=\"color: white !important\"></i>\r\n </span>\r\n </ng-template>\r\n <ng-template matStepperIcon=\"none\">\r\n <span></span>\r\n </ng-template>\r\n <!-- sub nav steps -->\r\n <ng-container *ngFor=\"let subnav of nav?.subNodes; let j = index\">\r\n <mat-step state=\"{{ determineStepState(i, j) }}\" *ngIf=\"!subnav.hidden\">\r\n <ng-template matStepLabel>\r\n <div id=\"divSubStep{{ i }}-{{ j }}\" style=\"height: 72px\" fxLayout=\"row\" fxLayoutAlign=\"start center\"\r\n matTooltip=\"{{ subnav.text | translate }}\" [matTooltipPosition]=\"'after'\" fxFlex=\"100%\">\r\n <a id=\"subStep{{ i }}-{{ j }}\" class=\"mat-button step-link\"\r\n [ngStyle]=\"{ color: themeSettings?.fontColor }\" [routerLink]=\"subnav.route\"\r\n [routerLinkActive]=\"['step-active']\">{{ subnav.text | translate }}</a>\r\n </div>\r\n </ng-template>\r\n <p [innerHTML]=\"subnav.stepContent | translate\"></p>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n </mat-step>\r\n </ng-container>\r\n\r\n </mat-vertical-stepper>\r\n\r\n <!-- Nav Footer -->\r\n <div class=\"nav-footer-item\">\r\n <ng-container *ngIf=\"settings.menuStyle === 'static'\">\r\n <ng-container *ngFor=\"let nav of footerNavigationData\">\r\n <ng-container>\r\n <!-- Desktop Nav -->\r\n <ng-container *ngIf=\"!nav?.subNodes?.length\">\r\n <!-- If there is a route -->\r\n <ng-container *ngIf=\"nav?.route\">\r\n <mat-nav-list class=\"nav-header\" [disableRipple]=\"true\">\r\n <a class=\"nav-item nav-item-margin\" mat-list-item [routerLink]=\"nav?.route\"\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </a>\r\n </mat-nav-list>\r\n </ng-container>\r\n <!-- If there is not a route -->\r\n <ng-container *ngIf=\"!nav?.route\">\r\n <mat-nav-list>\r\n <button id=\"sof-ar-nav-btn-node\" class=\"nav-item\" mat-list-item\r\n [routerLinkActive]=\"['sof-ar-nav-active-route']\">\r\n <ng-container *ngIf=\"nav?.fontAwesomeIcon\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\"><i class=\"{{nav?.fontAwesomeIcon}}\"></i></span>\r\n </ng-container>\r\n {{nav.text | translate}}\r\n </button>\r\n </mat-nav-list>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- the mobile progress menu-->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <div class=\"sidenav-background\" [ngStyle]=\"{'padding-bottom.px': (footerItemCount*64)+128}\">\r\n <mat-accordion>\r\n <div *ngFor=\"let step of navigationData; let i = index\">\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length > 0 && !step.hidden\">\r\n <mat-expansion-panel hideToggle class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" (opened)=\"panelOpenState = true\"\r\n (closed)=\"panelOpenState = false\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div style=\"width: -webkit-fill-available;\"\r\n [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n <span *ngIf=\"!panelOpenState\">\r\n <i class=\"fas fa-chevron-down panel-icon\"></i>\r\n </span>\r\n <span *ngIf=\"panelOpenState\">\r\n <i class=\"fas fa-chevron-up panel-icon\"></i>\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <!-- mobile sub menu -->\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"mobileMenu{{ idx }}\" mat-button class=\"step-link progress-menu-mobile-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\" [ngClass]=\"{'disabled':(!subNode.visited) && !settings.overrideNavigation && !subNode.complete,'color-primary':subNode.complete,'progress-menu-active':subNode===activeSubNode}\">{{ subNode.text | translate }}</span>\r\n </button>\r\n </div>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n <!-- if there are no subNodes -->\r\n <ng-container *ngIf=\"(!step.subNodes || step.subNodes.length==0) && !step.hidden\">\r\n <mat-expansion-panel #panel hideToggle (opened)=\"disablePanel(panel,i)\" class=\"progress-mobile-expansion-panel\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title class=\"progress-mobile-panel-title\">\r\n <div [ngClass]=\"{'disabled':(!step.visited || step.isDisabled) && !settings.overrideNavigation && !step.complete,'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \" }}\r\n </span>\r\n <span class=\"nav-btn-text\">\r\n {{ step.text | translate }}\r\n </span>\r\n </div>\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n </mat-expansion-panel>\r\n </ng-container>\r\n </div>\r\n </mat-accordion>\r\n </div>\r\n\r\n <!-- the progress menu language and logout buttons-->\r\n <div class=\"nav-footer-item progress-footer\">\r\n <ng-template [ngTemplateOutlet]=\"navigationFooter\">\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <!-- Horizontal Progress -->\r\n <ng-container *ngIf=\"settings?.menuStyle === 'progress'\">\r\n <mat-progress-bar *ngIf=\"settings?.showProgressBar\" mode=\"determinate\" [value]=\"navProgressCount\"\r\n style=\"height: 9px\" color=\"accent\">\r\n </mat-progress-bar>\r\n <div fxHide.lt-md class=\"step-titles center\" fxLayout=\"row\" style=\"justify-content:center !important\" [class.hidden]=\"settings.hideNavigation\">\r\n <div *ngFor=\"let step of navigationData; let i = index\" class=\"horizontal-progress-div\">\r\n <ng-container *ngIf=\"!step.subNodes?.length && !step.hidden\">\r\n <button mat-button [routerLink]=\"step.route\"\r\n [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n </ng-container>\r\n <!-- if there are subnodes create menus for each step -->\r\n <ng-container *ngIf=\"step.subNodes && step.subNodes.length && !step.hidden\">\r\n <button [ngClass]=\"{'color-primary':step.complete && step!=activeParentNode,'progress-menu-active':step===activeParentNode}\"\r\n mat-button [disabled]=\"(!step.visited || step.isDisabled) && !settings.overrideNavigation\" class=\"progress-menu-btn\"\r\n [matMenuTriggerFor]=\"menu\">\r\n <ng-template [ngTemplateOutlet]=\"progressParentNodeIcons\" [ngTemplateOutletContext]=\"{step:step}\">\r\n </ng-template>\r\n <span *ngIf=\"settings?.displayNumbers\">\r\n {{i < 10 ? \"0\" + (i + 1) + \". \" : i + \" . \"}}\r\n </span>\r\n <span class=\"nav-btn-text\">{{ step.text | translate }}</span>\r\n </button>\r\n <mat-menu #menu=\"matMenu\" class=\"sof-ar-mat-menu progress-menu-panel\">\r\n <div class=\"progress-nav-menu\" *ngFor=\"let subNode of step.subNodes; let idx = index;\" [ngStyle]=\"{width:settings.progressMenuWidth+'px'}\" [hidden]=\"step.subNodes[idx].hidden\">\r\n <button id=\"submenu{{ idx }}\" mat-button class=\"step-link progress-menu-btn\"\r\n [ngClass]=\"{'color-primary':subNode.complete && subNode!=activeSubNode,'disabled':!subNode.visited && !settings.overrideNavigation}\"\r\n [routerLinkActive]=\"['progress-menu-active']\" [ngStyle]=\"{ ' color': themeSettings?.fontColor }\"\r\n [routerLink]=\"subNode.route\" [disabled]=\"!subNode.visited && !settings.overrideNavigation\">\r\n <ng-template [ngTemplateOutlet]=\"progressSubNodeIcons\"\r\n [ngTemplateOutletContext]=\"{subNode:subNode}\">\r\n </ng-template>\r\n <span class=\"nav-menu-btn-text\">{{ subNode.text |translate }}</span>\r\n </button>\r\n </div>\r\n </mat-menu>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mobile-progress-container\" fxHide.gt-sm>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-content sof-ar-nav-content></ng-content>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n <!-- The progress menu parent node icon template-->\r\n <ng-template #progressParentNodeIcons let-step='step'>\r\n <span *ngIf=\"step.complete && step != activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCompleteIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"step === activeParentNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!step.complete && step != activeParentNode\" [ngClass]=\"{'disabled':!step.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The progress menu sub node icon template-->\r\n <ng-template #progressSubNodeIcons let-subNode='subNode'>\r\n <span *ngIf=\"subNode.complete &&activeSubNode !=subNode\">\r\n <i class=\"{{settings.progressMenuCompleteIcon}} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"activeSubNode ===subNode\">\r\n <i class=\"{{ settings.progressSectionCurrentIcon }} color-primary progress-nav-icon\"></i>\r\n </span>\r\n <span *ngIf=\"!subNode.complete &&activeSubNode !=subNode\" [ngClass]=\"{'disabled':!subNode.visited && !settings.overrideNavigation}\">\r\n <i class=\"{{ settings.progressSectionFutureIcon }} progress-nav-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <!-- The navigation footer template for language and logout buttons -->\r\n <ng-template #navigationFooter>\r\n <ng-content select=\"[sof-ar-nav-mobile-footer]\"> </ng-content>\r\n <ng-container *ngIf=\"!settings.useCustomMobileFooter\">\r\n <!-- The language button -->\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length > 2 && mobileQuery.matches\">\r\n <button id=\"sof-ar-nav-lang-dropdown\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\" [matMenuTriggerFor]=\"headerLanguageMenu\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{languageSettings.buttonText | translate}}\r\n </button>\r\n <mat-menu #headerLanguageMenu=\"matMenu\" class=\"sof-ar-mat-menu\">\r\n <button mat-menu-item *ngFor=\"let lang of languageSettings.languages\" (click)=\"setLanguage$.emit(lang)\"\r\n id=\"apply-lang-btn-{{lang}}\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\">\r\n <div fxFlex=\"auto\">\r\n {{ lang | translate }}\r\n </div>\r\n <div fxFlex=\"auto\" fxLayoutAlign=\"end end\">\r\n <i *ngIf=\"currentLang === lang\" class=\"fad fa-check selected-language-icon\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-container *ngIf=\"languageSettings?.displayLanguageOptions && languageSettings?.languages.length === 2 && mobileQuery.matches\">\r\n <button *ngIf=\"languageSettings?.languages.length === 2\" id=\"sof-ar-nav-lang-button\" mat-stroked-button\r\n class=\"faded-button-50 language-button navigationFooter\"\r\n [attr.aria-label]=\"languageSettings.buttonText | translate\" (click)=\"setLanguage$.emit()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"far fa-globe language-globe\"></i>\r\n </span>\r\n {{otherLangText | translate}}\r\n </button>\r\n </ng-container>\r\n <!-- The logout button-->\r\n <ng-container *ngIf=\"mobileQuery.matches && userName\">\r\n <button id=\"sof-ar-header-lang-button\" mat-stroked-button class=\"navigationFooter\" (click)=\"logOut()\">\r\n <span aria-hidden=\"true\" class=\"icon-styling\">\r\n <i class=\"fas fa-sign-out-alt\"></i>\r\n </span>\r\n {{logOutText | translate}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n</div>\r\n", styles: [":root{--primary-color-50-parts: #edf4ff;--primary-color-100-parts: #b9d4fc;--primary-color-200-parts: #8ab7fb;--primary-color-300-parts: #5b9af9;--primary-color-400-parts: #3784f7;--primary-color-500-parts: #146ef6;--primary-color-600-parts: #1266f5;--primary-color-700-parts: #0e5bf3;--primary-color-800-parts: #0b51f2;--primary-color-900-parts: #063fef;--primary-color-A100-parts: #ffffff;--primary-color-A200-parts: #e4e9ff;--primary-color-A400-parts: #b1c0ff;--primary-color-A700-parts: #97acff;--primary-color-contrast-50-parts: rgba(0, 0, 0, .87);--primary-color-contrast-100-parts: rgba(0, 0, 0, .87);--primary-color-contrast-200-parts: rgba(0, 0, 0, .87);--primary-color-contrast-300-parts: rgba(0, 0, 0, .87);--primary-color-contrast-400-parts: rgba(255, 255, 255, 1);--primary-color-contrast-500-parts: rgba(255, 255, 255, 1);--primary-color-contrast-600-parts: rgba(255, 255, 255, 1);--primary-color-contrast-700-parts: rgba(255, 255, 255, 1);--primary-color-contrast-800-parts: rgba(255, 255, 255, 1);--primary-color-contrast-900-parts: rgba(255, 255, 255, 1);--primary-color-contrast-A100-parts: rgba(0, 0, 0, .87);--primary-color-contrast-A200-parts: rgba(0, 0, 0, .87);--primary-color-contrast-A400-parts: rgba(0, 0, 0, .87);--primary-color-contrast-A700-parts: rgba(0, 0, 0, .87);--primary-color-50-parts-rgb: 237, 244, 255;--primary-color-100-parts-rgb: 185, 212, 252;--primary-color-200-parts-rgb: 138, 183, 251;--primary-color-300-parts-rgb: 91, 154, 249;--primary-color-400-parts-rgb: 55, 132, 247;--primary-color-500-parts-rgb: 20, 110, 246;--primary-color-600-parts-rgb: 18, 102, 245;--primary-color-700-parts-rgb: 14, 91, 243;--primary-color-800-parts-rgb: 11, 81, 242;--primary-color-900-parts-rgb: 6, 63, 239;--primary-color-A100-parts-rgb: 255, 255, 255;--primary-color-A200-parts-rgb: 228, 233, 255;--primary-color-A400-parts-rgb: 177, 192, 255;--primary-color-A700-parts-rgb: 151, 172, 255;--accent-color-50-parts: #e0f2f1;--accent-color-100-parts: #b2dfdb;--accent-color-200-parts: #80cbc4;--accent-color-300-parts: #4db6ac;--accent-color-400-parts: #26a69a;--accent-color-500-parts: #009688;--accent-color-600-parts: #00897b;--accent-color-700-parts: #00796b;--accent-color-800-parts: #00695c;--accent-color-900-parts: #004d40;--accent-color-A100-parts: #a7ffeb;--accent-color-A200-parts: #64ffda;--accent-color-A400-parts: #1de9b6;--accent-color-A700-parts: #00bfa5;--accent-color-contrast-50-parts: #000000;--accent-color-contrast-100-parts: #000000;--accent-color-contrast-200-parts: #000000;--accent-color-contrast-300-parts: #000000;--accent-color-contrast-400-parts: #000000;--accent-color-contrast-500-parts: #ffffff;--accent-color-contrast-600-parts: #ffffff;--accent-color-contrast-700-parts: #ffffff;--accent-color-contrast-800-parts: #ffffff;--accent-color-contrast-900-parts: #ffffff;--accent-color-contrast-A100-parts: #000000;--accent-color-contrast-A200-parts: #000000;--accent-color-contrast-A400-parts: #000000;--accent-color-contrast-A700-parts: #000000;--accent-color-50-parts-rgb: 224, 242, 241;--accent-color-100-parts-rgb: 178, 223, 219;--accent-color-200-parts-rgb: 128, 203, 196;--accent-color-300-parts-rgb: 77, 182, 172;--accent-color-400-parts-rgb: 38, 166, 154;--accent-color-500-parts-rgb: 0, 150, 136;--accent-color-600-parts-rgb: 0, 137, 123;--accent-color-700-parts-rgb: 0, 121, 107;--accent-color-800-parts-rgb: 0, 105, 92;--accent-color-900-parts-rgb: 0, 77, 64;--accent-color-A100-parts-rgb: 167, 255, 235;--accent-color-A200-parts-rgb: 100, 255, 218;--accent-color-A400-parts-rgb: 29, 233, 182;--accent-color-A700-parts-rgb: 0, 191, 165;--warn-color-50-parts: #fdf3e7;--warn-color-100-parts: #fbe1c3;--warn-color-200-parts: #f9ce9c;--warn-color-300-parts: #f6ba74;--warn-color-400-parts: #f4ab56;--warn-color-500-parts: #f29c38;--warn-color-600-parts: #f09432;--warn-color-700-parts: #ee8a2b;--warn-color-800-parts: #ec8024;--warn-color-900-parts: #e86e17;--warn-color-A100-parts: #ffffff;--warn-color-A200-parts: #fff0e6;--warn-color-A400-parts: #ffd0b3;--warn-color-A700-parts: #ffc19a;--warn-color-contrast-50-parts: rgba(0, 0, 0, .87);--warn-color-contrast-100-parts: rgba(0, 0, 0, .87);--warn-color-contrast-200-parts: rgba(0, 0, 0, .87);--warn-color-contrast-300-parts: rgba(0, 0, 0, .87);--warn-color-contrast-400-parts: rgba(0, 0, 0, .87);--warn-color-contrast-500-parts: rgba(0, 0, 0, .87);--warn-color-contrast-600-parts: rgba(0, 0, 0, .87);--warn-color-contrast-700-parts: rgba(0, 0, 0, .87);--warn-color-contrast-800-parts: rgba(0, 0, 0, .87);--warn-color-contrast-900-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A100-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A200-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A400-parts: rgba(0, 0, 0, .87);--warn-color-contrast-A700-parts: rgba(0, 0, 0, .87);--warn-color-50-parts-rgb: 253, 243, 231;--warn-color-100-parts-rgb: 251, 225, 195;--warn-color-200-parts-rgb: 249, 206, 156;--warn-color-300-parts-rgb: 246, 186, 116;--warn-color-400-parts-rgb: 244, 171, 86;--warn-color-500-parts-rgb: 242, 156, 56;--warn-color-600-parts-rgb: 240, 148, 50;--warn-color-700-parts-rgb: 238, 138, 43;--warn-color-800-parts-rgb: 236, 128, 36;--warn-color-900-parts-rgb: 232, 110, 23;--warn-color-A100-parts-rgb: 255, 255, 255;--warn-color-A200-parts-rgb: 255, 240, 230;--warn-color-A400-parts-rgb: 255, 208, 179;--warn-color-A700-parts-rgb: 255, 193, 154;--info-color-50-parts: #e7f3fb;--info-color-100-parts: #c2e0f4;--info-color-200-parts: #9acced;--info-color-300-parts: #71b7e6;--info-color-400-parts: #52a7e0;--info-color-500-parts: #3498db;--info-color-600-parts: #2f90d7;--info-color-700-parts: #2785d2;--info-color-800-parts: #217bcd;--info-color-900-parts: #156ac4;--info-color-A100-parts: #f5f9ff;--info-color-A200-parts: #c2ddff;--info-color-A400-parts: #8fc1ff;--info-color-A700-parts: #75b3ff;--info-color-contrast-50-parts: rgba(0, 0, 0, .87);--info-color-contrast-100-parts: rgba(0, 0, 0, .87);--info-color-contrast-200-parts: rgba(0, 0, 0, .87);--info-color-contrast-300-parts: rgba(0, 0, 0, .87);--info-color-contrast-400-parts: rgba(255, 255, 255, 1);--info-color-contrast-500-parts: rgba(255, 255, 255, 1);--info-color-contrast-600-parts: rgba(255, 255, 255, 1);--info-color-contrast-700-parts: rgba(255, 255, 255, 1);--info-color-contrast-800-parts: rgba(255, 255, 255, 1);--info-color-contrast-900-parts: rgba(255, 255, 255, 1);--info-color-contrast-A100-parts: rgba(0, 0, 0, .87);--info-color-contrast-A200-parts: rgba(0, 0, 0, .87);--info-color-contrast-A400-parts: rgba(0, 0, 0, .87);--info-color-contrast-A700-parts: rgba(0, 0, 0, .87);--info-color-50-parts-rgb: 231, 243, 251;--info-color-100-parts-rgb: 194, 224, 244;--info-color-200-parts-rgb: 154, 204, 237;--info-color-300-parts-rgb: 113, 183, 230;--info-color-400-parts-rgb: 82, 167, 224;--info-color-500-parts-rgb: 52, 152, 219;--info-color-600-parts-rgb: 47, 144, 215;--info-color-700-parts-rgb: 39, 133, 210;--info-color-800-parts-rgb: 33, 123, 205;--info-color-900-parts-rgb: 21, 106, 196;--info-color-A100-parts-rgb: 245, 249, 255;--info-color-A200-parts-rgb: 194, 221, 255;--info-color-A400-parts-rgb: 143, 193, 255;--info-color-A700-parts-rgb: 117, 179, 255;--success-color-50-parts: #edf5eb;--success-color-100-parts: #d1e6ce;--success-color-200-parts: #b3d6ae;--success-color-300-parts: #95c58d;--success-color-400-parts: #7eb874;--success-color-500-parts: #67ac5c;--success-color-600-parts: #5fa554;--success-color-700-parts: #549b4a;--success-color-800-parts: #4a9241;--success-color-900-parts: #398230;--success-color-A100-parts: #d0ffcb;--success-color-A200-parts: #a2ff98;--success-color-A400-parts: #74ff65;--success-color-A700-parts: #5dff4c;--success-color-contrast-50-parts: rgba(0, 0, 0, .87);--success-color-contrast-100-parts: rgba(0, 0, 0, .87);--success-color-contrast-200-parts: rgba(0, 0, 0, .87);--success-color-contrast-300-parts: rgba(0, 0, 0, .87);--success-color-contrast-400-parts: rgba(0, 0, 0, .87);--success-color-contrast-500-parts: rgba(0, 0, 0, .87);--success-color-contrast-600-parts: rgba(0, 0, 0, .87);--success-color-contrast-700-parts: rgba(255, 255, 255, 1);--success-color-contrast-800-parts: rgba(255, 255, 255, 1);--success-color-contrast-900-parts: rgba(255, 255, 255, 1);--success-color-contrast-A100-parts: rgba(0, 0, 0, .87);--success-color-contrast-A200-parts: rgba(0, 0, 0, .87);--success-color-contrast-A400-parts: rgba(0, 0, 0, .87);--success-color-contrast-A700-parts: rgba(0, 0, 0, .87);--success-color-50-parts-rgb: 237, 245, 235;--success-color-100-parts-rgb: 209, 230, 206;--success-color-200-parts-rgb: 179, 214, 174;--success-color-300-parts-rgb: 149, 197, 141;--success-color-400-parts-rgb: 126, 184, 116;--success-color-500-parts-rgb: 103, 172, 92;--success-color-600-parts-rgb: 95, 165, 84;--success-color-700-parts-rgb: 84, 155, 74;--success-color-800-parts-rgb: 74, 146, 65;--success-color-900-parts-rgb: 57, 130, 48;--success-color-A100-parts-rgb: 208, 255, 203;--success-color-A200-parts-rgb: 162, 255, 152;--success-color-A400-parts-rgb: 116, 255, 101;--success-color-A700-parts-rgb: 93, 255, 76;--error-color-50-parts: #fceae8;--error-color-100-parts: #f8c9c5;--error-color-200-parts: #f3a69e;--error-color-300-parts: #ee8277;--error-color-400-parts: #eb6759;--error-color-500-parts: #e74c3c;--error-color-600-parts: #e44536;--error-color-700-parts: #e03c2e;--error-color-800-parts: #dd3327;--error-color-900-parts: #d7241a;--error-color-A100-parts: #ffffff;--error-color-A200-parts: #ffd9d7;--error-color-A400-parts: #ffa8a4;--error-color-A700-parts: #ff8f8b;--error-color-contrast-50-parts: rgba(0, 0, 0, .87);--error-color-contrast-100-parts: rgba(0, 0, 0, .87);--error-color-contrast-200-parts: rgba(0, 0, 0, .87);--error-color-contrast-300-parts: rgba(0, 0, 0, .87);--error-color-contrast-400-parts: rgba(0, 0, 0, .87);--error-color-contrast-500-parts: rgba(255, 255, 255, 1);--error-color-contrast-600-parts: rgba(255, 255, 255, 1);--error-color-contrast-700-parts: rgba(255, 255, 255, 1);--error-color-contrast-800-parts: rgba(255, 255, 255, 1);--error-color-contrast-900-parts: rgba(255, 255, 255, 1);--error-color-contrast-A100-parts: rgba(0, 0, 0, .87);--error-color-contrast-A200-parts: rgba(0, 0, 0, .87);--error-color-contrast-A400-parts: rgba(0, 0, 0, .87);--error-color-contrast-A700-parts: rgba(0, 0, 0, .87);--error-color-50-parts-rgb: 252, 234, 232;--error-color-100-parts-rgb: 248, 201, 197;--error-color-200-parts-rgb: 248, 201, 197;--error-color-300-parts-rgb: 238, 130, 119;--error-color-400-parts-rgb: 235, 103, 89;--error-color-500-parts-rgb: 231, 76, 60;--error-color-600-parts-rgb: 228, 69, 54;--error-color-700-parts-rgb: 224, 60, 46;--error-color-800-parts-rgb: 221, 51, 39;--error-color-900-parts-rgb: 215, 36, 26;--error-color-A100-parts-rgb: 255, 255, 255;--error-color-A200-parts-rgb: 255, 217, 215;--error-color-A400-parts-rgb: 255, 168, 164;--error-color-A700-parts-rgb: 255, 143, 139;--neutral-color-50-parts: #fafafa;--neutral-color-100-parts: #f5f5f5;--neutral-color-200-parts: #eeeeee;--neutral-color-300-parts: #e0e0e0;--neutral-color-400-parts: #bdbdbd;--neutral-color-500-parts: #9e9e9e;--neutral-color-600-parts: #757575;--neutral-color-700-parts: #616161;--neutral-color-800-parts: #424242;--neutral-color-900-parts: #212121;--neutral-color-A100-parts: #ffffff;--neutral-color-A200-parts: #ffffff;--neutral-color-A400-parts: #ffffff;--neutral-color-A700-parts: #ffffff;--neutral-color-contrast-50-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-100-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-200-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-300-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-400-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-500-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-600-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-700-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-800-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-900-parts: rgba(255, 255, 255, 1);--neutral-color-contrast-A100-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-A200-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-A400-parts: rgba(0, 0, 0, .87);--neutral-color-contrast-A700-parts: rgba(0, 0, 0, .87);--neutral-color-50-parts-rgb: 250, 250, 250;--neutral-color-100-parts-rgb: 245, 245, 245;--neutral-color-200-parts-rgb: 238, 238, 238;--neutral-color-300-parts-rgb: 224, 224, 224;--neutral-color-400-parts-rgb: 189, 189, 189;--neutral-color-500-parts-rgb: 158, 158, 158;--neutral-color-600-parts-rgb: 117, 117, 117;--neutral-color-700-parts-rgb: 97, 97, 97;--neutral-color-800-parts-rgb: 66, 66, 66;--neutral-color-900-parts-rgb: 33, 33, 33;--neutral-color-A100-parts-rgb: 255, 255, 255;--neutral-color-A200-parts-rgb: 255, 255, 255;--neutral-color-A400-parts-rgb: 255, 255, 255;--neutral-color-A700-parts-rgb: 255, 255, 255}.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale3d(0,0,0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}@keyframes cdk-text-field-autofill-start{}@keyframes cdk-text-field-autofill-end{}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}.mat-focus-indicator{position:relative}.mat-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border:var(--mat-focus-indicator-border-width, 3px) var(--mat-focus-indicator-border-style, solid) var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-focus-indicator-display: block}.mat-mdc-focus-indicator{position:relative}.mat-mdc-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-mdc-focus-indicator-display, none);border:var(--mat-mdc-focus-indicator-border-width, 3px) var(--mat-mdc-focus-indicator-border-style, solid) var(--mat-mdc-focus-indicator-border-color, transparent);border-radius:var(--mat-mdc-focus-indicator-border-radius, 4px)}.mat-mdc-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-mdc-focus-indicator-display: block}.mat-ripple-element{background-color:#0000001a}.mat-mdc-option{color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, .87))}.mat-mdc-option:hover:not(.mdc-list-item--disabled),.mat-mdc-option:focus:not(.mdc-list-item--disabled),.mat-mdc-option.mat-mdc-option-active,.mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple):not(.mdc-list-item--disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mdc-theme-primary, var(--primary-color-500-parts))}.mat-accent .mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mdc-theme-secondary, var(--accent-color-500-parts))}.mat-warn .mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mdc-theme-error, #f44336)}.mat-mdc-optgroup-label{color:var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, .87))}.mat-pseudo-checkbox{color:#0000008a}.mat-pseudo-checkbox:after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:var(--primary-color-500-parts)}.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate,.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate{background:var(--accent-color-500-parts)}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa;color:#000000de}.mat-elevation-z0,.mat-mdc-elevation-specific.mat-elevation-z0{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f}.mat-elevation-z1,.mat-mdc-elevation-specific.mat-elevation-z1{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.mat-elevation-z2,.mat-mdc-elevation-specific.mat-elevation-z2{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.mat-elevation-z3,.mat-mdc-elevation-specific.mat-elevation-z3{box-shadow:0 3px 3px -2px #0003,0 3px 4px #00000024,0 1px 8px #0000001f}.mat-elevation-z4,.mat-mdc-elevation-specific.mat-elevation-z4{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.mat-elevation-z5,.mat-mdc-elevation-specific.mat-elevation-z5{box-shadow:0 3px 5px -1px #0003,0 5px 8px #00000024,0 1px 14px #0000001f}.mat-elevation-z6,.mat-mdc-elevation-specific.mat-elevation-z6{box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.mat-elevation-z7,.mat-mdc-elevation-specific.mat-elevation-z7{box-shadow:0 4px 5px -2px #0003,0 7px 10px 1px #00000024,0 2px 16px 1px #0000001f}.mat-elevation-z8,.mat-mdc-elevation-specific.mat-elevation-z8{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.mat-elevation-z9,.mat-mdc-elevation-specific.mat-elevation-z9{box-shadow:0 5px 6px -3px #0003,0 9px 12px 1px #00000024,0 3px 16px 2px #0000001f}.mat-elevation-z10,.mat-mdc-elevation-specific.mat-elevation-z10{box-shadow:0 6px 6px -3px #0003,0 10px 14px 1px #00000024,0 4px 18px 3px #0000001f}.mat-elevation-z11,.mat-mdc-elevation-specific.mat-elevation-z11{box-shadow:0 6px 7px -4px #0003,0 11px 15px 1px #00000024,0 4px 20px 3px #0000001f}.mat-elevation-z12,.mat-mdc-elevation-specific.mat-elevation-z12{box-shadow:0 7px 8px -4px #0003,0 12px 17px 2px #00000024,0 5px 22px 4px #0000001f}.mat-elevation-z13,.mat-mdc-elevation-specific.mat-elevation-z13{box-shadow:0 7px 8px -4px #0003,0 13px 19px 2px #00000024,0 5px 24px 4px #0000001f}.mat-elevation-z14,.mat-mdc-elevation-specific.mat-elevation-z14{box-shadow:0 7px 9px -4px #0003,0 14px 21px 2px #00000024,0 5px 26px 4px #0000001f}.mat-elevation-z15,.mat-mdc-elevation-specific.mat-elevation-z15{box-shadow:0 8px 9px -5px #0003,0 15px 22px 2px #00000024,0 6px 28px 5px #0000001f}.mat-elevation-z16,.mat-mdc-elevation-specific.mat-elevation-z16{box-shadow:0 8px 10px -5px #0003,0 16px 24px 2px #00000024,0 6px 30px 5px #0000001f}.mat-elevation-z17,.mat-mdc-elevation-specific.mat-elevation-z17{box-shadow:0 8px 11px -5px #0003,0 17px 26px 2px #00000024,0 6px 32px 5px #0000001f}.mat-elevation-z18,.mat-mdc-elevation-specific.mat-elevation-z18{box-shadow:0 9px 11px -5px #0003,0 18px 28px 2px #00000024,0 7px 34px 6px #0000001f}.mat-elevation-z19,.mat-mdc-elevation-specific.mat-elevation-z19{box-shadow:0 9px 12px -6px #0003,0 19px 29px 2px #00000024,0 7px 36px 6px #0000001f}.mat-elevation-z20,.mat-mdc-elevation-specific.mat-elevation-z20{box-shadow:0 10px 13px -6px #0003,0 20px 31px 3px #00000024,0 8px 38px 7px #0000001f}.mat-elevation-z21,.mat-mdc-elevation-specific.mat-elevation-z21{box-shadow:0 10px 13px -6px #0003,0 21px 33px 3px #00000024,0 8px 40px 7px #0000001f}.mat-elevation-z22,.mat-mdc-elevation-specific.mat-elevation-z22{box-shadow:0 10px 14px -6px #0003,0 22px 35px 3px #00000024,0 8px 42px 7px #0000001f}.mat-elevation-z23,.mat-mdc-elevation-specific.mat-elevation-z23{box-shadow:0 11px 14px -7px #0003,0 23px 36px 3px #00000024,0 9px 44px 8px #0000001f}.mat-elevation-z24,.mat-mdc-elevation-specific.mat-elevation-z24{box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-theme-loaded-marker{display:none}.mat-mdc-option{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 16px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, .03125em)}::ng-deep :root{--sof-nav-content-bg-color: #fffdfd;--sof-nav-font-color: #eee;--sof-nav-bg-gradient-color-1: #fff;--sof-nav-bg-gradient-color-2: #fff;--sof-nav-border-right-color: transparent;--sof-nav-list-border-color: #cfd8dc;--sof-nav-highlight-gradient-1: mat.get-color-from-palette($my-app-primary, 100);--sof-nav-highlight-gradient-2: rgba(255, 255, 255, 0);--sof-nav-sub-highlight-border-color: #616161;--sof-nav-sub-highlight-bg-color: #424242}.sof-ar-nav-sidenav{background:rgb(0,0,0);border-right-color:var(--sof-nav-border-right-color);background:linear-gradient(-180deg,var(--sof-nav-bg-gradient-color-1) 0%,var(--sof-nav-bg-gradient-color-2) 100%);overflow:hidden}.sof-ar-nav-sidenav *{color:var(--sof-nav-font-color)!important}::ng-deep [sof-ar-nav-footer] *,::ng-deep [sof-ar-nav-header] *{color:var(--sof-nav-font-color)!important}::ng-deep .sof-ar-nav-active-route:active{background:rgb(0,0,0)!important;background:linear-gradient(90deg,var(--sof-nav-highlight-gradient-1) 0%,var(--sof-nav-highlight-gradient-2) 80%)!important;border-bottom-right-radius:8px!important;border-top-right-radius:8px!important}::ng-deep .sof-ar-nav-sub-active-route{background:var(--sof-nav-sub-highlight-bg-color);margin-right:-4px;position:relative}::ng-deep .sof-ar-nav-sub-active-route:focus,::ng-deep .sof-ar-nav-sub-active-route:active{background:var(--sof-nav-sub-highlight-bg-color)!important}::ng-deep .sof-ar-nav-sub-active-route:before{content:\"\";display:block;position:absolute;top:0;height:inherit}::ng-deep .mat-drawer-container{background:var(--sof-nav-content-bg-color)!important}.sof-ar-nav-container{display:flex;flex-direction:column;position:absolute;bottom:0;left:0;right:0}h1.example-app-name{margin-left:8px}.sof-ar-nav-sidenav-container{flex:1}.example-is-mobile .example-sidenav-container{flex:1 0 auto}.hidden{display:none!important}.sof-ar-nav-buffer{height:40px}button.nav-item{border:0;background:transparent}.nav-item{font-size:15px!important;font-weight:500!important}.nav-item.mat-mdc-list-item-interactive:focus:before,.nav-item.mat-mdc-list-item-interactive:hover:before{opacity:0!important}.mat-expansion-indicator{border-bottom-right-radius:11px!important}.nav-footer-item{background:#FAFAFA;position:absolute;bottom:0%;width:18rem}.progress-footer{display:flex;width:100%;z-index:2}.panel-icon{float:right;color:#000!important}.user-name{display:inline-block;height:3.5rem;padding-left:.5rem;padding-top:3rem;padding-right:.5rem;font-size:larger;font-weight:800}::ng-deep .mat-mdc-list-base{padding:0!important}::ng-deep .mat-drawer-inner-container{min-width:275px;overflow:hidden!important}::ng-deep .mat-drawer-inner-container:hover{overflow:overlay!important}::ng-deep .icon-styling{padding-right:10px;padding-left:10px;width:24px;text-align:left}::ng-deep .nav-icon{margin-left:auto;padding-left:30px}::ng-deep .nav-item{font-family:Poppins;font-weight:500;padding-top:2px!important;padding-left:0!important}::ng-deep [sof-ar-nav-footer] hr{margin:5px 10px;opacity:.5}.subnav-content{padding:0;height:48px!important}.nav-header{height:64px!important}.mat-mdc-list-item{background-color:transparent;display:inline!important}::ng-deep .mdc-list-item__content{padding:0 4px!important;padding-left:1.5rem!important}::ng-deep .subnav-item{padding-left:1rem!important}::ng-deep .visible-mobile{display:none}@media only screen and (max-width: 959px){::ng-deep .visible-mobile{display:block}}@media (max-width: 959px){::ng-deep .sof-ar-fixed-nav{position:fixed;z-index:2;width:100%!important;box-sizing:border-box}}::ng-deep .sof-ar-nav-menu-btn{position:fixed!important;z-index:2!important;top:1.25%;width:44px!important;height:40px!important;color:var(--primary-color-500-parts)!important;background:var(--primary-color-50-parts)!important;border-radius:8px!important;padding:0!important}@media (max-width: 959px){::ng-deep .sof-ar-nav-menu-btn{margin-left:2%!important}}@media (min-width: 959px){::ng-deep .sof-ar-nav-menu-btn{margin-left:11px!important}}::ng-deep .sof-ar-nav-menu-btn:hover .mdc-icon-button__ripple,::ng-deep .sof-ar-nav-menu-btn:focus .mdc-icon-button__ripple{border-radius:inherit!important}@media only screen and (min-width: 959px){::ng-deep .mat-mdc-list-base:not(.subnav-item):not(.custom-nav):before{content:\"\";display:block;height:1px;margin-left:auto;width:calc(100% - 40px)}::ng-deep .mat-mdc-list-base:not(.subnav-item):not(.custom-nav):after{content:\"\";display:block;height:1px;margin-left:auto;width:calc(100% - 40px);margin-bottom:-1px}}::ng-deep .mat-step-text-label{color:#fff;font-family:Poppins,sans-serif!important;font-size:1.3em}::ng-deep .mat-expansion-indicator{padding:1em!important}::ng-deep .mat-stepper-vertical{background-color:transparent!important}.mat-mdc-nav-list{width:100%;margin-top:3px;margin-bottom:3px}.mat-mdc-nav-list:hover{border-bottom-right-radius:8px!important;border-top-right-radius:8px!important;background:var(--sof-nav-highlight-gradient-1)!important}.mat-expansion-panel-header{padding:0;height:64px!important;margin-top:3px;margin-bottom:3px}.mat-expansion-panel-header:hover,.sof-ar-nav-selected{background:var(--sof-nav-highlight-gradient-1)!important;border-bottom-right-radius:8px!important;border-top-right-radius:8px!important}.mat-expansion-panel{display:inline}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.step-active{border-bottom:3px solid var(--primary-color-500-parts);border-bottom-left-radius:0;border-bottom-right-radius:0}::ng-deep .mat-vertical-content{padding-bottom:0!important}.step-link{padding-left:0!important;padding-right:0!important}.step-titles{padding-top:20px;padding-bottom:20px}.step-titles>button{font-family:Poppins,sans-serif!important;font-size:16px!important;font-weight:500!important;color:#000;background-color:transparent!important}.step-active{border-bottom:0!important}::ng-deep .progress-menu-active,progress-menu-active *{color:#000!important}::ng-deep .color-primary,.color-primary *{color:var(--primary-color-500-parts)!important}.sof-ar-nav-sidenav{max-width:-webkit-fill-available}.nav-menu-btn-text{white-space:normal}.progress-menu-btn{width:-webkit-fill-available;text-align:left;padding:12px 16px!important;font-size:16px!important;height:-moz-fit-content;height:fit-content}::ng-deep .disabled,.disabled *,.progress-menu-btn:disabled,.progress-menu-mobile-btn:disabled,.mat-expansion-panel-header:disabled{color:#333c!important}.progress-nav-icon{margin-right:10px;font-size:14px}::ng-deep .progress-menu-mobile-btn{display:flex!important}::ng-deep .progress-nav-menu{display:flex!important}.progress-menu-mobile-btn{padding:12px 24px!important;width:-webkit-fill-available;text-align:left;height:-moz-fit-content;height:fit-content}.progress-mobile-panel-title{width:-webkit-fill-available;font-size:16px;font-family:Poppins,sans-serif!important;padding-left:24px}.progress-mobile-expansion-panel{margin:0!important}::ng-deep .progress-mobile-expansion-panel .mat-expansion-panel-body{background:var(--primary-color-50-parts)!important;padding:0!important;font-size:16px!important}::ng-deep .mat-mdc-menu-panel{max-width:unset!important}::ng-deep .progress-menu-panel{background:var(--primary-color-50-parts)!important}::ng-deep .cdk-overlay-container .cdk-overlay-pane{transform:none!important}::ng-deep .cdk-overlay-container .cdk-overlay-pane .step-option{margin-top:33px!important}.mobile-progress-container{padding-bottom:24px}.step-titles-mobile{padding-top:25px;padding-bottom:25px;background-color:transparent}.step-titles-mobile ::ng-deep .mat-mdc-select-trigger{padding-left:17px;padding-right:20px}.step-done{color:var(--accent-color-900-parts)!important;cursor:pointer}.step-future{color:var(--primary-color-900-parts)!important;opacity:.7}::ng-deep .mat-form-field-appearance-outline .mat-mdc-form-field-infix{padding-left:.5em!important;padding-right:.5em!important}::ng-deep .mdc-floating-label{padding-left:.5em!important;padding-right:.5em!important}::ng-deep .mat-form-field-appearance-outline .mat-mdc-form-field-icon-prefix{top:0!important}::ng-deep .mat-form-field-appearance-outline .mat-mdc-form-field-icon-suffix{top:0!important}[sws-alert--secondary]{max-height:90px;min-height:52px;padding:0 0 0 24px;margin:2px 5px;border-radius:5px;font-weight:700;font-size:16px;background:rgba(29,190,104,.1);border:2px solid #2b9c62;color:#2b9c62}.icon-container{align-self:center}.message-container{margin-left:10px;line-height:1.8}#btnClose{color:#000}.navigationFooter{width:100%;border:none;height:64px!important;font-family:Poppins;font-weight:500;font-size:15px!important;position:relative;text-align:left;padding-left:1.5rem}.navigationFooter:hover{color:unset!important}.nav-item-margin{position:relative;display:flex!important;width:inherit!important;height:inherit!important}.sof-ar-nav-menu-icon{font-size:23px}.menu-icon{color:var(--primary-color-800-parts)!important}.sidenav-background{background:transparent!important}::ng-deep .mat-expansion-panel-body{padding:0!important}::ng-deep .subnav-content>a>.mdc-list-item__content{padding:0 4px!important;padding-left:4.25rem!important}::ng-deep .nav-content-item{margin-right:24px;margin-top:24px}.sof-ar-nav-header-text{font-family:Poppins;font-weight:500;font-size:14px;line-height:175%;letter-spacing:.14em}\n"] }]
524
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.MediaMatcher }, { type: i2.Router }, { type: i3.BannerService }, { type: i4.AuthorizationService }, { type: i5.BaseConfigService, decorators: [{
525
+ type: Optional
526
+ }] }]; }, propDecorators: { stepper: [{
527
+ type: ViewChild,
528
+ args: ['vertStepper']
529
+ }], sidenav: [{
530
+ type: ViewChild,
531
+ args: ['snav']
532
+ }], expansionPanel: [{
533
+ type: ViewChild,
534
+ args: ['panel']
535
+ }], innerSteppers: [{
536
+ type: ViewChildren,
537
+ args: ['vertStepperInner']
538
+ }], navigationData: [{
539
+ type: Input
540
+ }], settings: [{
541
+ type: Input
542
+ }], advancedSettings: [{
543
+ type: Input
544
+ }], themeSettings: [{
545
+ type: Input
546
+ }], languageSettings: [{
547
+ type: Input
548
+ }], currentLang: [{
549
+ type: Input
550
+ }], logOutText: [{
551
+ type: Input
552
+ }], setLanguage$: [{
553
+ type: Output
554
+ }] } });
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9zcmMvbGliL25hdmlnYXRpb24vY29tcG9uZW50cy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJtYXR1cmUvc3JjL2xpYi9uYXZpZ2F0aW9uL2NvbXBvbmVudHMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQWEsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkxSyxPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVeEMsMEZBQTBGO0FBRTFGOztHQUVHO0FBU0gsTUFBTSxPQUFPLDJCQUEyQjtJQXNDdEMsaUNBQWlDO0lBQ2pDLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBZ0ZEOzs7Ozs7OztPQVFHO0lBQ0gsWUFDVyxpQkFBb0MsRUFDcEMsS0FBbUIsRUFDWCxNQUFjLEVBQ3ZCLGFBQTRCLEVBQ25CLG9CQUEwQyxFQUM5QixhQUFnQztRQUxwRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDWCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ3ZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25CLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBdkgvRCxnREFBZ0Q7UUFDaEMsYUFBUSxHQUF1QixFQUFFLENBQUM7UUFFbEQsZ0RBQWdEO1FBQ2hDLHFCQUFnQixHQUErQixFQUFFLENBQUM7UUFFbEUsZ0RBQWdEO1FBQ2hDLGtCQUFhLEdBQTRCLEVBQUUsQ0FBQztRQUU1RCx5REFBeUQ7UUFDekMscUJBQWdCLEdBQTJCLEVBQUUsQ0FBQztRQVE5RCxxQkFBcUI7UUFDSixpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBTzNFLHNDQUFzQztRQUMvQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRWxDLCtEQUErRDtRQUN4RCx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFXM0MsZ0NBQWdDO1FBQ3pCLHdCQUFtQixHQUFXLENBQUMsQ0FBQztRQUV2QywrQkFBK0I7UUFDeEIseUJBQW9CLEdBQThCLEVBQUUsQ0FBQztRQUU1RCxvQ0FBb0M7UUFDN0IscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBUXBDLDBDQUEwQztRQUNuQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQW9CdkMsZ0NBQWdDO1FBQ3hCLGVBQVUsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUt0RCxvQ0FBb0M7UUFDN0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFcEMsNENBQTRDO1FBQ3JDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRXJDLGdDQUFnQztRQUN4QixzQkFBaUIsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUs3RCw4QkFBOEI7UUFDdEIsdUJBQWtCLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFOUQsOEJBQThCO1FBQ3ZCLHVCQUFrQixHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTdELCtCQUErQjtRQUN2QixlQUFVLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFtQnBELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLEVBQUU7WUFDL0IsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbEMsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDdEI7UUFDSCxDQUFDLENBQUM7UUFDRixrR0FBa0c7UUFDbEcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFO1lBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3hFO2FBQ0k7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN6RDtJQUNILENBQUM7SUFFRCx1Q0FBdUM7SUFDaEMsUUFBUTtRQUViLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUVyRixzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1osQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzthQUNqRjtZQUNELDhCQUE4QjtZQUM5QixJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO2dCQUN4QixDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsZ0NBQWdDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFO1lBQzFDLCtDQUErQztZQUMvQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDekQ7YUFDRjtZQUVELDJCQUEyQjtZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBRzFGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLGFBQWEsQ0FBQyxDQUFDO2lCQUNyRSxTQUFTLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7Z0JBQ2xDLHNDQUFzQztnQkFDdEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FDTCxDQUFDO1lBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9FLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFBO2FBQ3JEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdEUsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsSUFBSSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7d0JBQzFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7d0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7d0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFOzRCQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7NEJBQy9CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0NBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQ0FDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0NBQ3BDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO29DQUMxQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0NBQ2xCLENBQUMsQ0FBQyxDQUFDOzRCQUNMLENBQUMsQ0FBQyxDQUFDO3lCQUNKO3dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUM5QixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7NEJBQ25CLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUN0QixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQ0FDbEIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7NEJBQ3JCLENBQUMsQ0FBQyxDQUFBO3dCQUNKLENBQUMsQ0FBQyxDQUFDO3dCQUNILGlFQUFpRTt3QkFDakUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO3FCQUNwQztvQkFFRCx5RkFBeUY7b0JBQ3pGLElBQUksTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsNEJBQTRCLElBQUksSUFBSTsyQkFDakUsSUFBSSxDQUFDLDRCQUE0QixJQUFJLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLDRCQUE0QjsyQkFDL0YsSUFBSSxDQUFDLDJCQUEyQixJQUFJLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLDJCQUEyQjsyQkFDN0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsMkJBQTJCLElBQUksSUFBSSxFQUFFO3dCQUV0RSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUM7d0JBQzVGLElBQUksQ0FBQywyQkFBMkIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQzt3QkFFMUYscUJBQXFCO3dCQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsQ0FBQzs2QkFDckUsU0FBUyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFOzRCQUNsQyxzQ0FBc0M7NEJBQ3RDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzFDLENBQUMsQ0FBQyxDQUNMLENBQUM7d0JBQ0YsbUNBQW1DO3dCQUNuQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFOzRCQUNsSCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxFQUMzRSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQzt5QkFDMUc7NkJBQ0k7NEJBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt5QkFDdEY7cUJBQ0Y7eUJBQ0k7d0JBQ0gscUJBQXFCO3dCQUNyQixJQUFJLENBQUMsNEJBQTRCLEdBQUcsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsNEJBQTRCLENBQUE7d0JBQzlGLElBQUksQ0FBQywyQkFBMkIsR0FBRyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSwyQkFBMkIsQ0FBQztxQkFDOUY7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELDhEQUE4RDtJQUN2RCxlQUFlO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTt3QkFDakIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQzt3QkFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsRCxDQUFDLENBQUE7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO3dCQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTs0QkFDakIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQzs0QkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDbkUsQ0FBQyxDQUFBO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQjtJQUNWLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQkFBZ0IsQ0FBQyxHQUFZO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxLQUFhO1FBQ2xELFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxhQUFhLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGtCQUFrQixDQUFDLFdBQW1CLEVBQUUsVUFBa0I7UUFDL0QsMkJBQTJCO1FBQzNCLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNqQixPQUFPLFFBQVEsQ0FBQzthQUNqQjtZQUNELHVCQUF1QjtZQUN2QixJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUVoRCxPQUFPLFFBQVEsQ0FBQzthQUNqQjtZQUNELHNCQUFzQjtpQkFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzdGLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUM7cUJBQ3pELEtBQUssRUFBRSxDQUFDO2dCQUVYLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBQ0QsdUJBQXVCO2lCQUNsQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtnQkFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUVoRCxPQUFPLE1BQU0sQ0FBQzthQUNmO2lCQUNJO2dCQUNILE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1NBQ0Y7YUFDSTtZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN2QixPQUFPLE1BQU0sQ0FBQzthQUNmO1lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUM7WUFDbEYsSUFBSSxVQUFVLEtBQUssWUFBWSxDQUFDLGFBQWEsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFFckUsT0FBTyxRQUFRLENBQUM7YUFDakI7aUJBQ0ksSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pILFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQztxQkFDeEQsS0FBSyxFQUFFLENBQUM7Z0JBRVgsT0FBTyxRQUFRLENBQUM7YUFDakI7aUJBQ0ksSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFFckUsT0FBTyxNQUFNLENBQUM7YUFDZjtpQkFDSTtnQkFDSCxPQUFPLE1BQU0sQ0FBQzthQUNmO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLEtBQWE7UUFDM0IsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjLENBQUMsVUFBa0I7UUFDdEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3pDLGlEQUFpRDtZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHVCQUF1QixDQUFDLEdBQVc7UUFDeEMsSUFBSSxVQUFVLENBQUM7UUFDZixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNsRCxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEYsT0FBTyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDckIsV0FBVyxHQUFHLENBQUMsQ0FBQTtTQUNoQjtRQUVELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUV0SSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUU3RSxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksYUFBYSxDQUFDLFVBQW1CLEVBQUUsU0FBc0I7UUFDOUQsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMvQixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRyxzREFBc0Q7WUFDdEQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekQsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1FBQ25DLHFDQUFxQztRQUNyQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BELENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBRWxCLG1GQUFtRjtZQUNuRixJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRTtnQkFDakIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3JCLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNsQixDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUE7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsbUNBQW1DO1FBQ25DLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksU0FBUyxFQUFFO1lBQ2IsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBYTtRQUNuQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztNQUVFO0lBQ0ssSUFBSTtRQUNULElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7U0FFSztJQUNFLE1BQU07UUFDWCxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksd0JBQXdCO1FBQzdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxJQUEyQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQztJQUNoSSxDQUFDO0lBRUQsc0NBQXNDO0lBQy9CLFdBQVcsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDNUUsQ0FBQztJQUVELHNDQUFzQztJQUM5QixtQkFBbUI7UUFDekIsZUFBZTtRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxzQ0FBc0M7WUFDdEMsSUFBSSxVQUFVLENBQUM7WUFDZixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDbEQsVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVGLE9BQU8sVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQztZQUNILHFEQUFxRDtZQUNyRCxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsV0FBVyxHQUFHLENBQUMsQ0FBQzthQUNqQjtZQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUM7WUFDdkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7YUFDMUY7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGVBQWU7UUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsQ0FBQzthQUNyRSxTQUFTLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDbEMsc0NBQXNDO1lBQ3RDLElBQUksVUFBVSxDQUFDO1lBQ2YsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xELFVBQVUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFcEcsT0FBTyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RixDQUFDLENBQUMsQ0FBQztZQUNILHFEQUFxRDtZQUNyRCxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsV0FBVyxHQUFHLENBQUMsQ0FBQzthQUNqQjtZQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUM7WUFDdkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7YUFDMUY7UUFDSCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUVELDRDQUE0QztJQUNwQyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDdEcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQztJQUVyRixDQUFDO0lBRUQseUNBQXlDO0lBQ2pDLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUMxRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUM7UUFDdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLElBQUksU0FBUyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDakksSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNqSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hJLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3SCxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RJLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEksSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDM0csSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckcsQ0FBQztJQUVELHlDQUF5QztJQUNqQyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixJQUFJLDBCQUEwQixDQUFDO1FBQ3BHLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsSUFBSSwyQkFBMkIsQ0FBQztRQUNqSCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDMUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzlHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLElBQUksYUFBYSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDMUcsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixJQUFJLHFCQUFxQixDQUFDO1FBQy9HLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsSUFBSSxlQUFlLENBQUM7UUFDckcsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixJQUFJLGVBQWUsQ0FBQztRQUN2RyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLElBQUksY0FBYyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQTtRQUM1RyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDO1FBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNsSSxDQUFDOzt3SEFobkJVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLDZUQUozQixDQUFDO1lBQ1YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRTtTQUNsRixDQUFDLHFZQzdCSixvdzRCQXFkQTsyRkR0YmEsMkJBQTJCO2tCQVJ2QyxTQUFTOytCQUNFLG1CQUFtQixhQUdsQixDQUFDOzRCQUNWLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUU7eUJBQ2xGLENBQUM7OzBCQTBJQyxRQUFROzRDQXJJc0IsT0FBTztzQkFBdkMsU0FBUzt1QkFBQyxhQUFhO2dCQUdFLE9BQU87c0JBQWhDLFNBQVM7dUJBQUMsTUFBTTtnQkFHVSxjQUFjO3NCQUF4QyxTQUFTO3VCQUFDLE9BQU87Z0JBR3VCLGFBQWE7c0JBQXJELFlBQVk7dUJBQUMsa0JBQWtCO2dCQUdoQixjQUFjO3NCQUE3QixLQUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUdVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUdVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBR1UsVUFBVTtzQkFBekIsS0FBSztnQkFHVyxZQUFZO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVkaWFNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IFNURVBQRVJfR0xPQkFMX09QVElPTlMgfSBmcm9tICdAYW5ndWxhci9jZGsvc3RlcHBlcic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdEV4cGFuc2lvblBhbmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0U2lkZW5hdiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xyXG5pbXBvcnQgeyBNYXRTdGVwcGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc3RlcHBlcic7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VDb25maWcgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9iYXNlLWNvbmZpZyc7XHJcbmltcG9ydCB7IEF1dGhvcml6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9hdXRob3JpemF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9iYW5uZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9iYXNlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSGVhZGVyTGFuZ3VhZ2VTZXR0aW5ncyB9IGZyb20gJy4uLy4uLy4uL2hlYWRlci9tb2RlbHMvaGVhZGVyLWxhbmd1YWdlLnNldHRpbmdzJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblRoZW1lU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmF2LXRoZW1lLnNldHRpbmdzJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkFkdmFuY2VkU2V0dGluZ3MsIE5hdmlnYXRpb25TZXR0aW5ncyB9IGZyb20gJy4uLy4uL21vZGVscy9uYXYuc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBOYXZOb2RlLCBTdWJOYXZOb2RlcyB9IGZyb20gJy4uLy4uL21vZGVscy9uYXZpZ2F0aW9uJztcclxuXHJcbi8vIFRPRE86IHNlZSBob3cgdGhpcyBjYW4gZml0IHdpdGggdGhlIGBzb2YtcHJvZ3Jlc3MtYmFyYCBjb21wb25lbnQuIFBvc3NpYmx5IGNvbWJpbmUgdGhlbVxyXG5cclxuLyoqXHJcbiAqIFRoZSBOYXZpZ2F0aW9uIENvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzb2YtYXItbmF2aWdhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25hdmlnYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25hdmlnYXRpb24uY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBTVEVQUEVSX0dMT0JBTF9PUFRJT05TLCB1c2VWYWx1ZTogeyBkaXNwbGF5RGVmYXVsdEluZGljYXRvclR5cGU6IGZhbHNlIH1cclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXJtYXR1cmVOYXZpZ2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAvKiogVGhlIHBhcmVudCBzdGVwcGVyICovXHJcbiAgQFZpZXdDaGlsZCgndmVydFN0ZXBwZXInKSBwdWJsaWMgc3RlcHBlcjogTWF0U3RlcHBlcjtcclxuXHJcbiAgLyoqIFRoZSBzaWRlIG1vYmlsZSBuYXYgKi9cclxuICBAVmlld0NoaWxkKCdzbmF2JykgcHVibGljIHNpZGVuYXY6IE1hdFNpZGVuYXY7XHJcblxyXG4gIC8qKiBUaGUgbW9iaWxlIGV4cGFuc2lvbiBwYW5lbCBmb3IgcHJvZ3Jlc3MgbWVudSAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3BhbmVsJykgcHVibGljIGV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcclxuXHJcbiAgLyoqIFRoZSBjaGlsZCBzdGVwcGVycyAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ3ZlcnRTdGVwcGVySW5uZXInKSBwdWJsaWMgaW5uZXJTdGVwcGVyczogUXVlcnlMaXN0PE1hdFN0ZXBwZXI+O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gZGF0YSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBuYXZpZ2F0aW9uRGF0YTogTmF2Tm9kZVtdO1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5ncyA9IHt9O1xyXG5cclxuICAvKiogQ29tcG9uZW50IElucHV0IC0gdGhlIG5hdmlnYXRpb24gc2V0dGluZ3MgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgYWR2YW5jZWRTZXR0aW5nczogTmF2aWdhdGlvbkFkdmFuY2VkU2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgLyoqIENvbXBvbmVudCBJbnB1dCAtIHRoZSBuYXZpZ2F0aW9uIHNldHRpbmdzICovXHJcbiAgQElucHV0KCkgcHVibGljIHRoZW1lU2V0dGluZ3M6IE5hdmlnYXRpb25UaGVtZVNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDb21wb25lbnQgSW5wdXQgLSB0aGUgbmF2aWdhdGlvbiBsYW5ndWFnZSBzZXR0aW5ncyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsYW5ndWFnZVNldHRpbmdzOiBIZWFkZXJMYW5ndWFnZVNldHRpbmdzID0ge307XHJcblxyXG4gIC8qKiBDdXJyZW50IGxhbmd1YWdlICoqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXJyZW50TGFuZzogc3RyaW5nO1xyXG5cclxuICAvKiogbG9nT3V0IHRleHQgKiovXHJcbiAgQElucHV0KCkgcHVibGljIGxvZ091dFRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIFNldHMgbGFuZ3VhZ2UgKiovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBzZXRMYW5ndWFnZSQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKiBnZXRzIHRoZSBub24gdXNlZCBsYW5ndWFnZSAqL1xyXG4gIHB1YmxpYyBnZXQgb3RoZXJMYW5nVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXR0aW5ncz8ubGFuZ3VhZ2VzPy5maW5kKHggPT4geCAhPT0gdGhpcy5jdXJyZW50TGFuZyk7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBzaWRlIG5hdiBpcyBvcGVuIG9yIG5vdCAqL1xyXG4gIHB1YmxpYyBpc05hdk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIE1vYmlsZSBTdWJOYXYgLSB3aGV0aGVyIG9yIG5vdCB0aGUgbW9iaWxlIFN1Yk5hdiBpcyBvcGVuICovXHJcbiAgcHVibGljIGlzTW9iaWxlU3ViTmF2T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogTW9iaWxlIFN1Yk5hdiAtdGhlIGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBtb2JpbGUgU3ViTmF2ICovXHJcbiAgcHVibGljIGN1cnJlbnRNb2JpbGVOYXY6IE5hdk5vZGU7XHJcblxyXG4gIC8qKiBTZXR0aW5ncyAtIHRoZSBtYWluIG1lbnUgdGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIG1vYmlsZSBTdWJOYXYgKi9cclxuICBwdWJsaWMgbWFpbk1lbnVUZXh0OiBzdHJpbmc7XHJcblxyXG4gIC8qKiB0aGUgbW9iaWxlIHF1ZXJ5ICovXHJcbiAgcHVibGljIG1vYmlsZVF1ZXJ5OiBNZWRpYVF1ZXJ5TGlzdDtcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBwYXJlbnQgaW5kZXggKi9cclxuICBwdWJsaWMgc2VsZWN0ZWRQYXJlbnRJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCBjaGlsZCBpbmRleCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZENoaWxkSW5kZXhlczogeyBba2V5OiBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICAvKiogVGhlIG5hdmlnYXRpb24gcHJvZ3Jlc3MgY291bnQgKi9cclxuICBwdWJsaWMgbmF2UHJvZ3Jlc3NDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IGFjdGl2ZSBwYXJlbnQgbm9kZSAqL1xyXG4gIHB1YmxpYyBhY3RpdmVQYXJlbnROb2RlOiBOYXZOb2RlO1xyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgYWN0aXZlIHN1YiBub2RlICovXHJcbiAgcHVibGljIGFjdGl2ZVN1Yk5vZGU6IFN1Yk5hdk5vZGVzO1xyXG5cclxuICAvKiogVHJ1ZSBpZiB0aGUgZXhwYW5zaW9uIHBhbmVsIGlzIG9wZW4gKi9cclxuICBwdWJsaWMgcGFuZWxPcGVuU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSBmb290ZXIgbmF2aWdhdGlvbiBkYXRhICovXHJcbiAgcHVibGljIGZvb3Rlck5hdmlnYXRpb25EYXRhOiBOYXZOb2RlW11cclxuXHJcbiAgLyoqIHVzZXIgbmFtZSAqKi9cclxuICBwdWJsaWMgdXNlck5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFRoZSBjb25maWcgb2JzZXJ2YWJsZSAqL1xyXG4gIHB1YmxpYyBjb25maWckOiBPYnNlcnZhYmxlPEJhc2VDb25maWc+O1xyXG5cclxuICAvKiogVGhlIHBhcmVudCBub2RlIGluZGV4IHRvIGJlIHNldCB3aGVuIG5hdiBpcyB0b2dnbGVkIHRvIHByb2dyZXNzIG1lbnUgc3R5bGUgKi9cclxuICBwdWJsaWMgdG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleDogbnVtYmVyO1xyXG5cclxuICAvKiogVGhlIGNoaWxkIG5vZGUgaW5kZXggdG8gYmUgc2V0IHdoZW4gbmF2IGlzIHRvZ2dsZWQgdG8gcHJvZ3Jlc3MgbWVudSBzdHlsZSAqL1xyXG4gIHB1YmxpYyB0b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgLyoqIHRoZSBtb2JpbGUgcXVlcnkgbGlzdGVuZXIyICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfbW9iaWxlUXVlcnlMaXN0ZW5lcjogKCkgPT4gdm9pZDtcclxuXHJcbiAgLyoqIFRoZSBuYXYgYmluZCBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIG5hdkJpbmRTdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgKi9cclxuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAvKiogV2hldGhlciB3ZSBzaG91bGQgdGhlIG1lc3NhZ2UgKi9cclxuICBwdWJsaWMgc2hvd01lc3NhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgc2hvdWxkIHNob3cgY2hlY2sgbWFyayBvciBub3QgKi9cclxuICBwdWJsaWMgc2hvd0NoZWNrTWFyazogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBUaGUgbmF2IGJpbmQgc3Vic2NyaXB0aW9uICovXHJcbiAgcHJpdmF0ZSBsb2dJblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIGNvdW50IG9mIGZvb3RlciBpdGVtcyovXHJcbiAgcHVibGljIGZvb3Rlckl0ZW1Db3VudDogbnVtYmVyO1xyXG5cclxuICAvKiogVGhlIGJhbm5lciBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIGJhbm5lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKiogVGhlIGNvbmZpZyBzdWJzY3JpcHRpb24gKi9cclxuICBwdWJsaWMgY29uZmlnU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8qKiBUaGUgc2lkZW5hdiBzdWJzY3JpcHRpb24gKi9cclxuICBwcml2YXRlIHNpZGVOYXZTdWI6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogdGhlIGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgcmVmZXJlbmNlXHJcbiAgICogQHBhcmFtIG1lZGlhIHRoZSBtZWRpYSBtYXRjaGVyXHJcbiAgICogQHBhcmFtIHJvdXRlciBUaGUgcm91dGVyXHJcbiAgICogQHBhcmFtIGJhbm5lclNlcnZpY2UgVGhlIEJhbm5lciBTZXJ2aWNlXHJcbiAgICogQHBhcmFtIGFjdGl2YXRlZFJvdXRlIFRoZSBhY3RpdmF0ZWQgcm91dGVcclxuICAgKiBAcGFyYW0gY29uZmlnU2VydmljZSBUaGUgY29uZmlnIHNlcnZpY2VcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHJlYWRvbmx5IG1lZGlhOiBNZWRpYU1hdGNoZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBiYW5uZXJTZXJ2aWNlOiBCYW5uZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRob3JpemF0aW9uU2VydmljZTogQXV0aG9yaXphdGlvblNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IEJhc2VDb25maWdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLm1vYmlsZVF1ZXJ5ID0gbWVkaWEubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogOTU5cHgpJyk7XHJcbiAgICB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyID0gKCkgPT4ge1xyXG4gICAgICBjaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIC8vIGNsb3NlIHRoZSBzaWRlbmF2IHdoZW4gc2NyZWVuIHNpemUgaXMgY2hhbmdlZFxyXG4gICAgICBpZiAoIXRoaXMubW9iaWxlUXVlcnkubWF0Y2hlcyAmJiB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3Byb2dyZXNzJykge1xyXG4gICAgICAgIHRoaXMuc2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgLy8gYmVsb3cgaWYgc3RhdGVtZW50IGlzIGZvciBlZGdlIHN1cHBvcnQgc2luY2UgYWRkRXZlbnRMaXN0ZW5lciBkb2Vzbid0IGV4aXN0IGZvciBNZWRpYVF1ZXJ5TGlzdHNcclxuICAgIGlmICh0aGlzLm1vYmlsZVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5tb2JpbGVRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9tb2JpbGVRdWVyeUxpc3RlbmVyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vYmlsZVF1ZXJ5LmFkZExpc3RlbmVyKHRoaXMuX21vYmlsZVF1ZXJ5TGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE9uIEluaXQgLSBjb25maWd1cmUgdGhlIHNldHRpbmdzICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhbm5lclNlcnZpY2Uuc2hvd0Jhbm5lciQuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLnNob3dNZXNzYWdlID0gdmFsKSk7XHJcbiAgICB0aGlzLmJhbm5lclN1YnNjcmlwdGlvbi5hZGQodGhpcy5iYW5uZXJTZXJ2aWNlLm1lc3NhZ2UkLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5tZXNzYWdlID0gdmFsKSk7XHJcbiAgICB0aGlzLmJhbm5lclN1YnNjcmlwdGlvbi5hZGQodGhpcy5iYW5uZXJTZXJ2aWNlLnNob3dDaGVja01hcmskLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5zaG93Q2hlY2tNYXJrID0gdmFsKSk7XHJcblxyXG4gICAgdGhpcy5mb290ZXJOYXZpZ2F0aW9uRGF0YSA9IHRoaXMubmF2aWdhdGlvbkRhdGE/LmZpbHRlcihub2RlID0+IG5vZGU/LmFsdExvY2F0aW9uID09IHRydWUpO1xyXG4gICAgdGhpcy5mb290ZXJJdGVtQ291bnQgPSB0aGlzLmZvb3Rlck5hdmlnYXRpb25EYXRhID8gdGhpcy5mb290ZXJOYXZpZ2F0aW9uRGF0YS5sZW5ndGggOiAwO1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGF0YSA9IHRoaXMubmF2aWdhdGlvbkRhdGE/LmZpbHRlcihub2RlID0+IG5vZGU/LmFsdExvY2F0aW9uICE9IHRydWUpO1xyXG5cclxuICAgIC8vIGlmIHBhcmVudHMgaGF2ZSBubyByb3V0ZSwgZ3JhYiBmaXJzdCByb3V0ZSBvZiBjaGlsZFxyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGF0YT8uZm9yRWFjaChuID0+IHtcclxuICAgICAgaWYgKCFuLnJvdXRlKSB7XHJcbiAgICAgICAgbi5yb3V0ZSA9IG4uc3ViTm9kZXMgJiYgbi5zdWJOb2Rlcy5sZW5ndGggPiAwID8gbi5zdWJOb2Rlc1swXS5yb3V0ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICAvLyBlbmFibGUgYWxsIHBhZ2VzIGJ5IGRlZmF1bHRcclxuICAgICAgaWYgKG4uaXNEaXNhYmxlZCA9PSBudWxsKSB7XHJcbiAgICAgICAgbi5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5pdEJhc2ljU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuaW5pdEFkdmFuY2VkU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuaW5pdFRoZW1lU2V0dGluZ3MoKTtcclxuXHJcbiAgICAvLyBpbml0IGJpbmRpbmcgZm9yIHByb2dyZXNzIG5hdlxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MubWVudVN0eWxlID09PSAncHJvZ3Jlc3MnKSB7XHJcbiAgICAgIC8vIHNldCB0aGUgZmlyc3Qgbm9kZSBhbmQgY2hpbGQgbm9kZSBhcyB2aXNpdGVkXHJcbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5yb3V0ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0uc3ViTm9kZXMgJiYgdGhpcy5uYXZpZ2F0aW9uRGF0YVswXS5zdWJOb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzWzBdLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhWzBdLnN1Yk5vZGVzWzBdLnJvdXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBpbml0aWFsIHByb2dyZXNzIGJhclxyXG4gICAgICB0aGlzLm5hdlByb2dyZXNzQ291bnQgPSAodGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ICsgMSkgLyB0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aCAqIDEwMDtcclxuXHJcblxyXG4gICAgICB0aGlzLm5hdkJpbmRTdWIuYWRkKFxyXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcclxuICAgICAgICAgICAgLy8gZmluZCBwYXJlbnQgaW5kZXggd2l0aCBhY3RpdmUgY2hpbGRcclxuICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVQYXJlbnRBbmRDaGlsZChldmVudC51cmwpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMubG9nSW5TdWJzY3JpcHRpb24gPSB0aGlzLmF1dGhvcml6YXRpb25TZXJ2aWNlLmlzTG9nZ2VkSW4kLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudXNlck5hbWUgPSB0aGlzLmF1dGhvcml6YXRpb25TZXJ2aWNlLnVzZXJOYW1lKClcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZSkge1xyXG4gICAgICB0aGlzLmNvbmZpZ1N1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWckLnN1YnNjcmliZShjb25maWcgPT4ge1xyXG4gICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgIGlmIChjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy5yZXNldE5hdikge1xyXG4gICAgICAgICAgICB0aGlzLm5hdlByb2dyZXNzQ291bnQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFyZW50SW5kZXggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbMF0ucm91dGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGVwcGVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGVwcGVyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyU3RlcHBlcnM/LmZvckVhY2goc3RlcHBlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgIHN0ZXBwZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGEuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgICBuLnZpc2l0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBuLmNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgbi5zdWJOb2Rlcz8uZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgICAgIHMudmlzaXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcy5jb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyByZXNldCBiYWNrIHRvIGZhbHNlIHRvIGF2b2lkIG11bHRpcGxlIHRyaWdnZXJzIG9uIGZ1dHVyZSBjYWxsc1xyXG4gICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy5yZXNldE5hdiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZXMgd2VyZSBjaGFuZ2VkIGFuZCBub3QgbnVsbCwgaXQgbWVhbnMgdGhhdCB0aGUgbmF2IHdhcyB0b2dnbGVkIHRvIHByb2dyZXNzXHJcbiAgICAgICAgICBpZiAoY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCAhPSBudWxsXHJcbiAgICAgICAgICAgICYmIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleCAhPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4XHJcbiAgICAgICAgICAgICYmIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4ICE9IGNvbmZpZz8ubmF2aWdhdGlvbj8uc2V0dGluZ3M/LnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleFxyXG4gICAgICAgICAgICAmJiBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4ID0gY29uZmlnLm5hdmlnYXRpb24uc2V0dGluZ3MudG9nZ2xlUHJvZ3Jlc3NOYXZQYXJlbnRJbmRleDtcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXggPSBjb25maWcubmF2aWdhdGlvbi5zZXR0aW5ncy50b2dnbGVQcm9ncmVzc05hdkNoaWxkSW5kZXg7XHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgdGhlIHJvdXRlciBzdWJcclxuICAgICAgICAgICAgdGhpcy5uYXZCaW5kU3ViLmFkZChcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGZpbmQgcGFyZW50IGluZGV4IHdpdGggYWN0aXZlIGNoaWxkXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aXZlUGFyZW50QW5kQ2hpbGQoZXZlbnQudXJsKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBub2RlIGluZGV4IGlzIHZhbGlkXHJcbiAgICAgICAgICAgIGlmIChjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLnN1Yk5vZGVzPy5sZW5ndGggPiB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZVN0YXRlcyhjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLFxyXG4gICAgICAgICAgICAgICAgY29uZmlnLm5hdmlnYXRpb24ubm9kZXNbdGhpcy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4XS5zdWJOb2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2Q2hpbGRJbmRleF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZVN0YXRlcyhjb25maWcubmF2aWdhdGlvbi5ub2Rlc1t0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXhdLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaW5kZXhlc1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVByb2dyZXNzTmF2UGFyZW50SW5kZXggPSBjb25maWc/Lm5hdmlnYXRpb24/LnNldHRpbmdzPy50b2dnbGVQcm9ncmVzc05hdlBhcmVudEluZGV4XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4ID0gY29uZmlnPy5uYXZpZ2F0aW9uPy5zZXR0aW5ncz8udG9nZ2xlUHJvZ3Jlc3NOYXZDaGlsZEluZGV4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTGlmZSBjeWNsZSBob29rIGZvciBhZnRlciBjb21wb25lbnQgdmlldyBpbml0aWFsaXphdGlvbiAqL1xyXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5tZW51U3R5bGUgPT09ICdzdGVwcGVyJykge1xyXG4gICAgICB0aGlzLmJpbmRTdGVwcGVyVG9Sb3V0ZXMoKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGVwcGVyLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBzdGVwLnNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGUodGhpcy5uYXZpZ2F0aW9uRGF0YVtpbmRleF0ucm91dGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycy5mb3JFYWNoKChzdGVwcGVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgc3RlcHBlci5zdGVwcy5mb3JFYWNoKChzdGVwLCBqaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgc3RlcC5zZWxlY3QgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoaWxkSW5kZXhlc1tpbmRleF0gPSBqaW5kZXg7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZSh0aGlzLm5hdmlnYXRpb25EYXRhW2luZGV4XS5zdWJOb2Rlc1tqaW5kZXhdLnJvdXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaWRlTmF2U3ViID0gdGhpcy5zaWRlbmF2Lm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoZHJhd2VyU3RhdGUgPT4ge1xyXG4gICAgICB0aGlzLmlzTmF2T3BlbiA9IGRyYXdlclN0YXRlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogT24gRGVzdHJveSAqL1xyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubW9iaWxlUXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fbW9iaWxlUXVlcnlMaXN0ZW5lcik7XHJcbiAgICB0aGlzLm5hdkJpbmRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMubG9nSW5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYmFubmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmNvbmZpZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zaWRlTmF2U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb2JpbGUgU3ViTmF2IC0gb3BlbiB0aGUgU3ViTmF2XHJcbiAgICogQHBhcmFtIG5hdiB0aGUgbmF2IGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBTdWJOYXZcclxuICAgKi9cclxuICBwdWJsaWMgb3Blbk1vYmlsZVN1Yk5hdihuYXY6IE5hdk5vZGUpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNb2JpbGVTdWJOYXZPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuY3VycmVudE1vYmlsZU5hdiA9IG5hdjtcclxuICAgIHRoaXMuc2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb2JpbGUgU3ViTmF2IC0gY2xvc2VzIHRoZSBTdWJOYXZcclxuICAgKi9cclxuICBwdWJsaWMgY2xvc2VNb2JpbGVTdWJOYXYoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzTW9iaWxlU3ViTmF2T3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaWRlbmF2LmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB0aGVtZSBjb2xvclxyXG4gICAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgY3NzIHZhcmlhYmxlIG5hbWVcclxuICAgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yXHJcbiAgICovXHJcbiAgcHVibGljIHNldFRoZW1lQ29sb3IodmFyaWFibGU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGAtLXNvZi1uYXYtJHt2YXJpYWJsZX1gLCBjb2xvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBzdGVwIHN0YXRlXHJcbiAgICogQHBhcmFtIHBhcmVudEluZGV4IFRoZSBwYXJlbnQgaW5kZXhcclxuICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgY2hpbGQgaW5kZXhcclxuICAgKiBAcmV0dXJucyBUaGUgc3RlcCBzdGF0ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXRlcm1pbmVTdGVwU3RhdGUocGFyZW50SW5kZXg6IG51bWJlciwgY2hpbGRJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIC8vIG5vdCBwYXNzZWQgJiYgbm90IGFjdGl2ZVxyXG4gICAgaWYgKGNoaWxkSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIGlmICghdGhpcy5zdGVwcGVyKSB7XHJcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIG5vdCBwYXNzZWQgJiYgYWN0aXZlXHJcbiAgICAgIGlmIChwYXJlbnRJbmRleCA9PT0gdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHBhc3NlZCBidXQgbmF2IGJhY2tcclxuICAgICAgZWxzZSBpZiAocGFyZW50SW5kZXggPiB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWRJbmRleCAmJiB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS52aXNpdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGVwcGVyLnN0ZXBzLmZpbmQoKHMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpXHJcbiAgICAgICAgICAucmVzZXQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHBhc3NlZCAmJiBub3QgYWN0aXZlXHJcbiAgICAgIGVsc2UgaWYgKHBhcmVudEluZGV4IDwgdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdkb25lJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuaW5uZXJTdGVwcGVycykge1xyXG4gICAgICAgIHJldHVybiAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW5uZXJTdGVwcGVyID0gdGhpcy5pbm5lclN0ZXBwZXJzLmZpbmQoKHMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpO1xyXG4gICAgICBpZiAoY2hpbGRJbmRleCA9PT0gaW5uZXJTdGVwcGVyLnNlbGVjdGVkSW5kZXgpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGNoaWxkSW5kZXggPiBpbm5lclN0ZXBwZXIuc2VsZWN0ZWRJbmRleCAmJiB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XS5zdWJOb2Rlc1tjaGlsZEluZGV4XS52aXNpdGVkKSB7XHJcbiAgICAgICAgaW5uZXJTdGVwcGVyLnN0ZXBzLmZpbmQoKHMsIGluZGV4KSA9PiBpbmRleCA9PT0gY2hpbGRJbmRleClcclxuICAgICAgICAgIC5yZXNldCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoY2hpbGRJbmRleCA8IGlubmVyU3RlcHBlci5zZWxlY3RlZEluZGV4KSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGF0YVtwYXJlbnRJbmRleF0uc3ViTm9kZXNbY2hpbGRJbmRleF0udmlzaXRlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiAnZG9uZSc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICdub25lJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGVzIHRvIHRoZSBwcm92aWRlZCByb3V0ZVxyXG4gICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGVcclxuICAgKi9cclxuICBwdWJsaWMgbmF2aWdhdGUocm91dGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyb3V0ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZXMgdG8gZ2l2ZW4gc3RlcFxyXG4gICAqIEBwYXJhbSBzdGVwTnVtYmVyIFRoZSBzdGVwIG51bWJlciB0byBuYXZpZ2F0ZSB0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvU3RlcChzdGVwTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChzdGVwTnVtYmVyIDwgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4KSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLm5hdmlnYXRpb25EYXRhW3N0ZXBOdW1iZXJdLnJvdXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGFjdGl2ZSBwYXJlbnQgYW5kIGNoaWxkIG5vZGVzIFxyXG4gICAqIEBwYXJhbSB1cmwgVGhlIHJvdXRlciB1cmxcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0QWN0aXZlUGFyZW50QW5kQ2hpbGQodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjaGlsZEluZGV4O1xyXG4gICAgbGV0IHBhcmVudEluZGV4ID0gdGhpcy5uYXZpZ2F0aW9uRGF0YS5maW5kSW5kZXgobiA9PiB7XHJcbiAgICAgIGNoaWxkSW5kZXggPSBuLnN1Yk5vZGVzPy5maW5kSW5kZXgocyA9PiB1cmwuaW5jbHVkZXMocy5yb3V0ZS5yZXBsYWNlKCcuJywgJycpKSk7XHJcbiAgICAgIHJldHVybiBjaGlsZEluZGV4ID4gLTEgfHwgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKG4ucm91dGUucmVwbGFjZSgnLicsICcnKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGFyZW50SW5kZXggPT0gLTEpIHtcclxuICAgICAgcGFyZW50SW5kZXggPSAwXHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0IHRoZSBhY3RpdmUgcGFyZW50IG5vZGUgYW5kIHN1YiBub2RlXHJcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE5vZGUgPSB0aGlzLm5hdmlnYXRpb25EYXRhW3BhcmVudEluZGV4XTtcclxuICAgIHRoaXMuYWN0aXZlU3ViTm9kZSA9IGNoaWxkSW5kZXggPiAtMSAmJiB0aGlzLmFjdGl2ZVBhcmVudE5vZGUuc3ViTm9kZXMubGVuZ3RoID4gMCA/IHRoaXMuYWN0aXZlUGFyZW50Tm9kZS5zdWJOb2Rlc1tjaGlsZEluZGV4XSA6IG51bGw7XHJcblxyXG4gICAgLy8gY29tcHV0ZSB0aGUgcHJvZ3Jlc3MgYmFyXHJcbiAgICB0aGlzLm5hdlByb2dyZXNzQ291bnQgPSAocGFyZW50SW5kZXggKyAxKSAvIHRoaXMubmF2aWdhdGlvbkRhdGEubGVuZ3RoICogMTAwO1xyXG5cclxuICAgIC8vIHNldCB0aGUgbm9kZSBzdGF0ZXNcclxuICAgIHRoaXMuc2V0Tm9kZVN0YXRlcyh0aGlzLmFjdGl2ZVBhcmVudE5vZGUsIHRoaXMuYWN0aXZlU3ViTm9kZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBjb21wbGV0ZSBhbmQgdmlzaXRlZCBzdGF0ZXMgZm9yIGFsbCBOYXZOb2RlcyBcclxuICAgKiBAcGFyYW0gcGFyZW50Tm9kZSBUaGUgcGFyZW50IG5vZGVcclxuICAgKiBAcGFyYW0gY2hpbGROb2RlIFRoZSBjaGlsZCBub2RlXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVTdGF0ZXMocGFyZW50Tm9kZTogTmF2Tm9kZSwgY2hpbGROb2RlOiBTdWJOYXZOb2Rlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoaWxkTm9kZSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVN1Yk5vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgIGxldCBjaGlsZEluZGV4ID0gcGFyZW50Tm9kZS5zdWJOb2Rlcy5pbmRleE9mKGNoaWxkTm9kZSkgPiAtMSA/IHBhcmVudE5vZGUuc3ViTm9kZXMuaW5kZXhPZihjaGlsZE5vZGUpIDogMDtcclxuICAgICAgLy8gYWxsIHN1Ym5vZGVzIGJlZm9yZSB0aGlzIHdlcmUgY29tcGxldGVkIGFuZCB2aXNpdGVkXHJcbiAgICAgIHBhcmVudE5vZGUuc3ViTm9kZXMuc2xpY2UoMCwgY2hpbGRJbmRleCkuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBlbGVtZW50LmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICBlbGVtZW50LnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlUGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAvLyBzZXQgYWxsIHByZXZpb3VzIG5vZGVzIHRvIGNvbXBsZXRlXHJcbiAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmluZGV4T2YocGFyZW50Tm9kZSkgPiAtMSA/IHRoaXMubmF2aWdhdGlvbkRhdGEuaW5kZXhPZihwYXJlbnROb2RlKSA6IDA7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EYXRhLnNsaWNlKDAsIHBhcmVudEluZGV4KS5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICBkLmNvbXBsZXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCBhbGwgc3Vibm9kZXMgb2YgcHJldmlvdXMgbm9kZXMgdG8gY29tcGxldGUgb25seSBpZiB0aGUgbm9kZSB3YXMgbm90IGRpc2FibGVkXHJcbiAgICAgIGlmICghZC5pc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgZC5zdWJOb2Rlcy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgcy5jb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICBzLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAvLyBzZXQgdGhlIGN1cnJlbnQgbm9kZXMgYXMgdmlzaXRlZFxyXG4gICAgcGFyZW50Tm9kZS52aXNpdGVkID0gdHJ1ZTtcclxuICAgIGlmIChjaGlsZE5vZGUpIHtcclxuICAgICAgY2hpbGROb2RlLnZpc2l0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2VzIHRoZSBleHBhbnNpb24gcGFuZWwgYW5kIG5hdmlnYXRlcyB0byB0aGUgZ2l2ZW4gbm9kZVxyXG4gICAqIEBwYXJhbSBlbCBUaGUgbWF0IGV4cGFuc2lvbiBwYW5lbCBcclxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHBhcmVudCBub2RlIGluZGV4IFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkaXNhYmxlUGFuZWwoZWwsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGVsLmNsb3NlKCk7XHJcbiAgICB0aGlzLm5hdmlnYXRlKHRoaXMubmF2aWdhdGlvbkRhdGFbaW5kZXhdLnJvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogSGlkZXMgdGhlIG1lc3NhZ2VcclxuICAqL1xyXG4gIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9ncyBvdXQgb25jZSB1c2VyIGlzIGF1dGhvcml6ZWRcclxuICAgKiAqL1xyXG4gIHB1YmxpYyBsb2dPdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25TZXJ2aWNlLmF1dGhvcml6ZVVzZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlcyBtb2JpbGUgbmF2aWdhdGlvbiBhZnRlciBzZWxlY3Rpb24uXHJcbiAgICovXHJcbiAgcHVibGljIGNsb3NlTmF2aWdhdGlvbkZvck1vYmlsZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vYmlsZVF1ZXJ5Lm1hdGNoZXMpIHtcclxuICAgICAgdGhpcy5zaWRlbmF2LmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJcyB0aGUgbmF2aWdhdGlvbiBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc05hdlNlbGVjdGVkKG5vZGU6IE5hdk5vZGUgfCBTdWJOYXZOb2Rlcyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKG5vZGUucm91dGUsIHtwYXRoczogJ2V4YWN0JywgcXVlcnlQYXJhbXM6ICdleGFjdCcsIGZyYWdtZW50OiAnaWdub3JlZCcsIG1hdHJpeFBhcmFtczogJ2lnbm9yZWQnfSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2V0cyB0aGUgd2lkdGggZm9yIHRoZSBzaWRlIG5hdiAqL1xyXG4gIHB1YmxpYyBzZXROYXZXaWR0aCh3aWR0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB3aWR0aC5pbmNsdWRlcygnJScpIHx8IHdpZHRoLmluY2x1ZGVzKCdweCcpID8gd2lkdGggOiB3aWR0aCArICdweCc7XHJcbiAgfVxyXG5cclxuICAvKiogQmluZHMgdGhlIHN0ZXBwZXIgdG8gdGhlIHJvdXRlciAqL1xyXG4gIHByaXZhdGUgYmluZFN0ZXBwZXJUb1JvdXRlcygpOiB2b2lkIHtcclxuICAgIC8vIGZpbmQgcGFyZW50c1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIGZpbmQgcGFyZW50IGluZGV4IHdpdGggYWN0aXZlIGNoaWxkXHJcbiAgICAgIGxldCBjaGlsZEluZGV4O1xyXG4gICAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgICBjaGlsZEluZGV4ID0gbi5zdWJOb2Rlcz8uZmluZEluZGV4KHMgPT4gdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKHMucm91dGUucmVwbGFjZSgnLicsICcnKSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGRJbmRleCA+IC0xIHx8IHRoaXMucm91dGVyLnVybC5pbmNsdWRlcyhuLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gaWYgbm8gY2hpbGRyZW4gb3Igbm8gaW5kZXhlcyBhY3RpdmF0ZSBmaXJzdCBwYXJlbnRcclxuICAgICAgaWYgKHBhcmVudEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHBhcmVudEluZGV4ID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7XHJcbiAgICAgIGlmIChjaGlsZEluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmlubmVyU3RlcHBlcnMuZmluZCgoaXMsIGluZGV4KSA9PiBpbmRleCA9PT0gcGFyZW50SW5kZXgpLnNlbGVjdGVkSW5kZXggPSBjaGlsZEluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBmaW5kIHBhcmVudHNcclxuICAgIHRoaXMubmF2QmluZFN1Yi5hZGQoXHJcbiAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XHJcbiAgICAgICAgICAvLyBmaW5kIHBhcmVudCBpbmRleCB3aXRoIGFjdGl2ZSBjaGlsZFxyXG4gICAgICAgICAgbGV0IGNoaWxkSW5kZXg7XHJcbiAgICAgICAgICBsZXQgcGFyZW50SW5kZXggPSB0aGlzLm5hdmlnYXRpb25EYXRhLmZpbmRJbmRleChuID0+IHtcclxuICAgICAgICAgICAgY2hpbGRJbmRleCA9IG4uc3ViTm9kZXM/LmZpbmRJbmRleChzID0+IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKHMucm91dGUucmVwbGFjZSgnLicsICcnKSkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPiAtMSB8fCBldmVudC51cmxBZnRlclJlZGlyZWN0cy5pbmNsdWRlcyhuLnJvdXRlLnJlcGxhY2UoJy4nLCAnJykpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyBpZiBubyBjaGlsZHJlbiBvciBubyBpbmRleGVzIGFjdGl2YXRlIGZpcnN0IHBhcmVudFxyXG4gICAgICAgICAgaWYgKHBhcmVudEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICBwYXJlbnRJbmRleCA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7XHJcbiAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5uZXJTdGVwcGVycy5maW5kKChpcywgaW5kZXgpID0+IGluZGV4ID09PSBwYXJlbnRJbmRleCkuc2VsZWN0ZWRJbmRleCA9IGNoaWxkSW5kZXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIGFkdmFuY2VkIG5hdiBzZXR0aW5ncyAqL1xyXG4gIHByaXZhdGUgaW5pdEFkdmFuY2VkU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwRGVza3RvcCA9IHRoaXMuYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBEZXNrdG9wIHx8IDA7XHJcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3MudG9wR2FwTW9iaWxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLnRvcEdhcE1vYmlsZSB8fCB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodDtcclxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BEZXNrdG9wID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLm1hcmdpblRvcERlc2t0b3AgfHwgMDtcclxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BNb2JpbGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3MubWFyZ2luVG9wTW9iaWxlIHx8IDA7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBuYXYgdGhlbWUgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRUaGVtZVNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmNvbnRlbnRCZ0NvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdjb250ZW50LWJnLWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLmNvbnRlbnRCZ0NvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5mb250Q29sb3IgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2ZvbnQtY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5mb250Q29sb3IgPSB0aGlzLnRoZW1lU2V0dGluZ3MuZm9udENvbG9yIHx8ICcjMDAwJztcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5tb2JpbGVCZ0NvbG9yID0gdGhpcy50aGVtZVNldHRpbmdzLm1vYmlsZUJnQ29sb3IgfHwgJyNmZmZmZmYnO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmJnR3JhZGllbnRDb2xvcjEgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2JnLWdyYWRpZW50LWNvbG9yLTEnLCB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMSkgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MuYmdHcmFkaWVudENvbG9yMiA/IHRoaXMuc2V0VGhlbWVDb2xvcignYmctZ3JhZGllbnQtY29sb3ItMicsIHRoaXMudGhlbWVTZXR0aW5ncy5iZ0dyYWRpZW50Q29sb3IyKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5ib3JkZXJSaWdodENvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdib3JkZXItcmlnaHQtY29sb3InLCB0aGlzLnRoZW1lU2V0dGluZ3MuYm9yZGVyUmlnaHRDb2xvcikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3MubGlzdEJvcmRlckNvbG9yID8gdGhpcy5zZXRUaGVtZUNvbG9yKCdsaXN0LWJvcmRlci1jb2xvcicsIHRoaXMudGhlbWVTZXR0aW5ncy5saXN0Qm9yZGVyQ29sb3IpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MSA/IHRoaXMuc2V0VGhlbWVDb2xvcignaGlnaGxpZ2h0LWdyYWRpZW50LTEnLCB0aGlzLnRoZW1lU2V0dGluZ3MuaGlnaGxpZ2h0R3JhZGllbnQxKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5oaWdobGlnaHRHcmFkaWVudDIgPyB0aGlzLnNldFRoZW1lQ29sb3IoJ2hpZ2hsaWdodC1ncmFkaWVudC0yJywgdGhpcy50aGVtZVNldHRpbmdzLmhpZ2hsaWdodEdyYWRpZW50MikgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRoZW1lU2V0dGluZ3Muc3ViSGlnaGxpZ2h0Qm9yZGVyQ29sb3IgP1xyXG4gICAgICB0aGlzLnNldFRoZW1lQ29sb3IoJ3N1Yi1oaWdobGlnaHQtYm9yZGVyLWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJvcmRlckNvbG9yKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGhlbWVTZXR0aW5ncy5zdWJIaWdobGlnaHRCZ0NvbG9yID9cclxuICAgICAgdGhpcy5zZXRUaGVtZUNvbG9yKCdzdWItaGlnaGxpZ2h0LWJnLWNvbG9yJywgdGhpcy50aGVtZVNldHRpbmdzLnN1YkhpZ2hsaWdodEJnQ29sb3IpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBiYXNpYyBuYXYgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGluaXRCYXNpY1NldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLWxlZnQnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkID0gdGhpcy5zZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29uQ2xvc2VkIHx8ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0JztcclxuICAgIHRoaXMuc2V0dGluZ3MuYWxsb3dOYXZUb2dnbGUgPSB0aGlzLnNldHRpbmdzLmFsbG93TmF2VG9nZ2xlID09IG51bGwgPyB0cnVlIDogdGhpcy5zZXR0aW5ncy5hbGxvd05hdlRvZ2dsZTtcclxuICAgIHRoaXMuc2V0dGluZ3MubWFpbk1lbnVUZXh0ID8gdGhpcy5tYWluTWVudVRleHQgPSB0aGlzLnNldHRpbmdzLm1haW5NZW51VGV4dCA6IHRoaXMubWFpbk1lbnVUZXh0ID0gJ01haW4gTWVudSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLmhlYWRlckhlaWdodCA9IHRoaXMuc2V0dGluZ3MuaGVhZGVySGVpZ2h0IHx8IDYwO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0ID0gdGhpcy5zZXR0aW5ncy5tZW51QnV0dG9uU1JUZXh0IHx8ICdNZW51IEJ1dHRvbic7XHJcbiAgICB0aGlzLnNldHRpbmdzLm1lbnVTdHlsZSA9IHRoaXMuc2V0dGluZ3MubWVudVN0eWxlIHx8ICdzdGF0aWMnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5kaXNwbGF5TnVtYmVycyA9IHRoaXMuc2V0dGluZ3MuZGlzcGxheU51bWJlcnMgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLmRpc3BsYXlOdW1iZXJzO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25Db21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkNvbXBsZXRlSWNvbiB8fCAnZmFzIGZhLWNoZWNrLWNpcmNsZSc7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gfHwgJ2ZhciBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25DdXJyZW50SWNvbiA9IHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ3VycmVudEljb24gfHwgJ2ZhcyBmYS1jaXJjbGUnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVDb21wbGV0ZUljb24gPSB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudUNvbXBsZXRlSWNvbiB8fCAnZmFyIGZhLWNoZWNrJztcclxuICAgIHRoaXMuc2V0dGluZ3Muc2hvd1Byb2dyZXNzQmFyID0gdGhpcy5zZXR0aW5ncy5zaG93UHJvZ3Jlc3NCYXIgPT0gbnVsbCA/IHRydWUgOiB0aGlzLnNldHRpbmdzLnNob3dQcm9ncmVzc0JhclxyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wID0gdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wIHx8ICczNTAnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5zaWRlTmF2V2lkdGhNb2JpbGUgPSB0aGlzLnNldHRpbmdzLnNpZGVOYXZXaWR0aE1vYmlsZSB8fCAnMzUwJztcclxuICAgIHRoaXMuc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uID0gdGhpcy5zZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb24gfHwgZmFsc2U7XHJcbiAgICB0aGlzLnNldHRpbmdzLnByb2dyZXNzTWVudVdpZHRoID0gdGhpcy5zZXR0aW5ncy5wcm9ncmVzc01lbnVXaWR0aCB8fCAnMjgwJztcclxuICAgIHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyID0gdGhpcy5zZXR0aW5ncy51c2VDdXN0b21Nb2JpbGVGb290ZXIgIT0gbnVsbCA/IHRoaXMuc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyIDogZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzb2YtYXItbmF2LWNvbnRhaW5lclwiXHJcbiAgICAgW3N0eWxlLnRvcF09XCJtb2JpbGVRdWVyeS5tYXRjaGVzICYmIGFkdmFuY2VkU2V0dGluZ3MudG9wR2FwTW9iaWxlID8gYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBNb2JpbGUgKyAncHgnIDogc2V0dGluZ3MuaGVhZGVySGVpZ2h0ICsgJ3B4J1wiXHJcbiAgICAgW2NsYXNzLnNvZi1hci1uYXYtbW9iaWxlXT1cIm1vYmlsZVF1ZXJ5Lm1hdGNoZXNcIj5cclxuICA8ZGl2ICpuZ0lmPVwic2hvd01lc3NhZ2VcIiBtLWEtMCBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiIHN3cy1hbGVydC0tc2Vjb25kYXJ5IHJvbGU9XCJhbGVydFwiPlxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICA8aSAqbmdJZj1cInNob3dDaGVja01hcmtcIiBtLXItNSBtLWwtNSBjbGFzcz1cImZhcyBmYS1jaGVjay1jaXJjbGUgaWNvbi1jb250YWluZXJcIj48L2k+XHJcbiAgICAgIDxwIGNsYXNzPVwibWVzc2FnZS1jb250YWluZXJcIiBtLXItNSBtLWwtNSBbaW5uZXJIdG1sXT1cIm1lc3NhZ2UgfCB0cmFuc2xhdGVcIj48L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIj5cclxuICAgICAgPGJ1dHRvbiBpZD1cImJ0bkNsb3NlXCIgKGNsaWNrKT1cImhpZGUoKVwiIG1hdC1pY29uLWJ1dHRvbiBbYXR0ci5hcmlhLWxhYmVsXT1cIidjb21tb24uY2xvc2UnIHwgdHJhbnNsYXRlXCI+XHJcbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS10aW1lcyBmYS1sZ1wiPjwvaT5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiBpZD1cInNvZi1hci1uYXYtYnRuLW1lbnVcIiBhcmlhLWxhYmVsPVwiTWVudSBCdXR0b25cIiBtYXQtaWNvbi1idXR0b24gW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic25hdi50b2dnbGUoKVwiIGNsYXNzPVwic29mLWFyLW5hdi1tZW51LWJ0blwiXHJcbiAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiEobW9iaWxlUXVlcnkubWF0Y2hlcyB8fCBzZXR0aW5ncy5hbGxvd05hdlRvZ2dsZSkgfHwgc2V0dGluZ3MuaGlkZU5hdmlnYXRpb25cIj5cclxuICAgIDxzcGFuICpuZ0lmPVwiaXNOYXZPcGVuOyBlbHNlIGNsb3NlZEljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cInNvZi1hci1uYXYtbWVudS1pY29uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwie3tzZXR0aW5ncy5mb250QXdlc29tZU1lbnVJY29ufX0gbWVudS1pY29uXCI+PC9pPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPG5nLXRlbXBsYXRlICNjbG9zZWRJY29uPlxyXG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cInNvZi1hci1uYXYtbWVudS1pY29uXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJ7e3NldHRpbmdzLmZvbnRBd2Vzb21lTWVudUljb25DbG9zZWR9fSBtZW51LWljb25cIj48L2k+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57e3NldHRpbmdzLm1lbnVCdXR0b25TUlRleHQgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPG1hdC1zaWRlbmF2LWNvbnRhaW5lciBhdXRvc2l6ZSBjbGFzcz1cInNvZi1hci1uYXYtc2lkZW5hdi1jb250YWluZXJcIiBbc3R5bGUubWFyZ2luVG9wLnB4XT1cIlxyXG4gICAgICBtb2JpbGVRdWVyeS5tYXRjaGVzID8gYWR2YW5jZWRTZXR0aW5ncy5tYXJnaW5Ub3BNb2JpbGUgOiBhZHZhbmNlZFNldHRpbmdzLm1hcmdpblRvcERlc2t0b3BcIj5cclxuICAgIDxtYXQtc2lkZW5hdiBbZGlzYWJsZUNsb3NlXT1cIiFtb2JpbGVRdWVyeS5tYXRjaGVzXCIgY2xhc3M9XCJzb2YtYXItbmF2LXNpZGVuYXZcIiAjc25hdiBbbW9kZV09XCJtb2JpbGVRdWVyeS5tYXRjaGVzID8gJ292ZXInIDogJ3NpZGUnXCJcclxuICAgICAgICAgICAgICAgICBbZml4ZWRJblZpZXdwb3J0XT1cIm1vYmlsZVF1ZXJ5Lm1hdGNoZXNcIiBbZml4ZWRUb3BHYXBdPVwibW9iaWxlUXVlcnkubWF0Y2hlcyA/IGFkdmFuY2VkU2V0dGluZ3MudG9wR2FwTW9iaWxlIDogYWR2YW5jZWRTZXR0aW5ncy50b3BHYXBEZXNrdG9wXCJcclxuICAgICAgICAgICAgICAgICBbb3BlbmVkXT1cIiFtb2JpbGVRdWVyeS5tYXRjaGVzICYmICFzZXR0aW5ncy5oaWRlTmF2aWdhdGlvbiAmJiBzZXR0aW5ncy5tZW51U3R5bGUhPSdwcm9ncmVzcycgXCJcclxuICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwibW9iaWxlUXVlcnkubWF0Y2hlcyA/IHNldE5hdldpZHRoKHNldHRpbmdzLnNpZGVOYXZXaWR0aE1vYmlsZSkgOiBzZXROYXZXaWR0aChzZXR0aW5ncy5zaWRlTmF2V2lkdGhEZXNrdG9wKVwiXHJcbiAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie2JhY2tncm91bmQ6bW9iaWxlUXVlcnkubWF0Y2hlcyA/IHRoZW1lU2V0dGluZ3M/Lm1vYmlsZUJnQ29sb3IgOiB1bmRlZmluZWR9XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2JpbGVRdWVyeS5tYXRjaGVzICYmIHVzZXJOYW1lICYmICFzZXR0aW5ncy5jdXN0b21Vc2VyTmFtZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidXNlci1uYW1lXCI+XHJcbiAgICAgICAgICB7e3VzZXJOYW1lfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9iaWxlUXVlcnkubWF0Y2hlcyAmJiBzZXR0aW5ncy5jdXN0b21Vc2VyTmFtZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidXNlci1uYW1lXCI+XHJcbiAgICAgICAgICB7e3NldHRpbmdzLmN1c3RvbVVzZXJOYW1lIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8IS0tIE5hdiBIZWFkZXIgQ29udGVudCAtLT5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3NvZi1hci1uYXYtaGVhZGVyXVwiPiA8L25nLWNvbnRlbnQ+XHJcblxyXG4gICAgICA8IS0tIFN0YXRpYyBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmF2LWNvbnRlbnQtaXRlbSBzaWRlbmF2LWJhY2tncm91bmRcIiAqbmdJZj1cInNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3N0YXRpYydcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctYm90dG9tLnB4JzogKGZvb3Rlckl0ZW1Db3VudCo2NCkrMTI4fVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZXR0aW5ncy5tZW51U3R5bGUgPT09ICdzdGF0aWMnXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBuYXYgb2YgbmF2aWdhdGlvbkRhdGFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdj8uc3ViTm9kZXM/Lmxlbmd0aCAmJiAhbmF2LmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2V4cGFuZGVkXT1cIm5hdi5leHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgW25nQ2xhc3NdPVwieyAnc29mLWFyLW5hdi1zZWxlY3RlZCc6IGlzTmF2U2VsZWN0ZWQobmF2KSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIElmIHRoZXJlIGlzIGEgcm91dGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmF2Py5yb3V0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW5hdi1saXN0IFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1pdGVtXCIgbWF0LWxpc3QtaXRlbSBbcm91dGVyTGlua109XCJuYXY/LnJvdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ3NvZi1hci1uYXYtYWN0aXZlLXJvdXRlJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYXY/LmZvbnRBd2Vzb21lSWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24tc3R5bGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tuYXY/LmZvbnRBd2Vzb21lSWNvbn19XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29mLWFyLW5hdi1oZWFkZXItdGV4dFwiPnt7bmF2LnRleHQgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW5hdi1saXN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIElmIHRoZXJlIGlzIG5vdCBhIHJvdXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFuYXY/LnJvdXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbmF2LWxpc3QgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzb2YtYXItbmF2LWJ0bi1ub2RlXCIgY2xhc3M9XCJuYXYtaXRlbVwiIG1hdC1saXN0LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIlsnc29mLWFyLW5hdi1hY3RpdmUtcm91dGUnXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdj8uZm9udEF3ZXNvbWVJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaWNvbi1zdHlsaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e25hdj8uZm9udEF3ZXNvbWVJY29ufX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb2YtYXItbmF2LWhlYWRlci10ZXh0XCI+e3tuYXYudGV4dCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1uYXYtbGlzdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFN1Yk5hdiAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW5hdi1saXN0IFtuZ0NsYXNzXT1cInsgJ3NvZi1hci1uYXYtc2VsZWN0ZWQnOiBpc05hdlNlbGVjdGVkKHN1Ym5hdikgfVwiIGNsYXNzPVwic3VibmF2LWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiICpuZ0Zvcj1cImxldCBzdWJuYXYgb2YgbmF2Py5zdWJOb2Rlc1wiIChjbGljayk9XCJjbG9zZU5hdmlnYXRpb25Gb3JNb2JpbGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbS1tYXJnaW5cIiBtYXQtbGlzdC1pdGVtIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIlsnc29mLWFyLW5hdi1zdWItYWN0aXZlLXJvdXRlJ11cIiBbcm91dGVyTGlua109XCJzdWJuYXYucm91dGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tzdWJuYXYudGV4dCB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbmF2LWxpc3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gSWYgc3Vibm9kZXMgYXJlIG5vdCB0aGVyZSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW5hdj8uc3ViTm9kZXM/Lmxlbmd0aCAmJiAhbmF2Py5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gSWYgdGhlcmUgaXMgYSByb3V0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYXY/LnJvdXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtbmF2LWxpc3QgW25nQ2xhc3NdPVwieyAnc29mLWFyLW5hdi1zZWxlY3RlZCc6IGlzTmF2U2VsZWN0ZWQobmF2KSB9XCIgY2xhc3M9XCJuYXYtaGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCIgKGNsaWNrKT1cImNsb3NlTmF2aWdhdGlvbkZvck1vYmlsZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbS1tYXJnaW5cIiBtYXQtbGlzdC1pdGVtIFtyb3V0ZXJMaW5rXT1cIm5hdj8ucm91dGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIlsnc29mLWFyLW5hdi1hY3RpdmUtcm91dGUnXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdj8uZm9udEF3ZXNvbWVJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaWNvbi1zdHlsaW5nXCI+PGkgY2xhc3M9XCJ7e25hdj8uZm9udEF3ZXNvbWVJY29ufX1cIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvZi1hci1uYXYtaGVhZGVyLXRleHRcIj57e25hdi50ZXh0IHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1uYXYtbGlzdD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBJZiB0aGVyZSBpcyBub3QgYSByb3V0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbmF2Py5yb3V0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW5hdi1saXN0IFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic29mLWFyLW5hdi1idG4tbm9kZVwiIGNsYXNzPVwibmF2LWl0ZW1cIiBtYXQtbGlzdC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ3NvZi1hci1uYXYtYWN0aXZlLXJvdXRlJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYXY/LmZvbnRBd2Vzb21lSWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24tc3R5bGluZ1wiPjxpIGNsYXNzPVwie3tuYXY/LmZvbnRBd2Vzb21lSWNvbn19XCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb2YtYXItbmF2LWhlYWRlci10ZXh0XCI+e3tuYXYudGV4dCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1uYXYtbGlzdD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gU3RlcHBlciAtLT5cclxuICAgICAgPG1hdC12ZXJ0aWNhbC1zdGVwcGVyICpuZ0lmPVwic2V0dGluZ3MubWVudVN0eWxlID09PSAnc3RlcHBlcidcIiBbc2VsZWN0ZWRJbmRleF09XCJzZWxlY3RlZFBhcmVudEluZGV4XCIgI3ZlcnRTdGVwcGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGluZWFyXT1cImZhbHNlXCIgY2xhc3M9XCJzaWRlbmF2LWJhY2tncm91bmRcIj5cclxuICAgICAgICA8IS0tIEFsdGVybmF0ZSBzdGVwIHN0YXRlcyBmb3IgbmF2LCBpY2FvbnMgc2hvdWxkIGFsd2F5cyBiZSB3aGl0ZSBvbmx5IHdvcmtlZCB3aXRoIHN0eWxlcyAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0U3RlcHBlckljb249XCJjcmVhdGVcIj5cclxuICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhZCBmYS1wZW5jaWwtYWx0XCIgc3R5bGU9XCJjb2xvcjogd2hpdGUgIWltcG9ydGFudFwiPjwvaT5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwcGVySWNvbj1cImVkaXRcIj5cclxuICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhZCBmYS1wZW5jaWwtYWx0XCIgc3R5bGU9XCJjb2xvcjogd2hpdGUgIWltcG9ydGFudFwiPjwvaT5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwcGVySWNvbj1cImFjdGl2ZVwiPlxyXG4gICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFkIGZhLXBlbmNpbC1hbHRcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50XCI+PC9pPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFN0ZXBwZXJJY29uPVwiZG9uZVwiPlxyXG4gICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrXCIgc3R5bGU9XCJjb2xvcjogd2hpdGUgIWltcG9ydGFudFwiPjwvaT5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8IS0tIG5hdiBzdGVwcyAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBuYXYgb2YgbmF2aWdhdGlvbkRhdGE7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgIDxtYXQtc3RlcCAqbmdJZj1cIiFuYXY/LmhpZGRlblwiIHN0YXRlPVwie3sgZGV0ZXJtaW5lU3RlcFN0YXRlKGksIC0xKSB9fVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0U3RlcExhYmVsICpuZ0lmPVwiIW5hdi5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGl2U3RlcHt7IGkgfX1cIiBzdHlsZT1cImhlaWdodDogNzJweFwiIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgbmF2LnRleHQgfCB0cmFuc2xhdGUgfX1cIiBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidhZnRlcidcIiBmeEZsZXg9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBpZD1cInN0ZXB7eyBpIH19XCIgZnhGbGV4PVwiMTAwJVwiIGNsYXNzPVwibWF0LWJ1dHRvbiBzdGVwLWxpbmtcIiBbcm91dGVyTGlua109XCJuYXYucm91dGVcIlxyXG4gICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBjb2xvcjogdGhlbWVTZXR0aW5ncz8uZm9udENvbG9yIH1cIiBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ3N0ZXAtYWN0aXZlJ11cIj5cclxuICAgICAgICAgICAgICAgICAge3sgbmF2LnRleHQgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPHAgW2lubmVySFRNTF09XCJuYXYuc3RlcENvbnRlbnQgfCB0cmFuc2xhdGVcIj48L3A+XHJcbiAgICAgICAgICAgIDwhLS0gc3ViIG5hdiAtLT5cclxuICAgICAgICAgICAgPG1hdC12ZXJ0aWNhbC1zdGVwcGVyICpuZ0lmPVwibmF2Py5zdWJOb2Rlc1wiIFtzZWxlY3RlZEluZGV4XT1cInNlbGVjdGVkQ2hpbGRJbmRleGVzW2ldXCIgW2xpbmVhcl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdmVydFN0ZXBwZXJJbm5lcj5cclxuICAgICAgICAgICAgICA8IS0tIEFsdGVybmF0ZSBzdGVwIHN0YXRlcyBmb3Igc3ViIG5hdiwgaWNvbnMgc2hvdWxkIGFsd2F5cyBiZSB3aGl0ZSBvbmx5IHdvcmtlZCB3aXRoIHN0eWxlcyAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0U3RlcHBlckljb249XCJjcmVhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhZCBmYS1wZW5jaWwtYWx0XCIgc3R5bGU9XCJjb2xvcjogd2hpdGUgIWltcG9ydGFudFwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwcGVySWNvbj1cImVkaXRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhZCBmYS1wZW5jaWwtYWx0XCIgc3R5bGU9XCJjb2xvcjogd2hpdGUgIWltcG9ydGFudFwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwcGVySWNvbj1cImRvbmVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiIHN0eWxlPVwiY29sb3I6IHdoaXRlICFpbXBvcnRhbnRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0U3RlcHBlckljb249XCJhY3RpdmVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wZW5jaWwtYWx0XCIgc3R5bGU9XCJjb2xvcjogd2hpdGUgIWltcG9ydGFudFwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwcGVySWNvbj1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwhLS0gc3ViIG5hdiBzdGVwcyAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJuYXYgb2YgbmF2Py5zdWJOb2RlczsgbGV0IGogPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zdGVwIHN0YXRlPVwie3sgZGV0ZXJtaW5lU3RlcFN0YXRlKGksIGopIH19XCIgKm5nSWY9XCIhc3VibmF2LmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0U3RlcExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJkaXZTdWJTdGVwe3sgaSB9fS17eyBqIH19XCIgc3R5bGU9XCJoZWlnaHQ6IDcycHhcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IHN1Ym5hdi50ZXh0IHwgdHJhbnNsYXRlIH19XCIgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWZ0ZXInXCIgZnhGbGV4PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJzdWJTdGVwe3sgaSB9fS17eyBqIH19XCIgY2xhc3M9XCJtYXQtYnV0dG9uIHN0ZXAtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGNvbG9yOiB0aGVtZVNldHRpbmdzPy5mb250Q29sb3IgfVwiIFtyb3V0ZXJMaW5rXT1cInN1Ym5hdi5yb3V0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ3N0ZXAtYWN0aXZlJ11cIj57eyBzdWJuYXYudGV4dCB8IHRyYW5zbGF0ZSB9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPHAgW2lubmVySFRNTF09XCJzdWJuYXYuc3RlcENvbnRlbnQgfCB0cmFuc2xhdGVcIj48L3A+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zdGVwPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPC9tYXQtdmVydGljYWwtc3RlcHBlcj5cclxuICAgICAgICAgIDwvbWF0LXN0ZXA+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L21hdC12ZXJ0aWNhbC1zdGVwcGVyPlxyXG5cclxuICAgICAgPCEtLSBOYXYgRm9vdGVyIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmF2LWZvb3Rlci1pdGVtXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNldHRpbmdzLm1lbnVTdHlsZSA9PT0gJ3N0YXRpYydcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG5hdiBvZiBmb290ZXJOYXZpZ2F0aW9uRGF0YVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gRGVza3RvcCBOYXYgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFuYXY/LnN1Yk5vZGVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gSWYgdGhlcmUgaXMgYSByb3V0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYXY/LnJvdXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtbmF2LWxpc3QgY2xhc3M9XCJuYXYtaGVhZGVyXCIgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWl0ZW0gbmF2LWl0ZW0tbWFyZ2luXCIgbWF0LWxpc3QtaXRlbSBbcm91dGVyTGlua109XCJuYXY/LnJvdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ3NvZi1hci1uYXYtYWN0aXZlLXJvdXRlJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuYXY/LmZvbnRBd2Vzb21lSWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24tc3R5bGluZ1wiPjxpIGNsYXNzPVwie3tuYXY/LmZvbnRBd2Vzb21lSWNvbn19XCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tuYXYudGV4dCB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1uYXYtbGlzdD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBJZiB0aGVyZSBpcyBub3QgYSByb3V0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbmF2Py5yb3V0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW5hdi1saXN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzb2YtYXItbmF2LWJ0bi1ub2RlXCIgY2xhc3M9XCJuYXYtaXRlbVwiIG1hdC1saXN0LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cIlsnc29mLWFyLW5hdi1hY3RpdmUtcm91dGUnXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hdj8uZm9udEF3ZXNvbWVJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiaWNvbi1zdHlsaW5nXCI+PGkgY2xhc3M9XCJ7e25hdj8uZm9udEF3ZXNvbWVJY29ufX1cIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e25hdi50ZXh0IHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtbmF2LWxpc3Q+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJuYXZpZ2F0aW9uRm9vdGVyXCI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gdGhlIG1vYmlsZSBwcm9ncmVzcyBtZW51LS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZXR0aW5ncz8ubWVudVN0eWxlID09PSAncHJvZ3Jlc3MnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNpZGVuYXYtYmFja2dyb3VuZFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1ib3R0b20ucHgnOiAoZm9vdGVySXRlbUNvdW50KjY0KSsxMjh9XCI+XHJcbiAgICAgICAgICA8bWF0LWFjY29yZGlvbj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuYXZpZ2F0aW9uRGF0YTsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwLnN1Yk5vZGVzICYmIHN0ZXAuc3ViTm9kZXMubGVuZ3RoID4gMCAmJiAhc3RlcC5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIGhpZGVUb2dnbGUgY2xhc3M9XCJwcm9ncmVzcy1tb2JpbGUtZXhwYW5zaW9uLXBhbmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoIXN0ZXAudmlzaXRlZCB8fCBzdGVwLmlzRGlzYWJsZWQpICYmICFzZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb25cIiAob3BlbmVkKT1cInBhbmVsT3BlblN0YXRlID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VkKT1cInBhbmVsT3BlblN0YXRlID0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGUgY2xhc3M9XCJwcm9ncmVzcy1tb2JpbGUtcGFuZWwtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzooIXN0ZXAudmlzaXRlZCB8fCBzdGVwLmlzRGlzYWJsZWQpICYmICFzZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb24gJiYgIXN0ZXAuY29tcGxldGUsJ2NvbG9yLXByaW1hcnknOnN0ZXAuY29tcGxldGUgJiYgc3RlcCE9YWN0aXZlUGFyZW50Tm9kZSwncHJvZ3Jlc3MtbWVudS1hY3RpdmUnOnN0ZXA9PT1hY3RpdmVQYXJlbnROb2RlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJvZ3Jlc3NQYXJlbnROb2RlSWNvbnNcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3N0ZXA6c3RlcH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZXR0aW5ncz8uZGlzcGxheU51bWJlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2kgPCAxMCA/IFwiMFwiICsgKGkgKyAxKSArIFwiLiBcIiA6IGkgKyBcIiAuIFwiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXYtYnRuLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdGVwLnRleHQgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFwYW5lbE9wZW5TdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biBwYW5lbC1pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGFuZWxPcGVuU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHBhbmVsLWljb25cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtZGVzY3JpcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gbW9iaWxlIHN1YiBtZW51IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbmF2LW1lbnVcIiAqbmdGb3I9XCJsZXQgc3ViTm9kZSBvZiBzdGVwLnN1Yk5vZGVzOyBsZXQgaWR4ID0gaW5kZXg7XCIgW2hpZGRlbl09XCJzdGVwLnN1Yk5vZGVzW2lkeF0uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cIm1vYmlsZU1lbnV7eyBpZHggfX1cIiBtYXQtYnV0dG9uIGNsYXNzPVwic3RlcC1saW5rIHByb2dyZXNzLW1lbnUtbW9iaWxlLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NvbG9yLXByaW1hcnknOnN1Yk5vZGUuY29tcGxldGUgJiYgc3ViTm9kZSE9YWN0aXZlU3ViTm9kZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtBY3RpdmVdPVwiWydwcm9ncmVzcy1tZW51LWFjdGl2ZSddXCIgW25nU3R5bGVdPVwieyAnIGNvbG9yJzogdGhlbWVTZXR0aW5ncz8uZm9udENvbG9yIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwic3ViTm9kZS5yb3V0ZVwiIFtkaXNhYmxlZF09XCIhc3ViTm9kZS52aXNpdGVkICYmICFzZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc1N1Yk5vZGVJY29uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzdWJOb2RlOnN1Yk5vZGV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXYtbWVudS1idG4tdGV4dFwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOighc3ViTm9kZS52aXNpdGVkKSAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uICYmICFzdWJOb2RlLmNvbXBsZXRlLCdjb2xvci1wcmltYXJ5JzpzdWJOb2RlLmNvbXBsZXRlLCdwcm9ncmVzcy1tZW51LWFjdGl2ZSc6c3ViTm9kZT09PWFjdGl2ZVN1Yk5vZGV9XCI+e3sgc3ViTm9kZS50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tIGlmIHRoZXJlIGFyZSBubyBzdWJOb2RlcyAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFzdGVwLnN1Yk5vZGVzIHx8IHN0ZXAuc3ViTm9kZXMubGVuZ3RoPT0wKSAmJiAhc3RlcC5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICNwYW5lbCBoaWRlVG9nZ2xlIChvcGVuZWQpPVwiZGlzYWJsZVBhbmVsKHBhbmVsLGkpXCIgY2xhc3M9XCJwcm9ncmVzcy1tb2JpbGUtZXhwYW5zaW9uLXBhbmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoIXN0ZXAudmlzaXRlZCB8fCBzdGVwLmlzRGlzYWJsZWQpICYmICFzZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGUgY2xhc3M9XCJwcm9ncmVzcy1tb2JpbGUtcGFuZWwtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6KCFzdGVwLnZpc2l0ZWQgfHwgc3RlcC5pc0Rpc2FibGVkKSAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uICYmICFzdGVwLmNvbXBsZXRlLCdjb2xvci1wcmltYXJ5JzpzdGVwLmNvbXBsZXRlICYmIHN0ZXAhPWFjdGl2ZVBhcmVudE5vZGUsJ3Byb2dyZXNzLW1lbnUtYWN0aXZlJzpzdGVwPT09YWN0aXZlUGFyZW50Tm9kZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInByb2dyZXNzUGFyZW50Tm9kZUljb25zXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzdGVwOnN0ZXB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2V0dGluZ3M/LmRpc3BsYXlOdW1iZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpIDwgMTAgPyBcIjBcIiArIChpICsgMSkgKyBcIi4gXCIgOiBpICsgXCIgLiBcIiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2LWJ0bi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RlcC50ZXh0IHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtZGVzY3JpcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIHRoZSBwcm9ncmVzcyBtZW51IGxhbmd1YWdlIGFuZCBsb2dvdXQgYnV0dG9ucy0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtZm9vdGVyLWl0ZW0gcHJvZ3Jlc3MtZm9vdGVyXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibmF2aWdhdGlvbkZvb3RlclwiPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L21hdC1zaWRlbmF2PlxyXG4gICAgPG1hdC1zaWRlbmF2LWNvbnRlbnQ+XHJcbiAgICAgIDwhLS0gSG9yaXpvbnRhbCBQcm9ncmVzcyAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNldHRpbmdzPy5tZW51U3R5bGUgPT09ICdwcm9ncmVzcydcIj5cclxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciAqbmdJZj1cInNldHRpbmdzPy5zaG93UHJvZ3Jlc3NCYXJcIiBtb2RlPVwiZGV0ZXJtaW5hdGVcIiBbdmFsdWVdPVwibmF2UHJvZ3Jlc3NDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDlweFwiIGNvbG9yPVwiYWNjZW50XCI+XHJcbiAgICAgICAgPC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gICAgICAgIDxkaXYgZnhIaWRlLmx0LW1kIGNsYXNzPVwic3RlcC10aXRsZXMgY2VudGVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBzdHlsZT1cImp1c3RpZnktY29udGVudDpjZW50ZXIgIWltcG9ydGFudFwiIFtjbGFzcy5oaWRkZW5dPVwic2V0dGluZ3MuaGlkZU5hdmlnYXRpb25cIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmF2aWdhdGlvbkRhdGE7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImhvcml6b250YWwtcHJvZ3Jlc3MtZGl2XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc3RlcC5zdWJOb2Rlcz8ubGVuZ3RoICYmICFzdGVwLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbcm91dGVyTGlua109XCJzdGVwLnJvdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoIXN0ZXAudmlzaXRlZCB8fCBzdGVwLmlzRGlzYWJsZWQpICYmICFzZXR0aW5ncy5vdmVycmlkZU5hdmlnYXRpb25cIiBjbGFzcz1cInByb2dyZXNzLW1lbnUtYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY29sb3ItcHJpbWFyeSc6c3RlcC5jb21wbGV0ZSAmJiBzdGVwIT1hY3RpdmVQYXJlbnROb2RlLCdwcm9ncmVzcy1tZW51LWFjdGl2ZSc6c3RlcD09PWFjdGl2ZVBhcmVudE5vZGV9XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJvZ3Jlc3NQYXJlbnROb2RlSWNvbnNcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3N0ZXA6c3RlcH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNldHRpbmdzPy5kaXNwbGF5TnVtYmVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICB7e2kgPCAxMCA/IFwiMFwiICsgKGkgKyAxKSArIFwiLiBcIiA6IGkgKyBcIiAuIFwifX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2LWJ0bi10ZXh0XCI+e3sgc3RlcC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBpZiB0aGVyZSBhcmUgc3Vibm9kZXMgY3JlYXRlIG1lbnVzIGZvciBlYWNoIHN0ZXAgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwLnN1Yk5vZGVzICYmIHN0ZXAuc3ViTm9kZXMubGVuZ3RoICYmICFzdGVwLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwieydjb2xvci1wcmltYXJ5JzpzdGVwLmNvbXBsZXRlICYmIHN0ZXAhPWFjdGl2ZVBhcmVudE5vZGUsJ3Byb2dyZXNzLW1lbnUtYWN0aXZlJzpzdGVwPT09YWN0aXZlUGFyZW50Tm9kZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvbiBbZGlzYWJsZWRdPVwiKCFzdGVwLnZpc2l0ZWQgfHwgc3RlcC5pc0Rpc2FibGVkKSAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uXCIgY2xhc3M9XCJwcm9ncmVzcy1tZW51LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInByb2dyZXNzUGFyZW50Tm9kZUljb25zXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzdGVwOnN0ZXB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZXR0aW5ncz8uZGlzcGxheU51bWJlcnNcIj5cclxuICAgICAgICAgICAgICAgICAge3tpIDwgMTAgPyBcIjBcIiArIChpICsgMSkgKyBcIi4gXCIgOiBpICsgXCIgLiBcIn19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdi1idG4tdGV4dFwiPnt7IHN0ZXAudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJzb2YtYXItbWF0LW1lbnUgcHJvZ3Jlc3MtbWVudS1wYW5lbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLW5hdi1tZW51XCIgKm5nRm9yPVwibGV0IHN1Yk5vZGUgb2Ygc3RlcC5zdWJOb2RlczsgbGV0IGlkeCA9IGluZGV4O1wiIFtuZ1N0eWxlXT1cInt3aWR0aDpzZXR0aW5ncy5wcm9ncmVzc01lbnVXaWR0aCsncHgnfVwiIFtoaWRkZW5dPVwic3RlcC5zdWJOb2Rlc1tpZHhdLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic3VibWVudXt7IGlkeCB9fVwiIG1hdC1idXR0b24gY2xhc3M9XCJzdGVwLWxpbmsgcHJvZ3Jlc3MtbWVudS1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY29sb3ItcHJpbWFyeSc6c3ViTm9kZS5jb21wbGV0ZSAmJiBzdWJOb2RlIT1hY3RpdmVTdWJOb2RlLCdkaXNhYmxlZCc6IXN1Yk5vZGUudmlzaXRlZCAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9ufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtBY3RpdmVdPVwiWydwcm9ncmVzcy1tZW51LWFjdGl2ZSddXCIgW25nU3R5bGVdPVwieyAnIGNvbG9yJzogdGhlbWVTZXR0aW5ncz8uZm9udENvbG9yIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInN1Yk5vZGUucm91dGVcIiBbZGlzYWJsZWRdPVwiIXN1Yk5vZGUudmlzaXRlZCAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInByb2dyZXNzU3ViTm9kZUljb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzdWJOb2RlOnN1Yk5vZGV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdi1tZW51LWJ0bi10ZXh0XCI+e3sgc3ViTm9kZS50ZXh0IHx0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzLWNvbnRhaW5lclwiIGZ4SGlkZS5ndC1zbT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGVudCBzb2YtYXItbmF2LWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9tYXQtc2lkZW5hdi1jb250ZW50PlxyXG4gIDwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxyXG4gIDwhLS0gVGhlIHByb2dyZXNzIG1lbnUgcGFyZW50IG5vZGUgaWNvbiB0ZW1wbGF0ZS0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjcHJvZ3Jlc3NQYXJlbnROb2RlSWNvbnMgbGV0LXN0ZXA9J3N0ZXAnPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJzdGVwLmNvbXBsZXRlICYmIHN0ZXAgIT0gYWN0aXZlUGFyZW50Tm9kZVwiPlxyXG4gICAgICA8aSBjbGFzcz1cInt7IHNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkNvbXBsZXRlSWNvbiB9fSBjb2xvci1wcmltYXJ5IHByb2dyZXNzLW5hdi1pY29uXCI+PC9pPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJzdGVwID09PSBhY3RpdmVQYXJlbnROb2RlXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwie3sgc2V0dGluZ3MucHJvZ3Jlc3NTZWN0aW9uQ3VycmVudEljb24gfX0gY29sb3ItcHJpbWFyeSBwcm9ncmVzcy1uYXYtaWNvblwiPjwvaT5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0lmPVwiIXN0ZXAuY29tcGxldGUgJiYgc3RlcCAhPSBhY3RpdmVQYXJlbnROb2RlXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IXN0ZXAudmlzaXRlZCAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9ufVwiPlxyXG4gICAgICA8aSBjbGFzcz1cInt7IHNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gfX0gcHJvZ3Jlc3MtbmF2LWljb25cIj48L2k+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8IS0tIFRoZSBwcm9ncmVzcyBtZW51IHN1YiBub2RlIGljb24gdGVtcGxhdGUtLT5cclxuICA8bmctdGVtcGxhdGUgI3Byb2dyZXNzU3ViTm9kZUljb25zIGxldC1zdWJOb2RlPSdzdWJOb2RlJz5cclxuICAgIDxzcGFuICpuZ0lmPVwic3ViTm9kZS5jb21wbGV0ZSAmJmFjdGl2ZVN1Yk5vZGUgIT1zdWJOb2RlXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwie3tzZXR0aW5ncy5wcm9ncmVzc01lbnVDb21wbGV0ZUljb259fSBjb2xvci1wcmltYXJ5IHByb2dyZXNzLW5hdi1pY29uXCI+PC9pPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJhY3RpdmVTdWJOb2RlID09PXN1Yk5vZGVcIj5cclxuICAgICAgPGkgY2xhc3M9XCJ7eyBzZXR0aW5ncy5wcm9ncmVzc1NlY3Rpb25DdXJyZW50SWNvbiB9fSBjb2xvci1wcmltYXJ5IHByb2dyZXNzLW5hdi1pY29uXCI+PC9pPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhc3ViTm9kZS5jb21wbGV0ZSAmJmFjdGl2ZVN1Yk5vZGUgIT1zdWJOb2RlXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IXN1Yk5vZGUudmlzaXRlZCAmJiAhc2V0dGluZ3Mub3ZlcnJpZGVOYXZpZ2F0aW9ufVwiPlxyXG4gICAgICA8aSBjbGFzcz1cInt7IHNldHRpbmdzLnByb2dyZXNzU2VjdGlvbkZ1dHVyZUljb24gfX0gcHJvZ3Jlc3MtbmF2LWljb25cIj48L2k+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8IS0tIFRoZSBuYXZpZ2F0aW9uIGZvb3RlciB0ZW1wbGF0ZSBmb3IgbGFuZ3VhZ2UgYW5kIGxvZ291dCBidXR0b25zIC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjbmF2aWdhdGlvbkZvb3Rlcj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzb2YtYXItbmF2LW1vYmlsZS1mb290ZXJdXCI+IDwvbmctY29udGVudD5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2V0dGluZ3MudXNlQ3VzdG9tTW9iaWxlRm9vdGVyXCI+XHJcbiAgICAgIDwhLS0gVGhlIGxhbmd1YWdlIGJ1dHRvbiAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxhbmd1YWdlU2V0dGluZ3M/LmRpc3BsYXlMYW5ndWFnZU9wdGlvbnMgJiYgbGFuZ3VhZ2VTZXR0aW5ncz8ubGFuZ3VhZ2VzLmxlbmd0aCA+IDIgJiYgbW9iaWxlUXVlcnkubWF0Y2hlc1wiPlxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJzb2YtYXItbmF2LWxhbmctZHJvcGRvd25cIiBtYXQtc3Ryb2tlZC1idXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFkZWQtYnV0dG9uLTUwIGxhbmd1YWdlLWJ1dHRvbiBuYXZpZ2F0aW9uRm9vdGVyXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImhlYWRlckxhbmd1YWdlTWVudVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhbmd1YWdlU2V0dGluZ3MuYnV0dG9uVGV4dCB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJpY29uLXN0eWxpbmdcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtZ2xvYmUgbGFuZ3VhZ2UtZ2xvYmVcIj48L2k+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB7e2xhbmd1YWdlU2V0dGluZ3MuYnV0dG9uVGV4dCB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG1hdC1tZW51ICNoZWFkZXJMYW5ndWFnZU1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJzb2YtYXItbWF0LW1lbnVcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZVNldHRpbmdzLmxhbmd1YWdlc1wiIChjbGljayk9XCJzZXRMYW5ndWFnZSQuZW1pdChsYW5nKVwiXHJcbiAgICAgICAgICAgICAgICAgIGlkPVwiYXBwbHktbGFuZy1idG4te3tsYW5nfX1cIj5cclxuICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cImF1dG9cIj5cclxuICAgICAgICAgICAgICAgIHt7IGxhbmcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cImF1dG9cIiBmeExheW91dEFsaWduPVwiZW5kIGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjdXJyZW50TGFuZyA9PT0gbGFuZ1wiIGNsYXNzPVwiZmFkIGZhLWNoZWNrIHNlbGVjdGVkLWxhbmd1YWdlLWljb25cIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYW5ndWFnZVNldHRpbmdzPy5kaXNwbGF5TGFuZ3VhZ2VPcHRpb25zICYmIGxhbmd1YWdlU2V0dGluZ3M/Lmxhbmd1YWdlcy5sZW5ndGggPT09IDIgJiYgbW9iaWxlUXVlcnkubWF0Y2hlc1wiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJsYW5ndWFnZVNldHRpbmdzPy5sYW5ndWFnZXMubGVuZ3RoID09PSAyXCIgaWQ9XCJzb2YtYXItbmF2LWxhbmctYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhZGVkLWJ1dHRvbi01MCBsYW5ndWFnZS1idXR0b24gbmF2aWdhdGlvbkZvb3RlclwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhbmd1YWdlU2V0dGluZ3MuYnV0dG9uVGV4dCB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJzZXRMYW5ndWFnZSQuZW1pdCgpXCI+XHJcbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24tc3R5bGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1nbG9iZSBsYW5ndWFnZS1nbG9iZVwiPjwvaT5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIHt7b3RoZXJMYW5nVGV4dCB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8IS0tIFRoZSBsb2dvdXQgYnV0dG9uLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2JpbGVRdWVyeS5tYXRjaGVzICYmIHVzZXJOYW1lXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cInNvZi1hci1oZWFkZXItbGFuZy1idXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJuYXZpZ2F0aW9uRm9vdGVyXCIgKGNsaWNrKT1cImxvZ091dCgpXCI+XHJcbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24tc3R5bGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zaWduLW91dC1hbHRcIj48L2k+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB7e2xvZ091dFRleHQgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PlxyXG4iXX0=