@infrab4a/connect-angular 0.14.2-beta.11 → 0.14.2-beta.2

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 (51) hide show
  1. package/angular-connect.module.d.ts +15 -15
  2. package/angular-elastic-search.module.d.ts +9 -9
  3. package/angular-firebase-auth.module.d.ts +10 -10
  4. package/angular-firestore.module.d.ts +15 -15
  5. package/bundles/infrab4a-connect-angular.umd.js +1415 -1420
  6. package/bundles/infrab4a-connect-angular.umd.js.map +1 -1
  7. package/consts/default-shop.const.d.ts +1 -1
  8. package/consts/es-config.const.d.ts +1 -1
  9. package/consts/index.d.ts +2 -2
  10. package/esm2015/angular-connect.module.js +47 -47
  11. package/esm2015/angular-elastic-search.module.js +38 -38
  12. package/esm2015/angular-firebase-auth.module.js +113 -113
  13. package/esm2015/angular-firestore.module.js +340 -340
  14. package/esm2015/consts/default-shop.const.js +2 -2
  15. package/esm2015/consts/es-config.const.js +2 -2
  16. package/esm2015/consts/index.js +3 -3
  17. package/esm2015/index.js +5 -5
  18. package/esm2015/infrab4a-connect-angular.js +4 -4
  19. package/esm2015/services/auth.service.js +42 -42
  20. package/esm2015/services/cart.service.js +150 -169
  21. package/esm2015/services/checkout-subscription.service.js +44 -68
  22. package/esm2015/services/checkout.service.js +87 -79
  23. package/esm2015/services/coupon.service.js +98 -70
  24. package/esm2015/services/errors/group-invalid-coupon.error.js +7 -7
  25. package/esm2015/services/errors/index.js +3 -3
  26. package/esm2015/services/errors/invalid-coupon.error.js +7 -7
  27. package/esm2015/services/home-shop.service.js +108 -108
  28. package/esm2015/services/index.js +8 -8
  29. package/esm2015/services/order.service.js +32 -32
  30. package/esm2015/services/types/index.js +3 -3
  31. package/esm2015/services/types/required-checkout-data.type.js +2 -2
  32. package/esm2015/services/types/required-checkout-subscription-data.type.js +2 -2
  33. package/fesm2015/infrab4a-connect-angular.js +1007 -1013
  34. package/fesm2015/infrab4a-connect-angular.js.map +1 -1
  35. package/index.d.ts +4 -4
  36. package/infrab4a-connect-angular.d.ts +5 -5
  37. package/package.json +3 -3
  38. package/services/auth.service.d.ts +19 -19
  39. package/services/cart.service.d.ts +35 -41
  40. package/services/checkout-subscription.service.d.ts +16 -18
  41. package/services/checkout.service.d.ts +22 -22
  42. package/services/coupon.service.d.ts +17 -14
  43. package/services/errors/group-invalid-coupon.error.d.ts +5 -5
  44. package/services/errors/index.d.ts +2 -2
  45. package/services/errors/invalid-coupon.error.d.ts +4 -4
  46. package/services/home-shop.service.d.ts +24 -24
  47. package/services/index.d.ts +7 -7
  48. package/services/order.service.d.ts +13 -13
  49. package/services/types/index.d.ts +2 -2
  50. package/services/types/required-checkout-data.type.d.ts +2 -2
  51. package/services/types/required-checkout-subscription-data.type.d.ts +2 -2
@@ -1,2 +1,2 @@
1
- export const DEFAULT_SHOP = 'DEFAULT_SHOP';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zaG9wLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9jb25zdHMvZGVmYXVsdC1zaG9wLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgREVGQVVMVF9TSE9QID0gJ0RFRkFVTFRfU0hPUCdcclxuIl19
1
+ export const DEFAULT_SHOP = 'DEFAULT_SHOP';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zaG9wLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9jb25zdHMvZGVmYXVsdC1zaG9wLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgREVGQVVMVF9TSE9QID0gJ0RFRkFVTFRfU0hPUCdcbiJdfQ==
@@ -1,2 +1,2 @@
1
- export const ES_CONFIG = 'ES_CONFIG';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXMtY29uZmlnLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9jb25zdHMvZXMtY29uZmlnLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgRVNfQ09ORklHID0gJ0VTX0NPTkZJRydcclxuIl19
1
+ export const ES_CONFIG = 'ES_CONFIG';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXMtY29uZmlnLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9jb25zdHMvZXMtY29uZmlnLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgRVNfQ09ORklHID0gJ0VTX0NPTkZJRydcbiJdfQ==
@@ -1,3 +1,3 @@
1
- export * from './default-shop.const';
2
- export * from './es-config.const';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL2NvbnN0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtc2hvcC5jb25zdCdcclxuZXhwb3J0ICogZnJvbSAnLi9lcy1jb25maWcuY29uc3QnXHJcbiJdfQ==
1
+ export * from './default-shop.const';
2
+ export * from './es-config.const';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL2NvbnN0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtc2hvcC5jb25zdCdcbmV4cG9ydCAqIGZyb20gJy4vZXMtY29uZmlnLmNvbnN0J1xuIl19
package/esm2015/index.js CHANGED
@@ -1,5 +1,5 @@
1
- export * from './services';
2
- export * from './angular-firebase-auth.module';
3
- export * from './angular-firestore.module';
4
- export * from './angular-connect.module';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFBO0FBQzFCLGNBQWMsZ0NBQWdDLENBQUE7QUFDOUMsY0FBYyw0QkFBNEIsQ0FBQTtBQUMxQyxjQUFjLDBCQUEwQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcydcclxuZXhwb3J0ICogZnJvbSAnLi9hbmd1bGFyLWZpcmViYXNlLWF1dGgubW9kdWxlJ1xyXG5leHBvcnQgKiBmcm9tICcuL2FuZ3VsYXItZmlyZXN0b3JlLm1vZHVsZSdcclxuZXhwb3J0ICogZnJvbSAnLi9hbmd1bGFyLWNvbm5lY3QubW9kdWxlJ1xyXG4iXX0=
1
+ export * from './services';
2
+ export * from './angular-firebase-auth.module';
3
+ export * from './angular-firestore.module';
4
+ export * from './angular-connect.module';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFBO0FBQzFCLGNBQWMsZ0NBQWdDLENBQUE7QUFDOUMsY0FBYyw0QkFBNEIsQ0FBQTtBQUMxQyxjQUFjLDBCQUEwQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcydcbmV4cG9ydCAqIGZyb20gJy4vYW5ndWxhci1maXJlYmFzZS1hdXRoLm1vZHVsZSdcbmV4cG9ydCAqIGZyb20gJy4vYW5ndWxhci1maXJlc3RvcmUubW9kdWxlJ1xuZXhwb3J0ICogZnJvbSAnLi9hbmd1bGFyLWNvbm5lY3QubW9kdWxlJ1xuIl19
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
5
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mcmFiNGEtY29ubmVjdC1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9pbmZyYWI0YS1jb25uZWN0LWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -1,42 +1,42 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { AngularFireAuth } from '@angular/fire/auth';
3
- import { combineLatest, of } from 'rxjs';
4
- import { catchError, map, mergeMap } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/fire/auth";
7
- export class AuthService {
8
- constructor(angularFireAuth, userRepository) {
9
- this.angularFireAuth = angularFireAuth;
10
- this.userRepository = userRepository;
11
- }
12
- getAuthstate() {
13
- const observables = [
14
- this.angularFireAuth.authState.pipe(catchError(() => of(null))),
15
- this.getUser().pipe(catchError(() => of(null))),
16
- ];
17
- return combineLatest(observables).pipe(map(([fireUser, user]) => {
18
- return {
19
- user,
20
- isAnonymous: fireUser === null || fireUser === void 0 ? void 0 : fireUser.isAnonymous,
21
- };
22
- }));
23
- }
24
- getUser() {
25
- return this.getFireUser().pipe(map((user) => user === null || user === void 0 ? void 0 : user.uid), mergeMap((id) => (id ? this.userRepository.get({ id }) : of(null))));
26
- }
27
- getTokenId() {
28
- return this.angularFireAuth.idToken;
29
- }
30
- getFireUser() {
31
- return this.angularFireAuth.user.pipe(catchError(() => of(null)));
32
- }
33
- }
34
- AuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: AuthService, deps: [{ token: i1.AngularFireAuth }, { token: 'UserRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
35
- AuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: AuthService });
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: AuthService, decorators: [{
37
- type: Injectable
38
- }], ctorParameters: function () { return [{ type: i1.AngularFireAuth }, { type: undefined, decorators: [{
39
- type: Inject,
40
- args: ['UserRepository']
41
- }] }]; } });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBOzs7QUFJMUQsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFDbUIsZUFBZ0MsRUFDTixjQUE4QjtRQUR4RCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDTixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDeEUsQ0FBQztJQUVKLFlBQVk7UUFDVixNQUFNLFdBQVcsR0FBa0Q7WUFDakUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNoRCxDQUFBO1FBRUQsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixXQUFXLEVBQUUsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLFdBQVc7YUFDSyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FDNUIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsR0FBRyxDQUFDLEVBQ3hCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDcEUsQ0FBQTtJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQTtJQUNyQyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25FLENBQUM7O3lHQW5DVSxXQUFXLGlEQUdaLGdCQUFnQjs2R0FIZixXQUFXOzRGQUFYLFdBQVc7a0JBRHZCLFVBQVU7OzBCQUlOLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgQW5ndWxhckZpcmVBdXRoIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJ1xyXG5pbXBvcnQgeyBVc2VyLCBVc2VyUmVwb3NpdG9yeSB9IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IGZpcmViYXNlIGZyb20gJ2ZpcmViYXNlL2FwcCdcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhckZpcmVBdXRoOiBBbmd1bGFyRmlyZUF1dGgsXHJcbiAgICBASW5qZWN0KCdVc2VyUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgdXNlclJlcG9zaXRvcnk6IFVzZXJSZXBvc2l0b3J5LFxyXG4gICkge31cclxuXHJcbiAgZ2V0QXV0aHN0YXRlKCk6IE9ic2VydmFibGU8eyB1c2VyOiBVc2VyOyBpc0Fub255bW91czogYm9vbGVhbiB9PiB7XHJcbiAgICBjb25zdCBvYnNlcnZhYmxlczogW09ic2VydmFibGU8ZmlyZWJhc2UuVXNlcj4sIE9ic2VydmFibGU8VXNlcj5dID0gW1xyXG4gICAgICB0aGlzLmFuZ3VsYXJGaXJlQXV0aC5hdXRoU3RhdGUucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSksXHJcbiAgICAgIHRoaXMuZ2V0VXNlcigpLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpLFxyXG4gICAgXVxyXG5cclxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KG9ic2VydmFibGVzKS5waXBlKFxyXG4gICAgICBtYXAoKFtmaXJlVXNlciwgdXNlcl0pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdXNlcixcclxuICAgICAgICAgIGlzQW5vbnltb3VzOiBmaXJlVXNlcj8uaXNBbm9ueW1vdXMsXHJcbiAgICAgICAgfSBhcyB7IHVzZXI6IFVzZXI7IGlzQW5vbnltb3VzOiBib29sZWFuIH1cclxuICAgICAgfSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBnZXRVc2VyKCk6IE9ic2VydmFibGU8VXNlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlyZVVzZXIoKS5waXBlKFxyXG4gICAgICBtYXAoKHVzZXIpID0+IHVzZXI/LnVpZCksXHJcbiAgICAgIG1lcmdlTWFwKChpZCkgPT4gKGlkID8gdGhpcy51c2VyUmVwb3NpdG9yeS5nZXQoeyBpZCB9KSA6IG9mKG51bGwpKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbklkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbmd1bGFyRmlyZUF1dGguaWRUb2tlblxyXG4gIH1cclxuXHJcbiAgZ2V0RmlyZVVzZXIoKTogT2JzZXJ2YWJsZTxmaXJlYmFzZS5Vc2VyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbmd1bGFyRmlyZUF1dGgudXNlci5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { AngularFireAuth } from '@angular/fire/auth';
3
+ import { combineLatest, of } from 'rxjs';
4
+ import { catchError, map, mergeMap } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/fire/auth";
7
+ export class AuthService {
8
+ constructor(angularFireAuth, userRepository) {
9
+ this.angularFireAuth = angularFireAuth;
10
+ this.userRepository = userRepository;
11
+ }
12
+ getAuthstate() {
13
+ const observables = [
14
+ this.angularFireAuth.authState.pipe(catchError(() => of(null))),
15
+ this.getUser().pipe(catchError(() => of(null))),
16
+ ];
17
+ return combineLatest(observables).pipe(map(([fireUser, user]) => {
18
+ return {
19
+ user,
20
+ isAnonymous: fireUser === null || fireUser === void 0 ? void 0 : fireUser.isAnonymous,
21
+ };
22
+ }));
23
+ }
24
+ getUser() {
25
+ return this.getFireUser().pipe(map((user) => user === null || user === void 0 ? void 0 : user.uid), mergeMap((id) => (id ? this.userRepository.get({ id }) : of(null))));
26
+ }
27
+ getTokenId() {
28
+ return this.angularFireAuth.idToken;
29
+ }
30
+ getFireUser() {
31
+ return this.angularFireAuth.user.pipe(catchError(() => of(null)));
32
+ }
33
+ }
34
+ AuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: AuthService, deps: [{ token: i1.AngularFireAuth }, { token: 'UserRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
35
+ AuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: AuthService });
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: AuthService, decorators: [{
37
+ type: Injectable
38
+ }], ctorParameters: function () { return [{ type: i1.AngularFireAuth }, { type: undefined, decorators: [{
39
+ type: Inject,
40
+ args: ['UserRepository']
41
+ }] }]; } });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBOzs7QUFJMUQsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFDbUIsZUFBZ0MsRUFDTixjQUE4QjtRQUR4RCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDTixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDeEUsQ0FBQztJQUVKLFlBQVk7UUFDVixNQUFNLFdBQVcsR0FBa0Q7WUFDakUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNoRCxDQUFBO1FBRUQsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixXQUFXLEVBQUUsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLFdBQVc7YUFDSyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FDNUIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsR0FBRyxDQUFDLEVBQ3hCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDcEUsQ0FBQTtJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQTtJQUNyQyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25FLENBQUM7O3lHQW5DVSxXQUFXLGlEQUdaLGdCQUFnQjs2R0FIZixXQUFXOzRGQUFYLFdBQVc7a0JBRHZCLFVBQVU7OzBCQUlOLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFuZ3VsYXJGaXJlQXV0aCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvYXV0aCdcbmltcG9ydCB7IFVzZXIsIFVzZXJSZXBvc2l0b3J5IH0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIG1lcmdlTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvYXBwJ1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFuZ3VsYXJGaXJlQXV0aDogQW5ndWxhckZpcmVBdXRoLFxuICAgIEBJbmplY3QoJ1VzZXJSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSB1c2VyUmVwb3NpdG9yeTogVXNlclJlcG9zaXRvcnksXG4gICkge31cblxuICBnZXRBdXRoc3RhdGUoKTogT2JzZXJ2YWJsZTx7IHVzZXI6IFVzZXI7IGlzQW5vbnltb3VzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBvYnNlcnZhYmxlczogW09ic2VydmFibGU8ZmlyZWJhc2UuVXNlcj4sIE9ic2VydmFibGU8VXNlcj5dID0gW1xuICAgICAgdGhpcy5hbmd1bGFyRmlyZUF1dGguYXV0aFN0YXRlLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpLFxuICAgICAgdGhpcy5nZXRVc2VyKCkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSksXG4gICAgXVxuXG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qob2JzZXJ2YWJsZXMpLnBpcGUoXG4gICAgICBtYXAoKFtmaXJlVXNlciwgdXNlcl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VyLFxuICAgICAgICAgIGlzQW5vbnltb3VzOiBmaXJlVXNlcj8uaXNBbm9ueW1vdXMsXG4gICAgICAgIH0gYXMgeyB1c2VyOiBVc2VyOyBpc0Fub255bW91czogYm9vbGVhbiB9XG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBnZXRVc2VyKCk6IE9ic2VydmFibGU8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLmdldEZpcmVVc2VyKCkucGlwZShcbiAgICAgIG1hcCgodXNlcikgPT4gdXNlcj8udWlkKSxcbiAgICAgIG1lcmdlTWFwKChpZCkgPT4gKGlkID8gdGhpcy51c2VyUmVwb3NpdG9yeS5nZXQoeyBpZCB9KSA6IG9mKG51bGwpKSksXG4gICAgKVxuICB9XG5cbiAgZ2V0VG9rZW5JZCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmFuZ3VsYXJGaXJlQXV0aC5pZFRva2VuXG4gIH1cblxuICBnZXRGaXJlVXNlcigpOiBPYnNlcnZhYmxlPGZpcmViYXNlLlVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy5hbmd1bGFyRmlyZUF1dGgudXNlci5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICB9XG59XG4iXX0=
@@ -1,169 +1,150 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { Checkout, CouponSubtypes, CouponTypes, FinancialCoupon, isNil, LineItem, Shops, } from '@infrab4a/connect';
3
- import { iif, of, Subject } from 'rxjs';
4
- import { catchError, concatMap, map, tap } from 'rxjs/operators';
5
- import { DEFAULT_SHOP } from '../consts';
6
- import { AuthService } from './auth.service';
7
- import { CheckoutService } from './checkout.service';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./auth.service";
10
- import * as i2 from "./checkout.service";
11
- import * as i3 from "@infrab4a/connect";
12
- export class CartService {
13
- constructor(authService, checkoutService, defaultShop) {
14
- this.authService = authService;
15
- this.checkoutService = checkoutService;
16
- this.defaultShop = defaultShop;
17
- this.cartSubject = new Subject();
18
- this.updateLineItemInCart = (lineItem, quantity, checkout) => (isNil(checkout) ? this.checkoutService.getCheckout() : of(checkout)).pipe(concatMap((checkoutLoaded) => {
19
- var _a;
20
- const items = [];
21
- const index = (_a = checkoutLoaded.lineItems) === null || _a === void 0 ? void 0 : _a.map((checkoutItem) => checkoutItem.sku).indexOf(lineItem.sku);
22
- if (index > -1) {
23
- checkoutLoaded.lineItems[index].quantity += quantity;
24
- checkoutLoaded.lineItems[index].pricePaid = lineItem.pricePaid;
25
- }
26
- else
27
- checkoutLoaded.lineItems = items.concat(checkoutLoaded.lineItems ? checkoutLoaded.lineItems.concat([lineItem]) : [lineItem]);
28
- return this.checkoutService
29
- .updateCheckoutLineItems(checkoutLoaded)
30
- .pipe(map((updatedCheckout) => this.generateCartObject(updatedCheckout.lineItems)));
31
- }));
32
- this.generateCartObject = (items) => {
33
- const cart = {};
34
- items === null || items === void 0 ? void 0 : items.forEach((item) => {
35
- var _a;
36
- return (cart[item.sku] = LineItem.toInstance(Object.assign(Object.assign({}, (cart[item.sku] || item)), { quantity: (((_a = cart[item.sku]) === null || _a === void 0 ? void 0 : _a.quantity) || 0) + (item.quantity ? item.quantity : 1) })));
37
- });
38
- return cart;
39
- };
40
- this.buildLineItem = ({ checkout, item, quantity, }) => {
41
- var _a, _b, _c, _d, _e;
42
- item.quantity = (item === null || item === void 0 ? void 0 : item.quantity) || ((_b = (_a = checkout === null || checkout === void 0 ? void 0 : checkout.lineItems) === null || _a === void 0 ? void 0 : _a.find((lineItem) => lineItem.sku === item.sku)) === null || _b === void 0 ? void 0 : _b.quantity) || 0;
43
- if (this.checkMaxStock(item, quantity || 0))
44
- throw new Error('Desculpe! Temos apenas ' + ((_c = item.stock) === null || _c === void 0 ? void 0 : _c.quantity) + ' em estoque.');
45
- const image = item.image || ((_d = item.images) === null || _d === void 0 ? void 0 : _d.shift());
46
- const { id, name, brand, slug, stock, price, weight, categories, sku } = item;
47
- const isGift = item.isGift || null;
48
- const pricePaid = this.getProductPrice({
49
- product: item,
50
- shop: checkout.shop || this.defaultShop,
51
- isSubscriber: (_e = checkout.user) === null || _e === void 0 ? void 0 : _e.isSubscriber,
52
- });
53
- const EAN = item.EAN;
54
- console.log('set EAN', EAN);
55
- return LineItem.toInstance({
56
- id,
57
- EAN,
58
- name,
59
- brand,
60
- slug,
61
- sku,
62
- stock,
63
- price,
64
- image,
65
- weight,
66
- quantity: (item.quantity || 0) + (quantity || 0),
67
- pricePaid,
68
- categories,
69
- isGift,
70
- costPrice: item === null || item === void 0 ? void 0 : item.costPrice,
71
- });
72
- };
73
- this.getProductPrice = ({ product, shop, isSubscriber, }) => {
74
- const info = product.getInfoByShop(shop);
75
- if (product.isGift)
76
- return 0;
77
- return isSubscriber && info.subscriberPrice > 0 ? info.subscriberPrice : info.price;
78
- };
79
- this.checkMaxStock = (item, quantity) => {
80
- var _a;
81
- const maxStock = ((_a = item.stock) === null || _a === void 0 ? void 0 : _a.quantity) || 0;
82
- const currentItemAmount = item.quantity || 0;
83
- return currentItemAmount + quantity > maxStock;
84
- };
85
- }
86
- addItem(item, quantity = 1) {
87
- return this.checkoutService.getCheckout().pipe(map((checkout) => ({
88
- checkout,
89
- lineItem: this.buildLineItem({ checkout, item, quantity: quantity || 1 }),
90
- })), concatMap(({ checkout, lineItem }) => this.updateLineItemInCart(lineItem, quantity || 1, checkout)), tap((cart) => this.cartSubject.next(cart)));
91
- }
92
- decreaseItem(item) {
93
- return this.checkoutService.getCheckout().pipe(map((checkout) => {
94
- var _a;
95
- const checkoutItem = (_a = checkout.lineItems) === null || _a === void 0 ? void 0 : _a.find((lineItem) => lineItem.sku === item.sku);
96
- if (!isNil(checkoutItem))
97
- checkoutItem.quantity -= checkoutItem.quantity > 1 ? 1 : 0;
98
- return checkout;
99
- }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
100
- }
101
- getCart(checkout) {
102
- this.buildCartFromCheckout(checkout).subscribe((cart) => this.cartSubject.next(cart));
103
- return this.cartSubject;
104
- }
105
- /**
106
- * @deprecated The method should not be used
107
- */
108
- getDiscount(coupon) {
109
- switch (coupon.type) {
110
- case CouponTypes.FINANCIAL:
111
- return this.getFinancialDiscount(coupon);
112
- case CouponTypes.PRODUCT:
113
- return (subTotalPrice) => subTotalPrice;
114
- case CouponTypes.GIFTCARD:
115
- return this.getFinancialDiscount(coupon);
116
- case CouponTypes.VOUCHER:
117
- return (subTotalPrice) => subTotalPrice;
118
- }
119
- }
120
- /**
121
- * @deprecated The method should not be used
122
- */
123
- getVariantPriceDiscount(item, shop) {
124
- return this.authService.getUser().pipe(concatMap((user) => iif(() => user.isSubscriber && !!item.getInfoByShop(shop).subscriberPrice, of(item.getInfoByShop(shop).subscriberPrice), of(item.getInfoByShop(shop).price))), catchError(() => of(item.getInfoByShop(shop).price)));
125
- }
126
- removeItem(item) {
127
- return this.checkoutService.getCheckout().pipe(map((checkout) => {
128
- const index = checkout.lineItems.findIndex((lineItem) => lineItem.sku === item.sku);
129
- if (index >= 0)
130
- checkout.lineItems.splice(index, 1);
131
- return checkout;
132
- }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
133
- }
134
- updateUserCart(user) {
135
- return this.checkoutService.getCheckout().pipe(concatMap((checkout) => this.checkoutService.updateCheckoutUser(Checkout.toInstance(Object.assign(Object.assign({}, checkout.toPlain()), { user })))), concatMap((checkout) => {
136
- var _a;
137
- return this.checkoutService.updateCheckoutLineItems(Checkout.toInstance(Object.assign(Object.assign({}, checkout.toPlain()), { lineItems: ((_a = checkout.lineItems) === null || _a === void 0 ? void 0 : _a.map((item) => this.buildLineItem({ checkout, item }))) || [] })));
138
- }), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
139
- }
140
- clearCart() {
141
- return this.checkoutService.getCheckout().pipe(map((checkout) => {
142
- this.checkoutService.clearCheckoutFromSession();
143
- return checkout;
144
- }), concatMap((oldCheckout) => this.buildCartFromCheckout(oldCheckout)), tap((cart) => this.cartSubject.next(cart)));
145
- }
146
- buildCartFromCheckout(checkoutData) {
147
- return this.checkoutService.getCheckout(checkoutData).pipe(map((checkout) => checkout.lineItems), concatMap((lineItems) => of(this.generateCartObject(lineItems))));
148
- }
149
- getFinancialDiscount(coupon) {
150
- return (subTotalPrice) => {
151
- if (FinancialCoupon.isFinancialCoupon(coupon))
152
- switch (coupon.subtype) {
153
- case CouponSubtypes.ABSOLUTE:
154
- return subTotalPrice - coupon.discount * 100;
155
- case CouponSubtypes.PERCENTAGE:
156
- return subTotalPrice * (1 - coupon.discount / 100);
157
- }
158
- };
159
- }
160
- }
161
- CartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CartService, deps: [{ token: i1.AuthService }, { token: i2.CheckoutService }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
162
- CartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CartService });
163
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CartService, decorators: [{
164
- type: Injectable
165
- }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.CheckoutService }, { type: i3.Shops, decorators: [{
166
- type: Inject,
167
- args: [DEFAULT_SHOP]
168
- }] }]; } });
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUNMLFFBQVEsRUFFUixjQUFjLEVBQ2QsV0FBVyxFQUNYLGVBQWUsRUFDZixLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssR0FFTixNQUFNLG1CQUFtQixDQUFBO0FBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBOzs7OztBQVFwRCxNQUFNLE9BQU8sV0FBVztJQUd0QixZQUNtQixXQUF3QixFQUN4QixlQUFnQyxFQUNWLFdBQWtCO1FBRnhDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNWLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBTG5ELGdCQUFXLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUE7UUEySDFDLHlCQUFvQixHQUFHLENBQUMsUUFBa0IsRUFBRSxRQUFnQixFQUFFLFFBQW1CLEVBQW9CLEVBQUUsQ0FDN0csQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMs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LENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNqRSxDQUFBO0lBQ0gsQ0FBQztJQXlHTyxvQkFBb0IsQ0FBQyxNQUErQjtRQUMxRCxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxlQUFlLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO2dCQUMzQyxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQ3RCLEtBQUssY0FBYyxDQUFDLFFBQVE7d0JBQzFCLE9BQU8sYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFBO29CQUM5QyxLQUFLLGNBQWMsQ0FBQyxVQUFVO3dCQUM1QixPQUFPLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFBO2lCQUNyRDtRQUNMLENBQUMsQ0FBQTtJQUNILENBQUM7O3lHQTdPVSxXQUFXLDRFQU1aLFlBQVk7NkdBTlgsV0FBVzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFPTixNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQge1xyXG4gIENoZWNrb3V0LFxyXG4gIENvdXBvbixcclxuICBDb3Vwb25TdWJ0eXBlcyxcclxuICBDb3Vwb25UeXBlcyxcclxuICBGaW5hbmNpYWxDb3Vwb24sXHJcbiAgaXNOaWwsXHJcbiAgTGluZUl0ZW0sXHJcbiAgU2hvcHMsXHJcbiAgVXNlcixcclxufSBmcm9tICdAaW5mcmFiNGEvY29ubmVjdCdcclxuaW1wb3J0IHsgaWlmLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuXHJcbmltcG9ydCB7IERFRkFVTFRfU0hPUCB9IGZyb20gJy4uL2NvbnN0cydcclxuXHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnXHJcbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSB9IGZyb20gJy4vY2hlY2tvdXQuc2VydmljZSdcclxuaW1wb3J0IHsgUmVxdWlyZWRDaGVja291dERhdGEgfSBmcm9tICcuL3R5cGVzJ1xyXG5cclxuZXhwb3J0IHR5cGUgQ2FydCA9IHtcclxuICBbaWQ6IHN0cmluZ106IExpbmVJdGVtXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENhcnRTZXJ2aWNlIHtcclxuICBwcml2YXRlIGNhcnRTdWJqZWN0OiBTdWJqZWN0PENhcnQ+ID0gbmV3IFN1YmplY3QoKVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGVja291dFNlcnZpY2U6IENoZWNrb3V0U2VydmljZSxcclxuICAgIEBJbmplY3QoREVGQVVMVF9TSE9QKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRTaG9wOiBTaG9wcyxcclxuICApIHt9XHJcblxyXG4gIGFkZEl0ZW0oaXRlbTogTGluZUl0ZW0sIHF1YW50aXR5OiBudW1iZXIgPSAxKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKS5waXBlKFxyXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiAoe1xyXG4gICAgICAgIGNoZWNrb3V0LFxyXG4gICAgICAgIGxpbmVJdGVtOiB0aGlzLmJ1aWxkTGluZUl0ZW0oeyBjaGVja291dCwgaXRlbSwgcXVhbnRpdHk6IHF1YW50aXR5IHx8IDEgfSksXHJcbiAgICAgIH0pKSxcclxuICAgICAgY29uY2F0TWFwKCh7IGNoZWNrb3V0LCBsaW5lSXRlbSB9KSA9PiB0aGlzLnVwZGF0ZUxpbmVJdGVtSW5DYXJ0KGxpbmVJdGVtLCBxdWFudGl0eSB8fCAxLCBjaGVja291dCkpLFxyXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBkZWNyZWFzZUl0ZW0oaXRlbTogTGluZUl0ZW0pOiBPYnNlcnZhYmxlPENhcnQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IHtcclxuICAgICAgICBjb25zdCBjaGVja291dEl0ZW0gPSBjaGVja291dC5saW5lSXRlbXM/LmZpbmQoKGxpbmVJdGVtKSA9PiBsaW5lSXRlbS5za3UgPT09IGl0ZW0uc2t1KVxyXG5cclxuICAgICAgICBpZiAoIWlzTmlsKGNoZWNrb3V0SXRlbSkpIGNoZWNrb3V0SXRlbS5xdWFudGl0eSAtPSBjaGVja291dEl0ZW0ucXVhbnRpdHkgPiAxID8gMSA6IDBcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoZWNrb3V0XHJcbiAgICAgIH0pLFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dCkpLFxyXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdChjaGVja291dC5saW5lSXRlbXMpKSxcclxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgZ2V0Q2FydChjaGVja291dD86IFJlcXVpcmVkQ2hlY2tvdXREYXRhKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XHJcbiAgICB0aGlzLmJ1aWxkQ2FydEZyb21DaGVja291dChjaGVja291dCkuc3Vic2NyaWJlKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY2FydFN1YmplY3RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIFRoZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkXHJcbiAgICovXHJcbiAgZ2V0RGlzY291bnQoY291cG9uOiBDb3Vwb24gJiB7IGlkOiBzdHJpbmcgfSk6IChzdWJUb3RhbFByaWNlOiBudW1iZXIpID0+IG51bWJlciB7XHJcbiAgICBzd2l0Y2ggKGNvdXBvbi50eXBlKSB7XHJcbiAgICAgIGNhc2UgQ291cG9uVHlwZXMuRklOQU5DSUFMOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpbmFuY2lhbERpc2NvdW50KGNvdXBvbilcclxuICAgICAgY2FzZSBDb3Vwb25UeXBlcy5QUk9EVUNUOlxyXG4gICAgICAgIHJldHVybiAoc3ViVG90YWxQcmljZTogbnVtYmVyKSA9PiBzdWJUb3RhbFByaWNlXHJcbiAgICAgIGNhc2UgQ291cG9uVHlwZXMuR0lGVENBUkQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmluYW5jaWFsRGlzY291bnQoY291cG9uKVxyXG4gICAgICBjYXNlIENvdXBvblR5cGVzLlZPVUNIRVI6XHJcbiAgICAgICAgcmV0dXJuIChzdWJUb3RhbFByaWNlOiBudW1iZXIpID0+IHN1YlRvdGFsUHJpY2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIFRoZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkXHJcbiAgICovXHJcbiAgZ2V0VmFyaWFudFByaWNlRGlzY291bnQoaXRlbTogTGluZUl0ZW0sIHNob3A6IFNob3BzKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXIoKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKHVzZXIpID0+XHJcbiAgICAgICAgaWlmKFxyXG4gICAgICAgICAgKCkgPT4gdXNlci5pc1N1YnNjcmliZXIgJiYgISFpdGVtLmdldEluZm9CeVNob3Aoc2hvcCkuc3Vic2NyaWJlclByaWNlLFxyXG4gICAgICAgICAgb2YoaXRlbS5nZXRJbmZvQnlTaG9wKHNob3ApLnN1YnNjcmliZXJQcmljZSksXHJcbiAgICAgICAgICBvZihpdGVtLmdldEluZm9CeVNob3Aoc2hvcCkucHJpY2UpLFxyXG4gICAgICAgICksXHJcbiAgICAgICksXHJcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoaXRlbS5nZXRJbmZvQnlTaG9wKHNob3ApLnByaWNlKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZW1vdmVJdGVtKGl0ZW06IExpbmVJdGVtKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKS5waXBlKFxyXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGVja291dC5saW5lSXRlbXMuZmluZEluZGV4KChsaW5lSXRlbSkgPT4gbGluZUl0ZW0uc2t1ID09PSBpdGVtLnNrdSlcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIGNoZWNrb3V0LmxpbmVJdGVtcy5zcGxpY2UoaW5kZXgsIDEpXHJcblxyXG4gICAgICAgIHJldHVybiBjaGVja291dFxyXG4gICAgICB9KSxcclxuICAgICAgY29uY2F0TWFwKChjaGVja291dCkgPT4gdGhpcy5jaGVja291dFNlcnZpY2UudXBkYXRlQ2hlY2tvdXRMaW5lSXRlbXMoY2hlY2tvdXQpKSxcclxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXHJcbiAgICAgIHRhcCgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIHVwZGF0ZVVzZXJDYXJ0KHVzZXI6IFVzZXIpOiBPYnNlcnZhYmxlPENhcnQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+XHJcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UudXBkYXRlQ2hlY2tvdXRVc2VyKENoZWNrb3V0LnRvSW5zdGFuY2UoeyAuLi5jaGVja291dC50b1BsYWluKCksIHVzZXIgfSkpLFxyXG4gICAgICApLFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLnVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKFxyXG4gICAgICAgICAgQ2hlY2tvdXQudG9JbnN0YW5jZSh7XHJcbiAgICAgICAgICAgIC4uLmNoZWNrb3V0LnRvUGxhaW4oKSxcclxuICAgICAgICAgICAgbGluZUl0ZW1zOiBjaGVja291dC5saW5lSXRlbXM/Lm1hcCgoaXRlbSkgPT4gdGhpcy5idWlsZExpbmVJdGVtKHsgY2hlY2tvdXQsIGl0ZW0gfSkpIHx8IFtdLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKSxcclxuICAgICAgKSxcclxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXHJcbiAgICAgIHRhcCgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIGNsZWFyQ2FydCgpOiBPYnNlcnZhYmxlPENhcnQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5jbGVhckNoZWNrb3V0RnJvbVNlc3Npb24oKVxyXG4gICAgICAgIHJldHVybiBjaGVja291dFxyXG4gICAgICB9KSxcclxuICAgICAgY29uY2F0TWFwKChvbGRDaGVja291dCkgPT4gdGhpcy5idWlsZENhcnRGcm9tQ2hlY2tvdXQob2xkQ2hlY2tvdXQpKSxcclxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENhcnRGcm9tQ2hlY2tvdXQoY2hlY2tvdXREYXRhPzogUmVxdWlyZWRDaGVja291dERhdGEpOiBPYnNlcnZhYmxlPENhcnQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dChjaGVja291dERhdGEpLnBpcGUoXHJcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IGNoZWNrb3V0LmxpbmVJdGVtcyksXHJcbiAgICAgIGNvbmNhdE1hcCgobGluZUl0ZW1zKSA9PiBvZih0aGlzLmdlbmVyYXRlQ2FydE9iamVjdChsaW5lSXRlbXMpKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUxpbmVJdGVtSW5DYXJ0ID0gKGxpbmVJdGVtOiBMaW5lSXRlbSwgcXVhbnRpdHk6IG51bWJlciwgY2hlY2tvdXQ/OiBDaGVja291dCk6IE9ic2VydmFibGU8Q2FydD4gPT5cclxuICAgIChpc05pbChjaGVja291dCkgPyB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpIDogb2YoY2hlY2tvdXQpKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0TG9hZGVkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbXM6IExpbmVJdGVtW10gPSBbXVxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zPy5tYXAoKGNoZWNrb3V0SXRlbSkgPT4gY2hlY2tvdXRJdGVtLnNrdSkuaW5kZXhPZihsaW5lSXRlbS5za3UpXHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICBjaGVja291dExvYWRlZC5saW5lSXRlbXNbaW5kZXhdLnF1YW50aXR5ICs9IHF1YW50aXR5XHJcbiAgICAgICAgICBjaGVja291dExvYWRlZC5saW5lSXRlbXNbaW5kZXhdLnByaWNlUGFpZCA9IGxpbmVJdGVtLnByaWNlUGFpZFxyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zID0gaXRlbXMuY29uY2F0KFxyXG4gICAgICAgICAgICBjaGVja291dExvYWRlZC5saW5lSXRlbXMgPyBjaGVja291dExvYWRlZC5saW5lSXRlbXMuY29uY2F0KFtsaW5lSXRlbV0pIDogW2xpbmVJdGVtXSxcclxuICAgICAgICAgIClcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlXHJcbiAgICAgICAgICAudXBkYXRlQ2hlY2tvdXRMaW5lSXRlbXMoY2hlY2tvdXRMb2FkZWQpXHJcbiAgICAgICAgICAucGlwZShtYXAoKHVwZGF0ZWRDaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QodXBkYXRlZENoZWNrb3V0LmxpbmVJdGVtcykpKVxyXG4gICAgICB9KSxcclxuICAgIClcclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhcnRPYmplY3QgPSAoaXRlbXM6IExpbmVJdGVtW10pOiBDYXJ0ID0+IHtcclxuICAgIGNvbnN0IGNhcnQ6IENhcnQgPSB7fVxyXG5cclxuICAgIGl0ZW1zPy5mb3JFYWNoKFxyXG4gICAgICAoaXRlbSkgPT5cclxuICAgICAgICAoY2FydFtpdGVtLnNrdV0gPSBMaW5lSXRlbS50b0luc3RhbmNlKHtcclxuICAgICAgICAgIC4uLihjYXJ0W2l0ZW0uc2t1XSB8fCBpdGVtKSxcclxuICAgICAgICAgIHF1YW50aXR5OiAoY2FydFtpdGVtLnNrdV0/LnF1YW50aXR5IHx8IDApICsgKGl0ZW0ucXVhbnRpdHkgPyBpdGVtLnF1YW50aXR5IDogMSksXHJcbiAgICAgICAgfSkpLFxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiBjYXJ0XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkTGluZUl0ZW0gPSAoe1xyXG4gICAgY2hlY2tvdXQsXHJcbiAgICBpdGVtLFxyXG4gICAgcXVhbnRpdHksXHJcbiAgfToge1xyXG4gICAgY2hlY2tvdXQ6IFJlcXVpcmVkQ2hlY2tvdXREYXRhXHJcbiAgICBpdGVtOiBMaW5lSXRlbVxyXG4gICAgcXVhbnRpdHk/OiBudW1iZXJcclxuICB9KTogTGluZUl0ZW0gPT4ge1xyXG4gICAgaXRlbS5xdWFudGl0eSA9IGl0ZW0/LnF1YW50aXR5IHx8IGNoZWNrb3V0Py5saW5lSXRlbXM/LmZpbmQoKGxpbmVJdGVtKSA9PiBsaW5lSXRlbS5za3UgPT09IGl0ZW0uc2t1KT8ucXVhbnRpdHkgfHwgMFxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrTWF4U3RvY2soaXRlbSwgcXVhbnRpdHkgfHwgMCkpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVzY3VscGUhIFRlbW9zIGFwZW5hcyAnICsgaXRlbS5zdG9jaz8ucXVhbnRpdHkgKyAnIGVtIGVzdG9xdWUuJylcclxuXHJcbiAgICBjb25zdCBpbWFnZSA9IGl0ZW0uaW1hZ2UgfHwgaXRlbS5pbWFnZXM/LnNoaWZ0KClcclxuICAgIGNvbnN0IHsgaWQsIG5hbWUsIGJyYW5kLCBzbHVnLCBzdG9jaywgcHJpY2UsIHdlaWdodCwgY2F0ZWdvcmllcywgc2t1IH0gPSBpdGVtXHJcbiAgICBjb25zdCBpc0dpZnQgPSBpdGVtLmlzR2lmdCB8fCBudWxsXHJcbiAgICBjb25zdCBwcmljZVBhaWQgPSB0aGlzLmdldFByb2R1Y3RQcmljZSh7XHJcbiAgICAgIHByb2R1Y3Q6IGl0ZW0sXHJcbiAgICAgIHNob3A6IGNoZWNrb3V0LnNob3AgfHwgdGhpcy5kZWZhdWx0U2hvcCxcclxuICAgICAgaXNTdWJzY3JpYmVyOiBjaGVja291dC51c2VyPy5pc1N1YnNjcmliZXIsXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IEVBTiA9IGl0ZW0uRUFOXHJcblxyXG4gICAgY29uc29sZS5sb2coJ3NldCBFQU4nLCBFQU4pXHJcblxyXG4gICAgcmV0dXJuIExpbmVJdGVtLnRvSW5zdGFuY2Uoe1xyXG4gICAgICBpZCxcclxuICAgICAgRUFOLFxyXG4gICAgICBuYW1lLFxyXG4gICAgICBicmFuZCxcclxuICAgICAgc2x1ZyxcclxuICAgICAgc2t1LFxyXG4gICAgICBzdG9jayxcclxuICAgICAgcHJpY2UsXHJcbiAgICAgIGltYWdlLFxyXG4gICAgICB3ZWlnaHQsXHJcbiAgICAgIHF1YW50aXR5OiAoaXRlbS5xdWFudGl0eSB8fCAwKSArIChxdWFudGl0eSB8fCAwKSxcclxuICAgICAgcHJpY2VQYWlkLFxyXG4gICAgICBjYXRlZ29yaWVzLFxyXG4gICAgICBpc0dpZnQsXHJcbiAgICAgIGNvc3RQcmljZTogaXRlbT8uY29zdFByaWNlLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJvZHVjdFByaWNlID0gKHtcclxuICAgIHByb2R1Y3QsXHJcbiAgICBzaG9wLFxyXG4gICAgaXNTdWJzY3JpYmVyLFxyXG4gIH06IHtcclxuICAgIHByb2R1Y3Q6IExpbmVJdGVtXHJcbiAgICBzaG9wOiBTaG9wc1xyXG4gICAgaXNTdWJzY3JpYmVyOiBib29sZWFuXHJcbiAgfSk6IG51bWJlciA9PiB7XHJcbiAgICBjb25zdCBpbmZvID0gcHJvZHVjdC5nZXRJbmZvQnlTaG9wKHNob3ApXHJcblxyXG4gICAgaWYgKHByb2R1Y3QuaXNHaWZ0KSByZXR1cm4gMFxyXG5cclxuICAgIHJldHVybiBpc1N1YnNjcmliZXIgJiYgaW5mby5zdWJzY3JpYmVyUHJpY2UgPiAwID8gaW5mby5zdWJzY3JpYmVyUHJpY2UgOiBpbmZvLnByaWNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTWF4U3RvY2sgPSAoaXRlbTogTGluZUl0ZW0sIHF1YW50aXR5OiBudW1iZXIpID0+IHtcclxuICAgIGNvbnN0IG1heFN0b2NrID0gaXRlbS5zdG9jaz8ucXVhbnRpdHkgfHwgMFxyXG4gICAgY29uc3QgY3VycmVudEl0ZW1BbW91bnQgPSBpdGVtLnF1YW50aXR5IHx8IDBcclxuXHJcbiAgICByZXR1cm4gY3VycmVudEl0ZW1BbW91bnQgKyBxdWFudGl0eSA+IG1heFN0b2NrXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbmFuY2lhbERpc2NvdW50KGNvdXBvbjogQ291cG9uICYgeyBpZDogc3RyaW5nIH0pOiAoc3ViVG90YWxQcmljZTogbnVtYmVyKSA9PiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChzdWJUb3RhbFByaWNlKSA9PiB7XHJcbiAgICAgIGlmIChGaW5hbmNpYWxDb3Vwb24uaXNGaW5hbmNpYWxDb3Vwb24oY291cG9uKSlcclxuICAgICAgICBzd2l0Y2ggKGNvdXBvbi5zdWJ0eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIENvdXBvblN1YnR5cGVzLkFCU09MVVRFOlxyXG4gICAgICAgICAgICByZXR1cm4gc3ViVG90YWxQcmljZSAtIGNvdXBvbi5kaXNjb3VudCAqIDEwMFxyXG4gICAgICAgICAgY2FzZSBDb3Vwb25TdWJ0eXBlcy5QRVJDRU5UQUdFOlxyXG4gICAgICAgICAgICByZXR1cm4gc3ViVG90YWxQcmljZSAqICgxIC0gY291cG9uLmRpc2NvdW50IC8gMTAwKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { Checkout, CouponTypes, isNil, LineItem, Shops } from '@infrab4a/connect';
3
+ import { iif, of, Subject } from 'rxjs';
4
+ import { catchError, concatMap, map, tap } from 'rxjs/operators';
5
+ import { DEFAULT_SHOP } from '../consts';
6
+ import { AuthService } from './auth.service';
7
+ import { CheckoutService } from './checkout.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./auth.service";
10
+ import * as i2 from "./checkout.service";
11
+ import * as i3 from "@infrab4a/connect";
12
+ export class CartService {
13
+ constructor(authService, checkoutService, defaultShop) {
14
+ this.authService = authService;
15
+ this.checkoutService = checkoutService;
16
+ this.defaultShop = defaultShop;
17
+ this.cartSubject = new Subject();
18
+ this.updateLineItemInCart = (lineItem, quantity, checkout) => (isNil(checkout) ? this.checkoutService.getCheckout() : of(checkout)).pipe(concatMap((checkoutLoaded) => {
19
+ var _a;
20
+ const items = [];
21
+ const index = (_a = checkoutLoaded.lineItems) === null || _a === void 0 ? void 0 : _a.map((checkoutItem) => checkoutItem.sku).indexOf(lineItem.sku);
22
+ if (index > -1) {
23
+ checkoutLoaded.lineItems[index].quantity += quantity;
24
+ checkoutLoaded.lineItems[index].pricePaid = lineItem.pricePaid;
25
+ }
26
+ else
27
+ checkoutLoaded.lineItems = items.concat(checkoutLoaded.lineItems ? checkoutLoaded.lineItems.concat([lineItem]) : [lineItem]);
28
+ return this.checkoutService
29
+ .updateCheckoutLineItems(checkoutLoaded)
30
+ .pipe(map((updatedCheckout) => this.generateCartObject(updatedCheckout.lineItems)));
31
+ }));
32
+ this.generateCartObject = (items) => {
33
+ const cart = {};
34
+ items === null || items === void 0 ? void 0 : items.forEach((item) => {
35
+ var _a;
36
+ return (cart[item.sku] = LineItem.toInstance(Object.assign(Object.assign({}, (cart[item.sku] || item)), { quantity: (((_a = cart[item.sku]) === null || _a === void 0 ? void 0 : _a.quantity) || 0) + (item.quantity ? item.quantity : 1) })));
37
+ });
38
+ return cart;
39
+ };
40
+ this.buildLineItem = ({ checkout, item, quantity, }) => {
41
+ var _a, _b, _c, _d, _e;
42
+ item.quantity = (item === null || item === void 0 ? void 0 : item.quantity) || ((_b = (_a = checkout === null || checkout === void 0 ? void 0 : checkout.lineItems) === null || _a === void 0 ? void 0 : _a.find((lineItem) => lineItem.sku === item.sku)) === null || _b === void 0 ? void 0 : _b.quantity) || 0;
43
+ if (this.checkMaxStock(item, quantity || 0))
44
+ throw new Error('Desculpe! Temos apenas ' + ((_c = item.stock) === null || _c === void 0 ? void 0 : _c.quantity) + ' em estoque.');
45
+ const image = item.image || ((_d = item.images) === null || _d === void 0 ? void 0 : _d.shift());
46
+ const { id, name, brand, slug, stock, price, weight, categories, sku } = item;
47
+ const isGift = item.isGift || null;
48
+ const pricePaid = this.getProductPrice({
49
+ product: item,
50
+ shop: checkout.shop || this.defaultShop,
51
+ isSubscriber: (_e = checkout.user) === null || _e === void 0 ? void 0 : _e.isSubscriber,
52
+ });
53
+ return LineItem.toInstance({
54
+ id,
55
+ name,
56
+ brand,
57
+ slug,
58
+ sku,
59
+ stock,
60
+ price,
61
+ image,
62
+ weight,
63
+ quantity: (item.quantity || 0) + (quantity || 0),
64
+ pricePaid,
65
+ categories,
66
+ isGift,
67
+ costPrice: item === null || item === void 0 ? void 0 : item.costPrice,
68
+ });
69
+ };
70
+ this.getProductPrice = ({ product, shop, isSubscriber, }) => {
71
+ const info = product.getInfoByShop(shop);
72
+ if (product.isGift)
73
+ return 0;
74
+ return isSubscriber && info.subscriberPrice > 0 ? info.subscriberPrice : info.price;
75
+ };
76
+ this.checkMaxStock = (item, quantity) => {
77
+ var _a;
78
+ const maxStock = ((_a = item.stock) === null || _a === void 0 ? void 0 : _a.quantity) || 0;
79
+ const currentItemAmount = item.quantity || 0;
80
+ return currentItemAmount + quantity > maxStock;
81
+ };
82
+ }
83
+ addItem(item, quantity = 1) {
84
+ return this.checkoutService.getCheckout().pipe(map((checkout) => ({
85
+ checkout,
86
+ lineItem: this.buildLineItem({ checkout, item, quantity: quantity || 1 }),
87
+ })), concatMap(({ checkout, lineItem }) => this.updateLineItemInCart(lineItem, quantity || 1, checkout)), tap((cart) => this.cartSubject.next(cart)));
88
+ }
89
+ decreaseItem(item) {
90
+ return this.checkoutService.getCheckout().pipe(map((checkout) => {
91
+ var _a;
92
+ const checkoutItem = (_a = checkout.lineItems) === null || _a === void 0 ? void 0 : _a.find((lineItem) => lineItem.sku === item.sku);
93
+ if (!isNil(checkoutItem))
94
+ checkoutItem.quantity -= checkoutItem.quantity > 1 ? 1 : 0;
95
+ return checkout;
96
+ }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
97
+ }
98
+ getCart(checkout) {
99
+ this.buildCartFromCheckout(checkout).subscribe((cart) => this.cartSubject.next(cart));
100
+ return this.cartSubject;
101
+ }
102
+ /**
103
+ * @deprecated The method should not be used
104
+ */
105
+ getVariantPriceDiscount(item, shop) {
106
+ return this.authService.getUser().pipe(concatMap((user) => iif(() => user.isSubscriber && !!item.getInfoByShop(shop).subscriberPrice, of(item.getInfoByShop(shop).subscriberPrice), of(item.getInfoByShop(shop).price))), catchError(() => of(item.getInfoByShop(shop).price)));
107
+ }
108
+ removeItem(item) {
109
+ return this.checkoutService.getCheckout().pipe(map((checkout) => {
110
+ const index = checkout.lineItems.findIndex((lineItem) => lineItem.sku === item.sku);
111
+ if (index >= 0)
112
+ checkout.lineItems.splice(index, 1);
113
+ return checkout;
114
+ }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
115
+ }
116
+ updateUserCart(user) {
117
+ return this.checkoutService.getCheckout().pipe(concatMap((checkout) => this.checkoutService.updateCheckoutUser(Checkout.toInstance(Object.assign(Object.assign({}, checkout.toPlain()), { user })))), concatMap((checkout) => {
118
+ var _a;
119
+ return this.checkoutService.updateCheckoutLineItems(Checkout.toInstance(Object.assign(Object.assign({}, checkout.toPlain()), { lineItems: ((_a = checkout.lineItems) === null || _a === void 0 ? void 0 : _a.map((item) => this.buildLineItem({ checkout, item }))) || [] })));
120
+ }), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
121
+ }
122
+ clearCart() {
123
+ return this.checkoutService.getCheckout().pipe(map((checkout) => {
124
+ this.checkoutService.clearCheckoutFromSession();
125
+ return checkout;
126
+ }), concatMap((oldCheckout) => this.buildCartFromCheckout(oldCheckout)), tap((cart) => this.cartSubject.next(cart)));
127
+ }
128
+ buildCartFromCheckout(checkoutData) {
129
+ return this.checkoutService.getCheckout(checkoutData).pipe(map((checkout) => checkout.lineItems), concatMap((lineItems) => of(this.generateCartObject(lineItems))));
130
+ }
131
+ getSubTotalDiscount(coupon) {
132
+ return (subTotalPrice) => {
133
+ switch (coupon.type) {
134
+ case CouponTypes.ABSOLUTE:
135
+ return subTotalPrice - coupon.discount;
136
+ case CouponTypes.PERCENTAGE:
137
+ return subTotalPrice * (1 - coupon.discount / 100);
138
+ }
139
+ };
140
+ }
141
+ }
142
+ CartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CartService, deps: [{ token: i1.AuthService }, { token: i2.CheckoutService }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
143
+ CartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CartService });
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CartService, decorators: [{
145
+ type: Injectable
146
+ }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.CheckoutService }, { type: i3.Shops, decorators: [{
147
+ type: Inject,
148
+ args: [DEFAULT_SHOP]
149
+ }] }]; } });
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBMEIsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFRLE1BQU0sbUJBQW1CLENBQUE7QUFDL0csT0FBTyxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXhDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7Ozs7O0FBUXBELE1BQU0sT0FBTyxXQUFXO0lBR3RCLFlBQ21CLFdBQXdCLEVBQ3hCLGVBQWdDLEVBQ1YsV0FBa0I7UUFGeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ1YsZ0JBQVcsR0FBWCxXQUFXLENBQU87UUFMbkQsZ0JBQVcsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQTJHMUMseUJBQW9CLEdBQUcsQ0FBQyxRQUFrQixFQUFFLFFBQWdCLEVBQUUsUUFBbUIsRUFBb0IsRUFBRSxDQUM3RyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFD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SW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IENoZWNrb3V0LCBDb3Vwb24sIENvdXBvblN1YnR5cGVzLCBDb3Vwb25UeXBlcywgaXNOaWwsIExpbmVJdGVtLCBTaG9wcywgVXNlciB9IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgaWlmLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBjb25jYXRNYXAsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IERFRkFVTFRfU0hPUCB9IGZyb20gJy4uL2NvbnN0cydcblxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSdcbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSB9IGZyb20gJy4vY2hlY2tvdXQuc2VydmljZSdcbmltcG9ydCB7IFJlcXVpcmVkQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IHR5cGUgQ2FydCA9IHtcbiAgW2lkOiBzdHJpbmddOiBMaW5lSXRlbVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ2FydFNlcnZpY2Uge1xuICBwcml2YXRlIGNhcnRTdWJqZWN0OiBTdWJqZWN0PENhcnQ+ID0gbmV3IFN1YmplY3QoKVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hlY2tvdXRTZXJ2aWNlOiBDaGVja291dFNlcnZpY2UsXG4gICAgQEluamVjdChERUZBVUxUX1NIT1ApIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNob3A6IFNob3BzLFxuICApIHt9XG5cbiAgYWRkSXRlbShpdGVtOiBMaW5lSXRlbSwgcXVhbnRpdHk6IG51bWJlciA9IDEpOiBPYnNlcnZhYmxlPENhcnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKS5waXBlKFxuICAgICAgbWFwKChjaGVja291dCkgPT4gKHtcbiAgICAgICAgY2hlY2tvdXQsXG4gICAgICAgIGxpbmVJdGVtOiB0aGlzLmJ1aWxkTGluZUl0ZW0oeyBjaGVja291dCwgaXRlbSwgcXVhbnRpdHk6IHF1YW50aXR5IHx8IDEgfSksXG4gICAgICB9KSksXG4gICAgICBjb25jYXRNYXAoKHsgY2hlY2tvdXQsIGxpbmVJdGVtIH0pID0+IHRoaXMudXBkYXRlTGluZUl0ZW1JbkNhcnQobGluZUl0ZW0sIHF1YW50aXR5IHx8IDEsIGNoZWNrb3V0KSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgZGVjcmVhc2VJdGVtKGl0ZW06IExpbmVJdGVtKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRJdGVtID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maW5kKChsaW5lSXRlbSkgPT4gbGluZUl0ZW0uc2t1ID09PSBpdGVtLnNrdSlcblxuICAgICAgICBpZiAoIWlzTmlsKGNoZWNrb3V0SXRlbSkpIGNoZWNrb3V0SXRlbS5xdWFudGl0eSAtPSBjaGVja291dEl0ZW0ucXVhbnRpdHkgPiAxID8gMSA6IDBcblxuICAgICAgICByZXR1cm4gY2hlY2tvdXRcbiAgICAgIH0pLFxuICAgICAgY29uY2F0TWFwKChjaGVja291dCkgPT4gdGhpcy5jaGVja291dFNlcnZpY2UudXBkYXRlQ2hlY2tvdXRMaW5lSXRlbXMoY2hlY2tvdXQpKSxcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KGNoZWNrb3V0LmxpbmVJdGVtcykpLFxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxuICAgIClcbiAgfVxuXG4gIGdldENhcnQoY2hlY2tvdXQ/OiBSZXF1aXJlZENoZWNrb3V0RGF0YSk6IE9ic2VydmFibGU8Q2FydD4ge1xuICAgIHRoaXMuYnVpbGRDYXJ0RnJvbUNoZWNrb3V0KGNoZWNrb3V0KS5zdWJzY3JpYmUoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSlcblxuICAgIHJldHVybiB0aGlzLmNhcnRTdWJqZWN0XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVGhlIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICovXG4gIGdldFZhcmlhbnRQcmljZURpc2NvdW50KGl0ZW06IExpbmVJdGVtLCBzaG9wOiBTaG9wcyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuZ2V0VXNlcigpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKHVzZXIpID0+XG4gICAgICAgIGlpZihcbiAgICAgICAgICAoKSA9PiB1c2VyLmlzU3Vic2NyaWJlciAmJiAhIWl0ZW0uZ2V0SW5mb0J5U2hvcChzaG9wKS5zdWJzY3JpYmVyUHJpY2UsXG4gICAgICAgICAgb2YoaXRlbS5nZXRJbmZvQnlTaG9wKHNob3ApLnN1YnNjcmliZXJQcmljZSksXG4gICAgICAgICAgb2YoaXRlbS5nZXRJbmZvQnlTaG9wKHNob3ApLnByaWNlKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGl0ZW0uZ2V0SW5mb0J5U2hvcChzaG9wKS5wcmljZSkpLFxuICAgIClcbiAgfVxuXG4gIHJlbW92ZUl0ZW0oaXRlbTogTGluZUl0ZW0pOiBPYnNlcnZhYmxlPENhcnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKS5waXBlKFxuICAgICAgbWFwKChjaGVja291dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNoZWNrb3V0LmxpbmVJdGVtcy5maW5kSW5kZXgoKGxpbmVJdGVtKSA9PiBsaW5lSXRlbS5za3UgPT09IGl0ZW0uc2t1KVxuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSBjaGVja291dC5saW5lSXRlbXMuc3BsaWNlKGluZGV4LCAxKVxuXG4gICAgICAgIHJldHVybiBjaGVja291dFxuICAgICAgfSksXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dCkpLFxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgdXBkYXRlVXNlckNhcnQodXNlcjogVXNlcik6IE9ic2VydmFibGU8Q2FydD4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dFVzZXIoQ2hlY2tvdXQudG9JbnN0YW5jZSh7IC4uLmNoZWNrb3V0LnRvUGxhaW4oKSwgdXNlciB9KSksXG4gICAgICApLFxuICAgICAgY29uY2F0TWFwKChjaGVja291dCkgPT5cbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UudXBkYXRlQ2hlY2tvdXRMaW5lSXRlbXMoXG4gICAgICAgICAgQ2hlY2tvdXQudG9JbnN0YW5jZSh7XG4gICAgICAgICAgICAuLi5jaGVja291dC50b1BsYWluKCksXG4gICAgICAgICAgICBsaW5lSXRlbXM6IGNoZWNrb3V0LmxpbmVJdGVtcz8ubWFwKChpdGVtKSA9PiB0aGlzLmJ1aWxkTGluZUl0ZW0oeyBjaGVja291dCwgaXRlbSB9KSkgfHwgW10sXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgY2xlYXJDYXJ0KCk6IE9ic2VydmFibGU8Q2FydD4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmNsZWFyQ2hlY2tvdXRGcm9tU2Vzc2lvbigpXG4gICAgICAgIHJldHVybiBjaGVja291dFxuICAgICAgfSksXG4gICAgICBjb25jYXRNYXAoKG9sZENoZWNrb3V0KSA9PiB0aGlzLmJ1aWxkQ2FydEZyb21DaGVja291dChvbGRDaGVja291dCkpLFxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDYXJ0RnJvbUNoZWNrb3V0KGNoZWNrb3V0RGF0YT86IFJlcXVpcmVkQ2hlY2tvdXREYXRhKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KGNoZWNrb3V0RGF0YSkucGlwZShcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IGNoZWNrb3V0LmxpbmVJdGVtcyksXG4gICAgICBjb25jYXRNYXAoKGxpbmVJdGVtcykgPT4gb2YodGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QobGluZUl0ZW1zKSkpLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGluZUl0ZW1JbkNhcnQgPSAobGluZUl0ZW06IExpbmVJdGVtLCBxdWFudGl0eTogbnVtYmVyLCBjaGVja291dD86IENoZWNrb3V0KTogT2JzZXJ2YWJsZTxDYXJ0PiA9PlxuICAgIChpc05pbChjaGVja291dCkgPyB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpIDogb2YoY2hlY2tvdXQpKS5waXBlKFxuICAgICAgY29uY2F0TWFwKChjaGVja291dExvYWRlZCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtczogTGluZUl0ZW1bXSA9IFtdXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zPy5tYXAoKGNoZWNrb3V0SXRlbSkgPT4gY2hlY2tvdXRJdGVtLnNrdSkuaW5kZXhPZihsaW5lSXRlbS5za3UpXG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBjaGVja291dExvYWRlZC5saW5lSXRlbXNbaW5kZXhdLnF1YW50aXR5ICs9IHF1YW50aXR5XG4gICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zW2luZGV4XS5wcmljZVBhaWQgPSBsaW5lSXRlbS5wcmljZVBhaWRcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zID0gaXRlbXMuY29uY2F0KFxuICAgICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zID8gY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zLmNvbmNhdChbbGluZUl0ZW1dKSA6IFtsaW5lSXRlbV0sXG4gICAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZVxuICAgICAgICAgIC51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dExvYWRlZClcbiAgICAgICAgICAucGlwZShtYXAoKHVwZGF0ZWRDaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QodXBkYXRlZENoZWNrb3V0LmxpbmVJdGVtcykpKVxuICAgICAgfSksXG4gICAgKVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYXJ0T2JqZWN0ID0gKGl0ZW1zOiBMaW5lSXRlbVtdKTogQ2FydCA9PiB7XG4gICAgY29uc3QgY2FydDogQ2FydCA9IHt9XG5cbiAgICBpdGVtcz8uZm9yRWFjaChcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICAoY2FydFtpdGVtLnNrdV0gPSBMaW5lSXRlbS50b0luc3RhbmNlKHtcbiAgICAgICAgICAuLi4oY2FydFtpdGVtLnNrdV0gfHwgaXRlbSksXG4gICAgICAgICAgcXVhbnRpdHk6IChjYXJ0W2l0ZW0uc2t1XT8ucXVhbnRpdHkgfHwgMCkgKyAoaXRlbS5xdWFudGl0eSA/IGl0ZW0ucXVhbnRpdHkgOiAxKSxcbiAgICAgICAgfSkpLFxuICAgIClcblxuICAgIHJldHVybiBjYXJ0XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTGluZUl0ZW0gPSAoe1xuICAgIGNoZWNrb3V0LFxuICAgIGl0ZW0sXG4gICAgcXVhbnRpdHksXG4gIH06IHtcbiAgICBjaGVja291dDogUmVxdWlyZWRDaGVja291dERhdGFcbiAgICBpdGVtOiBMaW5lSXRlbVxuICAgIHF1YW50aXR5PzogbnVtYmVyXG4gIH0pOiBMaW5lSXRlbSA9PiB7XG4gICAgaXRlbS5xdWFudGl0eSA9IGl0ZW0/LnF1YW50aXR5IHx8IGNoZWNrb3V0Py5saW5lSXRlbXM/LmZpbmQoKGxpbmVJdGVtKSA9PiBsaW5lSXRlbS5za3UgPT09IGl0ZW0uc2t1KT8ucXVhbnRpdHkgfHwgMFxuXG4gICAgaWYgKHRoaXMuY2hlY2tNYXhTdG9jayhpdGVtLCBxdWFudGl0eSB8fCAwKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVzY3VscGUhIFRlbW9zIGFwZW5hcyAnICsgaXRlbS5zdG9jaz8ucXVhbnRpdHkgKyAnIGVtIGVzdG9xdWUuJylcblxuICAgIGNvbnN0IGltYWdlID0gaXRlbS5pbWFnZSB8fCBpdGVtLmltYWdlcz8uc2hpZnQoKVxuICAgIGNvbnN0IHsgaWQsIG5hbWUsIGJyYW5kLCBzbHVnLCBzdG9jaywgcHJpY2UsIHdlaWdodCwgY2F0ZWdvcmllcywgc2t1IH0gPSBpdGVtXG4gICAgY29uc3QgaXNHaWZ0ID0gaXRlbS5pc0dpZnQgfHwgbnVsbFxuICAgIGNvbnN0IHByaWNlUGFpZCA9IHRoaXMuZ2V0UHJvZHVjdFByaWNlKHtcbiAgICAgIHByb2R1Y3Q6IGl0ZW0sXG4gICAgICBzaG9wOiBjaGVja291dC5zaG9wIHx8IHRoaXMuZGVmYXVsdFNob3AsXG4gICAgICBpc1N1YnNjcmliZXI6IGNoZWNrb3V0LnVzZXI/LmlzU3Vic2NyaWJlcixcbiAgICB9KVxuXG4gICAgcmV0dXJuIExpbmVJdGVtLnRvSW5zdGFuY2Uoe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgYnJhbmQsXG4gICAgICBzbHVnLFxuICAgICAgc2t1LFxuICAgICAgc3RvY2ssXG4gICAgICBwcmljZSxcbiAgICAgIGltYWdlLFxuICAgICAgd2VpZ2h0LFxuICAgICAgcXVhbnRpdHk6IChpdGVtLnF1YW50aXR5IHx8IDApICsgKHF1YW50aXR5IHx8IDApLFxuICAgICAgcHJpY2VQYWlkLFxuICAgICAgY2F0ZWdvcmllcyxcbiAgICAgIGlzR2lmdCxcbiAgICAgIGNvc3RQcmljZTogaXRlbT8uY29zdFByaWNlLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGdldFByb2R1Y3RQcmljZSA9ICh7XG4gICAgcHJvZHVjdCxcbiAgICBzaG9wLFxuICAgIGlzU3Vic2NyaWJlcixcbiAgfToge1xuICAgIHByb2R1Y3Q6IExpbmVJdGVtXG4gICAgc2hvcDogU2hvcHNcbiAgICBpc1N1YnNjcmliZXI6IGJvb2xlYW5cbiAgfSk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgaW5mbyA9IHByb2R1Y3QuZ2V0SW5mb0J5U2hvcChzaG9wKVxuXG4gICAgaWYgKHByb2R1Y3QuaXNHaWZ0KSByZXR1cm4gMFxuXG4gICAgcmV0dXJuIGlzU3Vic2NyaWJlciAmJiBpbmZvLnN1YnNjcmliZXJQcmljZSA+IDAgPyBpbmZvLnN1YnNjcmliZXJQcmljZSA6IGluZm8ucHJpY2VcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXhTdG9jayA9IChpdGVtOiBMaW5lSXRlbSwgcXVhbnRpdHk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG1heFN0b2NrID0gaXRlbS5zdG9jaz8ucXVhbnRpdHkgfHwgMFxuICAgIGNvbnN0IGN1cnJlbnRJdGVtQW1vdW50ID0gaXRlbS5xdWFudGl0eSB8fCAwXG5cbiAgICByZXR1cm4gY3VycmVudEl0ZW1BbW91bnQgKyBxdWFudGl0eSA+IG1heFN0b2NrXG4gIH1cblxuICBwcml2YXRlIGdldFN1YlRvdGFsRGlzY291bnQoY291cG9uOiBDb3Vwb24gJiB7IGlkOiBzdHJpbmcgfSk6IChzdWJUb3RhbFByaWNlOiBudW1iZXIpID0+IG51bWJlciB7XG4gICAgcmV0dXJuIChzdWJUb3RhbFByaWNlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNvdXBvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgQ291cG9uVHlwZXMuQUJTT0xVVEU6XG4gICAgICAgICAgcmV0dXJuIHN1YlRvdGFsUHJpY2UgLSBjb3Vwb24uZGlzY291bnRcbiAgICAgICAgY2FzZSBDb3Vwb25UeXBlcy5QRVJDRU5UQUdFOlxuICAgICAgICAgIHJldHVybiBzdWJUb3RhbFByaWNlICogKDEgLSBjb3Vwb24uZGlzY291bnQgLyAxMDApXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=