ng-easycommerce 0.0.689 → 0.0.690

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.
@@ -17,120 +17,302 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
17
17
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
18
  return c > 3 && r && Object.defineProperty(target, key, r), r;
19
19
  };
20
- import { Component, Output, OnInit, ViewChild, ElementRef, Input, Renderer2, Inject, OnChanges, EventEmitter, OnDestroy, TemplateRef } from '@angular/core';
21
- import { ActivatedRoute } from '@angular/router';
22
- import { ComponentHelper } from "../../../classes/component-helper";
23
- import { ConnectionService } from '../../../api/connection.service';
20
+ var __values = (this && this.__values) || function(o) {
21
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
22
+ if (m) return m.call(o);
23
+ if (o && typeof o.length === "number") return {
24
+ next: function () {
25
+ if (o && i >= o.length) o = void 0;
26
+ return { value: o && o[i++], done: !o };
27
+ }
28
+ };
29
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
30
+ };
31
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
32
+ import { ComponentHelper } from '../../../classes/component-helper';
24
33
  import { ToastService } from '../../../utils/toast.service';
25
- import { Constants } from '../../../core.consts';
26
34
  import { CartService } from '../../../services/cart.service';
27
- import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';
28
- import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
29
35
  var MobbexEcComponent = /** @class */ (function (_super) {
30
36
  __extends(MobbexEcComponent, _super);
31
- function MobbexEcComponent(renderer, connection, toastrService, consts, cartService, toastr, activedRoute, sanitizer, modalService) {
37
+ function MobbexEcComponent(toastrService, cartService) {
32
38
  var _this = _super.call(this) || this;
33
- _this.renderer = renderer;
34
- _this.connection = connection;
35
39
  _this.toastrService = toastrService;
36
- _this.consts = consts;
37
40
  _this.cartService = cartService;
38
- _this.toastr = toastr;
39
- _this.activedRoute = activedRoute;
40
- _this.sanitizer = sanitizer;
41
- _this.modalService = modalService;
42
41
  _this.method = null;
43
42
  _this.total_amount = 0;
44
43
  _this.user_data = null;
45
44
  _this.ready = new EventEmitter();
46
- _this.loading = false;
47
- _this.isDobleAuth = false;
48
- _this.urls = [];
49
- _this.closeModal = '';
50
- _this.dataRedirect = function () { return _this.consts.getUrlBase() + 'shop-api/' + _this.consts.getChannel() + '/redsys/redirect/' + _this.cartService.cart_token + '/process-payment'; };
51
- _this.clearStorageState = function () {
52
- sessionStorage.removeItem('state');
53
- localStorage.removeItem('state');
54
- };
55
- _this.clickClose = function () {
56
- _this.closeModal = 'cancel';
57
- _this.modalRef.hide();
58
- _this.processError('Se cancelo el pago con mobbex');
59
- };
60
- _this.callState = function () {
45
+ _this.loading = true;
46
+ _this.processing = false;
47
+ _this.url = null;
48
+ _this.checkoutData = null;
49
+ _this.popup = null;
50
+ _this.pollTimer = null;
51
+ _this.startedAt = 0;
52
+ _this.finished = false;
53
+ _this.checkoutKey = '';
54
+ _this.bc = null;
55
+ _this.checkoutRequestInFlight = false;
56
+ _this.openCheckout = function () {
57
+ if (!_this.url || _this.processing || typeof window === 'undefined')
58
+ return;
59
+ _this.clearStateKeys();
60
+ _this.finished = false;
61
+ _this.processing = true;
62
+ _this.startedAt = Date.now();
63
+ _this.popup = window.open(_this.url, '_blank');
64
+ if (!_this.popup || _this.popup.closed) {
65
+ _this.processing = false;
66
+ _this.toastrService.show('No se pudo abrir la pasarela de pago. Verifique que su navegador permita nuevas pestañas.');
67
+ return;
68
+ }
61
69
  try {
62
- var state = _this.closeModal != '' ? _this.closeModal : localStorage.getItem('state');
63
- _this.loading = true;
64
- state && console.log(state);
65
- if (state) {
66
- _this.loading = false;
67
- sessionStorage.removeItem('state');
68
- localStorage.removeItem('state');
69
- if (state == 'success') {
70
- _this.ready.emit(true);
71
- }
72
- if (state == 'cancel') {
73
- return;
74
- }
75
- if (state == 'failure') {
76
- _this.processError('');
77
- }
78
- _this.modalRef.hide();
79
- return;
80
- }
81
- setTimeout(function () {
82
- _this.callState();
83
- }, 5000);
70
+ _this.popup.opener = null;
84
71
  }
85
- catch (error) {
86
- console.error(error);
72
+ catch (_a) {
73
+ // Nothing to do.
87
74
  }
75
+ _this.startPolling();
88
76
  };
89
- _this.processError = function (err) {
90
- _this.toastrService.show(err != '' ? err : 'payment-error');
91
- console.log("ERROR ENVIO BACK ", err);
77
+ _this.cancelCheckout = function () {
78
+ if (_this.finished)
79
+ return;
80
+ _this.finishWithState('cancel', true);
92
81
  };
93
82
  _this.getCheckoutMobbex = function () {
83
+ if (_this.checkoutRequestInFlight)
84
+ return;
94
85
  _this.loading = true;
95
- _this.paymentServiceInst.getCheckoutMobbex(_this.allData).then(function (res) {
86
+ _this.checkoutRequestInFlight = true;
87
+ var payload = _this.user_data || _this.allData || {};
88
+ _this.paymentServiceInst.getCheckoutMobbex(payload).then(function (res) {
96
89
  var _a, _b, _c, _d;
97
- _this.dataMobbex = res;
98
- _this.url = ((_b = (_a = res) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.url) && _this.sanitizer.bypassSecurityTrustResourceUrl((_d = (_c = res) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.url);
90
+ _this.checkoutData = res || null;
91
+ _this.checkoutKey = String(((_b = (_a = res) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.id) || _this.cartService.cart_token || '');
92
+ _this.url = ((_d = (_c = res) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.url) || null;
93
+ _this.safeSetStorage('mobbex:checkout-id', _this.checkoutKey);
99
94
  _this.loading = false;
100
- }, function (err) {
101
- _this.processError('operation-error');
95
+ _this.checkoutRequestInFlight = false;
96
+ if (!_this.url) {
97
+ _this.processError('operation-error');
98
+ }
99
+ }, function () {
102
100
  _this.loading = false;
101
+ _this.checkoutRequestInFlight = false;
102
+ _this.processError('operation-error');
103
103
  });
104
104
  };
105
+ _this.onStorage = function (event) {
106
+ var _a;
107
+ if (!((_a = event) === null || _a === void 0 ? void 0 : _a.key) || _this.finished)
108
+ return;
109
+ if (!_this.getStateKeys().includes(event.key))
110
+ return;
111
+ var state = _this.normalizeState(event.newValue);
112
+ if (state) {
113
+ _this.finishWithState(state, true);
114
+ }
115
+ };
116
+ _this.onMessage = function (event) {
117
+ _this.onBroadcastMessage(event);
118
+ };
119
+ _this.clearStorageState = function () {
120
+ sessionStorage.removeItem('state');
121
+ localStorage.removeItem('state');
122
+ };
123
+ _this.processError = function (err) {
124
+ _this.toastrService.show(err !== '' ? err : 'payment-error');
125
+ };
105
126
  _this.ecOnConstruct();
106
127
  return _this;
107
128
  }
108
129
  MobbexEcComponent.prototype.ngOnInit = function () {
109
- this.getCheckoutMobbex();
130
+ var _this = this;
131
+ if (typeof window !== 'undefined') {
132
+ window.addEventListener('storage', this.onStorage);
133
+ window.addEventListener('message', this.onMessage);
134
+ if (window.BroadcastChannel) {
135
+ this.bc = new BroadcastChannel('mobbex_payment');
136
+ this.bc.onmessage = function (event) { return _this.onBroadcastMessage(event); };
137
+ }
138
+ }
139
+ this.loadCheckout();
110
140
  this.ecOnInit();
111
141
  };
112
142
  MobbexEcComponent.prototype.ngOnDestroy = function () {
113
- // console.log("SE DESTROZA");
143
+ if (typeof window !== 'undefined') {
144
+ window.removeEventListener('storage', this.onStorage);
145
+ window.removeEventListener('message', this.onMessage);
146
+ }
147
+ if (this.bc) {
148
+ try {
149
+ this.bc.close();
150
+ }
151
+ catch (_a) {
152
+ // Nothing to do.
153
+ }
154
+ this.bc = null;
155
+ }
156
+ this.stopPolling();
157
+ this.closePopup();
158
+ };
159
+ MobbexEcComponent.prototype.loadCheckout = function () {
160
+ if (!this.paymentServiceInst || !this.method)
161
+ return;
162
+ if (this.url && !this.loading)
163
+ return;
164
+ this.getCheckoutMobbex();
165
+ };
166
+ MobbexEcComponent.prototype.startPolling = function () {
167
+ var _this = this;
168
+ this.stopPolling();
169
+ this.pollTimer = setInterval(function () {
170
+ var _a, _b, _c, _d, _e, _f;
171
+ if (_this.finished) {
172
+ _this.stopPolling();
173
+ return;
174
+ }
175
+ var state = _this.readState();
176
+ if (state) {
177
+ _this.finishWithState(state, true);
178
+ return;
179
+ }
180
+ if ((_a = _this.popup) === null || _a === void 0 ? void 0 : _a.closed) {
181
+ _this.finishWithState('cancel', true);
182
+ return;
183
+ }
184
+ var rawTimeoutMinutes = Number((_f = (_d = (_c = (_b = _this.checkoutData) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.timeout, (_d !== null && _d !== void 0 ? _d : (_e = _this.checkoutData) === null || _e === void 0 ? void 0 : _e.timeout)), (_f !== null && _f !== void 0 ? _f : 60)));
185
+ var timeoutMinutes = Number.isFinite(rawTimeoutMinutes) && rawTimeoutMinutes > 0 ? rawTimeoutMinutes : 60;
186
+ var timeoutMs = Math.max(5, timeoutMinutes + 1) * 60 * 1000;
187
+ if (Date.now() - _this.startedAt > timeoutMs) {
188
+ _this.finishWithState('failure', true, 'Tiempo de espera agotado al procesar el pago con Mobbex.');
189
+ }
190
+ }, 1000);
191
+ };
192
+ MobbexEcComponent.prototype.onBroadcastMessage = function (event) {
193
+ var _a;
194
+ var payload = (_a = event) === null || _a === void 0 ? void 0 : _a.data;
195
+ if (!payload || payload.type !== 'mobbex:state' || this.finished)
196
+ return;
197
+ if (this.checkoutKey && payload.checkoutKey && payload.checkoutKey !== this.checkoutKey)
198
+ return;
199
+ var state = this.normalizeState(payload.state);
200
+ if (state) {
201
+ this.finishWithState(state, true);
202
+ }
203
+ };
204
+ MobbexEcComponent.prototype.finishWithState = function (state, closePopup, customMessage) {
205
+ if (closePopup === void 0) { closePopup = false; }
206
+ if (customMessage === void 0) { customMessage = ''; }
207
+ if (this.finished)
208
+ return;
209
+ this.finished = true;
210
+ this.processing = false;
211
+ this.stopPolling();
212
+ if (closePopup) {
213
+ this.closePopup();
214
+ }
215
+ this.clearStateKeys();
216
+ if (state === 'success' || state === 'pending') {
217
+ this.ready.emit(true);
218
+ return;
219
+ }
220
+ this.processError(customMessage || (state === 'cancel' ? 'Se canceló el pago con Mobbex' : ''));
114
221
  };
115
- MobbexEcComponent.prototype.ngOnChanges = function () {
116
- // console.log("SE CAMBIO");
222
+ MobbexEcComponent.prototype.readState = function () {
223
+ var e_1, _a;
224
+ var keys = this.getStateKeys();
225
+ try {
226
+ for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
227
+ var key = keys_1_1.value;
228
+ var value = this.safeGetStorage(key);
229
+ var normalized = this.normalizeState(value);
230
+ if (normalized)
231
+ return normalized;
232
+ }
233
+ }
234
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
235
+ finally {
236
+ try {
237
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
238
+ }
239
+ finally { if (e_1) throw e_1.error; }
240
+ }
241
+ return null;
117
242
  };
118
- MobbexEcComponent.prototype.openModal = function (template) {
243
+ MobbexEcComponent.prototype.normalizeState = function (value) {
244
+ var raw = String(value || '').toLowerCase();
245
+ if (!raw)
246
+ return null;
247
+ if (raw === '200' || raw === 'ok' || raw === 'success')
248
+ return 'success';
249
+ if (raw === 'pending' || raw === 'in_process' || raw === 'in_review' || raw === 'challenge')
250
+ return 'pending';
251
+ if (raw === 'cancel' || raw === '0' || raw === 'none')
252
+ return 'cancel';
253
+ if (raw === 'failure' || raw === 'error' || raw === 'expired' || raw === '401')
254
+ return 'failure';
255
+ return null;
256
+ };
257
+ MobbexEcComponent.prototype.getStateKeys = function () {
258
+ var keys = ['state'];
259
+ if (this.checkoutKey) {
260
+ keys.unshift("mobbex:state:" + this.checkoutKey);
261
+ }
262
+ return keys;
263
+ };
264
+ MobbexEcComponent.prototype.clearStateKeys = function () {
119
265
  this.clearStorageState();
120
- this.modalRef = this.modalService.show(template, { class: 'modal-lg modal-dialog-centered ', keyboard: false, backdrop: 'static', animated: true });
121
- this.closeModal = '';
122
- this.callState();
266
+ if (this.checkoutKey) {
267
+ this.safeRemoveStorage("mobbex:state:" + this.checkoutKey);
268
+ this.safeRemoveStorage('mobbex:checkout-id');
269
+ }
270
+ };
271
+ MobbexEcComponent.prototype.stopPolling = function () {
272
+ if (this.pollTimer) {
273
+ clearInterval(this.pollTimer);
274
+ this.pollTimer = null;
275
+ }
276
+ };
277
+ MobbexEcComponent.prototype.closePopup = function () {
278
+ if (!this.popup)
279
+ return;
280
+ try {
281
+ if (!this.popup.closed)
282
+ this.popup.close();
283
+ }
284
+ catch (_a) {
285
+ // Nothing to do.
286
+ }
287
+ this.popup = null;
288
+ };
289
+ MobbexEcComponent.prototype.safeGetStorage = function (key) {
290
+ try {
291
+ return localStorage.getItem(key);
292
+ }
293
+ catch (_a) {
294
+ return null;
295
+ }
296
+ };
297
+ MobbexEcComponent.prototype.safeRemoveStorage = function (key) {
298
+ try {
299
+ localStorage.removeItem(key);
300
+ }
301
+ catch (_a) {
302
+ // Nothing to do.
303
+ }
304
+ };
305
+ MobbexEcComponent.prototype.safeSetStorage = function (key, value) {
306
+ try {
307
+ localStorage.setItem(key, value);
308
+ }
309
+ catch (_a) {
310
+ // Nothing to do.
311
+ }
123
312
  };
124
313
  MobbexEcComponent.ctorParameters = function () { return [
125
- { type: Renderer2 },
126
- { type: ConnectionService },
127
- { type: ToastService },
128
- { type: Constants },
129
- { type: CartService },
130
314
  { type: ToastService },
131
- { type: ActivatedRoute },
132
- { type: DomSanitizer },
133
- { type: BsModalService }
315
+ { type: CartService }
134
316
  ]; };
135
317
  __decorate([
136
318
  Input()
@@ -150,18 +332,14 @@ var MobbexEcComponent = /** @class */ (function (_super) {
150
332
  __decorate([
151
333
  Output()
152
334
  ], MobbexEcComponent.prototype, "ready", void 0);
153
- __decorate([
154
- ViewChild('template')
155
- ], MobbexEcComponent.prototype, "template", void 0);
156
335
  MobbexEcComponent = __decorate([
157
336
  Component({
158
337
  selector: 'app-mobbex-ec',
159
- template: "<div class=\"text-center\">\n <h3>Continuar con el pago en Mobbex</h3>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.description }}</p>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.instructions }}</p>\n <ng-container *ngIf=\"!loading ; else loadingUrl\">\n <button class=\"btn btn-outline-secondary comprar\" (click)=\"openModal(template)\">Pagar</button>\n </ng-container>\n</div>\n\n<ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modalRef.hide(); loading = false;\">\n </button>\n </div>\n <div class=\"modal-body\">\n <iframe [src]=\"url\" frameborder=\"0\" class=\"iframeStyle\"></iframe>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingUrl>\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n</ng-template>",
160
- providers: [BsModalService],
161
- styles: [".half-width{width:49%!important}.ml-1{margin-left:1%}#card-form{height:450px}.iframeStyle{height:800px;width:100%;max-height:800px}"]
338
+ template: "<div class=\"text-center\">\n <h3>Continuar con el pago en Mobbex</h3>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.description }}</p>\n <p *ngIf=\"method\" class=\"px-5\">{{ method?.instructions }}</p>\n\n <ng-container *ngIf=\"loading; else checkoutReady\">\n <div class=\"d-flex flex-column justify-content-center align-items-center mt-2\">\n <app-loading-full-ec></app-loading-full-ec>\n <p class=\"mt-3 px-5 mobbex-note\">Preparando la pasarela de pago...</p>\n </div>\n </ng-container>\n\n <ng-template #checkoutReady>\n <p class=\"mt-3 px-5 mobbex-note\">\n Se abrir\u00E1 una nueva pesta\u00F1a para completar el pago.\n </p>\n\n <div class=\"d-flex flex-column align-items-center\">\n <button\n class=\"btn btn-outline-secondary comprar\"\n [disabled]=\"processing || !url\"\n (click)=\"openCheckout()\">\n Ir al sitio de Mobbex\n </button>\n\n <a\n *ngIf=\"url\"\n class=\"mt-2 small mobbex-link\"\n [href]=\"url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.preventDefault(); openCheckout()\">\n Si el bot\u00F3n no abre una nueva pesta\u00F1a, toc\u00E1 aqu\u00ED para continuar.\n </a>\n\n <button\n *ngIf=\"processing\"\n type=\"button\"\n class=\"btn btn-link text-secondary mt-2\"\n (click)=\"cancelCheckout()\">\n Cancelar pago\n </button>\n\n <p *ngIf=\"!url\" class=\"mt-2 px-5 text-danger\">\n No fue posible preparar la pasarela de pago.\n </p>\n </div>\n </ng-template>\n</div>\n",
339
+ styles: [".mobbex-note{color:#6c757d}"]
162
340
  })
163
341
  ], MobbexEcComponent);
164
342
  return MobbexEcComponent;
165
343
  }(ComponentHelper));
166
344
  export { MobbexEcComponent };
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9iYmV4LWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9lYy1jb21wb25lbnQvd2lkZ2V0cy1lYy9tb2JiZXgtZWMvbW9iYmV4LWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVKLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVNqRTtJQUF1QyxxQ0FBZTtJQW9CbEQsMkJBQW1CLFFBQW1CLEVBQzNCLFVBQTZCLEVBQzdCLGFBQTJCLEVBQzNCLE1BQWlCLEVBQ2pCLFdBQXdCLEVBQ3hCLE1BQW9CLEVBQ3BCLFlBQTRCLEVBQzVCLFNBQXVCLEVBQ3ZCLFlBQTRCO1FBUnZDLFlBU0ksaUJBQU8sU0FFVjtRQVhrQixjQUFRLEdBQVIsUUFB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WUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsaUNBQWlDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BKLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNwQixDQUFDOztnQkEvQjRCLFNBQVM7Z0JBQ2YsaUJBQWlCO2dCQUNkLFlBQVk7Z0JBQ25CLFNBQVM7Z0JBQ0osV0FBVztnQkFDaEIsWUFBWTtnQkFDTixjQUFjO2dCQUNqQixZQUFZO2dCQUNULGNBQWM7O0lBMUI5QjtRQUFSLEtBQUssRUFBRTtpRUFBb0I7SUFDbkI7UUFBUixLQUFLLEVBQUU7cURBQWU7SUFDZDtRQUFSLEtBQUssRUFBRTsyREFBa0I7SUFDakI7UUFBUixLQUFLLEVBQUU7c0RBQVM7SUFDUjtRQUFSLEtBQUssRUFBRTt3REFBa0I7SUFDaEI7UUFBVCxNQUFNLEVBQUU7b0RBQTRCO0lBQ2Q7UUFBdEIsU0FBUyxDQUFDLFVBQVUsQ0FBQzt1REFBc0M7SUFSbkQsaUJBQWlCO1FBTjdCLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLHNoQ0FBdUM7WUFFdkMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDOztTQUM5QixDQUFDO09BQ1csaUJBQWlCLENBbUg3QjtJQUFELHdCQUFDO0NBQUEsQUFuSEQsQ0FBdUMsZUFBZSxHQW1IckQ7U0FuSFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPdXRwdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgUmVuZGVyZXIyLCBJbmplY3QsIE9uQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tIFwiLi4vLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiwgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmRlY2xhcmUgdmFyICQgOiBhbnkgXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLW1vYmJleC1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICdtb2JiZXgtZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydtb2JiZXgtZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTW9iYmV4RWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICAgIEBJbnB1dCgpIHBheW1lbnRTZXJ2aWNlSW5zdDtcbiAgICBASW5wdXQoKSBtZXRob2QgPSBudWxsO1xuICAgIEBJbnB1dCgpIHRvdGFsX2Ftb3VudCA9IDA7XG4gICAgQElucHV0KCkgYWxsRGF0YTtcbiAgICBASW5wdXQoKSB1c2VyX2RhdGEgPSBudWxsO1xuICAgIEBPdXRwdXQoKSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAVmlld0NoaWxkKCd0ZW1wbGF0ZScpIHByb3RlY3RlZCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcm90ZWN0ZWQgbW9kYWxSZWY6IEJzTW9kYWxSZWYgfCBudWxsO1xuICAgIHByb3RlY3RlZCBkYXRhTW9iYmV4O1xuXG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNEb2JsZUF1dGggPSBmYWxzZTtcbiAgICBwdWJsaWMgdXJscyA9IFtdO1xuICAgIHB1YmxpYyB1cmw7XG4gICAgcHVibGljIGNsb3NlTW9kYWwgPSAnJ1xuICAgIHB1YmxpYyB2ZW50YW5hXG4gICAgcHJvdGVjdGVkIGRhdGFSZWRpcmVjdCA9ICgpID0+IHRoaXMuY29uc3RzLmdldFVybEJhc2UoKSArJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL3JlZHN5cy9yZWRpcmVjdC8nICsgdGhpcy5jYXJ0U2VydmljZS5jYXJ0X3Rva2VuICsgJy9wcm9jZXNzLXBheW1lbnQnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHB1YmxpYyBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgdG9hc3RyOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBhY3RpdmVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHB1YmxpYyBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZ2V0Q2hlY2tvdXRNb2JiZXgoKVxuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJTRSBERVNUUk9aQVwiKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJTRSBDQU1CSU9cIik7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuY2xlYXJTdG9yYWdlU3RhdGUoKVxuICAgICAgICB0aGlzLm1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh0ZW1wbGF0ZSwgeyBjbGFzczogJ21vZGFsLWxnIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJywgYW5pbWF0ZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCA9ICcnXG4gICAgICAgIHRoaXMuY2FsbFN0YXRlKClcbiAgICB9XG5cbiAgICBjbGVhclN0b3JhZ2VTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhdGUnKVxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhdGUnKVxuICAgIH1cblxuICAgIGNsaWNrQ2xvc2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCA9ICdjYW5jZWwnXG4gICAgICAgIHRoaXMubW9kYWxSZWYuaGlkZSgpXG4gICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKCdTZSBjYW5jZWxvIGVsIHBhZ28gY29uIG1vYmJleCcpXG4gICAgfVxuXG5cbiAgICBjYWxsU3RhdGUgPSAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmNsb3NlTW9kYWwgIT0gJycgPyB0aGlzLmNsb3NlTW9kYWwgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3RhdGUnKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgc3RhdGUgJiYgY29uc29sZS5sb2coc3RhdGUpO1xuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdzdGF0ZScpXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3N0YXRlJylcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZHkuZW1pdCh0cnVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoJycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuaGlkZSgpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZSgpXG4gICAgICAgICAgICB9LCA1MDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgXG4gICAgICAgIH0gICBcbiAgICB9XG5cbiAgICBwcm9jZXNzRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KGVyciAhPSAnJyA/IGVyciA6ICdwYXltZW50LWVycm9yJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRVJST1IgRU5WSU8gQkFDSyAgXCIsIGVycik7XG4gICAgfVxuXG4gICAgZ2V0Q2hlY2tvdXRNb2JiZXggPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgdGhpcy5wYXltZW50U2VydmljZUluc3QuZ2V0Q2hlY2tvdXRNb2JiZXgodGhpcy5hbGxEYXRhKS50aGVuKFxuICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFNb2JiZXggPSByZXM7XG4gICAgICAgICAgICAgICAgdGhpcy51cmwgPSByZXM/LmRhdGE/LnVybCAmJiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwocmVzPy5kYXRhPy51cmwpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG59XG5cbiJdfQ==
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9iYmV4LWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9lYy1jb21wb25lbnQvd2lkZ2V0cy1lYy9tb2JiZXgtZWMvbW9iYmV4LWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVM3RDtJQUF1QyxxQ0FBZTtJQXNCbEQsMkJBQ1csYUFBMkIsRUFDM0IsV0FBd0I7UUFGbkMsWUFJSSxpQkFBTyxTQUVWO1FBTFUsbUJBQWEsR0FBYixhQUFhLENBQWM7UUFDM0IsaUJBQVcsR0FBWCxXQUFXLENBQWE7UUFyQjFCLFlBQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxrQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVqQixlQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLFdBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTlCLGFBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixnQkFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixTQUFHLEdBQWtCLElBQUksQ0FBQztRQUV6QixrQkFBWSxHQUFRLElBQUksQ0FBQztRQUN6QixXQUFLLEdBQWtCLElBQUksQ0FBQztRQUM1QixlQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGVBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGlCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLFFBQUUsR0FB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Q0wsQ0FBQztJQUVPLDZDQUFpQixHQUF6QixVQUEwQixHQUFXO1FBQ2pDLElBQUk7WUFDQSxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQUMsV0FBTTtZQUNKLGlCQUFpQjtTQUNwQjtJQUNMLENBQUM7SUFFTywwQ0FBYyxHQUF0QixVQUF1QixHQUFXLEVBQUUsS0FBYTtRQUM3QyxJQUFJO1lBQ0EsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDcEM7UUFBQyxXQUFNO1lBQ0osaUJBQWlCO1NBQ3BCO0lBQ0wsQ0FBQzs7Z0JBL1B5QixZQUFZO2dCQUNkLFdBQVc7O0lBdEIxQjtRQUFSLEtBQUssRUFBRTtpRUFBb0I7SUFDbkI7UUFBUixLQUFLLEVBQUU7cURBQWU7SUFDZDtRQUFSLEtBQUssRUFBRTsyREFBa0I7SUFDakI7UUFBUixLQUFLLEVBQUU7c0RBQVM7SUFDUjtRQUFSLEtBQUssRUFBRTt3REFBa0I7SUFDaEI7UUFBVCxNQUFNLEVBQUU7b0RBQTRCO0lBUDVCLGlCQUFpQjtRQUw3QixTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsZUFBZTtZQUN6Qix3MURBQXVDOztTQUUxQyxDQUFDO09BQ1csaUJBQWlCLENBdVI3QjtJQUFELHdCQUFDO0NBQUEsQUF2UkQsQ0FBdUMsZUFBZSxHQXVSckQ7U0F2UlksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XG5cbnR5cGUgUGF5bWVudFN0YXRlID0gJ3N1Y2Nlc3MnIHwgJ3BlbmRpbmcnIHwgJ2ZhaWx1cmUnIHwgJ2NhbmNlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLW1vYmJleC1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICdtb2JiZXgtZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydtb2JiZXgtZWMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNb2JiZXhFY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCgpIHBheW1lbnRTZXJ2aWNlSW5zdDtcbiAgICBASW5wdXQoKSBtZXRob2QgPSBudWxsO1xuICAgIEBJbnB1dCgpIHRvdGFsX2Ftb3VudCA9IDA7XG4gICAgQElucHV0KCkgYWxsRGF0YTtcbiAgICBASW5wdXQoKSB1c2VyX2RhdGEgPSBudWxsO1xuICAgIEBPdXRwdXQoKSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgcHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBjaGVja291dERhdGE6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBwb3B1cDogV2luZG93IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwb2xsVGltZXI6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBzdGFydGVkQXQgPSAwO1xuICAgIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNoZWNrb3V0S2V5ID0gJyc7XG4gICAgcHJpdmF0ZSBiYzogQnJvYWRjYXN0Q2hhbm5lbCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2hlY2tvdXRSZXF1ZXN0SW5GbGlnaHQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMub25TdG9yYWdlIGFzIGFueSk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMub25NZXNzYWdlIGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLkJyb2FkY2FzdENoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJjID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ21vYmJleF9wYXltZW50Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYy5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4gdGhpcy5vbkJyb2FkY2FzdE1lc3NhZ2UoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZENoZWNrb3V0KCk7XG4gICAgICAgIHRoaXMuZWNPbkluaXQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMub25TdG9yYWdlIGFzIGFueSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMub25NZXNzYWdlIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmMpIHtcbiAgICAgICAgICAgIHRyeSB7IHRoaXMuYmMuY2xvc2UoKTsgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkby5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XG4gICAgfVxuXG4gICAgb3BlbkNoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudXJsIHx8IHRoaXMucHJvY2Vzc2luZyB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZUtleXMoKTtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdGhpcy5wb3B1cCA9IHdpbmRvdy5vcGVuKHRoaXMudXJsLCAnX2JsYW5rJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBvcHVwIHx8IHRoaXMucG9wdXAuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdObyBzZSBwdWRvIGFicmlyIGxhIHBhc2FyZWxhIGRlIHBhZ28uIFZlcmlmaXF1ZSBxdWUgc3UgbmF2ZWdhZG9yIHBlcm1pdGEgbnVldmFzIHBlc3Rhw7Fhcy4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwLm9wZW5lciA9IG51bGw7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkby5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gICAgfVxuXG4gICAgY2FuY2VsQ2hlY2tvdXQgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuZmluaXNoV2l0aFN0YXRlKCdjYW5jZWwnLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENoZWNrb3V0TW9iYmV4ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFJlcXVlc3RJbkZsaWdodCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoZWNrb3V0UmVxdWVzdEluRmxpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudXNlcl9kYXRhIHx8IHRoaXMuYWxsRGF0YSB8fCB7fTtcbiAgICAgICAgdGhpcy5wYXltZW50U2VydmljZUluc3QuZ2V0Q2hlY2tvdXRNb2JiZXgocGF5bG9hZCkudGhlbihcbiAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dERhdGEgPSByZXMgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0S2V5ID0gU3RyaW5nKHJlcz8uZGF0YT8uaWQgfHwgdGhpcy5jYXJ0U2VydmljZS5jYXJ0X3Rva2VuIHx8ICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVybCA9IHJlcz8uZGF0YT8udXJsIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5zYWZlU2V0U3RvcmFnZSgnbW9iYmV4OmNoZWNrb3V0LWlkJywgdGhpcy5jaGVja291dEtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dFJlcXVlc3RJbkZsaWdodCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcignb3BlcmF0aW9uLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0UmVxdWVzdEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoJ29wZXJhdGlvbi1lcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZENoZWNrb3V0KCkge1xuICAgICAgICBpZiAoIXRoaXMucGF5bWVudFNlcnZpY2VJbnN0IHx8ICF0aGlzLm1ldGhvZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy51cmwgJiYgIXRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgICAgICB0aGlzLmdldENoZWNrb3V0TW9iYmV4KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoKSB7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcblxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlYWRTdGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hXaXRoU3RhdGUoc3RhdGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucG9wdXA/LmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoV2l0aFN0YXRlKCdjYW5jZWwnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhd1RpbWVvdXRNaW51dGVzID0gTnVtYmVyKHRoaXMuY2hlY2tvdXREYXRhPy5kYXRhPy50aW1lb3V0ID8/IHRoaXMuY2hlY2tvdXREYXRhPy50aW1lb3V0ID8/IDYwKTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRNaW51dGVzID0gTnVtYmVyLmlzRmluaXRlKHJhd1RpbWVvdXRNaW51dGVzKSAmJiByYXdUaW1lb3V0TWludXRlcyA+IDAgPyByYXdUaW1lb3V0TWludXRlcyA6IDYwO1xuICAgICAgICAgICAgY29uc3QgdGltZW91dE1zID0gTWF0aC5tYXgoNSwgdGltZW91dE1pbnV0ZXMgKyAxKSAqIDYwICogMTAwMDtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5zdGFydGVkQXQgPiB0aW1lb3V0TXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFdpdGhTdGF0ZSgnZmFpbHVyZScsIHRydWUsICdUaWVtcG8gZGUgZXNwZXJhIGFnb3RhZG8gYWwgcHJvY2VzYXIgZWwgcGFnbyBjb24gTW9iYmV4LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3RvcmFnZSA9IChldmVudDogU3RvcmFnZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghZXZlbnQ/LmtleSB8fCB0aGlzLmZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ub3JtYWxpemVTdGF0ZShldmVudC5uZXdWYWx1ZSk7XG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5maW5pc2hXaXRoU3RhdGUoc3RhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uQnJvYWRjYXN0TWVzc2FnZShldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJyb2FkY2FzdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gZXZlbnQ/LmRhdGE7XG4gICAgICAgIGlmICghcGF5bG9hZCB8fCBwYXlsb2FkLnR5cGUgIT09ICdtb2JiZXg6c3RhdGUnIHx8IHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRLZXkgJiYgcGF5bG9hZC5jaGVja291dEtleSAmJiBwYXlsb2FkLmNoZWNrb3V0S2V5ICE9PSB0aGlzLmNoZWNrb3V0S2V5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ub3JtYWxpemVTdGF0ZShwYXlsb2FkLnN0YXRlKTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaFdpdGhTdGF0ZShzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmlzaFdpdGhTdGF0ZShzdGF0ZTogUGF5bWVudFN0YXRlLCBjbG9zZVBvcHVwID0gZmFsc2UsIGN1c3RvbU1lc3NhZ2UgPSAnJykge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcblxuICAgICAgICBpZiAoY2xvc2VQb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU3RhdGVLZXlzKCk7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSAnc3VjY2VzcycgfHwgc3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgdGhpcy5yZWFkeS5lbWl0KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IoY3VzdG9tTWVzc2FnZSB8fCAoc3RhdGUgPT09ICdjYW5jZWwnID8gJ1NlIGNhbmNlbMOzIGVsIHBhZ28gY29uIE1vYmJleCcgOiAnJykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZFN0YXRlKCk6IFBheW1lbnRTdGF0ZSB8IG51bGwge1xuICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5nZXRTdGF0ZUtleXMoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2FmZUdldFN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVN0YXRlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkKSByZXR1cm4gbm9ybWFsaXplZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplU3RhdGUodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBQYXltZW50U3RhdGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmF3ID0gU3RyaW5nKHZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChyYXcgPT09ICcyMDAnIHx8IHJhdyA9PT0gJ29rJyB8fCByYXcgPT09ICdzdWNjZXNzJykgcmV0dXJuICdzdWNjZXNzJztcbiAgICAgICAgaWYgKHJhdyA9PT0gJ3BlbmRpbmcnIHx8IHJhdyA9PT0gJ2luX3Byb2Nlc3MnIHx8IHJhdyA9PT0gJ2luX3JldmlldycgfHwgcmF3ID09PSAnY2hhbGxlbmdlJykgcmV0dXJuICdwZW5kaW5nJztcbiAgICAgICAgaWYgKHJhdyA9PT0gJ2NhbmNlbCcgfHwgcmF3ID09PSAnMCcgfHwgcmF3ID09PSAnbm9uZScpIHJldHVybiAnY2FuY2VsJztcbiAgICAgICAgaWYgKHJhdyA9PT0gJ2ZhaWx1cmUnIHx8IHJhdyA9PT0gJ2Vycm9yJyB8fCByYXcgPT09ICdleHBpcmVkJyB8fCByYXcgPT09ICc0MDEnKSByZXR1cm4gJ2ZhaWx1cmUnO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBbJ3N0YXRlJ107XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0S2V5KSB7XG4gICAgICAgICAgICBrZXlzLnVuc2hpZnQoYG1vYmJleDpzdGF0ZToke3RoaXMuY2hlY2tvdXRLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhclN0b3JhZ2VTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhdGUnKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3N0YXRlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhclN0YXRlS2V5cygpIHtcbiAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2VTdGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEtleSkge1xuICAgICAgICAgICAgdGhpcy5zYWZlUmVtb3ZlU3RvcmFnZShgbW9iYmV4OnN0YXRlOiR7dGhpcy5jaGVja291dEtleX1gKTtcbiAgICAgICAgICAgIHRoaXMuc2FmZVJlbW92ZVN0b3JhZ2UoJ21vYmJleDpjaGVja291dC1pZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KGVyciAhPT0gJycgPyBlcnIgOiAncGF5bWVudC1lcnJvcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RvcFBvbGxpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3NlUG9wdXAoKSB7XG4gICAgICAgIGlmICghdGhpcy5wb3B1cCkgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBvcHVwLmNsb3NlZCkgdGhpcy5wb3B1cC5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8uXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3B1cCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYWZlR2V0U3RvcmFnZShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNhZmVSZW1vdmVTdG9yYWdlKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8uXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNhZmVTZXRTdG9yYWdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLlxuICAgICAgICB9XG4gICAgfVxufVxuIl19