@infrab4a/connect-angular 5.4.6-beta.0 → 5.5.0-alpha.1
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.
- package/angular-connect.module.d.ts +33 -36
- package/angular-elastic-search.module.d.ts +9 -9
- package/angular-firebase-auth.module.d.ts +10 -11
- package/angular-firestore.module.d.ts +16 -17
- package/angular-hasura-graphql.module.d.ts +14 -14
- package/angular-vertex-search.module.d.ts +9 -9
- package/consts/backend-url.const.d.ts +1 -1
- package/consts/category-structure.d.ts +1 -1
- package/consts/default-shop.const.d.ts +1 -1
- package/consts/es-config.const.d.ts +1 -1
- package/consts/firebase-const.d.ts +4 -4
- package/consts/hasura-options.const.d.ts +1 -1
- package/consts/index.d.ts +8 -8
- package/consts/persistence.const.d.ts +1 -1
- package/consts/storage-base-url.const.d.ts +1 -1
- package/consts/vertex-config.const.d.ts +1 -1
- package/esm2022/angular-connect.module.mjs +288 -0
- package/esm2022/angular-elastic-search.module.mjs +34 -0
- package/esm2022/angular-firebase-auth.module.mjs +140 -0
- package/esm2022/angular-firestore.module.mjs +538 -0
- package/esm2022/angular-hasura-graphql.module.mjs +333 -0
- package/esm2022/angular-vertex-search.module.mjs +34 -0
- package/{esm2020 → esm2022}/consts/backend-url.const.mjs +2 -2
- package/{esm2020 → esm2022}/consts/category-structure.mjs +2 -2
- package/{esm2020 → esm2022}/consts/default-shop.const.mjs +2 -2
- package/{esm2020 → esm2022}/consts/es-config.const.mjs +2 -2
- package/{esm2020 → esm2022}/consts/firebase-const.mjs +5 -5
- package/{esm2020 → esm2022}/consts/hasura-options.const.mjs +2 -2
- package/{esm2020 → esm2022}/consts/index.mjs +9 -9
- package/{esm2020 → esm2022}/consts/persistence.const.mjs +2 -2
- package/{esm2020 → esm2022}/consts/storage-base-url.const.mjs +2 -2
- package/{esm2020 → esm2022}/consts/vertex-config.const.mjs +2 -2
- package/{esm2020 → esm2022}/helpers/index.mjs +2 -2
- package/{esm2020 → esm2022}/helpers/mobile-operation-system-checker.helper.mjs +7 -7
- package/{esm2020 → esm2022}/index.mjs +7 -7
- package/{esm2020 → esm2022}/infrab4a-connect-angular.mjs +4 -4
- package/esm2022/interfaces/catalog-strategies.interface.mjs +2 -0
- package/{esm2020 → esm2022}/interfaces/category-facades.interface.mjs +2 -2
- package/{esm2020 → esm2022}/interfaces/index.mjs +3 -3
- package/{esm2020 → esm2022}/persistence/cookie-data-persistence.mjs +22 -22
- package/{esm2020 → esm2022}/persistence/data-persistence.mjs +2 -2
- package/{esm2020 → esm2022}/persistence/index.mjs +3 -3
- package/{esm2020 → esm2022}/services/auth.service.mjs +37 -37
- package/{esm2020 → esm2022}/services/cart/cart-services.facade.mjs +21 -21
- package/{esm2020 → esm2022}/services/cart/index.mjs +2 -2
- package/{esm2020 → esm2022}/services/cart.service.mjs +73 -73
- package/{esm2020 → esm2022}/services/catalog/adapters/category-structure.adapter.mjs +2 -2
- package/{esm2020 → esm2022}/services/catalog/adapters/index.mjs +4 -4
- package/{esm2020 → esm2022}/services/catalog/adapters/new-category-structure.adapter.mjs +43 -43
- package/{esm2020 → esm2022}/services/catalog/adapters/old-category-structure.adapter.mjs +23 -23
- package/esm2022/services/catalog/catalog.service.mjs +111 -0
- package/{esm2020 → esm2022}/services/catalog/category.service.mjs +42 -42
- package/esm2022/services/catalog/context/catalog-search.context.mjs +40 -0
- package/{esm2020 → esm2022}/services/catalog/enums/index.mjs +2 -2
- package/{esm2020 → esm2022}/services/catalog/enums/product-sorts.enum.mjs +11 -11
- package/{esm2020 → esm2022}/services/catalog/facades/catalog-service.facade.mjs +32 -32
- package/esm2022/services/catalog/facades/catalog-strategies.facade.mjs +17 -0
- package/esm2022/services/catalog/facades/category-repository.facade.mjs +20 -0
- package/{esm2020 → esm2022}/services/catalog/facades/category-service.facade.mjs +30 -30
- package/{esm2020 → esm2022}/services/catalog/facades/index.mjs +6 -6
- package/esm2022/services/catalog/facades/product-catalog.facade.mjs +21 -0
- package/esm2022/services/catalog/helpers/brand-manager.helper.mjs +57 -0
- package/esm2022/services/catalog/helpers/catalog-filter.helper.mjs +44 -0
- package/esm2022/services/catalog/helpers/catalog-sort.helper.mjs +52 -0
- package/{esm2020 → esm2022}/services/catalog/helpers/index.mjs +5 -5
- package/{esm2020 → esm2022}/services/catalog/helpers/product-fields.helper.mjs +40 -40
- package/{esm2020 → esm2022}/services/catalog/index.mjs +8 -8
- package/{esm2020 → esm2022}/services/catalog/models/category-with-tree.model.mjs +10 -10
- package/{esm2020 → esm2022}/services/catalog/models/index.mjs +2 -2
- package/esm2022/services/catalog/services/catalog-helpers.service.mjs +33 -0
- package/{esm2020 → esm2022}/services/catalog/services/catalog-operations.facade.mjs +26 -26
- package/esm2022/services/catalog/services/catalog-repository.service.mjs +25 -0
- package/{esm2020 → esm2022}/services/catalog/services/index.mjs +5 -5
- package/esm2022/services/catalog/services/product-management.facade.mjs +25 -0
- package/esm2022/services/catalog/strategies/category-search.strategy.mjs +133 -0
- package/{esm2020 → esm2022}/services/catalog/strategies/index.mjs +4 -4
- package/esm2022/services/catalog/strategies/profile-search.strategy.mjs +42 -0
- package/esm2022/services/catalog/strategies/term-search.strategy.mjs +123 -0
- package/esm2022/services/catalog/strategies/types/strategy-params.type.mjs +2 -0
- package/{esm2020 → esm2022}/services/catalog/types/fetch-products-options.type.mjs +2 -2
- package/esm2022/services/catalog/types/fetch-products-params.type.mjs +2 -0
- package/{esm2020 → esm2022}/services/catalog/types/fetch-products-response.type.mjs +2 -2
- package/{esm2020 → esm2022}/services/catalog/types/index.mjs +6 -6
- package/esm2022/services/catalog/types/method-params.type.mjs +2 -0
- package/{esm2020 → esm2022}/services/catalog/types/product-sort.type.mjs +2 -2
- package/esm2022/services/catalog/wishlist.service.mjs +254 -0
- package/esm2022/services/checkout/checkout-dependencies.facade.mjs +20 -0
- package/esm2022/services/checkout/checkout-repositories.facade.mjs +20 -0
- package/{esm2020 → esm2022}/services/checkout/index.mjs +3 -3
- package/{esm2020 → esm2022}/services/checkout-subscription.service.mjs +55 -55
- package/{esm2020 → esm2022}/services/checkout.service.mjs +106 -106
- package/{esm2020 → esm2022}/services/coupon/coupon-repositories.facade.mjs +24 -24
- package/{esm2020 → esm2022}/services/coupon/index.mjs +2 -2
- package/esm2022/services/coupon/types/coupon-params.type.mjs +2 -0
- package/esm2022/services/coupon.service.mjs +248 -0
- package/{esm2020 → esm2022}/services/helpers/index.mjs +2 -2
- package/{esm2020 → esm2022}/services/helpers/util.helper.mjs +18 -18
- package/{esm2020 → esm2022}/services/home-shop/home-shop-repositories.facade.mjs +24 -24
- package/{esm2020 → esm2022}/services/home-shop/index.mjs +2 -2
- package/{esm2020 → esm2022}/services/home-shop.service.mjs +119 -119
- package/{esm2020 → esm2022}/services/index.mjs +11 -11
- package/esm2022/services/order-product-review.service.mjs +110 -0
- package/{esm2020 → esm2022}/services/order.service.mjs +30 -30
- package/{esm2020 → esm2022}/services/shared/configuration.facade.mjs +29 -29
- package/{esm2020 → esm2022}/services/shared/index.mjs +2 -2
- package/{esm2020 → esm2022}/services/types/index.mjs +5 -5
- package/{esm2020 → esm2022}/services/types/pending-product-review.type.mjs +2 -2
- package/{esm2020 → esm2022}/services/types/product-review-create.type.mjs +2 -2
- package/{esm2020 → esm2022}/services/types/required-checkout-data.type.mjs +2 -2
- package/{esm2020 → esm2022}/services/types/required-checkout-subscription-data.type.mjs +2 -2
- package/{esm2020 → esm2022}/types/firebase-app-config.type.mjs +2 -2
- package/{esm2020 → esm2022}/types/index.mjs +2 -2
- package/{fesm2020 → fesm2022}/infrab4a-connect-angular.mjs +3284 -3289
- package/fesm2022/infrab4a-connect-angular.mjs.map +1 -0
- package/helpers/index.d.ts +1 -1
- package/helpers/mobile-operation-system-checker.helper.d.ts +3 -3
- package/index.d.ts +6 -6
- package/interfaces/catalog-strategies.interface.d.ts +31 -31
- package/interfaces/category-facades.interface.d.ts +6 -6
- package/interfaces/index.d.ts +2 -2
- package/package.json +9 -15
- package/persistence/cookie-data-persistence.d.ts +10 -10
- package/persistence/data-persistence.d.ts +6 -6
- package/persistence/index.d.ts +2 -2
- package/services/auth.service.d.ts +18 -18
- package/services/cart/cart-services.facade.d.ts +12 -12
- package/services/cart/index.d.ts +1 -1
- package/services/cart.service.d.ts +26 -26
- package/services/catalog/adapters/category-structure.adapter.d.ts +4 -4
- package/services/catalog/adapters/index.d.ts +3 -3
- package/services/catalog/adapters/new-category-structure.adapter.d.ts +12 -12
- package/services/catalog/adapters/old-category-structure.adapter.d.ts +10 -10
- package/services/catalog/catalog.service.d.ts +24 -24
- package/services/catalog/category.service.d.ts +23 -23
- package/services/catalog/context/catalog-search.context.d.ts +14 -14
- package/services/catalog/enums/index.d.ts +1 -1
- package/services/catalog/enums/product-sorts.enum.d.ts +9 -9
- package/services/catalog/facades/catalog-service.facade.d.ts +15 -15
- package/services/catalog/facades/catalog-strategies.facade.d.ts +10 -10
- package/services/catalog/facades/category-repository.facade.d.ts +9 -9
- package/services/catalog/facades/category-service.facade.d.ts +15 -15
- package/services/catalog/facades/index.d.ts +5 -5
- package/services/catalog/facades/product-catalog.facade.d.ts +10 -10
- package/services/catalog/helpers/brand-manager.helper.d.ts +14 -14
- package/services/catalog/helpers/catalog-filter.helper.d.ts +8 -8
- package/services/catalog/helpers/catalog-sort.helper.d.ts +7 -7
- package/services/catalog/helpers/index.d.ts +4 -4
- package/services/catalog/helpers/product-fields.helper.d.ts +7 -7
- package/services/catalog/index.d.ts +7 -7
- package/services/catalog/models/category-with-tree.model.d.ts +4 -4
- package/services/catalog/models/index.d.ts +1 -1
- package/services/catalog/services/catalog-helpers.service.d.ts +17 -17
- package/services/catalog/services/catalog-operations.facade.d.ts +13 -13
- package/services/catalog/services/catalog-repository.service.d.ts +12 -12
- package/services/catalog/services/index.d.ts +4 -4
- package/services/catalog/services/product-management.facade.d.ts +12 -12
- package/services/catalog/strategies/category-search.strategy.d.ts +19 -19
- package/services/catalog/strategies/index.d.ts +3 -3
- package/services/catalog/strategies/profile-search.strategy.d.ts +14 -14
- package/services/catalog/strategies/term-search.strategy.d.ts +20 -20
- package/services/catalog/strategies/types/strategy-params.type.d.ts +58 -58
- package/services/catalog/types/fetch-products-options.type.d.ts +8 -8
- package/services/catalog/types/fetch-products-params.type.d.ts +25 -25
- package/services/catalog/types/fetch-products-response.type.d.ts +19 -19
- package/services/catalog/types/index.d.ts +5 -5
- package/services/catalog/types/method-params.type.d.ts +17 -17
- package/services/catalog/types/product-sort.type.d.ts +2 -2
- package/services/catalog/wishlist.service.d.ts +59 -59
- package/services/checkout/checkout-dependencies.facade.d.ts +10 -10
- package/services/checkout/checkout-repositories.facade.d.ts +9 -9
- package/services/checkout/index.d.ts +2 -2
- package/services/checkout-subscription.service.d.ts +19 -19
- package/services/checkout.service.d.ts +30 -30
- package/services/coupon/coupon-repositories.facade.d.ts +10 -10
- package/services/coupon/index.d.ts +1 -1
- package/services/coupon/types/coupon-params.type.d.ts +13 -13
- package/services/coupon.service.d.ts +36 -36
- package/services/helpers/index.d.ts +1 -1
- package/services/helpers/util.helper.d.ts +3 -3
- package/services/home-shop/home-shop-repositories.facade.d.ts +10 -10
- package/services/home-shop/index.d.ts +1 -1
- package/services/home-shop.service.d.ts +26 -26
- package/services/index.d.ts +10 -10
- package/services/order-product-review.service.d.ts +16 -16
- package/services/order.service.d.ts +13 -13
- package/services/shared/configuration.facade.d.ts +12 -12
- package/services/shared/index.d.ts +1 -1
- package/services/types/index.d.ts +4 -4
- package/services/types/pending-product-review.type.d.ts +12 -12
- package/services/types/product-review-create.type.d.ts +14 -14
- package/services/types/required-checkout-data.type.d.ts +2 -2
- package/services/types/required-checkout-subscription-data.type.d.ts +2 -2
- package/types/firebase-app-config.type.d.ts +1 -1
- package/types/index.d.ts +1 -1
- package/esm2020/angular-connect.module.mjs +0 -291
- package/esm2020/angular-elastic-search.module.mjs +0 -34
- package/esm2020/angular-firebase-auth.module.mjs +0 -141
- package/esm2020/angular-firestore.module.mjs +0 -541
- package/esm2020/angular-hasura-graphql.module.mjs +0 -333
- package/esm2020/angular-vertex-search.module.mjs +0 -34
- package/esm2020/interfaces/catalog-strategies.interface.mjs +0 -2
- package/esm2020/services/catalog/catalog.service.mjs +0 -111
- package/esm2020/services/catalog/context/catalog-search.context.mjs +0 -40
- package/esm2020/services/catalog/facades/catalog-strategies.facade.mjs +0 -17
- package/esm2020/services/catalog/facades/category-repository.facade.mjs +0 -20
- package/esm2020/services/catalog/facades/product-catalog.facade.mjs +0 -21
- package/esm2020/services/catalog/helpers/brand-manager.helper.mjs +0 -57
- package/esm2020/services/catalog/helpers/catalog-filter.helper.mjs +0 -44
- package/esm2020/services/catalog/helpers/catalog-sort.helper.mjs +0 -52
- package/esm2020/services/catalog/services/catalog-helpers.service.mjs +0 -33
- package/esm2020/services/catalog/services/catalog-repository.service.mjs +0 -25
- package/esm2020/services/catalog/services/product-management.facade.mjs +0 -25
- package/esm2020/services/catalog/strategies/category-search.strategy.mjs +0 -133
- package/esm2020/services/catalog/strategies/profile-search.strategy.mjs +0 -42
- package/esm2020/services/catalog/strategies/term-search.strategy.mjs +0 -123
- package/esm2020/services/catalog/strategies/types/strategy-params.type.mjs +0 -2
- package/esm2020/services/catalog/types/fetch-products-params.type.mjs +0 -2
- package/esm2020/services/catalog/types/method-params.type.mjs +0 -2
- package/esm2020/services/catalog/wishlist.service.mjs +0 -254
- package/esm2020/services/checkout/checkout-dependencies.facade.mjs +0 -20
- package/esm2020/services/checkout/checkout-repositories.facade.mjs +0 -20
- package/esm2020/services/coupon/types/coupon-params.type.mjs +0 -2
- package/esm2020/services/coupon.service.mjs +0 -248
- package/esm2020/services/order-product-review.service.mjs +0 -110
- package/fesm2015/infrab4a-connect-angular.mjs +0 -3491
- package/fesm2015/infrab4a-connect-angular.mjs.map +0 -1
- package/fesm2020/infrab4a-connect-angular.mjs.map +0 -1
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { CheckoutTypes, CouponTypes, Exclusivities, OrderStatus, Shops, Where, } from '@infrab4a/connect';
|
|
3
|
-
import { from, of } from 'rxjs';
|
|
4
|
-
import { concatMap, map } from 'rxjs/operators';
|
|
5
|
-
import { CouponRepositoriesFacade } from './coupon';
|
|
6
|
-
import { ConfigurationFacade } from './shared';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./coupon";
|
|
9
|
-
import * as i2 from "./shared";
|
|
10
|
-
export class CouponService {
|
|
11
|
-
constructor(repositoriesFacade, configurationFacade) {
|
|
12
|
-
this.repositoriesFacade = repositoriesFacade;
|
|
13
|
-
this.configurationFacade = configurationFacade;
|
|
14
|
-
this.emailIsFromCollaborator = (userEmail) => !!userEmail?.match(/@b4a.com.br/g);
|
|
15
|
-
}
|
|
16
|
-
checkCoupon(params) {
|
|
17
|
-
const { nickname, checkoutType, checkout, plan } = params;
|
|
18
|
-
return from(this.repositoriesFacade.couponRepository
|
|
19
|
-
.find({
|
|
20
|
-
filters: {
|
|
21
|
-
nickname: { operator: Where.EQUALS, value: nickname },
|
|
22
|
-
active: { operator: Where.EQUALS, value: true },
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
.then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation({ coupon: couponValid, checkoutType, checkout, plan })), map((couponValidated) => couponValidated));
|
|
26
|
-
}
|
|
27
|
-
async couponValidation(coupon, checkoutType) {
|
|
28
|
-
if (!coupon)
|
|
29
|
-
throw 'Cupom inválido.';
|
|
30
|
-
if (coupon?.beginAt && coupon?.beginAt.getTime() > new Date().getTime())
|
|
31
|
-
throw 'Cupom inválido.';
|
|
32
|
-
if (coupon?.expiresIn && (coupon?.expiresIn).getTime() < new Date().getTime())
|
|
33
|
-
throw 'Cupom expirado.';
|
|
34
|
-
const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.configurationFacade.defaultShop;
|
|
35
|
-
if (!isInShop)
|
|
36
|
-
throw 'Cupom inválido para loja.';
|
|
37
|
-
const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
|
|
38
|
-
if (!isCheckoutType)
|
|
39
|
-
throw 'Cupom inválido. Erro de checkout.';
|
|
40
|
-
return coupon;
|
|
41
|
-
}
|
|
42
|
-
async couponRulesValidation(params) {
|
|
43
|
-
const { coupon, checkoutType, checkout, plan } = params;
|
|
44
|
-
if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
|
|
45
|
-
return this.validateSubscriptionCoupon(coupon, plan);
|
|
46
|
-
}
|
|
47
|
-
return this.validateEcommerceCoupon(coupon, checkoutType, checkout);
|
|
48
|
-
}
|
|
49
|
-
validateSubscriptionCoupon(coupon, plan) {
|
|
50
|
-
if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase()) {
|
|
51
|
-
throw 'Cupom inválido para sua assinatura.';
|
|
52
|
-
}
|
|
53
|
-
return coupon;
|
|
54
|
-
}
|
|
55
|
-
async validateEcommerceCoupon(coupon, checkoutType, checkout) {
|
|
56
|
-
this.validateUserEligibility(coupon, checkout?.user);
|
|
57
|
-
await this.validateUsageLimits(coupon, checkoutType, checkout);
|
|
58
|
-
await this.validateProductEligibility(coupon, checkout);
|
|
59
|
-
return coupon;
|
|
60
|
-
}
|
|
61
|
-
validateUserEligibility(coupon, user) {
|
|
62
|
-
const validUser = this.coupomUserValidation(coupon, user);
|
|
63
|
-
if (!validUser)
|
|
64
|
-
throw 'Usuário não elegível.';
|
|
65
|
-
}
|
|
66
|
-
async validateUsageLimits(coupon, checkoutType, checkout) {
|
|
67
|
-
const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
|
|
68
|
-
if (couponUseLimits.firstOrder) {
|
|
69
|
-
await this.validateFirstOrderLimit(checkout.user.email);
|
|
70
|
-
}
|
|
71
|
-
if (!couponUseLimits.unlimited || couponUseLimits.limitedPerUser) {
|
|
72
|
-
await this.validateCouponUsageLimits(coupon, couponUseLimits, checkout.user.email);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async validateFirstOrderLimit(userEmail) {
|
|
76
|
-
const ordersUser = await this.getOrdersFromUser(userEmail.toLocaleLowerCase());
|
|
77
|
-
if (ordersUser.length >= 1)
|
|
78
|
-
throw 'Limite de uso atingido';
|
|
79
|
-
}
|
|
80
|
-
async validateCouponUsageLimits(coupon, couponUseLimits, userEmail) {
|
|
81
|
-
const ordersCoupon = await this.getOrdersWithCoupon(coupon);
|
|
82
|
-
if (!couponUseLimits.unlimited && couponUseLimits.total && ordersCoupon.length >= couponUseLimits.total) {
|
|
83
|
-
throw 'Limite de uso atingido.';
|
|
84
|
-
}
|
|
85
|
-
if (couponUseLimits.limitedPerUser) {
|
|
86
|
-
const ordersWithUser = this.countOrdersWithUser(ordersCoupon, userEmail);
|
|
87
|
-
if (ordersWithUser > 0)
|
|
88
|
-
throw 'Limite de uso por usuário atingido.';
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
async validateProductEligibility(coupon, checkout) {
|
|
92
|
-
const hasProductCategories = await this.hasProductCategories(coupon, checkout);
|
|
93
|
-
if (!hasProductCategories)
|
|
94
|
-
throw 'Seu carrinho não possui produtos elegíveis para desconto.';
|
|
95
|
-
const hasMinSubTotal = await this.hasMinSubTotal(coupon, checkout);
|
|
96
|
-
if (!hasMinSubTotal) {
|
|
97
|
-
this.throwMinSubTotalError(coupon);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
throwMinSubTotalError(coupon) {
|
|
101
|
-
const formattedValue = Intl.NumberFormat('pt-BR', {
|
|
102
|
-
style: 'currency',
|
|
103
|
-
currency: 'BRL',
|
|
104
|
-
}).format(coupon.minSubTotalValue);
|
|
105
|
-
if (coupon.productsCategories?.length) {
|
|
106
|
-
throw `Valor mínimo de ${formattedValue} não atingido na(s) categoria(s) elegíveis para o desconto.`;
|
|
107
|
-
}
|
|
108
|
-
throw `Valor mínimo de ${formattedValue} não atingido.`;
|
|
109
|
-
}
|
|
110
|
-
calcDiscountSubscription(coupon, checkout) {
|
|
111
|
-
let discount = 0;
|
|
112
|
-
if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
|
|
113
|
-
discount = coupon.discount.subscription.value;
|
|
114
|
-
else
|
|
115
|
-
discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
|
|
116
|
-
return of(discount);
|
|
117
|
-
}
|
|
118
|
-
async hasMinSubTotal(coupon, checkout) {
|
|
119
|
-
if (!coupon.minSubTotalValue)
|
|
120
|
-
return true;
|
|
121
|
-
const lineItensDiscount = await this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
|
|
122
|
-
const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user);
|
|
123
|
-
if (coupon.minSubTotalValue <= subTotal)
|
|
124
|
-
return true;
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
async hasProductCategories(coupon, checkout) {
|
|
128
|
-
if (!coupon.productsCategories?.length) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
const couponCategories = await this.getCouponCategoriesId(coupon.productsCategories);
|
|
132
|
-
const hasCategories = checkout.lineItems?.filter((item) => {
|
|
133
|
-
if (item.isGift)
|
|
134
|
-
return false;
|
|
135
|
-
if (!item.categories?.length)
|
|
136
|
-
return true;
|
|
137
|
-
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
138
|
-
});
|
|
139
|
-
return hasCategories?.length ? true : false;
|
|
140
|
-
}
|
|
141
|
-
coupomUserValidation(coupon, user) {
|
|
142
|
-
if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
|
|
143
|
-
return true;
|
|
144
|
-
const userTypes = [];
|
|
145
|
-
if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) &&
|
|
146
|
-
this.emailIsFromCollaborator(user.email.toLocaleLowerCase()))
|
|
147
|
-
userTypes.push(Exclusivities.COLLABORATORS);
|
|
148
|
-
if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) &&
|
|
149
|
-
coupon.userExclusiveEmail.includes(user.email.toLocaleLowerCase()))
|
|
150
|
-
userTypes.push(Exclusivities.SPECIFIC_USER);
|
|
151
|
-
if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
|
|
152
|
-
user.isSubscriber &&
|
|
153
|
-
user.subscriptionPlan != '')
|
|
154
|
-
userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
|
|
155
|
-
if (user.isSubscriber &&
|
|
156
|
-
user.subscriptionPlan == '' &&
|
|
157
|
-
coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
|
|
158
|
-
userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
|
|
159
|
-
if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
|
|
160
|
-
userTypes.push(Exclusivities.NON_SUBSCRIBER);
|
|
161
|
-
return coupon.exclusivityType.some((r) => userTypes.includes(r));
|
|
162
|
-
}
|
|
163
|
-
async getCouponCategoriesId(productsCategories) {
|
|
164
|
-
const couponCategories = [];
|
|
165
|
-
for (let index = 0; index < productsCategories.length; index++) {
|
|
166
|
-
const category = await this.repositoriesFacade.categoryRepository.get({
|
|
167
|
-
id: productsCategories[index],
|
|
168
|
-
});
|
|
169
|
-
if (category) {
|
|
170
|
-
const children = await this.repositoriesFacade.categoryRepository.getChildren(parseInt(productsCategories[index]));
|
|
171
|
-
couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
return [...new Set(couponCategories)];
|
|
175
|
-
}
|
|
176
|
-
async getLineItensEligebleForDiscount(productsCategories, checkout) {
|
|
177
|
-
let lineItensDiscount = [];
|
|
178
|
-
const couponCategories = await this.getCouponCategoriesId(productsCategories);
|
|
179
|
-
if (productsCategories?.length) {
|
|
180
|
-
lineItensDiscount = checkout.lineItems?.filter((item) => {
|
|
181
|
-
if (item.isGift)
|
|
182
|
-
return false;
|
|
183
|
-
if (item.categories?.length) {
|
|
184
|
-
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
185
|
-
}
|
|
186
|
-
return true;
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
lineItensDiscount = checkout.lineItems.filter((item) => !item.isGift);
|
|
191
|
-
}
|
|
192
|
-
return lineItensDiscount;
|
|
193
|
-
}
|
|
194
|
-
calcCheckoutSubtotal(lineItens, user) {
|
|
195
|
-
return (lineItens
|
|
196
|
-
?.filter((item) => !item.isGift)
|
|
197
|
-
.reduce((acc, curr) => user?.isSubscriber && curr.price?.subscriberPrice
|
|
198
|
-
? acc + curr.price?.subscriberPrice * curr.quantity
|
|
199
|
-
: acc + curr.pricePaid * curr.quantity, 0) || 0);
|
|
200
|
-
}
|
|
201
|
-
async getOrdersWithCoupon(coupon) {
|
|
202
|
-
return await this.repositoriesFacade.orderRepository
|
|
203
|
-
.find({
|
|
204
|
-
filters: {
|
|
205
|
-
coupon: { id: coupon.id },
|
|
206
|
-
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
207
|
-
},
|
|
208
|
-
})
|
|
209
|
-
.then((result) => result.data);
|
|
210
|
-
}
|
|
211
|
-
async getOrdersFromUser(email) {
|
|
212
|
-
return await this.repositoriesFacade.orderRepository
|
|
213
|
-
.find({
|
|
214
|
-
filters: {
|
|
215
|
-
user: { email: { operator: Where.EQUALS, value: email } },
|
|
216
|
-
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
217
|
-
},
|
|
218
|
-
})
|
|
219
|
-
.then((result) => result.data);
|
|
220
|
-
}
|
|
221
|
-
countOrdersWithUser(orders, email) {
|
|
222
|
-
return orders.filter((o) => o.user.email == email).length;
|
|
223
|
-
}
|
|
224
|
-
getCouponUseLimits(coupon, checkoutType, user) {
|
|
225
|
-
let couponUseLimits;
|
|
226
|
-
if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
|
|
227
|
-
if (coupon.exclusivityType.length === 1 &&
|
|
228
|
-
(coupon.exclusivityType.at(0) === Exclusivities.SPECIFIC_USER ||
|
|
229
|
-
coupon.exclusivityType.at(0) === Exclusivities.COLLABORATORS))
|
|
230
|
-
couponUseLimits = coupon.useLimits.non_subscriber;
|
|
231
|
-
else
|
|
232
|
-
couponUseLimits = user?.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
couponUseLimits = coupon.useLimits.subscription;
|
|
236
|
-
}
|
|
237
|
-
return couponUseLimits;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
CouponService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CouponService, deps: [{ token: i1.CouponRepositoriesFacade }, { token: i2.ConfigurationFacade }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
241
|
-
CouponService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CouponService, providedIn: 'root' });
|
|
242
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CouponService, decorators: [{
|
|
243
|
-
type: Injectable,
|
|
244
|
-
args: [{
|
|
245
|
-
providedIn: 'root',
|
|
246
|
-
}]
|
|
247
|
-
}], ctorParameters: function () { return [{ type: i1.CouponRepositoriesFacade }, { type: i2.ConfigurationFacade }]; } });
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxFQUlMLGFBQWEsRUFFYixXQUFXLEVBQ1gsYUFBYSxFQUdiLFdBQVcsRUFDWCxLQUFLLEVBRUwsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFBOzs7O0FBSzlDLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ21CLGtCQUE0QyxFQUM1QyxtQkFBd0M7UUFEeEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEwQjtRQUM1Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBME9uRCw0QkFBdUIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBek9qRyxDQUFDO0lBRUosV0FBVyxDQUFDLE1BQXlCO1FBQ25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFFekQsT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQjthQUNyQyxJQUFJLENBQUM7WUFDSixPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLEVBQUUs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QUFDLGFBQWEsQ0FBQztnQkFFL0QsZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFBOztnQkFDOUMsZUFBZSxHQUFHLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQTtTQUMxRzthQUFNO1lBQ0wsZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFBO1NBQ2hEO1FBRUQsT0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQzs7MEdBL1RVLGFBQWE7OEdBQWIsYUFBYSxjQUZaLE1BQU07MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBDYXRlZ29yeSxcclxuICBDaGVja291dCxcclxuICBDaGVja291dFN1YnNjcmlwdGlvbixcclxuICBDaGVja291dFR5cGVzLFxyXG4gIENvdXBvbixcclxuICBDb3Vwb25UeXBlcyxcclxuICBFeGNsdXNpdml0aWVzLFxyXG4gIExpbmVJdGVtLFxyXG4gIE9yZGVyLFxyXG4gIE9yZGVyU3RhdHVzLFxyXG4gIFNob3BzLFxyXG4gIFVzZXIsXHJcbiAgV2hlcmUsXHJcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuXHJcbmltcG9ydCB7IENvdXBvblJlcG9zaXRvcmllc0ZhY2FkZSB9IGZyb20gJy4vY291cG9uJ1xyXG5pbXBvcnQgeyBDaGVja0NvdXBvblBhcmFtcywgQ291cG9uUnVsZXNWYWxpZGF0aW9uUGFyYW1zIH0gZnJvbSAnLi9jb3Vwb24vdHlwZXMvY291cG9uLXBhcmFtcy50eXBlJ1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRmFjYWRlIH0gZnJvbSAnLi9zaGFyZWQnXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291cG9uU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcG9zaXRvcmllc0ZhY2FkZTogQ291cG9uUmVwb3NpdG9yaWVzRmFjYWRlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWd1cmF0aW9uRmFjYWRlOiBDb25maWd1cmF0aW9uRmFjYWRlLFxyXG4gICkge31cclxuXHJcbiAgY2hlY2tDb3Vwb24ocGFyYW1zOiBDaGVja0NvdXBvblBhcmFtcyk6IE9ic2VydmFibGU8Q291cG9uPiB7XHJcbiAgICBjb25zdCB7IG5pY2tuYW1lLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuIH0gPSBwYXJhbXNcclxuXHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUuY291cG9uUmVwb3NpdG9yeVxyXG4gICAgICAgIC5maW5kKHtcclxuICAgICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgICAgbmlja25hbWU6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IG5pY2tuYW1lIH0sXHJcbiAgICAgICAgICAgIGFjdGl2ZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhWzBdKSxcclxuICAgICkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChjb3Vwb24pID0+IHRoaXMuY291cG9uVmFsaWRhdGlvbihjb3Vwb24sIGNoZWNrb3V0VHlwZSkpLFxyXG4gICAgICBjb25jYXRNYXAoKGNvdXBvblZhbGlkOiBDb3Vwb24pID0+XHJcbiAgICAgICAgdGhpcy5jb3Vwb25SdWxlc1ZhbGlkYXRpb24oeyBjb3Vwb246IGNvdXBvblZhbGlkLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuIH0pLFxyXG4gICAgICApLFxyXG4gICAgICBtYXAoKGNvdXBvblZhbGlkYXRlZDogQ291cG9uKSA9PiBjb3Vwb25WYWxpZGF0ZWQgYXMgQ291cG9uKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY291cG9uVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzKSB7XHJcbiAgICBpZiAoIWNvdXBvbikgdGhyb3cgJ0N1cG9tIGludsOhbGlkby4nXHJcblxyXG4gICAgaWYgKGNvdXBvbj8uYmVnaW5BdCAmJiBjb3Vwb24/LmJlZ2luQXQuZ2V0VGltZSgpID4gbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xyXG5cclxuICAgIGlmIChjb3Vwb24/LmV4cGlyZXNJbiAmJiAoY291cG9uPy5leHBpcmVzSW4gYXMgRGF0ZSkuZ2V0VGltZSgpIDwgbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBleHBpcmFkby4nXHJcblxyXG4gICAgY29uc3QgaXNJblNob3AgPVxyXG4gICAgICBjb3Vwb24uc2hvcEF2YWlsYWJpbGl0eSA9PT0gU2hvcHMuQUxMIHx8IGNvdXBvbi5zaG9wQXZhaWxhYmlsaXR5ID09PSB0aGlzLmNvbmZpZ3VyYXRpb25GYWNhZGUuZGVmYXVsdFNob3BcclxuXHJcbiAgICBpZiAoIWlzSW5TaG9wKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvIHBhcmEgbG9qYS4nXHJcblxyXG4gICAgY29uc3QgaXNDaGVja291dFR5cGUgPSBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBDaGVja291dFR5cGVzLkFMTCB8fCBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBjaGVja291dFR5cGVcclxuXHJcbiAgICBpZiAoIWlzQ2hlY2tvdXRUeXBlKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvLiBFcnJvIGRlIGNoZWNrb3V0LidcclxuXHJcbiAgICByZXR1cm4gY291cG9uXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvdXBvblJ1bGVzVmFsaWRhdGlvbihwYXJhbXM6IENvdXBvblJ1bGVzVmFsaWRhdGlvblBhcmFtcykge1xyXG4gICAgY29uc3QgeyBjb3Vwb24sIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQsIHBsYW4gfSA9IHBhcmFtc1xyXG5cclxuICAgIGlmIChjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5TVUJTQ1JJUFRJT04pIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTdWJzY3JpcHRpb25Db3Vwb24oY291cG9uLCBwbGFuKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlRWNvbW1lcmNlQ291cG9uKGNvdXBvbiwgY2hlY2tvdXRUeXBlLCBjaGVja291dClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVTdWJzY3JpcHRpb25Db3Vwb24oY291cG9uOiBDb3Vwb24sIHBsYW46IHN0cmluZyk6IENvdXBvbiB7XHJcbiAgICBpZiAoY291cG9uLnBsYW4gJiYgY291cG9uLnBsYW4udG9VcHBlckNhc2UoKSAhPT0gcGxhbi50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgIHRocm93ICdDdXBvbSBpbnbDoWxpZG8gcGFyYSBzdWEgYXNzaW5hdHVyYS4nXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvdXBvblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUVjb21tZXJjZUNvdXBvbihcclxuICAgIGNvdXBvbjogQ291cG9uLFxyXG4gICAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLFxyXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxyXG4gICk6IFByb21pc2U8Q291cG9uPiB7XHJcbiAgICB0aGlzLnZhbGlkYXRlVXNlckVsaWdpYmlsaXR5KGNvdXBvbiwgY2hlY2tvdXQ/LnVzZXIpXHJcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlVXNhZ2VMaW1pdHMoY291cG9uLCBjaGVja291dFR5cGUsIGNoZWNrb3V0KVxyXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVByb2R1Y3RFbGlnaWJpbGl0eShjb3Vwb24sIGNoZWNrb3V0KVxyXG5cclxuICAgIHJldHVybiBjb3Vwb25cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVVc2VyRWxpZ2liaWxpdHkoY291cG9uOiBDb3Vwb24sIHVzZXI6IFVzZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbGlkVXNlciA9IHRoaXMuY291cG9tVXNlclZhbGlkYXRpb24oY291cG9uLCB1c2VyKVxyXG5cclxuICAgIGlmICghdmFsaWRVc2VyKSB0aHJvdyAnVXN1w6FyaW8gbsOjbyBlbGVnw612ZWwuJ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVVzYWdlTGltaXRzKFxyXG4gICAgY291cG9uOiBDb3Vwb24sXHJcbiAgICBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsXHJcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb3Vwb25Vc2VMaW1pdHMgPSB0aGlzLmdldENvdXBvblVzZUxpbWl0cyhjb3Vwb24sIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQudXNlcilcclxuXHJcbiAgICBpZiAoY291cG9uVXNlTGltaXRzLmZpcnN0T3JkZXIpIHtcclxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUZpcnN0T3JkZXJMaW1pdChjaGVja291dC51c2VyLmVtYWlsKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghY291cG9uVXNlTGltaXRzLnVubGltaXRlZCB8fCBjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIpIHtcclxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUNvdXBvblVzYWdlTGltaXRzKGNvdXBvbiwgY291cG9uVXNlTGltaXRzLCBjaGVja291dC51c2VyLmVtYWlsKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZpcnN0T3JkZXJMaW1pdCh1c2VyRW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgb3JkZXJzVXNlciA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzRnJvbVVzZXIodXNlckVtYWlsLnRvTG9jYWxlTG93ZXJDYXNlKCkpXHJcblxyXG4gICAgaWYgKG9yZGVyc1VzZXIubGVuZ3RoID49IDEpIHRocm93ICdMaW1pdGUgZGUgdXNvIGF0aW5naWRvJ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUNvdXBvblVzYWdlTGltaXRzKGNvdXBvbjogQ291cG9uLCBjb3Vwb25Vc2VMaW1pdHM6IGFueSwgdXNlckVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG9yZGVyc0NvdXBvbiA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb24pXHJcblxyXG4gICAgaWYgKCFjb3Vwb25Vc2VMaW1pdHMudW5saW1pdGVkICYmIGNvdXBvblVzZUxpbWl0cy50b3RhbCAmJiBvcmRlcnNDb3Vwb24ubGVuZ3RoID49IGNvdXBvblVzZUxpbWl0cy50b3RhbCkge1xyXG4gICAgICB0aHJvdyAnTGltaXRlIGRlIHVzbyBhdGluZ2lkby4nXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvdXBvblVzZUxpbWl0cy5saW1pdGVkUGVyVXNlcikge1xyXG4gICAgICBjb25zdCBvcmRlcnNXaXRoVXNlciA9IHRoaXMuY291bnRPcmRlcnNXaXRoVXNlcihvcmRlcnNDb3Vwb24sIHVzZXJFbWFpbClcclxuXHJcbiAgICAgIGlmIChvcmRlcnNXaXRoVXNlciA+IDApIHRocm93ICdMaW1pdGUgZGUgdXNvIHBvciB1c3XDoXJpbyBhdGluZ2lkby4nXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUHJvZHVjdEVsaWdpYmlsaXR5KGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGhhc1Byb2R1Y3RDYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5oYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb24sIGNoZWNrb3V0KVxyXG5cclxuICAgIGlmICghaGFzUHJvZHVjdENhdGVnb3JpZXMpIHRocm93ICdTZXUgY2FycmluaG8gbsOjbyBwb3NzdWkgcHJvZHV0b3MgZWxlZ8OtdmVpcyBwYXJhIGRlc2NvbnRvLidcclxuXHJcbiAgICBjb25zdCBoYXNNaW5TdWJUb3RhbCA9IGF3YWl0IHRoaXMuaGFzTWluU3ViVG90YWwoY291cG9uLCBjaGVja291dClcclxuXHJcbiAgICBpZiAoIWhhc01pblN1YlRvdGFsKSB7XHJcbiAgICAgIHRoaXMudGhyb3dNaW5TdWJUb3RhbEVycm9yKGNvdXBvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGhyb3dNaW5TdWJUb3RhbEVycm9yKGNvdXBvbjogQ291cG9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IEludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHtcclxuICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXHJcbiAgICAgIGN1cnJlbmN5OiAnQlJMJyxcclxuICAgIH0pLmZvcm1hdChjb3Vwb24ubWluU3ViVG90YWxWYWx1ZSlcclxuXHJcbiAgICBpZiAoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IGBWYWxvciBtw61uaW1vIGRlICR7Zm9ybWF0dGVkVmFsdWV9IG7Do28gYXRpbmdpZG8gbmEocykgY2F0ZWdvcmlhKHMpIGVsZWfDrXZlaXMgcGFyYSBvIGRlc2NvbnRvLmBcclxuICAgIH1cclxuXHJcbiAgICB0aHJvdyBgVmFsb3IgbcOtbmltbyBkZSAke2Zvcm1hdHRlZFZhbHVlfSBuw6NvIGF0aW5naWRvLmBcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYWxjRGlzY291bnRTdWJzY3JpcHRpb24oY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0U3Vic2NyaXB0aW9uPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICBsZXQgZGlzY291bnQgPSAwXHJcblxyXG4gICAgaWYgKGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpcHRpb24udHlwZSA9PSBDb3Vwb25UeXBlcy5BQlNPTFVURSkgZGlzY291bnQgPSBjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnZhbHVlXHJcbiAgICBlbHNlIGRpc2NvdW50ID0gY2hlY2tvdXQuc3Vic2NyaXB0aW9uUGxhbi5yZWN1cnJlbmNlUHJpY2UgKiAoY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi52YWx1ZSAvIDEwMClcclxuXHJcbiAgICByZXR1cm4gb2YoZGlzY291bnQpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhc01pblN1YlRvdGFsKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghY291cG9uLm1pblN1YlRvdGFsVmFsdWUpIHJldHVybiB0cnVlXHJcblxyXG4gICAgY29uc3QgbGluZUl0ZW5zRGlzY291bnQgPSBhd2FpdCB0aGlzLmdldExpbmVJdGVuc0VsaWdlYmxlRm9yRGlzY291bnQoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcywgY2hlY2tvdXQpXHJcbiAgICBjb25zdCBzdWJUb3RhbCA9IHRoaXMuY2FsY0NoZWNrb3V0U3VidG90YWwobGluZUl0ZW5zRGlzY291bnQsIGNoZWNrb3V0LnVzZXIpXHJcblxyXG4gICAgaWYgKGNvdXBvbi5taW5TdWJUb3RhbFZhbHVlIDw9IHN1YlRvdGFsKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBoYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXM/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmdldENvdXBvbkNhdGVnb3JpZXNJZChjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzKVxyXG4gICAgY29uc3QgaGFzQ2F0ZWdvcmllcyA9IGNoZWNrb3V0LmxpbmVJdGVtcz8uZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmlzR2lmdCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICBpZiAoIWl0ZW0uY2F0ZWdvcmllcz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAgICAgcmV0dXJuIGl0ZW0uY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjb3Vwb25DYXRlZ29yaWVzLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gaGFzQ2F0ZWdvcmllcz8ubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvdXBvbVVzZXJWYWxpZGF0aW9uKGNvdXBvbjogQ291cG9uLCB1c2VyOiBVc2VyKSB7XHJcbiAgICBpZiAoIXVzZXIgfHwgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkFMTF9VU0VSUykpIHJldHVybiB0cnVlXHJcblxyXG4gICAgY29uc3QgdXNlclR5cGVzOiBFeGNsdXNpdml0aWVzW10gPSBbXVxyXG5cclxuICAgIGlmIChcclxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpICYmXHJcbiAgICAgIHRoaXMuZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IodXNlci5lbWFpbC50b0xvY2FsZUxvd2VyQ2FzZSgpKVxyXG4gICAgKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUikgJiZcclxuICAgICAgY291cG9uLnVzZXJFeGNsdXNpdmVFbWFpbC5pbmNsdWRlcyh1c2VyLmVtYWlsLnRvTG9jYWxlTG93ZXJDYXNlKCkpXHJcbiAgICApXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUilcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BQ1RJVkVfU1VCU0NSSUJFUikgJiZcclxuICAgICAgdXNlci5pc1N1YnNjcmliZXIgJiZcclxuICAgICAgdXNlci5zdWJzY3JpcHRpb25QbGFuICE9ICcnXHJcbiAgICApXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuQUNUSVZFX1NVQlNDUklCRVIpXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB1c2VyLmlzU3Vic2NyaWJlciAmJlxyXG4gICAgICB1c2VyLnN1YnNjcmlwdGlvblBsYW4gPT0gJycgJiZcclxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLklOQUNUSVZFX1NVQlNDUklCRVIpXHJcbiAgICApXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuSU5BQ1RJVkVfU1VCU0NSSUJFUilcclxuXHJcbiAgICBpZiAoY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLk5PTl9TVUJTQ1JJQkVSKSAmJiAhdXNlci5pc1N1YnNjcmliZXIpXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuTk9OX1NVQlNDUklCRVIpXHJcblxyXG4gICAgcmV0dXJuIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuc29tZSgocikgPT4gdXNlclR5cGVzLmluY2x1ZGVzKHIpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRDb3Vwb25DYXRlZ29yaWVzSWQocHJvZHVjdHNDYXRlZ29yaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8QXJyYXk8U3RyaW5nPj4ge1xyXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllczogQXJyYXk8U3RyaW5nPiA9IFtdXHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnk6IENhdGVnb3J5ICYgeyBmaXJlc3RvcmVJZD86IHN0cmluZyB9ID0gYXdhaXQgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldCh7XHJcbiAgICAgICAgaWQ6IHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0sXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMucmVwb3NpdG9yaWVzRmFjYWRlLmNhdGVnb3J5UmVwb3NpdG9yeS5nZXRDaGlsZHJlbihcclxuICAgICAgICAgIHBhcnNlSW50KHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0pLFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgY291cG9uQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5LmlkLCAuLi5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQudG9TdHJpbmcoKSkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoY291cG9uQ2F0ZWdvcmllcyldXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtYWlsSXNGcm9tQ29sbGFib3JhdG9yID0gKHVzZXJFbWFpbDogc3RyaW5nKTogYm9vbGVhbiA9PiAhIXVzZXJFbWFpbD8ubWF0Y2goL0BiNGEuY29tLmJyL2cpXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0TGluZUl0ZW5zRWxpZ2VibGVGb3JEaXNjb3VudChcclxuICAgIHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10sXHJcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXHJcbiAgKTogUHJvbWlzZTxMaW5lSXRlbVtdPiB7XHJcbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBbXVxyXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllcyA9IGF3YWl0IHRoaXMuZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKHByb2R1Y3RzQ2F0ZWdvcmllcylcclxuXHJcbiAgICBpZiAocHJvZHVjdHNDYXRlZ29yaWVzPy5sZW5ndGgpIHtcclxuICAgICAgbGluZUl0ZW5zRGlzY291bnQgPSBjaGVja291dC5saW5lSXRlbXM/LmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmlzR2lmdCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICAgIGlmIChpdGVtLmNhdGVnb3JpZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuIGl0ZW0uY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjb3Vwb25DYXRlZ29yaWVzLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpbmVJdGVuc0Rpc2NvdW50ID0gY2hlY2tvdXQubGluZUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNHaWZ0KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lSXRlbnNEaXNjb3VudFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnM6IExpbmVJdGVtW10sIHVzZXI6IFVzZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgbGluZUl0ZW5zXHJcbiAgICAgICAgPy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzR2lmdClcclxuICAgICAgICAucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYywgY3VycikgPT5cclxuICAgICAgICAgICAgdXNlcj8uaXNTdWJzY3JpYmVyICYmIGN1cnIucHJpY2U/LnN1YnNjcmliZXJQcmljZVxyXG4gICAgICAgICAgICAgID8gYWNjICsgY3Vyci5wcmljZT8uc3Vic2NyaWJlclByaWNlICogY3Vyci5xdWFudGl0eVxyXG4gICAgICAgICAgICAgIDogYWNjICsgY3Vyci5wcmljZVBhaWQgKiBjdXJyLnF1YW50aXR5LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICApIHx8IDBcclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb246IENvdXBvbik6IFByb21pc2U8T3JkZXJbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVwb3NpdG9yaWVzRmFjYWRlLm9yZGVyUmVwb3NpdG9yeVxyXG4gICAgICAuZmluZCh7XHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgY291cG9uOiB7IGlkOiBjb3Vwb24uaWQgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBvcGVyYXRvcjogV2hlcmUuTk9URVFVQUxTLCB2YWx1ZTogT3JkZXJTdGF0dXMuQ0FOQ0VMQURPIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc0Zyb21Vc2VyKGVtYWlsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5vcmRlclJlcG9zaXRvcnlcclxuICAgICAgLmZpbmQoe1xyXG4gICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgIHVzZXI6IHsgZW1haWw6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IGVtYWlsIH0gfSxcclxuICAgICAgICAgIHN0YXR1czogeyBvcGVyYXRvcjogV2hlcmUuTk9URVFVQUxTLCB2YWx1ZTogT3JkZXJTdGF0dXMuQ0FOQ0VMQURPIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvdW50T3JkZXJzV2l0aFVzZXIob3JkZXJzOiBPcmRlcltdLCBlbWFpbDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBvcmRlcnMuZmlsdGVyKChvKSA9PiBvLnVzZXIuZW1haWwgPT0gZW1haWwpLmxlbmd0aFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb3Vwb25Vc2VMaW1pdHMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcywgdXNlcjogVXNlcikge1xyXG4gICAgbGV0IGNvdXBvblVzZUxpbWl0czogeyB1bmxpbWl0ZWQ/OiBib29sZWFuOyB0b3RhbD86IG51bWJlcjsgbGltaXRlZFBlclVzZXI/OiBib29sZWFuOyBmaXJzdE9yZGVyPzogYm9vbGVhbiB9XHJcblxyXG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkVDT01NRVJDRSB8fCBjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5BTEwpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUubGVuZ3RoID09PSAxICYmXHJcbiAgICAgICAgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuYXQoMCkgPT09IEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUiB8fFxyXG4gICAgICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5hdCgwKSA9PT0gRXhjbHVzaXZpdGllcy5DT0xMQUJPUkFUT1JTKVxyXG4gICAgICApXHJcbiAgICAgICAgY291cG9uVXNlTGltaXRzID0gY291cG9uLnVzZUxpbWl0cy5ub25fc3Vic2NyaWJlclxyXG4gICAgICBlbHNlIGNvdXBvblVzZUxpbWl0cyA9IHVzZXI/LmlzU3Vic2NyaWJlciA/IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaWJlciA6IGNvdXBvbi51c2VMaW1pdHMubm9uX3N1YnNjcmliZXJcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvdXBvblVzZUxpbWl0cyA9IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaXB0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvdXBvblVzZUxpbWl0c1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { OrderFirestoreRepository, OrderStatus, ProductReview, Where, } from '@infrab4a/connect';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@infrab4a/connect";
|
|
5
|
-
export class OrderProductReviewService {
|
|
6
|
-
constructor(orderRepository, productReviewRepository, variantRepository) {
|
|
7
|
-
this.orderRepository = orderRepository;
|
|
8
|
-
this.productReviewRepository = productReviewRepository;
|
|
9
|
-
this.variantRepository = variantRepository;
|
|
10
|
-
}
|
|
11
|
-
async getPendingReviewsByEmail(email) {
|
|
12
|
-
const products = [];
|
|
13
|
-
const orders = await this.getOrdersByEmail(email);
|
|
14
|
-
if (orders.length) {
|
|
15
|
-
for (const order of orders) {
|
|
16
|
-
const lineItems = order.lineItems.filter((item) => !item.isGift);
|
|
17
|
-
for (const item of lineItems) {
|
|
18
|
-
const productReview = await this.getProductReview(order, item);
|
|
19
|
-
if (productReview?.status != null)
|
|
20
|
-
continue;
|
|
21
|
-
products.push(this.buildProductReview(order, item, productReview));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return products;
|
|
26
|
-
}
|
|
27
|
-
async getOrdersByEmail(email) {
|
|
28
|
-
const { data: orders } = await this.orderRepository.find({
|
|
29
|
-
filters: {
|
|
30
|
-
user: {
|
|
31
|
-
email: email,
|
|
32
|
-
},
|
|
33
|
-
status: OrderStatus.ENTREGUE,
|
|
34
|
-
createdAt: {
|
|
35
|
-
operator: Where.GTE,
|
|
36
|
-
value: new Date(2024, 0, 0, 0, 0, 0).getTime(),
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
orderBy: {
|
|
40
|
-
createdAt: 'desc',
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
return orders;
|
|
44
|
-
}
|
|
45
|
-
async getProductReview(order, item) {
|
|
46
|
-
const products = [item.id];
|
|
47
|
-
const isVariant = await this.variantRepository
|
|
48
|
-
.find({
|
|
49
|
-
filters: {
|
|
50
|
-
id: item.id,
|
|
51
|
-
},
|
|
52
|
-
})
|
|
53
|
-
.then((res) => res.data.at(0));
|
|
54
|
-
if (isVariant)
|
|
55
|
-
products.push(isVariant.productId);
|
|
56
|
-
const productReview = await this.productReviewRepository
|
|
57
|
-
.find({
|
|
58
|
-
filters: {
|
|
59
|
-
orderId: { operator: Where.IN, value: [order.id, order.orderNumber].filter(Boolean) },
|
|
60
|
-
productId: { operator: Where.IN, value: products },
|
|
61
|
-
},
|
|
62
|
-
})
|
|
63
|
-
.then((res) => res.data.at(0));
|
|
64
|
-
return productReview;
|
|
65
|
-
}
|
|
66
|
-
buildProductReview(order, item, review) {
|
|
67
|
-
return {
|
|
68
|
-
id: item.id,
|
|
69
|
-
orderId: order.id,
|
|
70
|
-
orderNumber: order.orderNumber,
|
|
71
|
-
isEdition: false,
|
|
72
|
-
name: item.name,
|
|
73
|
-
image: item.image,
|
|
74
|
-
deliveryDate: order.deliveredAt || null,
|
|
75
|
-
evaluationInAnalysis: review ? true : false,
|
|
76
|
-
rating: review ? review.rate : null,
|
|
77
|
-
shopProductSlug: item.slug,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
async createReview(review) {
|
|
81
|
-
return this.productReviewRepository.create(ProductReview.toInstance({
|
|
82
|
-
productId: review.productId.toString(),
|
|
83
|
-
shop: review.shop,
|
|
84
|
-
rate: review.rate,
|
|
85
|
-
author: review.author,
|
|
86
|
-
email: review.email,
|
|
87
|
-
location: review.location,
|
|
88
|
-
review: review.comment,
|
|
89
|
-
title: review.title,
|
|
90
|
-
personId: review.personId,
|
|
91
|
-
points: review.points,
|
|
92
|
-
orderId: review.orderId,
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
OrderProductReviewService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: OrderProductReviewService, deps: [{ token: 'OrderRepository' }, { token: 'ProductReviewRepository' }, { token: 'VariantRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
97
|
-
OrderProductReviewService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: OrderProductReviewService });
|
|
98
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: OrderProductReviewService, decorators: [{
|
|
99
|
-
type: Injectable
|
|
100
|
-
}], ctorParameters: function () { return [{ type: i1.OrderFirestoreRepository, decorators: [{
|
|
101
|
-
type: Inject,
|
|
102
|
-
args: ['OrderRepository']
|
|
103
|
-
}] }, { type: undefined, decorators: [{
|
|
104
|
-
type: Inject,
|
|
105
|
-
args: ['ProductReviewRepository']
|
|
106
|
-
}] }, { type: undefined, decorators: [{
|
|
107
|
-
type: Inject,
|
|
108
|
-
args: ['VariantRepository']
|
|
109
|
-
}] }]; } });
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcHJvZHVjdC1yZXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvb3JkZXItcHJvZHVjdC1yZXZpZXcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBR0wsd0JBQXdCLEVBQ3hCLFdBQVcsRUFDWCxhQUFhLEVBR2IsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7OztBQUsxQixNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLFlBQzhDLGVBQXlDLEVBQ2pDLHVCQUFnRCxFQUN0RCxpQkFBb0M7UUFGdEMsb0JBQWUsR0FBZixlQUFlLENBQTBCO1FBQ2pDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDdEQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtJQUNqRixDQUFDO0lBRUosS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQWE7UUFDMUMsTUFBTSxRQUFRLEdBQTJCLEVBQUUsQ0FBQTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVqRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQzFCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFFaEUsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLEVBQUU7b0JBQzVCLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtv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QyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQzNCLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUEyQjtRQUM1QyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQ3hDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDdkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1lBQ3RDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztTQUN4QixDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7O3NIQXRHVSx5QkFBeUIsa0JBRTFCLGlCQUFpQixhQUNqQix5QkFBeUIsYUFDekIsbUJBQW1COzBIQUpsQix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVTs7MEJBR04sTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQ2hDLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBMaW5lSXRlbSxcclxuICBPcmRlcixcclxuICBPcmRlckZpcmVzdG9yZVJlcG9zaXRvcnksXHJcbiAgT3JkZXJTdGF0dXMsXHJcbiAgUHJvZHVjdFJldmlldyxcclxuICBQcm9kdWN0UmV2aWV3UmVwb3NpdG9yeSxcclxuICBWYXJpYW50UmVwb3NpdG9yeSxcclxuICBXaGVyZSxcclxufSBmcm9tICdAaW5mcmFiNGEvY29ubmVjdCdcclxuXHJcbmltcG9ydCB7IFBlbmRpbmdQcm9kdWN0UmV2aWV3LCBQcm9kdWN0UmV2aWV3Q3JlYXRlIH0gZnJvbSAnLi90eXBlcydcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE9yZGVyUHJvZHVjdFJldmlld1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnT3JkZXJSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBvcmRlclJlcG9zaXRvcnk6IE9yZGVyRmlyZXN0b3JlUmVwb3NpdG9yeSxcclxuICAgIEBJbmplY3QoJ1Byb2R1Y3RSZXZpZXdSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0UmV2aWV3UmVwb3NpdG9yeTogUHJvZHVjdFJldmlld1JlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KCdWYXJpYW50UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgdmFyaWFudFJlcG9zaXRvcnk6IFZhcmlhbnRSZXBvc2l0b3J5LFxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgZ2V0UGVuZGluZ1Jldmlld3NCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdQcm9kdWN0UmV2aWV3W10+IHtcclxuICAgIGNvbnN0IHByb2R1Y3RzOiBQZW5kaW5nUHJvZHVjdFJldmlld1tdID0gW11cclxuICAgIGNvbnN0IG9yZGVycyA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzQnlFbWFpbChlbWFpbClcclxuXHJcbiAgICBpZiAob3JkZXJzLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGNvbnN0IG9yZGVyIG9mIG9yZGVycykge1xyXG4gICAgICAgIGNvbnN0IGxpbmVJdGVtcyA9IG9yZGVyLmxpbmVJdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzR2lmdClcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpbmVJdGVtcykge1xyXG4gICAgICAgICAgY29uc3QgcHJvZHVjdFJldmlldyA9IGF3YWl0IHRoaXMuZ2V0UHJvZHVjdFJldmlldyhvcmRlciwgaXRlbSlcclxuXHJcbiAgICAgICAgICBpZiAocHJvZHVjdFJldmlldz8uc3RhdHVzICE9IG51bGwpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgcHJvZHVjdHMucHVzaCh0aGlzLmJ1aWxkUHJvZHVjdFJldmlldyhvcmRlciwgaXRlbSwgcHJvZHVjdFJldmlldykpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3RzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc0J5RW1haWwoZW1haWw6IHN0cmluZyk6IFByb21pc2U8T3JkZXJbXT4ge1xyXG4gICAgY29uc3QgeyBkYXRhOiBvcmRlcnMgfSA9IGF3YWl0IHRoaXMub3JkZXJSZXBvc2l0b3J5LmZpbmQoe1xyXG4gICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgdXNlcjoge1xyXG4gICAgICAgICAgZW1haWw6IGVtYWlsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3RhdHVzOiBPcmRlclN0YXR1cy5FTlRSRUdVRSxcclxuICAgICAgICBjcmVhdGVkQXQ6IHtcclxuICAgICAgICAgIG9wZXJhdG9yOiBXaGVyZS5HVEUsXHJcbiAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAyNCwgMCwgMCwgMCwgMCwgMCkuZ2V0VGltZSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIG9yZGVyQnk6IHtcclxuICAgICAgICBjcmVhdGVkQXQ6ICdkZXNjJyxcclxuICAgICAgfSxcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIG9yZGVyc1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRQcm9kdWN0UmV2aWV3KG9yZGVyOiBPcmRlciwgaXRlbTogTGluZUl0ZW0pIHtcclxuICAgIGNvbnN0IHByb2R1Y3RzOiBzdHJpbmdbXSA9IFtpdGVtLmlkXVxyXG4gICAgY29uc3QgaXNWYXJpYW50ID0gYXdhaXQgdGhpcy52YXJpYW50UmVwb3NpdG9yeVxyXG4gICAgICAuZmluZCh7XHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgaWQ6IGl0ZW0uaWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEuYXQoMCkpXHJcblxyXG4gICAgaWYgKGlzVmFyaWFudCkgcHJvZHVjdHMucHVzaChpc1ZhcmlhbnQucHJvZHVjdElkKVxyXG4gICAgY29uc3QgcHJvZHVjdFJldmlldyA9IGF3YWl0IHRoaXMucHJvZHVjdFJldmlld1JlcG9zaXRvcnlcclxuICAgICAgLmZpbmQoe1xyXG4gICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgIG9yZGVySWQ6IHsgb3BlcmF0b3I6IFdoZXJlLklOLCB2YWx1ZTogW29yZGVyLmlkLCBvcmRlci5vcmRlck51bWJlcl0uZmlsdGVyKEJvb2xlYW4pIH0sXHJcbiAgICAgICAgICBwcm9kdWN0SWQ6IHsgb3BlcmF0b3I6IFdoZXJlLklOLCB2YWx1ZTogcHJvZHVjdHMgfSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YS5hdCgwKSlcclxuXHJcbiAgICByZXR1cm4gcHJvZHVjdFJldmlld1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFByb2R1Y3RSZXZpZXcob3JkZXI6IE9yZGVyLCBpdGVtOiBMaW5lSXRlbSwgcmV2aWV3OiBQcm9kdWN0UmV2aWV3KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogaXRlbS5pZCxcclxuICAgICAgb3JkZXJJZDogb3JkZXIuaWQsXHJcbiAgICAgIG9yZGVyTnVtYmVyOiBvcmRlci5vcmRlck51bWJlcixcclxuICAgICAgaXNFZGl0aW9uOiBmYWxzZSxcclxuICAgICAgbmFtZTogaXRlbS5uYW1lLFxyXG4gICAgICBpbWFnZTogaXRlbS5pbWFnZSxcclxuICAgICAgZGVsaXZlcnlEYXRlOiBvcmRlci5kZWxpdmVyZWRBdCB8fCBudWxsLFxyXG4gICAgICBldmFsdWF0aW9uSW5BbmFseXNpczogcmV2aWV3ID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICByYXRpbmc6IHJldmlldyA/IHJldmlldy5yYXRlIDogbnVsbCxcclxuICAgICAgc2hvcFByb2R1Y3RTbHVnOiBpdGVtLnNsdWcsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVSZXZpZXcocmV2aWV3OiBQcm9kdWN0UmV2aWV3Q3JlYXRlKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0UmV2aWV3UmVwb3NpdG9yeS5jcmVhdGUoXHJcbiAgICAgIFByb2R1Y3RSZXZpZXcudG9JbnN0YW5jZSh7XHJcbiAgICAgICAgcHJvZHVjdElkOiByZXZpZXcucHJvZHVjdElkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgc2hvcDogcmV2aWV3LnNob3AsXHJcbiAgICAgICAgcmF0ZTogcmV2aWV3LnJhdGUsXHJcbiAgICAgICAgYXV0aG9yOiByZXZpZXcuYXV0aG9yLFxyXG4gICAgICAgIGVtYWlsOiByZXZpZXcuZW1haWwsXHJcbiAgICAgICAgbG9jYXRpb246IHJldmlldy5sb2NhdGlvbixcclxuICAgICAgICByZXZpZXc6IHJldmlldy5jb21tZW50LFxyXG4gICAgICAgIHRpdGxlOiByZXZpZXcudGl0bGUsXHJcbiAgICAgICAgcGVyc29uSWQ6IHJldmlldy5wZXJzb25JZCxcclxuICAgICAgICBwb2ludHM6IHJldmlldy5wb2ludHMsXHJcbiAgICAgICAgb3JkZXJJZDogcmV2aWV3Lm9yZGVySWQsXHJcbiAgICAgIH0pLFxyXG4gICAgKVxyXG4gIH1cclxufVxyXG4iXX0=
|