ng-easycommerce 0.0.613 → 0.0.615

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 (595) hide show
  1. package/README.md +973 -969
  2. package/assets/bamboo.html +145 -145
  3. package/assets/bancardCatastro.html +49 -49
  4. package/assets/bancardFrameBase.html +104 -104
  5. package/assets/cecaFrameRedirectBase.html +172 -172
  6. package/assets/decidirFormEc.html +519 -519
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +295 -295
  10. package/assets/ec-i18n/en.json +0 -0
  11. package/assets/ec-i18n/es.json +411 -411
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +295 -295
  14. package/assets/ec-i18n/pr.json +295 -295
  15. package/assets/images/whatsapp.png +0 -0
  16. package/assets/mpFrameRedirectBase.html +114 -114
  17. package/assets/recaptcha/recaptcha-site-keys.json +3 -3
  18. package/assets/recaptcha/recaptcha-sites-prod.json +38 -38
  19. package/assets/recaptcha/recaptcha-sites.json +52 -52
  20. package/assets/redirect.html +62 -62
  21. package/assets/redsysAuthVdosBase.html +78 -78
  22. package/assets/redsysAuthVunoBase.html +84 -84
  23. package/assets/redsysFrameRedirectBase.html +102 -102
  24. package/assets/redsysFrameRedirectOutBase.html +102 -102
  25. package/assets/redsysFrameSendBase.html +71 -71
  26. package/assets/redsysProBase.html +399 -399
  27. package/assets/redsysStateBase.html +63 -63
  28. package/assets/scss/_colors.scss +17 -17
  29. package/assets/scss/_styles.scss +22 -22
  30. package/assets/svg/chevron-left-black.svg +61 -61
  31. package/assets/svg/chevron-right-black.svg +61 -61
  32. package/bundles/ng-easycommerce.umd.js +19681 -19681
  33. package/bundles/ng-easycommerce.umd.js.map +1 -1
  34. package/bundles/ng-easycommerce.umd.min.js +1 -1
  35. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  36. package/esm2015/lib/api/connection.service.js +77 -77
  37. package/esm2015/lib/classes/checkout/step-service.js +39 -39
  38. package/esm2015/lib/classes/checkout/step.js +22 -22
  39. package/esm2015/lib/classes/checkout-process-state.js +2 -2
  40. package/esm2015/lib/classes/component-helper.js +16 -16
  41. package/esm2015/lib/classes/filters/AttributesFilter.js +61 -61
  42. package/esm2015/lib/classes/filters/CategoryFilter.js +54 -54
  43. package/esm2015/lib/classes/filters/DinamycsFilter.js +58 -58
  44. package/esm2015/lib/classes/filters/Filter.js +75 -75
  45. package/esm2015/lib/classes/filters/PriceRangeFilter.js +51 -51
  46. package/esm2015/lib/classes/filters/SortFilter.js +79 -79
  47. package/esm2015/lib/classes/user-role-type.js +1 -1
  48. package/esm2015/lib/classes/user.js +108 -108
  49. package/esm2015/lib/core.consts.js +414 -414
  50. package/esm2015/lib/ec-component/account-ec/account-ec.component.js +45 -45
  51. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +115 -115
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +192 -192
  53. package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +115 -115
  54. package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +44 -44
  55. package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +58 -58
  56. package/esm2015/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +108 -108
  57. package/esm2015/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +168 -168
  58. package/esm2015/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +165 -165
  59. package/esm2015/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +78 -78
  60. package/esm2015/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +140 -140
  61. package/esm2015/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +110 -110
  62. package/esm2015/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +138 -138
  63. package/esm2015/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +38 -38
  64. package/esm2015/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +152 -152
  65. package/esm2015/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +119 -119
  66. package/esm2015/lib/ec-component/blocks-ec/blocks-ec.component.js +70 -70
  67. package/esm2015/lib/ec-component/build-your-ec/build-your-ec.component.js +305 -305
  68. package/esm2015/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +85 -85
  69. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +404 -404
  70. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +152 -152
  71. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +424 -424
  72. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +103 -103
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +146 -146
  74. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +112 -112
  75. package/esm2015/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +53 -53
  76. package/esm2015/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +66 -66
  77. package/esm2015/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +80 -80
  78. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +220 -220
  79. package/esm2015/lib/ec-component/compared-products-ec/compared-products-ec.component.js +186 -186
  80. package/esm2015/lib/ec-component/cookies-ec/cookies-ec.component.js +109 -109
  81. package/esm2015/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +32 -32
  82. package/esm2015/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +34 -34
  83. package/esm2015/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +34 -34
  84. package/esm2015/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +35 -35
  85. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +53 -53
  86. package/esm2015/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +49 -49
  87. package/esm2015/lib/ec-component/filters-ec/filters-ec.component.js +152 -152
  88. package/esm2015/lib/ec-component/filters-top-ec/filters-top-ec.component.js +102 -102
  89. package/esm2015/lib/ec-component/footer-ec/footer-ec.component.js +82 -82
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +199 -199
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +244 -244
  93. package/esm2015/lib/ec-component/login-ec/login-ec.component.js +102 -102
  94. package/esm2015/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +90 -90
  95. package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +103 -103
  96. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +172 -172
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +140 -140
  98. package/esm2015/lib/ec-component/related-products-ec/related-products-ec.component.js +94 -94
  99. package/esm2015/lib/ec-component/reviews-ec/reviews-ec.component.js +69 -69
  100. package/esm2015/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +138 -138
  101. package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +86 -86
  102. package/esm2015/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +130 -130
  103. package/esm2015/lib/ec-component/share-block-ec/share-block-ec.component.js +149 -149
  104. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +133 -133
  105. package/esm2015/lib/ec-component/stores-ec/stores-ec.component.js +192 -192
  106. package/esm2015/lib/ec-component/variants-ec/variants-ec.component.js +56 -56
  107. package/esm2015/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +205 -205
  108. package/esm2015/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +296 -296
  109. package/esm2015/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +154 -154
  110. package/esm2015/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +144 -144
  111. package/esm2015/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +49 -49
  112. package/esm2015/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +133 -133
  113. package/esm2015/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +152 -152
  114. package/esm2015/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +175 -175
  115. package/esm2015/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +30 -30
  116. package/esm2015/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +26 -26
  117. package/esm2015/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +21 -21
  118. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +156 -156
  119. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +368 -368
  120. package/esm2015/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +151 -151
  121. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +178 -178
  122. package/esm2015/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +126 -125
  123. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +98 -99
  124. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  125. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  129. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  130. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  131. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  132. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  133. package/esm2015/lib/ec-directive/index.js +36 -36
  134. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  135. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  136. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  137. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  138. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  141. package/esm2015/lib/ec-pipe/index.js +13 -13
  142. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  143. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  144. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  145. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  146. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  147. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  148. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  149. package/esm2015/lib/interfaces/Script.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  153. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  154. package/esm2015/lib/interfaces/block.js +1 -1
  155. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  156. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  157. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  158. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  159. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  160. package/esm2015/lib/interfaces/cookies.js +1 -1
  161. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  162. package/esm2015/lib/interfaces/coupon.js +1 -1
  163. package/esm2015/lib/interfaces/deserializable.js +1 -1
  164. package/esm2015/lib/interfaces/faqs.js +1 -1
  165. package/esm2015/lib/interfaces/filter.js +1 -1
  166. package/esm2015/lib/interfaces/filterStep.js +1 -1
  167. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  168. package/esm2015/lib/interfaces/paginate.js +1 -1
  169. package/esm2015/lib/interfaces/parameters.js +1 -1
  170. package/esm2015/lib/interfaces/selection.js +4 -4
  171. package/esm2015/lib/interfaces/step.js +1 -1
  172. package/esm2015/lib/interfaces/store.js +1 -1
  173. package/esm2015/lib/ng-easycommerce.module.js +181 -181
  174. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  175. package/esm2015/lib/services/account/orders.service.js +102 -102
  176. package/esm2015/lib/services/analytics.service.js +57 -57
  177. package/esm2015/lib/services/auth.service.js +352 -352
  178. package/esm2015/lib/services/banner.service.js +72 -72
  179. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  180. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  181. package/esm2015/lib/services/captcha.service.js +130 -130
  182. package/esm2015/lib/services/cart.service.js +574 -574
  183. package/esm2015/lib/services/channel-config.service.js +105 -105
  184. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  185. package/esm2015/lib/services/checkout/checkout.service.js +233 -233
  186. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  187. package/esm2015/lib/services/checkout/payment.service.js +79 -79
  188. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  189. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  190. package/esm2015/lib/services/cookies.service.js +208 -208
  191. package/esm2015/lib/services/currency.service.js +161 -161
  192. package/esm2015/lib/services/dataform.service.js +46 -46
  193. package/esm2015/lib/services/filters.service.js +122 -122
  194. package/esm2015/lib/services/gift-card.service.js +61 -61
  195. package/esm2015/lib/services/ip-address.service.js +34 -34
  196. package/esm2015/lib/services/options.service.js +275 -275
  197. package/esm2015/lib/services/pagination.service.js +73 -73
  198. package/esm2015/lib/services/parameters.service.js +72 -72
  199. package/esm2015/lib/services/products/product-detail.service.js +432 -432
  200. package/esm2015/lib/services/products/products.service.js +287 -287
  201. package/esm2015/lib/services/reviews.service.js +107 -107
  202. package/esm2015/lib/services/stores.service.js +37 -37
  203. package/esm2015/lib/services/windows.service.js +52 -52
  204. package/esm2015/lib/services/wishlist.service.js +70 -70
  205. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  206. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  207. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  208. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  209. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  210. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  211. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  212. package/esm2015/lib/utils/order-util.service.js +72 -72
  213. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  214. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  215. package/esm2015/lib/utils/toast.service.js +42 -42
  216. package/esm2015/lib/utils/utils.service.js +20 -20
  217. package/esm2015/ng-easycommerce.js +34 -34
  218. package/esm2015/public-api.js +146 -146
  219. package/esm5/lib/api/connection.service.js +90 -90
  220. package/esm5/lib/classes/checkout/step-service.js +74 -74
  221. package/esm5/lib/classes/checkout/step.js +25 -25
  222. package/esm5/lib/classes/checkout-process-state.js +2 -2
  223. package/esm5/lib/classes/component-helper.js +22 -22
  224. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  225. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  226. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  227. package/esm5/lib/classes/filters/Filter.js +78 -78
  228. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  229. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  230. package/esm5/lib/classes/user-role-type.js +1 -1
  231. package/esm5/lib/classes/user.js +120 -120
  232. package/esm5/lib/core.consts.js +434 -434
  233. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  234. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +169 -169
  235. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +209 -209
  236. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  237. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  238. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  239. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  240. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +185 -185
  241. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +182 -182
  242. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +170 -170
  244. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  245. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  246. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  247. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  248. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  249. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  250. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  251. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  252. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +488 -488
  253. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +169 -169
  254. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +509 -509
  255. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +120 -120
  256. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +236 -236
  257. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  258. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  259. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +83 -83
  260. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  261. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  262. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  263. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  264. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  265. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  267. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  268. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  269. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  270. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  271. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  272. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +113 -113
  273. package/esm5/lib/ec-component/header-ec/header-ec.component.js +260 -260
  274. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  275. package/esm5/lib/ec-component/index.js +244 -244
  276. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  277. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  278. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  279. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +199 -199
  280. package/esm5/lib/ec-component/product-ec/product-ec.component.js +158 -158
  281. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  282. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  283. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  284. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  285. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  286. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  287. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +136 -136
  288. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  289. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  290. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  291. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  292. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  293. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  294. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  295. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  296. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  297. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  298. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  299. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  300. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  302. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  303. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  304. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  305. package/esm5/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +144 -143
  306. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +119 -120
  307. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  308. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  309. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  310. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  311. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  312. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  313. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  314. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  315. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  316. package/esm5/lib/ec-directive/index.js +36 -36
  317. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  318. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  319. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  320. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  321. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  322. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  323. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  324. package/esm5/lib/ec-pipe/index.js +13 -13
  325. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  326. package/esm5/lib/guards/auth-guard.service.js +37 -37
  327. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  328. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  329. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  330. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  331. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  332. package/esm5/lib/interfaces/Script.js +1 -1
  333. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  334. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  335. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  336. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  337. package/esm5/lib/interfaces/block.js +1 -1
  338. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  339. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  340. package/esm5/lib/interfaces/checkout-data.js +1 -1
  341. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  342. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  343. package/esm5/lib/interfaces/cookies.js +1 -1
  344. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  345. package/esm5/lib/interfaces/coupon.js +1 -1
  346. package/esm5/lib/interfaces/deserializable.js +1 -1
  347. package/esm5/lib/interfaces/faqs.js +1 -1
  348. package/esm5/lib/interfaces/filter.js +1 -1
  349. package/esm5/lib/interfaces/filterStep.js +1 -1
  350. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  351. package/esm5/lib/interfaces/paginate.js +1 -1
  352. package/esm5/lib/interfaces/parameters.js +1 -1
  353. package/esm5/lib/interfaces/selection.js +4 -4
  354. package/esm5/lib/interfaces/step.js +1 -1
  355. package/esm5/lib/interfaces/store.js +1 -1
  356. package/esm5/lib/ng-easycommerce.module.js +185 -185
  357. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  358. package/esm5/lib/services/account/orders.service.js +120 -120
  359. package/esm5/lib/services/analytics.service.js +60 -60
  360. package/esm5/lib/services/auth.service.js +426 -426
  361. package/esm5/lib/services/banner.service.js +81 -81
  362. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  363. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  364. package/esm5/lib/services/captcha.service.js +132 -132
  365. package/esm5/lib/services/cart.service.js +705 -705
  366. package/esm5/lib/services/channel-config.service.js +107 -107
  367. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  368. package/esm5/lib/services/checkout/checkout.service.js +316 -316
  369. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  370. package/esm5/lib/services/checkout/payment.service.js +129 -129
  371. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  372. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  373. package/esm5/lib/services/cookies.service.js +222 -222
  374. package/esm5/lib/services/currency.service.js +205 -205
  375. package/esm5/lib/services/dataform.service.js +48 -48
  376. package/esm5/lib/services/filters.service.js +125 -125
  377. package/esm5/lib/services/gift-card.service.js +63 -63
  378. package/esm5/lib/services/ip-address.service.js +35 -35
  379. package/esm5/lib/services/options.service.js +376 -376
  380. package/esm5/lib/services/pagination.service.js +79 -79
  381. package/esm5/lib/services/parameters.service.js +74 -74
  382. package/esm5/lib/services/products/product-detail.service.js +497 -497
  383. package/esm5/lib/services/products/products.service.js +345 -345
  384. package/esm5/lib/services/reviews.service.js +116 -116
  385. package/esm5/lib/services/stores.service.js +39 -39
  386. package/esm5/lib/services/windows.service.js +79 -79
  387. package/esm5/lib/services/wishlist.service.js +71 -71
  388. package/esm5/lib/strategies/standard.strategy.js +44 -44
  389. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  390. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  391. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  392. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  393. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  394. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  395. package/esm5/lib/utils/order-util.service.js +75 -75
  396. package/esm5/lib/utils/payment-utils.service.js +37 -37
  397. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  398. package/esm5/lib/utils/toast.service.js +61 -61
  399. package/esm5/lib/utils/utils.service.js +22 -22
  400. package/esm5/ng-easycommerce.js +34 -34
  401. package/esm5/public-api.js +146 -146
  402. package/fesm2015/ng-easycommerce.js +16657 -16657
  403. package/fesm2015/ng-easycommerce.js.map +1 -1
  404. package/fesm5/ng-easycommerce.js +19685 -19685
  405. package/fesm5/ng-easycommerce.js.map +1 -1
  406. package/lib/api/connection.service.d.ts +28 -28
  407. package/lib/classes/checkout/step-service.d.ts +28 -28
  408. package/lib/classes/checkout/step.d.ts +14 -14
  409. package/lib/classes/checkout-process-state.d.ts +12 -12
  410. package/lib/classes/component-helper.d.ts +8 -8
  411. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  412. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  413. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  414. package/lib/classes/filters/Filter.d.ts +19 -19
  415. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  416. package/lib/classes/filters/SortFilter.d.ts +15 -15
  417. package/lib/classes/user-role-type.d.ts +5 -5
  418. package/lib/classes/user.d.ts +68 -68
  419. package/lib/core.consts.d.ts +216 -216
  420. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  421. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +33 -33
  422. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +84 -84
  423. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  424. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  425. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  426. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  427. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  428. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  429. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  430. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  432. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  433. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  434. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  435. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  436. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  437. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  438. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  439. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +59 -59
  440. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +43 -43
  441. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +100 -100
  442. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +27 -27
  443. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +57 -57
  444. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  445. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  446. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +33 -33
  447. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  448. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  449. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  450. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  451. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  452. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  453. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  454. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  455. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  456. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  457. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  458. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  459. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  460. package/lib/ec-component/header-ec/header-ec.component.d.ts +66 -66
  461. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  462. package/lib/ec-component/index.d.ts +81 -81
  463. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  464. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  465. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  466. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +60 -60
  467. package/lib/ec-component/product-ec/product-ec.component.d.ts +52 -52
  468. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  469. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  470. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  471. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  472. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  473. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  474. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +29 -29
  475. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  476. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  477. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  478. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  479. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  480. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  481. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  482. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  483. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  484. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  485. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  486. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  487. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  488. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  489. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  490. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  491. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  492. package/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.d.ts +34 -34
  493. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +31 -31
  494. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  495. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  496. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  497. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  498. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  499. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  500. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  501. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  502. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  503. package/lib/ec-directive/index.d.ts +6 -6
  504. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  505. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  506. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  507. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  508. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  509. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  510. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  511. package/lib/ec-pipe/index.d.ts +4 -4
  512. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  513. package/lib/guards/auth-guard.service.d.ts +8 -8
  514. package/lib/guards/checkout-ready.service.d.ts +8 -8
  515. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  516. package/lib/guards/user-role-guard.service.d.ts +8 -8
  517. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  518. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  519. package/lib/interfaces/Script.d.ts +5 -5
  520. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  521. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  522. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  523. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  524. package/lib/interfaces/block.d.ts +33 -33
  525. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  526. package/lib/interfaces/cart-item.d.ts +8 -8
  527. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  528. package/lib/interfaces/checkout-data.d.ts +6 -6
  529. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  530. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  531. package/lib/interfaces/cookies.d.ts +49 -49
  532. package/lib/interfaces/core.interfaces.d.ts +4 -4
  533. package/lib/interfaces/coupon.d.ts +5 -5
  534. package/lib/interfaces/currencyConfig.d.ts +10 -10
  535. package/lib/interfaces/deserializable.d.ts +3 -3
  536. package/lib/interfaces/faqs.d.ts +12 -12
  537. package/lib/interfaces/filter.d.ts +51 -51
  538. package/lib/interfaces/filterStep.d.ts +29 -29
  539. package/lib/interfaces/navbar-items.d.ts +9 -9
  540. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  541. package/lib/interfaces/paginate.d.ts +1 -1
  542. package/lib/interfaces/parameters.d.ts +10 -10
  543. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  544. package/lib/interfaces/product.d.ts +46 -46
  545. package/lib/interfaces/selection.d.ts +10 -10
  546. package/lib/interfaces/step.d.ts +8 -8
  547. package/lib/interfaces/store.d.ts +17 -17
  548. package/lib/ng-easycommerce.module.d.ts +5 -5
  549. package/lib/pipes/order-by.pipe.d.ts +5 -5
  550. package/lib/services/account/orders.service.d.ts +29 -29
  551. package/lib/services/analytics.service.d.ts +21 -21
  552. package/lib/services/auth.service.d.ts +116 -116
  553. package/lib/services/banner.service.d.ts +26 -26
  554. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  555. package/lib/services/blocks/blocks.service.d.ts +25 -25
  556. package/lib/services/captcha.service.d.ts +76 -76
  557. package/lib/services/cart.service.d.ts +140 -140
  558. package/lib/services/channel-config.service.d.ts +35 -35
  559. package/lib/services/checkout/addressing.service.d.ts +239 -239
  560. package/lib/services/checkout/checkout.service.d.ts +71 -71
  561. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  562. package/lib/services/checkout/payment.service.d.ts +34 -34
  563. package/lib/services/checkout/shipment.service.d.ts +58 -58
  564. package/lib/services/concatenated-associations.service.d.ts +57 -57
  565. package/lib/services/cookies.service.d.ts +66 -66
  566. package/lib/services/currency.service.d.ts +65 -65
  567. package/lib/services/dataform.service.d.ts +13 -13
  568. package/lib/services/filters.service.d.ts +48 -48
  569. package/lib/services/gift-card.service.d.ts +19 -19
  570. package/lib/services/ip-address.service.d.ts +10 -10
  571. package/lib/services/options.service.d.ts +61 -61
  572. package/lib/services/pagination.service.d.ts +30 -30
  573. package/lib/services/parameters.service.d.ts +18 -18
  574. package/lib/services/products/product-detail.service.d.ts +115 -115
  575. package/lib/services/products/products.service.d.ts +101 -101
  576. package/lib/services/reviews.service.d.ts +71 -71
  577. package/lib/services/stores.service.d.ts +11 -11
  578. package/lib/services/windows.service.d.ts +13 -13
  579. package/lib/services/wishlist.service.d.ts +13 -13
  580. package/lib/strategies/standard.strategy.d.ts +12 -12
  581. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  582. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  583. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  584. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  585. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  586. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  587. package/lib/utils/order-util.service.d.ts +12 -12
  588. package/lib/utils/payment-utils.service.d.ts +5 -5
  589. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  590. package/lib/utils/toast.service.d.ts +15 -15
  591. package/lib/utils/utils.service.d.ts +4 -4
  592. package/ng-easycommerce.d.ts +34 -34
  593. package/ng-easycommerce.metadata.json +1 -1
  594. package/package.json +1 -1
  595. package/public-api.d.ts +144 -144
@@ -1,434 +1,434 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
- return c > 3 && r && Object.defineProperty(target, key, r), r;
17
- };
18
- var __param = (this && this.__param) || function (paramIndex, decorator) {
19
- return function (target, key) { decorator(target, key, paramIndex); }
20
- };
21
- import { Injectable, Inject } from '@angular/core';
22
- import { Router } from '@angular/router';
23
- import { TranslateService } from '@ngx-translate/core';
24
- import { ReplaySubject } from 'rxjs';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "../public-api";
27
- import * as i2 from "@ngx-translate/core";
28
- import * as i3 from "@angular/router";
29
- var Constants = /** @class */ (function () {
30
- function Constants(translate, router, env) {
31
- var _this = this;
32
- this.translate = translate;
33
- this.router = router;
34
- this.env = env;
35
- this.LOCALE = 'LOCALE';
36
- this.CHANNEL = 'CHANNEL';
37
- this.searchValue = '';
38
- this.channelConfigSubject = new ReplaySubject();
39
- this.channelConfig$ = this.channelConfigSubject.asObservable();
40
- this.channelConfigAPI = function (channel) { return '/shop-api/' + channel + 'channel'; };
41
- this.browserWindow = window || {};
42
- this.browserWindowEnv = this.browserWindow['__env'] || {};
43
- // private urlBase: string = 'http://testing.backend.easycommercetech.com/';
44
- this.urlBase = this.browserWindowEnv['apiUrl'] ? this.browserWindowEnv['apiUrl'] : (this.env.apiUrl || 'http://backend.easycommerce.devp/');
45
- this.urlAssets = this.browserWindowEnv['urlAssets'] ? this.browserWindowEnv['urlAssets'] : (this.env.urlAssets || this.urlBase);
46
- this.urlFrontend = this.browserWindowEnv['urlFrontend'] ? this.browserWindowEnv['urlFrontend'] : (this.env.urlFrontend || 'https://elden.easycommercetech.com/');
47
- this.locale = localStorage.getItem(this.LOCALE) ? localStorage.getItem(this.LOCALE) : this.browserWindowEnv['locale'] ? this.browserWindowEnv['locale'] : (this.env.locale || 'es_AR');
48
- this.channel = localStorage.getItem(this.CHANNEL) ? localStorage.getItem(this.CHANNEL) : this.browserWindowEnv['channel'] ? this.browserWindowEnv['channel'] : (this.env.channel || 'minorista');
49
- this.blocksCacheTime = this.browserWindowEnv['blocksCacheTime'] ? this.browserWindowEnv['blocksCacheTime'] : (this.env.blocksCacheTime || null);
50
- this.modalConfig = { title: 'Example', class: 'modal-xl modal-dialog-centered', keyboard: false };
51
- this.setModalConfig = function (config) { return _this.modalConfig = config; };
52
- this.getModalConfig = function () { return _this.modalConfig; };
53
- this.version = 'v1';
54
- this.routes = [/^home$/g, /^(\/?)collection(\/?)([\w\.\/\?]*)$/g, /^contact$/g];
55
- /* Get rid of this ASAP! */
56
- this.masterChannel = null;
57
- this.getMasterChannel = function () {
58
- if (!_this.masterChannel)
59
- _this.masterChannel = localStorage.getItem('MASTER_CHANNEL');
60
- return _this.masterChannel;
61
- };
62
- this.setMasterChannel = function (channel) {
63
- _this.masterChannel = channel;
64
- localStorage.setItem('MASTER_CHANNEL', channel);
65
- };
66
- this.isProduction = function () { return _this.browserWindowEnv['production'] ? _this.browserWindowEnv['production'] : (_this.env.production || false); };
67
- this.setUrlBase = function (url) { return _this.urlBase = url; };
68
- this.setUrlAssets = function (url) { return _this.urlAssets = url; };
69
- /**
70
- * @param next Function to execute
71
- * @param params That function needs
72
- *
73
- * Execute the function passed as params, if the frontend is in production mode
74
- */
75
- this.onlyIfProduction = function (next, params) { return _this.isProduction() && next(params); };
76
- /**
77
- * @description Devuelve la url base donde se alojan los archivos multimedia
78
- * @param postMedia carpeta donde se guardan los archivos
79
- * @returns
80
- */
81
- this.mediaUrl = function (postMedia) { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + (postMedia ? postMedia : "image/"); };
82
- this.mediaBannerUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "banner-image/"; };
83
- this.mediaStoreUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "store-image/"; };
84
- this.getProductsListRoute = function () { return 'collection/'; };
85
- this.getSectionsRoute = function () { return 'section/'; };
86
- this.getUrlBase = function () { return _this.urlBase; };
87
- this.getUrlFrontend = function () { return _this.urlFrontend; };
88
- this.getBlocksCacheTime = function () { return _this.blocksCacheTime && parseInt(_this.blocksCacheTime); };
89
- // getLocale = () => this.locale;
90
- // setLocale = (locale) => this.locale = locale;
91
- this.getLocale = function () {
92
- if (localStorage.getItem(_this.LOCALE)) {
93
- _this.locale = localStorage.getItem(_this.LOCALE);
94
- }
95
- return _this.locale;
96
- };
97
- this.getLocaleTranslate = function () {
98
- return _this.getLocale().split('_')[0];
99
- };
100
- this.setLocale = function (locale) {
101
- localStorage.setItem(_this.LOCALE, locale);
102
- _this.translate.use(locale.split('_')[0]);
103
- _this.locale = locale;
104
- };
105
- this.getChannel = function () {
106
- if (localStorage.getItem(_this.CHANNEL)) {
107
- _this.channel = localStorage.getItem(_this.CHANNEL);
108
- }
109
- return _this.channel;
110
- };
111
- this.setChannel = function (channel) {
112
- localStorage.setItem(_this.CHANNEL, channel);
113
- _this.channel = channel;
114
- };
115
- this.getVersion = function () { return _this.version; };
116
- this.loginExtraData = function () {
117
- return {
118
- client_id: 'demo_client',
119
- client_secret: 'secret_demo_client',
120
- grant_type: 'password'
121
- };
122
- };
123
- this.isCollection = function (path) { return (/^(\/?)collection(\/?)([\w\.\/\?]*)$/g).test(path); };
124
- /**
125
- * Utilities
126
- */
127
- this.mobile = function () { return window.innerWidth < 750; };
128
- this.strictTypeChannel = function () { return _this.env.strictTypeChannel || 'b2b2c'; };
129
- this.toDecimal = function (total) { return (total - Math.floor(total) == 0) ? total / 100 : total; };
130
- /**
131
- * Elementos para manejo de lista de rutas reutilizables
132
- */
133
- this.addRouteToReuse = function (route) { return route && _this.routes.push(route); };
134
- this.removeRouteToReuse = function (route) {
135
- var index = _this.routes.indexOf(route);
136
- if (index > -1) {
137
- _this.routes.splice(index, 1);
138
- }
139
- };
140
- this.getRoutesToReuse = function () { return _this.routes; };
141
- /**
142
- * @public ejemplo de uso <img *ngFor="let item of consts.getRatingStar(product.rating,'assets/images/star.png','assets/images/notStar.png')" [src]="item">
143
- * @description funcion que dado un valor entre 1 .. 5, y star: notStar:
144
- * (deben ser el path del archivo local a la implementacion).
145
- * retorna un arreglo con con la valoracion correspondiente.
146
- */
147
- this.getRatingStar = function (rating, star, notStar) {
148
- try {
149
- var urlStar = [];
150
- var cantStar = Number(rating) || 0;
151
- for (var index = 0; index < 5; index++) {
152
- urlStar.push(cantStar > 0
153
- ? star
154
- : notStar);
155
- cantStar--;
156
- }
157
- return urlStar;
158
- }
159
- catch (error) {
160
- console.error("getRatingStar produjo un error -> ", error);
161
- }
162
- };
163
- /**
164
- * @public ejemplo de uso (keypress)="inputValidationByExpressions($event,'[0-9]{1,9}')" en el DOM.
165
- * @description funcion que dado un manejandor de evento, y una expresion regular esta es
166
- * evaluada sobre los valores que el manejador de eventos nos envia.
167
- * En el caso en el que se envie el parametro 'condition' este puede ser para
168
- * anular el evento como condicion adicional a la evaluacion de la entrada.
169
- */
170
- this.inputValidationByExpressions = function (e, patron, condition) {
171
- if (condition === void 0) { condition = null; }
172
- try {
173
- var tecla = (document) ? e.keyCode : e.which;
174
- if (tecla == 8)
175
- return true;
176
- var patronReg = new RegExp(patron);
177
- var tecla_final = String.fromCharCode(tecla);
178
- if (condition != null) {
179
- return patronReg.test(tecla_final) && condition;
180
- }
181
- return patronReg.test(tecla_final);
182
- }
183
- catch (error) {
184
- console.error("inputValidationByExpressions produjo un error -> ", error);
185
- }
186
- };
187
- /**
188
- * Propiedad que se utiliza para tomar como configuración para el tipo de moneda que se utiliza en el sitio.
189
- * Estos valores son utilizados para el pipe currencyPrice
190
- */
191
- this.currency = {
192
- code: 'ARG',
193
- symbol: '$',
194
- position: 'Left',
195
- withoutDecimal: false
196
- };
197
- /**
198
- * Arreglo de valores usados para el pipe currencyPrice
199
- */
200
- this.currencyTypeConfig = [
201
- {
202
- code: 'EUR',
203
- symbol: '€',
204
- position: 'Right',
205
- withoutDecimal: false
206
- },
207
- {
208
- code: 'ARG',
209
- symbol: '$',
210
- position: 'Left',
211
- withoutDecimal: false
212
- },
213
- {
214
- code: 'ARS',
215
- symbol: '$',
216
- position: 'Left',
217
- withoutDecimal: false
218
- },
219
- {
220
- code: 'USD',
221
- symbol: '$',
222
- position: 'Left',
223
- withoutDecimal: false
224
- },
225
- {
226
- code: 'PYG',
227
- symbol: 'Gs.',
228
- position: 'Left',
229
- withoutDecimal: false
230
- },
231
- {
232
- code: 'PEN',
233
- symbol: 'S/',
234
- position: 'Left',
235
- withoutDecimal: false
236
- },
237
- {
238
- code: 'SEK',
239
- symbol: 'SEK',
240
- position: 'Right',
241
- withoutDecimal: true
242
- },
243
- ];
244
- this.setCurrencyTypeConfig = function (currencyTypeConfig) {
245
- _this.currencyTypeConfig = currencyTypeConfig;
246
- };
247
- /**
248
- * @description Reemplaza los valores de una moneda.
249
- * @param currencyTypeFind Tipo de currency que se desea modificar
250
- * @param customType Los nuevos valores. Todas las key son opcionales
251
- * @example customType = { code: 'ARG', symbol: '$', position: 'Left' , withoutDecimal: false }
252
- */
253
- this.replaceCurrencyTypeConfig = function (currencyTypeFind, customType) {
254
- var _a, _b, _c, _d;
255
- var currencyType = _this.currencyTypeConfig.find(function (type) { return type.code == currencyTypeFind; });
256
- if (currencyType) {
257
- currencyType.symbol = ((_a = customType) === null || _a === void 0 ? void 0 : _a.symbol) || currencyType.symbol;
258
- currencyType.code = ((_b = customType) === null || _b === void 0 ? void 0 : _b.code) || currencyType.code;
259
- currencyType.position = ((_c = customType) === null || _c === void 0 ? void 0 : _c.position) || currencyType.position;
260
- currencyType.withoutDecimal = ((_d = customType) === null || _d === void 0 ? void 0 : _d.withoutDecimal) || currencyType.withoutDecimal;
261
- }
262
- //Reveer en el futuro si se empiezan a agregar otro tipos de monedas
263
- /* else{
264
- this.currencyTypeConfig.push({...customType })
265
- } */
266
- };
267
- /**
268
- *
269
- * @param currencyTypeFind Definir el code del tipo de moneda que se quiera utilizar.
270
- * Si el tipo es CUSTOM se toman los valores del segundo parametro donde se puede definir la simbología y posesión que se quiera.
271
- * @param customType Formato del parámetro ejemplo { code: 'ARG', symbol: '$', position: 'L' , withoutDecimals: false } ,
272
- * todas las key son opcionales y por defecto se toman los valores del ejemplo.
273
- * @returns se retorna la configuración que se seteo a la propiedad currency del servicio.
274
- */
275
- this.setCurrency = function (currencyTypeFind, customType) {
276
- _this.currency = _this.currencyTypeConfig.find(function (ct) { return ct.code == currencyTypeFind.toUpperCase(); }) || _this.currency;
277
- customType && (_this.currency = __assign(__assign({}, _this.currency), customType));
278
- return _this.currency;
279
- };
280
- this.modifyChannelConfig = function (channelConfig) {
281
- if (channelConfig.channel || channelConfig.code)
282
- _this.setChannel(channelConfig.channel || channelConfig.code);
283
- if (channelConfig.locale || channelConfig.locales.code)
284
- _this.setLocale(channelConfig.locale || channelConfig.locales.code);
285
- if (channelConfig.currency || channelConfig.baseCurrency)
286
- _this.setCurrency(channelConfig.currency || channelConfig.baseCurrency);
287
- return channelConfig;
288
- };
289
- /**
290
- * @description Se utiliza para configurar los filtros por defecto que se aplicaran en la seccion 'Collection'
291
- * cuando se ingresa a la misma.
292
- */
293
- this.defaultFilters = [];
294
- /**
295
- * @description Settea el valor de la variable defaulFilters.
296
- * @param filters
297
- */
298
- this.setDefaultFilters = function (filters) {
299
- _this.defaultFilters = filters;
300
- };
301
- this.getDefaultFilters = function () { return _this.defaultFilters; };
302
- /**
303
- * @description Se utiliza para configurar tanto los filtros por defectos que ya seran aplicados, como tambien
304
- * los filtros que se mostraran en la seccion collection, su orden, etc.
305
- */
306
- this.filterConfig = {
307
- defaultFilters: [],
308
- filters: ['category', 'attributes', 'dynamics', 'price_range']
309
- };
310
- this.setFilterConfig = function (filterConfig) {
311
- filterConfig.defaultFilters ? _this.filterConfig.defaultFilters = filterConfig.defaultFilters : null;
312
- filterConfig.filters ? _this.filterConfig.filters = filterConfig.filters : null;
313
- };
314
- this.getFilterConfig = function () { return _this.filterConfig.filters; };
315
- /**
316
- * @description contiene un arreglo de string cuyo contenido son los codigos de los paises.
317
- * @example ['AR','ES','GB']
318
- */
319
- this.countries = [];
320
- /**
321
- *
322
- * @param countries debe contener los codigos de los paises que se quiere mostrar
323
- * @example ['AR','ES','GB']
324
- * @returns
325
- */
326
- this.setCountries = function (countries) { return _this.countries = countries; };
327
- this.getCountries = function () { return _this.countries; };
328
- /**
329
- * @description esta variable se utiliza para configurar los parametros cuando se desea mostrar
330
- * variantes el listado de productos.
331
- * @param {string}type tipo de options
332
- * @param {string}code codigo de options
333
- * @param {boolean}defaultFirstOption `true` toma el primer option del producto en general
334
- * @param {boolean}checkIfStock `true` se realiza un chequeo de si la variante tiene stock para mostrarla
335
- * @example ```javascript
336
- * {
337
- type: 'color',
338
- code: 'color',
339
- defaultFirstOption: false ,
340
- checkIfStock:true
341
- } ```
342
- */
343
- this.paramsProductsWithUniqueVariant = {
344
- type: 'color',
345
- code: 'color',
346
- defaultFirstOption: false,
347
- checkIfStock: true
348
- };
349
- this.setParamsProductsWithUniqueVariant = function (value) {
350
- _this.paramsProductsWithUniqueVariant = __assign(__assign({}, _this.paramsProductsWithUniqueVariant), value);
351
- };
352
- this.getParamsProductsWithUniqueVariant = function () { return _this.paramsProductsWithUniqueVariant; };
353
- /**
354
- * @description se utiliza para configurar que filtros del tipo `SortFilter` se quiere mostrar en la vista.
355
- * Se usan los codigo de los filtros para indicar cuales se deben mostrar.
356
- */
357
- this.sortFilters = ['price', 'order-alph', 'recent'];
358
- /**
359
- *
360
- * @param filtersCode arreglo de strings con los codigos de los filtros.
361
- * Si se le pasa el parametro **all** este mostrara todos.
362
- * @example price | order-alph | recent | update | all
363
- * @returns
364
- */
365
- this.setSortFilters = function (filtersCode) {
366
- if (filtersCode === void 0) { filtersCode = ['all']; }
367
- return _this.sortFilters = filtersCode;
368
- };
369
- this.getSortFilters = function () { return _this.sortFilters; };
370
- this.postalCodePatterns = {
371
- 'AR': { pattern: /^[0-9]{4}$/, errorKey: "postal-code-pattern-error.ar" },
372
- 'UY': { pattern: /^[0-9]{5}$/, errorKey: "postal-code-pattern-error.uy" },
373
- 'GB': { pattern: /^[A-Z]{1,2}[0-9][A-Z0-9]?\s?[0-9][A-Z]{2}$/, errorKey: "postal-code-pattern-error.gb" },
374
- 'ES': { pattern: /^(?:0[1-9]|[1-4]\d|5[0-2])\d{3}$/, errorKey: "postal-code-pattern-error.es" },
375
- 'BR': { pattern: /^[0-9]{5}-[0-9]{3}$/, errorKey: "postal-code-pattern-error.br" },
376
- 'FR': { pattern: /^[0-9]{5}$/, errorKey: "postal-code-pattern-error.fr" },
377
- 'PT': { pattern: /^[0-9]{4}-[0-9]{3}$/, errorKey: "postal-code-pattern-error.pt" },
378
- };
379
- }
380
- /**
381
- *
382
- * @param needles (agujas) object con claves valor a filtrar
383
- * @param haystack (pajar) objecto en el que buscar
384
- *
385
- * @description funcion que busca en el haystack (pajar) todos los objetos que contentan
386
- * todas las claves de los needles(agujas) que contengan el mismo valor
387
- */
388
- Constants.prototype.containsAll = function (needles, haystack) {
389
- var result = true;
390
- if (!!needles && !!haystack) {
391
- Object.entries(needles).forEach(function (value) {
392
- if (!(haystack.hasOwnProperty(value[0]) && haystack[value[0]] == value[1]))
393
- result = false;
394
- });
395
- }
396
- return result;
397
- };
398
- /**
399
- * devuelve true si existe el elemento "search" en el array de parametros "params"
400
- *
401
- * @param params Array de parametros entre los que buscar
402
- * @param searched Elemento que buscar
403
- * @param prefix prefijo del string a buscar (ejemplo: "link_")
404
- * @param suffix sufijo del string a buscar (ejemplo: "link_")
405
- * @param casesensitive determina si se evalua con sensibilidad entre mayuscula y minuscula
406
- * @returns retorna true o false si se encontro o no el parametro en el array
407
- */
408
- Constants.prototype.hasParams = function (params, searched, prefix, suffix, casesensitive) {
409
- if (prefix === void 0) { prefix = ''; }
410
- if (suffix === void 0) { suffix = ''; }
411
- if (casesensitive === void 0) { casesensitive = false; }
412
- return casesensitive ? params.find(function (param) { return (param.code).toLowerCase() == (prefix + searched + suffix).toLowerCase() || (param.code).toLowerCase() == (searched).toLowerCase(); })
413
- : params.find(function (param) { return param.code == (prefix + searched + suffix) || param.code == searched; });
414
- };
415
- ;
416
- Constants.prototype.getPostalCodePattern = function (countryCode) {
417
- return this.postalCodePatterns[countryCode] || { pattern: /^[A-Za-z0-9\s\-]+$/, errorKey: "postal-code-pattern-error.default" };
418
- };
419
- Constants.ctorParameters = function () { return [
420
- { type: TranslateService },
421
- { type: Router },
422
- { type: undefined, decorators: [{ type: Inject, args: ['env',] }] }
423
- ]; };
424
- Constants.ɵprov = i0.ɵɵdefineInjectable({ factory: function Constants_Factory() { return new i1.Constants(i0.ɵɵinject(i2.TranslateService), i0.ɵɵinject(i3.Router), i0.ɵɵinject("env")); }, token: i1.Constants, providedIn: "root" });
425
- Constants = __decorate([
426
- Injectable({
427
- providedIn: 'root'
428
- }),
429
- __param(2, Inject('env'))
430
- ], Constants);
431
- return Constants;
432
- }());
433
- export { Constants };
434
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvY29yZS5jb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFtQixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBWXREO0lBRUksbUJBQW1CLFNBQTJCLEVBQVUsTUFBYyxFQUF5QixHQUFHO1FBQWxHLGlCQUF1RztRQUFwRixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBeUIsUUFBRyxHQUFILEdBQUcsQ0FBQTtRQUVqRixXQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ2xCLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFeEIseUJBQW9CLEdBQUcsSUFBSSxhQUFhLEVBQU8sQ0FBQztRQUNqRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV6RCxxQkFBZ0IsR0FBRyxVQUFDLE9BQU8sSUFBSyxPQUFBLFlBQVksR0FBRyxPQUFPLEdBQUcsU0FBUyxFQUFsQyxDQUFrQyxDQUFDO1FBRW5FLGtCQUFhLEdBQVcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxxQkFBZ0IsR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyRSxnRkFBZ0Y7UUFDeEUsWUFBTyxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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QSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBbEksQ0FBa0ksQ0FBQztZQUMzSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFwRSxDQUFvRSxDQUFDLENBQUE7SUFFcEcsQ0FBQztJQUFBLENBQUM7SUEwSEYsd0NBQW9CLEdBQXBCLFVBQXFCLFdBQW1CO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxtQ0FBbUMsRUFBRSxDQUFDO0lBQ3BJLENBQUM7O2dCQXpjNkIsZ0JBQWdCO2dCQUFrQixNQUFNO2dEQUFHLE1BQU0sU0FBQyxLQUFLOzs7SUFGNUUsU0FBUztRQUhyQixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO1FBRzJFLFdBQUEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO09BRjdFLFNBQVMsQ0E0Y3JCO29CQTVkRDtDQTRkQyxBQTVjRCxJQTRjQztTQTVjWSxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEN1cnJlbmN5Q29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2N1cnJlbmN5Q29uZmlnJztcclxuaW1wb3J0IHsgRGVmYXVsdEZpbHRlciwgRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlcic7XHJcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcclxudHlwZSBjdXJyZW5jeVR5cGUgPSAnRVVSJyB8ICdBUkcnIHwgJ1VTRCcgfCAnUFlHJyB8ICdQRU4nIHwgJ1NFSycgfCAnQ1VTVE9NJztcclxudHlwZSBwb3NpdGlvblR5cGUgPSAnTCcgfCAnUic7XHJcbnR5cGUgY2hhbm5lbFR5cGVzID0gJ2IyYicgfCAnYjJiMmMnIHwgJ2IyYyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbnN0YW50cyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgQEluamVjdCgnZW52JykgcHJpdmF0ZSBlbnYpIHsgfVxyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgTE9DQUxFID0gJ0xPQ0FMRSc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IENIQU5ORUwgPSAnQ0hBTk5FTCc7XHJcbiAgICBwdWJsaWMgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxhbnk+KCk7XHJcbiAgICBwdWJsaWMgY2hhbm5lbENvbmZpZyQgPSB0aGlzLmNoYW5uZWxDb25maWdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ0FQSSA9IChjaGFubmVsKSA9PiAnL3Nob3AtYXBpLycgKyBjaGFubmVsICsgJ2NoYW5uZWwnO1xyXG5cclxuICAgIHByaXZhdGUgYnJvd3NlcldpbmRvdzogb2JqZWN0ID0gd2luZG93IHx8IHt9O1xyXG4gICAgcHJpdmF0ZSBicm93c2VyV2luZG93RW52OiBvYmplY3QgPSB0aGlzLmJyb3dzZXJXaW5kb3dbJ19fZW52J10gfHwge307XHJcblxyXG4gICAgLy8gICAgIHByaXZhdGUgdXJsQmFzZTogc3RyaW5nID0gJ2h0dHA6Ly90ZXN0aW5nLmJhY2tlbmQuZWFzeWNvbW1lcmNldGVjaC5jb20vJztcclxuICAgIHByaXZhdGUgdXJsQmFzZTogc3RyaW5nID0gdGhpcy5icm93c2VyV2luZG93RW52WydhcGlVcmwnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYXBpVXJsJ10gOiAodGhpcy5lbnYuYXBpVXJsIHx8ICdodHRwOi8vYmFja2VuZC5lYXN5Y29tbWVyY2UuZGV2cC8nKTtcclxuICAgIHByaXZhdGUgdXJsQXNzZXRzOiBzdHJpbmcgPSB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3VybEFzc2V0cyddID8gdGhpcy5icm93c2VyV2luZG93RW52Wyd1cmxBc3NldHMnXSA6ICh0aGlzLmVudi51cmxBc3NldHMgfHwgdGhpcy51cmxCYXNlKTtcclxuICAgIHByaXZhdGUgdXJsRnJvbnRlbmQ6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsRnJvbnRlbmQnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsRnJvbnRlbmQnXSA6ICh0aGlzLmVudi51cmxGcm9udGVuZCB8fCAnaHR0cHM6Ly9lbGRlbi5lYXN5Y29tbWVyY2V0ZWNoLmNvbS8nKTtcclxuICAgIHByaXZhdGUgbG9jYWxlOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMRSkgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMRSkgOiB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2xvY2FsZSddID8gdGhpcy5icm93c2VyV2luZG93RW52Wydsb2NhbGUnXSA6ICh0aGlzLmVudi5sb2NhbGUgfHwgJ2VzX0FSJyk7XHJcbiAgICBwcml2YXRlIGNoYW5uZWw6IHN0cmluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTCkgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpIDogdGhpcy5icm93c2VyV2luZG93RW52WydjaGFubmVsJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2NoYW5uZWwnXSA6ICh0aGlzLmVudi5jaGFubmVsIHx8ICdtaW5vcmlzdGEnKVxyXG4gICAgcHJpdmF0ZSBibG9ja3NDYWNoZVRpbWU6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYmxvY2tzQ2FjaGVUaW1lJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2Jsb2Nrc0NhY2hlVGltZSddIDogKHRoaXMuZW52LmJsb2Nrc0NhY2hlVGltZSB8fCBudWxsKTtcclxuXHJcbiAgICBwcml2YXRlIG1vZGFsQ29uZmlnID0geyB0aXRsZTogJ0V4YW1wbGUnLCBjbGFzczogJ21vZGFsLXhsIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCcsIGtleWJvYXJkOiBmYWxzZSB9O1xyXG4gICAgc2V0TW9kYWxDb25maWcgPSAoY29uZmlnOiBhbnkpID0+IHRoaXMubW9kYWxDb25maWcgPSBjb25maWc7XHJcbiAgICBnZXRNb2RhbENvbmZpZyA9ICgpID0+IHRoaXMubW9kYWxDb25maWc7XHJcblxyXG4gICAgcHJpdmF0ZSB2ZXJzaW9uOiBzdHJpbmcgPSAndjEnO1xyXG5cclxuICAgIHByaXZhdGUgcm91dGVzID0gWy9eaG9tZSQvZywgL14oXFwvPyljb2xsZWN0aW9uKFxcLz8pKFtcXHdcXC5cXC9cXD9dKikkL2csIC9eY29udGFjdCQvZ107XHJcblxyXG4gICAgLyogR2V0IHJpZCBvZiB0aGlzIEFTQVAhICovXHJcbiAgICBwcml2YXRlIG1hc3RlckNoYW5uZWwgPSBudWxsXHJcblxyXG4gICAgcHVibGljIGdldE1hc3RlckNoYW5uZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1hc3RlckNoYW5uZWwpIHRoaXMubWFzdGVyQ2hhbm5lbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdNQVNURVJfQ0hBTk5FTCcpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFzdGVyQ2hhbm5lbFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRNYXN0ZXJDaGFubmVsID0gY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgdGhpcy5tYXN0ZXJDaGFubmVsID0gY2hhbm5lbFxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdNQVNURVJfQ0hBTk5FTCcsIGNoYW5uZWwpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1Byb2R1Y3Rpb24gPSAoKSA9PiB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3Byb2R1Y3Rpb24nXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsncHJvZHVjdGlvbiddIDogKHRoaXMuZW52LnByb2R1Y3Rpb24gfHwgZmFsc2UpO1xyXG5cclxuICAgIHNldFVybEJhc2UgPSAodXJsKSA9PiB0aGlzLnVybEJhc2UgPSB1cmw7XHJcbiAgICBzZXRVcmxBc3NldHMgPSAodXJsKSA9PiB0aGlzLnVybEFzc2V0cyA9IHVybDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBuZXh0IEZ1bmN0aW9uIHRvIGV4ZWN1dGVcclxuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhhdCBmdW5jdGlvbiBuZWVkc1xyXG4gICAgICpcclxuICAgICAqIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHBhc3NlZCBhcyBwYXJhbXMsIGlmIHRoZSBmcm9udGVuZCBpcyBpbiBwcm9kdWN0aW9uIG1vZGVcclxuICAgICAqL1xyXG4gICAgb25seUlmUHJvZHVjdGlvbiA9IChuZXh0LCBwYXJhbXMpID0+IHRoaXMuaXNQcm9kdWN0aW9uKCkgJiYgbmV4dChwYXJhbXMpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERldnVlbHZlIGxhIHVybCBiYXNlIGRvbmRlIHNlIGFsb2phbiBsb3MgYXJjaGl2b3MgbXVsdGltZWRpYVxyXG4gICAgICogQHBhcmFtIHBvc3RNZWRpYSBjYXJwZXRhIGRvbmRlIHNlIGd1YXJkYW4gbG9zIGFyY2hpdm9zXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBtZWRpYVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMudXJsQXNzZXRzICsgKHRoaXMudXJsQXNzZXRzID09IHRoaXMudXJsQmFzZSA/ICdtZWRpYS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xyXG4gICAgbWVkaWFCYW5uZXJVcmwgPSAoKSA9PiB0aGlzLnVybEFzc2V0cyArICh0aGlzLnVybEFzc2V0cyA9PSB0aGlzLnVybEJhc2UgPyAnbWVkaWEvJyA6ICcnKSArIFwiYmFubmVyLWltYWdlL1wiO1xyXG4gICAgbWVkaWFTdG9yZVVybCA9ICgpID0+IHRoaXMudXJsQXNzZXRzICsgKHRoaXMudXJsQXNzZXRzID09IHRoaXMudXJsQmFzZSA/ICdtZWRpYS8nIDogJycpICsgXCJzdG9yZS1pbWFnZS9cIjtcclxuXHJcbiAgICBnZXRQcm9kdWN0c0xpc3RSb3V0ZSA9ICgpID0+ICdjb2xsZWN0aW9uLyc7XHJcblxyXG4gICAgZ2V0U2VjdGlvbnNSb3V0ZSA9ICgpID0+ICdzZWN0aW9uLyc7XHJcblxyXG4gICAgZ2V0VXJsQmFzZSA9ICgpID0+IHRoaXMudXJsQmFzZTtcclxuICAgIGdldFVybEZyb250ZW5kID0gKCkgPT4gdGhpcy51cmxGcm9udGVuZDtcclxuXHJcbiAgICBnZXRCbG9ja3NDYWNoZVRpbWUgPSAoKTogbnVtYmVyID0+IHRoaXMuYmxvY2tzQ2FjaGVUaW1lICYmIHBhcnNlSW50KHRoaXMuYmxvY2tzQ2FjaGVUaW1lKTtcclxuXHJcbiAgICAvLyBnZXRMb2NhbGUgPSAoKSA9PiB0aGlzLmxvY2FsZTtcclxuICAgIC8vIHNldExvY2FsZSA9IChsb2NhbGUpID0+IHRoaXMubG9jYWxlID0gbG9jYWxlO1xyXG5cclxuICAgIGdldExvY2FsZSA9ICgpID0+IHtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZVxyXG4gICAgfVxyXG5cclxuICAgIGdldExvY2FsZVRyYW5zbGF0ZSA9ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGUoKS5zcGxpdCgnXycpWzBdXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldExvY2FsZSA9IGxvY2FsZSA9PiB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5MT0NBTEUsIGxvY2FsZSlcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobG9jYWxlLnNwbGl0KCdfJylbMF0pXHJcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGFubmVsID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRDaGFubmVsID0gY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DSEFOTkVMLCBjaGFubmVsKVxyXG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWxcclxuICAgIH1cclxuXHJcbiAgICBnZXRWZXJzaW9uID0gKCkgPT4gdGhpcy52ZXJzaW9uO1xyXG5cclxuICAgIGxvZ2luRXh0cmFEYXRhID0gKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogJ2RlbW9fY2xpZW50JyxcclxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogJ3NlY3JldF9kZW1vX2NsaWVudCcsXHJcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCdcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNDb2xsZWN0aW9uID0gKHBhdGgpID0+ICgvXihcXC8/KWNvbGxlY3Rpb24oXFwvPykoW1xcd1xcLlxcL1xcP10qKSQvZykudGVzdChwYXRoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdGllc1xyXG4gICAgICovXHJcblxyXG4gICAgbW9iaWxlID0gKCkgPT4gd2luZG93LmlubmVyV2lkdGggPCA3NTA7XHJcblxyXG4gICAgc3RyaWN0VHlwZUNoYW5uZWwgPSAoKSA9PiB0aGlzLmVudi5zdHJpY3RUeXBlQ2hhbm5lbCB8fCAnYjJiMmMnO1xyXG5cclxuICAgIHRvRGVjaW1hbCA9ICh0b3RhbCkgPT4gKHRvdGFsIC0gTWF0aC5mbG9vcih0b3RhbCkgPT0gMCkgPyB0b3RhbCAvIDEwMCA6IHRvdGFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxlbWVudG9zIHBhcmEgbWFuZWpvIGRlIGxpc3RhIGRlIHJ1dGFzIHJldXRpbGl6YWJsZXNcclxuICAgICAqL1xyXG5cclxuICAgIGFkZFJvdXRlVG9SZXVzZSA9IChyb3V0ZTogUmVnRXhwKSA9PiByb3V0ZSAmJiB0aGlzLnJvdXRlcy5wdXNoKHJvdXRlKTtcclxuXHJcbiAgICByZW1vdmVSb3V0ZVRvUmV1c2UgPSAocm91dGU6IFJlZ0V4cCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3V0ZXMuaW5kZXhPZihyb3V0ZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Um91dGVzVG9SZXVzZSA9ICgpOiBSZWdFeHBbXSA9PiB0aGlzLnJvdXRlcztcclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIEBwdWJsaWMgZWplbXBsbyBkZSB1c28gPGltZyAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25zdHMuZ2V0UmF0aW5nU3Rhcihwcm9kdWN0LnJhdGluZywnYXNzZXRzL2ltYWdlcy9zdGFyLnBuZycsJ2Fzc2V0cy9pbWFnZXMvbm90U3Rhci5wbmcnKVwiIFtzcmNdPVwiaXRlbVwiPlxyXG4gICAgICogIEBkZXNjcmlwdGlvbiBmdW5jaW9uIHF1ZSBkYWRvIHVuIHZhbG9yIGVudHJlIDEgLi4gNSwgeSBzdGFyOiBub3RTdGFyOlxyXG4gICAgICogICAgICAoZGViZW4gc2VyIGVsIHBhdGggZGVsIGFyY2hpdm8gbG9jYWwgYSBsYSBpbXBsZW1lbnRhY2lvbikuXHJcbiAgICAgKiAgICAgIHJldG9ybmEgdW4gYXJyZWdsbyBjb24gY29uIGxhIHZhbG9yYWNpb24gY29ycmVzcG9uZGllbnRlLlxyXG4gICAgICovXHJcbiAgICBnZXRSYXRpbmdTdGFyID0gKHJhdGluZzogYW55LCBzdGFyOiBTdHJpbmcsIG5vdFN0YXI6IFN0cmluZykgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCB1cmxTdGFyID0gW107XHJcbiAgICAgICAgICAgIGxldCBjYW50U3RhciA9IE51bWJlcihyYXRpbmcpIHx8IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA1OyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICB1cmxTdGFyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgY2FudFN0YXIgPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vdFN0YXJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjYW50U3Rhci0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB1cmxTdGFyO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJnZXRSYXRpbmdTdGFyIHByb2R1am8gdW4gZXJyb3IgLT4gXCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqICBAcHVibGljIGVqZW1wbG8gZGUgdXNvIChrZXlwcmVzcyk9XCJpbnB1dFZhbGlkYXRpb25CeUV4cHJlc3Npb25zKCRldmVudCwnWzAtOV17MSw5fScpXCIgZW4gZWwgRE9NLlxyXG4gICAgICogIEBkZXNjcmlwdGlvbiBmdW5jaW9uIHF1ZSBkYWRvIHVuIG1hbmVqYW5kb3IgZGUgZXZlbnRvLCB5IHVuYSBleHByZXNpb24gcmVndWxhciBlc3RhIGVzXHJcbiAgICAgKiAgICAgICAgICBldmFsdWFkYSBzb2JyZSBsb3MgdmFsb3JlcyBxdWUgZWwgbWFuZWphZG9yIGRlIGV2ZW50b3Mgbm9zIGVudmlhLlxyXG4gICAgICogICAgICAgICAgRW4gZWwgY2FzbyBlbiBlbCBxdWUgc2UgZW52aWUgZWwgcGFyYW1ldHJvICdjb25kaXRpb24nIGVzdGUgcHVlZGUgc2VyIHBhcmFcclxuICAgICAqICAgICAgICAgIGFudWxhciBlbCBldmVudG8gY29tbyBjb25kaWNpb24gYWRpY2lvbmFsIGEgbGEgZXZhbHVhY2lvbiBkZSBsYSBlbnRyYWRhLlxyXG4gICAgICovXHJcbiAgICBpbnB1dFZhbGlkYXRpb25CeUV4cHJlc3Npb25zID0gKGUsIHBhdHJvbiwgY29uZGl0aW9uID0gbnVsbCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCB0ZWNsYSA9IChkb2N1bWVudCkgPyBlLmtleUNvZGUgOiBlLndoaWNoO1xyXG4gICAgICAgICAgICBpZiAodGVjbGEgPT0gOCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGxldCBwYXRyb25SZWcgPSBuZXcgUmVnRXhwKHBhdHJvbilcclxuICAgICAgICAgICAgbGV0IHRlY2xhX2ZpbmFsID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0ZWNsYSk7XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdHJvblJlZy50ZXN0KHRlY2xhX2ZpbmFsKSAmJiBjb25kaXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdHJvblJlZy50ZXN0KHRlY2xhX2ZpbmFsKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJpbnB1dFZhbGlkYXRpb25CeUV4cHJlc3Npb25zIHByb2R1am8gdW4gZXJyb3IgLT4gXCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuZWVkbGVzIChhZ3VqYXMpIG9iamVjdCBjb24gY2xhdmVzIHZhbG9yIGEgZmlsdHJhclxyXG4gICAgICogQHBhcmFtIGhheXN0YWNrIChwYWphcikgb2JqZWN0byBlbiBlbCBxdWUgYnVzY2FyXHJcbiAgICAgKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGZ1bmNpb24gcXVlIGJ1c2NhIGVuIGVsIGhheXN0YWNrIChwYWphcikgdG9kb3MgbG9zIG9iamV0b3MgcXVlIGNvbnRlbnRhblxyXG4gICAgICogdG9kYXMgbGFzIGNsYXZlcyBkZSBsb3MgbmVlZGxlcyhhZ3VqYXMpIHF1ZSBjb250ZW5nYW4gZWwgbWlzbW8gdmFsb3JcclxuICAgICAqL1xyXG4gICAgY29udGFpbnNBbGwobmVlZGxlczogb2JqZWN0LCBoYXlzdGFjazogb2JqZWN0KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICghIW5lZWRsZXMgJiYgISFoYXlzdGFjaykge1xyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhuZWVkbGVzKS5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghKGhheXN0YWNrLmhhc093blByb3BlcnR5KHZhbHVlWzBdKSAmJiBoYXlzdGFja1t2YWx1ZVswXV0gPT0gdmFsdWVbMV0pKSByZXN1bHQgPSBmYWxzZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGllZGFkIHF1ZSBzZSB1dGlsaXphIHBhcmEgdG9tYXIgY29tbyBjb25maWd1cmFjacOzbiBwYXJhIGVsIHRpcG8gZGUgbW9uZWRhIHF1ZSBzZSB1dGlsaXphIGVuIGVsIHNpdGlvLlxyXG4gICAgICogRXN0b3MgdmFsb3JlcyBzb24gdXRpbGl6YWRvcyBwYXJhIGVsIHBpcGUgY3VycmVuY3lQcmljZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3VycmVuY3k6IEN1cnJlbmN5Q29uZmlnID0ge1xyXG4gICAgICAgIGNvZGU6ICdBUkcnLFxyXG4gICAgICAgIHN5bWJvbDogJyQnLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnTGVmdCcsXHJcbiAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcnJlZ2xvIGRlIHZhbG9yZXMgdXNhZG9zIHBhcmEgZWwgcGlwZSBjdXJyZW5jeVByaWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10gPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb2RlOiAnRVVSJyxcclxuICAgICAgICAgICAgc3ltYm9sOiAn4oKsJyxcclxuICAgICAgICAgICAgcG9zaXRpb246ICdSaWdodCcsXHJcbiAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29kZTogJ0FSRycsXHJcbiAgICAgICAgICAgIHN5bWJvbDogJyQnLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29kZTogJ0FSUycsXHJcbiAgICAgICAgICAgIHN5bWJvbDogJyQnLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29kZTogJ1VTRCcsXHJcbiAgICAgICAgICAgIHN5bWJvbDogJyQnLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29kZTogJ1BZRycsXHJcbiAgICAgICAgICAgIHN5bWJvbDogJ0dzLicsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnTGVmdCcsXHJcbiAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb2RlOiAnUEVOJyxcclxuICAgICAgICAgICAgc3ltYm9sOiAnUy8nLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29kZTogJ1NFSycsXHJcbiAgICAgICAgICAgIHN5bWJvbDogJ1NFSycsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnUmlnaHQnLFxyXG4gICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICBdXHJcblxyXG4gICAgcHVibGljIHNldEN1cnJlbmN5VHlwZUNvbmZpZyA9IChjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10pID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbmN5VHlwZUNvbmZpZyA9IGN1cnJlbmN5VHlwZUNvbmZpZztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVlbXBsYXphIGxvcyB2YWxvcmVzIGRlIHVuYSBtb25lZGEuXHJcbiAgICAgKiBAcGFyYW0gY3VycmVuY3lUeXBlRmluZCBUaXBvIGRlIGN1cnJlbmN5IHF1ZSBzZSBkZXNlYSBtb2RpZmljYXJcclxuICAgICAqIEBwYXJhbSBjdXN0b21UeXBlIExvcyBudWV2b3MgdmFsb3Jlcy4gVG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlc1xyXG4gICAgICogQGV4YW1wbGUgY3VzdG9tVHlwZSA9IHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0xlZnQnICwgd2l0aG91dERlY2ltYWw6IGZhbHNlIH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlcGxhY2VDdXJyZW5jeVR5cGVDb25maWcgPSAoY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlOiBDdXJyZW5jeUNvbmZpZykgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW5jeVR5cGUgPSB0aGlzLmN1cnJlbmN5VHlwZUNvbmZpZy5maW5kKHR5cGUgPT4gdHlwZS5jb2RlID09IGN1cnJlbmN5VHlwZUZpbmQpXHJcbiAgICAgICAgaWYgKGN1cnJlbmN5VHlwZSkge1xyXG4gICAgICAgICAgICBjdXJyZW5jeVR5cGUuc3ltYm9sID0gY3VzdG9tVHlwZT8uc3ltYm9sIHx8IGN1cnJlbmN5VHlwZS5zeW1ib2xcclxuICAgICAgICAgICAgY3VycmVuY3lUeXBlLmNvZGUgPSBjdXN0b21UeXBlPy5jb2RlIHx8IGN1cnJlbmN5VHlwZS5jb2RlXHJcbiAgICAgICAgICAgIGN1cnJlbmN5VHlwZS5wb3NpdGlvbiA9IGN1c3RvbVR5cGU/LnBvc2l0aW9uIHx8IGN1cnJlbmN5VHlwZS5wb3NpdGlvblxyXG4gICAgICAgICAgICBjdXJyZW5jeVR5cGUud2l0aG91dERlY2ltYWwgPSBjdXN0b21UeXBlPy53aXRob3V0RGVjaW1hbCB8fCBjdXJyZW5jeVR5cGUud2l0aG91dERlY2ltYWxcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9SZXZlZXIgZW4gZWwgZnV0dXJvIHNpIHNlIGVtcGllemFuIGEgYWdyZWdhciBvdHJvIHRpcG9zIGRlIG1vbmVkYXNcclxuICAgICAgICAvKiBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5VHlwZUNvbmZpZy5wdXNoKHsuLi5jdXN0b21UeXBlIH0pXHJcbiAgICAgICAgfSAqL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjdXJyZW5jeVR5cGVGaW5kIERlZmluaXIgZWwgY29kZSBkZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHF1aWVyYSB1dGlsaXphci5cclxuICAgICAqIFNpIGVsIHRpcG8gZXMgQ1VTVE9NIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBzZWd1bmRvIHBhcmFtZXRybyBkb25kZSBzZSBwdWVkZSBkZWZpbmlyIGxhIHNpbWJvbG9nw61hIHkgcG9zZXNpw7NuIHF1ZSBzZSBxdWllcmEuXHJcbiAgICAgKiBAcGFyYW0gY3VzdG9tVHlwZSBGb3JtYXRvIGRlbCBwYXLDoW1ldHJvIGVqZW1wbG8geyBjb2RlOiAnQVJHJywgc3ltYm9sOiAnJCcsIHBvc2l0aW9uOiAnTCcgLCB3aXRob3V0RGVjaW1hbHM6IGZhbHNlIH0gLFxyXG4gICAgICogdG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlcyB5IHBvciBkZWZlY3RvIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBlamVtcGxvLlxyXG4gICAgICogQHJldHVybnMgc2UgcmV0b3JuYSBsYSBjb25maWd1cmFjacOzbiBxdWUgc2Ugc2V0ZW8gYSBsYSBwcm9waWVkYWQgY3VycmVuY3kgZGVsIHNlcnZpY2lvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q3VycmVuY3kgPSAoY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlPzogQ3VycmVuY3lDb25maWcpID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbmN5ID0gdGhpcy5jdXJyZW5jeVR5cGVDb25maWcuZmluZChjdCA9PiBjdC5jb2RlID09IGN1cnJlbmN5VHlwZUZpbmQudG9VcHBlckNhc2UoKSkgfHwgdGhpcy5jdXJyZW5jeVxyXG4gICAgICAgIGN1c3RvbVR5cGUgJiYgKHRoaXMuY3VycmVuY3kgPSB7IC4uLnRoaXMuY3VycmVuY3ksIC4uLmN1c3RvbVR5cGUgfSlcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW5jeTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZGV2dWVsdmUgdHJ1ZSBzaSBleGlzdGUgZWwgZWxlbWVudG8gXCJzZWFyY2hcIiBlbiBlbCBhcnJheSBkZSBwYXJhbWV0cm9zIFwicGFyYW1zXCJcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zIEFycmF5IGRlIHBhcmFtZXRyb3MgZW50cmUgbG9zIHF1ZSBidXNjYXJcclxuICAgICAqIEBwYXJhbSBzZWFyY2hlZCBFbGVtZW50byBxdWUgYnVzY2FyXHJcbiAgICAgKiBAcGFyYW0gcHJlZml4IHByZWZpam8gZGVsIHN0cmluZyBhIGJ1c2NhciAoZWplbXBsbzogXCJsaW5rX1wiKVxyXG4gICAgICogQHBhcmFtIHN1ZmZpeCBzdWZpam8gZGVsIHN0cmluZyBhIGJ1c2NhciAoZWplbXBsbzogXCJsaW5rX1wiKVxyXG4gICAgICogQHBhcmFtIGNhc2VzZW5zaXRpdmUgZGV0ZXJtaW5hIHNpIHNlIGV2YWx1YSBjb24gc2Vuc2liaWxpZGFkIGVudHJlIG1heXVzY3VsYSB5IG1pbnVzY3VsYVxyXG4gICAgICogQHJldHVybnMgcmV0b3JuYSB0cnVlIG8gZmFsc2Ugc2kgc2UgZW5jb250cm8gbyBubyBlbCBwYXJhbWV0cm8gZW4gZWwgYXJyYXlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc1BhcmFtcyhcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgc2VhcmNoZWQsXHJcbiAgICAgICAgcHJlZml4ID0gJycsXHJcbiAgICAgICAgc3VmZml4ID0gJycsXHJcbiAgICAgICAgY2FzZXNlbnNpdGl2ZSA9IGZhbHNlKTogYm9vbGVhbiB7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gY2FzZXNlbnNpdGl2ZSA/IHBhcmFtcy5maW5kKHBhcmFtID0+IChwYXJhbS5jb2RlKS50b0xvd2VyQ2FzZSgpID09IChwcmVmaXggKyBzZWFyY2hlZCArIHN1ZmZpeCkudG9Mb3dlckNhc2UoKSB8fCAocGFyYW0uY29kZSkudG9Mb3dlckNhc2UoKSA9PSAoc2VhcmNoZWQpLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICAgIDogcGFyYW1zLmZpbmQocGFyYW0gPT4gcGFyYW0uY29kZSA9PSAocHJlZml4ICsgc2VhcmNoZWQgKyBzdWZmaXgpIHx8IHBhcmFtLmNvZGUgPT0gc2VhcmNoZWQpXHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgbW9kaWZ5Q2hhbm5lbENvbmZpZyA9IGNoYW5uZWxDb25maWcgPT4ge1xyXG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnLmNoYW5uZWwgfHwgY2hhbm5lbENvbmZpZy5jb2RlKVxyXG4gICAgICAgICAgICB0aGlzLnNldENoYW5uZWwoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcclxuXHJcbiAgICAgICAgaWYgKGNoYW5uZWxDb25maWcubG9jYWxlIHx8IGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKVxyXG4gICAgICAgICAgICB0aGlzLnNldExvY2FsZShjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcclxuXHJcbiAgICAgICAgaWYgKGNoYW5uZWxDb25maWcuY3VycmVuY3kgfHwgY2hhbm5lbENvbmZpZy5iYXNlQ3VycmVuY3kpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVuY3koY2hhbm5lbENvbmZpZy5jdXJyZW5jeSB8fCBjaGFubmVsQ29uZmlnLmJhc2VDdXJyZW5jeSlcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoYW5uZWxDb25maWc7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciBsb3MgZmlsdHJvcyBwb3IgZGVmZWN0byBxdWUgc2UgYXBsaWNhcmFuIGVuIGxhIHNlY2Npb24gJ0NvbGxlY3Rpb24nXHJcbiAgICAgKiBjdWFuZG8gc2UgaW5ncmVzYSBhIGxhIG1pc21hLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW10gPSBbXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHRlYSBlbCB2YWxvciBkZSBsYSB2YXJpYWJsZSBkZWZhdWxGaWx0ZXJzLlxyXG4gICAgICogQHBhcmFtIGZpbHRlcnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldERlZmF1bHRGaWx0ZXJzID0gKGZpbHRlcnM6IERlZmF1bHRGaWx0ZXJbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZWZhdWx0RmlsdGVycyA9ICgpOiBEZWZhdWx0RmlsdGVyW10gPT4gdGhpcy5kZWZhdWx0RmlsdGVyc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHRhbnRvIGxvcyBmaWx0cm9zIHBvciBkZWZlY3RvcyBxdWUgeWEgc2VyYW4gYXBsaWNhZG9zLCBjb21vIHRhbWJpZW5cclxuICAgICAqIGxvcyBmaWx0cm9zIHF1ZSBzZSBtb3N0cmFyYW4gZW4gbGEgc2VjY2lvbiBjb2xsZWN0aW9uLCBzdSBvcmRlbiwgZXRjLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbHRlckNvbmZpZzogRmlsdGVyQ29uZmlnID0ge1xyXG4gICAgICAgIGRlZmF1bHRGaWx0ZXJzOiBbXSxcclxuICAgICAgICBmaWx0ZXJzOiBbJ2NhdGVnb3J5JywgJ2F0dHJpYnV0ZXMnLCAnZHluYW1pY3MnLCAncHJpY2VfcmFuZ2UnXVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGaWx0ZXJDb25maWcgPSAoZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWcpID0+IHtcclxuICAgICAgICBmaWx0ZXJDb25maWcuZGVmYXVsdEZpbHRlcnMgPyB0aGlzLmZpbHRlckNvbmZpZy5kZWZhdWx0RmlsdGVycyA9IGZpbHRlckNvbmZpZy5kZWZhdWx0RmlsdGVycyA6IG51bGxcclxuICAgICAgICBmaWx0ZXJDb25maWcuZmlsdGVycyA/IHRoaXMuZmlsdGVyQ29uZmlnLmZpbHRlcnMgPSBmaWx0ZXJDb25maWcuZmlsdGVycyA6IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RmlsdGVyQ29uZmlnID0gKCkgPT4gdGhpcy5maWx0ZXJDb25maWcuZmlsdGVyc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGNvbnRpZW5lIHVuIGFycmVnbG8gZGUgc3RyaW5nIGN1eW8gY29udGVuaWRvIHNvbiBsb3MgY29kaWdvcyBkZSBsb3MgcGFpc2VzLlxyXG4gICAgICogQGV4YW1wbGUgWydBUicsJ0VTJywnR0InXVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvdW50cmllczogc3RyaW5nW10gPSBbXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgZGViZSBjb250ZW5lciBsb3MgY29kaWdvcyBkZSBsb3MgcGFpc2VzIHF1ZSBzZSBxdWllcmUgbW9zdHJhclxyXG4gICAgICogQGV4YW1wbGUgWydBUicsJ0VTJywnR0InXVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldENvdW50cmllcyA9IChjb3VudHJpZXM6IHN0cmluZ1tdKSA9PiB0aGlzLmNvdW50cmllcyA9IGNvdW50cmllcztcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q291bnRyaWVzID0gKCkgPT4gdGhpcy5jb3VudHJpZXM7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGVzdGEgdmFyaWFibGUgc2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgbG9zIHBhcmFtZXRyb3MgY3VhbmRvIHNlIGRlc2VhIG1vc3RyYXJcclxuICAgICAqIHZhcmlhbnRlcyBlbCBsaXN0YWRvIGRlIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfXR5cGUgdGlwbyBkZSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ31jb2RlIGNvZGlnbyBkZSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59ZGVmYXVsdEZpcnN0T3B0aW9uIGB0cnVlYCB0b21hIGVsIHByaW1lciBvcHRpb24gZGVsIHByb2R1Y3RvIGVuIGdlbmVyYWxcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn1jaGVja0lmU3RvY2sgYHRydWVgIHNlIHJlYWxpemEgdW4gY2hlcXVlbyBkZSBzaSBsYSB2YXJpYW50ZSB0aWVuZSBzdG9jayBwYXJhIG1vc3RyYXJsYVxyXG4gICAgICogQGV4YW1wbGUgIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHtcclxuICAgICAgICB0eXBlOiAnY29sb3InLFxyXG4gICAgICAgIGNvZGU6ICdjb2xvcicsXHJcbiAgICAgICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSAsXHJcbiAgICAgICAgY2hlY2tJZlN0b2NrOnRydWVcclxuICAgICAgICB9IGBgYFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQ6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NvbG9yJyxcclxuICAgICAgICBjb2RlOiAnY29sb3InLFxyXG4gICAgICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogZmFsc2UsXHJcbiAgICAgICAgY2hlY2tJZlN0b2NrOiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9ICh2YWx1ZTogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50LFxyXG4gICAgICAgICAgICAuLi52YWx1ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0gKCkgPT4gdGhpcy5wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHF1ZSBmaWx0cm9zIGRlbCB0aXBvIGBTb3J0RmlsdGVyYCBzZSBxdWllcmUgbW9zdHJhciBlbiBsYSB2aXN0YS5cclxuICAgICAqIFNlIHVzYW4gbG9zIGNvZGlnbyBkZSBsb3MgZmlsdHJvcyBwYXJhIGluZGljYXIgY3VhbGVzIHNlIGRlYmVuIG1vc3RyYXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc29ydEZpbHRlcnM6IHN0cmluZ1tdID0gWydwcmljZScsICdvcmRlci1hbHBoJywgJ3JlY2VudCddXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZpbHRlcnNDb2RlIGFycmVnbG8gZGUgc3RyaW5ncyBjb24gbG9zIGNvZGlnb3MgZGUgbG9zIGZpbHRyb3MuXHJcbiAgICAgKiBTaSBzZSBsZSBwYXNhIGVsIHBhcmFtZXRybyAqKmFsbCoqIGVzdGUgbW9zdHJhcmEgdG9kb3MuXHJcbiAgICAgKiBAZXhhbXBsZSBwcmljZSB8IG9yZGVyLWFscGggfCByZWNlbnQgfCB1cGRhdGUgfCBhbGxcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHNldFNvcnRGaWx0ZXJzID0gKGZpbHRlcnNDb2RlOiBzdHJpbmdbXSA9IFsnYWxsJ10pID0+IHRoaXMuc29ydEZpbHRlcnMgPSBmaWx0ZXJzQ29kZTtcclxuXHJcbiAgICBnZXRTb3J0RmlsdGVycyA9ICgpID0+IHRoaXMuc29ydEZpbHRlcnM7XHJcblxyXG4gICAgcHJpdmF0ZSBwb3N0YWxDb2RlUGF0dGVybnM6IHsgW2tleTogc3RyaW5nXTogeyBwYXR0ZXJuOiBSZWdFeHAsIGVycm9yS2V5OiBzdHJpbmcgfSB9ID0ge1xyXG4gICAgICAgICdBUic6IHsgcGF0dGVybjogL15bMC05XXs0fSQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLmFyXCIgfSxcclxuICAgICAgICAnVVknOiB7IHBhdHRlcm46IC9eWzAtOV17NX0kLywgZXJyb3JLZXk6IFwicG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvci51eVwiIH0sXHJcbiAgICAgICAgJ0dCJzogeyBwYXR0ZXJuOiAvXltBLVpdezEsMn1bMC05XVtBLVowLTldP1xccz9bMC05XVtBLVpdezJ9JC8sIGVycm9yS2V5OiBcInBvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZ2JcIiB9LFxyXG4gICAgICAgICdFUyc6IHsgcGF0dGVybjogL14oPzowWzEtOV18WzEtNF1cXGR8NVswLTJdKVxcZHszfSQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLmVzXCIgfSxcclxuICAgICAgICAnQlInOiB7IHBhdHRlcm46IC9eWzAtOV17NX0tWzAtOV17M30kLywgZXJyb3JLZXk6IFwicG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvci5iclwiIH0sXHJcbiAgICAgICAgJ0ZSJzogeyBwYXR0ZXJuOiAvXlswLTldezV9JC8sIGVycm9yS2V5OiBcInBvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZnJcIiB9LFxyXG4gICAgICAgICdQVCc6IHsgcGF0dGVybjogL15bMC05XXs0fS1bMC05XXszfSQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLnB0XCIgfSxcclxuICAgIH07XHJcblxyXG4gICAgZ2V0UG9zdGFsQ29kZVBhdHRlcm4oY291bnRyeUNvZGU6IHN0cmluZyk6IHsgcGF0dGVybjogUmVnRXhwLCBlcnJvcktleTogc3RyaW5nIH0ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RhbENvZGVQYXR0ZXJuc1tjb3VudHJ5Q29kZV0gfHwgeyBwYXR0ZXJuOiAvXltBLVphLXowLTlcXHNcXC1dKyQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLmRlZmF1bHRcIiB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ };
18
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
19
+ return function (target, key) { decorator(target, key, paramIndex); }
20
+ };
21
+ import { Injectable, Inject } from '@angular/core';
22
+ import { Router } from '@angular/router';
23
+ import { TranslateService } from '@ngx-translate/core';
24
+ import { ReplaySubject } from 'rxjs';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "../public-api";
27
+ import * as i2 from "@ngx-translate/core";
28
+ import * as i3 from "@angular/router";
29
+ var Constants = /** @class */ (function () {
30
+ function Constants(translate, router, env) {
31
+ var _this = this;
32
+ this.translate = translate;
33
+ this.router = router;
34
+ this.env = env;
35
+ this.LOCALE = 'LOCALE';
36
+ this.CHANNEL = 'CHANNEL';
37
+ this.searchValue = '';
38
+ this.channelConfigSubject = new ReplaySubject();
39
+ this.channelConfig$ = this.channelConfigSubject.asObservable();
40
+ this.channelConfigAPI = function (channel) { return '/shop-api/' + channel + 'channel'; };
41
+ this.browserWindow = window || {};
42
+ this.browserWindowEnv = this.browserWindow['__env'] || {};
43
+ // private urlBase: string = 'http://testing.backend.easycommercetech.com/';
44
+ this.urlBase = this.browserWindowEnv['apiUrl'] ? this.browserWindowEnv['apiUrl'] : (this.env.apiUrl || 'http://backend.easycommerce.devp/');
45
+ this.urlAssets = this.browserWindowEnv['urlAssets'] ? this.browserWindowEnv['urlAssets'] : (this.env.urlAssets || this.urlBase);
46
+ this.urlFrontend = this.browserWindowEnv['urlFrontend'] ? this.browserWindowEnv['urlFrontend'] : (this.env.urlFrontend || 'https://elden.easycommercetech.com/');
47
+ this.locale = localStorage.getItem(this.LOCALE) ? localStorage.getItem(this.LOCALE) : this.browserWindowEnv['locale'] ? this.browserWindowEnv['locale'] : (this.env.locale || 'es_AR');
48
+ this.channel = localStorage.getItem(this.CHANNEL) ? localStorage.getItem(this.CHANNEL) : this.browserWindowEnv['channel'] ? this.browserWindowEnv['channel'] : (this.env.channel || 'minorista');
49
+ this.blocksCacheTime = this.browserWindowEnv['blocksCacheTime'] ? this.browserWindowEnv['blocksCacheTime'] : (this.env.blocksCacheTime || null);
50
+ this.modalConfig = { title: 'Example', class: 'modal-xl modal-dialog-centered', keyboard: false };
51
+ this.setModalConfig = function (config) { return _this.modalConfig = config; };
52
+ this.getModalConfig = function () { return _this.modalConfig; };
53
+ this.version = 'v1';
54
+ this.routes = [/^home$/g, /^(\/?)collection(\/?)([\w\.\/\?]*)$/g, /^contact$/g];
55
+ /* Get rid of this ASAP! */
56
+ this.masterChannel = null;
57
+ this.getMasterChannel = function () {
58
+ if (!_this.masterChannel)
59
+ _this.masterChannel = localStorage.getItem('MASTER_CHANNEL');
60
+ return _this.masterChannel;
61
+ };
62
+ this.setMasterChannel = function (channel) {
63
+ _this.masterChannel = channel;
64
+ localStorage.setItem('MASTER_CHANNEL', channel);
65
+ };
66
+ this.isProduction = function () { return _this.browserWindowEnv['production'] ? _this.browserWindowEnv['production'] : (_this.env.production || false); };
67
+ this.setUrlBase = function (url) { return _this.urlBase = url; };
68
+ this.setUrlAssets = function (url) { return _this.urlAssets = url; };
69
+ /**
70
+ * @param next Function to execute
71
+ * @param params That function needs
72
+ *
73
+ * Execute the function passed as params, if the frontend is in production mode
74
+ */
75
+ this.onlyIfProduction = function (next, params) { return _this.isProduction() && next(params); };
76
+ /**
77
+ * @description Devuelve la url base donde se alojan los archivos multimedia
78
+ * @param postMedia carpeta donde se guardan los archivos
79
+ * @returns
80
+ */
81
+ this.mediaUrl = function (postMedia) { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + (postMedia ? postMedia : "image/"); };
82
+ this.mediaBannerUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "banner-image/"; };
83
+ this.mediaStoreUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "store-image/"; };
84
+ this.getProductsListRoute = function () { return 'collection/'; };
85
+ this.getSectionsRoute = function () { return 'section/'; };
86
+ this.getUrlBase = function () { return _this.urlBase; };
87
+ this.getUrlFrontend = function () { return _this.urlFrontend; };
88
+ this.getBlocksCacheTime = function () { return _this.blocksCacheTime && parseInt(_this.blocksCacheTime); };
89
+ // getLocale = () => this.locale;
90
+ // setLocale = (locale) => this.locale = locale;
91
+ this.getLocale = function () {
92
+ if (localStorage.getItem(_this.LOCALE)) {
93
+ _this.locale = localStorage.getItem(_this.LOCALE);
94
+ }
95
+ return _this.locale;
96
+ };
97
+ this.getLocaleTranslate = function () {
98
+ return _this.getLocale().split('_')[0];
99
+ };
100
+ this.setLocale = function (locale) {
101
+ localStorage.setItem(_this.LOCALE, locale);
102
+ _this.translate.use(locale.split('_')[0]);
103
+ _this.locale = locale;
104
+ };
105
+ this.getChannel = function () {
106
+ if (localStorage.getItem(_this.CHANNEL)) {
107
+ _this.channel = localStorage.getItem(_this.CHANNEL);
108
+ }
109
+ return _this.channel;
110
+ };
111
+ this.setChannel = function (channel) {
112
+ localStorage.setItem(_this.CHANNEL, channel);
113
+ _this.channel = channel;
114
+ };
115
+ this.getVersion = function () { return _this.version; };
116
+ this.loginExtraData = function () {
117
+ return {
118
+ client_id: 'demo_client',
119
+ client_secret: 'secret_demo_client',
120
+ grant_type: 'password'
121
+ };
122
+ };
123
+ this.isCollection = function (path) { return (/^(\/?)collection(\/?)([\w\.\/\?]*)$/g).test(path); };
124
+ /**
125
+ * Utilities
126
+ */
127
+ this.mobile = function () { return window.innerWidth < 750; };
128
+ this.strictTypeChannel = function () { return _this.env.strictTypeChannel || 'b2b2c'; };
129
+ this.toDecimal = function (total) { return (total - Math.floor(total) == 0) ? total / 100 : total; };
130
+ /**
131
+ * Elementos para manejo de lista de rutas reutilizables
132
+ */
133
+ this.addRouteToReuse = function (route) { return route && _this.routes.push(route); };
134
+ this.removeRouteToReuse = function (route) {
135
+ var index = _this.routes.indexOf(route);
136
+ if (index > -1) {
137
+ _this.routes.splice(index, 1);
138
+ }
139
+ };
140
+ this.getRoutesToReuse = function () { return _this.routes; };
141
+ /**
142
+ * @public ejemplo de uso <img *ngFor="let item of consts.getRatingStar(product.rating,'assets/images/star.png','assets/images/notStar.png')" [src]="item">
143
+ * @description funcion que dado un valor entre 1 .. 5, y star: notStar:
144
+ * (deben ser el path del archivo local a la implementacion).
145
+ * retorna un arreglo con con la valoracion correspondiente.
146
+ */
147
+ this.getRatingStar = function (rating, star, notStar) {
148
+ try {
149
+ var urlStar = [];
150
+ var cantStar = Number(rating) || 0;
151
+ for (var index = 0; index < 5; index++) {
152
+ urlStar.push(cantStar > 0
153
+ ? star
154
+ : notStar);
155
+ cantStar--;
156
+ }
157
+ return urlStar;
158
+ }
159
+ catch (error) {
160
+ console.error("getRatingStar produjo un error -> ", error);
161
+ }
162
+ };
163
+ /**
164
+ * @public ejemplo de uso (keypress)="inputValidationByExpressions($event,'[0-9]{1,9}')" en el DOM.
165
+ * @description funcion que dado un manejandor de evento, y una expresion regular esta es
166
+ * evaluada sobre los valores que el manejador de eventos nos envia.
167
+ * En el caso en el que se envie el parametro 'condition' este puede ser para
168
+ * anular el evento como condicion adicional a la evaluacion de la entrada.
169
+ */
170
+ this.inputValidationByExpressions = function (e, patron, condition) {
171
+ if (condition === void 0) { condition = null; }
172
+ try {
173
+ var tecla = (document) ? e.keyCode : e.which;
174
+ if (tecla == 8)
175
+ return true;
176
+ var patronReg = new RegExp(patron);
177
+ var tecla_final = String.fromCharCode(tecla);
178
+ if (condition != null) {
179
+ return patronReg.test(tecla_final) && condition;
180
+ }
181
+ return patronReg.test(tecla_final);
182
+ }
183
+ catch (error) {
184
+ console.error("inputValidationByExpressions produjo un error -> ", error);
185
+ }
186
+ };
187
+ /**
188
+ * Propiedad que se utiliza para tomar como configuración para el tipo de moneda que se utiliza en el sitio.
189
+ * Estos valores son utilizados para el pipe currencyPrice
190
+ */
191
+ this.currency = {
192
+ code: 'ARG',
193
+ symbol: '$',
194
+ position: 'Left',
195
+ withoutDecimal: false
196
+ };
197
+ /**
198
+ * Arreglo de valores usados para el pipe currencyPrice
199
+ */
200
+ this.currencyTypeConfig = [
201
+ {
202
+ code: 'EUR',
203
+ symbol: '€',
204
+ position: 'Right',
205
+ withoutDecimal: false
206
+ },
207
+ {
208
+ code: 'ARG',
209
+ symbol: '$',
210
+ position: 'Left',
211
+ withoutDecimal: false
212
+ },
213
+ {
214
+ code: 'ARS',
215
+ symbol: '$',
216
+ position: 'Left',
217
+ withoutDecimal: false
218
+ },
219
+ {
220
+ code: 'USD',
221
+ symbol: '$',
222
+ position: 'Left',
223
+ withoutDecimal: false
224
+ },
225
+ {
226
+ code: 'PYG',
227
+ symbol: 'Gs.',
228
+ position: 'Left',
229
+ withoutDecimal: false
230
+ },
231
+ {
232
+ code: 'PEN',
233
+ symbol: 'S/',
234
+ position: 'Left',
235
+ withoutDecimal: false
236
+ },
237
+ {
238
+ code: 'SEK',
239
+ symbol: 'SEK',
240
+ position: 'Right',
241
+ withoutDecimal: true
242
+ },
243
+ ];
244
+ this.setCurrencyTypeConfig = function (currencyTypeConfig) {
245
+ _this.currencyTypeConfig = currencyTypeConfig;
246
+ };
247
+ /**
248
+ * @description Reemplaza los valores de una moneda.
249
+ * @param currencyTypeFind Tipo de currency que se desea modificar
250
+ * @param customType Los nuevos valores. Todas las key son opcionales
251
+ * @example customType = { code: 'ARG', symbol: '$', position: 'Left' , withoutDecimal: false }
252
+ */
253
+ this.replaceCurrencyTypeConfig = function (currencyTypeFind, customType) {
254
+ var _a, _b, _c, _d;
255
+ var currencyType = _this.currencyTypeConfig.find(function (type) { return type.code == currencyTypeFind; });
256
+ if (currencyType) {
257
+ currencyType.symbol = ((_a = customType) === null || _a === void 0 ? void 0 : _a.symbol) || currencyType.symbol;
258
+ currencyType.code = ((_b = customType) === null || _b === void 0 ? void 0 : _b.code) || currencyType.code;
259
+ currencyType.position = ((_c = customType) === null || _c === void 0 ? void 0 : _c.position) || currencyType.position;
260
+ currencyType.withoutDecimal = ((_d = customType) === null || _d === void 0 ? void 0 : _d.withoutDecimal) || currencyType.withoutDecimal;
261
+ }
262
+ //Reveer en el futuro si se empiezan a agregar otro tipos de monedas
263
+ /* else{
264
+ this.currencyTypeConfig.push({...customType })
265
+ } */
266
+ };
267
+ /**
268
+ *
269
+ * @param currencyTypeFind Definir el code del tipo de moneda que se quiera utilizar.
270
+ * Si el tipo es CUSTOM se toman los valores del segundo parametro donde se puede definir la simbología y posesión que se quiera.
271
+ * @param customType Formato del parámetro ejemplo { code: 'ARG', symbol: '$', position: 'L' , withoutDecimals: false } ,
272
+ * todas las key son opcionales y por defecto se toman los valores del ejemplo.
273
+ * @returns se retorna la configuración que se seteo a la propiedad currency del servicio.
274
+ */
275
+ this.setCurrency = function (currencyTypeFind, customType) {
276
+ _this.currency = _this.currencyTypeConfig.find(function (ct) { return ct.code == currencyTypeFind.toUpperCase(); }) || _this.currency;
277
+ customType && (_this.currency = __assign(__assign({}, _this.currency), customType));
278
+ return _this.currency;
279
+ };
280
+ this.modifyChannelConfig = function (channelConfig) {
281
+ if (channelConfig.channel || channelConfig.code)
282
+ _this.setChannel(channelConfig.channel || channelConfig.code);
283
+ if (channelConfig.locale || channelConfig.locales.code)
284
+ _this.setLocale(channelConfig.locale || channelConfig.locales.code);
285
+ if (channelConfig.currency || channelConfig.baseCurrency)
286
+ _this.setCurrency(channelConfig.currency || channelConfig.baseCurrency);
287
+ return channelConfig;
288
+ };
289
+ /**
290
+ * @description Se utiliza para configurar los filtros por defecto que se aplicaran en la seccion 'Collection'
291
+ * cuando se ingresa a la misma.
292
+ */
293
+ this.defaultFilters = [];
294
+ /**
295
+ * @description Settea el valor de la variable defaulFilters.
296
+ * @param filters
297
+ */
298
+ this.setDefaultFilters = function (filters) {
299
+ _this.defaultFilters = filters;
300
+ };
301
+ this.getDefaultFilters = function () { return _this.defaultFilters; };
302
+ /**
303
+ * @description Se utiliza para configurar tanto los filtros por defectos que ya seran aplicados, como tambien
304
+ * los filtros que se mostraran en la seccion collection, su orden, etc.
305
+ */
306
+ this.filterConfig = {
307
+ defaultFilters: [],
308
+ filters: ['category', 'attributes', 'dynamics', 'price_range']
309
+ };
310
+ this.setFilterConfig = function (filterConfig) {
311
+ filterConfig.defaultFilters ? _this.filterConfig.defaultFilters = filterConfig.defaultFilters : null;
312
+ filterConfig.filters ? _this.filterConfig.filters = filterConfig.filters : null;
313
+ };
314
+ this.getFilterConfig = function () { return _this.filterConfig.filters; };
315
+ /**
316
+ * @description contiene un arreglo de string cuyo contenido son los codigos de los paises.
317
+ * @example ['AR','ES','GB']
318
+ */
319
+ this.countries = [];
320
+ /**
321
+ *
322
+ * @param countries debe contener los codigos de los paises que se quiere mostrar
323
+ * @example ['AR','ES','GB']
324
+ * @returns
325
+ */
326
+ this.setCountries = function (countries) { return _this.countries = countries; };
327
+ this.getCountries = function () { return _this.countries; };
328
+ /**
329
+ * @description esta variable se utiliza para configurar los parametros cuando se desea mostrar
330
+ * variantes el listado de productos.
331
+ * @param {string}type tipo de options
332
+ * @param {string}code codigo de options
333
+ * @param {boolean}defaultFirstOption `true` toma el primer option del producto en general
334
+ * @param {boolean}checkIfStock `true` se realiza un chequeo de si la variante tiene stock para mostrarla
335
+ * @example ```javascript
336
+ * {
337
+ type: 'color',
338
+ code: 'color',
339
+ defaultFirstOption: false ,
340
+ checkIfStock:true
341
+ } ```
342
+ */
343
+ this.paramsProductsWithUniqueVariant = {
344
+ type: 'color',
345
+ code: 'color',
346
+ defaultFirstOption: false,
347
+ checkIfStock: true
348
+ };
349
+ this.setParamsProductsWithUniqueVariant = function (value) {
350
+ _this.paramsProductsWithUniqueVariant = __assign(__assign({}, _this.paramsProductsWithUniqueVariant), value);
351
+ };
352
+ this.getParamsProductsWithUniqueVariant = function () { return _this.paramsProductsWithUniqueVariant; };
353
+ /**
354
+ * @description se utiliza para configurar que filtros del tipo `SortFilter` se quiere mostrar en la vista.
355
+ * Se usan los codigo de los filtros para indicar cuales se deben mostrar.
356
+ */
357
+ this.sortFilters = ['price', 'order-alph', 'recent'];
358
+ /**
359
+ *
360
+ * @param filtersCode arreglo de strings con los codigos de los filtros.
361
+ * Si se le pasa el parametro **all** este mostrara todos.
362
+ * @example price | order-alph | recent | update | all
363
+ * @returns
364
+ */
365
+ this.setSortFilters = function (filtersCode) {
366
+ if (filtersCode === void 0) { filtersCode = ['all']; }
367
+ return _this.sortFilters = filtersCode;
368
+ };
369
+ this.getSortFilters = function () { return _this.sortFilters; };
370
+ this.postalCodePatterns = {
371
+ 'AR': { pattern: /^[0-9]{4}$/, errorKey: "postal-code-pattern-error.ar" },
372
+ 'UY': { pattern: /^[0-9]{5}$/, errorKey: "postal-code-pattern-error.uy" },
373
+ 'GB': { pattern: /^[A-Z]{1,2}[0-9][A-Z0-9]?\s?[0-9][A-Z]{2}$/, errorKey: "postal-code-pattern-error.gb" },
374
+ 'ES': { pattern: /^(?:0[1-9]|[1-4]\d|5[0-2])\d{3}$/, errorKey: "postal-code-pattern-error.es" },
375
+ 'BR': { pattern: /^[0-9]{5}-[0-9]{3}$/, errorKey: "postal-code-pattern-error.br" },
376
+ 'FR': { pattern: /^[0-9]{5}$/, errorKey: "postal-code-pattern-error.fr" },
377
+ 'PT': { pattern: /^[0-9]{4}-[0-9]{3}$/, errorKey: "postal-code-pattern-error.pt" },
378
+ };
379
+ }
380
+ /**
381
+ *
382
+ * @param needles (agujas) object con claves valor a filtrar
383
+ * @param haystack (pajar) objecto en el que buscar
384
+ *
385
+ * @description funcion que busca en el haystack (pajar) todos los objetos que contentan
386
+ * todas las claves de los needles(agujas) que contengan el mismo valor
387
+ */
388
+ Constants.prototype.containsAll = function (needles, haystack) {
389
+ var result = true;
390
+ if (!!needles && !!haystack) {
391
+ Object.entries(needles).forEach(function (value) {
392
+ if (!(haystack.hasOwnProperty(value[0]) && haystack[value[0]] == value[1]))
393
+ result = false;
394
+ });
395
+ }
396
+ return result;
397
+ };
398
+ /**
399
+ * devuelve true si existe el elemento "search" en el array de parametros "params"
400
+ *
401
+ * @param params Array de parametros entre los que buscar
402
+ * @param searched Elemento que buscar
403
+ * @param prefix prefijo del string a buscar (ejemplo: "link_")
404
+ * @param suffix sufijo del string a buscar (ejemplo: "link_")
405
+ * @param casesensitive determina si se evalua con sensibilidad entre mayuscula y minuscula
406
+ * @returns retorna true o false si se encontro o no el parametro en el array
407
+ */
408
+ Constants.prototype.hasParams = function (params, searched, prefix, suffix, casesensitive) {
409
+ if (prefix === void 0) { prefix = ''; }
410
+ if (suffix === void 0) { suffix = ''; }
411
+ if (casesensitive === void 0) { casesensitive = false; }
412
+ return casesensitive ? params.find(function (param) { return (param.code).toLowerCase() == (prefix + searched + suffix).toLowerCase() || (param.code).toLowerCase() == (searched).toLowerCase(); })
413
+ : params.find(function (param) { return param.code == (prefix + searched + suffix) || param.code == searched; });
414
+ };
415
+ ;
416
+ Constants.prototype.getPostalCodePattern = function (countryCode) {
417
+ return this.postalCodePatterns[countryCode] || { pattern: /^[A-Za-z0-9\s\-]+$/, errorKey: "postal-code-pattern-error.default" };
418
+ };
419
+ Constants.ctorParameters = function () { return [
420
+ { type: TranslateService },
421
+ { type: Router },
422
+ { type: undefined, decorators: [{ type: Inject, args: ['env',] }] }
423
+ ]; };
424
+ Constants.ɵprov = i0.ɵɵdefineInjectable({ factory: function Constants_Factory() { return new i1.Constants(i0.ɵɵinject(i2.TranslateService), i0.ɵɵinject(i3.Router), i0.ɵɵinject("env")); }, token: i1.Constants, providedIn: "root" });
425
+ Constants = __decorate([
426
+ Injectable({
427
+ providedIn: 'root'
428
+ }),
429
+ __param(2, Inject('env'))
430
+ ], Constants);
431
+ return Constants;
432
+ }());
433
+ export { Constants };
434
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvY29yZS5jb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFtQixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBWXREO0lBRUksbUJBQW1CLFNBQTJCLEVBQVUsTUFBYyxFQUF5QixHQUFHO1FBQWxHLGlCQUF1RztRQUFwRixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBeUIsUUFBRyxHQUFILEdBQUcsQ0FBQTtRQUVqRixXQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ2xCLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFeEIseUJBQW9CLEdBQUcsSUFBSSxhQUFhLEVBQU8sQ0FBQztRQUNqRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV6RCxxQkFBZ0IsR0FBRyxVQUFDLE9BQU8sSUFBSyxPQUFBLFlBQVksR0FBRyxPQUFPLEdBQUcsU0FBUyxFQUFsQyxDQUFrQyxDQUFDO1FBRW5FLGtCQUFhLEdBQVcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxxQkFBZ0IsR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyRSxnRkFBZ0Y7UUFDeEUsWUFBTyxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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QSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBbEksQ0FBa0ksQ0FBQztZQUMzSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFwRSxDQUFvRSxDQUFDLENBQUE7SUFFcEcsQ0FBQztJQUFBLENBQUM7SUEwSEYsd0NBQW9CLEdBQXBCLFVBQXFCLFdBQW1CO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxtQ0FBbUMsRUFBRSxDQUFDO0lBQ3BJLENBQUM7O2dCQXpjNkIsZ0JBQWdCO2dCQUFrQixNQUFNO2dEQUFHLE1BQU0sU0FBQyxLQUFLOzs7SUFGNUUsU0FBUztRQUhyQixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO1FBRzJFLFdBQUEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO09BRjdFLFNBQVMsQ0E0Y3JCO29CQTVkRDtDQTRkQyxBQTVjRCxJQTRjQztTQTVjWSxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9hcGkvY29ubmVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEN1cnJlbmN5Q29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2N1cnJlbmN5Q29uZmlnJztcbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIsIEZpbHRlckNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXInO1xuaW1wb3J0IHsgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xudHlwZSBjdXJyZW5jeVR5cGUgPSAnRVVSJyB8ICdBUkcnIHwgJ1VTRCcgfCAnUFlHJyB8ICdQRU4nIHwgJ1NFSycgfCAnQ1VTVE9NJztcbnR5cGUgcG9zaXRpb25UeXBlID0gJ0wnIHwgJ1InO1xudHlwZSBjaGFubmVsVHlwZXMgPSAnYjJiJyB8ICdiMmIyYycgfCAnYjJjJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb25zdGFudHMge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgQEluamVjdCgnZW52JykgcHJpdmF0ZSBlbnYpIHsgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBMT0NBTEUgPSAnTE9DQUxFJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IENIQU5ORUwgPSAnQ0hBTk5FTCc7XG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcblxuICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxhbnk+KCk7XG4gICAgcHVibGljIGNoYW5uZWxDb25maWckID0gdGhpcy5jaGFubmVsQ29uZmlnU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ0FQSSA9IChjaGFubmVsKSA9PiAnL3Nob3AtYXBpLycgKyBjaGFubmVsICsgJ2NoYW5uZWwnO1xuXG4gICAgcHJpdmF0ZSBicm93c2VyV2luZG93OiBvYmplY3QgPSB3aW5kb3cgfHwge307XG4gICAgcHJpdmF0ZSBicm93c2VyV2luZG93RW52OiBvYmplY3QgPSB0aGlzLmJyb3dzZXJXaW5kb3dbJ19fZW52J10gfHwge307XG5cbiAgICAvLyAgICAgcHJpdmF0ZSB1cmxCYXNlOiBzdHJpbmcgPSAnaHR0cDovL3Rlc3RpbmcuYmFja2VuZC5lYXN5Y29tbWVyY2V0ZWNoLmNvbS8nO1xuICAgIHByaXZhdGUgdXJsQmFzZTogc3RyaW5nID0gdGhpcy5icm93c2VyV2luZG93RW52WydhcGlVcmwnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYXBpVXJsJ10gOiAodGhpcy5lbnYuYXBpVXJsIHx8ICdodHRwOi8vYmFja2VuZC5lYXN5Y29tbWVyY2UuZGV2cC8nKTtcbiAgICBwcml2YXRlIHVybEFzc2V0czogc3RyaW5nID0gdGhpcy5icm93c2VyV2luZG93RW52Wyd1cmxBc3NldHMnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsQXNzZXRzJ10gOiAodGhpcy5lbnYudXJsQXNzZXRzIHx8IHRoaXMudXJsQmFzZSk7XG4gICAgcHJpdmF0ZSB1cmxGcm9udGVuZDogc3RyaW5nID0gdGhpcy5icm93c2VyV2luZG93RW52Wyd1cmxGcm9udGVuZCddID8gdGhpcy5icm93c2VyV2luZG93RW52Wyd1cmxGcm9udGVuZCddIDogKHRoaXMuZW52LnVybEZyb250ZW5kIHx8ICdodHRwczovL2VsZGVuLmVhc3ljb21tZXJjZXRlY2guY29tLycpO1xuICAgIHByaXZhdGUgbG9jYWxlOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMRSkgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMRSkgOiB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2xvY2FsZSddID8gdGhpcy5icm93c2VyV2luZG93RW52Wydsb2NhbGUnXSA6ICh0aGlzLmVudi5sb2NhbGUgfHwgJ2VzX0FSJyk7XG4gICAgcHJpdmF0ZSBjaGFubmVsOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMKSA6IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnY2hhbm5lbCddID8gdGhpcy5icm93c2VyV2luZG93RW52WydjaGFubmVsJ10gOiAodGhpcy5lbnYuY2hhbm5lbCB8fCAnbWlub3Jpc3RhJylcbiAgICBwcml2YXRlIGJsb2Nrc0NhY2hlVGltZTogc3RyaW5nID0gdGhpcy5icm93c2VyV2luZG93RW52WydibG9ja3NDYWNoZVRpbWUnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYmxvY2tzQ2FjaGVUaW1lJ10gOiAodGhpcy5lbnYuYmxvY2tzQ2FjaGVUaW1lIHx8IG51bGwpO1xuXG4gICAgcHJpdmF0ZSBtb2RhbENvbmZpZyA9IHsgdGl0bGU6ICdFeGFtcGxlJywgY2xhc3M6ICdtb2RhbC14bCBtb2RhbC1kaWFsb2ctY2VudGVyZWQnLCBrZXlib2FyZDogZmFsc2UgfTtcbiAgICBzZXRNb2RhbENvbmZpZyA9IChjb25maWc6IGFueSkgPT4gdGhpcy5tb2RhbENvbmZpZyA9IGNvbmZpZztcbiAgICBnZXRNb2RhbENvbmZpZyA9ICgpID0+IHRoaXMubW9kYWxDb25maWc7XG5cbiAgICBwcml2YXRlIHZlcnNpb246IHN0cmluZyA9ICd2MSc7XG5cbiAgICBwcml2YXRlIHJvdXRlcyA9IFsvXmhvbWUkL2csIC9eKFxcLz8pY29sbGVjdGlvbihcXC8/KShbXFx3XFwuXFwvXFw/XSopJC9nLCAvXmNvbnRhY3QkL2ddO1xuXG4gICAgLyogR2V0IHJpZCBvZiB0aGlzIEFTQVAhICovXG4gICAgcHJpdmF0ZSBtYXN0ZXJDaGFubmVsID0gbnVsbFxuXG4gICAgcHVibGljIGdldE1hc3RlckNoYW5uZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tYXN0ZXJDaGFubmVsKSB0aGlzLm1hc3RlckNoYW5uZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTUFTVEVSX0NIQU5ORUwnKVxuICAgICAgICByZXR1cm4gdGhpcy5tYXN0ZXJDaGFubmVsXG4gICAgfVxuXG4gICAgcHVibGljIHNldE1hc3RlckNoYW5uZWwgPSBjaGFubmVsID0+IHtcbiAgICAgICAgdGhpcy5tYXN0ZXJDaGFubmVsID0gY2hhbm5lbFxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTUFTVEVSX0NIQU5ORUwnLCBjaGFubmVsKVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNQcm9kdWN0aW9uID0gKCkgPT4gdGhpcy5icm93c2VyV2luZG93RW52Wydwcm9kdWN0aW9uJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3Byb2R1Y3Rpb24nXSA6ICh0aGlzLmVudi5wcm9kdWN0aW9uIHx8IGZhbHNlKTtcblxuICAgIHNldFVybEJhc2UgPSAodXJsKSA9PiB0aGlzLnVybEJhc2UgPSB1cmw7XG4gICAgc2V0VXJsQXNzZXRzID0gKHVybCkgPT4gdGhpcy51cmxBc3NldHMgPSB1cmw7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbmV4dCBGdW5jdGlvbiB0byBleGVjdXRlXG4gICAgICogQHBhcmFtIHBhcmFtcyBUaGF0IGZ1bmN0aW9uIG5lZWRzXG4gICAgICpcbiAgICAgKiBFeGVjdXRlIHRoZSBmdW5jdGlvbiBwYXNzZWQgYXMgcGFyYW1zLCBpZiB0aGUgZnJvbnRlbmQgaXMgaW4gcHJvZHVjdGlvbiBtb2RlXG4gICAgICovXG4gICAgb25seUlmUHJvZHVjdGlvbiA9IChuZXh0LCBwYXJhbXMpID0+IHRoaXMuaXNQcm9kdWN0aW9uKCkgJiYgbmV4dChwYXJhbXMpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIERldnVlbHZlIGxhIHVybCBiYXNlIGRvbmRlIHNlIGFsb2phbiBsb3MgYXJjaGl2b3MgbXVsdGltZWRpYVxuICAgICAqIEBwYXJhbSBwb3N0TWVkaWEgY2FycGV0YSBkb25kZSBzZSBndWFyZGFuIGxvcyBhcmNoaXZvc1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgbWVkaWFVcmwgPSAocG9zdE1lZGlhPzogc3RyaW5nKSA9PiB0aGlzLnVybEFzc2V0cyArICh0aGlzLnVybEFzc2V0cyA9PSB0aGlzLnVybEJhc2UgPyAnbWVkaWEvJyA6ICcnKSArIChwb3N0TWVkaWEgPyBwb3N0TWVkaWEgOiBcImltYWdlL1wiKTtcbiAgICBtZWRpYUJhbm5lclVybCA9ICgpID0+IHRoaXMudXJsQXNzZXRzICsgKHRoaXMudXJsQXNzZXRzID09IHRoaXMudXJsQmFzZSA/ICdtZWRpYS8nIDogJycpICsgXCJiYW5uZXItaW1hZ2UvXCI7XG4gICAgbWVkaWFTdG9yZVVybCA9ICgpID0+IHRoaXMudXJsQXNzZXRzICsgKHRoaXMudXJsQXNzZXRzID09IHRoaXMudXJsQmFzZSA/ICdtZWRpYS8nIDogJycpICsgXCJzdG9yZS1pbWFnZS9cIjtcblxuICAgIGdldFByb2R1Y3RzTGlzdFJvdXRlID0gKCkgPT4gJ2NvbGxlY3Rpb24vJztcblxuICAgIGdldFNlY3Rpb25zUm91dGUgPSAoKSA9PiAnc2VjdGlvbi8nO1xuXG4gICAgZ2V0VXJsQmFzZSA9ICgpID0+IHRoaXMudXJsQmFzZTtcbiAgICBnZXRVcmxGcm9udGVuZCA9ICgpID0+IHRoaXMudXJsRnJvbnRlbmQ7XG5cbiAgICBnZXRCbG9ja3NDYWNoZVRpbWUgPSAoKTogbnVtYmVyID0+IHRoaXMuYmxvY2tzQ2FjaGVUaW1lICYmIHBhcnNlSW50KHRoaXMuYmxvY2tzQ2FjaGVUaW1lKTtcblxuICAgIC8vIGdldExvY2FsZSA9ICgpID0+IHRoaXMubG9jYWxlO1xuICAgIC8vIHNldExvY2FsZSA9IChsb2NhbGUpID0+IHRoaXMubG9jYWxlID0gbG9jYWxlO1xuXG4gICAgZ2V0TG9jYWxlID0gKCkgPT4ge1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuTE9DQUxFKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZVxuICAgIH1cblxuICAgIGdldExvY2FsZVRyYW5zbGF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2NhbGUgPSBsb2NhbGUgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkxPQ0FMRSwgbG9jYWxlKVxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobG9jYWxlLnNwbGl0KCdfJylbMF0pXG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgfVxuXG4gICAgZ2V0Q2hhbm5lbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVsXG4gICAgfVxuXG4gICAgcHVibGljIHNldENoYW5uZWwgPSBjaGFubmVsID0+IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DSEFOTkVMLCBjaGFubmVsKVxuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgfVxuXG4gICAgZ2V0VmVyc2lvbiA9ICgpID0+IHRoaXMudmVyc2lvbjtcblxuICAgIGxvZ2luRXh0cmFEYXRhID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xpZW50X2lkOiAnZGVtb19jbGllbnQnLFxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogJ3NlY3JldF9kZW1vX2NsaWVudCcsXG4gICAgICAgICAgICBncmFudF90eXBlOiAncGFzc3dvcmQnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0NvbGxlY3Rpb24gPSAocGF0aCkgPT4gKC9eKFxcLz8pY29sbGVjdGlvbihcXC8/KShbXFx3XFwuXFwvXFw/XSopJC9nKS50ZXN0KHBhdGgpO1xuXG4gICAgLyoqXG4gICAgICogVXRpbGl0aWVzXG4gICAgICovXG5cbiAgICBtb2JpbGUgPSAoKSA9PiB3aW5kb3cuaW5uZXJXaWR0aCA8IDc1MDtcblxuICAgIHN0cmljdFR5cGVDaGFubmVsID0gKCkgPT4gdGhpcy5lbnYuc3RyaWN0VHlwZUNoYW5uZWwgfHwgJ2IyYjJjJztcblxuICAgIHRvRGVjaW1hbCA9ICh0b3RhbCkgPT4gKHRvdGFsIC0gTWF0aC5mbG9vcih0b3RhbCkgPT0gMCkgPyB0b3RhbCAvIDEwMCA6IHRvdGFsO1xuXG4gICAgLyoqXG4gICAgICogRWxlbWVudG9zIHBhcmEgbWFuZWpvIGRlIGxpc3RhIGRlIHJ1dGFzIHJldXRpbGl6YWJsZXNcbiAgICAgKi9cblxuICAgIGFkZFJvdXRlVG9SZXVzZSA9IChyb3V0ZTogUmVnRXhwKSA9PiByb3V0ZSAmJiB0aGlzLnJvdXRlcy5wdXNoKHJvdXRlKTtcblxuICAgIHJlbW92ZVJvdXRlVG9SZXVzZSA9IChyb3V0ZTogUmVnRXhwKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3V0ZXMuaW5kZXhPZihyb3V0ZSk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Um91dGVzVG9SZXVzZSA9ICgpOiBSZWdFeHBbXSA9PiB0aGlzLnJvdXRlcztcblxuXG5cbiAgICAvKipcbiAgICAgKiAgQHB1YmxpYyBlamVtcGxvIGRlIHVzbyA8aW1nICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbnN0cy5nZXRSYXRpbmdTdGFyKHByb2R1Y3QucmF0aW5nLCdhc3NldHMvaW1hZ2VzL3N0YXIucG5nJywnYXNzZXRzL2ltYWdlcy9ub3RTdGFyLnBuZycpXCIgW3NyY109XCJpdGVtXCI+XG4gICAgICogIEBkZXNjcmlwdGlvbiBmdW5jaW9uIHF1ZSBkYWRvIHVuIHZhbG9yIGVudHJlIDEgLi4gNSwgeSBzdGFyOiBub3RTdGFyOlxuICAgICAqICAgICAgKGRlYmVuIHNlciBlbCBwYXRoIGRlbCBhcmNoaXZvIGxvY2FsIGEgbGEgaW1wbGVtZW50YWNpb24pLlxuICAgICAqICAgICAgcmV0b3JuYSB1biBhcnJlZ2xvIGNvbiBjb24gbGEgdmFsb3JhY2lvbiBjb3JyZXNwb25kaWVudGUuXG4gICAgICovXG4gICAgZ2V0UmF0aW5nU3RhciA9IChyYXRpbmc6IGFueSwgc3RhcjogU3RyaW5nLCBub3RTdGFyOiBTdHJpbmcpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB1cmxTdGFyID0gW107XG4gICAgICAgICAgICBsZXQgY2FudFN0YXIgPSBOdW1iZXIocmF0aW5nKSB8fCAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDU7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICB1cmxTdGFyLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGNhbnRTdGFyID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGFyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vdFN0YXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNhbnRTdGFyLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsU3RhcjtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJnZXRSYXRpbmdTdGFyIHByb2R1am8gdW4gZXJyb3IgLT4gXCIsIGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICBAcHVibGljIGVqZW1wbG8gZGUgdXNvIChrZXlwcmVzcyk9XCJpbnB1dFZhbGlkYXRpb25CeUV4cHJlc3Npb25zKCRldmVudCwnWzAtOV17MSw5fScpXCIgZW4gZWwgRE9NLlxuICAgICAqICBAZGVzY3JpcHRpb24gZnVuY2lvbiBxdWUgZGFkbyB1biBtYW5lamFuZG9yIGRlIGV2ZW50bywgeSB1bmEgZXhwcmVzaW9uIHJlZ3VsYXIgZXN0YSBlc1xuICAgICAqICAgICAgICAgIGV2YWx1YWRhIHNvYnJlIGxvcyB2YWxvcmVzIHF1ZSBlbCBtYW5lamFkb3IgZGUgZXZlbnRvcyBub3MgZW52aWEuXG4gICAgICogICAgICAgICAgRW4gZWwgY2FzbyBlbiBlbCBxdWUgc2UgZW52aWUgZWwgcGFyYW1ldHJvICdjb25kaXRpb24nIGVzdGUgcHVlZGUgc2VyIHBhcmFcbiAgICAgKiAgICAgICAgICBhbnVsYXIgZWwgZXZlbnRvIGNvbW8gY29uZGljaW9uIGFkaWNpb25hbCBhIGxhIGV2YWx1YWNpb24gZGUgbGEgZW50cmFkYS5cbiAgICAgKi9cbiAgICBpbnB1dFZhbGlkYXRpb25CeUV4cHJlc3Npb25zID0gKGUsIHBhdHJvbiwgY29uZGl0aW9uID0gbnVsbCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRlY2xhID0gKGRvY3VtZW50KSA/IGUua2V5Q29kZSA6IGUud2hpY2g7XG4gICAgICAgICAgICBpZiAodGVjbGEgPT0gOCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBsZXQgcGF0cm9uUmVnID0gbmV3IFJlZ0V4cChwYXRyb24pXG4gICAgICAgICAgICBsZXQgdGVjbGFfZmluYWwgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRlY2xhKTtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRyb25SZWcudGVzdCh0ZWNsYV9maW5hbCkgJiYgY29uZGl0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdHJvblJlZy50ZXN0KHRlY2xhX2ZpbmFsKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImlucHV0VmFsaWRhdGlvbkJ5RXhwcmVzc2lvbnMgcHJvZHVqbyB1biBlcnJvciAtPiBcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZWVkbGVzIChhZ3VqYXMpIG9iamVjdCBjb24gY2xhdmVzIHZhbG9yIGEgZmlsdHJhclxuICAgICAqIEBwYXJhbSBoYXlzdGFjayAocGFqYXIpIG9iamVjdG8gZW4gZWwgcXVlIGJ1c2NhclxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uIGZ1bmNpb24gcXVlIGJ1c2NhIGVuIGVsIGhheXN0YWNrIChwYWphcikgdG9kb3MgbG9zIG9iamV0b3MgcXVlIGNvbnRlbnRhblxuICAgICAqIHRvZGFzIGxhcyBjbGF2ZXMgZGUgbG9zIG5lZWRsZXMoYWd1amFzKSBxdWUgY29udGVuZ2FuIGVsIG1pc21vIHZhbG9yXG4gICAgICovXG4gICAgY29udGFpbnNBbGwobmVlZGxlczogb2JqZWN0LCBoYXlzdGFjazogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgIGlmICghIW5lZWRsZXMgJiYgISFoYXlzdGFjaykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMobmVlZGxlcykuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoaGF5c3RhY2suaGFzT3duUHJvcGVydHkodmFsdWVbMF0pICYmIGhheXN0YWNrW3ZhbHVlWzBdXSA9PSB2YWx1ZVsxXSkpIHJlc3VsdCA9IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGllZGFkIHF1ZSBzZSB1dGlsaXphIHBhcmEgdG9tYXIgY29tbyBjb25maWd1cmFjacOzbiBwYXJhIGVsIHRpcG8gZGUgbW9uZWRhIHF1ZSBzZSB1dGlsaXphIGVuIGVsIHNpdGlvLlxuICAgICAqIEVzdG9zIHZhbG9yZXMgc29uIHV0aWxpemFkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3VycmVuY3k6IEN1cnJlbmN5Q29uZmlnID0ge1xuICAgICAgICBjb2RlOiAnQVJHJyxcbiAgICAgICAgc3ltYm9sOiAnJCcsXG4gICAgICAgIHBvc2l0aW9uOiAnTGVmdCcsXG4gICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFycmVnbG8gZGUgdmFsb3JlcyB1c2Fkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3VycmVuY3lUeXBlQ29uZmlnOiBDdXJyZW5jeUNvbmZpZ1tdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb2RlOiAnRVVSJyxcbiAgICAgICAgICAgIHN5bWJvbDogJ+KCrCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ1JpZ2h0JyxcbiAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdBUkcnLFxuICAgICAgICAgICAgc3ltYm9sOiAnJCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdBUlMnLFxuICAgICAgICAgICAgc3ltYm9sOiAnJCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdVU0QnLFxuICAgICAgICAgICAgc3ltYm9sOiAnJCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdQWUcnLFxuICAgICAgICAgICAgc3ltYm9sOiAnR3MuJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnTGVmdCcsXG4gICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgY29kZTogJ1BFTicsXG4gICAgICAgICAgICBzeW1ib2w6ICdTLycsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdTRUsnLFxuICAgICAgICAgICAgc3ltYm9sOiAnU0VLJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnUmlnaHQnLFxuICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IHRydWVcbiAgICAgICAgfSxcbiAgICBdXG5cbiAgICBwdWJsaWMgc2V0Q3VycmVuY3lUeXBlQ29uZmlnID0gKGN1cnJlbmN5VHlwZUNvbmZpZzogQ3VycmVuY3lDb25maWdbXSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbmN5VHlwZUNvbmZpZyA9IGN1cnJlbmN5VHlwZUNvbmZpZztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZWVtcGxhemEgbG9zIHZhbG9yZXMgZGUgdW5hIG1vbmVkYS5cbiAgICAgKiBAcGFyYW0gY3VycmVuY3lUeXBlRmluZCBUaXBvIGRlIGN1cnJlbmN5IHF1ZSBzZSBkZXNlYSBtb2RpZmljYXJcbiAgICAgKiBAcGFyYW0gY3VzdG9tVHlwZSBMb3MgbnVldm9zIHZhbG9yZXMuIFRvZGFzIGxhcyBrZXkgc29uIG9wY2lvbmFsZXNcbiAgICAgKiBAZXhhbXBsZSBjdXN0b21UeXBlID0geyBjb2RlOiAnQVJHJywgc3ltYm9sOiAnJCcsIHBvc2l0aW9uOiAnTGVmdCcgLCB3aXRob3V0RGVjaW1hbDogZmFsc2UgfVxuICAgICAqL1xuICAgIHB1YmxpYyByZXBsYWNlQ3VycmVuY3lUeXBlQ29uZmlnID0gKGN1cnJlbmN5VHlwZUZpbmQ6IGN1cnJlbmN5VHlwZSwgY3VzdG9tVHlwZTogQ3VycmVuY3lDb25maWcpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbmN5VHlwZSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQodHlwZSA9PiB0eXBlLmNvZGUgPT0gY3VycmVuY3lUeXBlRmluZClcbiAgICAgICAgaWYgKGN1cnJlbmN5VHlwZSkge1xuICAgICAgICAgICAgY3VycmVuY3lUeXBlLnN5bWJvbCA9IGN1c3RvbVR5cGU/LnN5bWJvbCB8fCBjdXJyZW5jeVR5cGUuc3ltYm9sXG4gICAgICAgICAgICBjdXJyZW5jeVR5cGUuY29kZSA9IGN1c3RvbVR5cGU/LmNvZGUgfHwgY3VycmVuY3lUeXBlLmNvZGVcbiAgICAgICAgICAgIGN1cnJlbmN5VHlwZS5wb3NpdGlvbiA9IGN1c3RvbVR5cGU/LnBvc2l0aW9uIHx8IGN1cnJlbmN5VHlwZS5wb3NpdGlvblxuICAgICAgICAgICAgY3VycmVuY3lUeXBlLndpdGhvdXREZWNpbWFsID0gY3VzdG9tVHlwZT8ud2l0aG91dERlY2ltYWwgfHwgY3VycmVuY3lUeXBlLndpdGhvdXREZWNpbWFsXG4gICAgICAgIH1cbiAgICAgICAgLy9SZXZlZXIgZW4gZWwgZnV0dXJvIHNpIHNlIGVtcGllemFuIGEgYWdyZWdhciBvdHJvIHRpcG9zIGRlIG1vbmVkYXNcbiAgICAgICAgLyogZWxzZXtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLnB1c2goey4uLmN1c3RvbVR5cGUgfSlcbiAgICAgICAgfSAqL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGN1cnJlbmN5VHlwZUZpbmQgRGVmaW5pciBlbCBjb2RlIGRlbCB0aXBvIGRlIG1vbmVkYSBxdWUgc2UgcXVpZXJhIHV0aWxpemFyLlxuICAgICAqIFNpIGVsIHRpcG8gZXMgQ1VTVE9NIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBzZWd1bmRvIHBhcmFtZXRybyBkb25kZSBzZSBwdWVkZSBkZWZpbmlyIGxhIHNpbWJvbG9nw61hIHkgcG9zZXNpw7NuIHF1ZSBzZSBxdWllcmEuXG4gICAgICogQHBhcmFtIGN1c3RvbVR5cGUgRm9ybWF0byBkZWwgcGFyw6FtZXRybyBlamVtcGxvIHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0wnICwgd2l0aG91dERlY2ltYWxzOiBmYWxzZSB9ICxcbiAgICAgKiB0b2RhcyBsYXMga2V5IHNvbiBvcGNpb25hbGVzIHkgcG9yIGRlZmVjdG8gc2UgdG9tYW4gbG9zIHZhbG9yZXMgZGVsIGVqZW1wbG8uXG4gICAgICogQHJldHVybnMgc2UgcmV0b3JuYSBsYSBjb25maWd1cmFjacOzbiBxdWUgc2Ugc2V0ZW8gYSBsYSBwcm9waWVkYWQgY3VycmVuY3kgZGVsIHNlcnZpY2lvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDdXJyZW5jeSA9IChjdXJyZW5jeVR5cGVGaW5kOiBjdXJyZW5jeVR5cGUsIGN1c3RvbVR5cGU/OiBDdXJyZW5jeUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbmN5ID0gdGhpcy5jdXJyZW5jeVR5cGVDb25maWcuZmluZChjdCA9PiBjdC5jb2RlID09IGN1cnJlbmN5VHlwZUZpbmQudG9VcHBlckNhc2UoKSkgfHwgdGhpcy5jdXJyZW5jeVxuICAgICAgICBjdXN0b21UeXBlICYmICh0aGlzLmN1cnJlbmN5ID0geyAuLi50aGlzLmN1cnJlbmN5LCAuLi5jdXN0b21UeXBlIH0pXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbmN5O1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIGRldnVlbHZlIHRydWUgc2kgZXhpc3RlIGVsIGVsZW1lbnRvIFwic2VhcmNoXCIgZW4gZWwgYXJyYXkgZGUgcGFyYW1ldHJvcyBcInBhcmFtc1wiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zIEFycmF5IGRlIHBhcmFtZXRyb3MgZW50cmUgbG9zIHF1ZSBidXNjYXJcbiAgICAgKiBAcGFyYW0gc2VhcmNoZWQgRWxlbWVudG8gcXVlIGJ1c2NhclxuICAgICAqIEBwYXJhbSBwcmVmaXggcHJlZmlqbyBkZWwgc3RyaW5nIGEgYnVzY2FyIChlamVtcGxvOiBcImxpbmtfXCIpXG4gICAgICogQHBhcmFtIHN1ZmZpeCBzdWZpam8gZGVsIHN0cmluZyBhIGJ1c2NhciAoZWplbXBsbzogXCJsaW5rX1wiKVxuICAgICAqIEBwYXJhbSBjYXNlc2Vuc2l0aXZlIGRldGVybWluYSBzaSBzZSBldmFsdWEgY29uIHNlbnNpYmlsaWRhZCBlbnRyZSBtYXl1c2N1bGEgeSBtaW51c2N1bGFcbiAgICAgKiBAcmV0dXJucyByZXRvcm5hIHRydWUgbyBmYWxzZSBzaSBzZSBlbmNvbnRybyBvIG5vIGVsIHBhcmFtZXRybyBlbiBlbCBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNQYXJhbXMoXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgc2VhcmNoZWQsXG4gICAgICAgIHByZWZpeCA9ICcnLFxuICAgICAgICBzdWZmaXggPSAnJyxcbiAgICAgICAgY2FzZXNlbnNpdGl2ZSA9IGZhbHNlKTogYm9vbGVhbiB7XG5cblxuICAgICAgICByZXR1cm4gY2FzZXNlbnNpdGl2ZSA/IHBhcmFtcy5maW5kKHBhcmFtID0+IChwYXJhbS5jb2RlKS50b0xvd2VyQ2FzZSgpID09IChwcmVmaXggKyBzZWFyY2hlZCArIHN1ZmZpeCkudG9Mb3dlckNhc2UoKSB8fCAocGFyYW0uY29kZSkudG9Mb3dlckNhc2UoKSA9PSAoc2VhcmNoZWQpLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICA6IHBhcmFtcy5maW5kKHBhcmFtID0+IHBhcmFtLmNvZGUgPT0gKHByZWZpeCArIHNlYXJjaGVkICsgc3VmZml4KSB8fCBwYXJhbS5jb2RlID09IHNlYXJjaGVkKVxuXG4gICAgfTtcblxuICAgIHB1YmxpYyBtb2RpZnlDaGFubmVsQ29uZmlnID0gY2hhbm5lbENvbmZpZyA9PiB7XG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnLmNoYW5uZWwgfHwgY2hhbm5lbENvbmZpZy5jb2RlKVxuICAgICAgICAgICAgdGhpcy5zZXRDaGFubmVsKGNoYW5uZWxDb25maWcuY2hhbm5lbCB8fCBjaGFubmVsQ29uZmlnLmNvZGUpXG5cbiAgICAgICAgaWYgKGNoYW5uZWxDb25maWcubG9jYWxlIHx8IGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKVxuICAgICAgICAgICAgdGhpcy5zZXRMb2NhbGUoY2hhbm5lbENvbmZpZy5sb2NhbGUgfHwgY2hhbm5lbENvbmZpZy5sb2NhbGVzLmNvZGUpXG5cbiAgICAgICAgaWYgKGNoYW5uZWxDb25maWcuY3VycmVuY3kgfHwgY2hhbm5lbENvbmZpZy5iYXNlQ3VycmVuY3kpXG4gICAgICAgICAgICB0aGlzLnNldEN1cnJlbmN5KGNoYW5uZWxDb25maWcuY3VycmVuY3kgfHwgY2hhbm5lbENvbmZpZy5iYXNlQ3VycmVuY3kpXG5cbiAgICAgICAgcmV0dXJuIGNoYW5uZWxDb25maWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciBsb3MgZmlsdHJvcyBwb3IgZGVmZWN0byBxdWUgc2UgYXBsaWNhcmFuIGVuIGxhIHNlY2Npb24gJ0NvbGxlY3Rpb24nXG4gICAgICogY3VhbmRvIHNlIGluZ3Jlc2EgYSBsYSBtaXNtYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW10gPSBbXVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHRlYSBlbCB2YWxvciBkZSBsYSB2YXJpYWJsZSBkZWZhdWxGaWx0ZXJzLlxuICAgICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRGaWx0ZXJzID0gKGZpbHRlcnM6IERlZmF1bHRGaWx0ZXJbXSkgPT4ge1xuICAgICAgICB0aGlzLmRlZmF1bHRGaWx0ZXJzID0gZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVmYXVsdEZpbHRlcnMgPSAoKTogRGVmYXVsdEZpbHRlcltdID0+IHRoaXMuZGVmYXVsdEZpbHRlcnNcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciB0YW50byBsb3MgZmlsdHJvcyBwb3IgZGVmZWN0b3MgcXVlIHlhIHNlcmFuIGFwbGljYWRvcywgY29tbyB0YW1iaWVuXG4gICAgICogbG9zIGZpbHRyb3MgcXVlIHNlIG1vc3RyYXJhbiBlbiBsYSBzZWNjaW9uIGNvbGxlY3Rpb24sIHN1IG9yZGVuLCBldGMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJDb25maWc6IEZpbHRlckNvbmZpZyA9IHtcbiAgICAgICAgZGVmYXVsdEZpbHRlcnM6IFtdLFxuICAgICAgICBmaWx0ZXJzOiBbJ2NhdGVnb3J5JywgJ2F0dHJpYnV0ZXMnLCAnZHluYW1pY3MnLCAncHJpY2VfcmFuZ2UnXVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWx0ZXJDb25maWcgPSAoZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWcpID0+IHtcbiAgICAgICAgZmlsdGVyQ29uZmlnLmRlZmF1bHRGaWx0ZXJzID8gdGhpcy5maWx0ZXJDb25maWcuZGVmYXVsdEZpbHRlcnMgPSBmaWx0ZXJDb25maWcuZGVmYXVsdEZpbHRlcnMgOiBudWxsXG4gICAgICAgIGZpbHRlckNvbmZpZy5maWx0ZXJzID8gdGhpcy5maWx0ZXJDb25maWcuZmlsdGVycyA9IGZpbHRlckNvbmZpZy5maWx0ZXJzIDogbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXJDb25maWcgPSAoKSA9PiB0aGlzLmZpbHRlckNvbmZpZy5maWx0ZXJzXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gY29udGllbmUgdW4gYXJyZWdsbyBkZSBzdHJpbmcgY3V5byBjb250ZW5pZG8gc29uIGxvcyBjb2RpZ29zIGRlIGxvcyBwYWlzZXMuXG4gICAgICogQGV4YW1wbGUgWydBUicsJ0VTJywnR0InXVxuICAgICAqL1xuICAgIHByaXZhdGUgY291bnRyaWVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgZGViZSBjb250ZW5lciBsb3MgY29kaWdvcyBkZSBsb3MgcGFpc2VzIHF1ZSBzZSBxdWllcmUgbW9zdHJhclxuICAgICAqIEBleGFtcGxlIFsnQVInLCdFUycsJ0dCJ11cbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDb3VudHJpZXMgPSAoY291bnRyaWVzOiBzdHJpbmdbXSkgPT4gdGhpcy5jb3VudHJpZXMgPSBjb3VudHJpZXM7XG5cbiAgICBwdWJsaWMgZ2V0Q291bnRyaWVzID0gKCkgPT4gdGhpcy5jb3VudHJpZXM7XG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBlc3RhIHZhcmlhYmxlIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIGxvcyBwYXJhbWV0cm9zIGN1YW5kbyBzZSBkZXNlYSBtb3N0cmFyXG4gICAgICogdmFyaWFudGVzIGVsIGxpc3RhZG8gZGUgcHJvZHVjdG9zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfXR5cGUgdGlwbyBkZSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9Y29kZSBjb2RpZ28gZGUgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn1kZWZhdWx0Rmlyc3RPcHRpb24gYHRydWVgIHRvbWEgZWwgcHJpbWVyIG9wdGlvbiBkZWwgcHJvZHVjdG8gZW4gZ2VuZXJhbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn1jaGVja0lmU3RvY2sgYHRydWVgIHNlIHJlYWxpemEgdW4gY2hlcXVlbyBkZSBzaSBsYSB2YXJpYW50ZSB0aWVuZSBzdG9jayBwYXJhIG1vc3RyYXJsYVxuICAgICAqIEBleGFtcGxlICBgYGBqYXZhc2NyaXB0XG4gICAgICoge1xuICAgICAgICB0eXBlOiAnY29sb3InLFxuICAgICAgICBjb2RlOiAnY29sb3InLFxuICAgICAgICBkZWZhdWx0Rmlyc3RPcHRpb246IGZhbHNlICxcbiAgICAgICAgY2hlY2tJZlN0b2NrOnRydWVcbiAgICAgICAgfSBgYGBcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQ6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG4gICAgICAgIHR5cGU6ICdjb2xvcicsXG4gICAgICAgIGNvZGU6ICdjb2xvcicsXG4gICAgICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogZmFsc2UsXG4gICAgICAgIGNoZWNrSWZTdG9jazogdHJ1ZVxuICAgIH1cblxuICAgIHNldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAodmFsdWU6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcbiAgICAgICAgdGhpcy5wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0ge1xuICAgICAgICAgICAgLi4udGhpcy5wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50LFxuICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAoKSA9PiB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnRcblxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHF1ZSBmaWx0cm9zIGRlbCB0aXBvIGBTb3J0RmlsdGVyYCBzZSBxdWllcmUgbW9zdHJhciBlbiBsYSB2aXN0YS5cbiAgICAgKiBTZSB1c2FuIGxvcyBjb2RpZ28gZGUgbG9zIGZpbHRyb3MgcGFyYSBpbmRpY2FyIGN1YWxlcyBzZSBkZWJlbiBtb3N0cmFyLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydEZpbHRlcnM6IHN0cmluZ1tdID0gWydwcmljZScsICdvcmRlci1hbHBoJywgJ3JlY2VudCddXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJzQ29kZSBhcnJlZ2xvIGRlIHN0cmluZ3MgY29uIGxvcyBjb2RpZ29zIGRlIGxvcyBmaWx0cm9zLlxuICAgICAqIFNpIHNlIGxlIHBhc2EgZWwgcGFyYW1ldHJvICoqYWxsKiogZXN0ZSBtb3N0cmFyYSB0b2Rvcy5cbiAgICAgKiBAZXhhbXBsZSBwcmljZSB8IG9yZGVyLWFscGggfCByZWNlbnQgfCB1cGRhdGUgfCBhbGxcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHNldFNvcnRGaWx0ZXJzID0gKGZpbHRlcnNDb2RlOiBzdHJpbmdbXSA9IFsnYWxsJ10pID0+IHRoaXMuc29ydEZpbHRlcnMgPSBmaWx0ZXJzQ29kZTtcblxuICAgIGdldFNvcnRGaWx0ZXJzID0gKCkgPT4gdGhpcy5zb3J0RmlsdGVycztcblxuICAgIHByaXZhdGUgcG9zdGFsQ29kZVBhdHRlcm5zOiB7IFtrZXk6IHN0cmluZ106IHsgcGF0dGVybjogUmVnRXhwLCBlcnJvcktleTogc3RyaW5nIH0gfSA9IHtcbiAgICAgICAgJ0FSJzogeyBwYXR0ZXJuOiAvXlswLTldezR9JC8sIGVycm9yS2V5OiBcInBvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuYXJcIiB9LFxuICAgICAgICAnVVknOiB7IHBhdHRlcm46IC9eWzAtOV17NX0kLywgZXJyb3JLZXk6IFwicG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvci51eVwiIH0sXG4gICAgICAgICdHQic6IHsgcGF0dGVybjogL15bQS1aXXsxLDJ9WzAtOV1bQS1aMC05XT9cXHM/WzAtOV1bQS1aXXsyfSQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLmdiXCIgfSxcbiAgICAgICAgJ0VTJzogeyBwYXR0ZXJuOiAvXig/OjBbMS05XXxbMS00XVxcZHw1WzAtMl0pXFxkezN9JC8sIGVycm9yS2V5OiBcInBvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZXNcIiB9LFxuICAgICAgICAnQlInOiB7IHBhdHRlcm46IC9eWzAtOV17NX0tWzAtOV17M30kLywgZXJyb3JLZXk6IFwicG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvci5iclwiIH0sXG4gICAgICAgICdGUic6IHsgcGF0dGVybjogL15bMC05XXs1fSQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLmZyXCIgfSxcbiAgICAgICAgJ1BUJzogeyBwYXR0ZXJuOiAvXlswLTldezR9LVswLTldezN9JC8sIGVycm9yS2V5OiBcInBvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IucHRcIiB9LFxuICAgIH07XG5cbiAgICBnZXRQb3N0YWxDb2RlUGF0dGVybihjb3VudHJ5Q29kZTogc3RyaW5nKTogeyBwYXR0ZXJuOiBSZWdFeHAsIGVycm9yS2V5OiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RhbENvZGVQYXR0ZXJuc1tjb3VudHJ5Q29kZV0gfHwgeyBwYXR0ZXJuOiAvXltBLVphLXowLTlcXHNcXC1dKyQvLCBlcnJvcktleTogXCJwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yLmRlZmF1bHRcIiB9O1xuICAgIH1cbn1cblxuIl19