@infrab4a/connect 3.13.7 → 3.13.8-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/README.md +24 -24
  2. package/bundles/infrab4a-connect.umd.js +5939 -5938
  3. package/bundles/infrab4a-connect.umd.js.map +1 -1
  4. package/domain/catalog/helpers/index.d.ts +1 -1
  5. package/domain/catalog/helpers/round-product-price.helper.d.ts +4 -4
  6. package/domain/catalog/index.d.ts +3 -3
  7. package/domain/catalog/models/category-collection-children.d.ts +13 -13
  8. package/domain/catalog/models/category-filter.d.ts +9 -9
  9. package/domain/catalog/models/category.d.ts +29 -29
  10. package/domain/catalog/models/enums/index.d.ts +2 -2
  11. package/domain/catalog/models/enums/product-genders.enum.d.ts +5 -5
  12. package/domain/catalog/models/enums/shops.enum.d.ts +6 -6
  13. package/domain/catalog/models/filter-option.d.ts +9 -9
  14. package/domain/catalog/models/filter.d.ts +12 -12
  15. package/domain/catalog/models/index.d.ts +10 -10
  16. package/domain/catalog/models/kit-product.d.ts +12 -12
  17. package/domain/catalog/models/product.d.ts +44 -44
  18. package/domain/catalog/models/types/category-condition.type.d.ts +4 -4
  19. package/domain/catalog/models/types/category-metadata.type.d.ts +4 -4
  20. package/domain/catalog/models/types/category-product.d.ts +4 -4
  21. package/domain/catalog/models/types/index.d.ts +11 -11
  22. package/domain/catalog/models/types/product-evaluation.type.d.ts +6 -6
  23. package/domain/catalog/models/types/product-gender.type.d.ts +1 -1
  24. package/domain/catalog/models/types/product-metadata.type.d.ts +4 -4
  25. package/domain/catalog/models/types/product-review.type.d.ts +17 -17
  26. package/domain/catalog/models/types/shop-description.type.d.ts +7 -7
  27. package/domain/catalog/models/types/shop-price.type.d.ts +6 -6
  28. package/domain/catalog/models/types/stock.type.d.ts +3 -3
  29. package/domain/catalog/models/types/variant-grade.type.d.ts +4 -4
  30. package/domain/catalog/models/variant.d.ts +17 -17
  31. package/domain/catalog/repositories/category-collection-children.repository.d.ts +4 -4
  32. package/domain/catalog/repositories/category-filter.repository.d.ts +5 -5
  33. package/domain/catalog/repositories/category.repository.d.ts +18 -18
  34. package/domain/catalog/repositories/filter-option.repository.d.ts +4 -4
  35. package/domain/catalog/repositories/filter.repository.d.ts +4 -4
  36. package/domain/catalog/repositories/index.d.ts +8 -8
  37. package/domain/catalog/repositories/product.repository.d.ts +13 -13
  38. package/domain/catalog/repositories/subscription-product.repository.d.ts +4 -4
  39. package/domain/catalog/repositories/variant.repository.d.ts +4 -4
  40. package/domain/generic/index.d.ts +2 -2
  41. package/domain/generic/model/base.model.d.ts +14 -14
  42. package/domain/generic/model/identifier-fields.d.ts +4 -4
  43. package/domain/generic/model/index.d.ts +3 -3
  44. package/domain/generic/model/types/base-model-builder.type.d.ts +17 -17
  45. package/domain/generic/model/types/identifier-model.type.d.ts +8 -8
  46. package/domain/generic/model/types/index.d.ts +5 -5
  47. package/domain/generic/model/types/model-base-structure.type.d.ts +12 -12
  48. package/domain/generic/model/types/non-function-properties.type.d.ts +12 -12
  49. package/domain/generic/model/types/non-function-property-name.type.d.ts +13 -13
  50. package/domain/generic/repository/create.repository.d.ts +8 -8
  51. package/domain/generic/repository/crud.repository.d.ts +19 -19
  52. package/domain/generic/repository/delete.repository.d.ts +7 -7
  53. package/domain/generic/repository/enums/index.d.ts +2 -2
  54. package/domain/generic/repository/enums/update-option-actions.enum.d.ts +7 -7
  55. package/domain/generic/repository/enums/where.enum.d.ts +14 -14
  56. package/domain/generic/repository/find.repository.d.ts +14 -14
  57. package/domain/generic/repository/get.repository.d.ts +5 -5
  58. package/domain/generic/repository/index.d.ts +9 -9
  59. package/domain/generic/repository/read.repository.d.ts +14 -14
  60. package/domain/generic/repository/types/index.d.ts +6 -6
  61. package/domain/generic/repository/types/repository-find-filters.type.d.ts +13 -13
  62. package/domain/generic/repository/types/repository-find-result.type.d.ts +4 -4
  63. package/domain/generic/repository/types/repository-limit-options.type.d.ts +4 -4
  64. package/domain/generic/repository/types/repository-order-by-list.type.d.ts +5 -5
  65. package/domain/generic/repository/types/repository-update-params.type.d.ts +11 -11
  66. package/domain/generic/repository/types/where-options.type.d.ts +2 -2
  67. package/domain/generic/repository/update.repository.d.ts +6 -6
  68. package/domain/index.d.ts +6 -6
  69. package/domain/location/index.d.ts +1 -1
  70. package/domain/location/models/address.d.ts +24 -24
  71. package/domain/location/models/index.d.ts +2 -2
  72. package/domain/location/models/types/index.d.ts +3 -3
  73. package/domain/location/models/types/location-bound.type.d.ts +6 -6
  74. package/domain/location/models/types/location-geometry.type.d.ts +7 -7
  75. package/domain/location/models/types/location-lat-lng.type.d.ts +4 -4
  76. package/domain/shop-settings/enums/filter-type.enum.d.ts +19 -19
  77. package/domain/shop-settings/enums/index.d.ts +2 -2
  78. package/domain/shop-settings/enums/questions-filters.enum.d.ts +19 -19
  79. package/domain/shop-settings/helpers/beauty-questions.helper.d.ts +9 -9
  80. package/domain/shop-settings/helpers/index.d.ts +1 -1
  81. package/domain/shop-settings/index.d.ts +4 -4
  82. package/domain/shop-settings/models/home.d.ts +18 -18
  83. package/domain/shop-settings/models/index.d.ts +4 -4
  84. package/domain/shop-settings/models/shop-menu.d.ts +7 -7
  85. package/domain/shop-settings/models/shop-settings.d.ts +9 -9
  86. package/domain/shop-settings/models/types/banner.type.d.ts +6 -6
  87. package/domain/shop-settings/models/types/benefit.type.d.ts +5 -5
  88. package/domain/shop-settings/models/types/home-data.type.d.ts +15 -15
  89. package/domain/shop-settings/models/types/index.d.ts +10 -10
  90. package/domain/shop-settings/models/types/menu-nav.type.d.ts +8 -8
  91. package/domain/shop-settings/models/types/shop-banner.type.d.ts +12 -12
  92. package/domain/shop-settings/models/types/shop-brands.type.d.ts +10 -10
  93. package/domain/shop-settings/models/types/shop-carousel.type.d.ts +5 -5
  94. package/domain/shop-settings/models/types/shop-collection.type.d.ts +9 -9
  95. package/domain/shop-settings/models/types/shop-section.type.d.ts +9 -9
  96. package/domain/shop-settings/models/types/sub-menu.type.d.ts +8 -8
  97. package/domain/shop-settings/repositories/home.repository.d.ts +4 -4
  98. package/domain/shop-settings/repositories/index.d.ts +3 -3
  99. package/domain/shop-settings/repositories/shop-menu.repository.d.ts +4 -4
  100. package/domain/shop-settings/repositories/shop-settings.repository.d.ts +4 -4
  101. package/domain/shopping/index.d.ts +2 -2
  102. package/domain/shopping/models/buy-2-win.d.ts +18 -18
  103. package/domain/shopping/models/campaign-dashboard.d.ts +15 -15
  104. package/domain/shopping/models/campaign-hashtag.d.ts +18 -18
  105. package/domain/shopping/models/checkout.d.ts +26 -26
  106. package/domain/shopping/models/coupons/coupon.d.ts +32 -32
  107. package/domain/shopping/models/coupons/enums/coupon-club-mens.enum.d.ts +5 -5
  108. package/domain/shopping/models/coupons/enums/coupon-subtypes.enum.d.ts +4 -4
  109. package/domain/shopping/models/coupons/enums/coupon-types.enum.d.ts +4 -4
  110. package/domain/shopping/models/coupons/enums/exclusivities.enum.d.ts +8 -8
  111. package/domain/shopping/models/coupons/enums/index.d.ts +3 -3
  112. package/domain/shopping/models/coupons/index.d.ts +2 -2
  113. package/domain/shopping/models/enums/checkout-types.enum.d.ts +5 -5
  114. package/domain/shopping/models/enums/index.d.ts +2 -2
  115. package/domain/shopping/models/enums/order-status.enum.d.ts +10 -10
  116. package/domain/shopping/models/index.d.ts +12 -12
  117. package/domain/shopping/models/line-item.d.ts +8 -8
  118. package/domain/shopping/models/order.d.ts +9 -9
  119. package/domain/shopping/models/payment.d.ts +67 -67
  120. package/domain/shopping/models/shipping-method.d.ts +16 -16
  121. package/domain/shopping/models/subscription/checkout.d.ts +20 -20
  122. package/domain/shopping/models/subscription/index.d.ts +2 -2
  123. package/domain/shopping/models/subscription/plan.d.ts +10 -10
  124. package/domain/shopping/models/types/index.d.ts +7 -7
  125. package/domain/shopping/models/types/payment-address.type.d.ts +12 -12
  126. package/domain/shopping/models/types/payment-billing.type.d.ts +7 -7
  127. package/domain/shopping/models/types/payment-card.type.d.ts +14 -14
  128. package/domain/shopping/models/types/payment-customer.type.d.ts +18 -18
  129. package/domain/shopping/models/types/payment-document.type.d.ts +6 -6
  130. package/domain/shopping/models/types/payment-item.type.d.ts +11 -11
  131. package/domain/shopping/models/types/payment-shipping.type.d.ts +10 -10
  132. package/domain/shopping/repositories/buy-2-win.repository.d.ts +4 -4
  133. package/domain/shopping/repositories/campaign-dashboard.repository.d.ts +4 -4
  134. package/domain/shopping/repositories/campaign-hashtag.repository.d.ts +4 -4
  135. package/domain/shopping/repositories/checkout.repository.d.ts +4 -4
  136. package/domain/shopping/repositories/coupon.repository.d.ts +4 -4
  137. package/domain/shopping/repositories/index.d.ts +9 -9
  138. package/domain/shopping/repositories/legacy-order.repository.d.ts +3 -3
  139. package/domain/shopping/repositories/order.repository.d.ts +4 -4
  140. package/domain/shopping/repositories/payment.repository.d.ts +4 -4
  141. package/domain/shopping/repositories/subscription/checkout.repository.d.ts +4 -4
  142. package/domain/shopping/repositories/subscription/index.d.ts +2 -2
  143. package/domain/shopping/repositories/subscription/plan.repository.d.ts +4 -4
  144. package/domain/users/errors/index.d.ts +3 -3
  145. package/domain/users/errors/unauthorized.error.d.ts +5 -5
  146. package/domain/users/errors/user-already-registered.error.d.ts +5 -5
  147. package/domain/users/errors/weak-password.error.d.ts +5 -5
  148. package/domain/users/index.d.ts +5 -5
  149. package/domain/users/models/beauty-profile.d.ts +11 -11
  150. package/domain/users/models/enums/accessory-importances.enum.d.ts +5 -5
  151. package/domain/users/models/enums/area.enum.d.ts +11 -11
  152. package/domain/users/models/enums/beard-problems.enum.d.ts +9 -9
  153. package/domain/users/models/enums/beard-sizes.enum.d.ts +7 -7
  154. package/domain/users/models/enums/beauty-product-importances.enum.d.ts +6 -6
  155. package/domain/users/models/enums/body-problems.enum.d.ts +11 -11
  156. package/domain/users/models/enums/body-shapes.enum.d.ts +7 -7
  157. package/domain/users/models/enums/body-tattoos.enum.d.ts +5 -5
  158. package/domain/users/models/enums/face-skin-oilinesses.enum.d.ts +7 -7
  159. package/domain/users/models/enums/face-skin-problems.enum.d.ts +10 -10
  160. package/domain/users/models/enums/face-skin-tones.enum.d.ts +8 -8
  161. package/domain/users/models/enums/family-incomes.enum.d.ts +8 -8
  162. package/domain/users/models/enums/fragrance-importances.enum.d.ts +5 -5
  163. package/domain/users/models/enums/hair-colors.enum.d.ts +10 -10
  164. package/domain/users/models/enums/hair-problems.enum.d.ts +10 -10
  165. package/domain/users/models/enums/hair-strands.enum.d.ts +8 -8
  166. package/domain/users/models/enums/hair-types.enum.d.ts +7 -7
  167. package/domain/users/models/enums/index.d.ts +20 -20
  168. package/domain/users/models/enums/office-position.enum.d.ts +6 -6
  169. package/domain/users/models/enums/product-spents.enum.d.ts +8 -8
  170. package/domain/users/models/enums/user-type.enum.d.ts +8 -8
  171. package/domain/users/models/index.d.ts +7 -7
  172. package/domain/users/models/lead.d.ts +8 -8
  173. package/domain/users/models/subscription/edition.d.ts +16 -16
  174. package/domain/users/models/subscription/enums/billing-status.enum.d.ts +3 -3
  175. package/domain/users/models/subscription/enums/edition-status.enum.d.ts +4 -4
  176. package/domain/users/models/subscription/enums/index.d.ts +4 -4
  177. package/domain/users/models/subscription/enums/payment-type.enum.d.ts +5 -5
  178. package/domain/users/models/subscription/enums/status.enum.d.ts +4 -4
  179. package/domain/users/models/subscription/index.d.ts +4 -4
  180. package/domain/users/models/subscription/payment.d.ts +13 -13
  181. package/domain/users/models/subscription/subscription.d.ts +28 -28
  182. package/domain/users/models/user-address.d.ts +7 -7
  183. package/domain/users/models/user-payment-method.d.ts +14 -14
  184. package/domain/users/models/user.d.ts +27 -27
  185. package/domain/users/repositories/beauty-profile.repository.d.ts +4 -4
  186. package/domain/users/repositories/edition.repository.d.ts +4 -4
  187. package/domain/users/repositories/index.d.ts +8 -8
  188. package/domain/users/repositories/lead.repository.d.ts +4 -4
  189. package/domain/users/repositories/subscription-payment.repository.d.ts +4 -4
  190. package/domain/users/repositories/subscription.repository.d.ts +4 -4
  191. package/domain/users/repositories/user-address.repository.d.ts +4 -4
  192. package/domain/users/repositories/user-payment-method.repository.d.ts +4 -4
  193. package/domain/users/repositories/user.repository.d.ts +6 -6
  194. package/domain/users/services/authentication.service.d.ts +12 -12
  195. package/domain/users/services/index.d.ts +3 -3
  196. package/domain/users/services/register.service.d.ts +7 -7
  197. package/domain/users/services/types/basic-user-data.type.d.ts +4 -4
  198. package/domain/users/services/types/index.d.ts +1 -1
  199. package/domain/users/use-cases/authentication.d.ts +21 -21
  200. package/domain/users/use-cases/index.d.ts +4 -4
  201. package/domain/users/use-cases/recovery-password.d.ts +6 -6
  202. package/domain/users/use-cases/register.d.ts +13 -13
  203. package/domain/users/use-cases/signout.d.ts +6 -6
  204. package/errors/duplicated-results.error.d.ts +5 -5
  205. package/errors/index.d.ts +4 -4
  206. package/errors/invalid-argument.error.d.ts +5 -5
  207. package/errors/not-found.error.d.ts +5 -5
  208. package/errors/required-argument.error.d.ts +6 -6
  209. package/esm2015/domain/catalog/helpers/index.js +2 -2
  210. package/esm2015/domain/catalog/helpers/round-product-price.helper.js +15 -15
  211. package/esm2015/domain/catalog/index.js +4 -4
  212. package/esm2015/domain/catalog/models/category-collection-children.js +13 -13
  213. package/esm2015/domain/catalog/models/category-filter.js +7 -7
  214. package/esm2015/domain/catalog/models/category.js +18 -18
  215. package/esm2015/domain/catalog/models/enums/index.js +3 -3
  216. package/esm2015/domain/catalog/models/enums/product-genders.enum.js +7 -7
  217. package/esm2015/domain/catalog/models/enums/shops.enum.js +8 -8
  218. package/esm2015/domain/catalog/models/filter-option.js +7 -7
  219. package/esm2015/domain/catalog/models/filter.js +7 -7
  220. package/esm2015/domain/catalog/models/index.js +11 -11
  221. package/esm2015/domain/catalog/models/kit-product.js +18 -18
  222. package/esm2015/domain/catalog/models/product.js +37 -37
  223. package/esm2015/domain/catalog/models/types/category-condition.type.js +2 -2
  224. package/esm2015/domain/catalog/models/types/category-metadata.type.js +2 -2
  225. package/esm2015/domain/catalog/models/types/category-product.js +2 -2
  226. package/esm2015/domain/catalog/models/types/index.js +12 -12
  227. package/esm2015/domain/catalog/models/types/product-evaluation.type.js +2 -2
  228. package/esm2015/domain/catalog/models/types/product-gender.type.js +2 -2
  229. package/esm2015/domain/catalog/models/types/product-metadata.type.js +2 -2
  230. package/esm2015/domain/catalog/models/types/product-review.type.js +2 -2
  231. package/esm2015/domain/catalog/models/types/shop-description.type.js +2 -2
  232. package/esm2015/domain/catalog/models/types/shop-price.type.js +2 -2
  233. package/esm2015/domain/catalog/models/types/stock.type.js +2 -2
  234. package/esm2015/domain/catalog/models/types/variant-grade.type.js +2 -2
  235. package/esm2015/domain/catalog/models/variant.js +7 -7
  236. package/esm2015/domain/catalog/repositories/category-collection-children.repository.js +2 -2
  237. package/esm2015/domain/catalog/repositories/category-filter.repository.js +2 -2
  238. package/esm2015/domain/catalog/repositories/category.repository.js +2 -2
  239. package/esm2015/domain/catalog/repositories/filter-option.repository.js +2 -2
  240. package/esm2015/domain/catalog/repositories/filter.repository.js +2 -2
  241. package/esm2015/domain/catalog/repositories/index.js +9 -9
  242. package/esm2015/domain/catalog/repositories/product.repository.js +2 -2
  243. package/esm2015/domain/catalog/repositories/subscription-product.repository.js +2 -2
  244. package/esm2015/domain/catalog/repositories/variant.repository.js +2 -2
  245. package/esm2015/domain/generic/index.js +3 -3
  246. package/esm2015/domain/generic/model/base.model.js +24 -24
  247. package/esm2015/domain/generic/model/identifier-fields.js +2 -2
  248. package/esm2015/domain/generic/model/index.js +4 -4
  249. package/esm2015/domain/generic/model/types/base-model-builder.type.js +2 -2
  250. package/esm2015/domain/generic/model/types/identifier-model.type.js +2 -2
  251. package/esm2015/domain/generic/model/types/index.js +6 -6
  252. package/esm2015/domain/generic/model/types/model-base-structure.type.js +2 -2
  253. package/esm2015/domain/generic/model/types/non-function-properties.type.js +2 -2
  254. package/esm2015/domain/generic/model/types/non-function-property-name.type.js +2 -2
  255. package/esm2015/domain/generic/repository/create.repository.js +2 -2
  256. package/esm2015/domain/generic/repository/crud.repository.js +2 -2
  257. package/esm2015/domain/generic/repository/delete.repository.js +2 -2
  258. package/esm2015/domain/generic/repository/enums/index.js +3 -3
  259. package/esm2015/domain/generic/repository/enums/update-option-actions.enum.js +9 -9
  260. package/esm2015/domain/generic/repository/enums/where.enum.js +16 -16
  261. package/esm2015/domain/generic/repository/find.repository.js +2 -2
  262. package/esm2015/domain/generic/repository/get.repository.js +2 -2
  263. package/esm2015/domain/generic/repository/index.js +10 -10
  264. package/esm2015/domain/generic/repository/read.repository.js +2 -2
  265. package/esm2015/domain/generic/repository/types/index.js +7 -7
  266. package/esm2015/domain/generic/repository/types/repository-find-filters.type.js +2 -2
  267. package/esm2015/domain/generic/repository/types/repository-find-result.type.js +2 -2
  268. package/esm2015/domain/generic/repository/types/repository-limit-options.type.js +2 -2
  269. package/esm2015/domain/generic/repository/types/repository-order-by-list.type.js +2 -2
  270. package/esm2015/domain/generic/repository/types/repository-update-params.type.js +2 -2
  271. package/esm2015/domain/generic/repository/types/where-options.type.js +2 -2
  272. package/esm2015/domain/generic/repository/update.repository.js +2 -2
  273. package/esm2015/domain/index.js +7 -7
  274. package/esm2015/domain/location/index.js +2 -2
  275. package/esm2015/domain/location/models/address.js +7 -7
  276. package/esm2015/domain/location/models/index.js +3 -3
  277. package/esm2015/domain/location/models/types/index.js +4 -4
  278. package/esm2015/domain/location/models/types/location-bound.type.js +2 -2
  279. package/esm2015/domain/location/models/types/location-geometry.type.js +2 -2
  280. package/esm2015/domain/location/models/types/location-lat-lng.type.js +2 -2
  281. package/esm2015/domain/shop-settings/enums/filter-type.enum.js +21 -21
  282. package/esm2015/domain/shop-settings/enums/index.js +3 -3
  283. package/esm2015/domain/shop-settings/enums/questions-filters.enum.js +21 -21
  284. package/esm2015/domain/shop-settings/helpers/beauty-questions.helper.js +46 -46
  285. package/esm2015/domain/shop-settings/helpers/index.js +2 -2
  286. package/esm2015/domain/shop-settings/index.js +5 -5
  287. package/esm2015/domain/shop-settings/models/home.js +7 -7
  288. package/esm2015/domain/shop-settings/models/index.js +5 -5
  289. package/esm2015/domain/shop-settings/models/shop-menu.js +7 -7
  290. package/esm2015/domain/shop-settings/models/shop-settings.js +7 -7
  291. package/esm2015/domain/shop-settings/models/types/banner.type.js +2 -2
  292. package/esm2015/domain/shop-settings/models/types/benefit.type.js +2 -2
  293. package/esm2015/domain/shop-settings/models/types/home-data.type.js +2 -2
  294. package/esm2015/domain/shop-settings/models/types/index.js +11 -11
  295. package/esm2015/domain/shop-settings/models/types/menu-nav.type.js +2 -2
  296. package/esm2015/domain/shop-settings/models/types/shop-banner.type.js +2 -2
  297. package/esm2015/domain/shop-settings/models/types/shop-brands.type.js +2 -2
  298. package/esm2015/domain/shop-settings/models/types/shop-carousel.type.js +2 -2
  299. package/esm2015/domain/shop-settings/models/types/shop-collection.type.js +2 -2
  300. package/esm2015/domain/shop-settings/models/types/shop-section.type.js +2 -2
  301. package/esm2015/domain/shop-settings/models/types/sub-menu.type.js +2 -2
  302. package/esm2015/domain/shop-settings/repositories/home.repository.js +2 -2
  303. package/esm2015/domain/shop-settings/repositories/index.js +4 -4
  304. package/esm2015/domain/shop-settings/repositories/shop-menu.repository.js +2 -2
  305. package/esm2015/domain/shop-settings/repositories/shop-settings.repository.js +2 -2
  306. package/esm2015/domain/shopping/index.js +3 -3
  307. package/esm2015/domain/shopping/models/buy-2-win.js +14 -14
  308. package/esm2015/domain/shopping/models/campaign-dashboard.js +7 -7
  309. package/esm2015/domain/shopping/models/campaign-hashtag.js +7 -7
  310. package/esm2015/domain/shopping/models/checkout.js +37 -37
  311. package/esm2015/domain/shopping/models/coupons/coupon.js +38 -38
  312. package/esm2015/domain/shopping/models/coupons/enums/coupon-club-mens.enum.js +7 -7
  313. package/esm2015/domain/shopping/models/coupons/enums/coupon-subtypes.enum.js +6 -6
  314. package/esm2015/domain/shopping/models/coupons/enums/coupon-types.enum.js +10 -10
  315. package/esm2015/domain/shopping/models/coupons/enums/exclusivities.enum.js +10 -10
  316. package/esm2015/domain/shopping/models/coupons/enums/index.js +4 -4
  317. package/esm2015/domain/shopping/models/coupons/index.js +3 -3
  318. package/esm2015/domain/shopping/models/enums/checkout-types.enum.js +7 -7
  319. package/esm2015/domain/shopping/models/enums/index.js +3 -3
  320. package/esm2015/domain/shopping/models/enums/order-status.enum.js +12 -12
  321. package/esm2015/domain/shopping/models/index.js +13 -13
  322. package/esm2015/domain/shopping/models/line-item.js +4 -4
  323. package/esm2015/domain/shopping/models/order.js +11 -11
  324. package/esm2015/domain/shopping/models/payment.js +169 -169
  325. package/esm2015/domain/shopping/models/shipping-method.js +7 -7
  326. package/esm2015/domain/shopping/models/subscription/checkout.js +28 -28
  327. package/esm2015/domain/shopping/models/subscription/index.js +3 -3
  328. package/esm2015/domain/shopping/models/subscription/plan.js +7 -7
  329. package/esm2015/domain/shopping/models/types/index.js +8 -8
  330. package/esm2015/domain/shopping/models/types/payment-address.type.js +2 -2
  331. package/esm2015/domain/shopping/models/types/payment-billing.type.js +2 -2
  332. package/esm2015/domain/shopping/models/types/payment-card.type.js +2 -2
  333. package/esm2015/domain/shopping/models/types/payment-customer.type.js +2 -2
  334. package/esm2015/domain/shopping/models/types/payment-document.type.js +2 -2
  335. package/esm2015/domain/shopping/models/types/payment-item.type.js +2 -2
  336. package/esm2015/domain/shopping/models/types/payment-shipping.type.js +2 -2
  337. package/esm2015/domain/shopping/repositories/buy-2-win.repository.js +2 -2
  338. package/esm2015/domain/shopping/repositories/campaign-dashboard.repository.js +2 -2
  339. package/esm2015/domain/shopping/repositories/campaign-hashtag.repository.js +2 -2
  340. package/esm2015/domain/shopping/repositories/checkout.repository.js +2 -2
  341. package/esm2015/domain/shopping/repositories/coupon.repository.js +2 -2
  342. package/esm2015/domain/shopping/repositories/index.js +10 -10
  343. package/esm2015/domain/shopping/repositories/legacy-order.repository.js +2 -2
  344. package/esm2015/domain/shopping/repositories/order.repository.js +2 -2
  345. package/esm2015/domain/shopping/repositories/payment.repository.js +2 -2
  346. package/esm2015/domain/shopping/repositories/subscription/checkout.repository.js +2 -2
  347. package/esm2015/domain/shopping/repositories/subscription/index.js +3 -3
  348. package/esm2015/domain/shopping/repositories/subscription/plan.repository.js +2 -2
  349. package/esm2015/domain/users/errors/index.js +4 -4
  350. package/esm2015/domain/users/errors/unauthorized.error.js +8 -8
  351. package/esm2015/domain/users/errors/user-already-registered.error.js +8 -8
  352. package/esm2015/domain/users/errors/weak-password.error.js +8 -8
  353. package/esm2015/domain/users/index.js +6 -6
  354. package/esm2015/domain/users/models/beauty-profile.js +12 -12
  355. package/esm2015/domain/users/models/enums/accessory-importances.enum.js +7 -7
  356. package/esm2015/domain/users/models/enums/area.enum.js +13 -13
  357. package/esm2015/domain/users/models/enums/beard-problems.enum.js +11 -11
  358. package/esm2015/domain/users/models/enums/beard-sizes.enum.js +9 -9
  359. package/esm2015/domain/users/models/enums/beauty-product-importances.enum.js +8 -8
  360. package/esm2015/domain/users/models/enums/body-problems.enum.js +13 -13
  361. package/esm2015/domain/users/models/enums/body-shapes.enum.js +9 -9
  362. package/esm2015/domain/users/models/enums/body-tattoos.enum.js +7 -7
  363. package/esm2015/domain/users/models/enums/face-skin-oilinesses.enum.js +9 -9
  364. package/esm2015/domain/users/models/enums/face-skin-problems.enum.js +12 -12
  365. package/esm2015/domain/users/models/enums/face-skin-tones.enum.js +10 -10
  366. package/esm2015/domain/users/models/enums/family-incomes.enum.js +10 -10
  367. package/esm2015/domain/users/models/enums/fragrance-importances.enum.js +7 -7
  368. package/esm2015/domain/users/models/enums/hair-colors.enum.js +12 -12
  369. package/esm2015/domain/users/models/enums/hair-problems.enum.js +12 -12
  370. package/esm2015/domain/users/models/enums/hair-strands.enum.js +10 -10
  371. package/esm2015/domain/users/models/enums/hair-types.enum.js +9 -9
  372. package/esm2015/domain/users/models/enums/index.js +21 -21
  373. package/esm2015/domain/users/models/enums/office-position.enum.js +8 -8
  374. package/esm2015/domain/users/models/enums/product-spents.enum.js +10 -10
  375. package/esm2015/domain/users/models/enums/user-type.enum.js +10 -10
  376. package/esm2015/domain/users/models/index.js +8 -8
  377. package/esm2015/domain/users/models/lead.js +7 -7
  378. package/esm2015/domain/users/models/subscription/edition.js +7 -7
  379. package/esm2015/domain/users/models/subscription/enums/billing-status.enum.js +5 -5
  380. package/esm2015/domain/users/models/subscription/enums/edition-status.enum.js +6 -6
  381. package/esm2015/domain/users/models/subscription/enums/index.js +5 -5
  382. package/esm2015/domain/users/models/subscription/enums/payment-type.enum.js +7 -7
  383. package/esm2015/domain/users/models/subscription/enums/status.enum.js +6 -6
  384. package/esm2015/domain/users/models/subscription/index.js +5 -5
  385. package/esm2015/domain/users/models/subscription/payment.js +14 -14
  386. package/esm2015/domain/users/models/subscription/subscription.js +43 -43
  387. package/esm2015/domain/users/models/user-address.js +7 -7
  388. package/esm2015/domain/users/models/user-payment-method.js +7 -7
  389. package/esm2015/domain/users/models/user.js +26 -26
  390. package/esm2015/domain/users/repositories/beauty-profile.repository.js +2 -2
  391. package/esm2015/domain/users/repositories/edition.repository.js +2 -2
  392. package/esm2015/domain/users/repositories/index.js +9 -9
  393. package/esm2015/domain/users/repositories/lead.repository.js +2 -2
  394. package/esm2015/domain/users/repositories/subscription-payment.repository.js +2 -2
  395. package/esm2015/domain/users/repositories/subscription.repository.js +2 -2
  396. package/esm2015/domain/users/repositories/user-address.repository.js +2 -2
  397. package/esm2015/domain/users/repositories/user-payment-method.repository.js +2 -2
  398. package/esm2015/domain/users/repositories/user.repository.js +2 -2
  399. package/esm2015/domain/users/services/authentication.service.js +2 -2
  400. package/esm2015/domain/users/services/index.js +4 -4
  401. package/esm2015/domain/users/services/register.service.js +2 -2
  402. package/esm2015/domain/users/services/types/basic-user-data.type.js +2 -2
  403. package/esm2015/domain/users/services/types/index.js +2 -2
  404. package/esm2015/domain/users/use-cases/authentication.js +40 -40
  405. package/esm2015/domain/users/use-cases/index.js +5 -5
  406. package/esm2015/domain/users/use-cases/recovery-password.js +12 -12
  407. package/esm2015/domain/users/use-cases/register.js +34 -34
  408. package/esm2015/domain/users/use-cases/signout.js +12 -12
  409. package/esm2015/errors/duplicated-results.error.js +8 -8
  410. package/esm2015/errors/index.js +5 -5
  411. package/esm2015/errors/invalid-argument.error.js +8 -8
  412. package/esm2015/errors/not-found.error.js +8 -8
  413. package/esm2015/errors/required-argument.error.js +9 -9
  414. package/esm2015/index.js +6 -6
  415. package/esm2015/infra/elasticsearch/adapters/axios.adapter.js +76 -76
  416. package/esm2015/infra/elasticsearch/adapters/elastic-search.adapter.js +2 -2
  417. package/esm2015/infra/elasticsearch/adapters/index.js +3 -3
  418. package/esm2015/infra/elasticsearch/index.js +4 -4
  419. package/esm2015/infra/elasticsearch/indexes/index.js +2 -2
  420. package/esm2015/infra/elasticsearch/indexes/products-index.js +115 -115
  421. package/esm2015/infra/elasticsearch/types/elastic-search-result.js +2 -2
  422. package/esm2015/infra/elasticsearch/types/index.js +2 -2
  423. package/esm2015/infra/firebase/auth/authentication-firebase-auth.service.js +52 -52
  424. package/esm2015/infra/firebase/auth/index.js +3 -3
  425. package/esm2015/infra/firebase/auth/register-firebase-auth.service.js +26 -26
  426. package/esm2015/infra/firebase/auth/types/firebase-user-with-id.type.js +2 -2
  427. package/esm2015/infra/firebase/firestore/enums/firestore-field-type.enum.js +10 -10
  428. package/esm2015/infra/firebase/firestore/enums/index.js +2 -2
  429. package/esm2015/infra/firebase/firestore/index.js +4 -4
  430. package/esm2015/infra/firebase/firestore/mixins/index.js +10 -10
  431. package/esm2015/infra/firebase/firestore/mixins/with-create-firestore.mixin.js +31 -31
  432. package/esm2015/infra/firebase/firestore/mixins/with-crud-firestore.mixin.js +10 -10
  433. package/esm2015/infra/firebase/firestore/mixins/with-delete-firestore.mixin.js +18 -18
  434. package/esm2015/infra/firebase/firestore/mixins/with-find-firestore.mixin.js +98 -98
  435. package/esm2015/infra/firebase/firestore/mixins/with-firestore.mixin.js +49 -49
  436. package/esm2015/infra/firebase/firestore/mixins/with-get-firestore.mixin.js +24 -24
  437. package/esm2015/infra/firebase/firestore/mixins/with-helpers.mixin.js +17 -17
  438. package/esm2015/infra/firebase/firestore/mixins/with-sub-collection.mixin.js +11 -11
  439. package/esm2015/infra/firebase/firestore/mixins/with-update-firestore.mixin.js +45 -45
  440. package/esm2015/infra/firebase/firestore/repositories/catalog/category-firestore.repository.js +82 -82
  441. package/esm2015/infra/firebase/firestore/repositories/catalog/index.js +5 -5
  442. package/esm2015/infra/firebase/firestore/repositories/catalog/product-firestore.repository.js +55 -55
  443. package/esm2015/infra/firebase/firestore/repositories/catalog/product-variant-firestore.repository.js +14 -14
  444. package/esm2015/infra/firebase/firestore/repositories/catalog/subscription-product-firestore.repository.js +12 -12
  445. package/esm2015/infra/firebase/firestore/repositories/index.js +5 -5
  446. package/esm2015/infra/firebase/firestore/repositories/shop-settings/home-firestore.repository.js +56 -56
  447. package/esm2015/infra/firebase/firestore/repositories/shop-settings/index.js +4 -4
  448. package/esm2015/infra/firebase/firestore/repositories/shop-settings/shop-menu-firestore.repository.js +12 -12
  449. package/esm2015/infra/firebase/firestore/repositories/shop-settings/shop-settings-firestore.repository.js +12 -12
  450. package/esm2015/infra/firebase/firestore/repositories/shopping/buy-2-win-firestore.repository.js +12 -12
  451. package/esm2015/infra/firebase/firestore/repositories/shopping/campaign-dashboard-firestore.repository.js +12 -12
  452. package/esm2015/infra/firebase/firestore/repositories/shopping/campaign-hashtag-firestore.repository.js +12 -12
  453. package/esm2015/infra/firebase/firestore/repositories/shopping/checkout-firestore.repository.js +12 -12
  454. package/esm2015/infra/firebase/firestore/repositories/shopping/checkout-subscription-firestore.repository.js +12 -12
  455. package/esm2015/infra/firebase/firestore/repositories/shopping/coupon-firestore.repository.js +29 -29
  456. package/esm2015/infra/firebase/firestore/repositories/shopping/index.js +11 -11
  457. package/esm2015/infra/firebase/firestore/repositories/shopping/legacy-order-firestore.repository.js +9 -9
  458. package/esm2015/infra/firebase/firestore/repositories/shopping/order-firestore.repository.js +40 -40
  459. package/esm2015/infra/firebase/firestore/repositories/shopping/payment-firestore.repository.js +12 -12
  460. package/esm2015/infra/firebase/firestore/repositories/shopping/subscription-plan-firestore.repository.js +12 -12
  461. package/esm2015/infra/firebase/firestore/repositories/users/index.js +9 -9
  462. package/esm2015/infra/firebase/firestore/repositories/users/lead-firestore.repository.js +12 -12
  463. package/esm2015/infra/firebase/firestore/repositories/users/subscription-edition-firestore.repository.js +14 -14
  464. package/esm2015/infra/firebase/firestore/repositories/users/subscription-firestore.repository.js +12 -12
  465. package/esm2015/infra/firebase/firestore/repositories/users/subscription-payment-firestore.repository.js +14 -14
  466. package/esm2015/infra/firebase/firestore/repositories/users/user-address-firestore.repository.js +14 -14
  467. package/esm2015/infra/firebase/firestore/repositories/users/user-beauty-profile-firestore.repository.js +14 -14
  468. package/esm2015/infra/firebase/firestore/repositories/users/user-firestore.repository.js +68 -68
  469. package/esm2015/infra/firebase/firestore/repositories/users/user-payment-method-firestore.repository.js +14 -14
  470. package/esm2015/infra/firebase/firestore/types/firestore-sub.repository.type.js +2 -2
  471. package/esm2015/infra/firebase/firestore/types/firestore.helpers.type.js +2 -2
  472. package/esm2015/infra/firebase/firestore/types/firestore.repository.type.js +2 -2
  473. package/esm2015/infra/firebase/firestore/types/index.js +4 -4
  474. package/esm2015/infra/firebase/index.js +3 -3
  475. package/esm2015/infra/hasura-graphql/enums/hasura-graphql-column-type.enum.js +13 -13
  476. package/esm2015/infra/hasura-graphql/enums/hasura-graphql-where.enum.js +15 -15
  477. package/esm2015/infra/hasura-graphql/enums/index.js +3 -3
  478. package/esm2015/infra/hasura-graphql/index.js +5 -5
  479. package/esm2015/infra/hasura-graphql/mixins/helpers/attribute-option.helper.js +31 -31
  480. package/esm2015/infra/hasura-graphql/mixins/helpers/bind-filter-query.helper.js +58 -58
  481. package/esm2015/infra/hasura-graphql/mixins/helpers/filter-option.helper.js +22 -22
  482. package/esm2015/infra/hasura-graphql/mixins/helpers/graphql-field.helper.js +95 -95
  483. package/esm2015/infra/hasura-graphql/mixins/helpers/index.js +5 -5
  484. package/esm2015/infra/hasura-graphql/mixins/index.js +8 -8
  485. package/esm2015/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.js +61 -61
  486. package/esm2015/infra/hasura-graphql/mixins/with-crud-hasura-graphql.mixin.js +10 -10
  487. package/esm2015/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.js +31 -31
  488. package/esm2015/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.js +64 -64
  489. package/esm2015/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.js +37 -37
  490. package/esm2015/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.js +97 -97
  491. package/esm2015/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.js +58 -58
  492. package/esm2015/infra/hasura-graphql/models/category-hasura-graphql.js +4 -4
  493. package/esm2015/infra/hasura-graphql/models/index.js +5 -5
  494. package/esm2015/infra/hasura-graphql/models/kit-product-hasura-graphql.js +15 -15
  495. package/esm2015/infra/hasura-graphql/models/product-hasura-graphql.js +11 -11
  496. package/esm2015/infra/hasura-graphql/models/variant-hasura-graphql.js +9 -9
  497. package/esm2015/infra/hasura-graphql/repositories/catalog/category-collection-children-hasura-graphql.repository.js +38 -38
  498. package/esm2015/infra/hasura-graphql/repositories/catalog/category-filter-hasura-graphql.repository.js +24 -24
  499. package/esm2015/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.js +377 -377
  500. package/esm2015/infra/hasura-graphql/repositories/catalog/filter-hasura-graphql.repository.js +123 -123
  501. package/esm2015/infra/hasura-graphql/repositories/catalog/filter-option-hasura-graphql.repository.js +21 -21
  502. package/esm2015/infra/hasura-graphql/repositories/catalog/index.js +8 -8
  503. package/esm2015/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.js +491 -490
  504. package/esm2015/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.js +116 -116
  505. package/esm2015/infra/hasura-graphql/repositories/index.js +2 -2
  506. package/esm2015/infra/hasura-graphql/types/fields.type.js +2 -2
  507. package/esm2015/infra/hasura-graphql/types/graphql.repository.type.js +2 -2
  508. package/esm2015/infra/hasura-graphql/types/hasura-graphql-auth-options.type.js +2 -2
  509. package/esm2015/infra/hasura-graphql/types/hasura-graphql-fields.type.js +2 -2
  510. package/esm2015/infra/hasura-graphql/types/hasura-graphql-headers.type.js +2 -2
  511. package/esm2015/infra/hasura-graphql/types/index.js +9 -9
  512. package/esm2015/infra/hasura-graphql/types/nested-field.type.js +2 -2
  513. package/esm2015/infra/hasura-graphql/types/query-builder-options.type.js +2 -2
  514. package/esm2015/infra/hasura-graphql/types/variable-options.type.js +2 -2
  515. package/esm2015/infra/index.js +4 -4
  516. package/esm2015/infrab4a-connect.js +4 -4
  517. package/esm2015/utils/decorators/debug.class.decorator.js +7 -7
  518. package/esm2015/utils/decorators/index.js +3 -3
  519. package/esm2015/utils/decorators/trace.method.decorator.js +81 -81
  520. package/esm2015/utils/helpers/class-name.helper.js +15 -15
  521. package/esm2015/utils/helpers/debug-decorator.helper.js +18 -18
  522. package/esm2015/utils/helpers/debug.helper.js +150 -150
  523. package/esm2015/utils/helpers/index.js +5 -5
  524. package/esm2015/utils/helpers/reflect.helper.js +165 -165
  525. package/esm2015/utils/index.js +11 -11
  526. package/esm2015/utils/is-uuid.js +3 -3
  527. package/esm2015/utils/log.utils.js +9 -9
  528. package/esm2015/utils/mixins/base.mixin.js +6 -6
  529. package/esm2015/utils/mixins/index.js +4 -4
  530. package/esm2015/utils/mixins/merge-constructor-params.type.js +2 -2
  531. package/esm2015/utils/mixins/mixin-ctor.type.js +2 -2
  532. package/esm2015/utils/parse-datetime.js +14 -14
  533. package/esm2015/utils/types/array-element.type.js +2 -2
  534. package/esm2015/utils/types/index.js +3 -3
  535. package/esm2015/utils/types/prop.type.js +2 -2
  536. package/fesm2015/infrab4a-connect.js +4007 -4006
  537. package/fesm2015/infrab4a-connect.js.map +1 -1
  538. package/index.d.ts +5 -5
  539. package/infra/elasticsearch/adapters/axios.adapter.d.ts +16 -16
  540. package/infra/elasticsearch/adapters/elastic-search.adapter.d.ts +8 -8
  541. package/infra/elasticsearch/adapters/index.d.ts +2 -2
  542. package/infra/elasticsearch/index.d.ts +3 -3
  543. package/infra/elasticsearch/indexes/index.d.ts +1 -1
  544. package/infra/elasticsearch/indexes/products-index.d.ts +13 -13
  545. package/infra/elasticsearch/types/elastic-search-result.d.ts +9 -9
  546. package/infra/elasticsearch/types/index.d.ts +1 -1
  547. package/infra/firebase/auth/authentication-firebase-auth.service.d.ts +12 -12
  548. package/infra/firebase/auth/index.d.ts +2 -2
  549. package/infra/firebase/auth/register-firebase-auth.service.d.ts +8 -8
  550. package/infra/firebase/auth/types/firebase-user-with-id.type.d.ts +3 -3
  551. package/infra/firebase/firestore/enums/firestore-field-type.enum.d.ts +8 -8
  552. package/infra/firebase/firestore/enums/index.d.ts +1 -1
  553. package/infra/firebase/firestore/index.d.ts +3 -3
  554. package/infra/firebase/firestore/mixins/index.d.ts +9 -9
  555. package/infra/firebase/firestore/mixins/with-create-firestore.mixin.d.ts +4 -4
  556. package/infra/firebase/firestore/mixins/with-crud-firestore.mixin.d.ts +4 -4
  557. package/infra/firebase/firestore/mixins/with-delete-firestore.mixin.d.ts +4 -4
  558. package/infra/firebase/firestore/mixins/with-find-firestore.mixin.d.ts +4 -4
  559. package/infra/firebase/firestore/mixins/with-firestore.mixin.d.ts +4 -4
  560. package/infra/firebase/firestore/mixins/with-get-firestore.mixin.d.ts +4 -4
  561. package/infra/firebase/firestore/mixins/with-helpers.mixin.d.ts +11 -11
  562. package/infra/firebase/firestore/mixins/with-sub-collection.mixin.d.ts +7 -7
  563. package/infra/firebase/firestore/mixins/with-update-firestore.mixin.d.ts +7 -7
  564. package/infra/firebase/firestore/repositories/catalog/category-firestore.repository.d.ts +21 -21
  565. package/infra/firebase/firestore/repositories/catalog/index.d.ts +4 -4
  566. package/infra/firebase/firestore/repositories/catalog/product-firestore.repository.d.ts +12 -12
  567. package/infra/firebase/firestore/repositories/catalog/product-variant-firestore.repository.d.ts +13 -13
  568. package/infra/firebase/firestore/repositories/catalog/subscription-product-firestore.repository.d.ts +8 -8
  569. package/infra/firebase/firestore/repositories/index.d.ts +4 -4
  570. package/infra/firebase/firestore/repositories/shop-settings/home-firestore.repository.d.ts +16 -16
  571. package/infra/firebase/firestore/repositories/shop-settings/index.d.ts +3 -3
  572. package/infra/firebase/firestore/repositories/shop-settings/shop-menu-firestore.repository.d.ts +8 -8
  573. package/infra/firebase/firestore/repositories/shop-settings/shop-settings-firestore.repository.d.ts +8 -8
  574. package/infra/firebase/firestore/repositories/shopping/buy-2-win-firestore.repository.d.ts +8 -8
  575. package/infra/firebase/firestore/repositories/shopping/campaign-dashboard-firestore.repository.d.ts +9 -9
  576. package/infra/firebase/firestore/repositories/shopping/campaign-hashtag-firestore.repository.d.ts +9 -9
  577. package/infra/firebase/firestore/repositories/shopping/checkout-firestore.repository.d.ts +8 -8
  578. package/infra/firebase/firestore/repositories/shopping/checkout-subscription-firestore.repository.d.ts +8 -8
  579. package/infra/firebase/firestore/repositories/shopping/coupon-firestore.repository.d.ts +12 -12
  580. package/infra/firebase/firestore/repositories/shopping/index.d.ts +10 -10
  581. package/infra/firebase/firestore/repositories/shopping/legacy-order-firestore.repository.d.ts +7 -7
  582. package/infra/firebase/firestore/repositories/shopping/order-firestore.repository.d.ts +13 -13
  583. package/infra/firebase/firestore/repositories/shopping/payment-firestore.repository.d.ts +8 -8
  584. package/infra/firebase/firestore/repositories/shopping/subscription-plan-firestore.repository.d.ts +8 -8
  585. package/infra/firebase/firestore/repositories/users/index.d.ts +8 -8
  586. package/infra/firebase/firestore/repositories/users/lead-firestore.repository.d.ts +8 -8
  587. package/infra/firebase/firestore/repositories/users/subscription-edition-firestore.repository.d.ts +13 -13
  588. package/infra/firebase/firestore/repositories/users/subscription-firestore.repository.d.ts +8 -8
  589. package/infra/firebase/firestore/repositories/users/subscription-payment-firestore.repository.d.ts +13 -13
  590. package/infra/firebase/firestore/repositories/users/user-address-firestore.repository.d.ts +13 -13
  591. package/infra/firebase/firestore/repositories/users/user-beauty-profile-firestore.repository.d.ts +13 -13
  592. package/infra/firebase/firestore/repositories/users/user-firestore.repository.d.ts +17 -17
  593. package/infra/firebase/firestore/repositories/users/user-payment-method-firestore.repository.d.ts +13 -13
  594. package/infra/firebase/firestore/types/firestore-sub.repository.type.d.ts +6 -6
  595. package/infra/firebase/firestore/types/firestore.helpers.type.d.ts +8 -8
  596. package/infra/firebase/firestore/types/firestore.repository.type.d.ts +14 -14
  597. package/infra/firebase/firestore/types/index.d.ts +3 -3
  598. package/infra/firebase/index.d.ts +2 -2
  599. package/infra/hasura-graphql/enums/hasura-graphql-column-type.enum.d.ts +11 -11
  600. package/infra/hasura-graphql/enums/hasura-graphql-where.enum.d.ts +13 -13
  601. package/infra/hasura-graphql/enums/index.d.ts +2 -2
  602. package/infra/hasura-graphql/index.d.ts +4 -4
  603. package/infra/hasura-graphql/mixins/helpers/attribute-option.helper.d.ts +15 -15
  604. package/infra/hasura-graphql/mixins/helpers/bind-filter-query.helper.d.ts +10 -10
  605. package/infra/hasura-graphql/mixins/helpers/filter-option.helper.d.ts +8 -8
  606. package/infra/hasura-graphql/mixins/helpers/graphql-field.helper.d.ts +9 -9
  607. package/infra/hasura-graphql/mixins/helpers/index.d.ts +4 -4
  608. package/infra/hasura-graphql/mixins/index.d.ts +7 -7
  609. package/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.d.ts +9 -9
  610. package/infra/hasura-graphql/mixins/with-crud-hasura-graphql.mixin.d.ts +11 -11
  611. package/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.d.ts +7 -7
  612. package/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.d.ts +22 -22
  613. package/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.d.ts +25 -25
  614. package/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.d.ts +11 -11
  615. package/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.d.ts +14 -14
  616. package/infra/hasura-graphql/models/category-hasura-graphql.d.ts +6 -6
  617. package/infra/hasura-graphql/models/index.d.ts +4 -4
  618. package/infra/hasura-graphql/models/kit-product-hasura-graphql.d.ts +6 -6
  619. package/infra/hasura-graphql/models/product-hasura-graphql.d.ts +16 -15
  620. package/infra/hasura-graphql/models/variant-hasura-graphql.d.ts +9 -9
  621. package/infra/hasura-graphql/repositories/catalog/category-collection-children-hasura-graphql.repository.d.ts +10 -10
  622. package/infra/hasura-graphql/repositories/catalog/category-filter-hasura-graphql.repository.d.ts +11 -11
  623. package/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.d.ts +34 -34
  624. package/infra/hasura-graphql/repositories/catalog/filter-hasura-graphql.repository.d.ts +18 -18
  625. package/infra/hasura-graphql/repositories/catalog/filter-option-hasura-graphql.repository.d.ts +10 -10
  626. package/infra/hasura-graphql/repositories/catalog/index.d.ts +7 -7
  627. package/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.d.ts +29 -29
  628. package/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.d.ts +14 -14
  629. package/infra/hasura-graphql/repositories/index.d.ts +1 -1
  630. package/infra/hasura-graphql/types/fields.type.d.ts +2 -2
  631. package/infra/hasura-graphql/types/graphql.repository.type.d.ts +23 -23
  632. package/infra/hasura-graphql/types/hasura-graphql-auth-options.type.d.ts +8 -8
  633. package/infra/hasura-graphql/types/hasura-graphql-fields.type.d.ts +44 -44
  634. package/infra/hasura-graphql/types/hasura-graphql-headers.type.d.ts +7 -7
  635. package/infra/hasura-graphql/types/index.d.ts +8 -8
  636. package/infra/hasura-graphql/types/nested-field.type.d.ts +7 -7
  637. package/infra/hasura-graphql/types/query-builder-options.type.d.ts +7 -7
  638. package/infra/hasura-graphql/types/variable-options.type.d.ts +9 -9
  639. package/infra/index.d.ts +3 -3
  640. package/infrab4a-connect.d.ts +5 -5
  641. package/package.json +1 -1
  642. package/utils/decorators/debug.class.decorator.d.ts +2 -2
  643. package/utils/decorators/index.d.ts +2 -2
  644. package/utils/decorators/trace.method.decorator.d.ts +14 -14
  645. package/utils/helpers/class-name.helper.d.ts +3 -3
  646. package/utils/helpers/debug-decorator.helper.d.ts +9 -9
  647. package/utils/helpers/debug.helper.d.ts +60 -60
  648. package/utils/helpers/index.d.ts +4 -4
  649. package/utils/helpers/reflect.helper.d.ts +50 -50
  650. package/utils/index.d.ts +10 -10
  651. package/utils/is-uuid.d.ts +1 -1
  652. package/utils/log.utils.d.ts +7 -7
  653. package/utils/mixins/base.mixin.d.ts +3 -3
  654. package/utils/mixins/index.d.ts +3 -3
  655. package/utils/mixins/merge-constructor-params.type.d.ts +3 -3
  656. package/utils/mixins/mixin-ctor.type.d.ts +1 -1
  657. package/utils/parse-datetime.d.ts +1 -1
  658. package/utils/types/array-element.type.d.ts +1 -1
  659. package/utils/types/index.d.ts +2 -2
  660. package/utils/types/prop.type.d.ts +1 -1
@@ -1,490 +1,491 @@
1
- import { __awaiter, __rest } from "tslib";
2
- import { RoundProductPricesHelper, Where, } from '../../../../domain';
3
- import { NotFoundError } from '../../../../errors';
4
- import { Base, isNil, omit } from '../../../../utils';
5
- import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
6
- import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
- import { ProductHasuraGraphQL } from '../../models';
8
- export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
9
- constructor(endpoint, authOptions) {
10
- super({
11
- tableName: 'product',
12
- model: ProductHasuraGraphQL,
13
- endpoint,
14
- authOptions,
15
- fields: [],
16
- });
17
- this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
- this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
- const commonFields = [
20
- { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
- { firestoreId: { columnName: 'firestore_id' } },
22
- { productId: { columnName: 'main_product_id' } },
23
- { CEST: { columnName: 'cest' } },
24
- { EAN: { columnName: 'ean' } },
25
- { NCM: { columnName: 'ncm' } },
26
- 'brand',
27
- { costPrice: { columnName: 'cost_price' } },
28
- {
29
- description: {
30
- columnName: 'description',
31
- from: (description, data) => ({
32
- description,
33
- differentials: data.differentials,
34
- whoMustUse: data.who_must_use,
35
- howToUse: data.how_to_use,
36
- brand: data.brand_description,
37
- }),
38
- bindFindFilter: (sentence) => {
39
- const filters = Object.values(sentence).shift();
40
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((filters === null || filters === void 0 ? void 0 : filters.description) && { description: filters.description })), (filters.differentials && { differentials: filters.differentials })), (filters.whoMustUse && {
41
- who_must_use: filters.whoMustUse,
42
- })), (filters.howToUse && {
43
- how_to_use: filters.howToUse,
44
- })), (filters.brand && {
45
- brand_description: filters.brand,
46
- }));
47
- },
48
- bindPersistData: (descriptionData) => (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((descriptionData === null || descriptionData === void 0 ? void 0 : descriptionData.description) && { description: descriptionData.description })), (descriptionData.differentials && { differentials: descriptionData.differentials })), (descriptionData.whoMustUse && {
49
- who_must_use: descriptionData.whoMustUse,
50
- })), (descriptionData.howToUse && { how_to_use: descriptionData.howToUse })), (descriptionData.brand && { brand_description: descriptionData.brand }))),
51
- },
52
- },
53
- { differentials: { columnName: 'differentials' } },
54
- { whoMustUse: { columnName: 'who_must_use' } },
55
- { howToUse: { columnName: 'how_to_use' } },
56
- { brandDescription: { columnName: 'brand_description' } },
57
- { hasVariants: { columnName: 'has_variants' } },
58
- {
59
- images: {
60
- columnName: 'images',
61
- to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
62
- },
63
- },
64
- {
65
- miniatures: {
66
- columnName: 'miniatures',
67
- to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
68
- },
69
- },
70
- 'name',
71
- {
72
- price: {
73
- columnName: 'price',
74
- from: (price, data) => ({
75
- price,
76
- fullPrice: data.full_price,
77
- subscriberDiscountPercentage: data.subscriber_discount_percentage,
78
- subscriberPrice: data.subscriber_price,
79
- }),
80
- bindFindFilter: (sentence) => {
81
- const filters = Object.values(sentence).shift();
82
- return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
83
- subscriber_discount_percentage: filters.subscriberDiscountPercentage,
84
- })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
85
- subscriber_price: filters.subscriberPrice,
86
- }));
87
- },
88
- bindPersistData: (priceData) => (Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
89
- subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
90
- })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }))),
91
- },
92
- },
93
- { fullPrice: { columnName: 'full_price' } },
94
- { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
95
- { subscriberPrice: { columnName: 'subscriber_price' } },
96
- 'published',
97
- 'sku',
98
- {
99
- stock: {
100
- columnName: 'stock',
101
- from: (quantity) => ({ quantity }),
102
- to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
103
- },
104
- },
105
- 'slug',
106
- 'type',
107
- 'video',
108
- 'weight',
109
- 'gender',
110
- { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
111
- { filters: { columnName: 'filters', type: HasuraGraphQLColumnType.Jsonb } },
112
- { isKit: { columnName: 'is_kit' } },
113
- { createdAt: { columnName: 'created_at' } },
114
- { updatedAt: { columnName: 'updated_at' } },
115
- { rate: { columnName: 'rating' } },
116
- { reviewsTotal: { columnName: 'reviews_total' } },
117
- { shoppingCount: { columnName: 'shopping_count' } },
118
- { categoryId: { columnName: 'category_id' } },
119
- {
120
- category: {
121
- columnName: 'category',
122
- foreignKeyColumn: { id: 'categoryId' },
123
- fields: ['id', 'name', 'reference', 'slug'],
124
- },
125
- },
126
- ];
127
- this.fields = [
128
- ...commonFields,
129
- {
130
- categories: {
131
- columnName: 'categories',
132
- fields: ['category_id'],
133
- bindPersistData: (value) => ({
134
- categories: { data: value.map((category) => ({ category_id: +category })) },
135
- }),
136
- to: (categories) => categories.map((categoryId) => +categoryId),
137
- from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
138
- },
139
- },
140
- {
141
- kitProducts: {
142
- columnName: 'kit_products',
143
- foreignKeyColumn: { productId: 'id' },
144
- fields: [
145
- { productId: { columnName: 'product_id' } },
146
- { kitProductId: { columnName: 'kit_product_id' } },
147
- 'quantity',
148
- { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
149
- ],
150
- },
151
- },
152
- {
153
- reviews: {
154
- columnName: 'reviews',
155
- foreignKeyColumn: { product_id: 'id' },
156
- fields: this.reviewsFields,
157
- },
158
- },
159
- {
160
- metadata: {
161
- columnName: 'metadata',
162
- fields: ['title', 'description'],
163
- bindPersistData: (value) => ({
164
- metadata: { data: value },
165
- }),
166
- },
167
- },
168
- ];
169
- }
170
- get reviewsFields() {
171
- return [
172
- 'id',
173
- 'shop',
174
- 'rate',
175
- 'author',
176
- 'email',
177
- 'location',
178
- 'review',
179
- 'status',
180
- 'title',
181
- { personId: { columnName: 'person_id' } },
182
- 'points',
183
- { orderId: { columnName: 'order_id' } },
184
- { createdAt: { columnName: 'created_at' } },
185
- { updatedAt: { columnName: 'updated_at' } },
186
- ];
187
- }
188
- create(params) {
189
- const _super = Object.create(null, {
190
- create: { get: () => super.create }
191
- });
192
- return __awaiter(this, void 0, void 0, function* () {
193
- const { metadata } = params, data = __rest(params, ["metadata"]);
194
- const product = yield _super.create.call(this, omit(Object.assign(Object.assign({}, data), { metadata: metadata || { description: null, title: null } }), ['reviews']));
195
- try {
196
- product.reviews = data.reviews && (yield this.updateReviews(+product.id, data));
197
- }
198
- catch (error) {
199
- yield this.delete({ id: product.id });
200
- throw error;
201
- }
202
- return product;
203
- });
204
- }
205
- get(identifiers) {
206
- const _super = Object.create(null, {
207
- get: { get: () => super.get }
208
- });
209
- var _a;
210
- return __awaiter(this, void 0, void 0, function* () {
211
- const product = Number.isNaN(+identifiers.id)
212
- ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id }, options: { enableCount: false } })).data) === null || _a === void 0 ? void 0 : _a[0]
213
- : yield _super.get.call(this, identifiers);
214
- if (product.productId)
215
- throw new NotFoundError('Product not found, it is a variant');
216
- product.reviews = product.reviews || (yield this.findReviewsByProduct(+product.id));
217
- return product;
218
- });
219
- }
220
- find(params) {
221
- const _super = Object.create(null, {
222
- find: { get: () => super.find }
223
- });
224
- return __awaiter(this, void 0, void 0, function* () {
225
- const _a = params || {}, { filters, fields } = _a, options = __rest(_a, ["filters", "fields"]);
226
- const bindFields = fields ||
227
- this.fields
228
- .map((field) => (typeof field === 'string' ? field : Object.keys(field).shift()))
229
- .filter((field) => field !== 'reviews');
230
- return _super.find.call(this, Object.assign(Object.assign({}, options), { filters: Object.assign(Object.assign({}, filters), { productId: { operator: Where.ISNULL } }), fields: [
231
- ...bindFields,
232
- ...(bindFields.includes('price')
233
- ? [
234
- 'subscriberPrice',
235
- 'subscriberDiscountPercentage',
236
- 'fullPrice',
237
- ]
238
- : []),
239
- ] }));
240
- });
241
- }
242
- getBySlug(slug) {
243
- var _a;
244
- return __awaiter(this, void 0, void 0, function* () {
245
- const result = yield this.find({
246
- filters: {
247
- slug,
248
- },
249
- fields: this.fields.map((field) => typeof field === 'string' ? field : Object.keys(field).shift()),
250
- options: {
251
- enableCount: false,
252
- },
253
- });
254
- const product = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
255
- RoundProductPricesHelper.roundProductPrices(product);
256
- return product;
257
- });
258
- }
259
- update(params) {
260
- const _super = Object.create(null, {
261
- update: { get: () => super.update }
262
- });
263
- return __awaiter(this, void 0, void 0, function* () {
264
- const { categories, kitProducts, reviews, id: checkId, rate, metadata } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id", "rate", "metadata"]);
265
- const plainData = this.paramsToPlain({ id: checkId });
266
- const id = yield this.getId(plainData.id);
267
- const product = yield _super.update.call(this, Object.assign({ id }, data));
268
- product.categories = categories && (yield this.updateCategories(+id, { categories }));
269
- product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
270
- product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
271
- product.metadata = metadata && (yield this.updateMetadata(+id, { metadata }));
272
- return product;
273
- });
274
- }
275
- fetchReviews(status) {
276
- return __awaiter(this, void 0, void 0, function* () {
277
- const reviewsExpression = {
278
- status: status === 'pending'
279
- ? { [HasuraGraphQLWhere.ISNULL]: true }
280
- : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
281
- };
282
- const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
283
- where: { value: { reviews: reviewsExpression }, type: 'product_bool_exp', required: true },
284
- });
285
- return data.reduce((reviews, product) => [
286
- ...reviews,
287
- ...product.reviews
288
- .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
289
- (status === 'approved' && review.status === true) ||
290
- (status === 'rejected' && review.status === false))
291
- .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
292
- ], []);
293
- });
294
- }
295
- updateCategories(productId, { categories }) {
296
- return __awaiter(this, void 0, void 0, function* () {
297
- if ('action' in categories && categories.action === 'remove') {
298
- yield this.mutation('delete_category_product', ['affected_rows'], {
299
- where: {
300
- type: 'category_product_bool_exp',
301
- required: true,
302
- value: { product_id: { _eq: productId } },
303
- },
304
- });
305
- return [];
306
- }
307
- const plainData = this.paramsToPlain({ categories });
308
- if (!plainData.categories || plainData.categories.length <= 0)
309
- return [];
310
- yield this.mutation('delete_category_product', ['affected_rows'], {
311
- where: {
312
- type: 'category_product_bool_exp',
313
- required: true,
314
- value: { product_id: { _eq: productId } },
315
- },
316
- });
317
- yield this.mutation('insert_category_product', ['affected_rows'], {
318
- objects: {
319
- type: '[category_product_insert_input!]',
320
- required: true,
321
- value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
322
- },
323
- });
324
- return plainData.categories;
325
- });
326
- }
327
- updateKitProducts(productId, { kitProducts }) {
328
- return __awaiter(this, void 0, void 0, function* () {
329
- const plainData = this.paramsToPlain({ kitProducts });
330
- yield this.mutation('delete_product_kit', ['affected_rows'], {
331
- where: {
332
- type: 'product_kit_bool_exp',
333
- required: true,
334
- value: { kit_product_id: { _eq: productId } },
335
- },
336
- });
337
- yield this.mutation('insert_product_kit', ['affected_rows'], {
338
- objects: {
339
- type: '[product_kit_insert_input!]',
340
- required: true,
341
- value: plainData.kitProducts.map((kitProduct) => ({
342
- kit_product_id: productId,
343
- product_id: kitProduct.productId || kitProduct.product.id,
344
- quantity: kitProduct.quantity,
345
- })),
346
- },
347
- });
348
- return plainData.kitProducts;
349
- });
350
- }
351
- updateReviews(productId, { reviews }) {
352
- return __awaiter(this, void 0, void 0, function* () {
353
- if (!reviews)
354
- return [];
355
- if ('action' in reviews && reviews.action === 'remove') {
356
- const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
357
- const review = yield this.findReview(reviewData, productId);
358
- return review === null || review === void 0 ? void 0 : review.id;
359
- })));
360
- yield this.mutation('delete_product_review', ['affected_rows'], {
361
- where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
362
- });
363
- return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
364
- }
365
- const plainData = this.paramsToPlain({ reviews });
366
- if (!plainData.reviews || plainData.reviews.length <= 0)
367
- return [];
368
- return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
369
- const review = yield this.findReview(reviewData, productId);
370
- if (review.id)
371
- return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
372
- pk_columns: {
373
- value: { id: review.id },
374
- type: 'product_review_pk_columns_input',
375
- required: true,
376
- },
377
- _set: {
378
- value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
379
- type: 'product_review_set_input',
380
- required: true,
381
- },
382
- })).update_product_review_by_pk);
383
- return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
384
- object: {
385
- value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
386
- type: 'product_review_insert_input',
387
- required: true,
388
- },
389
- })).insert_product_review_one);
390
- })));
391
- });
392
- }
393
- updateMetadata(productId, { metadata }) {
394
- return __awaiter(this, void 0, void 0, function* () {
395
- const plainData = this.paramsToPlain({ metadata });
396
- if (!plainData.metadata)
397
- return;
398
- yield this.mutation('update_product_metadata_by_pk', ['product_id'], {
399
- pk_columns: {
400
- value: { product_id: productId },
401
- type: 'product_metadata_pk_columns_input',
402
- required: true,
403
- },
404
- _set: {
405
- value: omit(metadata, ['product_id']),
406
- type: 'product_metadata_set_input',
407
- required: true,
408
- },
409
- });
410
- return plainData.metadata;
411
- });
412
- }
413
- getId(id) {
414
- var _a, _b;
415
- return __awaiter(this, void 0, void 0, function* () {
416
- if (!Number.isNaN(+id))
417
- return id;
418
- const { data } = yield this.find({ filters: { firestoreId: id }, options: { enableCount: false } });
419
- if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
420
- return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
421
- throw new NotFoundError(`Product with id ${id} not found`);
422
- });
423
- }
424
- findReviewsByProduct(productId) {
425
- return __awaiter(this, void 0, void 0, function* () {
426
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
427
- where: {
428
- value: {
429
- product_id: { _eq: productId },
430
- },
431
- type: 'product_review_bool_exp',
432
- required: true,
433
- },
434
- });
435
- return data && data.map((review) => this.bindReviewToModel(review));
436
- });
437
- }
438
- findReview(review, productId) {
439
- return __awaiter(this, void 0, void 0, function* () {
440
- if (review.id)
441
- return review;
442
- let loadedReview;
443
- if (review.personId)
444
- loadedReview = yield this.getReviewByPersonId(review.personId, productId, review.orderId);
445
- if (!loadedReview && review.author && review.email)
446
- loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId, review.orderId);
447
- return loadedReview || review;
448
- });
449
- }
450
- getReviewByPersonId(personId, productId, orderId) {
451
- return __awaiter(this, void 0, void 0, function* () {
452
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
453
- where: {
454
- value: Object.assign({ product_id: { _eq: productId }, person_id: { _eq: personId } }, (orderId && { order_id: { _eq: orderId } })),
455
- type: `product_review_bool_exp`,
456
- required: true,
457
- },
458
- });
459
- return data && data[0] && this.bindReviewToModel(data[0]);
460
- });
461
- }
462
- getReviewByAuthorAndEmail(author, email, productId, orderId) {
463
- return __awaiter(this, void 0, void 0, function* () {
464
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
465
- where: {
466
- value: Object.assign({ product_id: { _eq: productId }, author: { _eq: author }, email: { _eq: email } }, (orderId && { order_id: { _eq: orderId } })),
467
- type: `product_review_bool_exp`,
468
- required: true,
469
- },
470
- });
471
- return data && data[0] && this.bindReviewToModel(data[0]);
472
- });
473
- }
474
- cleanShoppingCountFromIds(ids) {
475
- return __awaiter(this, void 0, void 0, function* () {
476
- return yield this.mutation('update_product', ['affected_rows'], {
477
- where: {
478
- value: { id: { _nin: ids } },
479
- type: 'product_bool_exp',
480
- required: true,
481
- },
482
- _set: {
483
- value: { shopping_count: 0 },
484
- type: 'product_set_input',
485
- },
486
- });
487
- });
488
- }
489
- }
490
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBV0wsd0JBQXdCLEVBSXhCLEtBQUssR0FDTixNQUFNLG9CQUFvQixDQUFBO0FBQzNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQW9CbkQsTUFBTSxPQUFPLDhCQUNYLFNBQVEscUJBQXFCLENBQUMsaUJBQWlCLENBQXVCLElBQUksQ0FBQyxDQUFDO0lBc0I1RSxZQUFZLFFBQWdCLEVBQUUsV0FBcUM7UUFDakUsS0FBSyxDQUFDO1lBQ0osU0FBUyxFQUFFLFNBQVM7WUFDcEIsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixRQUFRO1lBQ1IsV0FBVztZQUNYLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxDQUFBO1FBc2hCSSxzQkFBaUIsR0FBRyxDQUFDLEtBQTBCLEVBQWlCLEVBQUUsQ0FBQyxpQ0FDdEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxLQUNuRixT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Q0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0tBQUE7SUFnQksseUJBQXlCLENBQUMsR0FBYTs7WUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDOUQsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDNUIsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUU7b0JBQzVCLElBQUksRUFBRSxtQkFBbUI7aUJBQzFCO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDcmVhdGVSZXBvc2l0b3J5UGFyYW1zLFxuICBGaW5kUmVwb3NpdG9yeVBhcmFtcyxcbiAgR2V0UmVwb3NpdG9yeVBhcmFtcyxcbiAgTm9uRnVuY3Rpb25Qcm9wZXJ0eU5hbWVzLFxuICBQcm9kdWN0TWV0YWRhdGEsXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxuICBQcm9kdWN0UmV2aWV3LFxuICBSZXBvc2l0b3J5RmluZFJlc3VsdCxcbiAgUmV2aWV3U3RhdHVzUGFyYW1zLFxuICBSZXZpZXdXaXRoUHJvZHVjdERhdGEsXG4gIFJvdW5kUHJvZHVjdFByaWNlc0hlbHBlcixcbiAgU2hvcFByaWNlLFxuICBTaG9wcyxcbiAgVXBkYXRlUmVwb3NpdG9yeVBhcmFtcyxcbiAgV2hlcmUsXG59IGZyb20gJy4uLy4uLy4uLy4uL2RvbWFpbidcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi8uLi8uLi9lcnJvcnMnXG5pbXBvcnQgeyBCYXNlLCBpc05pbCwgb21pdCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgSGFzdXJhR3JhcGhRTENvbHVtblR5cGUsIEhhc3VyYUdyYXBoUUxXaGVyZSB9IGZyb20gJy4uLy4uL2VudW1zJ1xuaW1wb3J0IHsgd2l0aENydWRIYXN1cmFHcmFwaFFMLCB3aXRoSGFzdXJhR3JhcGhRTCB9IGZyb20gJy4uLy4uL21peGlucydcbmltcG9ydCB7IFByb2R1Y3RIYXN1cmFHcmFwaFFMIH0gZnJvbSAnLi4vLi4vbW9kZWxzJ1xuaW1wb3J0IHsgSGFzdXJhR3JhcGhRTEF1dGhPcHRpb25zLCBIYXN1cmFHcmFwaFFMRmllbGRzIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5cbnR5cGUgUHJvZHVjdFJldmlld0ZpZWxkcyA9IHtcbiAgaWQ/OiBzdHJpbmdcbiAgc2hvcDogU2hvcHNcbiAgcmF0ZTogbnVtYmVyXG4gIGF1dGhvcj86IHN0cmluZ1xuICBlbWFpbD86IHN0cmluZ1xuICBsb2NhdGlvbj86IHN0cmluZ1xuICByZXZpZXc/OiBzdHJpbmdcbiAgc3RhdHVzPzogYm9vbGVhblxuICB0aXRsZT86IHN0cmluZ1xuICBwZXJzb25JZD86IG51bWJlclxuICBwb2ludHM/OiBudW1iZXJcbiAgb3JkZXJJZD86IHN0cmluZ1xuICBjcmVhdGVkQXQ/OiBEYXRlXG4gIHVwZGF0ZWRBdD86IERhdGVcbn1cblxuZXhwb3J0IGNsYXNzIFByb2R1Y3RIYXN1cmFHcmFwaFFMUmVwb3NpdG9yeVxuICBleHRlbmRzIHdpdGhDcnVkSGFzdXJhR3JhcGhRTCh3aXRoSGFzdXJhR3JhcGhRTDxQcm9kdWN0SGFzdXJhR3JhcGhRTD4oQmFzZSkpXG4gIGltcGxlbWVudHMgUHJvZHVjdFJlcG9zaXRvcnlcbntcbiAgcHJpdmF0ZSBnZXQgcmV2aWV3c0ZpZWxkcygpOiBhbnkge1xuICAgIHJldHVybiBbXG4gICAgICAnaWQnLFxuICAgICAgJ3Nob3AnLFxuICAgICAgJ3JhdGUnLFxuICAgICAgJ2F1dGhvcicsXG4gICAgICAnZW1haWwnLFxuICAgICAgJ2xvY2F0aW9uJyxcbiAgICAgICdyZXZpZXcnLFxuICAgICAgJ3N0YXR1cycsXG4gICAgICAndGl0bGUnLFxuICAgICAgeyBwZXJzb25JZDogeyBjb2x1bW5OYW1lOiAncGVyc29uX2lkJyB9IH0sXG4gICAgICAncG9pbnRzJyxcbiAgICAgIHsgb3JkZXJJZDogeyBjb2x1bW5OYW1lOiAnb3JkZXJfaWQnIH0gfSxcbiAgICAgIHsgY3JlYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICdjcmVhdGVkX2F0JyB9IH0sXG4gICAgICB7IHVwZGF0ZWRBdDogeyBjb2x1bW5OYW1lOiAndXBkYXRlZF9hdCcgfSB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50OiBzdHJpbmcsIGF1dGhPcHRpb25zOiBIYXN1cmFHcmFwaFFMQXV0aE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0YWJsZU5hbWU6ICdwcm9kdWN0JyxcbiAgICAgIG1vZGVsOiBQcm9kdWN0SGFzdXJhR3JhcGhRTCxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgYXV0aE9wdGlvbnMsXG4gICAgICBmaWVsZHM6IFtdLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb21tb25GaWVsZHM6IEhhc3VyYUdyYXBoUUxGaWVsZHM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+ID0gW1xuICAgICAgeyBpZDogeyBjb2x1bW5OYW1lOiAnaWQnLCB0bzogKHZhbHVlKSA9PiArdmFsdWUsIGZyb206ICh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoKSB9IH0sXG4gICAgICB7IGZpcmVzdG9yZUlkOiB7IGNvbHVtbk5hbWU6ICdmaXJlc3RvcmVfaWQnIH0gfSxcbiAgICAgIHsgcHJvZHVjdElkOiB7IGNvbHVtbk5hbWU6ICdtYWluX3Byb2R1Y3RfaWQnIH0gfSxcbiAgICAgIHsgQ0VTVDogeyBjb2x1bW5OYW1lOiAnY2VzdCcgfSB9LFxuICAgICAgeyBFQU46IHsgY29sdW1uTmFtZTogJ2VhbicgfSB9LFxuICAgICAgeyBOQ006IHsgY29sdW1uTmFtZTogJ25jbScgfSB9LFxuICAgICAgJ2JyYW5kJyxcbiAgICAgIHsgY29zdFByaWNlOiB7IGNvbHVtbk5hbWU6ICdjb3N0X3ByaWNlJyB9IH0sXG4gICAgICB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBmcm9tOiAoZGVzY3JpcHRpb24sIGRhdGEpID0+ICh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGRpZmZlcmVudGlhbHM6IGRhdGEuZGlmZmVyZW50aWFscyxcbiAgICAgICAgICAgIHdob011c3RVc2U6IGRhdGEud2hvX211c3RfdXNlLFxuICAgICAgICAgICAgaG93VG9Vc2U6IGRhdGEuaG93X3RvX3VzZSxcbiAgICAgICAgICAgIGJyYW5kOiBkYXRhLmJyYW5kX2Rlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGJpbmRGaW5kRmlsdGVyOiAoc2VudGVuY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBPYmplY3QudmFsdWVzKHNlbnRlbmNlKS5zaGlmdCgpXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzPy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBmaWx0ZXJzLmRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgICAuLi4oZmlsdGVycy5kaWZmZXJlbnRpYWxzICYmIHsgZGlmZmVyZW50aWFsczogZmlsdGVycy5kaWZmZXJlbnRpYWxzIH0pLFxuICAgICAgICAgICAgICAuLi4oZmlsdGVycy53aG9NdXN0VXNlICYmIHtcbiAgICAgICAgICAgICAgICB3aG9fbXVzdF91c2U6IGZpbHRlcnMud2hvTXVzdFVzZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzLmhvd1RvVXNlICYmIHtcbiAgICAgICAgICAgICAgICBob3dfdG9fdXNlOiBmaWx0ZXJzLmhvd1RvVXNlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnMuYnJhbmQgJiYge1xuICAgICAgICAgICAgICAgIGJyYW5kX2Rlc2NyaXB0aW9uOiBmaWx0ZXJzLmJyYW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKGRlc2NyaXB0aW9uRGF0YSkgPT4gKHtcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGE/LmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uRGF0YS5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEuZGlmZmVyZW50aWFscyAmJiB7IGRpZmZlcmVudGlhbHM6IGRlc2NyaXB0aW9uRGF0YS5kaWZmZXJlbnRpYWxzIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uRGF0YS53aG9NdXN0VXNlICYmIHtcbiAgICAgICAgICAgICAgd2hvX211c3RfdXNlOiBkZXNjcmlwdGlvbkRhdGEud2hvTXVzdFVzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uRGF0YS5ob3dUb1VzZSAmJiB7IGhvd190b191c2U6IGRlc2NyaXB0aW9uRGF0YS5ob3dUb1VzZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEuYnJhbmQgJiYgeyBicmFuZF9kZXNjcmlwdGlvbjogZGVzY3JpcHRpb25EYXRhLmJyYW5kIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgZGlmZmVyZW50aWFsczogeyBjb2x1bW5OYW1lOiAnZGlmZmVyZW50aWFscycgfSB9LFxuICAgICAgeyB3aG9NdXN0VXNlOiB7IGNvbHVtbk5hbWU6ICd3aG9fbXVzdF91c2UnIH0gfSxcbiAgICAgIHsgaG93VG9Vc2U6IHsgY29sdW1uTmFtZTogJ2hvd190b191c2UnIH0gfSxcbiAgICAgIHsgYnJhbmREZXNjcmlwdGlvbjogeyBjb2x1bW5OYW1lOiAnYnJhbmRfZGVzY3JpcHRpb24nIH0gfSxcbiAgICAgIHsgaGFzVmFyaWFudHM6IHsgY29sdW1uTmFtZTogJ2hhc192YXJpYW50cycgfSB9LFxuICAgICAge1xuICAgICAgICBpbWFnZXM6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnaW1hZ2VzJyxcbiAgICAgICAgICB0bzogKHZhbHVlKSA9PiAodmFsdWU/Lmxlbmd0aCA+IDAgPyBge1wiJHt2YWx1ZT8uam9pbj8uKGBcIixcImApIHx8ICcnfVwifWAgOiBge31gKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1pbmlhdHVyZXM6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnbWluaWF0dXJlcycsXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gKHZhbHVlPy5sZW5ndGggPiAwID8gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIDogYHt9YCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgJ25hbWUnLFxuICAgICAge1xuICAgICAgICBwcmljZToge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdwcmljZScsXG4gICAgICAgICAgZnJvbTogKHByaWNlLCBkYXRhKTogU2hvcFByaWNlID0+ICh7XG4gICAgICAgICAgICBwcmljZSxcbiAgICAgICAgICAgIGZ1bGxQcmljZTogZGF0YS5mdWxsX3ByaWNlLFxuICAgICAgICAgICAgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogZGF0YS5zdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2UsXG4gICAgICAgICAgICBzdWJzY3JpYmVyUHJpY2U6IGRhdGEuc3Vic2NyaWJlcl9wcmljZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBiaW5kRmluZEZpbHRlcjogKHNlbnRlbmNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gT2JqZWN0LnZhbHVlcyhzZW50ZW5jZSkuc2hpZnQoKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnM/LnByaWNlIHx8IGZpbHRlcnM/LnByaWNlID09PSAwKSAmJiB7IHByaWNlOiBmaWx0ZXJzLnByaWNlIH0pLFxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuZnVsbFByaWNlIHx8IGZpbHRlcnMuZnVsbFByaWNlID09PSAwKSAmJiB7IGZ1bGxfcHJpY2U6IGZpbHRlcnMuZnVsbFByaWNlIH0pLFxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSB8fCBmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UgPT09IDApICYmIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2U6IGZpbHRlcnMuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UgfHwgZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UgPT09IDApICYmIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3ByaWNlOiBmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaW5kUGVyc2lzdERhdGE6IChwcmljZURhdGEpID0+ICh7XG4gICAgICAgICAgICAuLi4ocHJpY2VEYXRhPy5wcmljZSA+PSAwICYmIHsgcHJpY2U6IHByaWNlRGF0YS5wcmljZSB9KSxcbiAgICAgICAgICAgIC4uLihwcmljZURhdGEuZnVsbFByaWNlID49IDAgJiYgeyBmdWxsX3ByaWNlOiBwcmljZURhdGEuZnVsbFByaWNlIH0pLFxuICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlID49IDAgJiYge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2U6IHByaWNlRGF0YS5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi4ocHJpY2VEYXRhLnN1YnNjcmliZXJQcmljZSA+PSAwICYmIHsgc3Vic2NyaWJlcl9wcmljZTogcHJpY2VEYXRhLnN1YnNjcmliZXJQcmljZSB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IGZ1bGxQcmljZTogeyBjb2x1bW5OYW1lOiAnZnVsbF9wcmljZScgfSB9LFxuICAgICAgeyBzdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlOiB7IGNvbHVtbk5hbWU6ICdzdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2UnIH0gfSxcbiAgICAgIHsgc3Vic2NyaWJlclByaWNlOiB7IGNvbHVtbk5hbWU6ICdzdWJzY3JpYmVyX3ByaWNlJyB9IH0sXG4gICAgICAncHVibGlzaGVkJyxcbiAgICAgICdza3UnLFxuICAgICAge1xuICAgICAgICBzdG9jazoge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdzdG9jaycsXG4gICAgICAgICAgZnJvbTogKHF1YW50aXR5OiBudW1iZXIpID0+ICh7IHF1YW50aXR5IH0pLFxuICAgICAgICAgIHRvOiAodmFsdWUpID0+IChpc05pbCh2YWx1ZT8ucXVhbnRpdHkpID8gdmFsdWUgOiB2YWx1ZT8ucXVhbnRpdHkpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgICdzbHVnJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICd2aWRlbycsXG4gICAgICAnd2VpZ2h0JyxcbiAgICAgICdnZW5kZXInLFxuICAgICAgeyB0YWdzOiB7IGNvbHVtbk5hbWU6ICd0YWdzJywgdHlwZTogSGFzdXJhR3JhcGhRTENvbHVtblR5cGUuSnNvbmIgfSB9LFxuICAgICAgeyBmaWx0ZXJzOiB7IGNvbHVtbk5hbWU6ICdmaWx0ZXJzJywgdHlwZTogSGFzdXJhR3JhcGhRTENvbHVtblR5cGUuSnNvbmIgfSB9LFxuICAgICAgeyBpc0tpdDogeyBjb2x1bW5OYW1lOiAnaXNfa2l0JyB9IH0sXG4gICAgICB7IGNyZWF0ZWRBdDogeyBjb2x1bW5OYW1lOiAnY3JlYXRlZF9hdCcgfSB9LFxuICAgICAgeyB1cGRhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ3VwZGF0ZWRfYXQnIH0gfSxcbiAgICAgIHsgcmF0ZTogeyBjb2x1bW5OYW1lOiAncmF0aW5nJyB9IH0sXG4gICAgICB7IHJldmlld3NUb3RhbDogeyBjb2x1bW5OYW1lOiAncmV2aWV3c190b3RhbCcgfSB9LFxuICAgICAgeyBzaG9wcGluZ0NvdW50OiB7IGNvbHVtbk5hbWU6ICdzaG9wcGluZ19jb3VudCcgfSB9LFxuICAgICAgeyBjYXRlZ29yeUlkOiB7IGNvbHVtbk5hbWU6ICdjYXRlZ29yeV9pZCcgfSB9LFxuICAgICAge1xuICAgICAgICBjYXRlZ29yeToge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdjYXRlZ29yeScsXG4gICAgICAgICAgZm9yZWlnbktleUNvbHVtbjogeyBpZDogJ2NhdGVnb3J5SWQnIH0sXG4gICAgICAgICAgZmllbGRzOiBbJ2lkJywgJ25hbWUnLCAncmVmZXJlbmNlJywgJ3NsdWcnXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgdGhpcy5maWVsZHMgPSBbXG4gICAgICAuLi5jb21tb25GaWVsZHMsXG4gICAgICB7XG4gICAgICAgIGNhdGVnb3JpZXM6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgZmllbGRzOiBbJ2NhdGVnb3J5X2lkJ10sXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAodmFsdWUpID0+ICh7XG4gICAgICAgICAgICBjYXRlZ29yaWVzOiB7IGRhdGE6IHZhbHVlLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5X2lkOiArY2F0ZWdvcnkgfSkpIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdG86IChjYXRlZ29yaWVzKSA9PiBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnlJZCkgPT4gK2NhdGVnb3J5SWQpLFxuICAgICAgICAgIGZyb206IChjYXRlZ29yaWVzOiB7IGNhdGVnb3J5X2lkOiBudW1iZXIgfVtdKSA9PlxuICAgICAgICAgICAgY2F0ZWdvcmllcz8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnk/LmNhdGVnb3J5X2lkPy50b1N0cmluZygpKSB8fCBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtpdFByb2R1Y3RzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0cycsXG4gICAgICAgICAgZm9yZWlnbktleUNvbHVtbjogeyBwcm9kdWN0SWQ6ICdpZCcgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHsgcHJvZHVjdElkOiB7IGNvbHVtbk5hbWU6ICdwcm9kdWN0X2lkJyB9IH0sXG4gICAgICAgICAgICB7IGtpdFByb2R1Y3RJZDogeyBjb2x1bW5OYW1lOiAna2l0X3Byb2R1Y3RfaWQnIH0gfSxcbiAgICAgICAgICAgICdxdWFudGl0eScsXG4gICAgICAgICAgICB7IHByb2R1Y3Q6IHsgY29sdW1uTmFtZTogJ3Byb2R1Y3QnLCBmb3JlaWduS2V5Q29sdW1uOiB7IGlkOiAncHJvZHVjdF9pZCcgfSwgZmllbGRzOiBjb21tb25GaWVsZHMgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZXZpZXdzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ3Jldmlld3MnLFxuICAgICAgICAgIGZvcmVpZ25LZXlDb2x1bW46IHsgcHJvZHVjdF9pZDogJ2lkJyB9LFxuICAgICAgICAgIGZpZWxkczogdGhpcy5yZXZpZXdzRmllbGRzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnbWV0YWRhdGEnLFxuICAgICAgICAgIGZpZWxkczogWyd0aXRsZScsICdkZXNjcmlwdGlvbiddLFxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKHZhbHVlKSA9PiAoe1xuICAgICAgICAgICAgbWV0YWRhdGE6IHsgZGF0YTogdmFsdWUgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlKHBhcmFtczogQ3JlYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XG4gICAgY29uc3QgeyBtZXRhZGF0YSwgLi4uZGF0YSB9ID0gcGFyYW1zXG4gICAgY29uc3QgcHJvZHVjdCA9IGF3YWl0IHN1cGVyLmNyZWF0ZShcbiAgICAgIG9taXQoeyAuLi5kYXRhLCBtZXRhZGF0YTogbWV0YWRhdGEgfHwgeyBkZXNjcmlwdGlvbjogbnVsbCwgdGl0bGU6IG51bGwgfSB9LCBbJ3Jldmlld3MnXSksXG4gICAgKVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb2R1Y3QucmV2aWV3cyA9IGRhdGEucmV2aWV3cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVSZXZpZXdzKCtwcm9kdWN0LmlkLCBkYXRhKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGUoeyBpZDogcHJvZHVjdC5pZCB9KVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBhc3luYyBnZXQoaWRlbnRpZmllcnM6IEdldFJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xuICAgIGNvbnN0IHByb2R1Y3QgPSBOdW1iZXIuaXNOYU4oK2lkZW50aWZpZXJzLmlkKVxuICAgICAgPyAoYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWRlbnRpZmllcnMuaWQgfSwgb3B0aW9uczogeyBlbmFibGVDb3VudDogZmFsc2UgfSB9KSkuZGF0YT8uWzBdXG4gICAgICA6IGF3YWl0IHN1cGVyLmdldChpZGVudGlmaWVycylcblxuICAgIGlmIChwcm9kdWN0LnByb2R1Y3RJZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1Byb2R1Y3Qgbm90IGZvdW5kLCBpdCBpcyBhIHZhcmlhbnQnKVxuXG4gICAgcHJvZHVjdC5yZXZpZXdzID0gcHJvZHVjdC5yZXZpZXdzIHx8IChhd2FpdCB0aGlzLmZpbmRSZXZpZXdzQnlQcm9kdWN0KCtwcm9kdWN0LmlkKSlcblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBhc3luYyBmaW5kKHBhcmFtcz86IEZpbmRSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UmVwb3NpdG9yeUZpbmRSZXN1bHQ8UHJvZHVjdEhhc3VyYUdyYXBoUUw+PiB7XG4gICAgY29uc3QgeyBmaWx0ZXJzLCBmaWVsZHMsIC4uLm9wdGlvbnMgfSA9IHBhcmFtcyB8fCB7fVxuICAgIGNvbnN0IGJpbmRGaWVsZHMgPVxuICAgICAgZmllbGRzIHx8XG4gICAgICAodGhpcy5maWVsZHNcbiAgICAgICAgLm1hcCgoZmllbGQpID0+ICh0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnID8gZmllbGQgOiBPYmplY3Qua2V5cyhmaWVsZCkuc2hpZnQoKSkpXG4gICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiBmaWVsZCAhPT0gJ3Jldmlld3MnKSBhcyBOb25GdW5jdGlvblByb3BlcnR5TmFtZXM8XG4gICAgICAgIFByb2R1Y3RIYXN1cmFHcmFwaFFMLFxuICAgICAgICBrZXlvZiBQcm9kdWN0SGFzdXJhR3JhcGhRTFxuICAgICAgPltdKVxuXG4gICAgcmV0dXJuIHN1cGVyLmZpbmQoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGZpbHRlcnM6IHsgLi4uZmlsdGVycywgcHJvZHVjdElkOiB7IG9wZXJhdG9yOiBXaGVyZS5JU05VTEwgfSB9LFxuICAgICAgZmllbGRzOiBbXG4gICAgICAgIC4uLmJpbmRGaWVsZHMsXG4gICAgICAgIC4uLihiaW5kRmllbGRzLmluY2x1ZGVzKCdwcmljZScpXG4gICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAnc3Vic2NyaWJlclByaWNlJyxcbiAgICAgICAgICAgICAgJ3N1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UnLFxuICAgICAgICAgICAgICAnZnVsbFByaWNlJyxcbiAgICAgICAgICAgIF0gYXMgTm9uRnVuY3Rpb25Qcm9wZXJ0eU5hbWVzPFByb2R1Y3RIYXN1cmFHcmFwaFFMPltdKVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZ2V0QnlTbHVnKHNsdWc6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbmQoe1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBzbHVnLFxuICAgICAgfSxcbiAgICAgIGZpZWxkczogdGhpcy5maWVsZHMubWFwKChmaWVsZCkgPT5cbiAgICAgICAgdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJyA/IGZpZWxkIDogT2JqZWN0LmtleXMoZmllbGQpLnNoaWZ0KCksXG4gICAgICApIGFzIE5vbkZ1bmN0aW9uUHJvcGVydHlOYW1lczxQcm9kdWN0SGFzdXJhR3JhcGhRTCwga2V5b2YgUHJvZHVjdEhhc3VyYUdyYXBoUUw+W10sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGVuYWJsZUNvdW50OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHByb2R1Y3QgPSByZXN1bHQ/LmRhdGE/LnNoaWZ0KClcblxuICAgIFJvdW5kUHJvZHVjdFByaWNlc0hlbHBlci5yb3VuZFByb2R1Y3RQcmljZXMocHJvZHVjdClcblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBhc3luYyB1cGRhdGUocGFyYW1zOiBVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCB7IGNhdGVnb3JpZXMsIGtpdFByb2R1Y3RzLCByZXZpZXdzLCBpZDogY2hlY2tJZCwgcmF0ZSwgbWV0YWRhdGEsIC4uLmRhdGEgfSA9IHBhcmFtc1xuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGlkOiBjaGVja0lkIH0pXG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmdldElkKHBsYWluRGF0YS5pZClcbiAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgc3VwZXIudXBkYXRlKHsgaWQsIC4uLmRhdGEgfSlcblxuICAgIHByb2R1Y3QuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXMgJiYgKGF3YWl0IHRoaXMudXBkYXRlQ2F0ZWdvcmllcygraWQsIHsgY2F0ZWdvcmllcyB9KSlcbiAgICBwcm9kdWN0LmtpdFByb2R1Y3RzID0ga2l0UHJvZHVjdHMgJiYgKGF3YWl0IHRoaXMudXBkYXRlS2l0UHJvZHVjdHMoK2lkLCB7IGtpdFByb2R1Y3RzIH0pKVxuICAgIHByb2R1Y3QucmV2aWV3cyA9IHJldmlld3MgJiYgKGF3YWl0IHRoaXMudXBkYXRlUmV2aWV3cygraWQsIHsgcmV2aWV3cyB9KSlcbiAgICBwcm9kdWN0Lm1ldGFkYXRhID0gbWV0YWRhdGEgJiYgKGF3YWl0IHRoaXMudXBkYXRlTWV0YWRhdGEoK2lkLCB7IG1ldGFkYXRhIH0pKVxuXG4gICAgcmV0dXJuIHByb2R1Y3RcbiAgfVxuXG4gIGFzeW5jIGZldGNoUmV2aWV3cyhzdGF0dXM6IFJldmlld1N0YXR1c1BhcmFtcyk6IFByb21pc2U8UmV2aWV3V2l0aFByb2R1Y3REYXRhW10+IHtcbiAgICBjb25zdCByZXZpZXdzRXhwcmVzc2lvbiA9IHtcbiAgICAgIHN0YXR1czpcbiAgICAgICAgc3RhdHVzID09PSAncGVuZGluZydcbiAgICAgICAgICA/IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5JU05VTExdOiB0cnVlIH1cbiAgICAgICAgICA6IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5FUVVBTFNdOiBzdGF0dXMgPT09ICdhcHByb3ZlZCcgfSxcbiAgICB9XG4gICAgY29uc3QgeyBwcm9kdWN0OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgJ3Byb2R1Y3QnLFxuICAgICAgWydpZCcsICduYW1lJywgJ3NrdScsIHsgcmV2aWV3czogeyBjb2x1bW5OYW1lOiAncmV2aWV3cycsIGZpZWxkczogdGhpcy5yZXZpZXdzRmllbGRzIH0gfV0sXG4gICAgICB7XG4gICAgICAgIHdoZXJlOiB7IHZhbHVlOiB7IHJldmlld3M6IHJldmlld3NFeHByZXNzaW9uIH0sIHR5cGU6ICdwcm9kdWN0X2Jvb2xfZXhwJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKFxuICAgICAgKHJldmlld3MsIHByb2R1Y3QpID0+IFtcbiAgICAgICAgLi4ucmV2aWV3cyxcbiAgICAgICAgLi4ucHJvZHVjdC5yZXZpZXdzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChyZXZpZXcpID0+XG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdwZW5kaW5nJyAmJiBbdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhyZXZpZXcuc3RhdHVzKSkgfHxcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJiByZXZpZXcuc3RhdHVzID09PSB0cnVlKSB8fFxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncmVqZWN0ZWQnICYmIHJldmlldy5zdGF0dXMgPT09IGZhbHNlKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgocmV2aWV3KSA9PiAoe1xuICAgICAgICAgICAgLi4udGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpLFxuICAgICAgICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgICAgIHByb2R1Y3RTa3U6IHByb2R1Y3Quc2t1LFxuICAgICAgICAgIH0pKSxcbiAgICAgIF0sXG4gICAgICBbXSBhcyBSZXZpZXdXaXRoUHJvZHVjdERhdGFbXSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNhdGVnb3JpZXMoXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXG4gICAgeyBjYXRlZ29yaWVzIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdjYXRlZ29yaWVzJz4sXG4gICk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUxbJ2NhdGVnb3JpZXMnXT4ge1xuICAgIGlmICgnYWN0aW9uJyBpbiBjYXRlZ29yaWVzICYmIGNhdGVnb3JpZXMuYWN0aW9uID09PSAncmVtb3ZlJykge1xuICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbignZGVsZXRlX2NhdGVnb3J5X3Byb2R1Y3QnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeV9wcm9kdWN0X2Jvb2xfZXhwJyxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogeyBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGNhdGVnb3JpZXMgfSlcblxuICAgIGlmICghcGxhaW5EYXRhLmNhdGVnb3JpZXMgfHwgcGxhaW5EYXRhLmNhdGVnb3JpZXMubGVuZ3RoIDw9IDApIHJldHVybiBbXVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignZGVsZXRlX2NhdGVnb3J5X3Byb2R1Y3QnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdHlwZTogJ2NhdGVnb3J5X3Byb2R1Y3RfYm9vbF9leHAnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9IH0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICBvYmplY3RzOiB7XG4gICAgICAgIHR5cGU6ICdbY2F0ZWdvcnlfcHJvZHVjdF9pbnNlcnRfaW5wdXQhXScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogcGxhaW5EYXRhLmNhdGVnb3JpZXMubWFwKChjYXRlZ29yeUlkKSA9PiAoeyBjYXRlZ29yeV9pZDogY2F0ZWdvcnlJZCwgcHJvZHVjdF9pZDogcHJvZHVjdElkIH0pKSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBwbGFpbkRhdGEuY2F0ZWdvcmllc1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVLaXRQcm9kdWN0cyhcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcbiAgICB7IGtpdFByb2R1Y3RzIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdraXRQcm9kdWN0cyc+LFxuICApOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMWydraXRQcm9kdWN0cyddPiB7XG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsga2l0UHJvZHVjdHMgfSlcblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X2tpdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICB3aGVyZToge1xuICAgICAgICB0eXBlOiAncHJvZHVjdF9raXRfYm9vbF9leHAnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHsga2l0X3Byb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X3Byb2R1Y3Rfa2l0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcbiAgICAgIG9iamVjdHM6IHtcbiAgICAgICAgdHlwZTogJ1twcm9kdWN0X2tpdF9pbnNlcnRfaW5wdXQhXScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogcGxhaW5EYXRhLmtpdFByb2R1Y3RzLm1hcCgoa2l0UHJvZHVjdCkgPT4gKHtcbiAgICAgICAgICBraXRfcHJvZHVjdF9pZDogcHJvZHVjdElkLFxuICAgICAgICAgIHByb2R1Y3RfaWQ6IGtpdFByb2R1Y3QucHJvZHVjdElkIHx8IGtpdFByb2R1Y3QucHJvZHVjdC5pZCxcbiAgICAgICAgICBxdWFudGl0eToga2l0UHJvZHVjdC5xdWFudGl0eSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHBsYWluRGF0YS5raXRQcm9kdWN0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZXZpZXdzKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsgcmV2aWV3cyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAncmV2aWV3cyc+LFxuICApOiBQcm9taXNlPFByb2R1Y3RSZXZpZXdbXT4ge1xuICAgIGlmICghcmV2aWV3cykgcmV0dXJuIFtdXG4gICAgaWYgKCdhY3Rpb24nIGluIHJldmlld3MgJiYgcmV2aWV3cy5hY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICBjb25zdCByZXZpZXdJZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmV2aWV3cy52YWx1ZS5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxuXG4gICAgICAgICAgcmV0dXJuIHJldmlldz8uaWRcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X3JldmlldycsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICAgIHdoZXJlOiB7IHZhbHVlOiB7IGlkOiB7IF9pbjogcmV2aWV3SWRzLmZpbHRlcihCb29sZWFuKSB9IH0sIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gcmV2aWV3cy52YWx1ZS5tYXAoKHJldmlldywgaW5kZXgpID0+ICFyZXZpZXdJZHNbaW5kZXhdICYmIHJldmlldykuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsgcmV2aWV3cyB9KVxuXG4gICAgaWYgKCFwbGFpbkRhdGEucmV2aWV3cyB8fCBwbGFpbkRhdGEucmV2aWV3cy5sZW5ndGggPD0gMCkgcmV0dXJuIFtdXG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBwbGFpbkRhdGEucmV2aWV3cy5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmV2aWV3ID0gYXdhaXQgdGhpcy5maW5kUmV2aWV3KHJldmlld0RhdGEsIHByb2R1Y3RJZClcblxuICAgICAgICBpZiAocmV2aWV3LmlkKVxuICAgICAgICAgIHJldHVybiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCd1cGRhdGVfcHJvZHVjdF9yZXZpZXdfYnlfcGsnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgICAgICAgICAgICBwa19jb2x1bW5zOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogeyBpZDogcmV2aWV3LmlkIH0sXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfcGtfY29sdW1uc19pbnB1dCcsXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF9zZXQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvbWl0KHRoaXMuYmluZFJldmlld1RvSGFzdXJhKHJldmlld0RhdGEpLCBbJ2lkJywgJ3Byb2R1Y3RfaWQnXSksXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfc2V0X2lucHV0JyxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnVwZGF0ZV9wcm9kdWN0X3Jldmlld19ieV9wayxcbiAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXG4gICAgICAgICAgKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X3Byb2R1Y3RfcmV2aWV3X29uZScsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogb21pdCh7IC4uLnRoaXMuYmluZFJldmlld1RvSGFzdXJhKHJldmlld0RhdGEpLCBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSwgWydpZCddKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfaW5zZXJ0X2lucHV0JyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5pbnNlcnRfcHJvZHVjdF9yZXZpZXdfb25lLFxuICAgICAgICApXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU1ldGFkYXRhKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsgbWV0YWRhdGEgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ21ldGFkYXRhJz4sXG4gICk6IFByb21pc2U8UHJvZHVjdE1ldGFkYXRhPiB7XG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsgbWV0YWRhdGEgfSlcblxuICAgIGlmICghcGxhaW5EYXRhLm1ldGFkYXRhKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ3VwZGF0ZV9wcm9kdWN0X21ldGFkYXRhX2J5X3BrJywgWydwcm9kdWN0X2lkJ10sIHtcbiAgICAgIHBrX2NvbHVtbnM6IHtcbiAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogcHJvZHVjdElkIH0sXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X21ldGFkYXRhX3BrX2NvbHVtbnNfaW5wdXQnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBfc2V0OiB7XG4gICAgICAgIHZhbHVlOiBvbWl0KG1ldGFkYXRhLCBbJ3Byb2R1Y3RfaWQnXSksXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X21ldGFkYXRhX3NldF9pbnB1dCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHBsYWluRGF0YS5tZXRhZGF0YVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRJZChpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIU51bWJlci5pc05hTigraWQpKSByZXR1cm4gaWRcblxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWQgfSwgb3B0aW9uczogeyBlbmFibGVDb3VudDogZmFsc2UgfSB9KVxuXG4gICAgaWYgKGRhdGE/LlswXT8uaWQpIHJldHVybiBkYXRhPy5bMF0/LmlkXG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUHJvZHVjdCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRSZXZpZXdzQnlQcm9kdWN0KHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3W10+IHtcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5tYXAoKHJldmlldykgPT4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmV2aWV3KHJldmlldzogUHJvZHVjdFJldmlldywgcHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcbiAgICBpZiAocmV2aWV3LmlkKSByZXR1cm4gcmV2aWV3XG5cbiAgICBsZXQgbG9hZGVkUmV2aWV3OiBQcm9kdWN0UmV2aWV3XG5cbiAgICBpZiAocmV2aWV3LnBlcnNvbklkKSBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5UGVyc29uSWQocmV2aWV3LnBlcnNvbklkLCBwcm9kdWN0SWQsIHJldmlldy5vcmRlcklkKVxuICAgIGlmICghbG9hZGVkUmV2aWV3ICYmIHJldmlldy5hdXRob3IgJiYgcmV2aWV3LmVtYWlsKVxuICAgICAgbG9hZGVkUmV2aWV3ID0gYXdhaXQgdGhpcy5nZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKHJldmlldy5hdXRob3IsIHJldmlldy5lbWFpbCwgcHJvZHVjdElkLCByZXZpZXcub3JkZXJJZClcblxuICAgIHJldHVybiBsb2FkZWRSZXZpZXcgfHwgcmV2aWV3XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5UGVyc29uSWQocGVyc29uSWQ6IG51bWJlciwgcHJvZHVjdElkOiBudW1iZXIsIG9yZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXG4gICAgICAgICAgcGVyc29uX2lkOiB7IF9lcTogcGVyc29uSWQgfSxcbiAgICAgICAgICAuLi4ob3JkZXJJZCAmJiB7IG9yZGVyX2lkOiB7IF9lcTogb3JkZXJJZCB9IH0pLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhICYmIGRhdGFbMF0gJiYgdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChkYXRhWzBdKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKFxuICAgIGF1dGhvcjogc3RyaW5nLFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXG4gICAgb3JkZXJJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxuICAgICAgICAgIGF1dGhvcjogeyBfZXE6IGF1dGhvciB9LFxuICAgICAgICAgIGVtYWlsOiB7IF9lcTogZW1haWwgfSxcbiAgICAgICAgICAuLi4ob3JkZXJJZCAmJiB7IG9yZGVyX2lkOiB7IF9lcTogb3JkZXJJZCB9IH0pLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBkYXRhICYmIGRhdGFbMF0gJiYgdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChkYXRhWzBdKVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kUmV2aWV3VG9Nb2RlbCA9IChwbGFpbjogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb2R1Y3RSZXZpZXcgPT4gKHtcbiAgICAuLi5vbWl0KHBsYWluLCBbJ3Byb2R1Y3RfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ3BlcnNvbl9pZCcsICdvcmRlcl9pZCddKSxcbiAgICBjcmVhdGVkQXQ6IHR5cGVvZiBwbGFpbi5jcmVhdGVkX2F0ID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHBsYWluLmNyZWF0ZWRfYXQpIDogcGxhaW4uY3JlYXRlZF9hdCxcbiAgICB1cGRhdGVkQXQ6IHR5cGVvZiBwbGFpbi51cGRhdGVkX2F0ID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHBsYWluLnVwZGF0ZWRfYXQpIDogcGxhaW4udXBkYXRlZF9hdCxcbiAgICBwZXJzb25JZDogcGxhaW4ucGVyc29uX2lkLFxuICAgIG9yZGVySWQ6IHBsYWluLm9yZGVyX2lkLFxuICB9KVxuXG4gIHByaXZhdGUgYmluZFJldmlld1RvSGFzdXJhID0gKHJldmlldzogUHJvZHVjdFJldmlldyk6IFByb2R1Y3RSZXZpZXdGaWVsZHMgPT4gKHtcbiAgICAuLi5vbWl0KHJldmlldywgWydwcm9kdWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdwZXJzb25JZCcsICdvcmRlcklkJ10pLFxuICAgIHBlcnNvbl9pZDogcmV2aWV3LnBlcnNvbklkLFxuICAgIG9yZGVyX2lkOiByZXZpZXcub3JkZXJJZCxcbiAgfSlcblxuICBhc3luYyBjbGVhblNob3BwaW5nQ291bnRGcm9tSWRzKGlkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5tdXRhdGlvbigndXBkYXRlX3Byb2R1Y3QnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdmFsdWU6IHsgaWQ6IHsgX25pbjogaWRzIH0gfSxcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3RfYm9vbF9leHAnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBfc2V0OiB7XG4gICAgICAgIHZhbHVlOiB7IHNob3BwaW5nX2NvdW50OiAwIH0sXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X3NldF9pbnB1dCcsXG4gICAgICB9LFxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { RoundProductPricesHelper, Where, } from '../../../../domain';
3
+ import { NotFoundError } from '../../../../errors';
4
+ import { Base, isNil, omit } from '../../../../utils';
5
+ import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
6
+ import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
+ import { ProductHasuraGraphQL } from '../../models';
8
+ export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
9
+ constructor(endpoint, authOptions) {
10
+ super({
11
+ tableName: 'product',
12
+ model: ProductHasuraGraphQL,
13
+ endpoint,
14
+ authOptions,
15
+ fields: [],
16
+ });
17
+ this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
+ this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
+ const commonFields = [
20
+ { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
+ { firestoreId: { columnName: 'firestore_id' } },
22
+ { productId: { columnName: 'main_product_id' } },
23
+ { CEST: { columnName: 'cest' } },
24
+ { EAN: { columnName: 'ean' } },
25
+ { NCM: { columnName: 'ncm' } },
26
+ 'brand',
27
+ { costPrice: { columnName: 'cost_price' } },
28
+ {
29
+ description: {
30
+ columnName: 'description',
31
+ from: (description, data) => ({
32
+ description,
33
+ differentials: data.differentials,
34
+ whoMustUse: data.who_must_use,
35
+ howToUse: data.how_to_use,
36
+ brand: data.brand_description,
37
+ }),
38
+ bindFindFilter: (sentence) => {
39
+ const filters = Object.values(sentence).shift();
40
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((filters === null || filters === void 0 ? void 0 : filters.description) && { description: filters.description })), (filters.differentials && { differentials: filters.differentials })), (filters.whoMustUse && {
41
+ who_must_use: filters.whoMustUse,
42
+ })), (filters.howToUse && {
43
+ how_to_use: filters.howToUse,
44
+ })), (filters.brand && {
45
+ brand_description: filters.brand,
46
+ }));
47
+ },
48
+ bindPersistData: (descriptionData) => (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((descriptionData === null || descriptionData === void 0 ? void 0 : descriptionData.description) && { description: descriptionData.description })), (descriptionData.differentials && { differentials: descriptionData.differentials })), (descriptionData.whoMustUse && {
49
+ who_must_use: descriptionData.whoMustUse,
50
+ })), (descriptionData.howToUse && { how_to_use: descriptionData.howToUse })), (descriptionData.brand && { brand_description: descriptionData.brand }))),
51
+ },
52
+ },
53
+ { differentials: { columnName: 'differentials' } },
54
+ { whoMustUse: { columnName: 'who_must_use' } },
55
+ { howToUse: { columnName: 'how_to_use' } },
56
+ { brandDescription: { columnName: 'brand_description' } },
57
+ { ingredients: { columnName: 'ingredients' } },
58
+ { hasVariants: { columnName: 'has_variants' } },
59
+ {
60
+ images: {
61
+ columnName: 'images',
62
+ to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
63
+ },
64
+ },
65
+ {
66
+ miniatures: {
67
+ columnName: 'miniatures',
68
+ to: (value) => { var _a; return ((value === null || value === void 0 ? void 0 : value.length) > 0 ? `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}` : `{}`); },
69
+ },
70
+ },
71
+ 'name',
72
+ {
73
+ price: {
74
+ columnName: 'price',
75
+ from: (price, data) => ({
76
+ price,
77
+ fullPrice: data.full_price,
78
+ subscriberDiscountPercentage: data.subscriber_discount_percentage,
79
+ subscriberPrice: data.subscriber_price,
80
+ }),
81
+ bindFindFilter: (sentence) => {
82
+ const filters = Object.values(sentence).shift();
83
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
84
+ subscriber_discount_percentage: filters.subscriberDiscountPercentage,
85
+ })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
86
+ subscriber_price: filters.subscriberPrice,
87
+ }));
88
+ },
89
+ bindPersistData: (priceData) => (Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
90
+ subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
91
+ })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }))),
92
+ },
93
+ },
94
+ { fullPrice: { columnName: 'full_price' } },
95
+ { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
96
+ { subscriberPrice: { columnName: 'subscriber_price' } },
97
+ 'published',
98
+ 'sku',
99
+ {
100
+ stock: {
101
+ columnName: 'stock',
102
+ from: (quantity) => ({ quantity }),
103
+ to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
104
+ },
105
+ },
106
+ 'slug',
107
+ 'type',
108
+ 'video',
109
+ 'weight',
110
+ 'gender',
111
+ { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
112
+ { filters: { columnName: 'filters', type: HasuraGraphQLColumnType.Jsonb } },
113
+ { isKit: { columnName: 'is_kit' } },
114
+ { createdAt: { columnName: 'created_at' } },
115
+ { updatedAt: { columnName: 'updated_at' } },
116
+ { rate: { columnName: 'rating' } },
117
+ { reviewsTotal: { columnName: 'reviews_total' } },
118
+ { shoppingCount: { columnName: 'shopping_count' } },
119
+ { categoryId: { columnName: 'category_id' } },
120
+ {
121
+ category: {
122
+ columnName: 'category',
123
+ foreignKeyColumn: { id: 'categoryId' },
124
+ fields: ['id', 'name', 'reference', 'slug'],
125
+ },
126
+ },
127
+ ];
128
+ this.fields = [
129
+ ...commonFields,
130
+ {
131
+ categories: {
132
+ columnName: 'categories',
133
+ fields: ['category_id'],
134
+ bindPersistData: (value) => ({
135
+ categories: { data: value.map((category) => ({ category_id: +category })) },
136
+ }),
137
+ to: (categories) => categories.map((categoryId) => +categoryId),
138
+ from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
139
+ },
140
+ },
141
+ {
142
+ kitProducts: {
143
+ columnName: 'kit_products',
144
+ foreignKeyColumn: { productId: 'id' },
145
+ fields: [
146
+ { productId: { columnName: 'product_id' } },
147
+ { kitProductId: { columnName: 'kit_product_id' } },
148
+ 'quantity',
149
+ { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
150
+ ],
151
+ },
152
+ },
153
+ {
154
+ reviews: {
155
+ columnName: 'reviews',
156
+ foreignKeyColumn: { product_id: 'id' },
157
+ fields: this.reviewsFields,
158
+ },
159
+ },
160
+ {
161
+ metadata: {
162
+ columnName: 'metadata',
163
+ fields: ['title', 'description'],
164
+ bindPersistData: (value) => ({
165
+ metadata: { data: value },
166
+ }),
167
+ },
168
+ },
169
+ ];
170
+ }
171
+ get reviewsFields() {
172
+ return [
173
+ 'id',
174
+ 'shop',
175
+ 'rate',
176
+ 'author',
177
+ 'email',
178
+ 'location',
179
+ 'review',
180
+ 'status',
181
+ 'title',
182
+ { personId: { columnName: 'person_id' } },
183
+ 'points',
184
+ { orderId: { columnName: 'order_id' } },
185
+ { createdAt: { columnName: 'created_at' } },
186
+ { updatedAt: { columnName: 'updated_at' } },
187
+ ];
188
+ }
189
+ create(params) {
190
+ const _super = Object.create(null, {
191
+ create: { get: () => super.create }
192
+ });
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ const { metadata } = params, data = __rest(params, ["metadata"]);
195
+ const product = yield _super.create.call(this, omit(Object.assign(Object.assign({}, data), { metadata: metadata || { description: null, title: null } }), ['reviews']));
196
+ try {
197
+ product.reviews = data.reviews && (yield this.updateReviews(+product.id, data));
198
+ }
199
+ catch (error) {
200
+ yield this.delete({ id: product.id });
201
+ throw error;
202
+ }
203
+ return product;
204
+ });
205
+ }
206
+ get(identifiers) {
207
+ const _super = Object.create(null, {
208
+ get: { get: () => super.get }
209
+ });
210
+ var _a;
211
+ return __awaiter(this, void 0, void 0, function* () {
212
+ const product = Number.isNaN(+identifiers.id)
213
+ ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id }, options: { enableCount: false } })).data) === null || _a === void 0 ? void 0 : _a[0]
214
+ : yield _super.get.call(this, identifiers);
215
+ if (product.productId)
216
+ throw new NotFoundError('Product not found, it is a variant');
217
+ product.reviews = product.reviews || (yield this.findReviewsByProduct(+product.id));
218
+ return product;
219
+ });
220
+ }
221
+ find(params) {
222
+ const _super = Object.create(null, {
223
+ find: { get: () => super.find }
224
+ });
225
+ return __awaiter(this, void 0, void 0, function* () {
226
+ const _a = params || {}, { filters, fields } = _a, options = __rest(_a, ["filters", "fields"]);
227
+ const bindFields = fields ||
228
+ this.fields
229
+ .map((field) => (typeof field === 'string' ? field : Object.keys(field).shift()))
230
+ .filter((field) => field !== 'reviews');
231
+ return _super.find.call(this, Object.assign(Object.assign({}, options), { filters: Object.assign(Object.assign({}, filters), { productId: { operator: Where.ISNULL } }), fields: [
232
+ ...bindFields,
233
+ ...(bindFields.includes('price')
234
+ ? [
235
+ 'subscriberPrice',
236
+ 'subscriberDiscountPercentage',
237
+ 'fullPrice',
238
+ ]
239
+ : []),
240
+ ] }));
241
+ });
242
+ }
243
+ getBySlug(slug) {
244
+ var _a;
245
+ return __awaiter(this, void 0, void 0, function* () {
246
+ const result = yield this.find({
247
+ filters: {
248
+ slug,
249
+ },
250
+ fields: this.fields.map((field) => typeof field === 'string' ? field : Object.keys(field).shift()),
251
+ options: {
252
+ enableCount: false,
253
+ },
254
+ });
255
+ const product = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
256
+ RoundProductPricesHelper.roundProductPrices(product);
257
+ return product;
258
+ });
259
+ }
260
+ update(params) {
261
+ const _super = Object.create(null, {
262
+ update: { get: () => super.update }
263
+ });
264
+ return __awaiter(this, void 0, void 0, function* () {
265
+ const { categories, kitProducts, reviews, id: checkId, rate, metadata } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id", "rate", "metadata"]);
266
+ const plainData = this.paramsToPlain({ id: checkId });
267
+ const id = yield this.getId(plainData.id);
268
+ const product = yield _super.update.call(this, Object.assign({ id }, data));
269
+ product.categories = categories && (yield this.updateCategories(+id, { categories }));
270
+ product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
271
+ product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
272
+ product.metadata = metadata && (yield this.updateMetadata(+id, { metadata }));
273
+ return product;
274
+ });
275
+ }
276
+ fetchReviews(status) {
277
+ return __awaiter(this, void 0, void 0, function* () {
278
+ const reviewsExpression = {
279
+ status: status === 'pending'
280
+ ? { [HasuraGraphQLWhere.ISNULL]: true }
281
+ : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
282
+ };
283
+ const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
284
+ where: { value: { reviews: reviewsExpression }, type: 'product_bool_exp', required: true },
285
+ });
286
+ return data.reduce((reviews, product) => [
287
+ ...reviews,
288
+ ...product.reviews
289
+ .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
290
+ (status === 'approved' && review.status === true) ||
291
+ (status === 'rejected' && review.status === false))
292
+ .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
293
+ ], []);
294
+ });
295
+ }
296
+ updateCategories(productId, { categories }) {
297
+ return __awaiter(this, void 0, void 0, function* () {
298
+ if ('action' in categories && categories.action === 'remove') {
299
+ yield this.mutation('delete_category_product', ['affected_rows'], {
300
+ where: {
301
+ type: 'category_product_bool_exp',
302
+ required: true,
303
+ value: { product_id: { _eq: productId } },
304
+ },
305
+ });
306
+ return [];
307
+ }
308
+ const plainData = this.paramsToPlain({ categories });
309
+ if (!plainData.categories || plainData.categories.length <= 0)
310
+ return [];
311
+ yield this.mutation('delete_category_product', ['affected_rows'], {
312
+ where: {
313
+ type: 'category_product_bool_exp',
314
+ required: true,
315
+ value: { product_id: { _eq: productId } },
316
+ },
317
+ });
318
+ yield this.mutation('insert_category_product', ['affected_rows'], {
319
+ objects: {
320
+ type: '[category_product_insert_input!]',
321
+ required: true,
322
+ value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
323
+ },
324
+ });
325
+ return plainData.categories;
326
+ });
327
+ }
328
+ updateKitProducts(productId, { kitProducts }) {
329
+ return __awaiter(this, void 0, void 0, function* () {
330
+ const plainData = this.paramsToPlain({ kitProducts });
331
+ yield this.mutation('delete_product_kit', ['affected_rows'], {
332
+ where: {
333
+ type: 'product_kit_bool_exp',
334
+ required: true,
335
+ value: { kit_product_id: { _eq: productId } },
336
+ },
337
+ });
338
+ yield this.mutation('insert_product_kit', ['affected_rows'], {
339
+ objects: {
340
+ type: '[product_kit_insert_input!]',
341
+ required: true,
342
+ value: plainData.kitProducts.map((kitProduct) => ({
343
+ kit_product_id: productId,
344
+ product_id: kitProduct.productId || kitProduct.product.id,
345
+ quantity: kitProduct.quantity,
346
+ })),
347
+ },
348
+ });
349
+ return plainData.kitProducts;
350
+ });
351
+ }
352
+ updateReviews(productId, { reviews }) {
353
+ return __awaiter(this, void 0, void 0, function* () {
354
+ if (!reviews)
355
+ return [];
356
+ if ('action' in reviews && reviews.action === 'remove') {
357
+ const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
358
+ const review = yield this.findReview(reviewData, productId);
359
+ return review === null || review === void 0 ? void 0 : review.id;
360
+ })));
361
+ yield this.mutation('delete_product_review', ['affected_rows'], {
362
+ where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
363
+ });
364
+ return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
365
+ }
366
+ const plainData = this.paramsToPlain({ reviews });
367
+ if (!plainData.reviews || plainData.reviews.length <= 0)
368
+ return [];
369
+ return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
370
+ const review = yield this.findReview(reviewData, productId);
371
+ if (review.id)
372
+ return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
373
+ pk_columns: {
374
+ value: { id: review.id },
375
+ type: 'product_review_pk_columns_input',
376
+ required: true,
377
+ },
378
+ _set: {
379
+ value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
380
+ type: 'product_review_set_input',
381
+ required: true,
382
+ },
383
+ })).update_product_review_by_pk);
384
+ return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
385
+ object: {
386
+ value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
387
+ type: 'product_review_insert_input',
388
+ required: true,
389
+ },
390
+ })).insert_product_review_one);
391
+ })));
392
+ });
393
+ }
394
+ updateMetadata(productId, { metadata }) {
395
+ return __awaiter(this, void 0, void 0, function* () {
396
+ const plainData = this.paramsToPlain({ metadata });
397
+ if (!plainData.metadata)
398
+ return;
399
+ yield this.mutation('update_product_metadata_by_pk', ['product_id'], {
400
+ pk_columns: {
401
+ value: { product_id: productId },
402
+ type: 'product_metadata_pk_columns_input',
403
+ required: true,
404
+ },
405
+ _set: {
406
+ value: omit(metadata, ['product_id']),
407
+ type: 'product_metadata_set_input',
408
+ required: true,
409
+ },
410
+ });
411
+ return plainData.metadata;
412
+ });
413
+ }
414
+ getId(id) {
415
+ var _a, _b;
416
+ return __awaiter(this, void 0, void 0, function* () {
417
+ if (!Number.isNaN(+id))
418
+ return id;
419
+ const { data } = yield this.find({ filters: { firestoreId: id }, options: { enableCount: false } });
420
+ if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
421
+ return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
422
+ throw new NotFoundError(`Product with id ${id} not found`);
423
+ });
424
+ }
425
+ findReviewsByProduct(productId) {
426
+ return __awaiter(this, void 0, void 0, function* () {
427
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
428
+ where: {
429
+ value: {
430
+ product_id: { _eq: productId },
431
+ },
432
+ type: 'product_review_bool_exp',
433
+ required: true,
434
+ },
435
+ });
436
+ return data && data.map((review) => this.bindReviewToModel(review));
437
+ });
438
+ }
439
+ findReview(review, productId) {
440
+ return __awaiter(this, void 0, void 0, function* () {
441
+ if (review.id)
442
+ return review;
443
+ let loadedReview;
444
+ if (review.personId)
445
+ loadedReview = yield this.getReviewByPersonId(review.personId, productId, review.orderId);
446
+ if (!loadedReview && review.author && review.email)
447
+ loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId, review.orderId);
448
+ return loadedReview || review;
449
+ });
450
+ }
451
+ getReviewByPersonId(personId, productId, orderId) {
452
+ return __awaiter(this, void 0, void 0, function* () {
453
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
454
+ where: {
455
+ value: Object.assign({ product_id: { _eq: productId }, person_id: { _eq: personId } }, (orderId && { order_id: { _eq: orderId } })),
456
+ type: `product_review_bool_exp`,
457
+ required: true,
458
+ },
459
+ });
460
+ return data && data[0] && this.bindReviewToModel(data[0]);
461
+ });
462
+ }
463
+ getReviewByAuthorAndEmail(author, email, productId, orderId) {
464
+ return __awaiter(this, void 0, void 0, function* () {
465
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
466
+ where: {
467
+ value: Object.assign({ product_id: { _eq: productId }, author: { _eq: author }, email: { _eq: email } }, (orderId && { order_id: { _eq: orderId } })),
468
+ type: `product_review_bool_exp`,
469
+ required: true,
470
+ },
471
+ });
472
+ return data && data[0] && this.bindReviewToModel(data[0]);
473
+ });
474
+ }
475
+ cleanShoppingCountFromIds(ids) {
476
+ return __awaiter(this, void 0, void 0, function* () {
477
+ return yield this.mutation('update_product', ['affected_rows'], {
478
+ where: {
479
+ value: { id: { _nin: ids } },
480
+ type: 'product_bool_exp',
481
+ required: true,
482
+ },
483
+ _set: {
484
+ value: { shopping_count: 0 },
485
+ type: 'product_set_input',
486
+ },
487
+ });
488
+ });
489
+ }
490
+ }
491
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBV0wsd0JBQXdCLEVBSXhCLEtBQUssR0FDTixNQUFNLG9CQUFvQixDQUFBO0FBQzNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQW9CbkQsTUFBTSxPQUFPLDhCQUNYLFNBQVEscUJBQXFCLENBQUMsaUJBQWlCLENBQXVCLElBQUksQ0FBQyxDQUFDO0lBc0I1RSxZQUFZLFFBQWdCLEVBQUUsV0FBcUM7UUFDakUsS0FBSyxDQUFDO1lBQ0osU0FBUyxFQUFFLFNBQVM7WUFDcEIsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixRQUFRO1lBQ1IsV0FBVztZQUNYLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxDQUFBO1FBdWhCSSxzQkFBaUIsR0FBRyxDQUFDLEtBQTBCLEVBQWlCLEVBQUUsQ0FBQyxpQ0FDdEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxLQUNuRixT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O2FBQ0YsQ0FBQyxDQUFBO1lBRUYsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0tBQUE7SUFnQksseUJBQXlCLENBQUMsR0FBYTs7WUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDOUQsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDNUIsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUU7b0JBQzVCLElBQUksRUFBRSxtQkFBbUI7aUJBQzFCO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENyZWF0ZVJlcG9zaXRvcnlQYXJhbXMsXHJcbiAgRmluZFJlcG9zaXRvcnlQYXJhbXMsXHJcbiAgR2V0UmVwb3NpdG9yeVBhcmFtcyxcclxuICBOb25GdW5jdGlvblByb3BlcnR5TmFtZXMsXHJcbiAgUHJvZHVjdE1ldGFkYXRhLFxyXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxyXG4gIFByb2R1Y3RSZXZpZXcsXHJcbiAgUmVwb3NpdG9yeUZpbmRSZXN1bHQsXHJcbiAgUmV2aWV3U3RhdHVzUGFyYW1zLFxyXG4gIFJldmlld1dpdGhQcm9kdWN0RGF0YSxcclxuICBSb3VuZFByb2R1Y3RQcmljZXNIZWxwZXIsXHJcbiAgU2hvcFByaWNlLFxyXG4gIFNob3BzLFxyXG4gIFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXMsXHJcbiAgV2hlcmUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vZG9tYWluJ1xyXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vZXJyb3JzJ1xyXG5pbXBvcnQgeyBCYXNlLCBpc05pbCwgb21pdCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJ1xyXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQ29sdW1uVHlwZSwgSGFzdXJhR3JhcGhRTFdoZXJlIH0gZnJvbSAnLi4vLi4vZW51bXMnXHJcbmltcG9ydCB7IHdpdGhDcnVkSGFzdXJhR3JhcGhRTCwgd2l0aEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9taXhpbnMnXHJcbmltcG9ydCB7IFByb2R1Y3RIYXN1cmFHcmFwaFFMIH0gZnJvbSAnLi4vLi4vbW9kZWxzJ1xyXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQXV0aE9wdGlvbnMsIEhhc3VyYUdyYXBoUUxGaWVsZHMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbnR5cGUgUHJvZHVjdFJldmlld0ZpZWxkcyA9IHtcclxuICBpZD86IHN0cmluZ1xyXG4gIHNob3A6IFNob3BzXHJcbiAgcmF0ZTogbnVtYmVyXHJcbiAgYXV0aG9yPzogc3RyaW5nXHJcbiAgZW1haWw/OiBzdHJpbmdcclxuICBsb2NhdGlvbj86IHN0cmluZ1xyXG4gIHJldmlldz86IHN0cmluZ1xyXG4gIHN0YXR1cz86IGJvb2xlYW5cclxuICB0aXRsZT86IHN0cmluZ1xyXG4gIHBlcnNvbklkPzogbnVtYmVyXHJcbiAgcG9pbnRzPzogbnVtYmVyXHJcbiAgb3JkZXJJZD86IHN0cmluZ1xyXG4gIGNyZWF0ZWRBdD86IERhdGVcclxuICB1cGRhdGVkQXQ/OiBEYXRlXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0SGFzdXJhR3JhcGhRTFJlcG9zaXRvcnlcclxuICBleHRlbmRzIHdpdGhDcnVkSGFzdXJhR3JhcGhRTCh3aXRoSGFzdXJhR3JhcGhRTDxQcm9kdWN0SGFzdXJhR3JhcGhRTD4oQmFzZSkpXHJcbiAgaW1wbGVtZW50cyBQcm9kdWN0UmVwb3NpdG9yeVxyXG57XHJcbiAgcHJpdmF0ZSBnZXQgcmV2aWV3c0ZpZWxkcygpOiBhbnkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ2lkJyxcclxuICAgICAgJ3Nob3AnLFxyXG4gICAgICAncmF0ZScsXHJcbiAgICAgICdhdXRob3InLFxyXG4gICAgICAnZW1haWwnLFxyXG4gICAgICAnbG9jYXRpb24nLFxyXG4gICAgICAncmV2aWV3JyxcclxuICAgICAgJ3N0YXR1cycsXHJcbiAgICAgICd0aXRsZScsXHJcbiAgICAgIHsgcGVyc29uSWQ6IHsgY29sdW1uTmFtZTogJ3BlcnNvbl9pZCcgfSB9LFxyXG4gICAgICAncG9pbnRzJyxcclxuICAgICAgeyBvcmRlcklkOiB7IGNvbHVtbk5hbWU6ICdvcmRlcl9pZCcgfSB9LFxyXG4gICAgICB7IGNyZWF0ZWRBdDogeyBjb2x1bW5OYW1lOiAnY3JlYXRlZF9hdCcgfSB9LFxyXG4gICAgICB7IHVwZGF0ZWRBdDogeyBjb2x1bW5OYW1lOiAndXBkYXRlZF9hdCcgfSB9LFxyXG4gICAgXVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoZW5kcG9pbnQ6IHN0cmluZywgYXV0aE9wdGlvbnM6IEhhc3VyYUdyYXBoUUxBdXRoT3B0aW9ucykge1xyXG4gICAgc3VwZXIoe1xyXG4gICAgICB0YWJsZU5hbWU6ICdwcm9kdWN0JyxcclxuICAgICAgbW9kZWw6IFByb2R1Y3RIYXN1cmFHcmFwaFFMLFxyXG4gICAgICBlbmRwb2ludCxcclxuICAgICAgYXV0aE9wdGlvbnMsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGNvbW1vbkZpZWxkczogSGFzdXJhR3JhcGhRTEZpZWxkczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4gPSBbXHJcbiAgICAgIHsgaWQ6IHsgY29sdW1uTmFtZTogJ2lkJywgdG86ICh2YWx1ZSkgPT4gK3ZhbHVlLCBmcm9tOiAodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKCkgfSB9LFxyXG4gICAgICB7IGZpcmVzdG9yZUlkOiB7IGNvbHVtbk5hbWU6ICdmaXJlc3RvcmVfaWQnIH0gfSxcclxuICAgICAgeyBwcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ21haW5fcHJvZHVjdF9pZCcgfSB9LFxyXG4gICAgICB7IENFU1Q6IHsgY29sdW1uTmFtZTogJ2Nlc3QnIH0gfSxcclxuICAgICAgeyBFQU46IHsgY29sdW1uTmFtZTogJ2VhbicgfSB9LFxyXG4gICAgICB7IE5DTTogeyBjb2x1bW5OYW1lOiAnbmNtJyB9IH0sXHJcbiAgICAgICdicmFuZCcsXHJcbiAgICAgIHsgY29zdFByaWNlOiB7IGNvbHVtbk5hbWU6ICdjb3N0X3ByaWNlJyB9IH0sXHJcbiAgICAgIHtcclxuICAgICAgICBkZXNjcmlwdGlvbjoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ2Rlc2NyaXB0aW9uJyxcclxuICAgICAgICAgIGZyb206IChkZXNjcmlwdGlvbiwgZGF0YSkgPT4gKHtcclxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGRpZmZlcmVudGlhbHM6IGRhdGEuZGlmZmVyZW50aWFscyxcclxuICAgICAgICAgICAgd2hvTXVzdFVzZTogZGF0YS53aG9fbXVzdF91c2UsXHJcbiAgICAgICAgICAgIGhvd1RvVXNlOiBkYXRhLmhvd190b191c2UsXHJcbiAgICAgICAgICAgIGJyYW5kOiBkYXRhLmJyYW5kX2Rlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBiaW5kRmluZEZpbHRlcjogKHNlbnRlbmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBPYmplY3QudmFsdWVzKHNlbnRlbmNlKS5zaGlmdCgpXHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzPy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBmaWx0ZXJzLmRlc2NyaXB0aW9uIH0pLFxyXG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzLmRpZmZlcmVudGlhbHMgJiYgeyBkaWZmZXJlbnRpYWxzOiBmaWx0ZXJzLmRpZmZlcmVudGlhbHMgfSksXHJcbiAgICAgICAgICAgICAgLi4uKGZpbHRlcnMud2hvTXVzdFVzZSAmJiB7XHJcbiAgICAgICAgICAgICAgICB3aG9fbXVzdF91c2U6IGZpbHRlcnMud2hvTXVzdFVzZSxcclxuICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAuLi4oZmlsdGVycy5ob3dUb1VzZSAmJiB7XHJcbiAgICAgICAgICAgICAgICBob3dfdG9fdXNlOiBmaWx0ZXJzLmhvd1RvVXNlLFxyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIC4uLihmaWx0ZXJzLmJyYW5kICYmIHtcclxuICAgICAgICAgICAgICAgIGJyYW5kX2Rlc2NyaXB0aW9uOiBmaWx0ZXJzLmJyYW5kLFxyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAoZGVzY3JpcHRpb25EYXRhKSA9PiAoe1xyXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhPy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbkRhdGEuZGVzY3JpcHRpb24gfSksXHJcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbkRhdGEuZGlmZmVyZW50aWFscyAmJiB7IGRpZmZlcmVudGlhbHM6IGRlc2NyaXB0aW9uRGF0YS5kaWZmZXJlbnRpYWxzIH0pLFxyXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhLndob011c3RVc2UgJiYge1xyXG4gICAgICAgICAgICAgIHdob19tdXN0X3VzZTogZGVzY3JpcHRpb25EYXRhLndob011c3RVc2UsXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhLmhvd1RvVXNlICYmIHsgaG93X3RvX3VzZTogZGVzY3JpcHRpb25EYXRhLmhvd1RvVXNlIH0pLFxyXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb25EYXRhLmJyYW5kICYmIHsgYnJhbmRfZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uRGF0YS5icmFuZCB9KSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgZGlmZmVyZW50aWFsczogeyBjb2x1bW5OYW1lOiAnZGlmZmVyZW50aWFscycgfSB9LFxyXG4gICAgICB7IHdob011c3RVc2U6IHsgY29sdW1uTmFtZTogJ3dob19tdXN0X3VzZScgfSB9LFxyXG4gICAgICB7IGhvd1RvVXNlOiB7IGNvbHVtbk5hbWU6ICdob3dfdG9fdXNlJyB9IH0sXHJcbiAgICAgIHsgYnJhbmREZXNjcmlwdGlvbjogeyBjb2x1bW5OYW1lOiAnYnJhbmRfZGVzY3JpcHRpb24nIH0gfSxcclxuICAgICAgeyBpbmdyZWRpZW50czogeyBjb2x1bW5OYW1lOiAnaW5ncmVkaWVudHMnIH0gfSxcclxuICAgICAgeyBoYXNWYXJpYW50czogeyBjb2x1bW5OYW1lOiAnaGFzX3ZhcmlhbnRzJyB9IH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpbWFnZXM6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdpbWFnZXMnLFxyXG4gICAgICAgICAgdG86ICh2YWx1ZSkgPT4gKHZhbHVlPy5sZW5ndGggPiAwID8gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIDogYHt9YCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG1pbmlhdHVyZXM6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdtaW5pYXR1cmVzJyxcclxuICAgICAgICAgIHRvOiAodmFsdWUpID0+ICh2YWx1ZT8ubGVuZ3RoID4gMCA/IGB7XCIke3ZhbHVlPy5qb2luPy4oYFwiLFwiYCkgfHwgJyd9XCJ9YCA6IGB7fWApLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgICduYW1lJyxcclxuICAgICAge1xyXG4gICAgICAgIHByaWNlOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAncHJpY2UnLFxyXG4gICAgICAgICAgZnJvbTogKHByaWNlLCBkYXRhKTogU2hvcFByaWNlID0+ICh7XHJcbiAgICAgICAgICAgIHByaWNlLFxyXG4gICAgICAgICAgICBmdWxsUHJpY2U6IGRhdGEuZnVsbF9wcmljZSxcclxuICAgICAgICAgICAgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogZGF0YS5zdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgIHN1YnNjcmliZXJQcmljZTogZGF0YS5zdWJzY3JpYmVyX3ByaWNlLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBiaW5kRmluZEZpbHRlcjogKHNlbnRlbmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBPYmplY3QudmFsdWVzKHNlbnRlbmNlKS5zaGlmdCgpXHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycz8ucHJpY2UgfHwgZmlsdGVycz8ucHJpY2UgPT09IDApICYmIHsgcHJpY2U6IGZpbHRlcnMucHJpY2UgfSksXHJcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLmZ1bGxQcmljZSB8fCBmaWx0ZXJzLmZ1bGxQcmljZSA9PT0gMCkgJiYgeyBmdWxsX3ByaWNlOiBmaWx0ZXJzLmZ1bGxQcmljZSB9KSxcclxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSB8fCBmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UgPT09IDApICYmIHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZTogZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlLFxyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UgfHwgZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UgPT09IDApICYmIHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfcHJpY2U6IGZpbHRlcnMuc3Vic2NyaWJlclByaWNlLFxyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAocHJpY2VEYXRhKSA9PiAoe1xyXG4gICAgICAgICAgICAuLi4ocHJpY2VEYXRhPy5wcmljZSA+PSAwICYmIHsgcHJpY2U6IHByaWNlRGF0YS5wcmljZSB9KSxcclxuICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5mdWxsUHJpY2UgPj0gMCAmJiB7IGZ1bGxfcHJpY2U6IHByaWNlRGF0YS5mdWxsUHJpY2UgfSksXHJcbiAgICAgICAgICAgIC4uLihwcmljZURhdGEuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSA+PSAwICYmIHtcclxuICAgICAgICAgICAgICBzdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2U6IHByaWNlRGF0YS5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlLFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5zdWJzY3JpYmVyUHJpY2UgPj0gMCAmJiB7IHN1YnNjcmliZXJfcHJpY2U6IHByaWNlRGF0YS5zdWJzY3JpYmVyUHJpY2UgfSksXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7IGZ1bGxQcmljZTogeyBjb2x1bW5OYW1lOiAnZnVsbF9wcmljZScgfSB9LFxyXG4gICAgICB7IHN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2U6IHsgY29sdW1uTmFtZTogJ3N1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZScgfSB9LFxyXG4gICAgICB7IHN1YnNjcmliZXJQcmljZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9wcmljZScgfSB9LFxyXG4gICAgICAncHVibGlzaGVkJyxcclxuICAgICAgJ3NrdScsXHJcbiAgICAgIHtcclxuICAgICAgICBzdG9jazoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ3N0b2NrJyxcclxuICAgICAgICAgIGZyb206IChxdWFudGl0eTogbnVtYmVyKSA9PiAoeyBxdWFudGl0eSB9KSxcclxuICAgICAgICAgIHRvOiAodmFsdWUpID0+IChpc05pbCh2YWx1ZT8ucXVhbnRpdHkpID8gdmFsdWUgOiB2YWx1ZT8ucXVhbnRpdHkpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgICdzbHVnJyxcclxuICAgICAgJ3R5cGUnLFxyXG4gICAgICAndmlkZW8nLFxyXG4gICAgICAnd2VpZ2h0JyxcclxuICAgICAgJ2dlbmRlcicsXHJcbiAgICAgIHsgdGFnczogeyBjb2x1bW5OYW1lOiAndGFncycsIHR5cGU6IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLkpzb25iIH0gfSxcclxuICAgICAgeyBmaWx0ZXJzOiB7IGNvbHVtbk5hbWU6ICdmaWx0ZXJzJywgdHlwZTogSGFzdXJhR3JhcGhRTENvbHVtblR5cGUuSnNvbmIgfSB9LFxyXG4gICAgICB7IGlzS2l0OiB7IGNvbHVtbk5hbWU6ICdpc19raXQnIH0gfSxcclxuICAgICAgeyBjcmVhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ2NyZWF0ZWRfYXQnIH0gfSxcclxuICAgICAgeyB1cGRhdGVkQXQ6IHsgY29sdW1uTmFtZTogJ3VwZGF0ZWRfYXQnIH0gfSxcclxuICAgICAgeyByYXRlOiB7IGNvbHVtbk5hbWU6ICdyYXRpbmcnIH0gfSxcclxuICAgICAgeyByZXZpZXdzVG90YWw6IHsgY29sdW1uTmFtZTogJ3Jldmlld3NfdG90YWwnIH0gfSxcclxuICAgICAgeyBzaG9wcGluZ0NvdW50OiB7IGNvbHVtbk5hbWU6ICdzaG9wcGluZ19jb3VudCcgfSB9LFxyXG4gICAgICB7IGNhdGVnb3J5SWQ6IHsgY29sdW1uTmFtZTogJ2NhdGVnb3J5X2lkJyB9IH0sXHJcbiAgICAgIHtcclxuICAgICAgICBjYXRlZ29yeToge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ2NhdGVnb3J5JyxcclxuICAgICAgICAgIGZvcmVpZ25LZXlDb2x1bW46IHsgaWQ6ICdjYXRlZ29yeUlkJyB9LFxyXG4gICAgICAgICAgZmllbGRzOiBbJ2lkJywgJ25hbWUnLCAncmVmZXJlbmNlJywgJ3NsdWcnXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXVxyXG5cclxuICAgIHRoaXMuZmllbGRzID0gW1xyXG4gICAgICAuLi5jb21tb25GaWVsZHMsXHJcbiAgICAgIHtcclxuICAgICAgICBjYXRlZ29yaWVzOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnY2F0ZWdvcmllcycsXHJcbiAgICAgICAgICBmaWVsZHM6IFsnY2F0ZWdvcnlfaWQnXSxcclxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKHZhbHVlKSA9PiAoe1xyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiB7IGRhdGE6IHZhbHVlLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5X2lkOiArY2F0ZWdvcnkgfSkpIH0sXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRvOiAoY2F0ZWdvcmllcykgPT4gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICtjYXRlZ29yeUlkKSxcclxuICAgICAgICAgIGZyb206IChjYXRlZ29yaWVzOiB7IGNhdGVnb3J5X2lkOiBudW1iZXIgfVtdKSA9PlxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzPy5tYXAoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeT8uY2F0ZWdvcnlfaWQ/LnRvU3RyaW5nKCkpIHx8IFtdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBraXRQcm9kdWN0czoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0cycsXHJcbiAgICAgICAgICBmb3JlaWduS2V5Q29sdW1uOiB7IHByb2R1Y3RJZDogJ2lkJyB9LFxyXG4gICAgICAgICAgZmllbGRzOiBbXHJcbiAgICAgICAgICAgIHsgcHJvZHVjdElkOiB7IGNvbHVtbk5hbWU6ICdwcm9kdWN0X2lkJyB9IH0sXHJcbiAgICAgICAgICAgIHsga2l0UHJvZHVjdElkOiB7IGNvbHVtbk5hbWU6ICdraXRfcHJvZHVjdF9pZCcgfSB9LFxyXG4gICAgICAgICAgICAncXVhbnRpdHknLFxyXG4gICAgICAgICAgICB7IHByb2R1Y3Q6IHsgY29sdW1uTmFtZTogJ3Byb2R1Y3QnLCBmb3JlaWduS2V5Q29sdW1uOiB7IGlkOiAncHJvZHVjdF9pZCcgfSwgZmllbGRzOiBjb21tb25GaWVsZHMgfSB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgcmV2aWV3czoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ3Jldmlld3MnLFxyXG4gICAgICAgICAgZm9yZWlnbktleUNvbHVtbjogeyBwcm9kdWN0X2lkOiAnaWQnIH0sXHJcbiAgICAgICAgICBmaWVsZHM6IHRoaXMucmV2aWV3c0ZpZWxkcyxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdtZXRhZGF0YScsXHJcbiAgICAgICAgICBmaWVsZHM6IFsndGl0bGUnLCAnZGVzY3JpcHRpb24nXSxcclxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKHZhbHVlKSA9PiAoe1xyXG4gICAgICAgICAgICBtZXRhZGF0YTogeyBkYXRhOiB2YWx1ZSB9LFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZShwYXJhbXM6IENyZWF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xyXG4gICAgY29uc3QgeyBtZXRhZGF0YSwgLi4uZGF0YSB9ID0gcGFyYW1zXHJcbiAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgc3VwZXIuY3JlYXRlKFxyXG4gICAgICBvbWl0KHsgLi4uZGF0YSwgbWV0YWRhdGE6IG1ldGFkYXRhIHx8IHsgZGVzY3JpcHRpb246IG51bGwsIHRpdGxlOiBudWxsIH0gfSwgWydyZXZpZXdzJ10pLFxyXG4gICAgKVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHByb2R1Y3QucmV2aWV3cyA9IGRhdGEucmV2aWV3cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVSZXZpZXdzKCtwcm9kdWN0LmlkLCBkYXRhKSlcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHsgaWQ6IHByb2R1Y3QuaWQgfSlcclxuXHJcbiAgICAgIHRocm93IGVycm9yXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldChpZGVudGlmaWVyczogR2V0UmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XHJcbiAgICBjb25zdCBwcm9kdWN0ID0gTnVtYmVyLmlzTmFOKCtpZGVudGlmaWVycy5pZClcclxuICAgICAgPyAoYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWRlbnRpZmllcnMuaWQgfSwgb3B0aW9uczogeyBlbmFibGVDb3VudDogZmFsc2UgfSB9KSkuZGF0YT8uWzBdXHJcbiAgICAgIDogYXdhaXQgc3VwZXIuZ2V0KGlkZW50aWZpZXJzKVxyXG5cclxuICAgIGlmIChwcm9kdWN0LnByb2R1Y3RJZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1Byb2R1Y3Qgbm90IGZvdW5kLCBpdCBpcyBhIHZhcmlhbnQnKVxyXG5cclxuICAgIHByb2R1Y3QucmV2aWV3cyA9IHByb2R1Y3QucmV2aWV3cyB8fCAoYXdhaXQgdGhpcy5maW5kUmV2aWV3c0J5UHJvZHVjdCgrcHJvZHVjdC5pZCkpXHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbmQocGFyYW1zPzogRmluZFJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KTogUHJvbWlzZTxSZXBvc2l0b3J5RmluZFJlc3VsdDxQcm9kdWN0SGFzdXJhR3JhcGhRTD4+IHtcclxuICAgIGNvbnN0IHsgZmlsdGVycywgZmllbGRzLCAuLi5vcHRpb25zIH0gPSBwYXJhbXMgfHwge31cclxuICAgIGNvbnN0IGJpbmRGaWVsZHMgPVxyXG4gICAgICBmaWVsZHMgfHxcclxuICAgICAgKHRoaXMuZmllbGRzXHJcbiAgICAgICAgLm1hcCgoZmllbGQpID0+ICh0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnID8gZmllbGQgOiBPYmplY3Qua2V5cyhmaWVsZCkuc2hpZnQoKSkpXHJcbiAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkICE9PSAncmV2aWV3cycpIGFzIE5vbkZ1bmN0aW9uUHJvcGVydHlOYW1lczxcclxuICAgICAgICBQcm9kdWN0SGFzdXJhR3JhcGhRTCxcclxuICAgICAgICBrZXlvZiBQcm9kdWN0SGFzdXJhR3JhcGhRTFxyXG4gICAgICA+W10pXHJcblxyXG4gICAgcmV0dXJuIHN1cGVyLmZpbmQoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBmaWx0ZXJzOiB7IC4uLmZpbHRlcnMsIHByb2R1Y3RJZDogeyBvcGVyYXRvcjogV2hlcmUuSVNOVUxMIH0gfSxcclxuICAgICAgZmllbGRzOiBbXHJcbiAgICAgICAgLi4uYmluZEZpZWxkcyxcclxuICAgICAgICAuLi4oYmluZEZpZWxkcy5pbmNsdWRlcygncHJpY2UnKVxyXG4gICAgICAgICAgPyAoW1xyXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVyUHJpY2UnLFxyXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlJyxcclxuICAgICAgICAgICAgICAnZnVsbFByaWNlJyxcclxuICAgICAgICAgICAgXSBhcyBOb25GdW5jdGlvblByb3BlcnR5TmFtZXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+W10pXHJcbiAgICAgICAgICA6IFtdKSxcclxuICAgICAgXSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRCeVNsdWcoc2x1Zzogc3RyaW5nKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5maW5kKHtcclxuICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgIHNsdWcsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpZWxkczogdGhpcy5maWVsZHMubWFwKChmaWVsZCkgPT5cclxuICAgICAgICB0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnID8gZmllbGQgOiBPYmplY3Qua2V5cyhmaWVsZCkuc2hpZnQoKSxcclxuICAgICAgKSBhcyBOb25GdW5jdGlvblByb3BlcnR5TmFtZXM8UHJvZHVjdEhhc3VyYUdyYXBoUUwsIGtleW9mIFByb2R1Y3RIYXN1cmFHcmFwaFFMPltdLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgZW5hYmxlQ291bnQ6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBwcm9kdWN0ID0gcmVzdWx0Py5kYXRhPy5zaGlmdCgpXHJcblxyXG4gICAgUm91bmRQcm9kdWN0UHJpY2VzSGVscGVyLnJvdW5kUHJvZHVjdFByaWNlcyhwcm9kdWN0KVxyXG5cclxuICAgIHJldHVybiBwcm9kdWN0XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGUocGFyYW1zOiBVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcclxuICAgIGNvbnN0IHsgY2F0ZWdvcmllcywga2l0UHJvZHVjdHMsIHJldmlld3MsIGlkOiBjaGVja0lkLCByYXRlLCBtZXRhZGF0YSwgLi4uZGF0YSB9ID0gcGFyYW1zXHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBpZDogY2hlY2tJZCB9KVxyXG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmdldElkKHBsYWluRGF0YS5pZClcclxuICAgIGNvbnN0IHByb2R1Y3QgPSBhd2FpdCBzdXBlci51cGRhdGUoeyBpZCwgLi4uZGF0YSB9KVxyXG5cclxuICAgIHByb2R1Y3QuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXMgJiYgKGF3YWl0IHRoaXMudXBkYXRlQ2F0ZWdvcmllcygraWQsIHsgY2F0ZWdvcmllcyB9KSlcclxuICAgIHByb2R1Y3Qua2l0UHJvZHVjdHMgPSBraXRQcm9kdWN0cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVLaXRQcm9kdWN0cygraWQsIHsga2l0UHJvZHVjdHMgfSkpXHJcbiAgICBwcm9kdWN0LnJldmlld3MgPSByZXZpZXdzICYmIChhd2FpdCB0aGlzLnVwZGF0ZVJldmlld3MoK2lkLCB7IHJldmlld3MgfSkpXHJcbiAgICBwcm9kdWN0Lm1ldGFkYXRhID0gbWV0YWRhdGEgJiYgKGF3YWl0IHRoaXMudXBkYXRlTWV0YWRhdGEoK2lkLCB7IG1ldGFkYXRhIH0pKVxyXG5cclxuICAgIHJldHVybiBwcm9kdWN0XHJcbiAgfVxyXG5cclxuICBhc3luYyBmZXRjaFJldmlld3Moc3RhdHVzOiBSZXZpZXdTdGF0dXNQYXJhbXMpOiBQcm9taXNlPFJldmlld1dpdGhQcm9kdWN0RGF0YVtdPiB7XHJcbiAgICBjb25zdCByZXZpZXdzRXhwcmVzc2lvbiA9IHtcclxuICAgICAgc3RhdHVzOlxyXG4gICAgICAgIHN0YXR1cyA9PT0gJ3BlbmRpbmcnXHJcbiAgICAgICAgICA/IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5JU05VTExdOiB0cnVlIH1cclxuICAgICAgICAgIDogeyBbSGFzdXJhR3JhcGhRTFdoZXJlLkVRVUFMU106IHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyB9LFxyXG4gICAgfVxyXG4gICAgY29uc3QgeyBwcm9kdWN0OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KFxyXG4gICAgICAncHJvZHVjdCcsXHJcbiAgICAgIFsnaWQnLCAnbmFtZScsICdza3UnLCB7IHJldmlld3M6IHsgY29sdW1uTmFtZTogJ3Jldmlld3MnLCBmaWVsZHM6IHRoaXMucmV2aWV3c0ZpZWxkcyB9IH1dLFxyXG4gICAgICB7XHJcbiAgICAgICAgd2hlcmU6IHsgdmFsdWU6IHsgcmV2aWV3czogcmV2aWV3c0V4cHJlc3Npb24gfSwgdHlwZTogJ3Byb2R1Y3RfYm9vbF9leHAnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB9LFxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiBkYXRhLnJlZHVjZShcclxuICAgICAgKHJldmlld3MsIHByb2R1Y3QpID0+IFtcclxuICAgICAgICAuLi5yZXZpZXdzLFxyXG4gICAgICAgIC4uLnByb2R1Y3QucmV2aWV3c1xyXG4gICAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICAgKHJldmlldykgPT5cclxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncGVuZGluZycgJiYgW3VuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXMocmV2aWV3LnN0YXR1cykpIHx8XHJcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJiByZXZpZXcuc3RhdHVzID09PSB0cnVlKSB8fFxyXG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdyZWplY3RlZCcgJiYgcmV2aWV3LnN0YXR1cyA9PT0gZmFsc2UpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgocmV2aWV3KSA9PiAoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmJpbmRSZXZpZXdUb01vZGVsKHJldmlldyksXHJcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QubmFtZSxcclxuICAgICAgICAgICAgcHJvZHVjdFNrdTogcHJvZHVjdC5za3UsXHJcbiAgICAgICAgICB9KSksXHJcbiAgICAgIF0sXHJcbiAgICAgIFtdIGFzIFJldmlld1dpdGhQcm9kdWN0RGF0YVtdLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDYXRlZ29yaWVzKFxyXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXHJcbiAgICB7IGNhdGVnb3JpZXMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2NhdGVnb3JpZXMnPixcclxuICApOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMWydjYXRlZ29yaWVzJ10+IHtcclxuICAgIGlmICgnYWN0aW9uJyBpbiBjYXRlZ29yaWVzICYmIGNhdGVnb3JpZXMuYWN0aW9uID09PSAncmVtb3ZlJykge1xyXG4gICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgIHR5cGU6ICdjYXRlZ29yeV9wcm9kdWN0X2Jvb2xfZXhwJyxcclxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9IH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGNhdGVnb3JpZXMgfSlcclxuXHJcbiAgICBpZiAoIXBsYWluRGF0YS5jYXRlZ29yaWVzIHx8IHBsYWluRGF0YS5jYXRlZ29yaWVzLmxlbmd0aCA8PSAwKSByZXR1cm4gW11cclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgdHlwZTogJ2NhdGVnb3J5X3Byb2R1Y3RfYm9vbF9leHAnLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiB7IHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIG9iamVjdHM6IHtcclxuICAgICAgICB0eXBlOiAnW2NhdGVnb3J5X3Byb2R1Y3RfaW5zZXJ0X2lucHV0IV0nLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiBwbGFpbkRhdGEuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICh7IGNhdGVnb3J5X2lkOiBjYXRlZ29yeUlkLCBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSkpLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcGxhaW5EYXRhLmNhdGVnb3JpZXNcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlS2l0UHJvZHVjdHMoXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIHsga2l0UHJvZHVjdHMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2tpdFByb2R1Y3RzJz4sXHJcbiAgKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTFsna2l0UHJvZHVjdHMnXT4ge1xyXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsga2l0UHJvZHVjdHMgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfcHJvZHVjdF9raXQnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X2tpdF9ib29sX2V4cCcsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IHsga2l0X3Byb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfcHJvZHVjdF9raXQnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xyXG4gICAgICBvYmplY3RzOiB7XHJcbiAgICAgICAgdHlwZTogJ1twcm9kdWN0X2tpdF9pbnNlcnRfaW5wdXQhXScsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IHBsYWluRGF0YS5raXRQcm9kdWN0cy5tYXAoKGtpdFByb2R1Y3QpID0+ICh7XHJcbiAgICAgICAgICBraXRfcHJvZHVjdF9pZDogcHJvZHVjdElkLFxyXG4gICAgICAgICAgcHJvZHVjdF9pZDoga2l0UHJvZHVjdC5wcm9kdWN0SWQgfHwga2l0UHJvZHVjdC5wcm9kdWN0LmlkLFxyXG4gICAgICAgICAgcXVhbnRpdHk6IGtpdFByb2R1Y3QucXVhbnRpdHksXHJcbiAgICAgICAgfSkpLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcGxhaW5EYXRhLmtpdFByb2R1Y3RzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVJldmlld3MoXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIHsgcmV2aWV3cyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAncmV2aWV3cyc+LFxyXG4gICk6IFByb21pc2U8UHJvZHVjdFJldmlld1tdPiB7XHJcbiAgICBpZiAoIXJldmlld3MpIHJldHVybiBbXVxyXG4gICAgaWYgKCdhY3Rpb24nIGluIHJldmlld3MgJiYgcmV2aWV3cy5hY3Rpb24gPT09ICdyZW1vdmUnKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld0lkcyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIHJldmlld3MudmFsdWUubWFwKGFzeW5jIChyZXZpZXdEYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxyXG5cclxuICAgICAgICAgIHJldHVybiByZXZpZXc/LmlkXHJcbiAgICAgICAgfSksXHJcbiAgICAgIClcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X3JldmlldycsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgICAgd2hlcmU6IHsgdmFsdWU6IHsgaWQ6IHsgX2luOiByZXZpZXdJZHMuZmlsdGVyKEJvb2xlYW4pIH0gfSwgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwJywgcmVxdWlyZWQ6IHRydWUgfSxcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHJldHVybiByZXZpZXdzLnZhbHVlLm1hcCgocmV2aWV3LCBpbmRleCkgPT4gIXJldmlld0lkc1tpbmRleF0gJiYgcmV2aWV3KS5maWx0ZXIoQm9vbGVhbilcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyByZXZpZXdzIH0pXHJcblxyXG4gICAgaWYgKCFwbGFpbkRhdGEucmV2aWV3cyB8fCBwbGFpbkRhdGEucmV2aWV3cy5sZW5ndGggPD0gMCkgcmV0dXJuIFtdXHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxyXG4gICAgICBwbGFpbkRhdGEucmV2aWV3cy5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcclxuICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxyXG5cclxuICAgICAgICBpZiAocmV2aWV3LmlkKVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXHJcbiAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCd1cGRhdGVfcHJvZHVjdF9yZXZpZXdfYnlfcGsnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgICAgICAgICAgIHBrX2NvbHVtbnM6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgaWQ6IHJldmlldy5pZCB9LFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfcGtfY29sdW1uc19pbnB1dCcsXHJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIF9zZXQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IG9taXQodGhpcy5iaW5kUmV2aWV3VG9IYXN1cmEocmV2aWV3RGF0YSksIFsnaWQnLCAncHJvZHVjdF9pZCddKSxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X3NldF9pbnB1dCcsXHJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApLnVwZGF0ZV9wcm9kdWN0X3Jldmlld19ieV9wayxcclxuICAgICAgICAgIClcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZFJldmlld1RvTW9kZWwoXHJcbiAgICAgICAgICAoXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2luc2VydF9wcm9kdWN0X3Jldmlld19vbmUnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBvbWl0KHsgLi4udGhpcy5iaW5kUmV2aWV3VG9IYXN1cmEocmV2aWV3RGF0YSksIHByb2R1Y3RfaWQ6IHByb2R1Y3RJZCB9LCBbJ2lkJ10pLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2luc2VydF9pbnB1dCcsXHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKS5pbnNlcnRfcHJvZHVjdF9yZXZpZXdfb25lLFxyXG4gICAgICAgIClcclxuICAgICAgfSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU1ldGFkYXRhKFxyXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXHJcbiAgICB7IG1ldGFkYXRhIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdtZXRhZGF0YSc+LFxyXG4gICk6IFByb21pc2U8UHJvZHVjdE1ldGFkYXRhPiB7XHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBtZXRhZGF0YSB9KVxyXG5cclxuICAgIGlmICghcGxhaW5EYXRhLm1ldGFkYXRhKSByZXR1cm5cclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCd1cGRhdGVfcHJvZHVjdF9tZXRhZGF0YV9ieV9waycsIFsncHJvZHVjdF9pZCddLCB7XHJcbiAgICAgIHBrX2NvbHVtbnM6IHtcclxuICAgICAgICB2YWx1ZTogeyBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSxcclxuICAgICAgICB0eXBlOiAncHJvZHVjdF9tZXRhZGF0YV9wa19jb2x1bW5zX2lucHV0JyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAgX3NldDoge1xyXG4gICAgICAgIHZhbHVlOiBvbWl0KG1ldGFkYXRhLCBbJ3Byb2R1Y3RfaWQnXSksXHJcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3RfbWV0YWRhdGFfc2V0X2lucHV0JyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIHBsYWluRGF0YS5tZXRhZGF0YVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRJZChpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghTnVtYmVyLmlzTmFOKCtpZCkpIHJldHVybiBpZFxyXG5cclxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWQgfSwgb3B0aW9uczogeyBlbmFibGVDb3VudDogZmFsc2UgfSB9KVxyXG5cclxuICAgIGlmIChkYXRhPy5bMF0/LmlkKSByZXR1cm4gZGF0YT8uWzBdPy5pZFxyXG5cclxuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBQcm9kdWN0IHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmluZFJldmlld3NCeVByb2R1Y3QocHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXdbXT4ge1xyXG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwJyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5tYXAoKHJldmlldykgPT4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmV2aWV3KHJldmlldzogUHJvZHVjdFJldmlldywgcHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcclxuICAgIGlmIChyZXZpZXcuaWQpIHJldHVybiByZXZpZXdcclxuXHJcbiAgICBsZXQgbG9hZGVkUmV2aWV3OiBQcm9kdWN0UmV2aWV3XHJcblxyXG4gICAgaWYgKHJldmlldy5wZXJzb25JZCkgbG9hZGVkUmV2aWV3ID0gYXdhaXQgdGhpcy5nZXRSZXZpZXdCeVBlcnNvbklkKHJldmlldy5wZXJzb25JZCwgcHJvZHVjdElkLCByZXZpZXcub3JkZXJJZClcclxuICAgIGlmICghbG9hZGVkUmV2aWV3ICYmIHJldmlldy5hdXRob3IgJiYgcmV2aWV3LmVtYWlsKVxyXG4gICAgICBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5QXV0aG9yQW5kRW1haWwocmV2aWV3LmF1dGhvciwgcmV2aWV3LmVtYWlsLCBwcm9kdWN0SWQsIHJldmlldy5vcmRlcklkKVxyXG5cclxuICAgIHJldHVybiBsb2FkZWRSZXZpZXcgfHwgcmV2aWV3XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5UGVyc29uSWQocGVyc29uSWQ6IG51bWJlciwgcHJvZHVjdElkOiBudW1iZXIsIG9yZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcclxuICAgIGNvbnN0IHsgcHJvZHVjdF9yZXZpZXc6IGRhdGEgfSA9IGF3YWl0IHRoaXMucXVlcnkoJ3Byb2R1Y3RfcmV2aWV3JywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSxcclxuICAgICAgICAgIHBlcnNvbl9pZDogeyBfZXE6IHBlcnNvbklkIH0sXHJcbiAgICAgICAgICAuLi4ob3JkZXJJZCAmJiB7IG9yZGVyX2lkOiB7IF9lcTogb3JkZXJJZCB9IH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHlwZTogYHByb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwYCxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YVswXSAmJiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKGRhdGFbMF0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5QXV0aG9yQW5kRW1haWwoXHJcbiAgICBhdXRob3I6IHN0cmluZyxcclxuICAgIGVtYWlsOiBzdHJpbmcsXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIG9yZGVySWQ/OiBzdHJpbmcsXHJcbiAgKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XHJcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXHJcbiAgICAgICAgICBhdXRob3I6IHsgX2VxOiBhdXRob3IgfSxcclxuICAgICAgICAgIGVtYWlsOiB7IF9lcTogZW1haWwgfSxcclxuICAgICAgICAgIC4uLihvcmRlcklkICYmIHsgb3JkZXJfaWQ6IHsgX2VxOiBvcmRlcklkIH0gfSksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhWzBdICYmIHRoaXMuYmluZFJldmlld1RvTW9kZWwoZGF0YVswXSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZFJldmlld1RvTW9kZWwgPSAocGxhaW46IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9kdWN0UmV2aWV3ID0+ICh7XHJcbiAgICAuLi5vbWl0KHBsYWluLCBbJ3Byb2R1Y3RfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ3BlcnNvbl9pZCcsICdvcmRlcl9pZCddKSxcclxuICAgIGNyZWF0ZWRBdDogdHlwZW9mIHBsYWluLmNyZWF0ZWRfYXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUocGxhaW4uY3JlYXRlZF9hdCkgOiBwbGFpbi5jcmVhdGVkX2F0LFxyXG4gICAgdXBkYXRlZEF0OiB0eXBlb2YgcGxhaW4udXBkYXRlZF9hdCA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShwbGFpbi51cGRhdGVkX2F0KSA6IHBsYWluLnVwZGF0ZWRfYXQsXHJcbiAgICBwZXJzb25JZDogcGxhaW4ucGVyc29uX2lkLFxyXG4gICAgb3JkZXJJZDogcGxhaW4ub3JkZXJfaWQsXHJcbiAgfSlcclxuXHJcbiAgcHJpdmF0ZSBiaW5kUmV2aWV3VG9IYXN1cmEgPSAocmV2aWV3OiBQcm9kdWN0UmV2aWV3KTogUHJvZHVjdFJldmlld0ZpZWxkcyA9PiAoe1xyXG4gICAgLi4ub21pdChyZXZpZXcsIFsncHJvZHVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAncGVyc29uSWQnLCAnb3JkZXJJZCddKSxcclxuICAgIHBlcnNvbl9pZDogcmV2aWV3LnBlcnNvbklkLFxyXG4gICAgb3JkZXJfaWQ6IHJldmlldy5vcmRlcklkLFxyXG4gIH0pXHJcblxyXG4gIGFzeW5jIGNsZWFuU2hvcHBpbmdDb3VudEZyb21JZHMoaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubXV0YXRpb24oJ3VwZGF0ZV9wcm9kdWN0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICB2YWx1ZTogeyBpZDogeyBfbmluOiBpZHMgfSB9LFxyXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X2Jvb2xfZXhwJyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAgX3NldDoge1xyXG4gICAgICAgIHZhbHVlOiB7IHNob3BwaW5nX2NvdW50OiAwIH0sXHJcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3Rfc2V0X2lucHV0JyxcclxuICAgICAgfSxcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbiJdfQ==