ng-easycommerce-v18 0.3.14-beta.1 → 0.3.14-beta.11

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 (45) hide show
  1. package/README.md +26 -0
  2. package/esm2022/lib/constants/api.constants.service.mjs +17 -5
  3. package/esm2022/lib/constants/core.constants.service.mjs +2 -2
  4. package/esm2022/lib/ec-components/abstractions-components/menu-ec.component.mjs +17 -1
  5. package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +20 -12
  6. package/esm2022/lib/ec-components/auth-ec/password-reset-ec/password-reset-ec.component.mjs +8 -2
  7. package/esm2022/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.mjs +5 -1
  8. package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +6 -2
  9. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.mjs +141 -75
  10. package/esm2022/lib/ec-components/filters-ec/filters-ec.component.mjs +30 -5
  11. package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +23 -3
  12. package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +11 -10
  13. package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +95 -5
  14. package/esm2022/lib/ec-components/stores-ec/stores-ec.component.mjs +21 -6
  15. package/esm2022/lib/ec-components/widgets-ec/decidir-ec/decidir-ec.component.mjs +52 -28
  16. package/esm2022/lib/ec-components/widgets-ec/index.mjs +2 -1
  17. package/esm2022/lib/ec-components/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.mjs +193 -0
  18. package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +4 -2
  19. package/esm2022/lib/ec-services/analytics/gtm.service.mjs +6 -3
  20. package/esm2022/lib/ec-services/analytics/metricool-pixel.service.mjs +4 -2
  21. package/esm2022/lib/ec-services/local-storage.service.mjs +21 -7
  22. package/esm2022/lib/ec-services/ngx-local-storage.service.mjs +24 -7
  23. package/esm2022/lib/interfaces/filter.mjs +1 -1
  24. package/esm2022/lib/interfaces/options.mjs +1 -1
  25. package/fesm2022/ng-easycommerce-v18.mjs +728 -221
  26. package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
  27. package/lib/constants/api.constants.service.d.ts +5 -1
  28. package/lib/ec-components/abstractions-components/menu-ec.component.d.ts +12 -0
  29. package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +3 -0
  30. package/lib/ec-components/auth-ec/password-reset-ec/password-reset-ec.component.d.ts +1 -0
  31. package/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.d.ts +2 -0
  32. package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +5 -0
  33. package/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.d.ts +38 -16
  34. package/lib/ec-components/filters-ec/filters-ec.component.d.ts +12 -4
  35. package/lib/ec-components/header-ec/header-ec.component.d.ts +5 -1
  36. package/lib/ec-components/product-ec/product-ec.component.d.ts +10 -1
  37. package/lib/ec-components/stores-ec/stores-ec.component.d.ts +2 -1
  38. package/lib/ec-components/widgets-ec/decidir-ec/decidir-ec.component.d.ts +6 -0
  39. package/lib/ec-components/widgets-ec/index.d.ts +1 -0
  40. package/lib/ec-components/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +47 -0
  41. package/lib/ec-services/local-storage.service.d.ts +4 -2
  42. package/lib/ec-services/ngx-local-storage.service.d.ts +4 -2
  43. package/lib/interfaces/filter.d.ts +1 -0
  44. package/lib/interfaces/options.d.ts +2 -0
  45. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { Component, Output, Input, EventEmitter } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
1
+ import { Component, Output, Input, EventEmitter, inject, PLATFORM_ID } from '@angular/core';
2
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { ComponentHelper } from "../../../classes/component-helper";
5
5
  import { LoadingFullEcComponent } from '../loading';
@@ -39,6 +39,12 @@ export class DecidirEcComponent extends ComponentHelper {
39
39
  params;
40
40
  showModal = false;
41
41
  dataRedirect = () => this.apiConsts.getUrlBase() + 'shop-api/' + this.consts.getChannel() + '/decidir/' + this.cartService.cartToken + '/process-payment';
42
+ platformId = inject(PLATFORM_ID);
43
+ isBrowser = isPlatformBrowser(this.platformId);
44
+ windowRef = this.isBrowser ? window : null;
45
+ localStorageRef = this.windowRef?.localStorage ?? null;
46
+ sessionStorageRef = this.windowRef?.sessionStorage ?? null;
47
+ messageListener = (event) => this.handleIframeMessage(event);
42
48
  constructor(renderer, connection, toastrService, consts, apiConsts, cartService, activedRoute, sanitizer, paramsService) {
43
49
  super();
44
50
  this.renderer = renderer;
@@ -63,32 +69,38 @@ export class DecidirEcComponent extends ComponentHelper {
63
69
  }
64
70
  ngOnDestroy() {
65
71
  // Remover el listener de mensajes
66
- window.removeEventListener('message', this.handleIframeMessage, false);
72
+ if (this.isBrowser && this.windowRef) {
73
+ this.windowRef.removeEventListener('message', this.messageListener, false);
74
+ }
67
75
  // console.log("SE DESTROZA");
68
76
  }
69
77
  ngOnChanges() {
70
78
  // console.log("SE CAMBIO");
71
79
  }
72
80
  openModal() {
81
+ if (!this.isBrowser || !this.localStorageRef)
82
+ return;
73
83
  this.clearStorageState();
74
- localStorage.setItem('dataRedirect', this.dataRedirect());
75
- localStorage.setItem('dataDecidir', JSON.stringify({
84
+ this.localStorageRef.setItem('dataRedirect', this.dataRedirect());
85
+ this.localStorageRef.setItem('dataDecidir', JSON.stringify({
76
86
  ...this.method,
77
87
  total_amount: this.total_amount
78
88
  }));
79
- localStorage.setItem('subtotal', this.total_amount.toString());
89
+ this.localStorageRef.setItem('subtotal', this.total_amount.toString());
80
90
  this.showModal = true;
81
91
  this.closeModal = '';
82
92
  this.callState();
83
93
  }
84
94
  clearStorageState = () => {
85
- sessionStorage.removeItem('state');
86
- localStorage.removeItem('state');
87
- localStorage.removeItem('dataRedirect');
88
- localStorage.removeItem('dataDecidir');
89
- localStorage.removeItem('message');
90
- localStorage.removeItem('subMessage');
91
- localStorage.removeItem('subtotal');
95
+ if (!this.isBrowser)
96
+ return;
97
+ this.sessionStorageRef?.removeItem('state');
98
+ this.localStorageRef?.removeItem('state');
99
+ this.localStorageRef?.removeItem('dataRedirect');
100
+ this.localStorageRef?.removeItem('dataDecidir');
101
+ this.localStorageRef?.removeItem('message');
102
+ this.localStorageRef?.removeItem('subMessage');
103
+ this.localStorageRef?.removeItem('subtotal');
92
104
  };
93
105
  clickClose = () => {
94
106
  this.closeModal = 'cancel';
@@ -96,14 +108,18 @@ export class DecidirEcComponent extends ComponentHelper {
96
108
  this.processError('Se cancelo el pago con Decidir');
97
109
  };
98
110
  showMessage = () => {
99
- let message = localStorage.getItem('message') || undefined;
100
- let subMessage = localStorage.getItem('subMessage') || undefined;
111
+ if (!this.isBrowser || !this.localStorageRef)
112
+ return;
113
+ let message = this.localStorageRef.getItem('message') || undefined;
114
+ let subMessage = this.localStorageRef.getItem('subMessage') || undefined;
101
115
  message && this.toastrService.show(message, {}, '', { closeButton: true, timeOut: 6000 });
102
116
  subMessage && this.toastrService.show(subMessage, {}, '', { closeButton: true, timeOut: 6000 });
103
117
  };
104
118
  callState = () => {
119
+ if (!this.isBrowser || !this.localStorageRef)
120
+ return;
105
121
  try {
106
- let state = this.closeModal != '' ? this.closeModal : localStorage.getItem('state');
122
+ let state = this.closeModal != '' ? this.closeModal : this.localStorageRef.getItem('state');
107
123
  this.loading = true;
108
124
  state && this.showMessage();
109
125
  if (state) {
@@ -138,16 +154,20 @@ export class DecidirEcComponent extends ComponentHelper {
138
154
  // console.log("ERROR ENVIO BACK ", err);
139
155
  };
140
156
  getCheckoutDecidir = () => {
157
+ if (!this.isBrowser)
158
+ return;
141
159
  this.loading = true;
142
160
  this.dataDecidir = this.method;
143
161
  this.url = this.sanitizer.bypassSecurityTrustResourceUrl('assets/decidirFormEc.html');
144
162
  this.loading = false;
145
163
  // Escuchar mensajes del iframe para manejar la comunicación
146
- window.addEventListener('message', this.handleIframeMessage.bind(this), false);
164
+ this.windowRef?.addEventListener('message', this.messageListener, false);
147
165
  };
148
166
  handleIframeMessage = (event) => {
149
167
  // Verificar el origen por seguridad
150
- if (event.origin !== window.location.origin) {
168
+ if (!this.isBrowser || !this.windowRef)
169
+ return;
170
+ if (event.origin !== this.windowRef.location.origin) {
151
171
  return;
152
172
  }
153
173
  if (event.data && event.data.type === 'DECIDIR_PAYMENT') {
@@ -156,6 +176,8 @@ export class DecidirEcComponent extends ComponentHelper {
156
176
  }
157
177
  };
158
178
  processPayment = (paymentData) => {
179
+ if (!this.isBrowser)
180
+ return;
159
181
  this.loading = true;
160
182
  this.connection.post('shop-api/' + this.consts.getChannel() + '/decidir/' + this.cartService.cartToken + '/process-payment')
161
183
  .subscribe({
@@ -163,41 +185,43 @@ export class DecidirEcComponent extends ComponentHelper {
163
185
  this.loading = false;
164
186
  // console.log('Respuesta del backend:', response);
165
187
  if (response.status === 'approved' || response.status === 'partially_authorized') {
166
- localStorage.setItem('state', response.status === 'approved' ? 'success' : 'partially_authorized');
188
+ this.localStorageRef?.setItem('state', response.status === 'approved' ? 'success' : 'partially_authorized');
167
189
  if (response.message)
168
- localStorage.setItem('message', response.message);
190
+ this.localStorageRef?.setItem('message', response.message);
169
191
  if (response.subMessage)
170
- localStorage.setItem('subMessage', response.subMessage);
192
+ this.localStorageRef?.setItem('subMessage', response.subMessage);
171
193
  this.callState();
172
194
  }
173
195
  else {
174
- localStorage.setItem('state', 'failure');
196
+ this.localStorageRef?.setItem('state', 'failure');
175
197
  if (response.message)
176
- localStorage.setItem('message', response.message);
198
+ this.localStorageRef?.setItem('message', response.message);
177
199
  if (response.subMessage)
178
- localStorage.setItem('subMessage', response.subMessage);
200
+ this.localStorageRef?.setItem('subMessage', response.subMessage);
179
201
  this.callState();
180
202
  }
181
203
  },
182
204
  error: (error) => {
183
205
  this.loading = false;
184
206
  console.error('Error processing payment:', error);
185
- localStorage.setItem('state', 'failure');
207
+ this.localStorageRef?.setItem('state', 'failure');
186
208
  this.processError('Error al procesar el pago');
187
209
  this.callState();
188
210
  }
189
211
  });
190
212
  };
191
213
  resizeIframe = (obj) => {
214
+ if (!this.isBrowser || typeof document === 'undefined' || !obj.contentWindow || !obj.contentWindow.document)
215
+ return;
192
216
  obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
193
217
  obj.style.width = obj.contentWindow.document.body.scrollWidth + 'px';
194
218
  };
195
219
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecidirEcComponent, deps: [{ token: i0.Renderer2 }, { token: i1.ConnectionService }, { token: i2.ToastService }, { token: i3.CoreConstantsService }, { token: i3.ApiConstantsService }, { token: i4.CartService }, { token: i5.ActivatedRoute }, { token: i6.DomSanitizer }, { token: i7.ParametersService }], target: i0.ɵɵFactoryTarget.Component });
196
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DecidirEcComponent, isStandalone: true, selector: "app-decidir-ec", inputs: { paymentServiceInst: "paymentServiceInst", method: "method", total_amount: "total_amount", allData: "allData", user_data: "user_data" }, outputs: { ready: "ready" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"text-center\">\r\n <h3>Continuar con el pago en Decidir</h3>\r\n @if (method) {\r\n <p class=\"px-5\">{{ method.description }}</p>\r\n <p class=\"px-5\">{{ method.instructions }}</p>\r\n }\r\n @if (!loading) {\r\n <button class=\"btn btn-outline-secondary comprar\" (click)=\"openModal()\">Pagar</button>\r\n } @else {\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n </div>\r\n\r\n@if (showModal) {\r\n<div class=\"modal-backdrop\" (click)=\"clickClose()\">\r\n <div class=\"modal-dialog modal-lg\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-content\">\r\n\r\n <div class=\"modal-body\">\r\n <div class=\"payment-container\">\r\n \r\n <!-- Iframe del formulario de decidir -->\r\n <div class=\"iframe-container\">\r\n <iframe [src]=\"url\" frameborder=\"0\" class=\"payment-iframe\"></iframe>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n", styles: [".modal-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0009;display:flex;justify-content:center;align-items:center;z-index:1050;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal-dialog{max-width:90%;max-height:90%;width:800px;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d;animation:modalFadeIn .3s ease-out}.modal-dialog.modal-lg{max-width:900px;width:90%}@keyframes modalFadeIn{0%{opacity:0;transform:scale(.9) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-content{display:flex;flex-direction:column;height:100%;border:none;border-radius:16px;background:#fff}.modal-header{padding:1.5rem 2rem;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#f8f9fa,#e9ecef);display:flex;justify-content:space-between;align-items:center;position:relative}.modal-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.modal-header .modal-title{margin:0;font-size:1.5rem;font-weight:700;color:#2c3e50;text-shadow:0 1px 2px rgba(0,0,0,.1)}.modal-header .btn-close{background:none;border:none;font-size:1.8rem;color:#6c757d;cursor:pointer;padding:0;width:35px;height:35px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:all .3s ease;position:relative}.modal-header .btn-close:hover{background-color:#dc3545;color:#fff;transform:rotate(90deg);box-shadow:0 4px 12px #dc35454d}.modal-header .btn-close:active{transform:rotate(90deg) scale(.95)}.modal-body{padding:0;flex:1;overflow:hidden;background:#fff}.payment-container{height:100%;display:flex;flex-direction:column;background:#fff}.cards-accepted{padding:1.5rem 2rem;text-align:center;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#fff,#f8f9fa);position:relative}.cards-accepted:after{content:\"\";position:absolute;bottom:0;left:5%;right:5%;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.cards-accepted .cards-img{height:45px;max-width:100%;object-fit:contain;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1));transition:transform .2s ease}.cards-accepted .cards-img:hover{transform:scale(1.05)}.iframe-container{flex:1;padding:1.5rem;background:#fff;position:relative}.iframe-container:before{content:\"\";position:absolute;top:0;left:1.5rem;right:1.5rem;height:1px;background:linear-gradient(90deg,transparent 0%,#e9ecef 50%,transparent 100%)}.payment-iframe{width:100%;height:620px;border:none;border-radius:12px;background:#fff;box-shadow:inset 0 2px 8px #0000000d}.half-width{width:49%!important}.ml-1{margin-left:1%}#card-form{height:450px}.iframeStyle{height:520px;width:100%}@media only screen and (max-width: 1024px){.modal-dialog,.modal-dialog.modal-lg{max-width:95%;width:95%}.payment-iframe{height:650px}.modal-header{padding:1rem 1.5rem}.modal-header .modal-title{font-size:1.125rem}.cards-accepted{padding:.75rem 1.5rem}}@media only screen and (max-width: 680px){.modal-dialog{max-width:98%;width:98%;margin:1rem;max-height:calc(100vh - 2rem)}.modal-dialog.modal-lg{max-width:98%;width:98%}.payment-iframe{height:550px}.modal-header{padding:1rem}.modal-header .modal-title{font-size:1rem}.modal-header .btn-close{width:28px;height:28px;font-size:1.25rem}.cards-accepted{padding:.5rem 1rem}.cards-accepted .cards-img{height:35px}.iframe-container{padding:.5rem}}@media only screen and (max-width: 480px){.modal-dialog{margin:.5rem;max-height:calc(100vh - 1rem);border-radius:8px}.modal-content{border-radius:8px}.payment-iframe{height:500px}.cards-accepted .cards-img{height:30px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }] });
220
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DecidirEcComponent, isStandalone: true, selector: "app-decidir-ec", inputs: { paymentServiceInst: "paymentServiceInst", method: "method", total_amount: "total_amount", allData: "allData", user_data: "user_data" }, outputs: { ready: "ready" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"text-center\">\r\n <h3>Continuar con el pago en Decidir</h3>\r\n @if (method) {\r\n <p class=\"px-5\">{{ method.description }}</p>\r\n <p class=\"px-5\">{{ method.instructions }}</p>\r\n }\r\n @if (!loading) {\r\n <button class=\"btn btn-outline-secondary comprar\" (click)=\"openModal()\">Pagar</button>\r\n } @else {\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n </div>\r\n\r\n@if (showModal) {\r\n<div class=\"modal-backdrop\" (click)=\"clickClose()\">\r\n <div class=\"modal-dialog modal-lg\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-content\">\r\n\r\n <div class=\"modal-body\">\r\n <div class=\"payment-container\">\r\n \r\n <!-- Iframe del formulario de decidir -->\r\n <div class=\"iframe-container\">\r\n <iframe [src]=\"url\" frameborder=\"0\" class=\"payment-iframe\"></iframe>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n", styles: [".modal-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0009;display:flex;justify-content:center;align-items:center;z-index:1050;backdrop-filter:blur(2px)}.modal-dialog{max-width:90%;max-height:90%;width:800px;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d;animation:modalFadeIn .3s ease-out}.modal-dialog.modal-lg{max-width:900px;width:90%}@keyframes modalFadeIn{0%{opacity:0;transform:scale(.9) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-content{display:flex;flex-direction:column;height:100%;border:none;border-radius:16px;background:#fff}.modal-header{padding:1.5rem 2rem;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#f8f9fa,#e9ecef);display:flex;justify-content:space-between;align-items:center;position:relative}.modal-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.modal-header .modal-title{margin:0;font-size:1.5rem;font-weight:700;color:#2c3e50;text-shadow:0 1px 2px rgba(0,0,0,.1)}.modal-header .btn-close{background:none;border:none;font-size:1.8rem;color:#6c757d;cursor:pointer;padding:0;width:35px;height:35px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:all .3s ease;position:relative}.modal-header .btn-close:hover{background-color:#dc3545;color:#fff;transform:rotate(90deg);box-shadow:0 4px 12px #dc35454d}.modal-header .btn-close:active{transform:rotate(90deg) scale(.95)}.modal-body{padding:0;flex:1;overflow:hidden;background:#fff}.payment-container{height:100%;display:flex;flex-direction:column;background:#fff}.cards-accepted{padding:1.5rem 2rem;text-align:center;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#fff,#f8f9fa);position:relative}.cards-accepted:after{content:\"\";position:absolute;bottom:0;left:5%;right:5%;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.cards-accepted .cards-img{height:45px;max-width:100%;object-fit:contain;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1));transition:transform .2s ease}.cards-accepted .cards-img:hover{transform:scale(1.05)}.iframe-container{flex:1;padding:1.5rem;background:#fff;position:relative}.iframe-container:before{content:\"\";position:absolute;top:0;left:1.5rem;right:1.5rem;height:1px;background:linear-gradient(90deg,transparent 0%,#e9ecef 50%,transparent 100%)}.payment-iframe{width:100%;height:620px;border:none;border-radius:12px;background:#fff;box-shadow:inset 0 2px 8px #0000000d}.half-width{width:49%!important}.ml-1{margin-left:1%}#card-form{height:450px}.iframeStyle{height:520px;width:100%}@media only screen and (max-width: 1024px){.modal-dialog,.modal-dialog.modal-lg{max-width:95%;width:95%}.payment-iframe{height:650px}.modal-header{padding:1rem 1.5rem}.modal-header .modal-title{font-size:1.125rem}.cards-accepted{padding:.75rem 1.5rem}}@media only screen and (max-width: 680px){.modal-dialog{max-width:98%;width:98%;margin:1rem;max-height:calc(100vh - 2rem)}.modal-dialog.modal-lg{max-width:98%;width:98%}.payment-iframe{height:550px}.modal-header{padding:1rem}.modal-header .modal-title{font-size:1rem}.modal-header .btn-close{width:28px;height:28px;font-size:1.25rem}.cards-accepted{padding:.5rem 1rem}.cards-accepted .cards-img{height:35px}.iframe-container{padding:.5rem}}@media only screen and (max-width: 480px){.modal-dialog{margin:.5rem;max-height:calc(100vh - 1rem);border-radius:8px}.modal-content{border-radius:8px}.payment-iframe{height:500px}.cards-accepted .cards-img{height:30px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }] });
197
221
  }
198
222
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecidirEcComponent, decorators: [{
199
223
  type: Component,
200
- args: [{ selector: 'app-decidir-ec', standalone: true, imports: [CommonModule, FormsModule, LoadingFullEcComponent], template: "<div class=\"text-center\">\r\n <h3>Continuar con el pago en Decidir</h3>\r\n @if (method) {\r\n <p class=\"px-5\">{{ method.description }}</p>\r\n <p class=\"px-5\">{{ method.instructions }}</p>\r\n }\r\n @if (!loading) {\r\n <button class=\"btn btn-outline-secondary comprar\" (click)=\"openModal()\">Pagar</button>\r\n } @else {\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n </div>\r\n\r\n@if (showModal) {\r\n<div class=\"modal-backdrop\" (click)=\"clickClose()\">\r\n <div class=\"modal-dialog modal-lg\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-content\">\r\n\r\n <div class=\"modal-body\">\r\n <div class=\"payment-container\">\r\n \r\n <!-- Iframe del formulario de decidir -->\r\n <div class=\"iframe-container\">\r\n <iframe [src]=\"url\" frameborder=\"0\" class=\"payment-iframe\"></iframe>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n", styles: [".modal-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0009;display:flex;justify-content:center;align-items:center;z-index:1050;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal-dialog{max-width:90%;max-height:90%;width:800px;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d;animation:modalFadeIn .3s ease-out}.modal-dialog.modal-lg{max-width:900px;width:90%}@keyframes modalFadeIn{0%{opacity:0;transform:scale(.9) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-content{display:flex;flex-direction:column;height:100%;border:none;border-radius:16px;background:#fff}.modal-header{padding:1.5rem 2rem;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#f8f9fa,#e9ecef);display:flex;justify-content:space-between;align-items:center;position:relative}.modal-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.modal-header .modal-title{margin:0;font-size:1.5rem;font-weight:700;color:#2c3e50;text-shadow:0 1px 2px rgba(0,0,0,.1)}.modal-header .btn-close{background:none;border:none;font-size:1.8rem;color:#6c757d;cursor:pointer;padding:0;width:35px;height:35px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:all .3s ease;position:relative}.modal-header .btn-close:hover{background-color:#dc3545;color:#fff;transform:rotate(90deg);box-shadow:0 4px 12px #dc35454d}.modal-header .btn-close:active{transform:rotate(90deg) scale(.95)}.modal-body{padding:0;flex:1;overflow:hidden;background:#fff}.payment-container{height:100%;display:flex;flex-direction:column;background:#fff}.cards-accepted{padding:1.5rem 2rem;text-align:center;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#fff,#f8f9fa);position:relative}.cards-accepted:after{content:\"\";position:absolute;bottom:0;left:5%;right:5%;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.cards-accepted .cards-img{height:45px;max-width:100%;object-fit:contain;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1));transition:transform .2s ease}.cards-accepted .cards-img:hover{transform:scale(1.05)}.iframe-container{flex:1;padding:1.5rem;background:#fff;position:relative}.iframe-container:before{content:\"\";position:absolute;top:0;left:1.5rem;right:1.5rem;height:1px;background:linear-gradient(90deg,transparent 0%,#e9ecef 50%,transparent 100%)}.payment-iframe{width:100%;height:620px;border:none;border-radius:12px;background:#fff;box-shadow:inset 0 2px 8px #0000000d}.half-width{width:49%!important}.ml-1{margin-left:1%}#card-form{height:450px}.iframeStyle{height:520px;width:100%}@media only screen and (max-width: 1024px){.modal-dialog,.modal-dialog.modal-lg{max-width:95%;width:95%}.payment-iframe{height:650px}.modal-header{padding:1rem 1.5rem}.modal-header .modal-title{font-size:1.125rem}.cards-accepted{padding:.75rem 1.5rem}}@media only screen and (max-width: 680px){.modal-dialog{max-width:98%;width:98%;margin:1rem;max-height:calc(100vh - 2rem)}.modal-dialog.modal-lg{max-width:98%;width:98%}.payment-iframe{height:550px}.modal-header{padding:1rem}.modal-header .modal-title{font-size:1rem}.modal-header .btn-close{width:28px;height:28px;font-size:1.25rem}.cards-accepted{padding:.5rem 1rem}.cards-accepted .cards-img{height:35px}.iframe-container{padding:.5rem}}@media only screen and (max-width: 480px){.modal-dialog{margin:.5rem;max-height:calc(100vh - 1rem);border-radius:8px}.modal-content{border-radius:8px}.payment-iframe{height:500px}.cards-accepted .cards-img{height:30px}}\n"] }]
224
+ args: [{ selector: 'app-decidir-ec', standalone: true, imports: [CommonModule, FormsModule, LoadingFullEcComponent], template: "<div class=\"text-center\">\r\n <h3>Continuar con el pago en Decidir</h3>\r\n @if (method) {\r\n <p class=\"px-5\">{{ method.description }}</p>\r\n <p class=\"px-5\">{{ method.instructions }}</p>\r\n }\r\n @if (!loading) {\r\n <button class=\"btn btn-outline-secondary comprar\" (click)=\"openModal()\">Pagar</button>\r\n } @else {\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n }\r\n </div>\r\n\r\n@if (showModal) {\r\n<div class=\"modal-backdrop\" (click)=\"clickClose()\">\r\n <div class=\"modal-dialog modal-lg\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-content\">\r\n\r\n <div class=\"modal-body\">\r\n <div class=\"payment-container\">\r\n \r\n <!-- Iframe del formulario de decidir -->\r\n <div class=\"iframe-container\">\r\n <iframe [src]=\"url\" frameborder=\"0\" class=\"payment-iframe\"></iframe>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n", styles: [".modal-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0009;display:flex;justify-content:center;align-items:center;z-index:1050;backdrop-filter:blur(2px)}.modal-dialog{max-width:90%;max-height:90%;width:800px;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d;animation:modalFadeIn .3s ease-out}.modal-dialog.modal-lg{max-width:900px;width:90%}@keyframes modalFadeIn{0%{opacity:0;transform:scale(.9) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-content{display:flex;flex-direction:column;height:100%;border:none;border-radius:16px;background:#fff}.modal-header{padding:1.5rem 2rem;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#f8f9fa,#e9ecef);display:flex;justify-content:space-between;align-items:center;position:relative}.modal-header:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.modal-header .modal-title{margin:0;font-size:1.5rem;font-weight:700;color:#2c3e50;text-shadow:0 1px 2px rgba(0,0,0,.1)}.modal-header .btn-close{background:none;border:none;font-size:1.8rem;color:#6c757d;cursor:pointer;padding:0;width:35px;height:35px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:all .3s ease;position:relative}.modal-header .btn-close:hover{background-color:#dc3545;color:#fff;transform:rotate(90deg);box-shadow:0 4px 12px #dc35454d}.modal-header .btn-close:active{transform:rotate(90deg) scale(.95)}.modal-body{padding:0;flex:1;overflow:hidden;background:#fff}.payment-container{height:100%;display:flex;flex-direction:column;background:#fff}.cards-accepted{padding:1.5rem 2rem;text-align:center;border-bottom:1px solid #e9ecef;background:linear-gradient(135deg,#fff,#f8f9fa);position:relative}.cards-accepted:after{content:\"\";position:absolute;bottom:0;left:5%;right:5%;height:1px;background:linear-gradient(90deg,transparent 0%,#dee2e6 50%,transparent 100%)}.cards-accepted .cards-img{height:45px;max-width:100%;object-fit:contain;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1));transition:transform .2s ease}.cards-accepted .cards-img:hover{transform:scale(1.05)}.iframe-container{flex:1;padding:1.5rem;background:#fff;position:relative}.iframe-container:before{content:\"\";position:absolute;top:0;left:1.5rem;right:1.5rem;height:1px;background:linear-gradient(90deg,transparent 0%,#e9ecef 50%,transparent 100%)}.payment-iframe{width:100%;height:620px;border:none;border-radius:12px;background:#fff;box-shadow:inset 0 2px 8px #0000000d}.half-width{width:49%!important}.ml-1{margin-left:1%}#card-form{height:450px}.iframeStyle{height:520px;width:100%}@media only screen and (max-width: 1024px){.modal-dialog,.modal-dialog.modal-lg{max-width:95%;width:95%}.payment-iframe{height:650px}.modal-header{padding:1rem 1.5rem}.modal-header .modal-title{font-size:1.125rem}.cards-accepted{padding:.75rem 1.5rem}}@media only screen and (max-width: 680px){.modal-dialog{max-width:98%;width:98%;margin:1rem;max-height:calc(100vh - 2rem)}.modal-dialog.modal-lg{max-width:98%;width:98%}.payment-iframe{height:550px}.modal-header{padding:1rem}.modal-header .modal-title{font-size:1rem}.modal-header .btn-close{width:28px;height:28px;font-size:1.25rem}.cards-accepted{padding:.5rem 1rem}.cards-accepted .cards-img{height:35px}.iframe-container{padding:.5rem}}@media only screen and (max-width: 480px){.modal-dialog{margin:.5rem;max-height:calc(100vh - 1rem);border-radius:8px}.modal-content{border-radius:8px}.payment-iframe{height:500px}.cards-accepted .cards-img{height:30px}}\n"] }]
201
225
  }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i1.ConnectionService }, { type: i2.ToastService }, { type: i3.CoreConstantsService }, { type: i3.ApiConstantsService }, { type: i4.CartService }, { type: i5.ActivatedRoute }, { type: i6.DomSanitizer }, { type: i7.ParametersService }], propDecorators: { paymentServiceInst: [{
202
226
  type: Input
203
227
  }], method: [{
@@ -211,4 +235,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
211
235
  }], ready: [{
212
236
  type: Output
213
237
  }] } });
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaWRpci1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL2RlY2lkaXItZWMvZGVjaWRpci1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL2RlY2lkaXItZWMvZGVjaWRpci1lYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBc0IsS0FBSyxFQUF3QixZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxXQUFXLEVBQVUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFPcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFVcEQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGVBQWU7SUFzQmhDO0lBQ1I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTVCRixrQkFBa0IsQ0FBTTtJQUN4QixNQUFNLEdBQTBFLElBQUksQ0FBQztJQUNyRixZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLE9BQU8sQ0FBTTtJQUNiLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDaEIsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDM0IsUUFBUSxHQUFlLElBQUksQ0FBQztJQUM1QixXQUFXLENBQU07SUFFcEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixXQUFXLEdB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S0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPdXRwdXQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIFJlbmRlcmVyMiwgT25DaGFuZ2VzLCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gXCIuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXJcIjtcclxuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcGkvY29ubmVjdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlLCBBcGlDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9lYy1zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IExvYWRpbmdGdWxsRWNDb21wb25lbnQgfSBmcm9tICcuLi9sb2FkaW5nJztcclxuZGVjbGFyZSB2YXIgJDogYW55XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLWRlY2lkaXItZWMnLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIHRlbXBsYXRlVXJsOiAnZGVjaWRpci1lYy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnZGVjaWRpci1lYy5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIExvYWRpbmdGdWxsRWNDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZWNpZGlyRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuXHJcbiAgICBASW5wdXQoKSBwYXltZW50U2VydmljZUluc3Q6IGFueTtcclxuICAgIEBJbnB1dCgpIG1ldGhvZDogeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcclxuICAgIEBJbnB1dCgpIHRvdGFsX2Ftb3VudCA9IDA7XHJcbiAgICBASW5wdXQoKSBhbGxEYXRhOiBhbnk7XHJcbiAgICBASW5wdXQoKSB1c2VyX2RhdGEgPSBudWxsO1xyXG4gICAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJvdGVjdGVkIG1vZGFsUmVmOiBhbnkgfCBudWxsID0gbnVsbDtcclxuICAgIHByb3RlY3RlZCBkYXRhRGVjaWRpcjogYW55O1xyXG5cclxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNEb2JsZUF1dGggPSBmYWxzZTtcclxuICAgIHB1YmxpYyB1cmxzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHVibGljIHVybDogU2FmZVJlc291cmNlVXJsIHwgdW5kZWZpbmVkO1xyXG4gICAgcHVibGljIGNsb3NlTW9kYWwgPSAnJ1xyXG4gICAgcHVibGljIHBhcmFtc01lbnNhamUgPSAnJ1xyXG4gICAgcHVibGljIHZlbnRhbmE6IGFueVxyXG4gICAgcHVibGljIHBhcmFtczogYW55XHJcbiAgICBwdWJsaWMgc2hvd01vZGFsID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgZGF0YVJlZGlyZWN0ID0gKCkgPT4gdGhpcy5hcGlDb25zdHMuZ2V0VXJsQmFzZSgpICsgJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2RlY2lkaXIvJyArIHRoaXMuY2FydFNlcnZpY2UuY2FydFRva2VuICsgJy9wcm9jZXNzLXBheW1lbnQnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHB1YmxpYyBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvcmVDb25zdGFudHNTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBhcGlDb25zdHM6IEFwaUNvbnN0YW50c1NlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYWN0aXZlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICAgICAgcHVibGljIHBhcmFtc1NlcnZpY2U6IFBhcmFtZXRlcnNTZXJ2aWNlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuZ2V0Q2hlY2tvdXREZWNpZGlyKClcclxuICAgICAgICB0aGlzLnBhcmFtc1NlcnZpY2UuZ2V0UGFyYW1ldGVycygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSByZXNcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMuaGFzUGFyYW1zKHJlcywncGFydGlhbGx5X2F1dGhvcml6ZWRfZGVjaWRpcicpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtc01lbnNhamUgPSAodHlwZW9mIHBhcmFtVmFsdWUgPT09ICdzdHJpbmcnID8gcGFyYW1WYWx1ZSA6IG51bGwpIHx8ICdTZSBlc3TDoSBwcm9jZXNhbmRvIGVsIHBhZ28gY29uIHRhcmpldGEuJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZWNPbkluaXQoKVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIC8vIFJlbW92ZXIgZWwgbGlzdGVuZXIgZGUgbWVuc2FqZXNcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlSWZyYW1lTWVzc2FnZSwgZmFsc2UpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiU0UgREVTVFJPWkFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJTRSBDQU1CSU9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3Blbk1vZGFsKCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJTdG9yYWdlU3RhdGUoKVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXRhUmVkaXJlY3QnLCB0aGlzLmRhdGFSZWRpcmVjdCgpKVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXRhRGVjaWRpcicsIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgLi4udGhpcy5tZXRob2QsXHJcbiAgICAgICAgICAgIHRvdGFsX2Ftb3VudDogdGhpcy50b3RhbF9hbW91bnRcclxuICAgICAgICB9KSlcclxuICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N1YnRvdGFsJywgdGhpcy50b3RhbF9hbW91bnQudG9TdHJpbmcoKSlcclxuICAgICAgICB0aGlzLnNob3dNb2RhbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsID0gJydcclxuICAgICAgICB0aGlzLmNhbGxTdGF0ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTdG9yYWdlU3RhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhdGUnKVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzdGF0ZScpXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2RhdGFSZWRpcmVjdCcpXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2RhdGFEZWNpZGlyJylcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbWVzc2FnZScpXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3N1Yk1lc3NhZ2UnKVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzdWJ0b3RhbCcpXHJcbiAgICB9XHJcblxyXG4gICAgY2xpY2tDbG9zZSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWwgPSAnY2FuY2VsJ1xyXG4gICAgICAgIHRoaXMuc2hvd01vZGFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoJ1NlIGNhbmNlbG8gZWwgcGFnbyBjb24gRGVjaWRpcicpXHJcbiAgICB9XHJcblxyXG4gICAgc2hvd01lc3NhZ2UgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVzc2FnZScpIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgIGxldCBzdWJNZXNzYWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N1Yk1lc3NhZ2UnKSB8fCB1bmRlZmluZWRcclxuICAgICAgICBtZXNzYWdlICYmIHRoaXMudG9hc3RyU2VydmljZS5zaG93KG1lc3NhZ2Use30sJycsIHtjbG9zZUJ1dHRvbjp0cnVlLHRpbWVPdXQ6NjAwMH0pO1xyXG4gICAgICAgIHN1Yk1lc3NhZ2UgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coc3ViTWVzc2FnZSx7fSwnJywge2Nsb3NlQnV0dG9uOnRydWUsdGltZU91dDo2MDAwfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNhbGxTdGF0ZSA9ICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmNsb3NlTW9kYWwgIT0gJycgPyB0aGlzLmNsb3NlTW9kYWwgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3RhdGUnKVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXHJcbiAgICAgICAgICAgIHN0YXRlICYmIHRoaXMuc2hvd01lc3NhZ2UoKTtcclxuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2VTdGF0ZSgpXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkeS5lbWl0KHRydWUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ3BhcnRpYWxseV9hdXRob3JpemVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZHkuZW1pdCh0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKHRoaXMucGFyYW1zTWVuc2FqZSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAnY2FuY2VsJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICdmYWlsdXJlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKCcnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TW9kYWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGUoKVxyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NFcnJvciA9IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KGVyciAhPSAnJyA/IGVyciA6ICdwYXltZW50LWVycm9yJyk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJFUlJPUiBFTlZJTyBCQUNLICBcIiwgZXJyKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja291dERlY2lkaXIgPSAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZGF0YURlY2lkaXIgPSB0aGlzLm1ldGhvZDtcclxuICAgICAgICB0aGlzLnVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnYXNzZXRzL2RlY2lkaXJGb3JtRWMuaHRtbCcpXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcclxuICAgICAgICBcclxuICAgICAgICAvLyBFc2N1Y2hhciBtZW5zYWplcyBkZWwgaWZyYW1lIHBhcmEgbWFuZWphciBsYSBjb211bmljYWNpw7NuXHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZUlmcmFtZU1lc3NhZ2UuYmluZCh0aGlzKSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUlmcmFtZU1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xyXG4gICAgICAgIC8vIFZlcmlmaWNhciBlbCBvcmlnZW4gcG9yIHNlZ3VyaWRhZFxyXG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gIT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS50eXBlID09PSAnREVDSURJUl9QQVlNRU5UJykge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRGVjaWRpckNvbXBvbmVudCAtIFByb2Nlc2FuZG8gcGFnbyBjb24gcGF5bG9hZDonLCBldmVudC5kYXRhLnBheWxvYWQpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NQYXltZW50KGV2ZW50LmRhdGEucGF5bG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NQYXltZW50ID0gKHBheW1lbnREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QoJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2RlY2lkaXIvJyArIHRoaXMuY2FydFNlcnZpY2UuY2FydFRva2VuICsgJy9wcm9jZXNzLXBheW1lbnQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1Jlc3B1ZXN0YSBkZWwgYmFja2VuZDonLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2FwcHJvdmVkJyB8fCByZXNwb25zZS5zdGF0dXMgPT09ICdwYXJ0aWFsbHlfYXV0aG9yaXplZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXRlJywgcmVzcG9uc2Uuc3RhdHVzID09PSAnYXBwcm92ZWQnID8gJ3N1Y2Nlc3MnIDogJ3BhcnRpYWxseV9hdXRob3JpemVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlKSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbWVzc2FnZScsIHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3ViTWVzc2FnZSkgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N1Yk1lc3NhZ2UnLCByZXNwb25zZS5zdWJNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc3RhdGUnLCAnZmFpbHVyZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZSkgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21lc3NhZ2UnLCByZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Yk1lc3NhZ2UpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzdWJNZXNzYWdlJywgcmVzcG9uc2Uuc3ViTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgcGF5bWVudDonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXRlJywgJ2ZhaWx1cmUnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignRXJyb3IgYWwgcHJvY2VzYXIgZWwgcGFnbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2l6ZUlmcmFtZSA9IChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgIG9iai5zdHlsZS5oZWlnaHQgPSBvYmouY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XHJcbiAgICAgICAgb2JqLnN0eWxlLndpZHRoID0gb2JqLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCArICdweCc7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgIDxoMz5Db250aW51YXIgY29uIGVsIHBhZ28gZW4gRGVjaWRpcjwvaDM+XHJcbiAgICBAaWYgKG1ldGhvZCkge1xyXG4gICAgPHAgY2xhc3M9XCJweC01XCI+e3sgbWV0aG9kLmRlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgPHAgY2xhc3M9XCJweC01XCI+e3sgbWV0aG9kLmluc3RydWN0aW9ucyB9fTwvcD5cclxuICAgIH1cclxuICAgIEBpZiAoIWxvYWRpbmcpIHtcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjb21wcmFyXCIgKGNsaWNrKT1cIm9wZW5Nb2RhbCgpXCI+UGFnYXI8L2J1dHRvbj5cclxuICAgIH0gQGVsc2Uge1xyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXNpdGZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XHJcbiAgICAgICAgPGFwcC1sb2FkaW5nLWZ1bGwtZWM+PC9hcHAtbG9hZGluZy1mdWxsLWVjPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICA8L2Rpdj5cclxuXHJcbkBpZiAoc2hvd01vZGFsKSB7XHJcbjxkaXYgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcFwiIChjbGljayk9XCJjbGlja0Nsb3NlKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF5bWVudC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSWZyYW1lIGRlbCBmb3JtdWxhcmlvIGRlIGRlY2lkaXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlmcmFtZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBbc3JjXT1cInVybFwiIGZyYW1lYm9yZGVyPVwiMFwiIGNsYXNzPVwicGF5bWVudC1pZnJhbWVcIj48L2lmcmFtZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxufVxyXG4iXX0=
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaWRpci1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL2RlY2lkaXItZWMvZGVjaWRpci1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL2RlY2lkaXItZWMvZGVjaWRpci1lYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBc0IsS0FBSyxFQUF3QixZQUFZLEVBQWEsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFdBQVcsRUFBVSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQU9wRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7OztBQVVwRCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsZUFBZTtJQTRCaEM7SUFDUjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbENGLGtCQUFrQixDQUFNO0lBQ3hCLE1BQU0sR0FBMEUsSUFBSSxDQUFDO0lBQ3JGLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsT0FBTyxDQUFNO0lBQ2IsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNoQixLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzQixRQUFRLEdBQWUsSUFBSSxDQUFDO0lBQzVCLFdBQVcsQ0FBTTtJQUVwQixP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RkFBbEIsa0JBQWtCLHFTQ3JCL0IsdXNDQWlDQSwrbEhEZGMsWUFBWSw4QkFBRSxXQUFXLCtCQUFFLHNCQUFzQjs7NEZBRWxELGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDSSxnQkFBZ0IsY0FDZCxJQUFJLFdBR1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixDQUFDO2dVQUluRCxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPdXRwdXQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIFJlbmRlcmVyMiwgT25DaGFuZ2VzLCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgaW5qZWN0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tIFwiLi4vLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyXCI7XHJcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JlQ29uc3RhbnRzU2VydmljZSwgQXBpQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMvY2FydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwsIFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9lYy1zZXJ2aWNlcy9wYXJhbWV0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMb2FkaW5nRnVsbEVjQ29tcG9uZW50IH0gZnJvbSAnLi4vbG9hZGluZyc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1kZWNpZGlyLWVjJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2RlY2lkaXItZWMuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJ2RlY2lkaXItZWMuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBMb2FkaW5nRnVsbEVjQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVjaWRpckVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcblxyXG4gICAgQElucHV0KCkgcGF5bWVudFNlcnZpY2VJbnN0OiBhbnk7XHJcbiAgICBASW5wdXQoKSBtZXRob2Q6IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgY29kZT86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XHJcbiAgICBASW5wdXQoKSB0b3RhbF9hbW91bnQgPSAwO1xyXG4gICAgQElucHV0KCkgYWxsRGF0YTogYW55O1xyXG4gICAgQElucHV0KCkgdXNlcl9kYXRhID0gbnVsbDtcclxuICAgIEBPdXRwdXQoKSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByb3RlY3RlZCBtb2RhbFJlZjogYW55IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcm90ZWN0ZWQgZGF0YURlY2lkaXI6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgcHVibGljIGlzRG9ibGVBdXRoID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdXJsczogYW55W10gPSBbXTtcclxuICAgIHB1YmxpYyB1cmw6IFNhZmVSZXNvdXJjZVVybCB8IHVuZGVmaW5lZDtcclxuICAgIHB1YmxpYyBjbG9zZU1vZGFsID0gJydcclxuICAgIHB1YmxpYyBwYXJhbXNNZW5zYWplID0gJydcclxuICAgIHB1YmxpYyB2ZW50YW5hOiBhbnlcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueVxyXG4gICAgcHVibGljIHNob3dNb2RhbCA9IGZhbHNlO1xyXG4gICAgcHJvdGVjdGVkIGRhdGFSZWRpcmVjdCA9ICgpID0+IHRoaXMuYXBpQ29uc3RzLmdldFVybEJhc2UoKSArICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJy9kZWNpZGlyLycgKyB0aGlzLmNhcnRTZXJ2aWNlLmNhcnRUb2tlbiArICcvcHJvY2Vzcy1wYXltZW50JztcclxuICAgIHByaXZhdGUgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XHJcbiAgICBwcml2YXRlIGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XHJcbiAgICBwcml2YXRlIHdpbmRvd1JlZiA9IHRoaXMuaXNCcm93c2VyID8gd2luZG93IDogbnVsbDtcclxuICAgIHByaXZhdGUgbG9jYWxTdG9yYWdlUmVmID0gdGhpcy53aW5kb3dSZWY/LmxvY2FsU3RvcmFnZSA/PyBudWxsO1xyXG4gICAgcHJpdmF0ZSBzZXNzaW9uU3RvcmFnZVJlZiA9IHRoaXMud2luZG93UmVmPy5zZXNzaW9uU3RvcmFnZSA/PyBudWxsO1xyXG4gICAgcHJpdmF0ZSBtZXNzYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4gdGhpcy5oYW5kbGVJZnJhbWVNZXNzYWdlKGV2ZW50KTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwdWJsaWMgY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb3JlQ29uc3RhbnRzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYXBpQ29uc3RzOiBBcGlDb25zdGFudHNTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGFjdGl2ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmdldENoZWNrb3V0RGVjaWRpcigpXHJcbiAgICAgICAgdGhpcy5wYXJhbXNTZXJ2aWNlLmdldFBhcmFtZXRlcnMoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gcmVzXHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLmhhc1BhcmFtcyhyZXMsJ3BhcnRpYWxseV9hdXRob3JpemVkX2RlY2lkaXInKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXNNZW5zYWplID0gKHR5cGVvZiBwYXJhbVZhbHVlID09PSAnc3RyaW5nJyA/IHBhcmFtVmFsdWUgOiBudWxsKSB8fCAnU2UgZXN0w6EgcHJvY2VzYW5kbyBlbCBwYWdvIGNvbiB0YXJqZXRhLidcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmVjT25Jbml0KClcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICAvLyBSZW1vdmVyIGVsIGxpc3RlbmVyIGRlIG1lbnNhamVzXHJcbiAgICAgICAgaWYgKHRoaXMuaXNCcm93c2VyICYmIHRoaXMud2luZG93UmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2luZG93UmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLm1lc3NhZ2VMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiU0UgREVTVFJPWkFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJTRSBDQU1CSU9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3Blbk1vZGFsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMubG9jYWxTdG9yYWdlUmVmKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJTdG9yYWdlU3RhdGUoKVxyXG4gICAgICAgIHRoaXMubG9jYWxTdG9yYWdlUmVmLnNldEl0ZW0oJ2RhdGFSZWRpcmVjdCcsIHRoaXMuZGF0YVJlZGlyZWN0KCkpXHJcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VSZWYuc2V0SXRlbSgnZGF0YURlY2lkaXInLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMubWV0aG9kLFxyXG4gICAgICAgICAgICB0b3RhbF9hbW91bnQ6IHRoaXMudG90YWxfYW1vdW50XHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlUmVmLnNldEl0ZW0oJ3N1YnRvdGFsJywgdGhpcy50b3RhbF9hbW91bnQudG9TdHJpbmcoKSlcclxuICAgICAgICB0aGlzLnNob3dNb2RhbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsID0gJydcclxuICAgICAgICB0aGlzLmNhbGxTdGF0ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTdG9yYWdlU3RhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQnJvd3NlcikgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlUmVmPy5yZW1vdmVJdGVtKCdzdGF0ZScpXHJcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VSZWY/LnJlbW92ZUl0ZW0oJ3N0YXRlJylcclxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVJlZj8ucmVtb3ZlSXRlbSgnZGF0YVJlZGlyZWN0JylcclxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVJlZj8ucmVtb3ZlSXRlbSgnZGF0YURlY2lkaXInKVxyXG4gICAgICAgIHRoaXMubG9jYWxTdG9yYWdlUmVmPy5yZW1vdmVJdGVtKCdtZXNzYWdlJylcclxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVJlZj8ucmVtb3ZlSXRlbSgnc3ViTWVzc2FnZScpXHJcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VSZWY/LnJlbW92ZUl0ZW0oJ3N1YnRvdGFsJylcclxuICAgIH1cclxuXHJcbiAgICBjbGlja0Nsb3NlID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCA9ICdjYW5jZWwnXHJcbiAgICAgICAgdGhpcy5zaG93TW9kYWwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignU2UgY2FuY2VsbyBlbCBwYWdvIGNvbiBEZWNpZGlyJylcclxuICAgIH1cclxuXHJcbiAgICBzaG93TWVzc2FnZSA9ICgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmxvY2FsU3RvcmFnZVJlZikgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHRoaXMubG9jYWxTdG9yYWdlUmVmLmdldEl0ZW0oJ21lc3NhZ2UnKSB8fCB1bmRlZmluZWRcclxuICAgICAgICBsZXQgc3ViTWVzc2FnZSA9IHRoaXMubG9jYWxTdG9yYWdlUmVmLmdldEl0ZW0oJ3N1Yk1lc3NhZ2UnKSB8fCB1bmRlZmluZWRcclxuICAgICAgICBtZXNzYWdlICYmIHRoaXMudG9hc3RyU2VydmljZS5zaG93KG1lc3NhZ2Use30sJycsIHtjbG9zZUJ1dHRvbjp0cnVlLHRpbWVPdXQ6NjAwMH0pO1xyXG4gICAgICAgIHN1Yk1lc3NhZ2UgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coc3ViTWVzc2FnZSx7fSwnJywge2Nsb3NlQnV0dG9uOnRydWUsdGltZU91dDo2MDAwfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNhbGxTdGF0ZSA9ICgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmxvY2FsU3RvcmFnZVJlZikgcmV0dXJuO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvc2VNb2RhbCAhPSAnJyA/IHRoaXMuY2xvc2VNb2RhbCA6IHRoaXMubG9jYWxTdG9yYWdlUmVmLmdldEl0ZW0oJ3N0YXRlJylcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICBzdGF0ZSAmJiB0aGlzLnNob3dNZXNzYWdlKCk7XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTdG9yYWdlU3RhdGUoKVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZHkuZW1pdCh0cnVlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICdwYXJ0aWFsbHlfYXV0aG9yaXplZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWR5LmVtaXQodHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcih0aGlzLnBhcmFtc01lbnNhamUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ2NhbmNlbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAnZmFpbHVyZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01vZGFsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlKClcclxuICAgICAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnIgIT0gJycgPyBlcnIgOiAncGF5bWVudC1lcnJvcicpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRVJST1IgRU5WSU8gQkFDSyAgXCIsIGVycik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tvdXREZWNpZGlyID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXHJcbiAgICAgICAgdGhpcy5kYXRhRGVjaWRpciA9IHRoaXMubWV0aG9kO1xyXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCdhc3NldHMvZGVjaWRpckZvcm1FYy5odG1sJylcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEVzY3VjaGFyIG1lbnNhamVzIGRlbCBpZnJhbWUgcGFyYSBtYW5lamFyIGxhIGNvbXVuaWNhY2nDs25cclxuICAgIHRoaXMud2luZG93UmVmPy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5tZXNzYWdlTGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUlmcmFtZU1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xyXG4gICAgICAgIC8vIFZlcmlmaWNhciBlbCBvcmlnZW4gcG9yIHNlZ3VyaWRhZFxyXG4gICAgICAgIGlmICghdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMud2luZG93UmVmKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gIT09IHRoaXMud2luZG93UmVmLmxvY2F0aW9uLm9yaWdpbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLnR5cGUgPT09ICdERUNJRElSX1BBWU1FTlQnKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdEZWNpZGlyQ29tcG9uZW50IC0gUHJvY2VzYW5kbyBwYWdvIGNvbiBwYXlsb2FkOicsIGV2ZW50LmRhdGEucGF5bG9hZCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BheW1lbnQoZXZlbnQuZGF0YS5wYXlsb2FkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1BheW1lbnQgPSAocGF5bWVudERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QoJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2RlY2lkaXIvJyArIHRoaXMuY2FydFNlcnZpY2UuY2FydFRva2VuICsgJy9wcm9jZXNzLXBheW1lbnQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1Jlc3B1ZXN0YSBkZWwgYmFja2VuZDonLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2FwcHJvdmVkJyB8fCByZXNwb25zZS5zdGF0dXMgPT09ICdwYXJ0aWFsbHlfYXV0aG9yaXplZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VSZWY/LnNldEl0ZW0oJ3N0YXRlJywgcmVzcG9uc2Uuc3RhdHVzID09PSAnYXBwcm92ZWQnID8gJ3N1Y2Nlc3MnIDogJ3BhcnRpYWxseV9hdXRob3JpemVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlKSB0aGlzLmxvY2FsU3RvcmFnZVJlZj8uc2V0SXRlbSgnbWVzc2FnZScsIHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3ViTWVzc2FnZSkgdGhpcy5sb2NhbFN0b3JhZ2VSZWY/LnNldEl0ZW0oJ3N1Yk1lc3NhZ2UnLCByZXNwb25zZS5zdWJNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVJlZj8uc2V0SXRlbSgnc3RhdGUnLCAnZmFpbHVyZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZSkgdGhpcy5sb2NhbFN0b3JhZ2VSZWY/LnNldEl0ZW0oJ21lc3NhZ2UnLCByZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Yk1lc3NhZ2UpIHRoaXMubG9jYWxTdG9yYWdlUmVmPy5zZXRJdGVtKCdzdWJNZXNzYWdlJywgcmVzcG9uc2Uuc3ViTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgcGF5bWVudDonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VSZWY/LnNldEl0ZW0oJ3N0YXRlJywgJ2ZhaWx1cmUnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignRXJyb3IgYWwgcHJvY2VzYXIgZWwgcGFnbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2l6ZUlmcmFtZSA9IChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Jyb3dzZXIgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhb2JqLmNvbnRlbnRXaW5kb3cgfHwgIW9iai5jb250ZW50V2luZG93LmRvY3VtZW50KSByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgb2JqLnN0eWxlLmhlaWdodCA9IG9iai5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICBvYmouc3R5bGUud2lkdGggPSBvYmouY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoICsgJ3B4JztcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbiIsIjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgPGgzPkNvbnRpbnVhciBjb24gZWwgcGFnbyBlbiBEZWNpZGlyPC9oMz5cclxuICAgIEBpZiAobWV0aG9kKSB7XHJcbiAgICA8cCBjbGFzcz1cInB4LTVcIj57eyBtZXRob2QuZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICA8cCBjbGFzcz1cInB4LTVcIj57eyBtZXRob2QuaW5zdHJ1Y3Rpb25zIH19PC9wPlxyXG4gICAgfVxyXG4gICAgQGlmICghbG9hZGluZykge1xyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNvbXByYXJcIiAoY2xpY2spPVwib3Blbk1vZGFsKClcIj5QYWdhcjwvYnV0dG9uPlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c2l0ZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuQGlmIChzaG93TW9kYWwpIHtcclxuPGRpdiBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsaWNrQ2xvc2UoKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJZnJhbWUgZGVsIGZvcm11bGFyaW8gZGUgZGVjaWRpciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWZyYW1lLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIFtzcmNdPVwidXJsXCIgZnJhbWVib3JkZXI9XCIwXCIgY2xhc3M9XCJwYXltZW50LWlmcmFtZVwiPjwvaWZyYW1lPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcbiJdfQ==
@@ -2,5 +2,6 @@ export * from './loading';
2
2
  export * from './price-ec/price-ec.component';
3
3
  export * from './re-captcha-ec/re-captcha-ec.component';
4
4
  export * from './magnizoom-ec/magnizoom-ec.component';
5
+ export * from './redsys-catch-ec/redsys-catch-ec.component';
5
6
  // export * from './rating-ec/rating-ec.component';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELG1EQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbG9hZGluZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtZWMvcHJpY2UtZWMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9yZS1jYXB0Y2hhLWVjL3JlLWNhcHRjaGEtZWMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9tYWduaXpvb20tZWMvbWFnbml6b29tLWVjLmNvbXBvbmVudCc7XHJcbi8vIGV4cG9ydCAqIGZyb20gJy4vcmF0aW5nLWVjL3JhdGluZy1lYy5jb21wb25lbnQnOyJdfQ==
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsNkNBQTZDLENBQUM7QUFDNUQsbURBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCAqIGZyb20gJy4vbG9hZGluZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtZWMvcHJpY2UtZWMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9yZS1jYXB0Y2hhLWVjL3JlLWNhcHRjaGEtZWMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9tYWduaXpvb20tZWMvbWFnbml6b29tLWVjLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vcmVkc3lzLWNhdGNoLWVjL3JlZHN5cy1jYXRjaC1lYy5jb21wb25lbnQnO1xyXG4vLyBleHBvcnQgKiBmcm9tICcuL3JhdGluZy1lYy9yYXRpbmctZWMuY29tcG9uZW50JzsiXX0=
@@ -0,0 +1,193 @@
1
+ import { Component, Inject, PLATFORM_ID } from '@angular/core';
2
+ import { combineLatest } from 'rxjs';
3
+ import { ComponentHelper } from '../../../classes/component-helper';
4
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
5
+ import { DOCUMENT } from '@angular/common';
6
+ import { LoadingFullEcComponent } from '../loading/loading-full-ec/loading-full-ec.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ import * as i2 from "../../../ec-services";
10
+ import * as i3 from "@angular/common";
11
+ /**
12
+ * Catch genérico para redirecciones de pagos.
13
+ * - Normaliza el estado recibido por params/query.
14
+ * - Informa el resultado al opener (postMessage), BroadcastChannel y localStorage.
15
+ * - Intenta cerrarse; si el cierre falla, redirige según el estado.
16
+ */
17
+ export class RedsysCatchEcComponent extends ComponentHelper {
18
+ activedRoute;
19
+ router;
20
+ checkoutService;
21
+ renderer;
22
+ elementRef;
23
+ document;
24
+ platformId;
25
+ message = '';
26
+ subscription = null;
27
+ sid = '';
28
+ bc;
29
+ constructor(activedRoute, router, checkoutService, renderer, elementRef, document, platformId) {
30
+ super();
31
+ this.activedRoute = activedRoute;
32
+ this.router = router;
33
+ this.checkoutService = checkoutService;
34
+ this.renderer = renderer;
35
+ this.elementRef = elementRef;
36
+ this.document = document;
37
+ this.platformId = platformId;
38
+ this.hideHeaderFooter();
39
+ this.ecOnConstruct();
40
+ }
41
+ ngOnInit() {
42
+ if (isPlatformBrowser(this.platformId) && 'BroadcastChannel' in window) {
43
+ this.bc = new BroadcastChannel('mp_payment');
44
+ }
45
+ this.subscription = combineLatest([this.activedRoute.params, this.activedRoute.queryParams])
46
+ .subscribe(([routeParams, q]) => {
47
+ let stateStr = routeParams['state'];
48
+ if (stateStr === 'statuspayment')
49
+ stateStr = q['status'];
50
+ const statusParam = (stateStr || q['status'] || q['state'] || '').toString();
51
+ const state = this.normalizeState(statusParam);
52
+ this.sid = (q['sid'] || (isPlatformBrowser(this.platformId) ? localStorage.getItem('mp:sid') : '') || '').toString();
53
+ this.storeTotalAmount(q);
54
+ this.setStateInLocal('Su pago fue procesado con éxito.', state);
55
+ this.signalState(state);
56
+ this.tryCloseSelf(() => {
57
+ const target = (state === 'success' || state === 'pending')
58
+ ? ['/checkout/order_success']
59
+ : ['/checkout'];
60
+ setTimeout(() => this.router.navigate(target), 4500);
61
+ });
62
+ });
63
+ this.ecOnInit();
64
+ }
65
+ ngOnDestroy() {
66
+ this.subscription?.unsubscribe();
67
+ this.bc?.close();
68
+ this.showHeaderFooter();
69
+ }
70
+ /** Guarda total_amount si viene desde el PSP. */
71
+ storeTotalAmount(queryParams) {
72
+ const totalAmount = queryParams['total_amount'];
73
+ if (totalAmount && isPlatformBrowser(this.platformId)) {
74
+ localStorage.setItem('total_amount', totalAmount);
75
+ }
76
+ }
77
+ /** Setea mensaje y estado en storages. */
78
+ setStateInLocal = (mensaje, state) => {
79
+ this.message = mensaje;
80
+ if (!isPlatformBrowser(this.platformId))
81
+ return;
82
+ try {
83
+ localStorage.setItem('state', state);
84
+ }
85
+ catch { }
86
+ try {
87
+ sessionStorage.setItem('modalnews', 'false');
88
+ }
89
+ catch { }
90
+ };
91
+ /** Normaliza estados heterogéneos de distintos gateways. */
92
+ normalizeState(raw) {
93
+ const v = (raw || '').toLowerCase();
94
+ if (v === '200' || v === 'ok' || v === 'success')
95
+ return 'success';
96
+ if (v === 'pending')
97
+ return 'pending';
98
+ if (v === 'cancel')
99
+ return 'cancel';
100
+ return 'failure'; // failure, 0, error, rejected, chargeback, desconocidos
101
+ }
102
+ /**
103
+ * Informa el resultado: postMessage al opener, BroadcastChannel y localStorage
104
+ * (este último permite polling en la pestaña madre).
105
+ */
106
+ signalState(state) {
107
+ if (!isPlatformBrowser(this.platformId))
108
+ return;
109
+ const sid = this.sid || localStorage.getItem('mp:sid') || '';
110
+ const payload = { type: 'mp:state', sid, state };
111
+ try {
112
+ window.opener && window.opener.postMessage(payload, '*');
113
+ }
114
+ catch { }
115
+ try {
116
+ this.bc?.postMessage(payload);
117
+ }
118
+ catch { }
119
+ try {
120
+ localStorage.setItem(`mp:state:${sid}`, state);
121
+ }
122
+ catch { }
123
+ try {
124
+ localStorage.setItem('state', state);
125
+ }
126
+ catch { }
127
+ }
128
+ /** Intenta cerrar la pestaña actual; si falla, ejecuta el callback de fallback. */
129
+ tryCloseSelf(onFail) {
130
+ if (!isPlatformBrowser(this.platformId))
131
+ return onFail();
132
+ let attempted = false;
133
+ try {
134
+ window.close();
135
+ attempted = true;
136
+ }
137
+ catch { }
138
+ if (!attempted)
139
+ onFail();
140
+ }
141
+ /** Oculta header/footer para esta pantalla mínima. */
142
+ hideHeaderFooter() {
143
+ if (!isPlatformBrowser(this.platformId) || !this.document)
144
+ return;
145
+ const header = this.document.querySelector('header');
146
+ const footer = this.document.querySelector('footer');
147
+ if (header)
148
+ this.renderer.setStyle(header, 'display', 'none');
149
+ if (footer)
150
+ this.renderer.setStyle(footer, 'display', 'none');
151
+ }
152
+ /** Restaura header/footer al salir. */
153
+ showHeaderFooter() {
154
+ if (!isPlatformBrowser(this.platformId) || !this.document)
155
+ return;
156
+ const header = this.document.querySelector('header');
157
+ const footer = this.document.querySelector('footer');
158
+ if (header)
159
+ this.renderer.removeStyle(header, 'display');
160
+ if (footer)
161
+ this.renderer.removeStyle(footer, 'display');
162
+ }
163
+ setStateInSession(mensaje, state) {
164
+ this.message = mensaje;
165
+ if (!isPlatformBrowser(this.platformId))
166
+ return;
167
+ try {
168
+ sessionStorage.setItem('state', state);
169
+ }
170
+ catch { }
171
+ try {
172
+ localStorage.setItem('state', state);
173
+ }
174
+ catch { }
175
+ try {
176
+ sessionStorage.setItem('modalnews', 'false');
177
+ }
178
+ catch { }
179
+ }
180
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RedsysCatchEcComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.CheckoutService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
181
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RedsysCatchEcComponent, isStandalone: true, selector: "app-redsys-catch-ec", usesInheritance: true, ngImport: i0, template: "<div id=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col align-self-center\">\r\n <h4 class=\"titpage center-block text-center font-nexa font-lg my-3\">{{ message | uppercase }}</h4>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col align-self-center\">\r\n <h5 class=\"center-block text-center font-nexa my-3\">Redirigiendo en segundos...</h5>\r\n <br>\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".loader{border:16px solid #f3f3f3;border-top:16px solid #dc3545;border-radius:50%;width:50px;height:50px;animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.flex-container{display:flex;justify-content:center;align-items:center;height:80vh;width:100%}.flex-container>div{width:90%;height:100px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }] });
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RedsysCatchEcComponent, decorators: [{
184
+ type: Component,
185
+ args: [{ selector: 'app-redsys-catch-ec', standalone: true, imports: [CommonModule, LoadingFullEcComponent], template: "<div id=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col align-self-center\">\r\n <h4 class=\"titpage center-block text-center font-nexa font-lg my-3\">{{ message | uppercase }}</h4>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col align-self-center\">\r\n <h5 class=\"center-block text-center font-nexa my-3\">Redirigiendo en segundos...</h5>\r\n <br>\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".loader{border:16px solid #f3f3f3;border-top:16px solid #dc3545;border-radius:50%;width:50px;height:50px;animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.flex-container{display:flex;justify-content:center;align-items:center;height:80vh;width:100%}.flex-container>div{width:90%;height:100px}\n"] }]
186
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.CheckoutService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: Document, decorators: [{
187
+ type: Inject,
188
+ args: [DOCUMENT]
189
+ }] }, { type: undefined, decorators: [{
190
+ type: Inject,
191
+ args: [PLATFORM_ID]
192
+ }] }] });
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkc3lzLWNhdGNoLWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1jb21wb25lbnRzL3dpZGdldHMtZWMvcmVkc3lzLWNhdGNoLWVjL3JlZHN5cy1jYXRjaC1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy93aWRnZXRzLWVjL3JlZHN5cy1jYXRjaC1lYy9yZWRzeXMtY2F0Y2gtZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBNEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7QUFJOUY7Ozs7O0dBS0c7QUFRSCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsZUFBZTtJQVE1QztJQUNBO0lBQ0E7SUFDQztJQUNBO0lBQ2tCO0lBQ0c7SUFaMUIsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNaLFlBQVksR0FBd0IsSUFBSSxDQUFDO0lBQ3pDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDVCxFQUFFLENBQW9CO0lBRTlCLFlBQ1csWUFBNEIsRUFDNUIsTUFBYyxFQUNkLGVBQWdDLEVBQy9CLFFBQW1CLEVBQ25CLFVBQXNCLEVB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R0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFPO1FBQ2hELElBQUksQ0FBQztZQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDO1lBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUM7WUFBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUFDLENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7d0dBaklRLHNCQUFzQix3SkFhbkIsUUFBUSxhQUNSLFdBQVc7NEZBZGQsc0JBQXNCLHNHQ3pCbkMseXBCQWVNLG1aRE1RLFlBQVksNEZBQUUsc0JBQXNCOzs0RkFJckMsc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNJLHFCQUFxQixjQUNuQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLENBQUM7OzBCQWlCMUMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzJztcclxuaW1wb3J0IHsgQ2hlY2tvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZWMtc2VydmljZXMnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBMb2FkaW5nRnVsbEVjQ29tcG9uZW50IH0gZnJvbSAnLi4vbG9hZGluZy9sb2FkaW5nLWZ1bGwtZWMvbG9hZGluZy1mdWxsLWVjLmNvbXBvbmVudCc7XHJcblxyXG50eXBlIE1wU3RhdGUgPSAnc3VjY2VzcycgfCAncGVuZGluZycgfCAnZmFpbHVyZScgfCAnY2FuY2VsJztcclxuXHJcbi8qKlxyXG4gKiBDYXRjaCBnZW7DqXJpY28gcGFyYSByZWRpcmVjY2lvbmVzIGRlIHBhZ29zLlxyXG4gKiAtIE5vcm1hbGl6YSBlbCBlc3RhZG8gcmVjaWJpZG8gcG9yIHBhcmFtcy9xdWVyeS5cclxuICogLSBJbmZvcm1hIGVsIHJlc3VsdGFkbyBhbCBvcGVuZXIgKHBvc3RNZXNzYWdlKSwgQnJvYWRjYXN0Q2hhbm5lbCB5IGxvY2FsU3RvcmFnZS5cclxuICogLSBJbnRlbnRhIGNlcnJhcnNlOyBzaSBlbCBjaWVycmUgZmFsbGEsIHJlZGlyaWdlIHNlZ8O6biBlbCBlc3RhZG8uXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLXJlZHN5cy1jYXRjaC1lYycsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTG9hZGluZ0Z1bGxFY0NvbXBvbmVudF0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVkc3lzLWNhdGNoLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3JlZHN5cy1jYXRjaC1lYy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWRzeXNDYXRjaEVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIHB1YmxpYyBtZXNzYWdlID0gJyc7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIHNpZCA9ICcnO1xyXG4gICAgcHJpdmF0ZSBiYz86IEJyb2FkY2FzdENoYW5uZWw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIGFjdGl2ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHB1YmxpYyBjaGVja291dFNlcnZpY2U6IENoZWNrb3V0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxyXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55XHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmhpZGVIZWFkZXJGb290ZXIoKTtcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSAmJiAnQnJvYWRjYXN0Q2hhbm5lbCcgaW4gd2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmMgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCgnbXBfcGF5bWVudCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmFjdGl2ZWRSb3V0ZS5wYXJhbXMsIHRoaXMuYWN0aXZlZFJvdXRlLnF1ZXJ5UGFyYW1zXSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3JvdXRlUGFyYW1zLCBxXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlU3RyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByb3V0ZVBhcmFtc1snc3RhdGUnXTtcclxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZVN0ciA9PT0gJ3N0YXR1c3BheW1lbnQnKSBzdGF0ZVN0ciA9IHFbJ3N0YXR1cyddO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c1BhcmFtID0gKHN0YXRlU3RyIHx8IHFbJ3N0YXR1cyddIHx8IHFbJ3N0YXRlJ10gfHwgJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMubm9ybWFsaXplU3RhdGUoc3RhdHVzUGFyYW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2lkID0gKHFbJ3NpZCddIHx8IChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21wOnNpZCcpIDogJycpIHx8ICcnKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZVRvdGFsQW1vdW50KHEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGVJbkxvY2FsKCdTdSBwYWdvIGZ1ZSBwcm9jZXNhZG8gY29uIMOpeGl0by4nLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25hbFN0YXRlKHN0YXRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeUNsb3NlU2VsZigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gKHN0YXRlID09PSAnc3VjY2VzcycgfHwgc3RhdGUgPT09ICdwZW5kaW5nJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbJy9jaGVja291dC9vcmRlcl9zdWNjZXNzJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbJy9jaGVja291dCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUodGFyZ2V0KSwgNDUwMCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMuYmM/LmNsb3NlKCk7XHJcbiAgICAgICAgdGhpcy5zaG93SGVhZGVyRm9vdGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEd1YXJkYSB0b3RhbF9hbW91bnQgc2kgdmllbmUgZGVzZGUgZWwgUFNQLiAqL1xyXG4gICAgcHJpdmF0ZSBzdG9yZVRvdGFsQW1vdW50KHF1ZXJ5UGFyYW1zOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHF1ZXJ5UGFyYW1zWyd0b3RhbF9hbW91bnQnXTtcclxuICAgICAgICBpZiAodG90YWxBbW91bnQgJiYgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG90YWxfYW1vdW50JywgdG90YWxBbW91bnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogU2V0ZWEgbWVuc2FqZSB5IGVzdGFkbyBlbiBzdG9yYWdlcy4gKi9cclxuICAgIHByaXZhdGUgc2V0U3RhdGVJbkxvY2FsID0gKG1lbnNhamU6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lbnNhamU7XHJcbiAgICAgICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcbiAgICAgICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXRlJywgc3RhdGUpOyB9IGNhdGNoIHsgfVxyXG4gICAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ21vZGFsbmV3cycsICdmYWxzZScpOyB9IGNhdGNoIHsgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBOb3JtYWxpemEgZXN0YWRvcyBoZXRlcm9nw6luZW9zIGRlIGRpc3RpbnRvcyBnYXRld2F5cy4gKi9cclxuICAgIHByaXZhdGUgbm9ybWFsaXplU3RhdGUocmF3OiBzdHJpbmcpOiBNcFN0YXRlIHtcclxuICAgICAgICBjb25zdCB2ID0gKHJhdyB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAodiA9PT0gJzIwMCcgfHwgdiA9PT0gJ29rJyB8fCB2ID09PSAnc3VjY2VzcycpIHJldHVybiAnc3VjY2Vzcyc7XHJcbiAgICAgICAgaWYgKHYgPT09ICdwZW5kaW5nJykgcmV0dXJuICdwZW5kaW5nJztcclxuICAgICAgICBpZiAodiA9PT0gJ2NhbmNlbCcpIHJldHVybiAnY2FuY2VsJztcclxuICAgICAgICByZXR1cm4gJ2ZhaWx1cmUnOyAvLyBmYWlsdXJlLCAwLCBlcnJvciwgcmVqZWN0ZWQsIGNoYXJnZWJhY2ssIGRlc2Nvbm9jaWRvc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5mb3JtYSBlbCByZXN1bHRhZG86IHBvc3RNZXNzYWdlIGFsIG9wZW5lciwgQnJvYWRjYXN0Q2hhbm5lbCB5IGxvY2FsU3RvcmFnZVxyXG4gICAgICogKGVzdGUgw7psdGltbyBwZXJtaXRlIHBvbGxpbmcgZW4gbGEgcGVzdGHDsWEgbWFkcmUpLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNpZ25hbFN0YXRlKHN0YXRlOiBNcFN0YXRlKSB7XHJcbiAgICAgICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc2lkID0gdGhpcy5zaWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21wOnNpZCcpIHx8ICcnO1xyXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IHR5cGU6ICdtcDpzdGF0ZScsIHNpZCwgc3RhdGUgfTtcclxuXHJcbiAgICAgICAgdHJ5IHsgd2luZG93Lm9wZW5lciAmJiB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKHBheWxvYWQsICcqJyk7IH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5iYz8ucG9zdE1lc3NhZ2UocGF5bG9hZCk7IH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYG1wOnN0YXRlOiR7c2lkfWAsIHN0YXRlKTsgfSBjYXRjaCB7IH1cclxuICAgICAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc3RhdGUnLCBzdGF0ZSk7IH0gY2F0Y2ggeyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEludGVudGEgY2VycmFyIGxhIHBlc3Rhw7FhIGFjdHVhbDsgc2kgZmFsbGEsIGVqZWN1dGEgZWwgY2FsbGJhY2sgZGUgZmFsbGJhY2suICovXHJcbiAgICBwcml2YXRlIHRyeUNsb3NlU2VsZihvbkZhaWw6ICgpID0+IHZvaWQpIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBvbkZhaWwoKTtcclxuICAgICAgICBsZXQgYXR0ZW1wdGVkID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHsgd2luZG93LmNsb3NlKCk7IGF0dGVtcHRlZCA9IHRydWU7IH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgaWYgKCFhdHRlbXB0ZWQpIG9uRmFpbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBPY3VsdGEgaGVhZGVyL2Zvb3RlciBwYXJhIGVzdGEgcGFudGFsbGEgbcOtbmltYS4gKi9cclxuICAgIHByaXZhdGUgaGlkZUhlYWRlckZvb3RlcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgfHwgIXRoaXMuZG9jdW1lbnQpIHJldHVybjtcclxuICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9vdGVyJyk7XHJcbiAgICAgICAgaWYgKGhlYWRlcikgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXIsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgICBpZiAoZm9vdGVyKSB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGZvb3RlciwgJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXN0YXVyYSBoZWFkZXIvZm9vdGVyIGFsIHNhbGlyLiAqL1xyXG4gICAgcHJpdmF0ZSBzaG93SGVhZGVyRm9vdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSB8fCAhdGhpcy5kb2N1bWVudCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJyk7XHJcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb290ZXInKTtcclxuICAgICAgICBpZiAoaGVhZGVyKSB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGhlYWRlciwgJ2Rpc3BsYXknKTtcclxuICAgICAgICBpZiAoZm9vdGVyKSB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGZvb3RlciwgJ2Rpc3BsYXknKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFN0YXRlSW5TZXNzaW9uKG1lbnNhamU6IHN0cmluZywgc3RhdGU6IE1wU3RhdGUpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZW5zYWplO1xyXG4gICAgICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG4gICAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3N0YXRlJywgc3RhdGUpOyB9IGNhdGNoIHsgfVxyXG4gICAgICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzdGF0ZScsIHN0YXRlKTsgfSBjYXRjaCB7IH1cclxuICAgICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdtb2RhbG5ld3MnLCAnZmFsc2UnKTsgfSBjYXRjaCB7IH1cclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXYgaWQ9XCJjb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cInRpdHBhZ2UgY2VudGVyLWJsb2NrIHRleHQtY2VudGVyIGZvbnQtbmV4YSBmb250LWxnIG15LTNcIj57eyBtZXNzYWdlIHwgdXBwZXJjYXNlIH19PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgYWxpZ24tc2VsZi1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2VudGVyLWJsb2NrIHRleHQtY2VudGVyIGZvbnQtbmV4YSBteS0zXCI+UmVkaXJpZ2llbmRvIGVuIHNlZ3VuZG9zLi4uPC9oNT5cclxuICAgICAgICAgICAgPGJyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c2l0ZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWxvYWRpbmctZnVsbC1lYz48L2FwcC1sb2FkaW5nLWZ1bGwtZWM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==