ng-easycommerce 0.0.601 → 0.0.602

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 (592) hide show
  1. package/README.md +938 -936
  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 +516 -516
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +290 -290
  10. package/assets/ec-i18n/en.json +0 -0
  11. package/assets/ec-i18n/es.json +400 -400
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +290 -290
  14. package/assets/ec-i18n/pr.json +290 -290
  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 +19404 -19391
  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 +14 -14
  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 +119 -119
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +196 -196
  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 +166 -166
  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 +138 -138
  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 +398 -398
  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 +88 -88
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +127 -127
  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 +65 -65
  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 +80 -80
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +191 -191
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +241 -241
  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 +168 -168
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +133 -133
  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 +127 -127
  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/price-ec/price-ec.component.js +44 -44
  123. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  124. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  125. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  129. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  130. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  131. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  132. package/esm2015/lib/ec-directive/index.js +36 -36
  133. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  134. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  135. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  136. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  137. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  138. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/index.js +13 -13
  141. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  142. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  143. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  144. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  145. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  146. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  147. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  148. package/esm2015/lib/interfaces/Script.js +1 -1
  149. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  153. package/esm2015/lib/interfaces/block.js +1 -1
  154. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  155. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  156. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  157. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  158. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  159. package/esm2015/lib/interfaces/cookies.js +1 -1
  160. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  161. package/esm2015/lib/interfaces/coupon.js +1 -1
  162. package/esm2015/lib/interfaces/deserializable.js +1 -1
  163. package/esm2015/lib/interfaces/faqs.js +1 -1
  164. package/esm2015/lib/interfaces/filter.js +1 -1
  165. package/esm2015/lib/interfaces/filterStep.js +1 -1
  166. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  167. package/esm2015/lib/interfaces/paginate.js +1 -1
  168. package/esm2015/lib/interfaces/parameters.js +1 -1
  169. package/esm2015/lib/interfaces/selection.js +4 -4
  170. package/esm2015/lib/interfaces/step.js +1 -1
  171. package/esm2015/lib/interfaces/store.js +1 -1
  172. package/esm2015/lib/ng-easycommerce.module.js +179 -179
  173. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  174. package/esm2015/lib/services/account/orders.service.js +102 -102
  175. package/esm2015/lib/services/analytics.service.js +57 -57
  176. package/esm2015/lib/services/auth.service.js +352 -339
  177. package/esm2015/lib/services/banner.service.js +72 -72
  178. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  179. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  180. package/esm2015/lib/services/captcha.service.js +130 -130
  181. package/esm2015/lib/services/cart.service.js +571 -571
  182. package/esm2015/lib/services/channel-config.service.js +105 -105
  183. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  184. package/esm2015/lib/services/checkout/checkout.service.js +233 -233
  185. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  186. package/esm2015/lib/services/checkout/payment.service.js +77 -77
  187. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  188. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  189. package/esm2015/lib/services/cookies.service.js +208 -208
  190. package/esm2015/lib/services/currency.service.js +161 -161
  191. package/esm2015/lib/services/dataform.service.js +46 -46
  192. package/esm2015/lib/services/filters.service.js +122 -122
  193. package/esm2015/lib/services/gift-card.service.js +61 -61
  194. package/esm2015/lib/services/ip-address.service.js +34 -34
  195. package/esm2015/lib/services/options.service.js +275 -275
  196. package/esm2015/lib/services/pagination.service.js +73 -73
  197. package/esm2015/lib/services/parameters.service.js +72 -72
  198. package/esm2015/lib/services/products/product-detail.service.js +429 -429
  199. package/esm2015/lib/services/products/products.service.js +287 -287
  200. package/esm2015/lib/services/reviews.service.js +107 -107
  201. package/esm2015/lib/services/stores.service.js +37 -37
  202. package/esm2015/lib/services/windows.service.js +52 -52
  203. package/esm2015/lib/services/wishlist.service.js +70 -70
  204. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  205. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  206. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  207. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  208. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  209. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  210. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  211. package/esm2015/lib/utils/order-util.service.js +72 -72
  212. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  213. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  214. package/esm2015/lib/utils/toast.service.js +42 -42
  215. package/esm2015/lib/utils/utils.service.js +20 -20
  216. package/esm2015/ng-easycommerce.js +33 -33
  217. package/esm2015/public-api.js +146 -146
  218. package/esm5/lib/api/connection.service.js +90 -90
  219. package/esm5/lib/classes/checkout/step-service.js +74 -74
  220. package/esm5/lib/classes/checkout/step.js +25 -25
  221. package/esm5/lib/classes/checkout-process-state.js +2 -2
  222. package/esm5/lib/classes/component-helper.js +18 -18
  223. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  224. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  225. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  226. package/esm5/lib/classes/filters/Filter.js +78 -78
  227. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  228. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  229. package/esm5/lib/classes/user-role-type.js +1 -1
  230. package/esm5/lib/classes/user.js +120 -120
  231. package/esm5/lib/core.consts.js +434 -434
  232. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  233. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +173 -173
  234. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +213 -213
  235. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  236. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  237. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  238. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  239. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +183 -183
  240. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +182 -182
  241. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  242. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +166 -166
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  244. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  245. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  246. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  247. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  248. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  249. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  250. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  251. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +482 -482
  252. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +169 -169
  253. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +509 -509
  254. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +105 -105
  255. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +217 -217
  256. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  257. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  258. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +82 -82
  259. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  260. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  261. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  262. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  263. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  264. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  265. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  267. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  268. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  269. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  270. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  271. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +109 -109
  272. package/esm5/lib/ec-component/header-ec/header-ec.component.js +250 -250
  273. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  274. package/esm5/lib/ec-component/index.js +241 -241
  275. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  276. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  277. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  278. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +195 -195
  279. package/esm5/lib/ec-component/product-ec/product-ec.component.js +151 -151
  280. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  281. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  282. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  283. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  284. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  285. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  286. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +130 -130
  287. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  288. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  289. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  290. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  291. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  292. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  293. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  294. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  295. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  296. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  297. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  298. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  299. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  300. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  302. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  303. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  304. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +60 -60
  305. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  306. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  307. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  308. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  309. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  310. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  311. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  312. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  313. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  314. package/esm5/lib/ec-directive/index.js +36 -36
  315. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  316. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  317. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  318. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  319. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  320. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  321. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  322. package/esm5/lib/ec-pipe/index.js +13 -13
  323. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  324. package/esm5/lib/guards/auth-guard.service.js +37 -37
  325. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  326. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  327. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  328. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  329. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  330. package/esm5/lib/interfaces/Script.js +1 -1
  331. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  332. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  333. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  334. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  335. package/esm5/lib/interfaces/block.js +1 -1
  336. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  337. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  338. package/esm5/lib/interfaces/checkout-data.js +1 -1
  339. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  340. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  341. package/esm5/lib/interfaces/cookies.js +1 -1
  342. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  343. package/esm5/lib/interfaces/coupon.js +1 -1
  344. package/esm5/lib/interfaces/deserializable.js +1 -1
  345. package/esm5/lib/interfaces/faqs.js +1 -1
  346. package/esm5/lib/interfaces/filter.js +1 -1
  347. package/esm5/lib/interfaces/filterStep.js +1 -1
  348. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  349. package/esm5/lib/interfaces/paginate.js +1 -1
  350. package/esm5/lib/interfaces/parameters.js +1 -1
  351. package/esm5/lib/interfaces/selection.js +4 -4
  352. package/esm5/lib/interfaces/step.js +1 -1
  353. package/esm5/lib/interfaces/store.js +1 -1
  354. package/esm5/lib/ng-easycommerce.module.js +183 -183
  355. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  356. package/esm5/lib/services/account/orders.service.js +120 -120
  357. package/esm5/lib/services/analytics.service.js +60 -60
  358. package/esm5/lib/services/auth.service.js +426 -413
  359. package/esm5/lib/services/banner.service.js +81 -81
  360. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  361. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  362. package/esm5/lib/services/captcha.service.js +132 -132
  363. package/esm5/lib/services/cart.service.js +700 -700
  364. package/esm5/lib/services/channel-config.service.js +107 -107
  365. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  366. package/esm5/lib/services/checkout/checkout.service.js +316 -316
  367. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  368. package/esm5/lib/services/checkout/payment.service.js +125 -125
  369. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  370. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  371. package/esm5/lib/services/cookies.service.js +222 -222
  372. package/esm5/lib/services/currency.service.js +205 -205
  373. package/esm5/lib/services/dataform.service.js +48 -48
  374. package/esm5/lib/services/filters.service.js +125 -125
  375. package/esm5/lib/services/gift-card.service.js +63 -63
  376. package/esm5/lib/services/ip-address.service.js +35 -35
  377. package/esm5/lib/services/options.service.js +376 -376
  378. package/esm5/lib/services/pagination.service.js +79 -79
  379. package/esm5/lib/services/parameters.service.js +74 -74
  380. package/esm5/lib/services/products/product-detail.service.js +494 -494
  381. package/esm5/lib/services/products/products.service.js +345 -345
  382. package/esm5/lib/services/reviews.service.js +116 -116
  383. package/esm5/lib/services/stores.service.js +39 -39
  384. package/esm5/lib/services/windows.service.js +79 -79
  385. package/esm5/lib/services/wishlist.service.js +71 -71
  386. package/esm5/lib/strategies/standard.strategy.js +44 -44
  387. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  388. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  389. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  390. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  391. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  392. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  393. package/esm5/lib/utils/order-util.service.js +75 -75
  394. package/esm5/lib/utils/payment-utils.service.js +37 -37
  395. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  396. package/esm5/lib/utils/toast.service.js +61 -61
  397. package/esm5/lib/utils/utils.service.js +22 -22
  398. package/esm5/ng-easycommerce.js +33 -33
  399. package/esm5/public-api.js +146 -146
  400. package/fesm2015/ng-easycommerce.js +16415 -16402
  401. package/fesm2015/ng-easycommerce.js.map +1 -1
  402. package/fesm5/ng-easycommerce.js +19408 -19395
  403. package/fesm5/ng-easycommerce.js.map +1 -1
  404. package/lib/api/connection.service.d.ts +28 -28
  405. package/lib/classes/checkout/step-service.d.ts +28 -28
  406. package/lib/classes/checkout/step.d.ts +14 -14
  407. package/lib/classes/checkout-process-state.d.ts +12 -12
  408. package/lib/classes/component-helper.d.ts +8 -8
  409. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  410. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  411. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  412. package/lib/classes/filters/Filter.d.ts +19 -19
  413. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  414. package/lib/classes/filters/SortFilter.d.ts +15 -15
  415. package/lib/classes/user-role-type.d.ts +5 -5
  416. package/lib/classes/user.d.ts +68 -68
  417. package/lib/core.consts.d.ts +216 -216
  418. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  419. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +34 -34
  420. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +85 -85
  421. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  422. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  423. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  424. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  425. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  426. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  427. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  428. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  429. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  430. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  432. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  433. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  434. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  435. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  436. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  437. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +57 -57
  438. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +43 -43
  439. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +100 -100
  440. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +24 -24
  441. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +51 -51
  442. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  443. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  444. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +32 -32
  445. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  446. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  447. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  448. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  449. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  450. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  451. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  452. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  453. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  454. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  455. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  456. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  457. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  458. package/lib/ec-component/header-ec/header-ec.component.d.ts +66 -66
  459. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  460. package/lib/ec-component/index.d.ts +80 -80
  461. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  462. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  463. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  464. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +59 -59
  465. package/lib/ec-component/product-ec/product-ec.component.d.ts +49 -49
  466. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  467. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  468. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  469. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  470. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  471. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  472. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +27 -27
  473. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  474. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  475. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  476. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  477. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  478. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  479. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  480. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  481. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  482. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  483. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  484. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  485. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  486. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  487. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  488. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  489. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  490. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +12 -12
  491. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  492. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  493. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  494. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  495. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  496. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  497. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  498. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  499. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  500. package/lib/ec-directive/index.d.ts +6 -6
  501. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  502. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  503. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  504. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  505. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  506. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  507. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  508. package/lib/ec-pipe/index.d.ts +4 -4
  509. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  510. package/lib/guards/auth-guard.service.d.ts +8 -8
  511. package/lib/guards/checkout-ready.service.d.ts +8 -8
  512. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  513. package/lib/guards/user-role-guard.service.d.ts +8 -8
  514. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  515. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  516. package/lib/interfaces/Script.d.ts +5 -5
  517. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  518. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  519. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  520. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  521. package/lib/interfaces/block.d.ts +33 -33
  522. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  523. package/lib/interfaces/cart-item.d.ts +8 -8
  524. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  525. package/lib/interfaces/checkout-data.d.ts +6 -6
  526. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  527. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  528. package/lib/interfaces/cookies.d.ts +49 -49
  529. package/lib/interfaces/core.interfaces.d.ts +4 -4
  530. package/lib/interfaces/coupon.d.ts +5 -5
  531. package/lib/interfaces/currencyConfig.d.ts +10 -10
  532. package/lib/interfaces/deserializable.d.ts +3 -3
  533. package/lib/interfaces/faqs.d.ts +12 -12
  534. package/lib/interfaces/filter.d.ts +51 -51
  535. package/lib/interfaces/filterStep.d.ts +29 -29
  536. package/lib/interfaces/navbar-items.d.ts +9 -9
  537. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  538. package/lib/interfaces/paginate.d.ts +1 -1
  539. package/lib/interfaces/parameters.d.ts +10 -10
  540. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  541. package/lib/interfaces/product.d.ts +46 -46
  542. package/lib/interfaces/selection.d.ts +10 -10
  543. package/lib/interfaces/step.d.ts +8 -8
  544. package/lib/interfaces/store.d.ts +17 -17
  545. package/lib/ng-easycommerce.module.d.ts +5 -5
  546. package/lib/pipes/order-by.pipe.d.ts +5 -5
  547. package/lib/services/account/orders.service.d.ts +29 -29
  548. package/lib/services/analytics.service.d.ts +21 -21
  549. package/lib/services/auth.service.d.ts +116 -116
  550. package/lib/services/banner.service.d.ts +26 -26
  551. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  552. package/lib/services/blocks/blocks.service.d.ts +25 -25
  553. package/lib/services/captcha.service.d.ts +76 -76
  554. package/lib/services/cart.service.d.ts +139 -139
  555. package/lib/services/channel-config.service.d.ts +35 -35
  556. package/lib/services/checkout/addressing.service.d.ts +239 -239
  557. package/lib/services/checkout/checkout.service.d.ts +71 -71
  558. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  559. package/lib/services/checkout/payment.service.d.ts +32 -32
  560. package/lib/services/checkout/shipment.service.d.ts +58 -58
  561. package/lib/services/concatenated-associations.service.d.ts +57 -57
  562. package/lib/services/cookies.service.d.ts +66 -66
  563. package/lib/services/currency.service.d.ts +65 -65
  564. package/lib/services/dataform.service.d.ts +13 -13
  565. package/lib/services/filters.service.d.ts +48 -48
  566. package/lib/services/gift-card.service.d.ts +19 -19
  567. package/lib/services/ip-address.service.d.ts +10 -10
  568. package/lib/services/options.service.d.ts +61 -61
  569. package/lib/services/pagination.service.d.ts +30 -30
  570. package/lib/services/parameters.service.d.ts +18 -18
  571. package/lib/services/products/product-detail.service.d.ts +115 -115
  572. package/lib/services/products/products.service.d.ts +101 -101
  573. package/lib/services/reviews.service.d.ts +71 -71
  574. package/lib/services/stores.service.d.ts +11 -11
  575. package/lib/services/windows.service.d.ts +13 -13
  576. package/lib/services/wishlist.service.d.ts +13 -13
  577. package/lib/strategies/standard.strategy.d.ts +12 -12
  578. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  579. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  580. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  581. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  582. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  583. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  584. package/lib/utils/order-util.service.d.ts +12 -12
  585. package/lib/utils/payment-utils.service.d.ts +5 -5
  586. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  587. package/lib/utils/toast.service.d.ts +15 -15
  588. package/lib/utils/utils.service.d.ts +4 -4
  589. package/ng-easycommerce.d.ts +33 -33
  590. package/ng-easycommerce.metadata.json +1 -1
  591. package/package.json +1 -1
  592. package/public-api.d.ts +144 -144
@@ -1,494 +1,494 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
- return new (P || (P = Promise))(function (resolve, reject) {
21
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
- step((generator = generator.apply(thisArg, _arguments || [])).next());
25
- });
26
- };
27
- var __generator = (this && this.__generator) || function (thisArg, body) {
28
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
29
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
- function verb(n) { return function (v) { return step([n, v]); }; }
31
- function step(op) {
32
- if (f) throw new TypeError("Generator is already executing.");
33
- while (_) try {
34
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
- if (y = 0, t) op = [op[0] & 2, t.value];
36
- switch (op[0]) {
37
- case 0: case 1: t = op; break;
38
- case 4: _.label++; return { value: op[1], done: false };
39
- case 5: _.label++; y = op[1]; op = [0]; continue;
40
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
- default:
42
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
- if (t[2]) _.ops.pop();
47
- _.trys.pop(); continue;
48
- }
49
- op = body.call(thisArg, _);
50
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
- }
53
- };
54
- import { Injectable } from '@angular/core';
55
- import { BehaviorSubject } from 'rxjs';
56
- import { ProductsService } from './products.service';
57
- import { CartService } from '../cart.service';
58
- import { ToastService } from '../../utils/toast.service';
59
- import { Constants } from '../../core.consts';
60
- import _ from "lodash";
61
- import { AnalyticsService } from '../analytics.service';
62
- import { CurrencyService } from '../currency.service';
63
- var ProductDetailService = /** @class */ (function () {
64
- function ProductDetailService(productsService, cartService, toastrService, constants, analyticsService, currencyService) {
65
- var _this = this;
66
- this.productsService = productsService;
67
- this.cartService = cartService;
68
- this.toastrService = toastrService;
69
- this.constants = constants;
70
- this.analyticsService = analyticsService;
71
- this.currencyService = currencyService;
72
- this.productSubject = new BehaviorSubject({});
73
- this.optionsSubject = new BehaviorSubject({});
74
- this.asociatedDataSubject = new BehaviorSubject({ price: '', stock: 0, picture: '' });
75
- this.variants = [];
76
- this.product$ = this.productSubject.asObservable();
77
- this.options$ = this.optionsSubject.asObservable();
78
- this.asociatedData$ = this.asociatedDataSubject.asObservable();
79
- /**
80
- * @param code Identificador del producto
81
- * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
82
- *
83
- * Carga el producto solicitado asyncronicamente sin respuesta
84
- */
85
- this.loadProduct = function (code, variant) {
86
- if (variant === void 0) { variant = false; }
87
- return _this.productsService.getSpecificProduct(code, variant).toPromise().then(function (res) { return variant ? _this.initialize(res, code) : _this.initialize(res); }, function (err) { return _this.productSubject.next(null); });
88
- };
89
- /**
90
- * @param product_id Identificador del producto
91
- * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
92
- * @async
93
- *
94
- * A diferencia del metodo loadProduct, este retorna un valor cuando termina
95
- */
96
- this.getProduct = function (product_id, variant) {
97
- if (variant === void 0) { variant = false; }
98
- return __awaiter(_this, void 0, void 0, function () {
99
- var result;
100
- return __generator(this, function (_a) {
101
- switch (_a.label) {
102
- case 0: return [4 /*yield*/, this.productsService.getSpecificProduct(product_id, variant).toPromise()];
103
- case 1:
104
- result = _a.sent();
105
- if (!result || result.error)
106
- this.productSubject.next(null);
107
- else
108
- variant ? this.initialize(result, product_id) : this.initialize(result);
109
- return [2 /*return*/, true];
110
- }
111
- });
112
- });
113
- };
114
- this.initialize = function (product, variant_code) {
115
- _this.productSubject.next(product);
116
- _this.optionsSubject.next(_this.getOptions());
117
- variant_code ? _this.updateVariants(variant_code) : _this.updateVariants();
118
- _this.variants.length && _this.generateAsociatedDataFromVariants();
119
- _this.fetchCartData();
120
- //this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
121
- // variant_code && this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
122
- };
123
- this.setProduct = function (product) { return _this.isProductValid(product) && _this.initialize(product); };
124
- this.isReady = function () { return _this.variants.length == 1; };
125
- this.setOption = function (option_code, option_value) {
126
- var options = _this.optionsSubject.value;
127
- var option = options.find(function (element) { return element.code == option_code; }).values.find(function (value) { return value.name == option_value; });
128
- option.selected = !option.selected;
129
- options.find(function (element) { return element.code == option_code; }).values.forEach(function (value) { if (value.name != option.name)
130
- value.selected = false; });
131
- _this.optionsSubject.next(options);
132
- _this.updateVariants();
133
- if (_this.variants.length > 0) {
134
- // Habilitar todos los botones con la clase 'addCartButton'
135
- var submitButtons = document.querySelectorAll('.addCartButton');
136
- submitButtons.forEach(function (button) {
137
- button.disabled = false;
138
- });
139
- _this.generateAsociatedDataFromVariants();
140
- }
141
- else {
142
- _this.toastrService.show('selection-not-available');
143
- // Deshabilitar todos los botones con la clase 'submit-button'
144
- var submitButtons = document.querySelectorAll('.addCartButton');
145
- submitButtons.forEach(function (button) {
146
- button.disabled = true;
147
- });
148
- }
149
- };
150
- this.changePicture = function (picture) {
151
- var data = _this.asociatedDataSubject.value;
152
- data.picture = picture;
153
- _this.asociatedDataSubject.next(data);
154
- };
155
- this.handleError = function (error) {
156
- // Whathever we need to do with error
157
- };
158
- this.addToCartPromise = function (quantity) { return __awaiter(_this, void 0, void 0, function () {
159
- var product_selected, result;
160
- return __generator(this, function (_a) {
161
- switch (_a.label) {
162
- case 0:
163
- quantity = parseInt(quantity);
164
- if (!this.variants.length) {
165
- return [2 /*return*/, { error: true, message: 'cant-buy' }];
166
- }
167
- product_selected = _.clone(this.productSubject.value);
168
- if (this.variants.length > 1 || this.variants.length == 0 || this.asociatedDataSubject.value.stock == 0) {
169
- if (this.variants.length == 0)
170
- return [2 /*return*/, { error: true, message: 'no-variants' }];
171
- else if (this.variants.length > 1 && this.asociatedDataSubject.value.stock > 0)
172
- return [2 /*return*/, { error: true, message: 'variants-left' }];
173
- else if (this.variants.length != 0 && this.asociatedDataSubject.value.stock == 0)
174
- return [2 /*return*/, { error: true, message: 'out-of-stock' }];
175
- }
176
- if (!this.validateQuantity(quantity))
177
- return [2 /*return*/];
178
- return [4 /*yield*/, this.cartService.addToCartPromise(this.makeAffordableProduct(product_selected), quantity, this.variants[0].code)];
179
- case 1:
180
- result = _a.sent();
181
- return [2 /*return*/, (result && !(result.error))];
182
- }
183
- });
184
- }); };
185
- this.getOptions = function (product_received) {
186
- var product = product_received || _this.productSubject.value;
187
- var options = [];
188
- product.options.forEach(function (element) {
189
- options.push(_this.toOption(element));
190
- });
191
- return options;
192
- };
193
- this.toOption = function (preoption) {
194
- return {
195
- name: preoption.label,
196
- code: preoption.code,
197
- type: preoption.type,
198
- values: preoption.values.map(function (value) { return ({ name: value.code, description: value.name, image: value.image, mobileImage: value.mobileImage, selected: false }); })
199
- };
200
- };
201
- this.updateVariants = function (code) {
202
- var variants = _this.productSubject.value.variants;
203
- if (!code) {
204
- _this.optionsSubject.value.forEach(function (option) {
205
- option.values.forEach(function (value) {
206
- if (value.selected) {
207
- variants = variants.filter(function (variant) {
208
- return variant.options.some(function (variant_option) {
209
- return (option.code in variant_option && variant_option[option.code] == value.name);
210
- });
211
- });
212
- }
213
- });
214
- });
215
- }
216
- else {
217
- variants = variants.filter(function (variant) { return variant.code == code; });
218
- }
219
- _this.variants = variants;
220
- code && _this.updateOptions();
221
- };
222
- this.updateOptions = function () {
223
- var options = (_this.variants.length && _this.variants[0]).options;
224
- options && options.forEach(function (option) { return Object.keys(option).forEach(function (key) { return _this.setOption(key, option[key]); }); });
225
- };
226
- this.generateAsociatedDataFromVariants = function () {
227
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
228
- var asociated = {};
229
- if (_this.isReady()) {
230
- asociated.stock = _this.variants[0].stock;
231
- asociated.price = _this.variants[0].price.toString();
232
- asociated.saleprice = _this.variants[0].saleprice && _this.variants[0].saleprice.toString() || undefined;
233
- asociated.discount = ((_a = _this.variants[0]) === null || _a === void 0 ? void 0 : _a.discount) || undefined;
234
- asociated.properties = _this.variants[0].properties ? _this.beautifyProperties(_this.variants[0].properties) : undefined;
235
- asociated.uniqueExternalCode = ((_b = _this.variants[0]) === null || _b === void 0 ? void 0 : _b.uniqueExternalCode) || undefined;
236
- asociated.multipleQuantity = ((_c = _this.variants[0]) === null || _c === void 0 ? void 0 : _c.multipleQuantity) || undefined;
237
- }
238
- else {
239
- asociated.price = _this.cratePrice();
240
- asociated.saleprice = _this.crateSalePrice();
241
- asociated.stock = (_this.variants.map(function (variant) { return variant.stock; })).reduce(function (a, b) { return a + b; });
242
- asociated.discount = _this.crateDiscount();
243
- }
244
- ('images' in _this.variants[0] && _this.variants[0].images.length > 0)
245
- ? asociated.picture = _this.variants[0].images[0]
246
- : asociated.picture = (_this.asociatedDataSubject.value.picture || _this.productSubject.value.picturesdefault[0]);
247
- asociated.maximumAmount = ((_d = _this.variants[0]) === null || _d === void 0 ? void 0 : _d.maximumAmount) || 0;
248
- asociated.minimumAmount = ((_e = _this.variants[0]) === null || _e === void 0 ? void 0 : _e.minimumAmount) || 0;
249
- asociated.maximumItemsQuantity = ((_f = _this.variants[0]) === null || _f === void 0 ? void 0 : _f.stock) > 0 && 'maximumItemsQuantity' in _this.variants[0] ? (_g = _this.variants[0]) === null || _g === void 0 ? void 0 : _g.maximumItemsQuantity : (_h = _this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock;
250
- asociated.minimumItemsQuantity = ((_j = _this.variants[0]) === null || _j === void 0 ? void 0 : _j.stock) > 0 && 'minimumItemsQuantity' in _this.variants[0]
251
- && ((_k = _this.variants[0]) === null || _k === void 0 ? void 0 : _k.minimumItemsQuantity) > 0 ? (_l = _this.variants[0]) === null || _l === void 0 ? void 0 : _l.minimumItemsQuantity : (((_m = _this.variants[0]) === null || _m === void 0 ? void 0 : _m.multipleQuantity) ? (_o = _this.variants[0]) === null || _o === void 0 ? void 0 : _o.multipleQuantity : 1);
252
- asociated.finalConsumer = {
253
- finalConsumerPrice: (_p = _this.variants[0]) === null || _p === void 0 ? void 0 : _p.final_consumer_price,
254
- originalFinalConsumerPrice: (_q = _this.variants[0]) === null || _q === void 0 ? void 0 : _q.original_final_consumer_price,
255
- };
256
- asociated.taxes = {
257
- taxIncluded: (_r = _this.variants[0]) === null || _r === void 0 ? void 0 : _r.taxIncluded,
258
- taxCategory: (_s = _this.variants[0]) === null || _s === void 0 ? void 0 : _s.taxCategory,
259
- };
260
- _this.asociatedDataSubject.next(asociated);
261
- };
262
- /**
263
- * @description Recibe las propiedades de una variante y por cada item arma un objeto con
264
- * el name=clave y value=valor de ese item.
265
- * @param properties
266
- * @returns Un arreglo con las propiedades de la forma { name = ... , value = ...}
267
- */
268
- this.beautifyProperties = function (properties) {
269
- var beautifyData = [];
270
- properties.forEach(function (prop) {
271
- for (var key in prop) {
272
- beautifyData.push({ name: key, value: prop[key] });
273
- }
274
- });
275
- return beautifyData;
276
- };
277
- this.crateDiscount = function () {
278
- try {
279
- var all_discount_1 = '';
280
- _this.variants.forEach(function (variant) {
281
- variant.discount && (all_discount_1 = all_discount_1 + ', ' + variant.discount);
282
- });
283
- if (all_discount_1 == '') {
284
- return undefined;
285
- }
286
- return all_discount_1;
287
- }
288
- catch (error) {
289
- return undefined;
290
- }
291
- };
292
- this.cratePrice = function () {
293
- var min_price = 0;
294
- var max_price = 0;
295
- var all_prices = [];
296
- _this.variants.forEach(function (variant) {
297
- all_prices.push(variant.price);
298
- });
299
- min_price = all_prices.reduce(function (a, b) { return Math.min(a, b); });
300
- max_price = all_prices.reduce(function (a, b) { return Math.max(a, b); }, 0);
301
- return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
302
- };
303
- this.crateSalePrice = function () {
304
- var min_price = 0;
305
- var max_price = 0;
306
- var all_prices = [];
307
- _this.variants.forEach(function (variant) {
308
- variant.saleprice && all_prices.push(variant.saleprice);
309
- });
310
- if (!all_prices.length) {
311
- return undefined;
312
- }
313
- min_price = all_prices.reduce(function (a, b) { return Math.min(a, b); });
314
- max_price = all_prices.reduce(function (a, b) { return Math.max(a, b); }, 0);
315
- return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
316
- };
317
- this.inRange = function (quantity, min, max) { return ((quantity - min) * (quantity - max) <= 0); };
318
- this.validateQuantity = function (quantity) {
319
- var actualQuantity = _this.cartService.getCountFromItemInCart(_this.variants[0].code);
320
- var asociatedData = _this.asociatedDataSubject.value;
321
- console.log('La cantidad que llego: ', quantity, ' y la cantidad actual: ', actualQuantity);
322
- if ((actualQuantity + quantity) > asociatedData.maximumItemsQuantity) {
323
- _this.toastrService.show('maximum-items-quantity', { quantity: asociatedData.maximumItemsQuantity });
324
- return false;
325
- }
326
- if ((actualQuantity + quantity) < asociatedData.minimumItemsQuantity) {
327
- _this.toastrService.show('minimum-items-quantity', { quantity: asociatedData.minimumItemsQuantity });
328
- return false;
329
- }
330
- return true;
331
- };
332
- this.validatePriceAndCredits = function (price) {
333
- if (_this.creditAmount === null) {
334
- console.log('No hay configuración de créditos para este usuario.');
335
- return true;
336
- }
337
- if (_this.remainingCredits === undefined) {
338
- return false;
339
- }
340
- if (price > _this.remainingCredits) {
341
- _this.toastrService.show('not-enough-credits');
342
- return false;
343
- }
344
- return true;
345
- };
346
- this.fetchCartData = function () {
347
- _this.cartService.getTotalAmount().subscribe(function (totalAmount) {
348
- _this.currentTotalAmount = totalAmount;
349
- });
350
- _this.cartService.getCreditAmount().subscribe(function (creditAmount) {
351
- _this.creditAmount = creditAmount;
352
- });
353
- _this.cartService.getRemainingCredits().subscribe(function (remainingCredits) {
354
- _this.remainingCredits = remainingCredits;
355
- });
356
- };
357
- // Cuando haya modelos de respuesta, validamos que no se intente cargar un producto incompleto
358
- this.isProductValid = function (product) { return true; };
359
- /**
360
- *
361
- * @param product producto el cual se quiere desdoblar por variantes por una opción.
362
- * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
363
- * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
364
- * @returns arreglo con el producto desdoblado por la variante solicitada.
365
- * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
366
- */
367
- this.getProductWithUniqueVariant = function (product, withOption) {
368
- return _this.productsService.getProductsWithUniqueVariant([product], withOption);
369
- };
370
- }
371
- /**
372
- * @description agrega/actualiza un item en el carrito
373
- * @param quantity cantidad a agregar
374
- * @param variant_code **(opcional)** codigo de la variante seleccionada del producto.
375
- * @returns
376
- */
377
- ProductDetailService.prototype.addToCart = function (quantity, variant_code) {
378
- quantity = parseInt(quantity);
379
- if (!this.variants.length) {
380
- this.toastrService.show('cant-buy');
381
- return;
382
- }
383
- var product_selected = _.clone(this.productSubject.value);
384
- var variant;
385
- switch (this.variants.length) {
386
- case 0:
387
- this.toastrService.show('no-variants');
388
- break;
389
- case 1:
390
- this.asociatedDataSubject.value.stock == 0 ?
391
- this.toastrService.show('out-of-stock') :
392
- variant = this.variants[0];
393
- break;
394
- default:
395
- if (variant_code) {
396
- variant = this.variants.find(function (variant) { return variant.code === variant_code; });
397
- if (variant.stock == 0) {
398
- this.toastrService.show('out-of-stock');
399
- variant = undefined;
400
- }
401
- }
402
- else {
403
- this.toastrService.show('variants-left');
404
- }
405
- break;
406
- }
407
- if (!variant)
408
- return;
409
- if (!this.validateQuantity(quantity))
410
- return;
411
- var priceToValidate = product_selected.saleprice ? product_selected.saleprice * quantity : product_selected.price * quantity;
412
- if (!this.validatePriceAndCredits(priceToValidate))
413
- return;
414
- this.cartService.addToCart(this.makeAffordableProduct(product_selected), quantity, variant.code);
415
- };
416
- ;
417
- ProductDetailService.prototype.makeAffordableProduct = function (product_selected) {
418
- product_selected.price = parseFloat(this.asociatedDataSubject.value.price);
419
- product_selected.saleprice = parseFloat(this.asociatedDataSubject.value.price);
420
- product_selected.options = {};
421
- this.variants[0].options.forEach(function (option) { return product_selected.options = __assign(__assign({}, product_selected.options), option); });
422
- return product_selected;
423
- };
424
- /**
425
- *
426
- * @param options Array de Variantes y sus valores
427
- *
428
- * @description Retorna una lista filtrada de las variantes que estan seleccionadas
429
- */
430
- ProductDetailService.prototype.getVariantsSelected = function (options, optionsException) {
431
- var variantsSelected = [];
432
- options.forEach(function (v) {
433
- if (v.values && v.values.length) {
434
- v.values.forEach(function (val) {
435
- if (val.selected && !optionsException.find(function (op) { return op.toUpperCase() == v.code.toUpperCase(); })) {
436
- variantsSelected[v.code] = val.name;
437
- }
438
- });
439
- }
440
- });
441
- return variantsSelected;
442
- };
443
- /**
444
- *
445
- * @param options Array de Variantes y sus valores
446
- * @param variants Todas las variantes disponibles del producto
447
- *
448
- * @description retorna todas las variantes disponibles a seleccion y su stock
449
- */
450
- ProductDetailService.prototype.getVariantsAvailable = function (options, variants, optionsException) {
451
- var _this = this;
452
- var variantsSelected = this.getVariantsSelected(options, optionsException);
453
- var variantsAvailable = [];
454
- variants.map(function (v) {
455
- var aux = {};
456
- if (v.options && v.options.length) {
457
- v.options.map(function (op) {
458
- Object.assign(aux, op, { stock: v.stock });
459
- });
460
- }
461
- variantsAvailable.push(aux);
462
- });
463
- return variantsAvailable.filter(function (va) { return _this.constants.containsAll(__assign({}, variantsSelected), va); });
464
- };
465
- /**
466
- *
467
- * @param options Array de variantes y sus valores
468
- * @param code Codigo de la variante a buscar
469
- * @param name nombre de la variante a buscar
470
- * @param variants variantes del producto
471
- *
472
- * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
473
- */
474
- ProductDetailService.prototype.existVariantAndHasStock = function (options, code, name, variants, optionsException) {
475
- if (optionsException === void 0) { optionsException = []; }
476
- return this.getVariantsAvailable(options, variants, optionsException).find(function (va) {
477
- return va.hasOwnProperty(code) && va[code] === name && va.stock > 0;
478
- });
479
- };
480
- ProductDetailService.ctorParameters = function () { return [
481
- { type: ProductsService },
482
- { type: CartService },
483
- { type: ToastService },
484
- { type: Constants },
485
- { type: AnalyticsService },
486
- { type: CurrencyService }
487
- ]; };
488
- ProductDetailService = __decorate([
489
- Injectable()
490
- ], ProductDetailService);
491
- return ProductDetailService;
492
- }());
493
- export { ProductDetailService };
494
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RDtJQWVJLDhCQUNZLGVBQWdDLEVBQVUsV0FBd0IsRUFBVSxhQUEyQixFQUN2RyxTQUFvQixFQUFTLGdCQUFrQyxFQUFTLGVBQWdDO1FBRnBILGlCQUdDO1FBRlcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUN2RyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQWY1RyxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FB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R0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLENBQUE7YUFDTDtZQUNELGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLGNBQU0sZ0JBQWdCLEdBQUksRUFBRSxDQUFDLEVBQXZELENBQXVELENBQUMsQ0FBQTtJQUNsRyxDQUFDO0lBR0Q7Ozs7Ozs7O09BUUc7SUFDSSxzREFBdUIsR0FBOUIsVUFBK0IsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFxQjtRQUFyQixpQ0FBQSxFQUFBLHFCQUFxQjtRQUUvRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsRUFBRTtZQUN6RSxPQUFBLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUM7UUFBNUQsQ0FBNEQsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7O2dCQWhhNEIsZUFBZTtnQkFBdUIsV0FBVztnQkFBeUIsWUFBWTtnQkFDNUYsU0FBUztnQkFBMkIsZ0JBQWdCO2dCQUEwQixlQUFlOztJQWpCM0csb0JBQW9CO1FBRGhDLFVBQVUsRUFBRTtPQUNBLG9CQUFvQixDQThiaEM7SUFBRCwyQkFBQztDQUFBLEFBOWJELElBOGJDO1NBOWJZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgcGFydGl0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4vcHJvZHVjdHMuc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcbmltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuLi9hbmFseXRpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xuaW1wb3J0IHsgQ3VycmVuY3lTZXJ2aWNlIH0gZnJvbSAnLi4vY3VycmVuY3kuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGV0YWlsU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHByb2R1Y3RTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0Pih7fSk7XG4gICAgcHJpdmF0ZSBvcHRpb25zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XG4gICAgcHJpdmF0ZSBhc29jaWF0ZWREYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7IHByaWNlOiAnJywgc3RvY2s6IDAsIHBpY3R1cmU6ICcnIH0pO1xuXG4gICAgcHJpdmF0ZSB2YXJpYW50cyA9IFtdXG5cbiAgICBwdWJsaWMgcHJvZHVjdCQgPSB0aGlzLnByb2R1Y3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBvcHRpb25zJCA9IHRoaXMub3B0aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGFzb2NpYXRlZERhdGEkID0gdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwcml2YXRlIGN1cnJlbnRUb3RhbEFtb3VudDogbnVtYmVyO1xuICAgIHByaXZhdGUgY3JlZGl0QW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIHByaXZhdGUgcmVtYWluaW5nQ3JlZGl0czogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcHJvZHVjdHNTZXJ2aWNlOiBQcm9kdWN0c1NlcnZpY2UsIHByaXZhdGUgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLCBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb25zdGFudHM6IENvbnN0YW50cywgcHVibGljIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsIHB1YmxpYyBjdXJyZW5jeVNlcnZpY2U6IEN1cnJlbmN5U2VydmljZSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIGNvZGUgSWRlbnRpZmljYWRvciBkZWwgcHJvZHVjdG9cbiAgICAqIEBwYXJhbSB2YXJpYW50IEluZGljYSBzaSBzZSBlc3TDoSBzb2xpY2l0YW5kbyB1biBwcm9kdWN0byBwb3Igc3UgY29kaWdvLCBvIHBvciBlbCBjb2RpZ28gY29ycmVzcG9uZGllbnRlIGEgdW5hIGRlIHN1cyB2YXJpYW50ZXNcbiAgICAqICBcbiAgICAqIENhcmdhIGVsIHByb2R1Y3RvIHNvbGljaXRhZG8gYXN5bmNyb25pY2FtZW50ZSBzaW4gcmVzcHVlc3RhIFxuICAgICovXG4gICAgbG9hZFByb2R1Y3QgPSAoY29kZSwgdmFyaWFudDogYm9vbGVhbiA9IGZhbHNlKSA9PlxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRTcGVjaWZpY1Byb2R1Y3QoY29kZSwgdmFyaWFudCkudG9Qcm9taXNlKCkudGhlbihcbiAgICAgICAgICAgIHJlcyA9PiB2YXJpYW50ID8gdGhpcy5pbml0aWFsaXplKHJlcywgY29kZSkgOiB0aGlzLmluaXRpYWxpemUocmVzKSxcbiAgICAgICAgICAgIGVyciA9PiB0aGlzLnByb2R1Y3RTdWJqZWN0Lm5leHQobnVsbClcbiAgICAgICAgKVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHByb2R1Y3RfaWQgSWRlbnRpZmljYWRvciBkZWwgcHJvZHVjdG9cbiAgICAgKiBAcGFyYW0gdmFyaWFudCBJbmRpY2Egc2kgc2UgZXN0w6Egc29saWNpdGFuZG8gdW4gcHJvZHVjdG8gcG9yIHN1IGNvZGlnbywgbyBwb3IgZWwgY29kaWdvIGNvcnJlc3BvbmRpZW50ZSBhIHVuYSBkZSBzdXMgdmFyaWFudGVzXG4gICAgICogQGFzeW5jXG4gICAgICogIFxuICAgICAqIEEgZGlmZXJlbmNpYSBkZWwgbWV0b2RvIGxvYWRQcm9kdWN0LCBlc3RlIHJldG9ybmEgdW4gdmFsb3IgY3VhbmRvIHRlcm1pbmEgXG4gICAgICovXG4gICAgZ2V0UHJvZHVjdCA9IGFzeW5jIChwcm9kdWN0X2lkLCB2YXJpYW50OiBib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFNwZWNpZmljUHJvZHVjdChwcm9kdWN0X2lkLCB2YXJpYW50KS50b1Byb21pc2UoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LmVycm9yKSB0aGlzLnByb2R1Y3RTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIGVsc2UgdmFyaWFudCA/IHRoaXMuaW5pdGlhbGl6ZShyZXN1bHQsIHByb2R1Y3RfaWQpIDogdGhpcy5pbml0aWFsaXplKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZSA9IChwcm9kdWN0LCB2YXJpYW50X2NvZGU/KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChwcm9kdWN0KTtcbiAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC5uZXh0KHRoaXMuZ2V0T3B0aW9ucygpKVxuICAgICAgICB2YXJpYW50X2NvZGUgPyB0aGlzLnVwZGF0ZVZhcmlhbnRzKHZhcmlhbnRfY29kZSkgOiB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XG4gICAgICAgIHRoaXMudmFyaWFudHMubGVuZ3RoICYmIHRoaXMuZ2VuZXJhdGVBc29jaWF0ZWREYXRhRnJvbVZhcmlhbnRzKCk7XG4gICAgICAgIHRoaXMuZmV0Y2hDYXJ0RGF0YSgpXG4gICAgICAgIC8vdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtJywgeyAuLi5wcm9kdWN0LCBjdXJyZW5jeTogdGhpcy5jb25zdGFudHMuY3VycmVuY3kuY29kZSB9KVxuICAgICAgICAvLyB2YXJpYW50X2NvZGUgJiYgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtJywgeyAuLi5wcm9kdWN0LCBjdXJyZW5jeTogdGhpcy5jb25zdGFudHMuY3VycmVuY3kuY29kZSB9KVxuICAgIH1cblxuICAgIHNldFByb2R1Y3QgPSAocHJvZHVjdCkgPT4gdGhpcy5pc1Byb2R1Y3RWYWxpZChwcm9kdWN0KSAmJiB0aGlzLmluaXRpYWxpemUocHJvZHVjdCk7XG5cbiAgICBpc1JlYWR5ID0gKCkgPT4gdGhpcy52YXJpYW50cy5sZW5ndGggPT0gMTtcblxuICAgIHNldE9wdGlvbiA9IChvcHRpb25fY29kZSwgb3B0aW9uX3ZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zU3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IG9wdGlvbiA9IG9wdGlvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQuY29kZSA9PSBvcHRpb25fY29kZSkudmFsdWVzLmZpbmQodmFsdWUgPT4gdmFsdWUubmFtZSA9PSBvcHRpb25fdmFsdWUpO1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSAhb3B0aW9uLnNlbGVjdGVkO1xuICAgICAgICBvcHRpb25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT0gb3B0aW9uX2NvZGUpLnZhbHVlcy5mb3JFYWNoKFxuICAgICAgICAgICAgdmFsdWUgPT4geyBpZiAodmFsdWUubmFtZSAhPSBvcHRpb24ubmFtZSkgdmFsdWUuc2VsZWN0ZWQgPSBmYWxzZSB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dChvcHRpb25zKTtcbiAgICAgICAgdGhpcy51cGRhdGVWYXJpYW50cygpO1xuICAgICAgICBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBIYWJpbGl0YXIgdG9kb3MgbG9zIGJvdG9uZXMgY29uIGxhIGNsYXNlICdhZGRDYXJ0QnV0dG9uJ1xuICAgICAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGRDYXJ0QnV0dG9uJyk7XG4gICAgICAgICAgICBzdWJtaXRCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgICAgICAgICAgICAoYnV0dG9uIGFzIEhUTUxCdXR0b25FbGVtZW50KS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3NlbGVjdGlvbi1ub3QtYXZhaWxhYmxlJyk7XG5cbiAgICAgICAgICAgIC8vIERlc2hhYmlsaXRhciB0b2RvcyBsb3MgYm90b25lcyBjb24gbGEgY2xhc2UgJ3N1Ym1pdC1idXR0b24nXG4gICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkZENhcnRCdXR0b24nKTtcbiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICAgICAgICAgIChidXR0b24gYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBjaGFuZ2VQaWN0dXJlID0gKHBpY3R1cmUpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlO1xuICAgICAgICBkYXRhLnBpY3R1cmUgPSBwaWN0dXJlO1xuICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgLy8gV2hhdGhldmVyIHdlIG5lZWQgdG8gZG8gd2l0aCBlcnJvclxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBhZ3JlZ2EvYWN0dWFsaXphIHVuIGl0ZW0gZW4gZWwgY2Fycml0byBcbiAgICAgKiBAcGFyYW0gcXVhbnRpdHkgY2FudGlkYWQgYSBhZ3JlZ2FyXG4gICAgICogQHBhcmFtIHZhcmlhbnRfY29kZSAqKihvcGNpb25hbCkqKiBjb2RpZ28gZGUgbGEgdmFyaWFudGUgc2VsZWNjaW9uYWRhIGRlbCBwcm9kdWN0by5cbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhZGRUb0NhcnQocXVhbnRpdHksIHZhcmlhbnRfY29kZT86IHN0cmluZykge1xuICAgICAgICBxdWFudGl0eSA9IHBhcnNlSW50KHF1YW50aXR5KTtcblxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnY2FudC1idXknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJvZHVjdF9zZWxlY3RlZCA9IF8uY2xvbmUodGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZSk7XG5cbiAgICAgICAgbGV0IHZhcmlhbnQ6IGFueTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMudmFyaWFudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXZhcmlhbnRzJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA9PSAwID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpIDpcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9IHRoaXMudmFyaWFudHNbMF1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRfY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdGhpcy52YXJpYW50cy5maW5kKHZhcmlhbnQgPT4gdmFyaWFudC5jb2RlID09PSB2YXJpYW50X2NvZGUpXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW50LnN0b2NrID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3ZhcmlhbnRzLWxlZnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YXJpYW50KSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVF1YW50aXR5KHF1YW50aXR5KSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHByaWNlVG9WYWxpZGF0ZSA9IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlID8gcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgKiBxdWFudGl0eSA6IHByb2R1Y3Rfc2VsZWN0ZWQucHJpY2UgKiBxdWFudGl0eTtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzKHByaWNlVG9WYWxpZGF0ZSkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydCh0aGlzLm1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkKSwgcXVhbnRpdHksIHZhcmlhbnQuY29kZSk7XG4gICAgfTtcblxuXG5cbiAgICBhZGRUb0NhcnRQcm9taXNlID0gYXN5bmMgKHF1YW50aXR5KSA9PiB7XG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2NhbnQtYnV5JyB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm9kdWN0X3NlbGVjdGVkID0gXy5jbG9uZSh0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMSB8fCB0aGlzLnZhcmlhbnRzLmxlbmd0aCA9PSAwIHx8IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnbm8tdmFyaWFudHMnIH07XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDEgJiYgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA+IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAndmFyaWFudHMtbGVmdCcgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoICE9IDAgJiYgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA9PSAwKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ291dC1vZi1zdG9jaycgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVRdWFudGl0eShxdWFudGl0eSkpIHJldHVybjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FydFNlcnZpY2UuYWRkVG9DYXJ0UHJvbWlzZSh0aGlzLm1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkKSwgcXVhbnRpdHksIHRoaXMudmFyaWFudHNbMF0uY29kZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0ICYmICEocmVzdWx0LmVycm9yKSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0T3B0aW9ucyA9IChwcm9kdWN0X3JlY2VpdmVkPzogUHJvZHVjdCkgPT4ge1xuICAgICAgICBsZXQgcHJvZHVjdCA9IHByb2R1Y3RfcmVjZWl2ZWQgfHwgdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcbiAgICAgICAgcHJvZHVjdC5vcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy50b09wdGlvbihlbGVtZW50KSk7XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9PcHRpb24gPSAocHJlb3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBwcmVvcHRpb24ubGFiZWwsXG4gICAgICAgICAgICBjb2RlOiBwcmVvcHRpb24uY29kZSxcbiAgICAgICAgICAgIHR5cGU6IHByZW9wdGlvbi50eXBlLFxuICAgICAgICAgICAgdmFsdWVzOiBwcmVvcHRpb24udmFsdWVzLm1hcCh2YWx1ZSA9PiAoeyBuYW1lOiB2YWx1ZS5jb2RlLCBkZXNjcmlwdGlvbjogdmFsdWUubmFtZSwgaW1hZ2U6IHZhbHVlLmltYWdlLCBtb2JpbGVJbWFnZTogdmFsdWUubW9iaWxlSW1hZ2UsIHNlbGVjdGVkOiBmYWxzZSB9KSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQ6IFByb2R1Y3QpIHtcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5wcmljZSA9IHBhcnNlRmxvYXQodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5wcmljZSk7XG4gICAgICAgIHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlID0gcGFyc2VGbG9hdCh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnByaWNlKTtcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zID0ge307XG4gICAgICAgIHRoaXMudmFyaWFudHNbMF0ub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBwcm9kdWN0X3NlbGVjdGVkLm9wdGlvbnMgPSB7IC4uLnByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucywgLi4ub3B0aW9uIH0pXG4gICAgICAgIHJldHVybiBwcm9kdWN0X3NlbGVjdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFyaWFudHMgPSAoY29kZT8pID0+IHtcbiAgICAgICAgbGV0IHZhcmlhbnRzID0gdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZS52YXJpYW50cztcbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0LnZhbHVlLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBvcHRpb24udmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzID0gdmFyaWFudHMuZmlsdGVyKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMuc29tZSh2YXJpYW50X29wdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3B0aW9uLmNvZGUgaW4gdmFyaWFudF9vcHRpb24gJiYgdmFyaWFudF9vcHRpb25bb3B0aW9uLmNvZGVdID09IHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXJpYW50cyA9IHZhcmlhbnRzLmZpbHRlcih2YXJpYW50ID0+IHZhcmlhbnQuY29kZSA9PSBjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhcmlhbnRzID0gdmFyaWFudHM7XG4gICAgICAgIGNvZGUgJiYgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVPcHRpb25zID0gKCkgPT4ge1xuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSB0aGlzLnZhcmlhbnRzLmxlbmd0aCAmJiB0aGlzLnZhcmlhbnRzWzBdO1xuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gT2JqZWN0LmtleXMob3B0aW9uKS5mb3JFYWNoKGtleSA9PiB0aGlzLnNldE9wdGlvbihrZXksIG9wdGlvbltrZXldKSkpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMgPSAoKSA9PiB7XG4gICAgICAgIGxldCBhc29jaWF0ZWQ6IGFueSA9IHt9O1xuICAgICAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zdG9jayA9IHRoaXMudmFyaWFudHNbMF0uc3RvY2tcbiAgICAgICAgICAgIGFzb2NpYXRlZC5wcmljZSA9IHRoaXMudmFyaWFudHNbMF0ucHJpY2UudG9TdHJpbmcoKVxuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlICYmIHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlLnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy52YXJpYW50c1swXT8uZGlzY291bnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByb3BlcnRpZXMgPSB0aGlzLnZhcmlhbnRzWzBdLnByb3BlcnRpZXMgPyB0aGlzLmJlYXV0aWZ5UHJvcGVydGllcyh0aGlzLnZhcmlhbnRzWzBdLnByb3BlcnRpZXMpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLnVuaXF1ZUV4dGVybmFsQ29kZSA9IHRoaXMudmFyaWFudHNbMF0/LnVuaXF1ZUV4dGVybmFsQ29kZSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQubXVsdGlwbGVRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgfHwgdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy5jcmF0ZVByaWNlKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zYWxlcHJpY2UgPSB0aGlzLmNyYXRlU2FsZVByaWNlKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zdG9jayA9ICh0aGlzLnZhcmlhbnRzLm1hcCh2YXJpYW50ID0+IHZhcmlhbnQuc3RvY2spKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKVxuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy5jcmF0ZURpc2NvdW50KClcbiAgICAgICAgfVxuXG4gICAgICAgICgnaW1hZ2VzJyBpbiB0aGlzLnZhcmlhbnRzWzBdICYmIHRoaXMudmFyaWFudHNbMF0uaW1hZ2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICA/IGFzb2NpYXRlZC5waWN0dXJlID0gdGhpcy52YXJpYW50c1swXS5pbWFnZXNbMF1cbiAgICAgICAgICAgIDogYXNvY2lhdGVkLnBpY3R1cmUgPSAodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5waWN0dXJlIHx8IHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUucGljdHVyZXNkZWZhdWx0WzBdKTtcblxuXG4gICAgICAgIGFzb2NpYXRlZC5tYXhpbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWF4aW11bUFtb3VudCB8fCAwXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUFtb3VudCB8fCAwXG5cbiAgICAgICAgYXNvY2lhdGVkLm1heGltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtYXhpbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXSA/IHRoaXMudmFyaWFudHNbMF0/Lm1heGltdW1JdGVtc1F1YW50aXR5IDogdGhpcy52YXJpYW50c1swXT8uc3RvY2tcbiAgICAgICAgYXNvY2lhdGVkLm1pbmltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtaW5pbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXVxuICAgICAgICAgICAgJiYgdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHkgPiAwID8gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHlcbiAgICAgICAgICAgIDogKHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgPyB0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5IDogMSlcblxuICAgICAgICBhc29jaWF0ZWQuZmluYWxDb25zdW1lciA9IHtcbiAgICAgICAgICAgIGZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8uZmluYWxfY29uc3VtZXJfcHJpY2UsXG4gICAgICAgICAgICBvcmlnaW5hbEZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8ub3JpZ2luYWxfZmluYWxfY29uc3VtZXJfcHJpY2UsXG4gICAgICAgIH1cblxuICAgICAgICBhc29jaWF0ZWQudGF4ZXMgPSB7XG4gICAgICAgICAgICB0YXhJbmNsdWRlZDogdGhpcy52YXJpYW50c1swXT8udGF4SW5jbHVkZWQsXG4gICAgICAgICAgICB0YXhDYXRlZ29yeTogdGhpcy52YXJpYW50c1swXT8udGF4Q2F0ZWdvcnksXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0Lm5leHQoYXNvY2lhdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVjaWJlIGxhcyBwcm9waWVkYWRlcyBkZSB1bmEgdmFyaWFudGUgeSBwb3IgY2FkYSBpdGVtIGFybWEgdW4gb2JqZXRvIGNvbiBcbiAgICAgKiBlbCBuYW1lPWNsYXZlIHkgdmFsdWU9dmFsb3IgZGUgZXNlIGl0ZW0uICBcbiAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBcbiAgICAgKiBAcmV0dXJucyBVbiBhcnJlZ2xvIGNvbiBsYXMgcHJvcGllZGFkZXMgZGUgbGEgZm9ybWEgeyBuYW1lID0gLi4uICwgdmFsdWUgPSAuLi59XG4gICAgICovXG4gICAgcHJpdmF0ZSBiZWF1dGlmeVByb3BlcnRpZXMgPSAocHJvcGVydGllcykgPT4ge1xuICAgICAgICBsZXQgYmVhdXRpZnlEYXRhID0gW11cbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHByb3ApIHtcbiAgICAgICAgICAgICAgICBiZWF1dGlmeURhdGEucHVzaCh7IG5hbWU6IGtleSwgdmFsdWU6IHByb3Bba2V5XSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJlYXV0aWZ5RGF0YVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVEaXNjb3VudCA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhbGxfZGlzY291bnQgPSAnJztcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcbiAgICAgICAgICAgICAgICB2YXJpYW50LmRpc2NvdW50ICYmIChhbGxfZGlzY291bnQgPSBhbGxfZGlzY291bnQgKyAnLCAnICsgdmFyaWFudC5kaXNjb3VudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhbGxfZGlzY291bnQgPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWxsX2Rpc2NvdW50XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyYXRlUHJpY2UgPSAoKSA9PiB7XG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xuICAgICAgICBsZXQgbWF4X3ByaWNlID0gMDtcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgYWxsX3ByaWNlcy5wdXNoKHZhcmlhbnQucHJpY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWluX3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpKTtcbiAgICAgICAgbWF4X3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVTYWxlUHJpY2UgPSAoKSA9PiB7XG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xuICAgICAgICBsZXQgbWF4X3ByaWNlID0gMDtcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgdmFyaWFudC5zYWxlcHJpY2UgJiYgYWxsX3ByaWNlcy5wdXNoKHZhcmlhbnQuc2FsZXByaWNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYWxsX3ByaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xuICAgICAgICBtYXhfcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xuICAgICAgICByZXR1cm4gbWluX3ByaWNlID09IG1heF9wcmljZSA/IG1heF9wcmljZS50b1N0cmluZygpIDogbWluX3ByaWNlICsgJyAtICcgKyBtYXhfcHJpY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpblJhbmdlID0gKHF1YW50aXR5LCBtaW4sIG1heCkgPT4gKChxdWFudGl0eSAtIG1pbikgKiAocXVhbnRpdHkgLSBtYXgpIDw9IDApXG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUXVhbnRpdHkgPSAocXVhbnRpdHk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBhY3R1YWxRdWFudGl0eSA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0Q291bnRGcm9tSXRlbUluQ2FydCh0aGlzLnZhcmlhbnRzWzBdLmNvZGUpO1xuICAgICAgICBjb25zdCBhc29jaWF0ZWREYXRhID0gdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ0xhIGNhbnRpZGFkIHF1ZSBsbGVnbzogJywgcXVhbnRpdHksICcgeSBsYSBjYW50aWRhZCBhY3R1YWw6ICcsIGFjdHVhbFF1YW50aXR5KTtcbiAgICAgICAgaWYgKChhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5KSA+IGFzb2NpYXRlZERhdGEubWF4aW11bUl0ZW1zUXVhbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtYXhpbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogYXNvY2lhdGVkRGF0YS5tYXhpbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoYWN0dWFsUXVhbnRpdHkgKyBxdWFudGl0eSkgPCBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWluaW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGFzb2NpYXRlZERhdGEubWluaW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcmljZUFuZENyZWRpdHMgPSAocHJpY2U6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAodGhpcy5jcmVkaXRBbW91bnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBoYXkgY29uZmlndXJhY2nDs24gZGUgY3LDqWRpdG9zIHBhcmEgZXN0ZSB1c3VhcmlvLicpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmljZSA+IHRoaXMucmVtYWluaW5nQ3JlZGl0cykge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuXG4gICAgcHJpdmF0ZSBmZXRjaENhcnREYXRhID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldFRvdGFsQW1vdW50KCkuc3Vic2NyaWJlKCh0b3RhbEFtb3VudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG90YWxBbW91bnQgPSB0b3RhbEFtb3VudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5nZXRDcmVkaXRBbW91bnQoKS5zdWJzY3JpYmUoKGNyZWRpdEFtb3VudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVkaXRBbW91bnQgPSBjcmVkaXRBbW91bnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0UmVtYWluaW5nQ3JlZGl0cygpLnN1YnNjcmliZSgocmVtYWluaW5nQ3JlZGl0cykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1haW5pbmdDcmVkaXRzID0gcmVtYWluaW5nQ3JlZGl0cztcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIEN1YW5kbyBoYXlhIG1vZGVsb3MgZGUgcmVzcHVlc3RhLCB2YWxpZGFtb3MgcXVlIG5vIHNlIGludGVudGUgY2FyZ2FyIHVuIHByb2R1Y3RvIGluY29tcGxldG9cbiAgICBwcml2YXRlIGlzUHJvZHVjdFZhbGlkID0gKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBWYXJpYW50ZXMgeSBzdXMgdmFsb3Jlc1xuICAgICAqIFxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXRvcm5hIHVuYSBsaXN0YSBmaWx0cmFkYSBkZSBsYXMgdmFyaWFudGVzIHF1ZSBlc3RhbiBzZWxlY2Npb25hZGFzXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYXJpYW50c1NlbGVjdGVkKG9wdGlvbnM6IGFueSwgb3B0aW9uc0V4Y2VwdGlvbjogQXJyYXk8YW55Pik6IEFycmF5PE9iamVjdD4ge1xuXG4gICAgICAgIGxldCB2YXJpYW50c1NlbGVjdGVkID0gW107XG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgICAgIGlmICh2LnZhbHVlcyAmJiB2LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2LnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuc2VsZWN0ZWQgJiYgIW9wdGlvbnNFeGNlcHRpb24uZmluZChvcCA9PiBvcC50b1VwcGVyQ2FzZSgpID09IHYuY29kZS50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHNTZWxlY3RlZFt2LmNvZGVdID0gdmFsLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmFyaWFudHNTZWxlY3RlZDtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXG4gICAgICogQHBhcmFtIHZhcmlhbnRzIFRvZGFzIGxhcyB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgZGVsIHByb2R1Y3RvXG4gICAgICogXG4gICAgICogQGRlc2NyaXB0aW9uIHJldG9ybmEgdG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBhIHNlbGVjY2lvbiB5IHN1IHN0b2NrXG4gICAgICovXG4gICAgcHVibGljIGdldFZhcmlhbnRzQXZhaWxhYmxlKG9wdGlvbnM6IGFueSwgdmFyaWFudHM6IGFueSwgb3B0aW9uc0V4Y2VwdGlvbjogQXJyYXk8YW55Pik6IGFueSB7XG5cbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSB0aGlzLmdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9ucywgb3B0aW9uc0V4Y2VwdGlvbik7XG5cbiAgICAgICAgbGV0IHZhcmlhbnRzQXZhaWxhYmxlID0gW107XG5cbiAgICAgICAgdmFyaWFudHMubWFwKHYgPT4ge1xuXG4gICAgICAgICAgICBsZXQgYXV4ID0ge307XG4gICAgICAgICAgICBpZiAodi5vcHRpb25zICYmIHYub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2Lm9wdGlvbnMubWFwKG9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhdXgsIG9wLCB7IHN0b2NrOiB2LnN0b2NrIH0pO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXJpYW50c0F2YWlsYWJsZS5wdXNoKGF1eCk7XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiB2YXJpYW50c0F2YWlsYWJsZS5maWx0ZXIodmEgPT4gdGhpcy5jb25zdGFudHMuY29udGFpbnNBbGwoeyAuLi52YXJpYW50c1NlbGVjdGVkIH0sIHZhKSlcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIHZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXG4gICAgICogQHBhcmFtIGNvZGUgQ29kaWdvIGRlIGxhIHZhcmlhbnRlIGEgYnVzY2FyXG4gICAgICogQHBhcmFtIG5hbWUgbm9tYnJlIGRlIGxhIHZhcmlhbnRlIGEgYnVzY2FyXG4gICAgICogQHBhcmFtIHZhcmlhbnRzIHZhcmlhbnRlcyBkZWwgcHJvZHVjdG9cbiAgICAgKiBcbiAgICAgKiBAZGVzY3JpcHRpb24gYnVzY2EgZW4gbGEgbGlzdGEgZGUgdmFyaWFudGVzIGRpc3BvbmlibGVzIHNpIGhheSBkZSBlc2UgY29kaWdvLCBlc2Ugbm9tYnJlIHkgY29uIHN0b2NrIFxuICAgICAqL1xuICAgIHB1YmxpYyBleGlzdFZhcmlhbnRBbmRIYXNTdG9jayhvcHRpb25zLCBjb2RlLCBuYW1lLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbiA9IFtdKTogYm9vbGVhbiB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9ucywgdmFyaWFudHMsIG9wdGlvbnNFeGNlcHRpb24pLmZpbmQodmEgPT5cbiAgICAgICAgICAgIHZhLmhhc093blByb3BlcnR5KGNvZGUpICYmIHZhW2NvZGVdID09PSBuYW1lICYmIHZhLnN0b2NrID4gMClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBwcm9kdWN0byBlbCBjdWFsIHNlIHF1aWVyZSBkZXNkb2JsYXIgcG9yIHZhcmlhbnRlcyBwb3IgdW5hIG9wY2nDs24uXG4gICAgICogQHBhcmFtIHdpdGhPcHRpb24gJ3R5cGUnIHRpcG8gZGUgb3BjacOzbiwgY29kZTogY8OzZGlnbyBkZSBsYSBvcGNpw7NuLiAnZGVmYXVsdEZpcnN0T3B0aW9uJzogZW4gY2FzbyBkZSBxdWUgbm8gc2UgcHVlZGEgZGVzZG9ibGFyIHBvciBsYSBvcGNpw7NuIGluZGljYWRhIHNpIGVsIHZhbG9yIGVzIHZlcmRhZGVybyBzZSBpbnRlbnRhcmEgZGVzZG9ibGFyIHBvciBsYSBwcmltZXJhIG9wY2nDs24gYXNvY2lhZGEgYWwgcHJvZHVjdG8uXG4gICAgICogJ2NoZWNrSWZTdG9jayc6IGVuIGNhc28gZGUgcXVlIGVzdGEgdmFsb3Igc2VhIHZlcmRhZGVybyBzZSByZWFsaXphIHVuIGNvbnRyb2wgZGUgcXVlIGxhIHZhcmlhbnRlcyBjdWVudGVuIGNvbiBzdG9jayBwYXJhIHNlciB1biBwcm9kdWN0byBkZXNkb2JsYWRvIHBvciBsYSB2YXJpYW50ZSwgc2kgZWwgdmFsb3IgZXMgZmFsc28gbm8gc2UgcmVhbGl6YSBkaWNobyBjb250cm9sIHkgZWwgcHJvZHVjdG8gc2UgZGVzZG9ibGFyYSBjb24gc3RvY2sgZW4gMC5cbiAgICAgKiBAcmV0dXJucyBhcnJlZ2xvIGNvbiBlbCBwcm9kdWN0byBkZXNkb2JsYWRvIHBvciBsYSB2YXJpYW50ZSBzb2xpY2l0YWRhLlxuICAgICAqIChvcGNpw7NuIHBvciBkZWZlY3RvIHF1ZSBzZSBpbnRlbnRhIGhhY2VyIGVsIGRlc2RvYmxhbWllbnRvICdjb2xvcicsIG8gYmllbiBzaSBlbiBsZSBwYXLDoW1ldHJvIHdpdGhPcHRpb24gZWwgYXRyaWJ1dG8gJ2RlZmF1bHRGaXJzdE9wdGlvbicgZXMgdmVyZGFkZXJvIHNlIGRlc2RvYmxhIHBvciBsYSBwcmltZXJhIG9wY2nDs24gYXNvY2lhZGEgYWwgcHJvZHVjdG8gKSBcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQgPSAocHJvZHVjdCwgd2l0aE9wdGlvbj86IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQoW3Byb2R1Y3RdLCB3aXRoT3B0aW9uKVxuICAgIH1cblxufSJdfQ==
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
+ return new (P || (P = Promise))(function (resolve, reject) {
21
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
25
+ });
26
+ };
27
+ var __generator = (this && this.__generator) || function (thisArg, body) {
28
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
29
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
+ function verb(n) { return function (v) { return step([n, v]); }; }
31
+ function step(op) {
32
+ if (f) throw new TypeError("Generator is already executing.");
33
+ while (_) try {
34
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
+ if (y = 0, t) op = [op[0] & 2, t.value];
36
+ switch (op[0]) {
37
+ case 0: case 1: t = op; break;
38
+ case 4: _.label++; return { value: op[1], done: false };
39
+ case 5: _.label++; y = op[1]; op = [0]; continue;
40
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
+ default:
42
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
+ if (t[2]) _.ops.pop();
47
+ _.trys.pop(); continue;
48
+ }
49
+ op = body.call(thisArg, _);
50
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
+ }
53
+ };
54
+ import { Injectable } from '@angular/core';
55
+ import { BehaviorSubject } from 'rxjs';
56
+ import { ProductsService } from './products.service';
57
+ import { CartService } from '../cart.service';
58
+ import { ToastService } from '../../utils/toast.service';
59
+ import { Constants } from '../../core.consts';
60
+ import _ from "lodash";
61
+ import { AnalyticsService } from '../analytics.service';
62
+ import { CurrencyService } from '../currency.service';
63
+ var ProductDetailService = /** @class */ (function () {
64
+ function ProductDetailService(productsService, cartService, toastrService, constants, analyticsService, currencyService) {
65
+ var _this = this;
66
+ this.productsService = productsService;
67
+ this.cartService = cartService;
68
+ this.toastrService = toastrService;
69
+ this.constants = constants;
70
+ this.analyticsService = analyticsService;
71
+ this.currencyService = currencyService;
72
+ this.productSubject = new BehaviorSubject({});
73
+ this.optionsSubject = new BehaviorSubject({});
74
+ this.asociatedDataSubject = new BehaviorSubject({ price: '', stock: 0, picture: '' });
75
+ this.variants = [];
76
+ this.product$ = this.productSubject.asObservable();
77
+ this.options$ = this.optionsSubject.asObservable();
78
+ this.asociatedData$ = this.asociatedDataSubject.asObservable();
79
+ /**
80
+ * @param code Identificador del producto
81
+ * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
82
+ *
83
+ * Carga el producto solicitado asyncronicamente sin respuesta
84
+ */
85
+ this.loadProduct = function (code, variant) {
86
+ if (variant === void 0) { variant = false; }
87
+ return _this.productsService.getSpecificProduct(code, variant).toPromise().then(function (res) { return variant ? _this.initialize(res, code) : _this.initialize(res); }, function (err) { return _this.productSubject.next(null); });
88
+ };
89
+ /**
90
+ * @param product_id Identificador del producto
91
+ * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
92
+ * @async
93
+ *
94
+ * A diferencia del metodo loadProduct, este retorna un valor cuando termina
95
+ */
96
+ this.getProduct = function (product_id, variant) {
97
+ if (variant === void 0) { variant = false; }
98
+ return __awaiter(_this, void 0, void 0, function () {
99
+ var result;
100
+ return __generator(this, function (_a) {
101
+ switch (_a.label) {
102
+ case 0: return [4 /*yield*/, this.productsService.getSpecificProduct(product_id, variant).toPromise()];
103
+ case 1:
104
+ result = _a.sent();
105
+ if (!result || result.error)
106
+ this.productSubject.next(null);
107
+ else
108
+ variant ? this.initialize(result, product_id) : this.initialize(result);
109
+ return [2 /*return*/, true];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ this.initialize = function (product, variant_code) {
115
+ _this.productSubject.next(product);
116
+ _this.optionsSubject.next(_this.getOptions());
117
+ variant_code ? _this.updateVariants(variant_code) : _this.updateVariants();
118
+ _this.variants.length && _this.generateAsociatedDataFromVariants();
119
+ _this.fetchCartData();
120
+ //this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
121
+ // variant_code && this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
122
+ };
123
+ this.setProduct = function (product) { return _this.isProductValid(product) && _this.initialize(product); };
124
+ this.isReady = function () { return _this.variants.length == 1; };
125
+ this.setOption = function (option_code, option_value) {
126
+ var options = _this.optionsSubject.value;
127
+ var option = options.find(function (element) { return element.code == option_code; }).values.find(function (value) { return value.name == option_value; });
128
+ option.selected = !option.selected;
129
+ options.find(function (element) { return element.code == option_code; }).values.forEach(function (value) { if (value.name != option.name)
130
+ value.selected = false; });
131
+ _this.optionsSubject.next(options);
132
+ _this.updateVariants();
133
+ if (_this.variants.length > 0) {
134
+ // Habilitar todos los botones con la clase 'addCartButton'
135
+ var submitButtons = document.querySelectorAll('.addCartButton');
136
+ submitButtons.forEach(function (button) {
137
+ button.disabled = false;
138
+ });
139
+ _this.generateAsociatedDataFromVariants();
140
+ }
141
+ else {
142
+ _this.toastrService.show('selection-not-available');
143
+ // Deshabilitar todos los botones con la clase 'submit-button'
144
+ var submitButtons = document.querySelectorAll('.addCartButton');
145
+ submitButtons.forEach(function (button) {
146
+ button.disabled = true;
147
+ });
148
+ }
149
+ };
150
+ this.changePicture = function (picture) {
151
+ var data = _this.asociatedDataSubject.value;
152
+ data.picture = picture;
153
+ _this.asociatedDataSubject.next(data);
154
+ };
155
+ this.handleError = function (error) {
156
+ // Whathever we need to do with error
157
+ };
158
+ this.addToCartPromise = function (quantity) { return __awaiter(_this, void 0, void 0, function () {
159
+ var product_selected, result;
160
+ return __generator(this, function (_a) {
161
+ switch (_a.label) {
162
+ case 0:
163
+ quantity = parseInt(quantity);
164
+ if (!this.variants.length) {
165
+ return [2 /*return*/, { error: true, message: 'cant-buy' }];
166
+ }
167
+ product_selected = _.clone(this.productSubject.value);
168
+ if (this.variants.length > 1 || this.variants.length == 0 || this.asociatedDataSubject.value.stock == 0) {
169
+ if (this.variants.length == 0)
170
+ return [2 /*return*/, { error: true, message: 'no-variants' }];
171
+ else if (this.variants.length > 1 && this.asociatedDataSubject.value.stock > 0)
172
+ return [2 /*return*/, { error: true, message: 'variants-left' }];
173
+ else if (this.variants.length != 0 && this.asociatedDataSubject.value.stock == 0)
174
+ return [2 /*return*/, { error: true, message: 'out-of-stock' }];
175
+ }
176
+ if (!this.validateQuantity(quantity))
177
+ return [2 /*return*/];
178
+ return [4 /*yield*/, this.cartService.addToCartPromise(this.makeAffordableProduct(product_selected), quantity, this.variants[0].code)];
179
+ case 1:
180
+ result = _a.sent();
181
+ return [2 /*return*/, (result && !(result.error))];
182
+ }
183
+ });
184
+ }); };
185
+ this.getOptions = function (product_received) {
186
+ var product = product_received || _this.productSubject.value;
187
+ var options = [];
188
+ product.options.forEach(function (element) {
189
+ options.push(_this.toOption(element));
190
+ });
191
+ return options;
192
+ };
193
+ this.toOption = function (preoption) {
194
+ return {
195
+ name: preoption.label,
196
+ code: preoption.code,
197
+ type: preoption.type,
198
+ values: preoption.values.map(function (value) { return ({ name: value.code, description: value.name, image: value.image, mobileImage: value.mobileImage, selected: false }); })
199
+ };
200
+ };
201
+ this.updateVariants = function (code) {
202
+ var variants = _this.productSubject.value.variants;
203
+ if (!code) {
204
+ _this.optionsSubject.value.forEach(function (option) {
205
+ option.values.forEach(function (value) {
206
+ if (value.selected) {
207
+ variants = variants.filter(function (variant) {
208
+ return variant.options.some(function (variant_option) {
209
+ return (option.code in variant_option && variant_option[option.code] == value.name);
210
+ });
211
+ });
212
+ }
213
+ });
214
+ });
215
+ }
216
+ else {
217
+ variants = variants.filter(function (variant) { return variant.code == code; });
218
+ }
219
+ _this.variants = variants;
220
+ code && _this.updateOptions();
221
+ };
222
+ this.updateOptions = function () {
223
+ var options = (_this.variants.length && _this.variants[0]).options;
224
+ options && options.forEach(function (option) { return Object.keys(option).forEach(function (key) { return _this.setOption(key, option[key]); }); });
225
+ };
226
+ this.generateAsociatedDataFromVariants = function () {
227
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
228
+ var asociated = {};
229
+ if (_this.isReady()) {
230
+ asociated.stock = _this.variants[0].stock;
231
+ asociated.price = _this.variants[0].price.toString();
232
+ asociated.saleprice = _this.variants[0].saleprice && _this.variants[0].saleprice.toString() || undefined;
233
+ asociated.discount = ((_a = _this.variants[0]) === null || _a === void 0 ? void 0 : _a.discount) || undefined;
234
+ asociated.properties = _this.variants[0].properties ? _this.beautifyProperties(_this.variants[0].properties) : undefined;
235
+ asociated.uniqueExternalCode = ((_b = _this.variants[0]) === null || _b === void 0 ? void 0 : _b.uniqueExternalCode) || undefined;
236
+ asociated.multipleQuantity = ((_c = _this.variants[0]) === null || _c === void 0 ? void 0 : _c.multipleQuantity) || undefined;
237
+ }
238
+ else {
239
+ asociated.price = _this.cratePrice();
240
+ asociated.saleprice = _this.crateSalePrice();
241
+ asociated.stock = (_this.variants.map(function (variant) { return variant.stock; })).reduce(function (a, b) { return a + b; });
242
+ asociated.discount = _this.crateDiscount();
243
+ }
244
+ ('images' in _this.variants[0] && _this.variants[0].images.length > 0)
245
+ ? asociated.picture = _this.variants[0].images[0]
246
+ : asociated.picture = (_this.asociatedDataSubject.value.picture || _this.productSubject.value.picturesdefault[0]);
247
+ asociated.maximumAmount = ((_d = _this.variants[0]) === null || _d === void 0 ? void 0 : _d.maximumAmount) || 0;
248
+ asociated.minimumAmount = ((_e = _this.variants[0]) === null || _e === void 0 ? void 0 : _e.minimumAmount) || 0;
249
+ asociated.maximumItemsQuantity = ((_f = _this.variants[0]) === null || _f === void 0 ? void 0 : _f.stock) > 0 && 'maximumItemsQuantity' in _this.variants[0] ? (_g = _this.variants[0]) === null || _g === void 0 ? void 0 : _g.maximumItemsQuantity : (_h = _this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock;
250
+ asociated.minimumItemsQuantity = ((_j = _this.variants[0]) === null || _j === void 0 ? void 0 : _j.stock) > 0 && 'minimumItemsQuantity' in _this.variants[0]
251
+ && ((_k = _this.variants[0]) === null || _k === void 0 ? void 0 : _k.minimumItemsQuantity) > 0 ? (_l = _this.variants[0]) === null || _l === void 0 ? void 0 : _l.minimumItemsQuantity : (((_m = _this.variants[0]) === null || _m === void 0 ? void 0 : _m.multipleQuantity) ? (_o = _this.variants[0]) === null || _o === void 0 ? void 0 : _o.multipleQuantity : 1);
252
+ asociated.finalConsumer = {
253
+ finalConsumerPrice: (_p = _this.variants[0]) === null || _p === void 0 ? void 0 : _p.final_consumer_price,
254
+ originalFinalConsumerPrice: (_q = _this.variants[0]) === null || _q === void 0 ? void 0 : _q.original_final_consumer_price,
255
+ };
256
+ asociated.taxes = {
257
+ taxIncluded: (_r = _this.variants[0]) === null || _r === void 0 ? void 0 : _r.taxIncluded,
258
+ taxCategory: (_s = _this.variants[0]) === null || _s === void 0 ? void 0 : _s.taxCategory,
259
+ };
260
+ _this.asociatedDataSubject.next(asociated);
261
+ };
262
+ /**
263
+ * @description Recibe las propiedades de una variante y por cada item arma un objeto con
264
+ * el name=clave y value=valor de ese item.
265
+ * @param properties
266
+ * @returns Un arreglo con las propiedades de la forma { name = ... , value = ...}
267
+ */
268
+ this.beautifyProperties = function (properties) {
269
+ var beautifyData = [];
270
+ properties.forEach(function (prop) {
271
+ for (var key in prop) {
272
+ beautifyData.push({ name: key, value: prop[key] });
273
+ }
274
+ });
275
+ return beautifyData;
276
+ };
277
+ this.crateDiscount = function () {
278
+ try {
279
+ var all_discount_1 = '';
280
+ _this.variants.forEach(function (variant) {
281
+ variant.discount && (all_discount_1 = all_discount_1 + ', ' + variant.discount);
282
+ });
283
+ if (all_discount_1 == '') {
284
+ return undefined;
285
+ }
286
+ return all_discount_1;
287
+ }
288
+ catch (error) {
289
+ return undefined;
290
+ }
291
+ };
292
+ this.cratePrice = function () {
293
+ var min_price = 0;
294
+ var max_price = 0;
295
+ var all_prices = [];
296
+ _this.variants.forEach(function (variant) {
297
+ all_prices.push(variant.price);
298
+ });
299
+ min_price = all_prices.reduce(function (a, b) { return Math.min(a, b); });
300
+ max_price = all_prices.reduce(function (a, b) { return Math.max(a, b); }, 0);
301
+ return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
302
+ };
303
+ this.crateSalePrice = function () {
304
+ var min_price = 0;
305
+ var max_price = 0;
306
+ var all_prices = [];
307
+ _this.variants.forEach(function (variant) {
308
+ variant.saleprice && all_prices.push(variant.saleprice);
309
+ });
310
+ if (!all_prices.length) {
311
+ return undefined;
312
+ }
313
+ min_price = all_prices.reduce(function (a, b) { return Math.min(a, b); });
314
+ max_price = all_prices.reduce(function (a, b) { return Math.max(a, b); }, 0);
315
+ return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
316
+ };
317
+ this.inRange = function (quantity, min, max) { return ((quantity - min) * (quantity - max) <= 0); };
318
+ this.validateQuantity = function (quantity) {
319
+ var actualQuantity = _this.cartService.getCountFromItemInCart(_this.variants[0].code);
320
+ var asociatedData = _this.asociatedDataSubject.value;
321
+ console.log('La cantidad que llego: ', quantity, ' y la cantidad actual: ', actualQuantity);
322
+ if ((actualQuantity + quantity) > asociatedData.maximumItemsQuantity) {
323
+ _this.toastrService.show('maximum-items-quantity', { quantity: asociatedData.maximumItemsQuantity });
324
+ return false;
325
+ }
326
+ if ((actualQuantity + quantity) < asociatedData.minimumItemsQuantity) {
327
+ _this.toastrService.show('minimum-items-quantity', { quantity: asociatedData.minimumItemsQuantity });
328
+ return false;
329
+ }
330
+ return true;
331
+ };
332
+ this.validatePriceAndCredits = function (price) {
333
+ if (_this.creditAmount === null) {
334
+ console.log('No hay configuración de créditos para este usuario.');
335
+ return true;
336
+ }
337
+ if (_this.remainingCredits === undefined) {
338
+ return false;
339
+ }
340
+ if (price > _this.remainingCredits) {
341
+ _this.toastrService.show('not-enough-credits');
342
+ return false;
343
+ }
344
+ return true;
345
+ };
346
+ this.fetchCartData = function () {
347
+ _this.cartService.getTotalAmount().subscribe(function (totalAmount) {
348
+ _this.currentTotalAmount = totalAmount;
349
+ });
350
+ _this.cartService.getCreditAmount().subscribe(function (creditAmount) {
351
+ _this.creditAmount = creditAmount;
352
+ });
353
+ _this.cartService.getRemainingCredits().subscribe(function (remainingCredits) {
354
+ _this.remainingCredits = remainingCredits;
355
+ });
356
+ };
357
+ // Cuando haya modelos de respuesta, validamos que no se intente cargar un producto incompleto
358
+ this.isProductValid = function (product) { return true; };
359
+ /**
360
+ *
361
+ * @param product producto el cual se quiere desdoblar por variantes por una opción.
362
+ * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
363
+ * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
364
+ * @returns arreglo con el producto desdoblado por la variante solicitada.
365
+ * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
366
+ */
367
+ this.getProductWithUniqueVariant = function (product, withOption) {
368
+ return _this.productsService.getProductsWithUniqueVariant([product], withOption);
369
+ };
370
+ }
371
+ /**
372
+ * @description agrega/actualiza un item en el carrito
373
+ * @param quantity cantidad a agregar
374
+ * @param variant_code **(opcional)** codigo de la variante seleccionada del producto.
375
+ * @returns
376
+ */
377
+ ProductDetailService.prototype.addToCart = function (quantity, variant_code) {
378
+ quantity = parseInt(quantity);
379
+ if (!this.variants.length) {
380
+ this.toastrService.show('cant-buy');
381
+ return;
382
+ }
383
+ var product_selected = _.clone(this.productSubject.value);
384
+ var variant;
385
+ switch (this.variants.length) {
386
+ case 0:
387
+ this.toastrService.show('no-variants');
388
+ break;
389
+ case 1:
390
+ this.asociatedDataSubject.value.stock == 0 ?
391
+ this.toastrService.show('out-of-stock') :
392
+ variant = this.variants[0];
393
+ break;
394
+ default:
395
+ if (variant_code) {
396
+ variant = this.variants.find(function (variant) { return variant.code === variant_code; });
397
+ if (variant.stock == 0) {
398
+ this.toastrService.show('out-of-stock');
399
+ variant = undefined;
400
+ }
401
+ }
402
+ else {
403
+ this.toastrService.show('variants-left');
404
+ }
405
+ break;
406
+ }
407
+ if (!variant)
408
+ return;
409
+ if (!this.validateQuantity(quantity))
410
+ return;
411
+ var priceToValidate = product_selected.saleprice ? product_selected.saleprice * quantity : product_selected.price * quantity;
412
+ if (!this.validatePriceAndCredits(priceToValidate))
413
+ return;
414
+ this.cartService.addToCart(this.makeAffordableProduct(product_selected), quantity, variant.code);
415
+ };
416
+ ;
417
+ ProductDetailService.prototype.makeAffordableProduct = function (product_selected) {
418
+ product_selected.price = parseFloat(this.asociatedDataSubject.value.price);
419
+ product_selected.saleprice = parseFloat(this.asociatedDataSubject.value.price);
420
+ product_selected.options = {};
421
+ this.variants[0].options.forEach(function (option) { return product_selected.options = __assign(__assign({}, product_selected.options), option); });
422
+ return product_selected;
423
+ };
424
+ /**
425
+ *
426
+ * @param options Array de Variantes y sus valores
427
+ *
428
+ * @description Retorna una lista filtrada de las variantes que estan seleccionadas
429
+ */
430
+ ProductDetailService.prototype.getVariantsSelected = function (options, optionsException) {
431
+ var variantsSelected = [];
432
+ options.forEach(function (v) {
433
+ if (v.values && v.values.length) {
434
+ v.values.forEach(function (val) {
435
+ if (val.selected && !optionsException.find(function (op) { return op.toUpperCase() == v.code.toUpperCase(); })) {
436
+ variantsSelected[v.code] = val.name;
437
+ }
438
+ });
439
+ }
440
+ });
441
+ return variantsSelected;
442
+ };
443
+ /**
444
+ *
445
+ * @param options Array de Variantes y sus valores
446
+ * @param variants Todas las variantes disponibles del producto
447
+ *
448
+ * @description retorna todas las variantes disponibles a seleccion y su stock
449
+ */
450
+ ProductDetailService.prototype.getVariantsAvailable = function (options, variants, optionsException) {
451
+ var _this = this;
452
+ var variantsSelected = this.getVariantsSelected(options, optionsException);
453
+ var variantsAvailable = [];
454
+ variants.map(function (v) {
455
+ var aux = {};
456
+ if (v.options && v.options.length) {
457
+ v.options.map(function (op) {
458
+ Object.assign(aux, op, { stock: v.stock });
459
+ });
460
+ }
461
+ variantsAvailable.push(aux);
462
+ });
463
+ return variantsAvailable.filter(function (va) { return _this.constants.containsAll(__assign({}, variantsSelected), va); });
464
+ };
465
+ /**
466
+ *
467
+ * @param options Array de variantes y sus valores
468
+ * @param code Codigo de la variante a buscar
469
+ * @param name nombre de la variante a buscar
470
+ * @param variants variantes del producto
471
+ *
472
+ * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
473
+ */
474
+ ProductDetailService.prototype.existVariantAndHasStock = function (options, code, name, variants, optionsException) {
475
+ if (optionsException === void 0) { optionsException = []; }
476
+ return this.getVariantsAvailable(options, variants, optionsException).find(function (va) {
477
+ return va.hasOwnProperty(code) && va[code] === name && va.stock > 0;
478
+ });
479
+ };
480
+ ProductDetailService.ctorParameters = function () { return [
481
+ { type: ProductsService },
482
+ { type: CartService },
483
+ { type: ToastService },
484
+ { type: Constants },
485
+ { type: AnalyticsService },
486
+ { type: CurrencyService }
487
+ ]; };
488
+ ProductDetailService = __decorate([
489
+ Injectable()
490
+ ], ProductDetailService);
491
+ return ProductDetailService;
492
+ }());
493
+ export { ProductDetailService };
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RDtJQWVJLDhCQUNZLGVBQWdDLEVBQVUsV0FBd0IsRUFBVSxhQUEyQixFQUN2RyxTQUFvQixFQUFTLGdCQUFrQyxFQUFTLGVBQWdDO1FBRnBILGlCQUdDO1FBRlcsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUN2RyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQWY1RyxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FB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R0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLENBQUE7YUFDTDtZQUNELGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLGNBQU0sZ0JBQWdCLEdBQUksRUFBRSxDQUFDLEVBQXZELENBQXVELENBQUMsQ0FBQTtJQUNsRyxDQUFDO0lBR0Q7Ozs7Ozs7O09BUUc7SUFDSSxzREFBdUIsR0FBOUIsVUFBK0IsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFxQjtRQUFyQixpQ0FBQSxFQUFBLHFCQUFxQjtRQUUvRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsRUFBRTtZQUN6RSxPQUFBLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUM7UUFBNUQsQ0FBNEQsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7O2dCQWhhNEIsZUFBZTtnQkFBdUIsV0FBVztnQkFBeUIsWUFBWTtnQkFDNUYsU0FBUztnQkFBMkIsZ0JBQWdCO2dCQUEwQixlQUFlOztJQWpCM0csb0JBQW9CO1FBRGhDLFVBQVUsRUFBRTtPQUNBLG9CQUFvQixDQThiaEM7SUFBRCwyQkFBQztDQUFBLEFBOWJELElBOGJDO1NBOWJZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBwYXJ0aXRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XHJcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4vcHJvZHVjdHMuc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2FydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vYW5hbHl0aWNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xyXG5pbXBvcnQgeyBDdXJyZW5jeVNlcnZpY2UgfSBmcm9tICcuLi9jdXJyZW5jeS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXRhaWxTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIHByb2R1Y3RTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0Pih7fSk7XHJcbiAgICBwcml2YXRlIG9wdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcclxuICAgIHByaXZhdGUgYXNvY2lhdGVkRGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oeyBwcmljZTogJycsIHN0b2NrOiAwLCBwaWN0dXJlOiAnJyB9KTtcclxuXHJcbiAgICBwcml2YXRlIHZhcmlhbnRzID0gW11cclxuXHJcbiAgICBwdWJsaWMgcHJvZHVjdCQgPSB0aGlzLnByb2R1Y3RTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHVibGljIG9wdGlvbnMkID0gdGhpcy5vcHRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIHB1YmxpYyBhc29jaWF0ZWREYXRhJCA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRUb3RhbEFtb3VudDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjcmVkaXRBbW91bnQ6IG51bWJlciB8IG51bGw7XHJcbiAgICBwcml2YXRlIHJlbWFpbmluZ0NyZWRpdHM6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLCBwcml2YXRlIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSwgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb25zdGFudHM6IENvbnN0YW50cywgcHVibGljIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsIHB1YmxpYyBjdXJyZW5jeVNlcnZpY2U6IEN1cnJlbmN5U2VydmljZSkge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBAcGFyYW0gY29kZSBJZGVudGlmaWNhZG9yIGRlbCBwcm9kdWN0b1xyXG4gICAgKiBAcGFyYW0gdmFyaWFudCBJbmRpY2Egc2kgc2UgZXN0w6Egc29saWNpdGFuZG8gdW4gcHJvZHVjdG8gcG9yIHN1IGNvZGlnbywgbyBwb3IgZWwgY29kaWdvIGNvcnJlc3BvbmRpZW50ZSBhIHVuYSBkZSBzdXMgdmFyaWFudGVzXHJcbiAgICAqICBcclxuICAgICogQ2FyZ2EgZWwgcHJvZHVjdG8gc29saWNpdGFkbyBhc3luY3JvbmljYW1lbnRlIHNpbiByZXNwdWVzdGEgXHJcbiAgICAqL1xyXG4gICAgbG9hZFByb2R1Y3QgPSAoY29kZSwgdmFyaWFudDogYm9vbGVhbiA9IGZhbHNlKSA9PlxyXG4gICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFNwZWNpZmljUHJvZHVjdChjb2RlLCB2YXJpYW50KS50b1Byb21pc2UoKS50aGVuKFxyXG4gICAgICAgICAgICByZXMgPT4gdmFyaWFudCA/IHRoaXMuaW5pdGlhbGl6ZShyZXMsIGNvZGUpIDogdGhpcy5pbml0aWFsaXplKHJlcyksXHJcbiAgICAgICAgICAgIGVyciA9PiB0aGlzLnByb2R1Y3RTdWJqZWN0Lm5leHQobnVsbClcclxuICAgICAgICApXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdF9pZCBJZGVudGlmaWNhZG9yIGRlbCBwcm9kdWN0b1xyXG4gICAgICogQHBhcmFtIHZhcmlhbnQgSW5kaWNhIHNpIHNlIGVzdMOhIHNvbGljaXRhbmRvIHVuIHByb2R1Y3RvIHBvciBzdSBjb2RpZ28sIG8gcG9yIGVsIGNvZGlnbyBjb3JyZXNwb25kaWVudGUgYSB1bmEgZGUgc3VzIHZhcmlhbnRlc1xyXG4gICAgICogQGFzeW5jXHJcbiAgICAgKiAgXHJcbiAgICAgKiBBIGRpZmVyZW5jaWEgZGVsIG1ldG9kbyBsb2FkUHJvZHVjdCwgZXN0ZSByZXRvcm5hIHVuIHZhbG9yIGN1YW5kbyB0ZXJtaW5hIFxyXG4gICAgICovXHJcbiAgICBnZXRQcm9kdWN0ID0gYXN5bmMgKHByb2R1Y3RfaWQsIHZhcmlhbnQ6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRTcGVjaWZpY1Byb2R1Y3QocHJvZHVjdF9pZCwgdmFyaWFudCkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LmVycm9yKSB0aGlzLnByb2R1Y3RTdWJqZWN0Lm5leHQobnVsbCk7XHJcbiAgICAgICAgZWxzZSB2YXJpYW50ID8gdGhpcy5pbml0aWFsaXplKHJlc3VsdCwgcHJvZHVjdF9pZCkgOiB0aGlzLmluaXRpYWxpemUocmVzdWx0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemUgPSAocHJvZHVjdCwgdmFyaWFudF9jb2RlPykgPT4ge1xyXG4gICAgICAgIHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChwcm9kdWN0KTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5nZXRPcHRpb25zKCkpXHJcbiAgICAgICAgdmFyaWFudF9jb2RlID8gdGhpcy51cGRhdGVWYXJpYW50cyh2YXJpYW50X2NvZGUpIDogdGhpcy51cGRhdGVWYXJpYW50cygpO1xyXG4gICAgICAgIHRoaXMudmFyaWFudHMubGVuZ3RoICYmIHRoaXMuZ2VuZXJhdGVBc29jaWF0ZWREYXRhRnJvbVZhcmlhbnRzKCk7XHJcbiAgICAgICAgdGhpcy5mZXRjaENhcnREYXRhKClcclxuICAgICAgICAvL3RoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbScsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RhbnRzLmN1cnJlbmN5LmNvZGUgfSlcclxuICAgICAgICAvLyB2YXJpYW50X2NvZGUgJiYgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtJywgeyAuLi5wcm9kdWN0LCBjdXJyZW5jeTogdGhpcy5jb25zdGFudHMuY3VycmVuY3kuY29kZSB9KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFByb2R1Y3QgPSAocHJvZHVjdCkgPT4gdGhpcy5pc1Byb2R1Y3RWYWxpZChwcm9kdWN0KSAmJiB0aGlzLmluaXRpYWxpemUocHJvZHVjdCk7XHJcblxyXG4gICAgaXNSZWFkeSA9ICgpID0+IHRoaXMudmFyaWFudHMubGVuZ3RoID09IDE7XHJcblxyXG4gICAgc2V0T3B0aW9uID0gKG9wdGlvbl9jb2RlLCBvcHRpb25fdmFsdWUpID0+IHtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1N1YmplY3QudmFsdWU7XHJcbiAgICAgICAgbGV0IG9wdGlvbiA9IG9wdGlvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQuY29kZSA9PSBvcHRpb25fY29kZSkudmFsdWVzLmZpbmQodmFsdWUgPT4gdmFsdWUubmFtZSA9PSBvcHRpb25fdmFsdWUpO1xyXG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9ICFvcHRpb24uc2VsZWN0ZWQ7XHJcbiAgICAgICAgb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZm9yRWFjaChcclxuICAgICAgICAgICAgdmFsdWUgPT4geyBpZiAodmFsdWUubmFtZSAhPSBvcHRpb24ubmFtZSkgdmFsdWUuc2VsZWN0ZWQgPSBmYWxzZSB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYXJpYW50cygpO1xyXG4gICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gSGFiaWxpdGFyIHRvZG9zIGxvcyBib3RvbmVzIGNvbiBsYSBjbGFzZSAnYWRkQ2FydEJ1dHRvbidcclxuICAgICAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGRDYXJ0QnV0dG9uJyk7XHJcbiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xyXG4gICAgICAgICAgICAgICAgKGJ1dHRvbiBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBc29jaWF0ZWREYXRhRnJvbVZhcmlhbnRzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3NlbGVjdGlvbi1ub3QtYXZhaWxhYmxlJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBEZXNoYWJpbGl0YXIgdG9kb3MgbG9zIGJvdG9uZXMgY29uIGxhIGNsYXNlICdzdWJtaXQtYnV0dG9uJ1xyXG4gICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkZENhcnRCdXR0b24nKTtcclxuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAoYnV0dG9uIGFzIEhUTUxCdXR0b25FbGVtZW50KS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlUGljdHVyZSA9IChwaWN0dXJlKSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgIGRhdGEucGljdHVyZSA9IHBpY3R1cmU7XHJcbiAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yID0gKGVycm9yKSA9PiB7XHJcbiAgICAgICAgLy8gV2hhdGhldmVyIHdlIG5lZWQgdG8gZG8gd2l0aCBlcnJvclxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGFncmVnYS9hY3R1YWxpemEgdW4gaXRlbSBlbiBlbCBjYXJyaXRvIFxyXG4gICAgICogQHBhcmFtIHF1YW50aXR5IGNhbnRpZGFkIGEgYWdyZWdhclxyXG4gICAgICogQHBhcmFtIHZhcmlhbnRfY29kZSAqKihvcGNpb25hbCkqKiBjb2RpZ28gZGUgbGEgdmFyaWFudGUgc2VsZWNjaW9uYWRhIGRlbCBwcm9kdWN0by5cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhZGRUb0NhcnQocXVhbnRpdHksIHZhcmlhbnRfY29kZT86IHN0cmluZykge1xyXG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdjYW50LWJ1eScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcm9kdWN0X3NlbGVjdGVkID0gXy5jbG9uZSh0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHZhcmlhbnQ6IGFueTtcclxuXHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnZhcmlhbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm8tdmFyaWFudHMnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDAgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9IHRoaXMudmFyaWFudHNbMF1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRfY29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzLmZpbmQodmFyaWFudCA9PiB2YXJpYW50LmNvZGUgPT09IHZhcmlhbnRfY29kZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudC5zdG9jayA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygndmFyaWFudHMtbGVmdCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdmFyaWFudCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVF1YW50aXR5KHF1YW50aXR5KSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBwcmljZVRvVmFsaWRhdGUgPSBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSA/IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlICogcXVhbnRpdHkgOiBwcm9kdWN0X3NlbGVjdGVkLnByaWNlICogcXVhbnRpdHk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzKHByaWNlVG9WYWxpZGF0ZSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0NhcnQodGhpcy5tYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZCksIHF1YW50aXR5LCB2YXJpYW50LmNvZGUpO1xyXG4gICAgfTtcclxuXHJcblxyXG5cclxuICAgIGFkZFRvQ2FydFByb21pc2UgPSBhc3luYyAocXVhbnRpdHkpID0+IHtcclxuICAgICAgICBxdWFudGl0eSA9IHBhcnNlSW50KHF1YW50aXR5KTtcclxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnY2FudC1idXknIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcm9kdWN0X3NlbGVjdGVkID0gXy5jbG9uZSh0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPiAxIHx8IHRoaXMudmFyaWFudHMubGVuZ3RoID09IDAgfHwgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA9PSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA9PSAwKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ25vLXZhcmlhbnRzJyB9O1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDEgJiYgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA+IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAndmFyaWFudHMtbGVmdCcgfTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggIT0gMCAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnb3V0LW9mLXN0b2NrJyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVRdWFudGl0eShxdWFudGl0eSkpIHJldHVybjtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0NhcnRQcm9taXNlKHRoaXMubWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQpLCBxdWFudGl0eSwgdGhpcy52YXJpYW50c1swXS5jb2RlKTtcclxuICAgICAgICByZXR1cm4gKHJlc3VsdCAmJiAhKHJlc3VsdC5lcnJvcikpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGdldE9wdGlvbnMgPSAocHJvZHVjdF9yZWNlaXZlZD86IFByb2R1Y3QpID0+IHtcclxuICAgICAgICBsZXQgcHJvZHVjdCA9IHByb2R1Y3RfcmVjZWl2ZWQgfHwgdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZTtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHByb2R1Y3Qub3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy50b09wdGlvbihlbGVtZW50KSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvT3B0aW9uID0gKHByZW9wdGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWU6IHByZW9wdGlvbi5sYWJlbCxcclxuICAgICAgICAgICAgY29kZTogcHJlb3B0aW9uLmNvZGUsXHJcbiAgICAgICAgICAgIHR5cGU6IHByZW9wdGlvbi50eXBlLFxyXG4gICAgICAgICAgICB2YWx1ZXM6IHByZW9wdGlvbi52YWx1ZXMubWFwKHZhbHVlID0+ICh7IG5hbWU6IHZhbHVlLmNvZGUsIGRlc2NyaXB0aW9uOiB2YWx1ZS5uYW1lLCBpbWFnZTogdmFsdWUuaW1hZ2UsIG1vYmlsZUltYWdlOiB2YWx1ZS5tb2JpbGVJbWFnZSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkOiBQcm9kdWN0KSB7XHJcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5wcmljZSA9IHBhcnNlRmxvYXQodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5wcmljZSk7XHJcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgPSBwYXJzZUZsb2F0KHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucHJpY2UpO1xyXG4gICAgICAgIHByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMudmFyaWFudHNbMF0ub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBwcm9kdWN0X3NlbGVjdGVkLm9wdGlvbnMgPSB7IC4uLnByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucywgLi4ub3B0aW9uIH0pXHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3Rfc2VsZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVWYXJpYW50cyA9IChjb2RlPykgPT4ge1xyXG4gICAgICAgIGxldCB2YXJpYW50cyA9IHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUudmFyaWFudHM7XHJcbiAgICAgICAgaWYgKCFjb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QudmFsdWUuZm9yRWFjaChvcHRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHMgPSB2YXJpYW50cy5maWx0ZXIodmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFudC5vcHRpb25zLnNvbWUodmFyaWFudF9vcHRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3B0aW9uLmNvZGUgaW4gdmFyaWFudF9vcHRpb24gJiYgdmFyaWFudF9vcHRpb25bb3B0aW9uLmNvZGVdID09IHZhbHVlLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhcmlhbnRzID0gdmFyaWFudHMuZmlsdGVyKHZhcmlhbnQgPT4gdmFyaWFudC5jb2RlID09IGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhcmlhbnRzID0gdmFyaWFudHM7XHJcbiAgICAgICAgY29kZSAmJiB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZU9wdGlvbnMgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gdGhpcy52YXJpYW50cy5sZW5ndGggJiYgdGhpcy52YXJpYW50c1swXTtcclxuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gT2JqZWN0LmtleXMob3B0aW9uKS5mb3JFYWNoKGtleSA9PiB0aGlzLnNldE9wdGlvbihrZXksIG9wdGlvbltrZXldKSkpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IGFzb2NpYXRlZDogYW55ID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zdG9jayA9IHRoaXMudmFyaWFudHNbMF0uc3RvY2tcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy52YXJpYW50c1swXS5wcmljZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zYWxlcHJpY2UgPSB0aGlzLnZhcmlhbnRzWzBdLnNhbGVwcmljZSAmJiB0aGlzLnZhcmlhbnRzWzBdLnNhbGVwcmljZS50b1N0cmluZygpIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy52YXJpYW50c1swXT8uZGlzY291bnQgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBhc29jaWF0ZWQucHJvcGVydGllcyA9IHRoaXMudmFyaWFudHNbMF0ucHJvcGVydGllcyA/IHRoaXMuYmVhdXRpZnlQcm9wZXJ0aWVzKHRoaXMudmFyaWFudHNbMF0ucHJvcGVydGllcykgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC51bmlxdWVFeHRlcm5hbENvZGUgPSB0aGlzLnZhcmlhbnRzWzBdPy51bmlxdWVFeHRlcm5hbENvZGUgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBhc29jaWF0ZWQubXVsdGlwbGVRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5wcmljZSA9IHRoaXMuY3JhdGVQcmljZSgpXHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zYWxlcHJpY2UgPSB0aGlzLmNyYXRlU2FsZVByaWNlKClcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnN0b2NrID0gKHRoaXMudmFyaWFudHMubWFwKHZhcmlhbnQgPT4gdmFyaWFudC5zdG9jaykpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpXHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5kaXNjb3VudCA9IHRoaXMuY3JhdGVEaXNjb3VudCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAoJ2ltYWdlcycgaW4gdGhpcy52YXJpYW50c1swXSAmJiB0aGlzLnZhcmlhbnRzWzBdLmltYWdlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICA/IGFzb2NpYXRlZC5waWN0dXJlID0gdGhpcy52YXJpYW50c1swXS5pbWFnZXNbMF1cclxuICAgICAgICAgICAgOiBhc29jaWF0ZWQucGljdHVyZSA9ICh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnBpY3R1cmUgfHwgdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZS5waWN0dXJlc2RlZmF1bHRbMF0pO1xyXG5cclxuXHJcbiAgICAgICAgYXNvY2lhdGVkLm1heGltdW1BbW91bnQgPSB0aGlzLnZhcmlhbnRzWzBdPy5tYXhpbXVtQW1vdW50IHx8IDBcclxuICAgICAgICBhc29jaWF0ZWQubWluaW11bUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/Lm1pbmltdW1BbW91bnQgfHwgMFxyXG5cclxuICAgICAgICBhc29jaWF0ZWQubWF4aW11bUl0ZW1zUXVhbnRpdHkgPSB0aGlzLnZhcmlhbnRzWzBdPy5zdG9jayA+IDAgJiYgJ21heGltdW1JdGVtc1F1YW50aXR5JyBpbiB0aGlzLnZhcmlhbnRzWzBdID8gdGhpcy52YXJpYW50c1swXT8ubWF4aW11bUl0ZW1zUXVhbnRpdHkgOiB0aGlzLnZhcmlhbnRzWzBdPy5zdG9ja1xyXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtSXRlbXNRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrID4gMCAmJiAnbWluaW11bUl0ZW1zUXVhbnRpdHknIGluIHRoaXMudmFyaWFudHNbMF1cclxuICAgICAgICAgICAgJiYgdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHkgPiAwID8gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUl0ZW1zUXVhbnRpdHlcclxuICAgICAgICAgICAgOiAodGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSA/IHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgOiAxKVxyXG5cclxuICAgICAgICBhc29jaWF0ZWQuZmluYWxDb25zdW1lciA9IHtcclxuICAgICAgICAgICAgZmluYWxDb25zdW1lclByaWNlOiB0aGlzLnZhcmlhbnRzWzBdPy5maW5hbF9jb25zdW1lcl9wcmljZSxcclxuICAgICAgICAgICAgb3JpZ2luYWxGaW5hbENvbnN1bWVyUHJpY2U6IHRoaXMudmFyaWFudHNbMF0/Lm9yaWdpbmFsX2ZpbmFsX2NvbnN1bWVyX3ByaWNlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNvY2lhdGVkLnRheGVzID0ge1xyXG4gICAgICAgICAgICB0YXhJbmNsdWRlZDogdGhpcy52YXJpYW50c1swXT8udGF4SW5jbHVkZWQsXHJcbiAgICAgICAgICAgIHRheENhdGVnb3J5OiB0aGlzLnZhcmlhbnRzWzBdPy50YXhDYXRlZ29yeSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QubmV4dChhc29jaWF0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlY2liZSBsYXMgcHJvcGllZGFkZXMgZGUgdW5hIHZhcmlhbnRlIHkgcG9yIGNhZGEgaXRlbSBhcm1hIHVuIG9iamV0byBjb24gXHJcbiAgICAgKiBlbCBuYW1lPWNsYXZlIHkgdmFsdWU9dmFsb3IgZGUgZXNlIGl0ZW0uICBcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFxyXG4gICAgICogQHJldHVybnMgVW4gYXJyZWdsbyBjb24gbGFzIHByb3BpZWRhZGVzIGRlIGxhIGZvcm1hIHsgbmFtZSA9IC4uLiAsIHZhbHVlID0gLi4ufVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJlYXV0aWZ5UHJvcGVydGllcyA9IChwcm9wZXJ0aWVzKSA9PiB7XHJcbiAgICAgICAgbGV0IGJlYXV0aWZ5RGF0YSA9IFtdXHJcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgYmVhdXRpZnlEYXRhLnB1c2goeyBuYW1lOiBrZXksIHZhbHVlOiBwcm9wW2tleV0gfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBiZWF1dGlmeURhdGFcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyYXRlRGlzY291bnQgPSAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGFsbF9kaXNjb3VudCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXJpYW50LmRpc2NvdW50ICYmIChhbGxfZGlzY291bnQgPSBhbGxfZGlzY291bnQgKyAnLCAnICsgdmFyaWFudC5kaXNjb3VudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoYWxsX2Rpc2NvdW50ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFsbF9kaXNjb3VudFxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmF0ZVByaWNlID0gKCkgPT4ge1xyXG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xyXG4gICAgICAgIGxldCBtYXhfcHJpY2UgPSAwO1xyXG4gICAgICAgIGxldCBhbGxfcHJpY2VzID0gW107XHJcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xyXG4gICAgICAgICAgICBhbGxfcHJpY2VzLnB1c2godmFyaWFudC5wcmljZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbWluX3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpKTtcclxuICAgICAgICBtYXhfcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xyXG4gICAgICAgIHJldHVybiBtaW5fcHJpY2UgPT0gbWF4X3ByaWNlID8gbWF4X3ByaWNlLnRvU3RyaW5nKCkgOiBtaW5fcHJpY2UgKyAnIC0gJyArIG1heF9wcmljZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyYXRlU2FsZVByaWNlID0gKCkgPT4ge1xyXG4gICAgICAgIGxldCBtaW5fcHJpY2UgPSAwO1xyXG4gICAgICAgIGxldCBtYXhfcHJpY2UgPSAwO1xyXG4gICAgICAgIGxldCBhbGxfcHJpY2VzID0gW107XHJcbiAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYW50LnNhbGVwcmljZSAmJiBhbGxfcHJpY2VzLnB1c2godmFyaWFudC5zYWxlcHJpY2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghYWxsX3ByaWNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xyXG4gICAgICAgIG1heF9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XHJcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5SYW5nZSA9IChxdWFudGl0eSwgbWluLCBtYXgpID0+ICgocXVhbnRpdHkgLSBtaW4pICogKHF1YW50aXR5IC0gbWF4KSA8PSAwKVxyXG5cclxuICAgIHByaXZhdGUgdmFsaWRhdGVRdWFudGl0eSA9IChxdWFudGl0eTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsUXVhbnRpdHkgPSB0aGlzLmNhcnRTZXJ2aWNlLmdldENvdW50RnJvbUl0ZW1JbkNhcnQodGhpcy52YXJpYW50c1swXS5jb2RlKTtcclxuICAgICAgICBjb25zdCBhc29jaWF0ZWREYXRhID0gdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnTGEgY2FudGlkYWQgcXVlIGxsZWdvOiAnLCBxdWFudGl0eSwgJyB5IGxhIGNhbnRpZGFkIGFjdHVhbDogJywgYWN0dWFsUXVhbnRpdHkpO1xyXG4gICAgICAgIGlmICgoYWN0dWFsUXVhbnRpdHkgKyBxdWFudGl0eSkgPiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtYXhpbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogYXNvY2lhdGVkRGF0YS5tYXhpbXVtSXRlbXNRdWFudGl0eSB9KVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoYWN0dWFsUXVhbnRpdHkgKyBxdWFudGl0eSkgPCBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtaW5pbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSB9KVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyA9IChwcmljZTogbnVtYmVyKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3JlZGl0QW1vdW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBoYXkgY29uZmlndXJhY2nDs24gZGUgY3LDqWRpdG9zIHBhcmEgZXN0ZSB1c3VhcmlvLicpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJpY2UgPiB0aGlzLnJlbWFpbmluZ0NyZWRpdHMpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgZmV0Y2hDYXJ0RGF0YSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldFRvdGFsQW1vdW50KCkuc3Vic2NyaWJlKCh0b3RhbEFtb3VudCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb3RhbEFtb3VudCA9IHRvdGFsQW1vdW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldENyZWRpdEFtb3VudCgpLnN1YnNjcmliZSgoY3JlZGl0QW1vdW50KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlZGl0QW1vdW50ID0gY3JlZGl0QW1vdW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldFJlbWFpbmluZ0NyZWRpdHMoKS5zdWJzY3JpYmUoKHJlbWFpbmluZ0NyZWRpdHMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZW1haW5pbmdDcmVkaXRzID0gcmVtYWluaW5nQ3JlZGl0cztcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ3VhbmRvIGhheWEgbW9kZWxvcyBkZSByZXNwdWVzdGEsIHZhbGlkYW1vcyBxdWUgbm8gc2UgaW50ZW50ZSBjYXJnYXIgdW4gcHJvZHVjdG8gaW5jb21wbGV0b1xyXG4gICAgcHJpdmF0ZSBpc1Byb2R1Y3RWYWxpZCA9IChwcm9kdWN0OiBQcm9kdWN0KSA9PiB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBWYXJpYW50ZXMgeSBzdXMgdmFsb3Jlc1xyXG4gICAgICogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0b3JuYSB1bmEgbGlzdGEgZmlsdHJhZGEgZGUgbGFzIHZhcmlhbnRlcyBxdWUgZXN0YW4gc2VsZWNjaW9uYWRhc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9uczogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogQXJyYXk8T2JqZWN0PiB7XHJcblxyXG4gICAgICAgIGxldCB2YXJpYW50c1NlbGVjdGVkID0gW107XHJcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICAgICAgICBpZiAodi52YWx1ZXMgJiYgdi52YWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2LnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5zZWxlY3RlZCAmJiAhb3B0aW9uc0V4Y2VwdGlvbi5maW5kKG9wID0+IG9wLnRvVXBwZXJDYXNlKCkgPT0gdi5jb2RlLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzU2VsZWN0ZWRbdi5jb2RlXSA9IHZhbC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZhcmlhbnRzU2VsZWN0ZWQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBWYXJpYW50ZXMgeSBzdXMgdmFsb3Jlc1xyXG4gICAgICogQHBhcmFtIHZhcmlhbnRzIFRvZGFzIGxhcyB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgZGVsIHByb2R1Y3RvXHJcbiAgICAgKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiByZXRvcm5hIHRvZGFzIGxhcyB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgYSBzZWxlY2Npb24geSBzdSBzdG9ja1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9uczogYW55LCB2YXJpYW50czogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogYW55IHtcclxuXHJcbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSB0aGlzLmdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9ucywgb3B0aW9uc0V4Y2VwdGlvbik7XHJcblxyXG4gICAgICAgIGxldCB2YXJpYW50c0F2YWlsYWJsZSA9IFtdO1xyXG5cclxuICAgICAgICB2YXJpYW50cy5tYXAodiA9PiB7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXV4ID0ge307XHJcbiAgICAgICAgICAgIGlmICh2Lm9wdGlvbnMgJiYgdi5vcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdi5vcHRpb25zLm1hcChvcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhdXgsIG9wLCB7IHN0b2NrOiB2LnN0b2NrIH0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXJpYW50c0F2YWlsYWJsZS5wdXNoKGF1eCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gdmFyaWFudHNBdmFpbGFibGUuZmlsdGVyKHZhID0+IHRoaXMuY29uc3RhbnRzLmNvbnRhaW5zQWxsKHsgLi4udmFyaWFudHNTZWxlY3RlZCB9LCB2YSkpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSB2YXJpYW50ZXMgeSBzdXMgdmFsb3Jlc1xyXG4gICAgICogQHBhcmFtIGNvZGUgQ29kaWdvIGRlIGxhIHZhcmlhbnRlIGEgYnVzY2FyXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBub21icmUgZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcclxuICAgICAqIEBwYXJhbSB2YXJpYW50cyB2YXJpYW50ZXMgZGVsIHByb2R1Y3RvXHJcbiAgICAgKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBidXNjYSBlbiBsYSBsaXN0YSBkZSB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgc2kgaGF5IGRlIGVzZSBjb2RpZ28sIGVzZSBub21icmUgeSBjb24gc3RvY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleGlzdFZhcmlhbnRBbmRIYXNTdG9jayhvcHRpb25zLCBjb2RlLCBuYW1lLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbiA9IFtdKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhcmlhbnRzQXZhaWxhYmxlKG9wdGlvbnMsIHZhcmlhbnRzLCBvcHRpb25zRXhjZXB0aW9uKS5maW5kKHZhID0+XHJcbiAgICAgICAgICAgIHZhLmhhc093blByb3BlcnR5KGNvZGUpICYmIHZhW2NvZGVdID09PSBuYW1lICYmIHZhLnN0b2NrID4gMClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgcHJvZHVjdG8gZWwgY3VhbCBzZSBxdWllcmUgZGVzZG9ibGFyIHBvciB2YXJpYW50ZXMgcG9yIHVuYSBvcGNpw7NuLlxyXG4gICAgICogQHBhcmFtIHdpdGhPcHRpb24gJ3R5cGUnIHRpcG8gZGUgb3BjacOzbiwgY29kZTogY8OzZGlnbyBkZSBsYSBvcGNpw7NuLiAnZGVmYXVsdEZpcnN0T3B0aW9uJzogZW4gY2FzbyBkZSBxdWUgbm8gc2UgcHVlZGEgZGVzZG9ibGFyIHBvciBsYSBvcGNpw7NuIGluZGljYWRhIHNpIGVsIHZhbG9yIGVzIHZlcmRhZGVybyBzZSBpbnRlbnRhcmEgZGVzZG9ibGFyIHBvciBsYSBwcmltZXJhIG9wY2nDs24gYXNvY2lhZGEgYWwgcHJvZHVjdG8uXHJcbiAgICAgKiAnY2hlY2tJZlN0b2NrJzogZW4gY2FzbyBkZSBxdWUgZXN0YSB2YWxvciBzZWEgdmVyZGFkZXJvIHNlIHJlYWxpemEgdW4gY29udHJvbCBkZSBxdWUgbGEgdmFyaWFudGVzIGN1ZW50ZW4gY29uIHN0b2NrIHBhcmEgc2VyIHVuIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlLCBzaSBlbCB2YWxvciBlcyBmYWxzbyBubyBzZSByZWFsaXphIGRpY2hvIGNvbnRyb2wgeSBlbCBwcm9kdWN0byBzZSBkZXNkb2JsYXJhIGNvbiBzdG9jayBlbiAwLlxyXG4gICAgICogQHJldHVybnMgYXJyZWdsbyBjb24gZWwgcHJvZHVjdG8gZGVzZG9ibGFkbyBwb3IgbGEgdmFyaWFudGUgc29saWNpdGFkYS5cclxuICAgICAqIChvcGNpw7NuIHBvciBkZWZlY3RvIHF1ZSBzZSBpbnRlbnRhIGhhY2VyIGVsIGRlc2RvYmxhbWllbnRvICdjb2xvcicsIG8gYmllbiBzaSBlbiBsZSBwYXLDoW1ldHJvIHdpdGhPcHRpb24gZWwgYXRyaWJ1dG8gJ2RlZmF1bHRGaXJzdE9wdGlvbicgZXMgdmVyZGFkZXJvIHNlIGRlc2RvYmxhIHBvciBsYSBwcmltZXJhIG9wY2nDs24gYXNvY2lhZGEgYWwgcHJvZHVjdG8gKSBcclxuICAgICAqL1xyXG4gICAgZ2V0UHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50ID0gKHByb2R1Y3QsIHdpdGhPcHRpb24/OiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQoW3Byb2R1Y3RdLCB3aXRoT3B0aW9uKVxyXG4gICAgfVxyXG5cclxufSJdfQ==