ng-easycommerce 1.1.2 → 1.1.3

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 (100) hide show
  1. package/README.md +10 -0
  2. package/assets/ec-i18n/ct.json +2 -0
  3. package/assets/ec-i18n/en.json +2 -0
  4. package/assets/ec-i18n/es.json +2 -0
  5. package/assets/ec-i18n/fr.json +2 -0
  6. package/assets/ec-i18n/gl.json +2 -0
  7. package/assets/ec-i18n/pr.json +2 -0
  8. package/bundles/ng-easycommerce.umd.js +5663 -4057
  9. package/bundles/ng-easycommerce.umd.js.map +1 -1
  10. package/bundles/ng-easycommerce.umd.min.js +1 -1
  11. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  12. package/esm2015/lib/api/connection.service.js +2 -2
  13. package/esm2015/lib/core.consts.js +4 -5
  14. package/esm2015/lib/ec-component/cart-bootstrap-navigation.js +27 -0
  15. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +11 -1
  16. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +23 -2
  17. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +185 -13
  18. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +3 -1
  19. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +4 -2
  20. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +6 -1
  21. package/esm2015/lib/guards/able-buyer-guard.service.js +2 -2
  22. package/esm2015/lib/guards/auth-guard.service.js +2 -2
  23. package/esm2015/lib/guards/checkout-ready.service.js +3 -3
  24. package/esm2015/lib/guards/loggedin-guard.service.js +2 -2
  25. package/esm2015/lib/guards/user-role-guard.service.js +2 -2
  26. package/esm2015/lib/services/account/orders.service.js +6 -4
  27. package/esm2015/lib/services/auth.service.js +4 -3
  28. package/esm2015/lib/services/captcha.service.js +6 -4
  29. package/esm2015/lib/services/cart.service.js +1186 -74
  30. package/esm2015/lib/services/channel-config.service.js +4 -6
  31. package/esm2015/lib/services/checkout/addressing.service.js +65 -9
  32. package/esm2015/lib/services/checkout/checkout.service.js +56 -9
  33. package/esm2015/lib/services/checkout/error-handler.service.js +4 -3
  34. package/esm2015/lib/services/checkout/payment.service.js +35 -15
  35. package/esm2015/lib/services/checkout/shipment.service.js +54 -3
  36. package/esm2015/lib/services/concatenated-associations.service.js +4 -3
  37. package/esm2015/lib/services/currency.service.js +5 -3
  38. package/esm2015/lib/services/filters.service.js +2 -2
  39. package/esm2015/lib/services/footer/footer.service.js +4 -3
  40. package/esm2015/lib/services/gift-card.service.js +56 -5
  41. package/esm2015/lib/services/parameters.service.js +5 -3
  42. package/esm2015/lib/services/reviews.service.js +5 -4
  43. package/esm2015/lib/services/seo.service.js +4 -5
  44. package/esm2015/lib/services/stores.service.js +4 -3
  45. package/esm2015/lib/services/wishlist.service.js +3 -4
  46. package/esm2015/lib/utils/analytics/google-analytics.service.js +1 -1
  47. package/esm2015/lib/utils/price-presentation.service.js +2 -3
  48. package/esm2015/lib/utils/shipping-price-display.service.js +2 -3
  49. package/esm5/lib/api/connection.service.js +2 -2
  50. package/esm5/lib/core.consts.js +4 -5
  51. package/esm5/lib/ec-component/cart-bootstrap-navigation.js +27 -0
  52. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +11 -1
  53. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +23 -2
  54. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +206 -12
  55. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +3 -1
  56. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +5 -3
  57. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +6 -1
  58. package/esm5/lib/guards/able-buyer-guard.service.js +2 -2
  59. package/esm5/lib/guards/auth-guard.service.js +2 -2
  60. package/esm5/lib/guards/checkout-ready.service.js +3 -3
  61. package/esm5/lib/guards/loggedin-guard.service.js +2 -2
  62. package/esm5/lib/guards/user-role-guard.service.js +2 -2
  63. package/esm5/lib/services/account/orders.service.js +6 -4
  64. package/esm5/lib/services/auth.service.js +4 -3
  65. package/esm5/lib/services/captcha.service.js +6 -4
  66. package/esm5/lib/services/cart.service.js +1231 -94
  67. package/esm5/lib/services/channel-config.service.js +4 -6
  68. package/esm5/lib/services/checkout/addressing.service.js +65 -9
  69. package/esm5/lib/services/checkout/checkout.service.js +63 -12
  70. package/esm5/lib/services/checkout/error-handler.service.js +4 -3
  71. package/esm5/lib/services/checkout/payment.service.js +29 -11
  72. package/esm5/lib/services/checkout/shipment.service.js +58 -7
  73. package/esm5/lib/services/concatenated-associations.service.js +4 -3
  74. package/esm5/lib/services/currency.service.js +5 -3
  75. package/esm5/lib/services/filters.service.js +2 -2
  76. package/esm5/lib/services/footer/footer.service.js +4 -3
  77. package/esm5/lib/services/gift-card.service.js +59 -5
  78. package/esm5/lib/services/parameters.service.js +5 -3
  79. package/esm5/lib/services/reviews.service.js +5 -4
  80. package/esm5/lib/services/seo.service.js +4 -5
  81. package/esm5/lib/services/stores.service.js +4 -3
  82. package/esm5/lib/services/wishlist.service.js +3 -4
  83. package/esm5/lib/utils/analytics/google-analytics.service.js +1 -1
  84. package/esm5/lib/utils/price-presentation.service.js +2 -3
  85. package/esm5/lib/utils/shipping-price-display.service.js +2 -3
  86. package/fesm2015/ng-easycommerce.js +3966 -2412
  87. package/fesm2015/ng-easycommerce.js.map +1 -1
  88. package/fesm5/ng-easycommerce.js +5667 -4061
  89. package/fesm5/ng-easycommerce.js.map +1 -1
  90. package/lib/ec-component/cart-bootstrap-navigation.d.ts +7 -0
  91. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +5 -2
  92. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +5 -0
  93. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +27 -3
  94. package/lib/services/cart.service.d.ts +120 -7
  95. package/lib/services/checkout/addressing.service.d.ts +1 -1
  96. package/lib/services/checkout/checkout.service.d.ts +3 -0
  97. package/lib/services/checkout/shipment.service.d.ts +2 -2
  98. package/lib/services/gift-card.service.d.ts +1 -0
  99. package/ng-easycommerce.metadata.json +1 -1
  100. package/package.json +1 -1
@@ -72,8 +72,8 @@ var __spread = (this && this.__spread) || function () {
72
72
  return ar;
73
73
  };
74
74
  import { Injectable } from '@angular/core';
75
- import { finalize } from 'rxjs/operators';
76
- import { BehaviorSubject } from 'rxjs';
75
+ import { finalize, timeout } from 'rxjs/operators';
76
+ import { BehaviorSubject, Subject } from 'rxjs';
77
77
  import { map } from 'rxjs/operators';
78
78
  import { ConnectionService } from '../api/connection.service';
79
79
  import { Constants } from '../core.consts';
@@ -81,16 +81,23 @@ import { AuthService } from './auth.service';
81
81
  import { ToastService } from '../utils/toast.service';
82
82
  import { OrderUtilityService } from '../utils/order-util.service';
83
83
  import { ChannelConfigService } from './channel-config.service';
84
- import { AnalyticsService } from '../../public-api';
85
- import { Router } from '@angular/router';
84
+ import { AnalyticsService } from './analytics.service';
85
+ import { NavigationStart, Router } from '@angular/router';
86
86
  import { CartItemPricePresentation, CartSummaryPricePresentation, PricePresentationService } from '../utils/price-presentation.service';
87
87
  import * as i0 from "@angular/core";
88
- import * as i1 from "../../public-api";
89
- import * as i2 from "../utils/order-util.service";
90
- import * as i3 from "@angular/router";
88
+ import * as i1 from "../api/connection.service";
89
+ import * as i2 from "../utils/toast.service";
90
+ import * as i3 from "../core.consts";
91
+ import * as i4 from "./auth.service";
92
+ import * as i5 from "../utils/order-util.service";
93
+ import * as i6 from "./analytics.service";
94
+ import * as i7 from "./channel-config.service";
95
+ import * as i8 from "@angular/router";
96
+ import * as i9 from "../utils/price-presentation.service";
91
97
  var CartService = /** @class */ (function () {
92
98
  function CartService(connection, toastrService, consts, authService, orderUtils, analyticsService, channelConfigService, router, pricePresentationService) {
93
99
  var _this = this;
100
+ var _a, _b, _c, _d, _e;
94
101
  this.connection = connection;
95
102
  this.toastrService = toastrService;
96
103
  this.consts = consts;
@@ -104,9 +111,17 @@ var CartService = /** @class */ (function () {
104
111
  this.couponSubject = new BehaviorSubject(null);
105
112
  this.cartSubject = new BehaviorSubject(null);
106
113
  this.requestInProcess = new BehaviorSubject(false);
114
+ this.cartSyncStateSubject = new BehaviorSubject({ status: 'syncing' });
107
115
  this.promotionsSubject = new BehaviorSubject([]);
116
+ this.cartBootstrapRecoverySubject = new Subject();
117
+ this.cartCheckoutInvalidationSubject = new Subject();
108
118
  this.balanceCustomerSubject = new BehaviorSubject(null);
109
119
  this.items = [];
120
+ this.pendingBootstrapCartAdds = [];
121
+ this.maxPendingBootstrapCartAdds = 10;
122
+ this.pendingBootstrapCartAddsLimitNotified = false;
123
+ this.pendingBootstrapCartAddInFlight = false;
124
+ this.pendingBootstrapCartQueueGeneration = 0;
110
125
  this.count = 0;
111
126
  this.locale = "";
112
127
  this.logged_in = false;
@@ -121,9 +136,50 @@ var CartService = /** @class */ (function () {
121
136
  this.couponApi = function () { return _this.cart_baseUrl + '/' + _this.cart_token + '/coupon'; };
122
137
  this.addressBookApi = function () { return 'shop-api/' + _this.consts.getChannel() + '/address-book'; };
123
138
  this.taxesApi = function () { return 'shop-api/' + _this.consts.getChannel() + '/carts/tax'; };
139
+ this.cartLifecycleGeneration = 0;
140
+ this.cartRequestId = 0;
141
+ this.lastAppliedCartRequestId = 0;
142
+ this.cartSyncKey = '__easycommerce_cart_sync__';
143
+ this.tabId = Date.now() + "-" + Math.random().toString(36).slice(2);
144
+ this.seenCartSyncEvents = [];
145
+ this.cartSyncBlocked = false;
146
+ this.cartSyncReading = false;
147
+ this.cartSyncReadAgain = false;
148
+ this.pendingCheckoutRecovery = false;
149
+ this.cartNotActiveRecovery = null;
150
+ this.cartNotActiveTransitionId = null;
151
+ this.cartNotActiveToken = null;
152
+ this.cartBootstrapLookupInFlight = false;
153
+ this.cartBootstrapPickup = null;
154
+ this.cartBootstrapAllowsPendingAdds = false;
155
+ this.cartBootstrapLookupRequiredForRetry = false;
156
+ this.cartBootstrapPickupRequiredForRetry = false;
157
+ this.cartBootstrapRecoveryNavigation = null;
158
+ this.lastRouterNavigationId = null;
159
+ this.routerNavigationSubscription = null;
160
+ this.activeCheckoutTransitionId = null;
161
+ this.completedCheckoutTransitionId = null;
162
+ this.authContextBlocked = false;
163
+ this.checkoutInvalidatedAt = 0;
164
+ this.checkoutRecoveryTimeoutMs = 10000;
165
+ this.cartRequestTimeoutMs = 15000;
166
+ this.authRetryAllowed = false;
167
+ this.pendingGuestCartAssociationToken = null;
168
+ this.storageListener = function (event) { return _this.handleStorageEvent(event); };
169
+ this.visibilityListener = function () {
170
+ if (document.visibilityState === 'visible')
171
+ _this.checkPendingCartSync();
172
+ };
173
+ this.pageshowListener = function () { return _this.checkPendingCartSync(); };
124
174
  this.cartItems = this.cartItemsSubject.asObservable().pipe(map(function (items) { return _this.switchPriceInCartItem(items); }));
125
175
  this.coupon = this.couponSubject.asObservable();
126
176
  this.loading = this.requestInProcess.asObservable();
177
+ /** Estado que permite a los consumidores diferenciar el carrito listo de una recuperación pendiente o fallida. */
178
+ this.cartSyncState = this.cartSyncStateSubject.asObservable();
179
+ /** Emite únicamente si el bootstrap descartó un token inactivo y recuperó otro carrito correctamente. */
180
+ this.cartBootstrapRecovery = this.cartBootstrapRecoverySubject.asObservable();
181
+ /** Notifica al checkout montado cuando se invalida el token que su CartService estaba usando. */
182
+ this.cartCheckoutInvalidation = this.cartCheckoutInvalidationSubject.asObservable();
127
183
  this.cart = this.cartSubject.asObservable();
128
184
  this.promotions = this.promotionsSubject.asObservable();
129
185
  this.deleting = false;
@@ -133,50 +189,946 @@ var CartService = /** @class */ (function () {
133
189
  this.creditAmount$ = this.balanceCustomer$.pipe(map(function (data) { var _a, _b; return _b = (_a = data) === null || _a === void 0 ? void 0 : _a.creditAmount, (_b !== null && _b !== void 0 ? _b : null); }));
134
190
  this.showMax$ = this.balanceCustomer$.pipe(map(function (data) { var _a, _b; return _b = (_a = data) === null || _a === void 0 ? void 0 : _a.showMax, (_b !== null && _b !== void 0 ? _b : null); }));
135
191
  this.showPrice$ = this.balanceCustomer$.pipe(map(function (data) { var _a, _b; return _b = (_a = data) === null || _a === void 0 ? void 0 : _a.showPrice, (_b !== null && _b !== void 0 ? _b : null); }));
192
+ this.getCurrentRouterNavigationId = function () { var _a, _b, _c, _d; return _d = (_c = (_b = (_a = _this.router).getCurrentNavigation) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.id, (_d !== null && _d !== void 0 ? _d : _this.lastRouterNavigationId); };
193
+ this.markCartBootstrapRecoveryPending = function (navigationId) {
194
+ _this.cartBootstrapRecoveryNavigation = { navigationId: navigationId, completed: false };
195
+ };
196
+ this.completeCartBootstrapRecovery = function () {
197
+ if (!_this.cartBootstrapRecoveryNavigation || _this.cartBootstrapRecoveryNavigation.completed)
198
+ return;
199
+ _this.cartBootstrapRecoveryNavigation.completed = true;
200
+ _this.cartBootstrapRecoverySubject.next({ reason: 'inactive-token-replaced' });
201
+ };
202
+ this.createCartSyncId = function () { return Date.now() + "-" + Math.random().toString(36).slice(2); };
203
+ this.getAuthContext = function () { return JSON.stringify([
204
+ localStorage.getItem('JWT_TOKEN'), localStorage.getItem('USER'),
205
+ localStorage.getItem('CUSTOMER'), localStorage.getItem('CHANNEL')
206
+ ]); };
207
+ this.cartTransitionIdForToken = function (token) {
208
+ if (!token)
209
+ return null;
210
+ var first = 2166136261;
211
+ var second = 5381;
212
+ for (var index = 0; index < token.length; index++) {
213
+ var code = token.charCodeAt(index);
214
+ first = Math.imul(first ^ code, 16777619);
215
+ second = Math.imul(second, 33) ^ code;
216
+ }
217
+ return (first >>> 0).toString(36) + "-" + (second >>> 0).toString(36);
218
+ };
219
+ this.notifyCheckoutInvalidation = function (transitionId, reason, token) {
220
+ if (token === void 0) { token = _this.cart_token || null; }
221
+ if (!token || token !== _this.cart_token || _this.cartTransitionIdForToken(token) !== transitionId)
222
+ return;
223
+ _this.cartCheckoutInvalidationSubject.next({ transitionId: transitionId, reason: reason });
224
+ };
225
+ this.publishCartSync = function (type, transitionId) {
226
+ var event = __assign({ eventId: _this.createCartSyncId(), type: type, sourceId: _this.tabId }, (transitionId ? { transitionId: transitionId } : {}));
227
+ localStorage.setItem(_this.cartSyncKey, JSON.stringify(event));
228
+ };
229
+ this.handleStorageEvent = function (event) {
230
+ if (event.key === _this.cartSyncKey && event.newValue) {
231
+ var signal = void 0;
232
+ try {
233
+ signal = JSON.parse(event.newValue);
234
+ }
235
+ catch (_) {
236
+ return;
237
+ }
238
+ _this.receiveCartSync(signal);
239
+ return;
240
+ }
241
+ if (['JWT_TOKEN', 'USER', 'CUSTOMER', 'CHANNEL'].indexOf(event.key) >= 0) {
242
+ var nextContext = _this.getAuthContext();
243
+ if (nextContext !== _this.authContext) {
244
+ _this.authContext = nextContext;
245
+ _this.authRetryAllowed = true;
246
+ _this.invalidateLocalCart(true);
247
+ }
248
+ }
249
+ };
250
+ this.receiveCartSync = function (signal) {
251
+ var _a;
252
+ if (!((_a = signal) === null || _a === void 0 ? void 0 : _a.eventId) || signal.sourceId === _this.tabId || _this.seenCartSyncEvents.indexOf(signal.eventId) >= 0)
253
+ return;
254
+ _this.seenCartSyncEvents.push(signal.eventId);
255
+ if (_this.seenCartSyncEvents.length > 50)
256
+ _this.seenCartSyncEvents.shift();
257
+ if (_this.authContextBlocked)
258
+ return;
259
+ if (signal.type === 'checkout-invalidated') {
260
+ _this.discardPendingBootstrapCartAdds();
261
+ _this.cartBootstrapAllowsPendingAdds = false;
262
+ var sharedToken = localStorage.getItem('cart_token');
263
+ var transitionId = signal.transitionId || null;
264
+ if (transitionId && _this.completedCheckoutTransitionId === transitionId)
265
+ return;
266
+ if (_this.activeCheckoutTransitionId && transitionId && _this.activeCheckoutTransitionId !== transitionId && !sharedToken)
267
+ return;
268
+ _this.notifyCheckoutInvalidation(transitionId, 'checkout-completed');
269
+ if (transitionId && sharedToken && _this.cartTransitionIdForToken(sharedToken) !== transitionId) {
270
+ // La señal pertenece a un token previo. No borrar el sucesor y
271
+ // reconciliar el estado guardado actualmente.
272
+ _this.pendingCheckoutRecovery = false;
273
+ _this.scheduleCartRefresh(false);
274
+ return;
275
+ }
276
+ if (!transitionId && sharedToken && _this.cart_token && sharedToken !== _this.cart_token) {
277
+ _this.scheduleCartRefresh(false);
278
+ return;
279
+ }
280
+ _this.activeCheckoutTransitionId = transitionId;
281
+ _this.pendingCheckoutRecovery = true;
282
+ _this.checkoutInvalidatedAt = Date.now();
283
+ _this.invalidateLocalCart(false, true, sharedToken || _this.cart_token || null);
284
+ _this.setCartSyncState('invalidated');
285
+ _this.startCheckoutRecoveryWatchdog();
286
+ return;
287
+ }
288
+ if (signal.type === 'checkout-ready') {
289
+ var transitionId = signal.transitionId || null;
290
+ if (_this.activeCheckoutTransitionId && transitionId && _this.activeCheckoutTransitionId !== transitionId)
291
+ return;
292
+ _this.completedCheckoutTransitionId = transitionId || _this.activeCheckoutTransitionId;
293
+ _this.activeCheckoutTransitionId = null;
294
+ if (_this.checkoutRecoveryTimer)
295
+ clearTimeout(_this.checkoutRecoveryTimer);
296
+ _this.checkoutInvalidatedAt = 0;
297
+ _this.pendingCheckoutRecovery = true;
298
+ _this.cartSyncBlocked = false;
299
+ _this.scheduleCartRefresh(true);
300
+ return;
301
+ }
302
+ if (signal.type === 'cart-invalidated') {
303
+ _this.discardPendingBootstrapCartAdds();
304
+ _this.cartBootstrapAllowsPendingAdds = false;
305
+ var sharedToken = localStorage.getItem('cart_token');
306
+ var transitionId = signal.transitionId || null;
307
+ _this.notifyCheckoutInvalidation(transitionId, 'cart-not-active');
308
+ if (transitionId && sharedToken && _this.cartTransitionIdForToken(sharedToken) !== transitionId) {
309
+ _this.scheduleCartRefresh(false);
310
+ return;
311
+ }
312
+ _this.cartNotActiveTransitionId = transitionId;
313
+ _this.cartNotActiveToken = _this.cart_token || null;
314
+ _this.pendingCheckoutRecovery = false;
315
+ _this.invalidateLocalCart(false, true, sharedToken || _this.cart_token || null);
316
+ _this.setCartSyncState('invalidated', 'cart-not-active');
317
+ _this.startCartNotActiveRecoveryWatchdog(transitionId);
318
+ return;
319
+ }
320
+ if (signal.type === 'cart-ready') {
321
+ var transitionId = signal.transitionId || null;
322
+ if (_this.cartNotActiveTransitionId && transitionId !== _this.cartNotActiveTransitionId)
323
+ return;
324
+ _this.cartNotActiveTransitionId = null;
325
+ _this.cartNotActiveToken = null;
326
+ if (_this.cartNotActiveRecoveryTimer)
327
+ clearTimeout(_this.cartNotActiveRecoveryTimer);
328
+ _this.scheduleCartRefresh(false);
329
+ return;
330
+ }
331
+ if (signal.type === 'cart-recovery-failed') {
332
+ var transitionId = signal.transitionId || null;
333
+ if (_this.cartNotActiveTransitionId && transitionId !== _this.cartNotActiveTransitionId)
334
+ return;
335
+ _this.cartNotActiveTransitionId = transitionId;
336
+ _this.cartNotActiveToken = _this.cartNotActiveToken || _this.cart_token || null;
337
+ if (_this.cartNotActiveRecoveryTimer)
338
+ clearTimeout(_this.cartNotActiveRecoveryTimer);
339
+ _this.cartSyncBlocked = true;
340
+ _this.setCartSyncState('error', 'cart-not-active');
341
+ return;
342
+ }
343
+ if (signal.type === 'changed') {
344
+ // La última señal de otra pestaña puede seguir en localStorage al
345
+ // abrir una sesión nueva. Sin token no hay resumen que refrescar;
346
+ // dejar que initialize/getCart haga el bootstrap evita invalidar
347
+ // el POST /carts que está iniciándose en paralelo.
348
+ if (!localStorage.getItem('cart_token'))
349
+ return;
350
+ if (_this.checkoutRecoveryTimer)
351
+ clearTimeout(_this.checkoutRecoveryTimer);
352
+ _this.cartSyncBlocked = true;
353
+ _this.pendingCheckoutRecovery = true;
354
+ _this.cartLifecycleGeneration++;
355
+ _this.lastAppliedCartRequestId = ++_this.cartRequestId;
356
+ _this.scheduleCartRefresh(false);
357
+ }
358
+ };
359
+ this.checkPendingCartSync = function () {
360
+ _this.markInterruptedCheckoutIfExpired();
361
+ if (_this.authContextBlocked)
362
+ return;
363
+ if (_this.authContext !== _this.getAuthContext()) {
364
+ _this.authContext = _this.getAuthContext();
365
+ _this.invalidateLocalCart(true);
366
+ return;
367
+ }
368
+ var value = localStorage.getItem(_this.cartSyncKey);
369
+ if (_this.pendingCheckoutRecovery && localStorage.getItem('cart_token')) {
370
+ _this.scheduleCartRefresh(true);
371
+ return;
372
+ }
373
+ if (!value)
374
+ return;
375
+ try {
376
+ _this.receiveCartSync(JSON.parse(value));
377
+ }
378
+ catch (_) { }
379
+ };
380
+ this.scheduleCartRefresh = function (checkoutReady) {
381
+ _this.cartSyncBlocked = true;
382
+ _this.setCartSyncState('syncing');
383
+ _this.cartLifecycleGeneration++;
384
+ _this.lastAppliedCartRequestId = ++_this.cartRequestId;
385
+ if (_this.cartSyncTimer)
386
+ clearTimeout(_this.cartSyncTimer);
387
+ _this.cartSyncTimer = setTimeout(function () { return _this.refreshCartFromBackend(checkoutReady); }, 0);
388
+ };
389
+ this.refreshCartFromBackend = function (checkoutReady) {
390
+ if (_this.authContextBlocked)
391
+ return;
392
+ if (_this.cartSyncReading) {
393
+ _this.cartSyncReadAgain = true;
394
+ return;
395
+ }
396
+ if (_this.authContext !== _this.getAuthContext()) {
397
+ _this.authContext = _this.getAuthContext();
398
+ _this.invalidateLocalCart(true);
399
+ return;
400
+ }
401
+ var token = localStorage.getItem('cart_token');
402
+ if (!token) {
403
+ _this.invalidateLocalCart(false, false);
404
+ _this.discardPendingBootstrapCartAdds();
405
+ _this.pendingCheckoutRecovery = true;
406
+ _this.setCartSyncState('invalidated', 'token-unavailable');
407
+ _this.toastrService.show('operation-error-param');
408
+ return;
409
+ }
410
+ _this.cartSyncBlocked = true;
411
+ _this.cartLifecycleGeneration++;
412
+ _this.cart_token = token;
413
+ _this.cartSyncReading = true;
414
+ var generation = _this.cartLifecycleGeneration;
415
+ _this.connection.getErrorNotHandler("shop-api/" + _this.consts.getChannel() + "/carts/" + token + "?locale=" + _this.consts.getLocale())
416
+ .pipe(timeout(_this.cartRequestTimeoutMs), finalize(function () {
417
+ _this.cartSyncReading = false;
418
+ if (_this.cartSyncReadAgain) {
419
+ _this.cartSyncReadAgain = false;
420
+ _this.scheduleCartRefresh(false);
421
+ }
422
+ }))
423
+ .subscribe(function (response) {
424
+ if (generation !== _this.cartLifecycleGeneration)
425
+ return;
426
+ if (_this.authContext !== _this.getAuthContext()) {
427
+ _this.authContext = _this.getAuthContext();
428
+ _this.invalidateLocalCart(true, true);
429
+ return;
430
+ }
431
+ if (!response || _this.isCartBusinessError(response) || !response.tokenValue || !Array.isArray(response.items)) {
432
+ _this.invalidateLocalCart(false, false);
433
+ _this.discardPendingBootstrapCartAdds();
434
+ _this.pendingCheckoutRecovery = checkoutReady;
435
+ _this.setCartSyncState('error', 'invalid-response');
436
+ return;
437
+ }
438
+ var context = {
439
+ token: token, generation: generation, requestId: ++_this.cartRequestId, allowTokenChange: false
440
+ };
441
+ if (_this.applyCartResponse(response, context, false, false)) {
442
+ _this.locale = response.locale || _this.locale;
443
+ _this.cartSyncBlocked = false;
444
+ _this.pendingCheckoutRecovery = false;
445
+ _this.setCartSyncState('ready');
446
+ _this.completeCartBootstrapRecovery();
447
+ }
448
+ else {
449
+ _this.invalidateLocalCart(false, false);
450
+ _this.discardPendingBootstrapCartAdds();
451
+ _this.pendingCheckoutRecovery = checkoutReady;
452
+ _this.setCartSyncState('error', 'invalid-response');
453
+ }
454
+ }, function (error) {
455
+ var _a, _b, _c, _d, _e, _f, _g;
456
+ if (generation !== _this.cartLifecycleGeneration || _this.authContext !== _this.getAuthContext())
457
+ return;
458
+ _this.invalidateLocalCart(false, false);
459
+ if ([400, 404, 410].indexOf((_a = error) === null || _a === void 0 ? void 0 : _a.status) >= 0) {
460
+ _this.discardPendingBootstrapCartAdds();
461
+ if (localStorage.getItem('cart_token') === token)
462
+ localStorage.removeItem('cart_token');
463
+ _this.cart_token = null;
464
+ _this.pendingCheckoutRecovery = false;
465
+ _this.setCartSyncState('invalidated', 'token-unavailable');
466
+ _this.toastrService.show('operation-error-param');
467
+ return;
468
+ }
469
+ if (((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 401 || ((_c = error) === null || _c === void 0 ? void 0 : _c.status) === 403) {
470
+ _this.discardPendingBootstrapCartAdds();
471
+ _this.authContextBlocked = true;
472
+ _this.authRetryAllowed = false;
473
+ if (localStorage.getItem('cart_token') === token)
474
+ localStorage.removeItem('cart_token');
475
+ _this.pendingCheckoutRecovery = false;
476
+ _this.setCartSyncState('authentication-changed', 'authentication');
477
+ return;
478
+ }
479
+ _this.discardPendingBootstrapCartAdds();
480
+ _this.pendingCheckoutRecovery = checkoutReady;
481
+ var reason = ((_d = error) === null || _d === void 0 ? void 0 : _d.status) >= 500 ? 'server' : (((_e = error) === null || _e === void 0 ? void 0 : _e.status) >= 400 && ((_f = error) === null || _f === void 0 ? void 0 : _f.status) < 500 && ((_g = error) === null || _g === void 0 ? void 0 : _g.status) !== 429 ? 'invalid-response' : 'network');
482
+ _this.setCartSyncState('error', reason);
483
+ _this.toastrService.show('operation-error-param');
484
+ });
485
+ };
486
+ this.setCartSyncState = function (status, reason) {
487
+ _this.cartSyncStateSubject.next(__assign({ status: status }, (reason ? { reason: reason } : {})));
488
+ };
489
+ this.startCheckoutRecoveryWatchdog = function () {
490
+ if (_this.checkoutRecoveryTimer)
491
+ clearTimeout(_this.checkoutRecoveryTimer);
492
+ _this.checkoutRecoveryTimer = setTimeout(function () { return _this.markInterruptedCheckoutIfExpired(); }, _this.checkoutRecoveryTimeoutMs);
493
+ };
494
+ this.markInterruptedCheckoutIfExpired = function () {
495
+ if (!_this.pendingCheckoutRecovery || !_this.checkoutInvalidatedAt ||
496
+ Date.now() - _this.checkoutInvalidatedAt < _this.checkoutRecoveryTimeoutMs ||
497
+ _this.cartSyncStateSubject.value.status !== 'invalidated')
498
+ return;
499
+ _this.setCartSyncState('error', 'checkout-interrupted');
500
+ _this.toastrService.show('operation-error-param');
501
+ };
502
+ this.invalidateLocalCart = function (authChanged, discardToken, expectedToken) {
503
+ if (discardToken === void 0) { discardToken = false; }
504
+ if (expectedToken === void 0) { expectedToken = _this.cart_token || null; }
505
+ _this.cartLifecycleGeneration++;
506
+ _this.lastAppliedCartRequestId = ++_this.cartRequestId;
507
+ _this.cartSyncBlocked = true;
508
+ _this.items = [];
509
+ _this.cart_token = null;
510
+ if (discardToken && expectedToken && localStorage.getItem('cart_token') === expectedToken)
511
+ localStorage.removeItem('cart_token');
512
+ _this.cartSubject.next(null);
513
+ _this.cartItemsSubject.next([]);
514
+ _this.couponSubject.next(null);
515
+ _this.promotionsSubject.next([]);
516
+ _this.updateBalanceAttributes(null);
517
+ _this.count = 0;
518
+ localStorage.setItem('cart', '[]');
519
+ _this.requestInProcess.next(false);
520
+ if (authChanged) {
521
+ _this.discardPendingBootstrapCartAdds();
522
+ _this.pendingCheckoutRecovery = false;
523
+ _this.authContextBlocked = true;
524
+ if (expectedToken && localStorage.getItem('cart_token') === expectedToken)
525
+ localStorage.removeItem('cart_token');
526
+ _this.setCartSyncState('authentication-changed', 'authentication');
527
+ _this.toastrService.show('operation-error-param');
528
+ }
529
+ else if (discardToken) {
530
+ _this.setCartSyncState('invalidated');
531
+ }
532
+ };
533
+ /** Reintenta una lectura fallida. Si el token ya fue invalidado, no crea otro carrito. */
534
+ this.retryCartSync = function () {
535
+ var _a;
536
+ if (_this.cartSyncStateSubject.value.status === 'syncing')
537
+ return false;
538
+ if (_this.pendingGuestCartAssociationToken && _this.cartSyncStateSubject.value.status === 'error') {
539
+ var token = _this.pendingGuestCartAssociationToken;
540
+ if (_this.authContext !== _this.getAuthContext() || _this.cart_token !== token || localStorage.getItem('cart_token') !== token)
541
+ return false;
542
+ _this.setCartSyncState('syncing');
543
+ _this.getCartByToken(token);
544
+ return true;
545
+ }
546
+ if (_this.cartBootstrapPickupRequiredForRetry && _this.cartSyncStateSubject.value.status === 'error') {
547
+ if (_this.authContext !== _this.getAuthContext())
548
+ return false;
549
+ _this.setCartSyncState('syncing');
550
+ _this.startCartBootstrapPickup(_this.pendingCheckoutRecovery);
551
+ return true;
552
+ }
553
+ if (_this.cartBootstrapLookupRequiredForRetry && _this.cartSyncStateSubject.value.status === 'error') {
554
+ if (_this.authContext !== _this.getAuthContext())
555
+ return false;
556
+ _this.cartBootstrapLookupRequiredForRetry = false;
557
+ _this.setCartSyncState('syncing');
558
+ _this.getCart(_this.pendingCheckoutRecovery);
559
+ return true;
560
+ }
561
+ if (_this.cartNotActiveToken && _this.cartSyncStateSubject.value.status === 'error') {
562
+ var token = _this.cartNotActiveToken || ((_a = _this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token);
563
+ if (!token || _this.authContext !== _this.getAuthContext())
564
+ return false;
565
+ _this.startCartNotActiveRecovery(token, _this.cartTransitionIdForToken(token));
566
+ return true;
567
+ }
568
+ if (_this.authContextBlocked) {
569
+ if (!_this.authRetryAllowed || _this.authContext !== _this.getAuthContext())
570
+ return false;
571
+ _this.authContext = _this.getAuthContext();
572
+ _this.authContextBlocked = false;
573
+ _this.authRetryAllowed = false;
574
+ _this.cartSyncBlocked = true;
575
+ _this.pendingCheckoutRecovery = false;
576
+ _this.setCartSyncState('syncing');
577
+ _this.getCart();
578
+ return true;
579
+ }
580
+ if (_this.cartSyncStateSubject.value.status !== 'error' || _this.authContext !== _this.getAuthContext())
581
+ return false;
582
+ if (!localStorage.getItem('cart_token'))
583
+ return false;
584
+ _this.scheduleCartRefresh(_this.pendingCheckoutRecovery);
585
+ return true;
586
+ };
587
+ /** Reanuda explícitamente un checkout interrumpido consultando /carts sin token. */
588
+ this.recoverInterruptedCheckout = function () {
589
+ if (!_this.checkoutInvalidatedAt || _this.cartSyncStateSubject.value.status !== 'error')
590
+ return false;
591
+ if (_this.authContext !== _this.getAuthContext()) {
592
+ _this.invalidateLocalCart(true, true);
593
+ return false;
594
+ }
595
+ _this.setCartSyncState('syncing');
596
+ _this.cartSyncBlocked = true;
597
+ _this.pendingCheckoutRecovery = true;
598
+ _this.getCart(true);
599
+ return true;
600
+ };
601
+ /** Impide enviar nuevas mutaciones mientras la pestaña reconcilia una invalidación remota. */
602
+ this.canMutateCart = function () { return !_this.authContextBlocked && !_this.cartSyncBlocked && !!_this.cart_token; };
603
+ /** Confirma que el resumen listo ya pertenece al contexto de autenticación vigente. */
604
+ this.isCartReadyForCurrentAuthContext = function () {
605
+ return _this.cartSyncStateSubject.value.status === 'ready' &&
606
+ !_this.authContextBlocked &&
607
+ !_this.cartSyncBlocked &&
608
+ !_this.pendingGuestCartAssociationToken &&
609
+ _this.authContext === _this.getAuthContext();
610
+ };
611
+ this.discardPendingBootstrapCartAdds = function () {
612
+ _this.pendingBootstrapCartAdds = [];
613
+ _this.pendingBootstrapCartAddsLimitNotified = false;
614
+ _this.pendingBootstrapCartAddInFlight = false;
615
+ _this.pendingBootstrapCartQueueGeneration++;
616
+ };
617
+ this.flushPendingBootstrapCartAdds = function () {
618
+ if (!_this.pendingBootstrapCartAdds.length || _this.pendingBootstrapCartAddInFlight ||
619
+ !_this.canMutateCart() || _this.requestInProcess.getValue())
620
+ return;
621
+ var pending = _this.pendingBootstrapCartAdds.shift();
622
+ var queueGeneration = _this.pendingBootstrapCartQueueGeneration;
623
+ _this.pendingBootstrapCartAddInFlight = true;
624
+ _this.addToCart(pending.product, pending.quantity, pending.variantId, pending.comments, true, queueGeneration);
625
+ // Las validaciones locales pueden terminar sin iniciar HTTP. Sigue con
626
+ // la próxima intención en vez de dejar el resto pendiente.
627
+ if (queueGeneration === _this.pendingBootstrapCartQueueGeneration && !_this.requestInProcess.getValue()) {
628
+ _this.pendingBootstrapCartAddInFlight = false;
629
+ _this.flushPendingBootstrapCartAdds();
630
+ }
631
+ };
632
+ /** Detecta el contrato de carrito finalizado sin tratar otros conflictos HTTP como invalidez del carrito. */
633
+ this.isCartNotActiveError = function (error) {
634
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
635
+ if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) !== 409)
636
+ return false;
637
+ var headerCode = ((_c = (_b = error) === null || _b === void 0 ? void 0 : _b.headers) === null || _c === void 0 ? void 0 : _c.get) ? error.headers.get('X-Error-Code') : null;
638
+ var body = (_d = error) === null || _d === void 0 ? void 0 : _d.error;
639
+ var bodyCodes = typeof body === 'string' ? [body] : [
640
+ (_e = body) === null || _e === void 0 ? void 0 : _e.code,
641
+ (_f = body) === null || _f === void 0 ? void 0 : _f.errorCode,
642
+ (_g = body) === null || _g === void 0 ? void 0 : _g.error_code,
643
+ typeof ((_h = body) === null || _h === void 0 ? void 0 : _h.error) === 'string' ? body.error : (_k = (_j = body) === null || _j === void 0 ? void 0 : _j.error) === null || _k === void 0 ? void 0 : _k.code,
644
+ (_l = body) === null || _l === void 0 ? void 0 : _l.message,
645
+ (_m = body) === null || _m === void 0 ? void 0 : _m.detail,
646
+ (_o = body) === null || _o === void 0 ? void 0 : _o['hydra:description']
647
+ ];
648
+ return headerCode === 'CART_NOT_ACTIVE' || bodyCodes.indexOf('CART_NOT_ACTIVE') >= 0;
649
+ };
650
+ /** Consume un CART_NOT_ACTIVE, invalida solo el token de esa solicitud e inicia una recuperación única. */
651
+ this.handleCartMutationError = function (error, requestToken) {
652
+ if (requestToken === void 0) { requestToken = _this.cart_token || null; }
653
+ var _a;
654
+ if (!_this.isCartNotActiveError(error))
655
+ return false;
656
+ _this.discardPendingBootstrapCartAdds();
657
+ _this.cartBootstrapAllowsPendingAdds = false;
658
+ if (!requestToken)
659
+ return true;
660
+ var transitionId = _this.cartTransitionIdForToken(requestToken);
661
+ if (((_a = _this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token) === requestToken)
662
+ return true;
663
+ if (_this.cartNotActiveTransitionId === transitionId)
664
+ return true;
665
+ var sharedToken = localStorage.getItem('cart_token') || null;
666
+ if (sharedToken && sharedToken !== requestToken) {
667
+ // Otro contexto ya adoptó un sucesor. Reconciliarlo en vez de invalidarlo o crear otro.
668
+ _this.notifyCheckoutInvalidation(transitionId, 'cart-not-active', requestToken);
669
+ _this.scheduleCartRefresh(false);
670
+ return true;
671
+ }
672
+ if (sharedToken !== requestToken) {
673
+ // El token compartido ya fue retirado por otra pestaña, que pudo cerrarse
674
+ // antes de publicar cart-ready. Dejar este contexto invalidado; el watchdog
675
+ // habilita el reintento manual, sin repetir esta mutación ni crear otro carrito.
676
+ if (_this.cart_token === requestToken) {
677
+ _this.notifyCheckoutInvalidation(transitionId, 'cart-not-active', requestToken);
678
+ _this.cartNotActiveToken = requestToken;
679
+ _this.cartNotActiveTransitionId = transitionId;
680
+ _this.pendingCheckoutRecovery = false;
681
+ _this.invalidateLocalCart(false, false);
682
+ _this.setCartSyncState('invalidated', 'cart-not-active');
683
+ _this.startCartNotActiveRecoveryWatchdog(transitionId);
684
+ }
685
+ return true;
686
+ }
687
+ _this.cartNotActiveToken = requestToken;
688
+ _this.cartNotActiveTransitionId = transitionId;
689
+ _this.cartSyncBlocked = true;
690
+ _this.pendingCheckoutRecovery = false;
691
+ _this.notifyCheckoutInvalidation(transitionId, 'cart-not-active', requestToken);
692
+ _this.invalidateLocalCart(false, true, requestToken);
693
+ _this.setCartSyncState('syncing');
694
+ _this.publishCartSync('cart-invalidated', transitionId);
695
+ _this.toastrService.show('cart-not-active-recovering');
696
+ _this.startCartNotActiveRecovery(requestToken, transitionId);
697
+ return true;
698
+ };
699
+ this.startCartNotActiveRecovery = function (failedToken, transitionId) {
700
+ var _a;
701
+ if (((_a = _this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token) === failedToken)
702
+ return _this.cartNotActiveRecovery.promise;
703
+ var sharedToken = localStorage.getItem('cart_token') || null;
704
+ if (sharedToken && sharedToken !== failedToken) {
705
+ _this.scheduleCartRefresh(false);
706
+ return Promise.resolve(false);
707
+ }
708
+ _this.cartSyncBlocked = true;
709
+ _this.setCartSyncState('syncing');
710
+ var authContext = _this.getAuthContext();
711
+ var context = _this.captureCartResponseContext();
712
+ var promise = _this.connection.post(_this.cartItemsApi(), {}).pipe(timeout(_this.cartRequestTimeoutMs)).toPromise()
713
+ .then(function (response) {
714
+ if (authContext !== _this.getAuthContext()) {
715
+ _this.authContext = _this.getAuthContext();
716
+ _this.invalidateLocalCart(true, true, failedToken);
717
+ return false;
718
+ }
719
+ if (context.generation !== _this.cartLifecycleGeneration)
720
+ return false;
721
+ var currentToken = localStorage.getItem('cart_token') || null;
722
+ if (currentToken && currentToken !== failedToken) {
723
+ _this.scheduleCartRefresh(false);
724
+ return false;
725
+ }
726
+ if (!_this.initializeCart(response, context)) {
727
+ _this.cartSyncBlocked = true;
728
+ _this.setCartSyncState('error', 'cart-not-active');
729
+ _this.publishCartSync('cart-recovery-failed', transitionId);
730
+ return false;
731
+ }
732
+ _this.cartNotActiveTransitionId = null;
733
+ _this.cartNotActiveToken = null;
734
+ if (_this.cartNotActiveRecoveryTimer)
735
+ clearTimeout(_this.cartNotActiveRecoveryTimer);
736
+ _this.publishCartSync('cart-ready', transitionId);
737
+ return true;
738
+ })
739
+ .catch(function (error) {
740
+ var _a, _b, _c;
741
+ if (authContext !== _this.getAuthContext()) {
742
+ _this.authContext = _this.getAuthContext();
743
+ _this.invalidateLocalCart(true, true, failedToken);
744
+ return false;
745
+ }
746
+ if (context.generation !== _this.cartLifecycleGeneration)
747
+ return false;
748
+ if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 403) {
749
+ _this.authContextBlocked = true;
750
+ _this.authRetryAllowed = false;
751
+ _this.cartNotActiveToken = null;
752
+ _this.invalidateLocalCart(true, true, failedToken);
753
+ _this.setCartSyncState('authentication-changed', 'authentication');
754
+ return false;
755
+ }
756
+ _this.cartSyncBlocked = true;
757
+ _this.setCartSyncState('error', ((_c = error) === null || _c === void 0 ? void 0 : _c.status) >= 500 ? 'server' : 'cart-not-active');
758
+ _this.publishCartSync('cart-recovery-failed', transitionId);
759
+ return false;
760
+ })
761
+ .then(function (result) {
762
+ var _a;
763
+ if (((_a = _this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token) === failedToken)
764
+ _this.cartNotActiveRecovery = null;
765
+ return result;
766
+ });
767
+ _this.cartNotActiveRecovery = { token: failedToken, transitionId: transitionId, promise: promise };
768
+ return promise;
769
+ };
770
+ this.startCartNotActiveRecoveryWatchdog = function (transitionId) {
771
+ if (_this.cartNotActiveRecoveryTimer)
772
+ clearTimeout(_this.cartNotActiveRecoveryTimer);
773
+ _this.cartNotActiveRecoveryTimer = setTimeout(function () {
774
+ if (_this.cartNotActiveTransitionId !== transitionId ||
775
+ _this.cartSyncStateSubject.value.status !== 'invalidated')
776
+ return;
777
+ _this.setCartSyncState('error', 'cart-not-active');
778
+ }, _this.checkoutRecoveryTimeoutMs);
779
+ };
136
780
  this.getAddressBook = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
137
781
  return [2 /*return*/, this.connection.get(this.addressBookApi()).pipe(map(function (res) { var _a; return ((_a = res) === null || _a === void 0 ? void 0 : _a.length) && res.map(function (addres) { return addres && __assign(__assign({}, addres), { selected: addres.default }); }) || null; })).toPromise()];
138
782
  }); }); };
139
783
  this.getTaxes = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
140
784
  return [2 /*return*/, this.connection.post(this.taxesApi(), { token: this.cart_token }).subscribe(function (res) { return res; })];
141
785
  }); }); };
142
- this.getCart = function () { return __awaiter(_this, void 0, void 0, function () {
143
- var _this = this;
144
- return __generator(this, function (_a) {
145
- return [2 /*return*/, this.connection.post(this.cartItemsApi(), ((this.cart_token && this.items.length >= 1) && { token: this.cart_token })).subscribe(function (res) { return _this.initializeCart(res); })];
786
+ this.getCart = function (checkoutRecovery) {
787
+ if (checkoutRecovery === void 0) { checkoutRecovery = false; }
788
+ return __awaiter(_this, void 0, void 0, function () {
789
+ var token, context, authContext, navigationId;
790
+ var _this = this;
791
+ return __generator(this, function (_a) {
792
+ if (this.cartBootstrapLookupInFlight)
793
+ return [2 /*return*/];
794
+ this.cartBootstrapAllowsPendingAdds = !checkoutRecovery;
795
+ this.pendingBootstrapCartAddsLimitNotified = false;
796
+ token = this.cart_token || null;
797
+ if (!token) {
798
+ this.cartBootstrapPickupRequiredForRetry = true;
799
+ return [2 /*return*/, this.startCartBootstrapPickup(checkoutRecovery)];
800
+ }
801
+ context = this.captureCartResponseContext(false);
802
+ authContext = this.getAuthContext();
803
+ navigationId = this.getCurrentRouterNavigationId();
804
+ this.cartBootstrapLookupInFlight = true;
805
+ this.cartBootstrapLookupRequiredForRetry = false;
806
+ this.cartSyncBlocked = true;
807
+ this.setCartSyncState('syncing');
808
+ return [2 /*return*/, this.connection.getErrorNotHandler("shop-api/" + this.consts.getChannel() + "/carts/" + token + "?locale=" + this.consts.getLocale()).pipe(timeout(this.cartRequestTimeoutMs)).subscribe(function (response) {
809
+ _this.cartBootstrapLookupInFlight = false;
810
+ if (context.generation !== _this.cartLifecycleGeneration || context.requestId !== _this.cartRequestId) {
811
+ _this.resumeCartBootstrapIfInvalidated(checkoutRecovery);
812
+ return;
813
+ }
814
+ if (authContext !== _this.getAuthContext()) {
815
+ _this.authContext = _this.getAuthContext();
816
+ _this.invalidateLocalCart(true, true, token);
817
+ return;
818
+ }
819
+ if (_this.cart_token !== token || localStorage.getItem('cart_token') !== token) {
820
+ _this.cartBootstrapLookupRequiredForRetry = false;
821
+ if (localStorage.getItem('cart_token')) {
822
+ _this.scheduleCartRefresh(false);
823
+ }
824
+ else if (!_this.authContextBlocked) {
825
+ _this.invalidateLocalCart(false, false);
826
+ _this.cartBootstrapPickupRequiredForRetry = true;
827
+ _this.startCartBootstrapPickup(checkoutRecovery);
828
+ }
829
+ return;
830
+ }
831
+ if (!_this.initializeCart(response, context)) {
832
+ _this.discardPendingBootstrapCartAdds();
833
+ _this.cartBootstrapLookupRequiredForRetry = true;
834
+ _this.cartSyncBlocked = true;
835
+ _this.setCartSyncState('error', 'invalid-response');
836
+ _this.toastrService.show('operation-error-param');
837
+ return;
838
+ }
839
+ _this.cartBootstrapLookupRequiredForRetry = false;
840
+ _this.cartBootstrapPickupRequiredForRetry = false;
841
+ if (checkoutRecovery)
842
+ _this.finishCheckoutCartRecovery();
843
+ }, function (error) {
844
+ var _a, _b, _c, _d;
845
+ _this.cartBootstrapLookupInFlight = false;
846
+ if (context.generation !== _this.cartLifecycleGeneration || context.requestId !== _this.cartRequestId) {
847
+ _this.resumeCartBootstrapIfInvalidated(checkoutRecovery);
848
+ return;
849
+ }
850
+ if (authContext !== _this.getAuthContext()) {
851
+ _this.authContext = _this.getAuthContext();
852
+ _this.discardPendingBootstrapCartAdds();
853
+ _this.invalidateLocalCart(true, true, token);
854
+ return;
855
+ }
856
+ if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 404) {
857
+ if (_this.cart_token !== token || localStorage.getItem('cart_token') !== token) {
858
+ _this.cartBootstrapLookupRequiredForRetry = false;
859
+ if (localStorage.getItem('cart_token')) {
860
+ _this.scheduleCartRefresh(false);
861
+ }
862
+ else if (!_this.authContextBlocked) {
863
+ _this.invalidateLocalCart(false, false);
864
+ _this.markCartBootstrapRecoveryPending(navigationId);
865
+ _this.cartBootstrapPickupRequiredForRetry = true;
866
+ _this.startCartBootstrapPickup(checkoutRecovery, true);
867
+ }
868
+ return;
869
+ }
870
+ _this.cartBootstrapLookupRequiredForRetry = false;
871
+ _this.invalidateLocalCart(false, true, token);
872
+ _this.markCartBootstrapRecoveryPending(navigationId);
873
+ _this.cartBootstrapPickupRequiredForRetry = true;
874
+ _this.startCartBootstrapPickup(checkoutRecovery, true);
875
+ return;
876
+ }
877
+ _this.requestInProcess.next(false);
878
+ if (((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 401 || ((_c = error) === null || _c === void 0 ? void 0 : _c.status) === 403) {
879
+ _this.cartBootstrapLookupRequiredForRetry = false;
880
+ _this.cartBootstrapPickupRequiredForRetry = false;
881
+ _this.cartBootstrapRecoveryNavigation = null;
882
+ _this.invalidateLocalCart(true, true, token);
883
+ }
884
+ else {
885
+ _this.discardPendingBootstrapCartAdds();
886
+ _this.cartBootstrapLookupRequiredForRetry = true;
887
+ _this.setCartSyncState('error', checkoutRecovery ? 'checkout-interrupted' : (((_d = error) === null || _d === void 0 ? void 0 : _d.status) >= 500 ? 'server' : 'network'));
888
+ _this.toastrService.show('operation-error-param');
889
+ }
890
+ })];
891
+ });
146
892
  });
147
- }); };
148
- this.getCartByToken = function () { return __awaiter(_this, void 0, void 0, function () {
149
- var _this = this;
150
- return __generator(this, function (_a) {
151
- return [2 /*return*/, this.connection.post(this.cartItemsApi(), ((this.cart_token) && { token: this.cart_token })).subscribe(function (res) { return _this.initializeCart(res); })];
893
+ };
894
+ this.startCartBootstrapPickup = function (checkoutRecovery, recoveredInactiveToken) {
895
+ if (checkoutRecovery === void 0) { checkoutRecovery = false; }
896
+ if (recoveredInactiveToken === void 0) { recoveredInactiveToken = false; }
897
+ if (_this.cartBootstrapPickup)
898
+ return _this.cartBootstrapPickup;
899
+ recoveredInactiveToken = recoveredInactiveToken || !!_this.cartBootstrapRecoveryNavigation;
900
+ var sharedToken = localStorage.getItem('cart_token') || null;
901
+ if (sharedToken) {
902
+ _this.cartBootstrapPickupRequiredForRetry = false;
903
+ _this.cartBootstrapLookupRequiredForRetry = false;
904
+ _this.scheduleCartRefresh(false);
905
+ return Promise.resolve(false);
906
+ }
907
+ _this.cartSyncBlocked = true;
908
+ _this.setCartSyncState('syncing');
909
+ var authContext = _this.getAuthContext();
910
+ var context = _this.captureCartResponseContext(false);
911
+ var request = _this.connection.post(_this.cartItemsApi(), null).pipe(timeout(_this.cartRequestTimeoutMs)).toPromise()
912
+ .then(function (response) {
913
+ if (authContext !== _this.getAuthContext()) {
914
+ _this.authContext = _this.getAuthContext();
915
+ _this.cartBootstrapPickupRequiredForRetry = false;
916
+ _this.cartBootstrapRecoveryNavigation = null;
917
+ _this.invalidateLocalCart(true, true);
918
+ return false;
919
+ }
920
+ if (context.generation !== _this.cartLifecycleGeneration || context.requestId !== _this.cartRequestId)
921
+ return false;
922
+ var currentSharedToken = localStorage.getItem('cart_token') || null;
923
+ if (currentSharedToken && currentSharedToken !== context.token) {
924
+ _this.cartBootstrapPickupRequiredForRetry = false;
925
+ _this.cartBootstrapLookupRequiredForRetry = false;
926
+ _this.scheduleCartRefresh(false);
927
+ return false;
928
+ }
929
+ if (!_this.initializeCart(response, context)) {
930
+ _this.discardPendingBootstrapCartAdds();
931
+ _this.cartBootstrapPickupRequiredForRetry = true;
932
+ _this.cartSyncBlocked = true;
933
+ _this.setCartSyncState('error', 'invalid-response');
934
+ _this.toastrService.show('operation-error-param');
935
+ return false;
936
+ }
937
+ _this.cartBootstrapLookupRequiredForRetry = false;
938
+ _this.cartBootstrapPickupRequiredForRetry = false;
939
+ if (recoveredInactiveToken) {
940
+ _this.publishCartSync('changed');
941
+ _this.completeCartBootstrapRecovery();
942
+ }
943
+ if (checkoutRecovery)
944
+ _this.finishCheckoutCartRecovery();
945
+ return true;
946
+ })
947
+ .catch(function (error) {
948
+ var _a, _b, _c;
949
+ if (authContext !== _this.getAuthContext()) {
950
+ _this.authContext = _this.getAuthContext();
951
+ _this.cartBootstrapPickupRequiredForRetry = false;
952
+ _this.cartBootstrapRecoveryNavigation = null;
953
+ _this.invalidateLocalCart(true, true);
954
+ return false;
955
+ }
956
+ if (context.generation !== _this.cartLifecycleGeneration)
957
+ return false;
958
+ _this.requestInProcess.next(false);
959
+ if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 403) {
960
+ _this.discardPendingBootstrapCartAdds();
961
+ _this.cartBootstrapLookupRequiredForRetry = false;
962
+ _this.cartBootstrapPickupRequiredForRetry = false;
963
+ _this.cartBootstrapRecoveryNavigation = null;
964
+ _this.invalidateLocalCart(true, true);
965
+ return false;
966
+ }
967
+ _this.discardPendingBootstrapCartAdds();
968
+ _this.cartBootstrapPickupRequiredForRetry = true;
969
+ _this.cartSyncBlocked = true;
970
+ _this.setCartSyncState('error', checkoutRecovery ? 'checkout-interrupted' : (((_c = error) === null || _c === void 0 ? void 0 : _c.status) >= 500 ? 'server' : 'network'));
971
+ _this.toastrService.show('operation-error-param');
972
+ return false;
973
+ })
974
+ .then(function (result) {
975
+ if (_this.cartBootstrapPickup === request)
976
+ _this.cartBootstrapPickup = null;
977
+ if (!result)
978
+ _this.resumeCartBootstrapIfInvalidated(checkoutRecovery);
979
+ return result;
152
980
  });
153
- }); };
981
+ _this.cartBootstrapPickup = request;
982
+ return request;
983
+ };
984
+ this.resumeCartBootstrapIfInvalidated = function (checkoutRecovery) {
985
+ if (!_this.authContextBlocked && !_this.cart_token && _this.cartSyncBlocked &&
986
+ _this.cartSyncStateSubject.value.status === 'invalidated' &&
987
+ !_this.cartNotActiveToken && !_this.pendingCheckoutRecovery) {
988
+ _this.getCart(checkoutRecovery);
989
+ }
990
+ };
991
+ this.finishCheckoutCartRecovery = function () {
992
+ _this.pendingCheckoutRecovery = false;
993
+ _this.checkoutInvalidatedAt = 0;
994
+ if (_this.checkoutRecoveryTimer)
995
+ clearTimeout(_this.checkoutRecoveryTimer);
996
+ _this.completedCheckoutTransitionId = _this.activeCheckoutTransitionId;
997
+ _this.publishCartSync('checkout-ready', _this.activeCheckoutTransitionId);
998
+ _this.activeCheckoutTransitionId = null;
999
+ };
1000
+ this.getCartByToken = function (token) {
1001
+ if (token === void 0) { token = _this.cart_token; }
1002
+ return __awaiter(_this, void 0, void 0, function () {
1003
+ var context, authContext;
1004
+ var _this = this;
1005
+ return __generator(this, function (_a) {
1006
+ if (!token || token !== this.cart_token || localStorage.getItem('cart_token') !== token)
1007
+ return [2 /*return*/];
1008
+ context = this.captureCartResponseContext(false);
1009
+ authContext = this.getAuthContext();
1010
+ this.cartSyncBlocked = true;
1011
+ this.setCartSyncState('syncing');
1012
+ this.requestInProcess.next(true);
1013
+ return [2 /*return*/, this.connection.post(this.cartItemsApi(), { token: token }).pipe(timeout(this.cartRequestTimeoutMs)).subscribe(function (res) {
1014
+ if (authContext !== _this.getAuthContext() || context.generation !== _this.cartLifecycleGeneration || _this.cart_token !== token)
1015
+ return;
1016
+ _this.pendingGuestCartAssociationToken = null;
1017
+ if (!_this.initializeCart(res, context)) {
1018
+ _this.cartSyncBlocked = true;
1019
+ _this.pendingGuestCartAssociationToken = token;
1020
+ _this.setCartSyncState('error', 'invalid-response');
1021
+ _this.toastrService.show('operation-error-param');
1022
+ return;
1023
+ }
1024
+ }, function (error) {
1025
+ var _a, _b, _c;
1026
+ if (authContext !== _this.getAuthContext() || context.generation !== _this.cartLifecycleGeneration || _this.cart_token !== token)
1027
+ return;
1028
+ _this.requestInProcess.next(false);
1029
+ _this.cartSyncBlocked = true;
1030
+ _this.pendingGuestCartAssociationToken = token;
1031
+ _this.setCartSyncState('error', ((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 403 ? 'authentication' : (((_c = error) === null || _c === void 0 ? void 0 : _c.status) >= 500 ? 'server' : 'network'));
1032
+ _this.toastrService.show('operation-error-param');
1033
+ })];
1034
+ });
1035
+ });
1036
+ };
154
1037
  this.getCartByCustomer = function () { return __awaiter(_this, void 0, void 0, function () {
1038
+ var context;
155
1039
  var _this = this;
156
1040
  return __generator(this, function (_a) {
157
- return [2 /*return*/, this.connection.post(this.cartItemsApi()).subscribe(function (res) { return _this.initializeCart(res); })
158
- /**
159
- * @private
160
- * CART CRUD SERVER'S SYNCRONIZED
161
- */
162
- ];
1041
+ context = this.captureCartResponseContext(false);
1042
+ this.cartSyncBlocked = true;
1043
+ this.setCartSyncState('syncing');
1044
+ return [2 /*return*/, this.connection.post(this.cartItemsApi()).subscribe(function (res) { return _this.initializeCart(res, context); })];
163
1045
  });
164
1046
  }); };
165
1047
  /**
166
1048
  * @private
167
1049
  * CART CRUD SERVER'S SYNCRONIZED
168
1050
  */
169
- this.initializeCart = function (response) {
170
- _this.cart_token = response.tokenValue;
171
- localStorage.setItem('cart_token', _this.cart_token);
1051
+ this.initializeCart = function (response, context) {
1052
+ if (!_this.applyCartResponse(response, context, false, false, false)) {
1053
+ _this.requestInProcess.next(false);
1054
+ return false;
1055
+ }
172
1056
  _this.locale = response.locale;
173
- /* let localeFromStorage = localStorage.getItem('LOCALE')
174
- console.log(localeFromStorage)
175
- this.locale = localeFromStorage ? localeFromStorage : response.locale;
176
- response.locale = this.locale */
177
- _this.updateCartObj(response, false);
178
- _this.updateCartItems(_this.transformItems(response.items));
1057
+ _this.cartSyncBlocked = false;
1058
+ _this.setCartSyncState('ready');
179
1059
  _this.requestInProcess.next(false);
1060
+ _this.flushPendingBootstrapCartAdds();
1061
+ return true;
1062
+ };
1063
+ /** Captura la generación del ciclo del carrito y el orden de inicio de la petición. */
1064
+ this.captureCartResponseContext = function (allowTokenChange) {
1065
+ if (allowTokenChange === void 0) { allowTokenChange = true; }
1066
+ return ({
1067
+ token: _this.cart_token || null,
1068
+ generation: _this.cartLifecycleGeneration,
1069
+ requestId: ++_this.cartRequestId,
1070
+ allowTokenChange: allowTokenChange
1071
+ });
1072
+ };
1073
+ this.isCartResponseContextCurrent = function (context) { return !!context &&
1074
+ context.generation === _this.cartLifecycleGeneration &&
1075
+ (context.allowTokenChange || context.token === (_this.cart_token || null)) &&
1076
+ context.requestId >= _this.lastAppliedCartRequestId; };
1077
+ this.isCartBusinessError = function (response) {
1078
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
1079
+ var errors = (_a = response) === null || _a === void 0 ? void 0 : _a.errors;
1080
+ return !!(((_b = response) === null || _b === void 0 ? void 0 : _b.error) || ((_c = response) === null || _c === void 0 ? void 0 : _c.code) || (Array.isArray(errors) ? errors.length > 0 : errors) ||
1081
+ ((_d = response) === null || _d === void 0 ? void 0 : _d.status) === 'failure' || ((_f = (_e = response) === null || _e === void 0 ? void 0 : _e.cart_response) === null || _f === void 0 ? void 0 : _f.status) === 'failure' || ((_h = (_g = response) === null || _g === void 0 ? void 0 : _g.cart) === null || _h === void 0 ? void 0 : _h.error) || ((_k = (_j = response) === null || _j === void 0 ? void 0 : _j.cart) === null || _k === void 0 ? void 0 : _k.status) === 'failure');
1082
+ };
1083
+ /** Adopta y sincroniza un resumen exitoso si todavía pertenece a la versión vigente del carrito. */
1084
+ this.applyCartResponse = function (response, context, emitEvent, publishInvalidation, flushPendingAdds) {
1085
+ if (emitEvent === void 0) { emitEvent = true; }
1086
+ if (publishInvalidation === void 0) { publishInvalidation = true; }
1087
+ if (flushPendingAdds === void 0) { flushPendingAdds = true; }
1088
+ var _a;
1089
+ if (_this.isCartBusinessError(response))
1090
+ return false;
1091
+ var cart = ((_a = response) === null || _a === void 0 ? void 0 : _a.cart) && response.cart.tokenValue ? response.cart : response;
1092
+ if (!cart || !cart.tokenValue || !Array.isArray(cart.items))
1093
+ return false;
1094
+ // Una respuesta de un ciclo anterior (por ejemplo, antes del checkout o
1095
+ // de una invalidación remota) no debe volver a activar la sincronización.
1096
+ if (!context || context.generation !== _this.cartLifecycleGeneration)
1097
+ return false;
1098
+ var sharedToken = localStorage.getItem('cart_token') || null;
1099
+ if (sharedToken !== context.token) {
1100
+ // Otra pestaña ya avanzó el token compartido. La mutación pudo
1101
+ // ejecutarse, así que reconciliamos desde ese token sin adoptarla.
1102
+ if (publishInvalidation) {
1103
+ _this.publishCartSync('changed');
1104
+ _this.scheduleCartRefresh(_this.pendingCheckoutRecovery);
1105
+ }
1106
+ return false;
1107
+ }
1108
+ // La mutación pudo ejecutarse en backend, aunque otra respuesta más nueva
1109
+ // ya haya sido aplicada localmente. Invalidamos y leemos el token vigente.
1110
+ if (context.requestId < _this.lastAppliedCartRequestId) {
1111
+ if (publishInvalidation) {
1112
+ _this.publishCartSync('changed');
1113
+ _this.scheduleCartRefresh(_this.pendingCheckoutRecovery);
1114
+ }
1115
+ return false;
1116
+ }
1117
+ if (!_this.isCartResponseContextCurrent(context))
1118
+ return false;
1119
+ if (cart.tokenValue !== _this.cart_token) {
1120
+ _this.cart_token = cart.tokenValue;
1121
+ localStorage.setItem('cart_token', cart.tokenValue);
1122
+ }
1123
+ if (publishInvalidation)
1124
+ _this.publishCartSync('changed');
1125
+ _this.lastAppliedCartRequestId = context.requestId;
1126
+ _this.updateCartObj(cart, emitEvent);
1127
+ _this.syncCartItemsFromResponse(cart);
1128
+ _this.cartSyncBlocked = false;
1129
+ _this.setCartSyncState('ready');
1130
+ if (flushPendingAdds)
1131
+ _this.flushPendingBootstrapCartAdds();
180
1132
  return true;
181
1133
  };
182
1134
  /**
@@ -256,10 +1208,13 @@ var CartService = /** @class */ (function () {
256
1208
  _this.syncCartItemsFromResponse(cart);
257
1209
  // this.toastrService.show('product-added');
258
1210
  };
259
- this.removeCartItem = function (cart, product, toast) {
1211
+ this.removeCartItem = function (cart, product, toast, alreadySynchronized) {
260
1212
  if (toast === void 0) { toast = true; }
261
- _this.updateCartObj(cart, false);
262
- _this.syncCartItemsFromResponse(cart);
1213
+ if (alreadySynchronized === void 0) { alreadySynchronized = false; }
1214
+ if (!alreadySynchronized) {
1215
+ _this.updateCartObj(cart, false);
1216
+ _this.syncCartItemsFromResponse(cart);
1217
+ }
263
1218
  toast && _this.requestInProcess.next(false);
264
1219
  toast && _this.toastrService.show('product-removed');
265
1220
  // this.googleAnalytics.removeFromCart(product);
@@ -279,14 +1234,22 @@ var CartService = /** @class */ (function () {
279
1234
  localStorage.setItem('cart', JSON.stringify(_this.items));
280
1235
  };
281
1236
  this.resetCart = function (next) {
1237
+ _this.discardPendingBootstrapCartAdds();
1238
+ _this.cartBootstrapAllowsPendingAdds = false;
1239
+ var tokenToReset = _this.cart_token || null;
1240
+ _this.cartLifecycleGeneration++;
282
1241
  _this.items = [];
283
1242
  _this.cartSubject.next(null);
284
1243
  _this.updateBalanceAttributes(null);
1244
+ _this.couponSubject.next(null);
1245
+ _this.promotionsSubject.next([]);
285
1246
  _this.cart_token = null;
286
1247
  _this.cartItemsSubject.next([]);
287
1248
  _this.count = 0;
1249
+ _this.requestInProcess.next(false);
288
1250
  localStorage.setItem('cart', "[]");
289
- localStorage.removeItem('cart_token');
1251
+ if (tokenToReset && localStorage.getItem('cart_token') === tokenToReset)
1252
+ localStorage.removeItem('cart_token');
290
1253
  next && next();
291
1254
  };
292
1255
  this.updateCartObj = function (cart, emitEvent) {
@@ -312,8 +1275,27 @@ var CartService = /** @class */ (function () {
312
1275
  * @public
313
1276
  * CART CRUD
314
1277
  */
315
- this.addToCart = function (product, quantity, variant_id, comments) {
1278
+ this.addToCart = function (product, quantity, variant_id, comments, fromBootstrapQueue, queueGeneration) {
1279
+ if (fromBootstrapQueue === void 0) { fromBootstrapQueue = false; }
316
1280
  var _a, _b, _c, _d;
1281
+ if (!_this.canMutateCart()) {
1282
+ // El agregado aún no se envió al backend. Retenerlo durante el
1283
+ // bootstrap evita perder el primer click después de F5, sin
1284
+ // habilitar mutaciones durante una invalidación o un error.
1285
+ if (_this.cartBootstrapAllowsPendingAdds && !_this.authContextBlocked &&
1286
+ (_this.cartBootstrapLookupInFlight || _this.cartBootstrapPickup)) {
1287
+ if (_this.pendingBootstrapCartAdds.length >= _this.maxPendingBootstrapCartAdds) {
1288
+ if (!_this.pendingBootstrapCartAddsLimitNotified) {
1289
+ _this.pendingBootstrapCartAddsLimitNotified = true;
1290
+ _this.toastrService.show('operation-error-param');
1291
+ }
1292
+ }
1293
+ else {
1294
+ _this.pendingBootstrapCartAdds.push({ product: product, quantity: quantity, variantId: variant_id, comments: comments });
1295
+ }
1296
+ }
1297
+ return;
1298
+ }
317
1299
  if (_this.requestInProcess.getValue()) {
318
1300
  return;
319
1301
  }
@@ -328,9 +1310,10 @@ var CartService = /** @class */ (function () {
328
1310
  _this.toastrService.show('must-select-customer');
329
1311
  return;
330
1312
  }
331
- _this.requestInProcess.next(true);
332
1313
  var added = _this.addIfAllreadyExists(product, variant_id, quantity, comments);
333
1314
  if (!added) {
1315
+ _this.requestInProcess.next(true);
1316
+ var context_1 = _this.captureCartResponseContext();
334
1317
  var payload = {
335
1318
  productCode: product.id,
336
1319
  quantity: quantity,
@@ -340,76 +1323,105 @@ var CartService = /** @class */ (function () {
340
1323
  payload.comments = comments;
341
1324
  }
342
1325
  _this.connection.post(_this.addItemApi(), payload)
343
- .pipe(finalize(function () { return _this.requestInProcess.next(false); }))
1326
+ .pipe(finalize(function () {
1327
+ _this.requestInProcess.next(false);
1328
+ if (fromBootstrapQueue && queueGeneration === _this.pendingBootstrapCartQueueGeneration) {
1329
+ _this.pendingBootstrapCartAddInFlight = false;
1330
+ }
1331
+ _this.flushPendingBootstrapCartAdds();
1332
+ }))
344
1333
  .subscribe(function (res) {
345
1334
  // Manejar la respuesta HTTP exitosa (código 200)
346
- _this.appendToCart(res);
347
- _this.toastrService.show('product-added');
1335
+ if (_this.applyCartResponse(res, context_1))
1336
+ _this.toastrService.show('product-added');
348
1337
  }, function (err) {
349
1338
  // Manejar el error de la llamada HTTP (código 500 u otro error)
350
1339
  if (err.status === 500) {
351
1340
  // Código de error 500 (timeout)
352
- _this.handleError(err);
1341
+ _this.handleError(err, context_1.token);
353
1342
  _this.toastrService.show('Ha ocurrido un error al agregar al carrito. Vuelva a intentarlo.');
354
1343
  }
355
1344
  else {
356
1345
  // Otro código de error
357
- _this.handleError(err);
1346
+ _this.handleError(err, context_1.token);
358
1347
  // this.toastrService.show('Error inesperado. Vuelva a intentarlo');
359
1348
  }
360
1349
  });
361
1350
  }
362
1351
  };
363
1352
  this.addToLot = function (product, quantity, variant_id, id, order_item_id, lot_quantity, unit_price, unit_total, ajustement_total, total_lot, lot_status, date_request, notes, shipping_address_id, shipping_address_name, action) {
1353
+ if (!_this.canMutateCart())
1354
+ return;
364
1355
  if (!_this.authService.isAbleToBuy()) {
365
1356
  _this.toastrService.show('must-select-customer');
366
1357
  return;
367
1358
  }
1359
+ var context = _this.captureCartResponseContext();
368
1360
  var added = '';
369
1361
  !added && _this.connection.post(_this.addItemApi(), { productCode: product.id, quantity: quantity, variantCode: variant_id, id: id || '', order_item_id: order_item_id || '', lot_quantity: lot_quantity || '', unit_price: unit_price || '', unit_total: unit_total || '', ajustement_total: ajustement_total || '', total_lot: total_lot || '', lot_status: lot_status || '', date_request: date_request || '', notes: notes || '', shipping_address_id: shipping_address_id || '', shipping_address_name: shipping_address_name || '', action: action || 'newlot' })
370
- .subscribe(function (res) { return _this.appendToCart(res); }, function (err) { return _this.handleError(err); });
1362
+ .subscribe(function (res) { return _this.applyCartResponse(res, context); }, function (err) { return _this.handleError(err, context.token); });
371
1363
  };
372
1364
  this.addToCartPromise = function (product, quantity, variant_id, comments) { return __awaiter(_this, void 0, void 0, function () {
373
- var added, result;
1365
+ var added, context, result, error_1;
374
1366
  return __generator(this, function (_a) {
375
1367
  switch (_a.label) {
376
1368
  case 0:
1369
+ if (!this.canMutateCart())
1370
+ return [2 /*return*/, { error: true }];
377
1371
  if (!this.authService.isAbleToBuy()) {
378
1372
  this.toastrService.show('must-select-customer');
379
- return [2 /*return*/];
1373
+ return [2 /*return*/, { error: true }];
380
1374
  }
381
- this.requestInProcess.next(true);
382
1375
  added = this.addIfAllreadyExists(product, variant_id, quantity, comments);
383
- if (!!added) return [3 /*break*/, 2];
384
- return [4 /*yield*/, (this.connection.post(this.addItemApi(), { productCode: product.id, quantity: quantity, variantCode: variant_id }).toPromise())];
1376
+ if (!!added) return [3 /*break*/, 5];
1377
+ this.requestInProcess.next(true);
1378
+ context = this.captureCartResponseContext();
1379
+ _a.label = 1;
385
1380
  case 1:
1381
+ _a.trys.push([1, 3, 4, 5]);
1382
+ return [4 /*yield*/, this.connection.post(this.addItemApi(), { productCode: product.id, quantity: quantity, variantCode: variant_id }).toPromise()];
1383
+ case 2:
386
1384
  result = _a.sent();
387
- if (!result || result.error)
388
- this.handleError(result.error);
389
- else {
390
- this.appendToCart(result);
391
- return [2 /*return*/, { error: false }];
1385
+ if (this.isCartBusinessError(result)) {
1386
+ this.handleError(result);
1387
+ return [2 /*return*/, { error: true }];
392
1388
  }
393
- _a.label = 2;
394
- case 2: return [2 /*return*/, { error: true }];
1389
+ if (this.applyCartResponse(result, context))
1390
+ return [2 /*return*/, { error: false }];
1391
+ return [2 /*return*/, { error: true }];
1392
+ case 3:
1393
+ error_1 = _a.sent();
1394
+ this.handleError(error_1, context.token);
1395
+ return [2 /*return*/, { error: true }];
1396
+ case 4:
1397
+ this.requestInProcess.next(false);
1398
+ return [7 /*endfinally*/];
1399
+ case 5: return [2 /*return*/, { error: true }];
395
1400
  }
396
1401
  });
397
1402
  }); };
398
1403
  this.addAllToCart = function (items) {
1404
+ if (!_this.canMutateCart())
1405
+ return;
399
1406
  if (!_this.authService.isAbleToBuy()) {
400
1407
  _this.toastrService.show('must-select-customer');
401
1408
  return;
402
1409
  }
403
1410
  _this.requestInProcess.next(true);
1411
+ var context = _this.captureCartResponseContext();
404
1412
  var params = { items: _this.mergeItemsAddAllToCart(items) };
405
1413
  _this.connection.post(_this.addAllItemsApi(), params)
406
1414
  .toPromise().then(function (res) {
407
- _this.updateCartObj(res.cart) && _this.updateCartItems(_this.transformItems(res.cart.items));
408
- res.cart_response.status == 'success' && _this.toastrService.show('products-added');
1415
+ if (_this.applyCartResponse(res, context) && res.cart_response.status == 'success')
1416
+ _this.toastrService.show('products-added');
409
1417
  }, function (err) {
410
- _this.handleError(err);
1418
+ _this.handleError(err, context.token);
411
1419
  }).catch(function (err) {
412
- _this.handleError(err);
1420
+ _this.handleError(err, context.token);
1421
+ }).then(function () {
1422
+ _this.requestInProcess.next(false);
1423
+ }, function () {
1424
+ _this.requestInProcess.next(false);
413
1425
  });
414
1426
  };
415
1427
  this.mergeItemsAddAllToCart = function (items) {
@@ -426,8 +1438,12 @@ var CartService = /** @class */ (function () {
426
1438
  return __spread(items, paramsMerge);
427
1439
  };
428
1440
  this.updateItemQuantity = function (item, quantity, comments) {
1441
+ if (!_this.canMutateCart())
1442
+ return;
429
1443
  if (_this.validateQuantity(item, quantity) && (_this.validatePriceAndCredits(item, quantity))) {
1444
+ var queueGeneration_1 = _this.pendingBootstrapCartAddInFlight ? _this.pendingBootstrapCartQueueGeneration : null;
430
1445
  _this.requestInProcess.next(true);
1446
+ var context_2 = _this.captureCartResponseContext();
431
1447
  var payload = { quantity: Number(quantity) };
432
1448
  if (comments !== undefined) {
433
1449
  var cleaned = ((comments !== null && comments !== void 0 ? comments : '')).trim();
@@ -435,12 +1451,17 @@ var CartService = /** @class */ (function () {
435
1451
  }
436
1452
  _this.connection
437
1453
  .put(_this.updateItemQuantityApi(_this.findItemByIdVariant(item.variant_id)), payload)
438
- .pipe(finalize(function () { return _this.requestInProcess.next(false); }))
1454
+ .pipe(finalize(function () {
1455
+ _this.requestInProcess.next(false);
1456
+ if (queueGeneration_1 !== null && queueGeneration_1 === _this.pendingBootstrapCartQueueGeneration) {
1457
+ _this.pendingBootstrapCartAddInFlight = false;
1458
+ }
1459
+ _this.flushPendingBootstrapCartAdds();
1460
+ }))
439
1461
  .subscribe(function (res) {
440
- _this.updateCartObj(res);
441
- _this.syncCartItemsFromResponse(res);
442
- _this.toastrService.show('product-updated', { quantity: quantity });
443
- }, function (err) { return _this.handleError(err); });
1462
+ if (_this.applyCartResponse(res, context_2))
1463
+ _this.toastrService.show('product-updated', { quantity: quantity });
1464
+ }, function (err) { return _this.handleError(err, context_2.token); });
444
1465
  }
445
1466
  };
446
1467
  this.validateQuantity = function (item, quantity) {
@@ -512,16 +1533,38 @@ var CartService = /** @class */ (function () {
512
1533
  };
513
1534
  this.deleteCartItem = function (item, toast) {
514
1535
  if (toast === void 0) { toast = true; }
1536
+ if (!_this.canMutateCart())
1537
+ return;
515
1538
  var id_buscado = _this.findItemByIdVariant(item.variant_id);
516
1539
  _this.requestInProcess.next(true);
1540
+ var context = _this.captureCartResponseContext();
517
1541
  // this.connection.post(this.addItemApi(), { productCode: item.product.id, quantity: 0, variantCode: item.variant_id, id: '', order_item_id: item.item_id, lot_quantity: '', unit_price: '', unit_total: '', ajustement_total: '', total_lot: '', lot_status: '', date_request: '', notes: '', shipping_address_id: '', shipping_address_name: '', action: 'deleteorderitem'})
518
1542
  // .subscribe(
519
1543
  // res => this.removeCartItem(res, item, toast),
520
1544
  // err => this.handleError(err)
521
1545
  // );
522
- _this.connection.delete(_this.deleteItemApi(id_buscado)).subscribe(function (res) { _this.removeCartItem(res, item, toast); _this.requestInProcess.next(false); }, function (err) { _this.handleError(err); _this.requestInProcess.next(false); });
1546
+ _this.connection.delete(_this.deleteItemApi(id_buscado)).subscribe(function (res) {
1547
+ var _a, _b, _c;
1548
+ var applied = _this.applyCartResponse(res, context, false);
1549
+ if (applied) {
1550
+ _this.removeCartItem(res, item, toast, true);
1551
+ }
1552
+ else if (!_this.isCartBusinessError(res) && context.generation === _this.cartLifecycleGeneration &&
1553
+ !(((_a = res) === null || _a === void 0 ? void 0 : _a.tokenValue) && Array.isArray(res.items)) && !(((_c = (_b = res) === null || _b === void 0 ? void 0 : _b.cart) === null || _c === void 0 ? void 0 : _c.tokenValue) && Array.isArray(res.cart.items))) {
1554
+ // DELETE puede confirmar la eliminación sin devolver un resumen.
1555
+ // Solo esa operación conoce que el backend sí ejecutó el cambio.
1556
+ _this.publishCartSync('changed');
1557
+ _this.scheduleCartRefresh(_this.pendingCheckoutRecovery);
1558
+ }
1559
+ _this.requestInProcess.next(false);
1560
+ }, function (err) { _this.handleError(err, context.token); _this.requestInProcess.next(false); });
523
1561
  };
524
- this.handleError = function (error) {
1562
+ this.handleError = function (error, requestToken) {
1563
+ if (requestToken === void 0) { requestToken = _this.cart_token || null; }
1564
+ if (_this.handleCartMutationError(error, requestToken)) {
1565
+ _this.requestInProcess.next(false);
1566
+ return;
1567
+ }
525
1568
  _this.toastrService.show('operation-error-param');
526
1569
  _this.requestInProcess.next(false);
527
1570
  };
@@ -703,34 +1746,43 @@ var CartService = /** @class */ (function () {
703
1746
  };
704
1747
  };
705
1748
  this.addCoupon = function (code) { return __awaiter(_this, void 0, void 0, function () {
706
- var result, e_1;
1749
+ var context, result, e_1;
707
1750
  return __generator(this, function (_a) {
708
1751
  switch (_a.label) {
709
1752
  case 0:
710
- _a.trys.push([0, 2, , 3]);
711
- return [4 /*yield*/, this.connection.put(this.couponApi(), { coupon: code }).toPromise()];
1753
+ if (!this.canMutateCart())
1754
+ return [2 /*return*/, { error: true, message: 'invalid-coupon' }];
1755
+ context = this.captureCartResponseContext();
1756
+ _a.label = 1;
712
1757
  case 1:
1758
+ _a.trys.push([1, 3, , 4]);
1759
+ return [4 /*yield*/, this.connection.put(this.couponApi(), { coupon: code }).toPromise()];
1760
+ case 2:
713
1761
  result = _a.sent();
714
- if (result.error || result.errors)
1762
+ if (!this.applyCartResponse(result, context, false))
715
1763
  return [2 /*return*/, { error: true, message: 'invalid-coupon' }];
716
- this.updateCartObj(result, false);
717
- this.syncCartItemsFromResponse(result);
718
1764
  return [2 /*return*/, { error: false, message: 'ok' }];
719
- case 2:
1765
+ case 3:
720
1766
  e_1 = _a.sent();
1767
+ if (this.handleCartMutationError(e_1, context.token))
1768
+ return [2 /*return*/, { error: true, message: 'cart-not-active' }];
721
1769
  return [2 /*return*/, { error: true, message: 'invalid-coupon' }];
722
- case 3: return [2 /*return*/];
1770
+ case 4: return [2 /*return*/];
723
1771
  }
724
1772
  });
725
1773
  }); };
726
1774
  this.removeCoupon = function () { return __awaiter(_this, void 0, void 0, function () {
1775
+ var context;
727
1776
  var _this = this;
728
1777
  return __generator(this, function (_a) {
729
- return [2 /*return*/, this.connection.delete(this.couponApi()).pipe(map(function (res) {
730
- _this.updateCartObj(res, false);
731
- _this.syncCartItemsFromResponse(res);
732
- return true;
733
- })).toPromise()];
1778
+ if (!this.canMutateCart())
1779
+ return [2 /*return*/, false];
1780
+ context = this.captureCartResponseContext();
1781
+ return [2 /*return*/, this.connection.delete(this.couponApi()).pipe(map(function (res) { return _this.applyCartResponse(res, context, false); })).toPromise().catch(function (error) {
1782
+ if (_this.handleCartMutationError(error, context.token))
1783
+ return false;
1784
+ throw error;
1785
+ })];
734
1786
  });
735
1787
  }); };
736
1788
  this.formatCoupon = function (cart) {
@@ -782,7 +1834,13 @@ var CartService = /** @class */ (function () {
782
1834
  return __generator(this, function (_a) {
783
1835
  switch (_a.label) {
784
1836
  case 0:
785
- this.cart_token = token;
1837
+ if (token && token !== this.cart_token) {
1838
+ this.cartLifecycleGeneration++;
1839
+ this.lastAppliedCartRequestId = ++this.cartRequestId;
1840
+ this.cart_token = token;
1841
+ localStorage.setItem('cart_token', token);
1842
+ this.publishCartSync('changed');
1843
+ }
786
1844
  return [4 /*yield*/, this.getCartByToken()];
787
1845
  case 1:
788
1846
  result = _a.sent();
@@ -936,14 +1994,79 @@ var CartService = /** @class */ (function () {
936
1994
  this.requestInProcess.next(true);
937
1995
  this.items = JSON.parse(localStorage.getItem('cart')) || [];
938
1996
  this.cart_token = localStorage.getItem('cart_token') || null;
939
- this.authService.loggedIn.subscribe(function (res) { return _this.getCart(); });
1997
+ this.authContext = this.getAuthContext();
1998
+ this.lastRouterNavigationId = (_d = (_c = (_b = (_a = this.router).getCurrentNavigation) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.id, (_d !== null && _d !== void 0 ? _d : null));
1999
+ this.routerNavigationSubscription = ((_e = this.router.events) === null || _e === void 0 ? void 0 : _e.subscribe(function (event) {
2000
+ if (event instanceof NavigationStart)
2001
+ _this.lastRouterNavigationId = event.id;
2002
+ })) || null;
940
2003
  this.channelConfigService.channelConfig$.subscribe(function (res) { return _this.channelConfig = res; });
2004
+ window.addEventListener('storage', this.storageListener);
2005
+ window.addEventListener('pageshow', this.pageshowListener);
2006
+ document.addEventListener('visibilitychange', this.visibilityListener);
2007
+ this.checkPendingCartSync();
2008
+ this.authService.loggedIn.subscribe(function () {
2009
+ var _a;
2010
+ var nextContext = _this.getAuthContext();
2011
+ if (nextContext !== _this.authContext) {
2012
+ var previousContext = JSON.parse(_this.authContext || '[]');
2013
+ var guestToken = _this.cart_token || localStorage.getItem('cart_token') || null;
2014
+ var hasGuestItems = ((_a = _this.items) === null || _a === void 0 ? void 0 : _a.length) > 0 || _this.pendingBootstrapCartAdds.length > 0;
2015
+ var guestToAuthenticated = !previousContext[0] && _this.authService.isAuthenticated();
2016
+ _this.authContext = nextContext;
2017
+ _this.authContextBlocked = false;
2018
+ _this.authRetryAllowed = false;
2019
+ if (guestToAuthenticated && guestToken && hasGuestItems) {
2020
+ _this.pendingGuestCartAssociationToken = guestToken;
2021
+ _this.cartLifecycleGeneration++;
2022
+ _this.lastAppliedCartRequestId = ++_this.cartRequestId;
2023
+ _this.cart_token = guestToken;
2024
+ localStorage.setItem('cart_token', guestToken);
2025
+ _this.cartSyncBlocked = true;
2026
+ _this.pendingCheckoutRecovery = false;
2027
+ _this.setCartSyncState('syncing');
2028
+ _this.getCartByToken(guestToken);
2029
+ return;
2030
+ }
2031
+ _this.pendingGuestCartAssociationToken = null;
2032
+ _this.invalidateLocalCart(false, true);
2033
+ }
2034
+ if (_this.pendingCheckoutRecovery && !localStorage.getItem('cart_token'))
2035
+ return;
2036
+ if (_this.cartSyncBlocked && _this.cartSyncStateSubject.value.status === 'syncing')
2037
+ return;
2038
+ _this.getCart();
2039
+ });
941
2040
  }
2041
+ CartService.prototype.ngOnDestroy = function () {
2042
+ var _a;
2043
+ window.removeEventListener('storage', this.storageListener);
2044
+ window.removeEventListener('pageshow', this.pageshowListener);
2045
+ document.removeEventListener('visibilitychange', this.visibilityListener);
2046
+ if (this.cartSyncTimer)
2047
+ clearTimeout(this.cartSyncTimer);
2048
+ if (this.checkoutRecoveryTimer)
2049
+ clearTimeout(this.checkoutRecoveryTimer);
2050
+ if (this.cartNotActiveRecoveryTimer)
2051
+ clearTimeout(this.cartNotActiveRecoveryTimer);
2052
+ (_a = this.routerNavigationSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
2053
+ };
2054
+ /** Consume el evento de bootstrap una sola vez y solo durante la navegación que inició la recuperación. */
2055
+ CartService.prototype.consumeCartBootstrapRecovery = function () {
2056
+ var pending = this.cartBootstrapRecoveryNavigation;
2057
+ if (!pending || !pending.completed)
2058
+ return false;
2059
+ this.cartBootstrapRecoveryNavigation = null;
2060
+ var currentNavigationId = this.getCurrentRouterNavigationId();
2061
+ return pending.navigationId !== null && pending.navigationId === currentNavigationId;
2062
+ };
942
2063
  CartService.prototype.getCart2 = function () {
943
2064
  return this.cartItemsSubject.value;
944
2065
  };
945
2066
  CartService.prototype.addRepeatOrderToCart = function (items) {
946
2067
  var _this = this;
2068
+ if (!this.canMutateCart())
2069
+ return;
947
2070
  if (this.cartItemsSubject.value.length > 0) {
948
2071
  this.toastrService.show('cart-not-empty');
949
2072
  return;
@@ -965,17 +2088,20 @@ var CartService = /** @class */ (function () {
965
2088
  items: itemsToAdd
966
2089
  };
967
2090
  this.requestInProcess.next(true);
2091
+ var context = this.captureCartResponseContext();
968
2092
  this.connection.post(this.addAllItemsApi(), params)
969
2093
  .toPromise()
970
2094
  .then(function (res) {
971
- var _a, _b, _c, _d, _e;
972
- if (((_a = res) === null || _a === void 0 ? void 0 : _a.status) === 'failure') {
973
- var errorMessage = ((_b = res.error) === null || _b === void 0 ? void 0 : _b.toLowerCase().replace(/\s+/g, '_')) || 'unknown_error';
2095
+ var _a, _b, _c, _d, _e, _f, _g;
2096
+ if (((_a = res) === null || _a === void 0 ? void 0 : _a.status) === 'failure' || ((_c = (_b = res) === null || _b === void 0 ? void 0 : _b.cart_response) === null || _c === void 0 ? void 0 : _c.status) === 'failure') {
2097
+ var errorMessage = ((_d = res.error) === null || _d === void 0 ? void 0 : _d.toLowerCase().replace(/\s+/g, '_')) || 'unknown_error';
974
2098
  _this.toastrService.show(errorMessage);
975
2099
  return;
976
2100
  }
977
- var itemsResponse = ((_c = res) === null || _c === void 0 ? void 0 : _c.items_response) || [];
978
- var cartItems = ((_e = (_d = res) === null || _d === void 0 ? void 0 : _d.cart) === null || _e === void 0 ? void 0 : _e.items) || [];
2101
+ if (!_this.applyCartResponse(res, context))
2102
+ return;
2103
+ var itemsResponse = ((_e = res) === null || _e === void 0 ? void 0 : _e.items_response) || [];
2104
+ var cartItems = ((_g = (_f = res) === null || _f === void 0 ? void 0 : _f.cart) === null || _g === void 0 ? void 0 : _g.items) || [];
979
2105
  var outOfStockItems = itemsResponse.filter(function (item) {
980
2106
  return item.status === 'failure' &&
981
2107
  item.errors.some(function (error) { return error.code === 'out_of_stock'; });
@@ -988,16 +2114,19 @@ var CartService = /** @class */ (function () {
988
2114
  _this.toastrService.show('some-products-out-of-stock');
989
2115
  }
990
2116
  if (cartItems.length > 0) {
991
- _this.updateCartObj(res.cart);
992
- _this.updateCartItems(_this.transformItems(cartItems));
993
2117
  _this.toastrService.show('products-added');
994
2118
  _this.router.navigate(['/cart']);
995
2119
  }
996
2120
  }, function (err) {
997
- _this.handleError(err);
2121
+ _this.handleError(err, context.token);
998
2122
  })
999
2123
  .catch(function (err) {
1000
- _this.handleError(err);
2124
+ _this.handleError(err, context.token);
2125
+ })
2126
+ .then(function () {
2127
+ _this.requestInProcess.next(false);
2128
+ }, function () {
2129
+ _this.requestInProcess.next(false);
1001
2130
  });
1002
2131
  };
1003
2132
  CartService.prototype.clearCart = function () {
@@ -1009,7 +2138,15 @@ var CartService = /** @class */ (function () {
1009
2138
  //this.resetCart(this.getCart);
1010
2139
  };
1011
2140
  CartService.prototype.clearAndResetCart = function () {
1012
- this.resetCart(this.getCart);
2141
+ var _this = this;
2142
+ this.activeCheckoutTransitionId = this.cartTransitionIdForToken(this.cart_token || localStorage.getItem('cart_token'));
2143
+ this.publishCartSync('checkout-invalidated', this.activeCheckoutTransitionId);
2144
+ this.pendingCheckoutRecovery = true;
2145
+ this.cartSyncBlocked = true;
2146
+ this.checkoutInvalidatedAt = Date.now();
2147
+ this.setCartSyncState('invalidated');
2148
+ this.startCheckoutRecoveryWatchdog();
2149
+ this.resetCart(function () { return _this.getCart(true); });
1013
2150
  };
1014
2151
  CartService.prototype.clearAndResetCustomerCart = function () {
1015
2152
  console.log("Clearing and reseting...");
@@ -1059,7 +2196,7 @@ var CartService = /** @class */ (function () {
1059
2196
  { type: Router },
1060
2197
  { type: PricePresentationService }
1061
2198
  ]; };
1062
- CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new i1.CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i1.ToastService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.OrderUtilityService), i0.ɵɵinject(i1.AnalyticsService), i0.ɵɵinject(i1.ChannelConfigService), i0.ɵɵinject(i3.Router), i0.ɵɵinject(i1.PricePresentationService)); }, token: i1.CartService, providedIn: "root" });
2199
+ CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i2.ToastService), i0.ɵɵinject(i3.Constants), i0.ɵɵinject(i4.AuthService), i0.ɵɵinject(i5.OrderUtilityService), i0.ɵɵinject(i6.AnalyticsService), i0.ɵɵinject(i7.ChannelConfigService), i0.ɵɵinject(i8.Router), i0.ɵɵinject(i9.PricePresentationService)); }, token: CartService, providedIn: "root" });
1063
2200
  CartService = __decorate([
1064
2201
  Injectable({
1065
2202
  providedIn: 'root'
@@ -1068,4 +2205,4 @@ var CartService = /** @class */ (function () {
1068
2205
  return CartService;
1069
2206
  }());
1070
2207
  export { CartService };
1071
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHMUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7OztBQUt4STtJQWtESSxxQkFBb0IsVUFBNkIsRUFBVSxhQUEyQixFQUFVLE1BQWlCLEVBQ3JHLFdBQXdCLEVBQVUsVUFBK0IsRUFBVSxnQkFBa0MsRUFDN0csb0JBQTBD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RUFBRSxNQUFNO1NBQ3JCLENBQUM7T0FDVyxXQUFXLENBaWtDdkI7c0JBemxDRDtDQXlsQ0MsQUFqa0NELElBaWtDQztTQWprQ1ksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XG5pbXBvcnQgeyBDYXJ0SXRlbSwgQ2FydEl0ZW1QcmljaW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0LWl0ZW0nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvdXBvbkkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvdXBvbic7XG5pbXBvcnQgeyBPcmRlclV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvb3JkZXItdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrb3V0RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlY2tvdXQtZGF0YSc7XG5pbXBvcnQgeyBDYXJ0QWZmb3JkYWJsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC9jYXJ0LWFmZm9yZGFibGUnO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoYW5uZWwnO1xuaW1wb3J0IHsgQ2FydFRvdGFsUHJpY2luZ1ZhbHVlLCBDYXJ0VG90YWxzUHJpY2luZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC10b3RhbHMnO1xuaW1wb3J0IHsgQ2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbiwgQ2FydFN1bW1hcnlQcmljZVByZXNlbnRhdGlvbiwgUHJpY2VQcmVzZW50YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvcHJpY2UtcHJlc2VudGF0aW9uLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENhcnRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGNhcnRJdGVtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxDYXJ0SXRlbVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgIHByaXZhdGUgY291cG9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgIHByaXZhdGUgY2FydFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICBwcml2YXRlIHJlcXVlc3RJblByb2Nlc3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBwcml2YXRlIHByb21vdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXREYXRhW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZD86IGJvb2xlYW47XG4gICAgICAgIGFsbG93RXhjZWVkQmFsYW5jZT86IGJvb2xlYW47XG4gICAgICAgIGNyZWRpdEFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICAgIHNob3dNYXg/OiBib29sZWFuO1xuICAgICAgICBzaG93UHJpY2U/OiBib29sZWFuO1xuICAgICAgICByZW1haW5pbmdDcmVkaXRzPzogbnVtYmVyO1xuICAgICAgICBhcHBseU1heE9yZGVycz86IGJvb2xlYW47XG4gICAgICAgIG1heE9yZGVycz86IG51bWJlcjtcbiAgICB9IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBpdGVtcyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb3VudDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGxvY2FsZSA9IFwiXCI7XG4gICAgcHJpdmF0ZSBsb2dnZWRfaW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGhhdmVfdG9fdXBkYXRlID0gdHJ1ZTtcbiAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogYW55ID0ge307XG4gICAgcHJpdmF0ZSBjYXJ0X2Jhc2VVcmwgPSAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMnO1xuXG4gICAgcHVibGljIGNhcnRJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRJdGVtQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zJyArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgYWRkQWxsSXRlbXNBcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvbXVsdGlwbGUtaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyB1cGRhdGVJdGVtUXVhbnRpdHlBcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBkZWxldGVJdGVtQXBpID0gKGl0ZW1faWQpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9pdGVtcy8nICsgaXRlbV9pZCArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgY291cG9uQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2NvdXBvbic7XG4gICAgcHVibGljIGFkZHJlc3NCb29rQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2FkZHJlc3MtYm9vayc7XG4gICAgcHVibGljIHRheGVzQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2NhcnRzL3RheCc7XG5cbiAgICBwdWJsaWMgY2FydF90b2tlbjtcbiAgICBwdWJsaWMgY2FydEl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKGl0ZW1zID0+IHRoaXMuc3dpdGNoUHJpY2VJbkNhcnRJdGVtKGl0ZW1zKSkpXG4gICAgcHVibGljIGNvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY2FydCA9IHRoaXMuY2FydFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb21vdGlvbnMgPSB0aGlzLnByb21vdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkZWxldGluZzogQm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBiYWxhbmNlQ3VzdG9tZXIkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBhbGxvd0FueVBheW1lbnRNZXRob2QkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uYWxsb3dBbnlQYXltZW50TWV0aG9kID8/IG51bGwpKTtcbiAgICBwdWJsaWMgYWxsb3dFeGNlZWRCYWxhbmNlJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmFsbG93RXhjZWVkQmFsYW5jZSA/PyBudWxsKSk7XG4gICAgcHVibGljIGNyZWRpdEFtb3VudCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5jcmVkaXRBbW91bnQgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93TWF4JCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LnNob3dNYXggPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93UHJpY2UkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uc2hvd1ByaWNlID8/IG51bGwpKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ1NlcnZpY2U6IENoYW5uZWxDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHByaWNlUHJlc2VudGF0aW9uU2VydmljZTogUHJpY2VQcmVzZW50YXRpb25TZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0JykpIHx8IFtdO1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkSW4uc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmdldENhcnQoKSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmNoYW5uZWxDb25maWcgPSByZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXJ0MigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzQm9vayA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5hZGRyZXNzQm9va0FwaSgpKS5waXBlKG1hcChyZXMgPT4gcmVzPy5sZW5ndGggJiYgcmVzLm1hcChhZGRyZXMgPT4geyByZXR1cm4gYWRkcmVzICYmIHsgLi4uYWRkcmVzLCBzZWxlY3RlZDogYWRkcmVzLmRlZmF1bHQgfSB9KSB8fCBudWxsKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgZ2V0VGF4ZXMgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRheGVzQXBpKCksIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KS5zdWJzY3JpYmUocmVzID0+IHJlcylcblxuICAgIHByaXZhdGUgZ2V0Q2FydCA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuY2FydEl0ZW1zQXBpKCksICgodGhpcy5jYXJ0X3Rva2VuICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IDEpICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeVRva2VuID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwgKCh0aGlzLmNhcnRfdG9rZW4pICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeUN1c3RvbWVyID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKiAgQ0FSVCBDUlVEIFNFUlZFUidTIFNZTkNST05JWkVEXG4gICAgICovXG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVDYXJ0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHJlc3BvbnNlLnRva2VuVmFsdWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0X3Rva2VuJywgdGhpcy5jYXJ0X3Rva2VuKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSByZXNwb25zZS5sb2NhbGU7XG4gICAgICAgIC8qIGxldCBsb2NhbGVGcm9tU3RvcmFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMT0NBTEUnKVxuICAgICAgICBjb25zb2xlLmxvZyhsb2NhbGVGcm9tU3RvcmFnZSlcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVGcm9tU3RvcmFnZSA/IGxvY2FsZUZyb21TdG9yYWdlIDogcmVzcG9uc2UubG9jYWxlO1xuICAgICAgICByZXNwb25zZS5sb2NhbGUgPSB0aGlzLmxvY2FsZSAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXModGhpcy50cmFuc2Zvcm1JdGVtcyhyZXNwb25zZS5pdGVtcykpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXNpZ25hIGBwcm9kdWN0LnByaWNlYCBhbCBwcmVjaW8gYmFzZSBsZWdhY3kgcXVlIGVzcGVyYSBlbCB0ZW1wbGF0ZSBoaXN0w7NyaWNvIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIMONdGVtcyBub3JtYWxpemFkb3MgZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgTG9zIG1pc21vcyDDrXRlbXMgY29uIGBwcm9kdWN0LnByaWNlYCBhbGluZWFkbyBhbCBwcmVjaW8gYmFzZSBtb3N0cmFkbyBlbiBsYSB0YWJsYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBtw6l0b2RvIG5vIG1vZGlmaWNhIGBwcmljaW5nLmZpbmFsUHJpY2VgLiBTb2xvIHByZXNlcnZhIGNvbXBhdGliaWxpZGFkIGNvbiB0ZW1wbGF0ZXNcbiAgICAgKiB2aWVqb3MgcXVlIHRvZGF2w61hIGxlZW4gYGl0ZW0ucHJvZHVjdC5wcmljZWAgZGlyZWN0YW1lbnRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3dpdGNoUHJpY2VJbkNhcnRJdGVtID0gKGl0ZW1zOiBDYXJ0SXRlbVtdKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoXG4gICAgICAgICAgICBpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5wcm9kdWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaWNpbmcgPSB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbS5wcm9kdWN0LnZhcmlhbnRzPy5bMF07XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC5wcmljZSA9IHByaWNpbmc/LmJhc2VQcmljZSB8fCB2YXJpYW50Py5zYWxlcHJpY2UgfHwgdmFyaWFudD8ucHJpY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0ZXBDYXJ0ID0gKHJlcykgPT4ge1xuICAgICAgICByZXMuaXRlbXMubGVuZ3RoID4gMCAmJiByZXMuaXRlbXMuZm9yRWFjaChcbiAgICAgICAgICAgIGl0ZW0gPT4gIXRoaXMuaXNJdGVtSW5Mb2NhbChpdGVtLmlkKSAmJiB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW0sIGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEFsbFRvQ2FydChcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gIXJlcy5pdGVtcy5zb21lKGV4dGVybmFsX2l0ZW0gPT4gZXh0ZXJuYWxfaXRlbS5pZCA9PSBpdGVtLml0ZW1faWQpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRJdGVtcyA9IChpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsQ2FydCgpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2luY3Jvbml6YSBgY2FydEl0ZW1zU3ViamVjdGAgY29uIGxhIMO6bHRpbWEgcmVzcHVlc3RhIGRlbCBiYWNrZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhcnQgUmVzcHVlc3RhIGRlIGNhcnJpdG8gcmVjaWJpZGEgZGVzZGUgY3VhbHF1aWVyIGVuZHBvaW50IHF1ZSBkZXZ1ZWx2YSBgaXRlbXNgLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZSByZXV0aWxpemEgZGVzcHXDqXMgZGUgYWN0dWFsaXphciBjYW50aWRhZGVzLCBhcGxpY2FyIGN1cMOzbiBvIHJlbW92ZXIgcHJvZHVjdG9zIHBhcmEgZXZpdGFyXG4gICAgICogcXVlIGxhIHRhYmxhIHF1ZWRlIGNvbiBzdWJ0b3RhbGVzIG8gcHJvbW9jaW9uZXMgZGVzYWN0dWFsaXphZGFzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZSA9IChjYXJ0KSA9PiB7XG4gICAgICAgIGlmICghY2FydD8uaXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbXMgPSB0aGlzLml0ZW1zIHx8IFtdO1xuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSB0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnQuaXRlbXMpLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW06IGFueSA9IHByZXZpb3VzSXRlbXMuZmluZChwcmV2ID0+IHByZXYuaXRlbV9pZCA9PSBpdGVtLml0ZW1faWQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBmYWlsZWQ6IHByZXZpb3VzSXRlbT8uZmFpbGVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBwcmV2aW91c0l0ZW0/LmVycm9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyhuZXh0SXRlbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydEl0ZW1RdWFudGl0eSA9ICh2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHM/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb21tZW50cyA9IGNvbW1lbnRzICE9PSB1bmRlZmluZWQgPyAoY29tbWVudHMgPz8gJycpLnRyaW0oKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IHRoaXMuaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIGlmIChpdC52YXJpYW50X2lkICE9PSB2YXJpYW50X2lkKSByZXR1cm4gaXQ7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkOiBhbnkgPSB7IC4uLml0LCBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRDb21tZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZC5jb21tZW50cyA9IG5vcm1hbGl6ZWRDb21tZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1zID0gbmV3SXRlbXM7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9jYWxDYXJ0KCk7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVG9DYXJ0ID0gKGNhcnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UoY2FydCk7XG4gICAgICAgIC8vICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LWFkZGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVDYXJ0SXRlbSA9IChjYXJ0LCBwcm9kdWN0LCB0b2FzdCA9IHRydWUpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICB0b2FzdCAmJiB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRvYXN0ICYmIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXJlbW92ZWQnKTtcbiAgICAgICAgLy8gdGhpcy5nb29nbGVBbmFseXRpY3MucmVtb3ZlRnJvbUNhcnQocHJvZHVjdCk7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3JlbW92ZV9mcm9tX2NhcnQnLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0cy5jdXJyZW5jeS5jb2RlIH0pXG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZElmQWxscmVhZHlFeGlzdHMgPSAocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHlBZGQgPSAxLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+XG4gICAgICAgIHRoaXMuaXRlbXMuZmluZCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLnByb2R1Y3QuaWQgPT0gcHJvZHVjdC5pZCAmJiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5KGl0ZW0sIHRoaXMuZmluZEl0ZW0ocHJvZHVjdC5pZCkucXVhbnRpdHkgKyBxdWFudGl0eUFkZCwgY29tbWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIHByaXZhdGUgdXBkYXRlTG9jYWxDYXJ0ID0gKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuaXRlbXMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0Q2FydCA9IChuZXh0PykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhudWxsKTtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnQnLCBcIltdXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRPYmogPSAoY2FydCwgZW1pdEV2ZW50ID0gdHJ1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCk7XG4gICAgICAgIHRoaXMudXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMoY2FydD8uYmFsYW5jZUN1c3RvbWVyLCBjYXJ0Py50b3RhbHM/LnRvdGFsKTtcbiAgICAgICAgZW1pdEV2ZW50ICYmIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ2FkZF90b19jYXJ0JywgY2FydCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dCh0aGlzLm9yZGVyVXRpbHMuZ2V0UHJvbW90aW9ucyhjYXJ0LCB0cnVlKSk7XG5cbiAgICAgICAgY2FydC5jb3Vwb25Db2RlXG4gICAgICAgICAgICA/IHRoaXMuZm9ybWF0Q291cG9uKGNhcnQpXG4gICAgICAgICAgICA6IHRoaXMuY291cG9uU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVDYXJ0QWZ0ZXJQYXltZW50UmVzcG9uc2UgPSAoY2FydDogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghY2FydD8udG90YWxzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJdGVtSW5Mb2NhbCA9IChpdGVtX2lkKSA9PiB0aGlzLml0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLml0ZW1faWQgPT0gaXRlbV9pZCk7XG5cbiAgICAvKipcbiAgICAgKiAgQHB1YmxpY1xuICAgICAqICBDQVJUIENSVURcbiAgICAgKi9cblxuICAgIGFkZFRvQ2FydCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuICAgICAgICBjb25zdCBhcHBseU1heE9yZGVycyA9IGJhbGFuY2U/LmFwcGx5TWF4T3JkZXJzID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBtYXhPcmRlcnMgPSBiYWxhbmNlPy5tYXhPcmRlcnMgPz8gSW5maW5pdHk7XG5cbiAgICAgICAgaWYgKGFwcGx5TWF4T3JkZXJzICYmIChtYXhPcmRlcnMgPD0gMCB8fCBtYXhPcmRlcnMgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4LW9yZGVycy1yZWFjaGVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIGxldCBhZGRlZCA9IHRoaXMuYWRkSWZBbGxyZWFkeUV4aXN0cyhwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHMpO1xuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF1YW50aXR5LFxuICAgICAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBsYSByZXNwdWVzdGEgSFRUUCBleGl0b3NhIChjw7NkaWdvIDIwMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC1hZGRlZCcpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBlbCBlcnJvciBkZSBsYSBsbGFtYWRhIEhUVFAgKGPDs2RpZ28gNTAwIHUgb3RybyBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDw7NkaWdvIGRlIGVycm9yIDUwMCAodGltZW91dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ0hhIG9jdXJyaWRvIHVuIGVycm9yIGFsIGFncmVnYXIgYWwgY2Fycml0by4gVnVlbHZhIGEgaW50ZW50YXJsby4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RybyBjw7NkaWdvIGRlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdFcnJvciBpbmVzcGVyYWRvLiBWdWVsdmEgYSBpbnRlbnRhcmxvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIGFkZFRvTG90ID0gKHByb2R1Y3Q6IFByb2R1Y3QsIHF1YW50aXR5OiBudW1iZXIsIHZhcmlhbnRfaWQsIGlkPywgb3JkZXJfaXRlbV9pZD8sIGxvdF9xdWFudGl0eT8sIHVuaXRfcHJpY2U/LCB1bml0X3RvdGFsPywgYWp1c3RlbWVudF90b3RhbD8sIHRvdGFsX2xvdD8sIGxvdF9zdGF0dXM/LCBkYXRlX3JlcXVlc3Q/LCBub3Rlcz8sIHNoaXBwaW5nX2FkZHJlc3NfaWQ/LCBzaGlwcGluZ19hZGRyZXNzX25hbWU/LCBhY3Rpb24/KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSAnJztcbiAgICAgICAgIWFkZGVkICYmIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkSXRlbUFwaSgpLCB7IHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLCBxdWFudGl0eTogcXVhbnRpdHksIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLCBpZDogaWQgfHwgJycsIG9yZGVyX2l0ZW1faWQ6IG9yZGVyX2l0ZW1faWQgfHwgJycsIGxvdF9xdWFudGl0eTogbG90X3F1YW50aXR5IHx8ICcnLCB1bml0X3ByaWNlOiB1bml0X3ByaWNlIHx8ICcnLCB1bml0X3RvdGFsOiB1bml0X3RvdGFsIHx8ICcnLCBhanVzdGVtZW50X3RvdGFsOiBhanVzdGVtZW50X3RvdGFsIHx8ICcnLCB0b3RhbF9sb3Q6IHRvdGFsX2xvdCB8fCAnJywgbG90X3N0YXR1czogbG90X3N0YXR1cyB8fCAnJywgZGF0ZV9yZXF1ZXN0OiBkYXRlX3JlcXVlc3QgfHwgJycsIG5vdGVzOiBub3RlcyB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogc2hpcHBpbmdfYWRkcmVzc19pZCB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiBzaGlwcGluZ19hZGRyZXNzX25hbWUgfHwgJycsIGFjdGlvbjogYWN0aW9uIHx8ICduZXdsb3QnIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB0aGlzLmFwcGVuZFRvQ2FydChyZXMpLFxuICAgICAgICAgICAgICAgIGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycilcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCB9KS50b1Byb21pc2UoKSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMuaGFuZGxlRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9XG4gICAgfVxuXG5cbiAgICBhZGRBbGxUb0NhcnQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGl0ZW1zOiB0aGlzLm1lcmdlSXRlbXNBZGRBbGxUb0NhcnQoaXRlbXMpIH07XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRBbGxJdGVtc0FwaSgpLCBwYXJhbXMpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCkudGhlbihcbiAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpICYmIHRoaXMudXBkYXRlQ2FydEl0ZW1zKHRoaXMudHJhbnNmb3JtSXRlbXMocmVzLmNhcnQuaXRlbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNhcnRfcmVzcG9uc2Uuc3RhdHVzID09ICdzdWNjZXNzJyAmJiB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkUmVwZWF0T3JkZXJUb0NhcnQoaXRlbXM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhcnQtbm90LWVtcHR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGVcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChpdGVtc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXByb2R1Y3RzLXRvLWFkZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zVG9BZGRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEFsbEl0ZW1zQXBpKCksIHBhcmFtcylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlcy5lcnJvcj8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICdfJykgfHwgJ3Vua25vd25fZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNSZXNwb25zZSA9IHJlcz8uaXRlbXNfcmVzcG9uc2UgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2FydEl0ZW1zID0gcmVzPy5jYXJ0Py5pdGVtcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mU3RvY2tJdGVtcyA9IGl0ZW1zUmVzcG9uc2UuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPT09ICdmYWlsdXJlJyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycy5zb21lKGVycm9yID0+IGVycm9yLmNvZGUgPT09ICdvdXRfb2Zfc3RvY2snKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnYWxsLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG91dE9mU3RvY2tJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzb21lLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnRJdGVtcykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyZ2VJdGVtc0FkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IHBhcmFtc01lcmdlID0gW11cbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1JbnRlcm5vID0gaXRlbXMuZmluZChpdGVtUGFyYW0gPT4gaXRlbVBhcmFtLnZhcmlhbnRDb2RlID09IGl0ZW0udmFyaWFudF9pZClcbiAgICAgICAgICAgIHBhcmFtc01lcmdlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS52YXJpYW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbUludGVybm8gJiYgaXRlbUludGVybm8ucXVhbnRpdHkgfHwgaXRlbS5xdWFudGl0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtUGFyYW0gPT4gIXRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpKVxuXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXMsIC4uLnBhcmFtc01lcmdlXVxuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1RdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZVF1YW50aXR5KGl0ZW0sIHF1YW50aXR5KSAmJiAodGhpcy52YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyhpdGVtLCBxdWFudGl0eSkpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0geyBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKGNvbW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gKGNvbW1lbnRzID8/ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNsZWFuZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC5wdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5QXBpKHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpKSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB2YWxpZGF0ZVF1YW50aXR5ID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSA+IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tYXhpbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpIDwgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1pbmltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWluaW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5taW5pbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ICYmIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ID4gMCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgJSBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHk6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuXG4gICAgICAgIGlmICghYmFsYW5jZSB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gbnVsbCB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXRQcmljZSA9IGl0ZW0udG90YWwgLyBpdGVtLnF1YW50aXR5O1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUXVhbnRpdHkgPSBxdWFudGl0eSAtIGl0ZW0ucXVhbnRpdHk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxRdWFudGl0eSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxDb3N0ID0gdW5pdFByaWNlICogYWRkaXRpb25hbFF1YW50aXR5O1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29zdCA+IGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cykge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBoYXNTdWZmaWNpZW50Q3JlZGl0c0ZvckNhcnRUb3RhbCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoIWJhbGFuY2UgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IG51bGwgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuY2FydFN1YmplY3QudmFsdWU/LnRvdGFscz8udG90YWwgfHwgMDtcblxuICAgICAgICAvLyBTaSBOTyBwdWVkZSBleGNlZGVyIHNhbGRvIHkgZWwgdG90YWwgc3VwZXJhIGVsIGNyZWRpdG8sIGJsb3F1ZWFyXG4gICAgICAgIGlmICghYmFsYW5jZS5hbGxvd0V4Y2VlZEJhbGFuY2UgJiYgdG90YWwgPiBiYWxhbmNlLmNyZWRpdEFtb3VudCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGNhbGN1bGF0ZVN0b2NrQ291bnRzID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5wcm9kdWN0LnN0b2NrIDwgaXRlbS5xdWFudGl0eSArIHF1YW50aXR5KSB7XG4gICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGRlbGV0ZUNhcnRJdGVtID0gKGl0ZW0sIHRvYXN0ID0gdHJ1ZSkgPT4ge1xuICAgICAgICBsZXQgaWRfYnVzY2FkbyA9IHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICAvLyAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLCBxdWFudGl0eTogMCwgdmFyaWFudENvZGU6IGl0ZW0udmFyaWFudF9pZCwgaWQ6ICcnLCBvcmRlcl9pdGVtX2lkOiBpdGVtLml0ZW1faWQsIGxvdF9xdWFudGl0eTogJycsIHVuaXRfcHJpY2U6ICcnLCB1bml0X3RvdGFsOiAnJywgYWp1c3RlbWVudF90b3RhbDogJycsIHRvdGFsX2xvdDogJycsIGxvdF9zdGF0dXM6ICcnLCBkYXRlX3JlcXVlc3Q6ICcnLCBub3RlczogICcnLCBzaGlwcGluZ19hZGRyZXNzX2lkOiAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiAnJywgYWN0aW9uOiAgJ2RlbGV0ZW9yZGVyaXRlbSd9KVxuICAgICAgICAvLyAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gICAgICAgICAgICByZXMgPT4gdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KSxcbiAgICAgICAgLy8gICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgIC8vICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuZGVsZXRlSXRlbUFwaShpZF9idXNjYWRvKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHsgdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICAgICAgZXJyID0+IHsgdGhpcy5oYW5kbGVFcnJvcihlcnIpOyB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7IH0sXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBjbGVhckNhcnQoKSB7XG4gICAgICAgIC8vc29sdWNpb24gcHJvdmlzYW9yaWFcbiAgICAgICAgbGV0IGl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdXG4gICAgICAgIHdoaWxlIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW1zLnBvcCgpLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICAvL3RoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldENhcnQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldEN1c3RvbWVyQ2FydCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDbGVhcmluZyBhbmQgcmVzZXRpbmcuLi5cIilcbiAgICAgICAgdGhpcy5yZXNldENhcnQodGhpcy5nZXRDYXJ0QnlDdXN0b21lcilcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvciA9IChlcnJvcjogeyBlcnJvcjogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvci1wYXJhbScpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgZ2V0Q291bnRGcm9tSXRlbUluQ2FydCA9IChjb2RlVmFyaWFudCk6IG51bWJlciA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gY29kZVZhcmlhbnQpPy5xdWFudGl0eSB8fCAwO1xuXG4gICAgZmluZEl0ZW1CeUlkVmFyaWFudCA9ICh2YXJpYW50X2lkKSA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkuaXRlbV9pZFxuXG4gICAgZmluZEl0ZW0gPSAocHJvZHVjdF9pZCkgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5wcm9kdWN0LmlkID09IHByb2R1Y3RfaWQpO1xuXG4gICAgLyoqIERBVEEgRk9SIE9USEVSIFNFUlZJQ0VTICovXG4gICAgZ2V0Q2FydFRva2VuID0gKCkgPT4gdGhpcy5jYXJ0X3Rva2VuO1xuXG4gICAgZ2V0TG9jYWxlID0gKCkgPT4gdGhpcy5sb2NhbGU7XG5cbiAgICBnZXRUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRvdGFsKSk7XG5cbiAgICBnZXRQYXltZW50TWV0aG9kQWRqdXN0bWVudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy5wYXltZW50TWV0aG9kQWRqdXN0bWVudCA/PyBudWxsKSk7XG5cbiAgICBnZXRQYXltZW50TWV0aG9kQWRqdXN0bWVudExhYmVsID0gKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnBheW1lbnRNZXRob2RBZGp1c3RtZW50TGFiZWwgPz8gbnVsbCkpO1xuXG4gICAgLyoqIFRvdGFsIHBhcmEgY2Fycml0by9zaWRlYmFyLCBzaW4gZW52w61vIHBlcnNpc3RpZG8gbmkgcmVjYXJnb3MgZGUgY2hlY2tvdXQuICovXG4gICAgZ2V0Q2FydFRvdGFsQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VG90YWxBbW91bnQoY2FydCkpKTtcblxuICAgIGdldENvdW50Q2FydEl0ZW1zID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnRJdGVtcy5waXBlKG1hcCgoY2FydEl0ZW1zKSA9PiBjYXJ0SXRlbXM/Lmxlbmd0aCkpO1xuXG4gICAgZ2V0VGF4ZXNBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LnRheGVzIDogMCkpO1xuXG4gICAgZ2V0U3ViVG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlTdWJ0b3RhbEFtb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q2FydFRheGVzQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VGF4ZXNBbW91bnQoY2FydCkpKTtcblxuICAgIGdldENhcnRDbGllbnRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q2FydENsaWVudFRheGVzQW1vdW50KGNhcnQpKSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXZ1ZWx2ZSBlbCBkZXNjdWVudG8gcXVlIGRlYmUgbW9zdHJhcnNlIGVuIGVsIHJlc3VtZW4gZGUgY29tcHJhLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gZWwgbW9udG8gZGUgcHJvbW9jaW9uZXMgZGUgb3JkZW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogdGhpcy5zdW1tYXJ5UHJvbW90aW9uQW1vdW50JCA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYHRvdGFscy5vcmRlckRpc2NvdW50YCwgc2UgdXNhIGVzZSB2YWxvci5cbiAgICAgKiBFbiBzdSBhdXNlbmNpYSwgcHJpb3JpemEgYHRvdGFscy5wcm9tb3Rpb25CcmVha2Rvd24ub3JkZXJQcm9tb3Rpb25zYCB5XG4gICAgICogbHVlZ28gaGFjZSBmYWxsYmFjayBhIGB0b3RhbHMucHJvbW90aW9uYCBwYXJhIG1hbnRlbmVyIGNvbXBhdGliaWxpZGFkLlxuICAgICAqL1xuICAgIGdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5nZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uKGNhcnQpLm9yZGVyRGlzY291bnQpKTtcblxuICAgIC8qKiBEZXNjdWVudG8gZXNwZWPDrWZpY28gZGVsIGN1cMOzbiwgc2kgZWwgYmFja2VuZCBsbyBpbmZvcm1hIHBvciBzZXBhcmFkby4gKi9cbiAgICBnZXRDb3Vwb25Qcm9tb3Rpb25BbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMuZ2V0Q2FydFN1bW1hcnlQcmljZVByZXNlbnRhdGlvbihjYXJ0KS5jb3Vwb25EaXNjb3VudCkpO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNpIGV4aXN0ZSB1biBjdXDDs24gYXBsaWNhZG8gZW4gZWwgY2Fycml0byBhY3R1YWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGJvb2xlYW5vIHBhcmEgY29udHJvbGFyIGxhIHZpc2liaWxpZGFkIGRlIGBRdWl0YXIgY3Vww7NuYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTm8gZGViZSBhdGFyc2UgYSBgZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpYCwgcG9ycXVlIHVuIGN1cMOzbiBwdWVkZSBhZmVjdGFyXG4gICAgICogc29sbyBwcm9tb2Npb25lcyB1bml0YXJpYXMgeSBkZWphciBlbCBkZXNjdWVudG8gZGUgb3JkZW4gZW4gYDBgLlxuICAgICAqL1xuICAgIGhhc0FwcGxpZWRDb3Vwb24gPSAoKTogT2JzZXJ2YWJsZTxib29sZWFuPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5oYXNBcHBsaWVkQ291cG9uKGNhcnQpKSk7XG5cbiAgICB0b0RlY2ltYWwgPSAodG90YWwpID0+ICh0b3RhbCAtIE1hdGguZmxvb3IodG90YWwpID09IDApID8gdG90YWwgLyAxMDAgOiB0b3RhbFxuXG4gICAgZ2V0RGlzY291bnQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgdG90YWwgPSB0aGlzLml0ZW1zLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3Vyci5wcm9kdWN0LnNhbGVwcmljZSAqIGN1cnIucXVhbnRpdHk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIGxldCBzdWJ0b3RhbCA9IHRoaXMuaXRlbXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyLnByb2R1Y3QucHJpY2UgKiBjdXJyLnF1YW50aXR5O1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICByZXR1cm4gc3VidG90YWwgLSB0b3RhbDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9idGllbmUgZWwgcHJlY2lvIG5vcm1hbGl6YWRvIGRlIHVuIMOtdGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gZGUgY2Fycml0byBub3JtYWxpemFkby5cbiAgICAgKiBAcmV0dXJucyBPYmpldG8gYENhcnRJdGVtUHJpY2luZ2AgbGlzdG8gcGFyYSByZW5kZXJpemFyIHByZWNpbyBiYXNlLCB0YWNoYWRvIHkgZmluYWwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJpY2luZyA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICogY29uc3Qgc2hvd1Rvb2x0aXAgPSBwcmljaW5nLmhhc1VuaXRQcm9tb3Rpb25zO1xuICAgICAqIGNvbnN0IGZpbmFsUHJpY2UgPSBwcmljaW5nLmZpbmFsUHJpY2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0SXRlbVByaWNpbmcgPSAoaXRlbTogQ2FydEl0ZW0pOiBDYXJ0SXRlbVByaWNpbmcgPT4gaXRlbT8ucHJpY2luZyB8fCB0aGlzLmJ1aWxkQ2FydEl0ZW1QcmljaW5nKGl0ZW0pO1xuXG4gICAgLyoqIFJlc3VlbHZlIGxhIHByZXNlbnRhY2nDs24gbnVldmEgZGUgdW5hIGzDrW5lYSB5IGNvbnNlcnZhIGVsIGZhbGxiYWNrIGxlZ2FjeS4gKi9cbiAgICBnZXRDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uID0gKGl0ZW06IENhcnRJdGVtLCBjaGFubmVsPzogQ2hhbm5lbCk6IENhcnRJdGVtUHJpY2VQcmVzZW50YXRpb24gPT5cbiAgICAgICAgdGhpcy5wcmljZVByZXNlbnRhdGlvblNlcnZpY2UuZ2V0Q2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbihcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBjaGFubmVsIHx8IHRoaXMuY2hhbm5lbENvbmZpZyxcbiAgICAgICAgICAgIGl0ZW0/LmxpbmVQcmljaW5nID8gdW5kZWZpbmVkIDogdGhpcy5nZXRJdGVtUHJpY2luZyhpdGVtKVxuICAgICAgICApO1xuXG4gICAgLyoqIFJlc3VlbHZlIGVsIHJlc3VtZW4gdmlzaWJsZSB1c2FuZG8gbGluZVByaWNpbmcgc2luIGNvbnZlcnRpciBpbXBvcnRlcyBmaXNjYWxlcy4gKi9cbiAgICBnZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uID0gKFxuICAgICAgICBjYXJ0OiBhbnkgPSB0aGlzLmNhcnRTdWJqZWN0LnZhbHVlLFxuICAgICAgICBjaGFubmVsPzogQ2hhbm5lbCxcbiAgICAgICAgaW5jbHVkZVNoaXBwaW5nOiBib29sZWFuID0gZmFsc2VcbiAgICApOiBDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VJdGVtcyA9IEFycmF5LmlzQXJyYXkoY2FydD8uaXRlbXMpICYmIGNhcnQuaXRlbXMubGVuZ3RoID8gY2FydC5pdGVtcyA6IG51bGw7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBDYXJ0SXRlbVtdID0gKHJlc3BvbnNlSXRlbXMgfHwgKHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZSB8fCBbXSkpXG4gICAgICAgICAgICAubWFwKGl0ZW0gPT4gdGhpcy5ub3JtYWxpemVDYXJ0SXRlbVByaWNpbmcoaXRlbSkpO1xuICAgICAgICBjb25zdCBoYXNMaW5lUHJpY2luZyA9IGl0ZW1zLmxlbmd0aCA+IDAgJiYgaXRlbXMuZXZlcnkoaXRlbSA9PiAhIWl0ZW0/LmxpbmVQcmljaW5nKTtcbiAgICAgICAgY29uc3Qgc2hvd0dyb3NzID0gKGNoYW5uZWwgfHwgdGhpcy5jaGFubmVsQ29uZmlnKT8uc2hvd1ByaWNlV2l0aFRheGVzV2hpbGVCcm93c2luZyA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcHJpY2luZ0tleSA9IHNob3dHcm9zcyA/ICdncm9zcycgOiAnbmV0JztcbiAgICAgICAgY29uc3QgdGF4ZXMgPSB0aGlzLm9yZGVyVXRpbHMuZ2V0Q2FydFRheGVzQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBjbGllbnRUYXhlcyA9IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0Q2xpZW50VGF4ZXNBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVNoaXBwaW5nID0gaW5jbHVkZVNoaXBwaW5nID8gdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlTaGlwbWVudEFtb3VudChjYXJ0KSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHNoaXBwaW5nUHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnc2hpcHBpbmdfcHJpY2luZycsICdzaGlwcGluZ1ByaWNpbmcnKTtcbiAgICAgICAgY29uc3Qgc2hpcHBpbmcgPSBpbmNsdWRlU2hpcHBpbmdcbiAgICAgICAgICAgID8gKHNoaXBwaW5nUHJpY2luZyA/IHNoaXBwaW5nUHJpY2luZ1twcmljaW5nS2V5XSA6IGxlZ2FjeVNoaXBwaW5nKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGluY2x1ZGVTaGlwcGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIoY2FydD8udG90YWxzPy50b3RhbCB8fCAwKVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q2FydFRvdGFsQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBvcmRlckRpc2NvdW50UHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnb3JkZXJfZGlzY291bnRfcHJpY2luZycsICdvcmRlckRpc2NvdW50UHJpY2luZycpO1xuICAgICAgICBjb25zdCBjb3Vwb25EaXNjb3VudFByaWNpbmcgPSB0aGlzLmdldFRvdGFsc1ByaWNpbmcoY2FydCwgJ2NvdXBvbl9kaXNjb3VudF9wcmljaW5nJywgJ2NvdXBvbkRpc2NvdW50UHJpY2luZycpO1xuICAgICAgICBjb25zdCBjb3Vwb25EaXNjb3VudCA9IGNvdXBvbkRpc2NvdW50UHJpY2luZ1xuICAgICAgICAgICAgPyBjb3Vwb25EaXNjb3VudFByaWNpbmdbcHJpY2luZ0tleV1cbiAgICAgICAgICAgIDogdGhpcy5vcmRlclV0aWxzLmdldENvdXBvblByb21vdGlvbkFtb3VudChjYXJ0KTtcbiAgICAgICAgY29uc3Qgb3JkZXJEaXNjb3VudCA9IG9yZGVyRGlzY291bnRQcmljaW5nXG4gICAgICAgICAgICA/IG9yZGVyRGlzY291bnRQcmljaW5nW3ByaWNpbmdLZXldXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRPcmRlclByb21vdGlvbkFtb3VudFxuICAgICAgICAgICAgICAgID8gdGhpcy5vcmRlclV0aWxzLmdldE9yZGVyUHJvbW90aW9uQW1vdW50KGNhcnQpXG4gICAgICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudChjYXJ0KTtcblxuICAgICAgICBpZiAoaGFzTGluZVByaWNpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdHNCZWZvcmVEaXNjb3VudHM6IGl0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW06IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIoaXRlbS5saW5lUHJpY2luZy51bml0W3ByaWNpbmdLZXldIHx8IDApICogTnVtYmVyKGl0ZW0ucXVhbnRpdHkgfHwgMCksIDApLFxuICAgICAgICAgICAgICAgIGxpbmVEaXNjb3VudHM6IGl0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW06IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIoaXRlbS5saW5lUHJpY2luZy5kaXNjb3VudFtwcmljaW5nS2V5XSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgc3VidG90YWw6IGl0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW06IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIoaXRlbS5saW5lUHJpY2luZy5zdWJ0b3RhbFtwcmljaW5nS2V5XSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgb3JkZXJEaXNjb3VudCxcbiAgICAgICAgICAgICAgICBjb3Vwb25EaXNjb3VudCxcbiAgICAgICAgICAgICAgICB0YXhlcyxcbiAgICAgICAgICAgICAgICBjbGllbnRUYXhlcyxcbiAgICAgICAgICAgICAgICBzaGlwcGluZyxcbiAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgICB0YXhlc0luY2x1ZGVkSW5Ub3RhbDogc2hvd0dyb3NzICYmIHRheGVzICE9PSAwLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2xpbmVQcmljaW5nJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm9kdWN0c0JlZm9yZURpc2NvdW50czogMCxcbiAgICAgICAgICAgIGxpbmVEaXNjb3VudHM6IDAsXG4gICAgICAgICAgICBzdWJ0b3RhbDogdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlTdWJ0b3RhbEFtb3VudChjYXJ0KSxcbiAgICAgICAgICAgIG9yZGVyRGlzY291bnQsXG4gICAgICAgICAgICBjb3Vwb25EaXNjb3VudCxcbiAgICAgICAgICAgIHRheGVzLFxuICAgICAgICAgICAgY2xpZW50VGF4ZXMsXG4gICAgICAgICAgICBzaGlwcGluZyxcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgdGF4ZXNJbmNsdWRlZEluVG90YWw6IGZhbHNlLFxuICAgICAgICAgICAgc291cmNlOiAnbGVnYWN5J1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKiogTm9ybWFsaXphIHPDs2xvIGVsIGFsaWFzIHNlcmlhbGl6YWRvIGRlbCBjb250cmF0byBkZSBsw61uZWEuICovXG4gICAgcHJpdmF0ZSBub3JtYWxpemVDYXJ0SXRlbVByaWNpbmcgPSAoaXRlbTogYW55KTogQ2FydEl0ZW0gPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgbGluZVByaWNpbmc6IGl0ZW0/LmxpbmVQcmljaW5nIHx8IGl0ZW0/LmxpbmVfcHJpY2luZ1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogTGVlIGVsIGNvbnRyYXRvIG51ZXZvIHNpbiBjb25mdW5kaXIgdW4gb2JqZXRvIHbDoWxpZG8gY29uIGZhbGxiYWNrIGxlZ2FjeSxcbiAgICAgKiBpbmNsdXNvIGN1YW5kbyB0b2RvcyBzdXMgaW1wb3J0ZXMgc29uIGNlcm8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRUb3RhbHNQcmljaW5nID0gKFxuICAgICAgICBjYXJ0OiBhbnksXG4gICAgICAgIHNuYWtlQ2FzZUtleToga2V5b2YgQ2FydFRvdGFsc1ByaWNpbmcsXG4gICAgICAgIGNhbWVsQ2FzZUtleToga2V5b2YgQ2FydFRvdGFsc1ByaWNpbmdcbiAgICApOiBDYXJ0VG90YWxQcmljaW5nVmFsdWUgfCBudWxsID0+IHtcbiAgICAgICAgY29uc3QgdG90YWxzID0gY2FydD8udG90YWxzIHx8IHt9O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRvdGFsc1tzbmFrZUNhc2VLZXldID8/IHRvdGFsc1tjYW1lbENhc2VLZXldO1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIVt2YWx1ZS5uZXQsIHZhbHVlLnRheCwgdmFsdWUuZ3Jvc3NdLmV2ZXJ5KGFtb3VudCA9PiBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKGFtb3VudCkpKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5ldDogTnVtYmVyKHZhbHVlLm5ldCksXG4gICAgICAgICAgICB0YXg6IE51bWJlcih2YWx1ZS50YXgpLFxuICAgICAgICAgICAgZ3Jvc3M6IE51bWJlcih2YWx1ZS5ncm9zcylcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgYWRkQ291cG9uID0gYXN5bmMgKGNvZGUpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5wdXQodGhpcy5jb3Vwb25BcGkoKSwgeyBjb3Vwb246IGNvZGUgfSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5lcnJvcnMpIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnaW52YWxpZC1jb3Vwb24nIH07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzdWx0LCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgbWVzc2FnZTogJ29rJyB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2ludmFsaWQtY291cG9uJyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlQ291cG9uID0gYXN5bmMgKCkgPT4gdGhpcy5jb25uZWN0aW9uLmRlbGV0ZSh0aGlzLmNvdXBvbkFwaSgpKS5waXBlKG1hcChyZXMgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShyZXMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KSkudG9Qcm9taXNlKCk7XG5cbiAgICBmb3JtYXRDb3Vwb24gPSAoY2FydCkgPT4ge1xuICAgICAgICBsZXQgY3VycmVudF9jb3Vwb24gPSB0aGlzLmNvdXBvblN1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBjb3Vwb246IENvdXBvbkkgPSB7IGNvZGU6IGNhcnQuY291cG9uQ29kZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoY2FydC5jYXJ0RGlzY291bnRzKVswXTtcbiAgICAgICAgICAgIGNvdXBvbiA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb3Vwb24sXG4gICAgICAgICAgICAgICAgYW1vdW50OiAoY2FydC5jYXJ0RGlzY291bnRzICYmIGNhcnQuY2FydERpc2NvdW50c1trZXldLmFtb3VudC5jdXJyZW50KSB8fCAwLFxuICAgICAgICAgICAgICAgIG5hbWU6IChjYXJ0LmNhcnREaXNjb3VudHMgJiYgY2FydC5jYXJ0RGlzY291bnRzW2tleV0ubmFtZSkgfHwgJ25vLW5hbWUnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgKGNvdXBvbiAhPSBjdXJyZW50X2NvdXBvbikgJiYgdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQoY291cG9uKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VIYXZlVG9VcGRhdGUgPSAodmFsdWUpID0+IHRoaXMuaGF2ZV90b191cGRhdGUgPSB2YWx1ZTtcblxuICAgIHJlYWR5Rm9yQ2hlY2tvdXQgPSAoc3VjY2Vzc0NhbGxiYWNrPzogRnVuY3Rpb24sIGVycm9yQ2FsbGJhY2s/OiBGdW5jdGlvbik6IENhcnRBZmZvcmRhYmxlID0+IHtcbiAgICAgICAgbGV0IGNhcnQgPSB0aGlzLmNhcnRTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCByZXN1bHQ6IENhcnRBZmZvcmRhYmxlID0geyBvazogdHJ1ZSB9O1xuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgdGhpcy5jaGFubmVsQ29uZmlnLm1pbmltdW1RdWFudGl0eVB1cmNoYXNlSXRlbXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vayA9IGZhbHNlOyByZXN1bHQucmVhc29ucy5wdXNoKHsgbWVzc2FnZTogJ25vdC1lbm91Z2h0LWl0ZW1zJyB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYXJ0LnRvdGFscy50b3RhbCA8IHRoaXMuY2hhbm5lbENvbmZpZy5taW5pbXVtUHVyY2hhc2VBbW91bnQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vayA9IGZhbHNlOyByZXN1bHQucmVhc29ucy5wdXNoKHsgbWVzc2FnZTogJ25vdC1lbm91Z2h0LWFtb3VudCcgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrIHx8IGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc3VsdC5va1xuICAgICAgICAgICAgICAgID8gc3VjY2Vzc0NhbGxiYWNrICYmIHN1Y2Nlc3NDYWxsYmFjaygpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1zT25FcnJvciA9IChpdGVtc1dpdGhFcnJvcjogYW55W10sIGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtc1dpdGhFcnJvcik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXRlbXMpO1xuICAgICAgICBsZXQgaXRlbXNVcGRhdGVkID0gdGhpcy5pdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBsZXQgaXRlbVdpdGhFcnJvciA9IGl0ZW1zV2l0aEVycm9yLmZpbmQoZmFpbGVkSXRlbSA9PiBpdGVtLml0ZW1faWQgPT0gZmFpbGVkSXRlbS5pZCk7XG4gICAgICAgICAgICBpZiAoaXRlbVdpdGhFcnJvcikge1xuICAgICAgICAgICAgICAgIGl0ZW0uZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpdGVtLmVycm9yID0gY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtc1VwZGF0ZWQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyhpdGVtc1VwZGF0ZWQpO1xuICAgIH1cblxuICAgIGxvYWRDYXJ0QnlUb2tlbiA9IGFzeW5jICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHRva2VuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldENhcnRCeVRva2VuKClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVVElMU1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtYSBsb3Mgw610ZW1zIGNydWRvcyBkZWwgYmFja2VuZCBhbCBjb250cmF0byBpbnRlcm5vIGBDYXJ0SXRlbWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmVyX2l0ZW0gUmVzcHVlc3RhIGBpdGVtc2AgZGVsIGVuZHBvaW50IGRlIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgQXJyZWdsbyBkZSDDrXRlbXMgbm9ybWFsaXphZG9zLCBjYWRhIHVubyBjb24gYHByaWNpbmdgIHByZWNvbXB1dGFkby5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBlcyBlbCBwdW50byBkb25kZSBlbCBjb3JlOlxuICAgICAqIC0gcHJlc2VydmEgYHVuaXRQcm9tb3Rpb25zYFxuICAgICAqIC0gYXJtYSBgcHJpY2luZ2BcbiAgICAgKiAtIG1hbnRpZW5lIGxhIGZvcm1hIGhpc3TDs3JpY2EgZGVsIGl0ZW0gY29uc3VtaWRvIHBvciBsb3MgdGVtcGxhdGVzXG4gICAgICovXG4gICAgdHJhbnNmb3JtSXRlbXMgPSAoc2VydmVyX2l0ZW0pID0+IHNlcnZlcl9pdGVtLm1hcChcbiAgICAgICAgaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6IGl0ZW0ucHJvZHVjdCxcbiAgICAgICAgICAgICAgICB2YXJpYW50X2lkOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uY29kZSxcbiAgICAgICAgICAgICAgICBsb3Q6IGl0ZW0ub3JkZXJJdGVtTG90LFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBpdGVtLmNvbW1lbnRzIHx8ICcnLFxuICAgICAgICAgICAgICAgIGl0ZW1faWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IGl0ZW0udG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiBpdGVtLnVuaXRQcmljZSA/PyBpdGVtLnVuaXRfcHJpY2UsXG4gICAgICAgICAgICAgICAgZGlzY291bnQ6IGl0ZW0uZGlzY291bnQsXG4gICAgICAgICAgICAgICAgc3VidG90YWw6IGl0ZW0uc3VidG90YWwsXG4gICAgICAgICAgICAgICAgdGF4VG90YWw6IGl0ZW0udGF4VG90YWwgPz8gaXRlbS50YXhfdG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByb21vdGlvbnM6IEFycmF5LmlzQXJyYXkoaXRlbS51bml0UHJvbW90aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIDogKEFycmF5LmlzQXJyYXkoaXRlbS51bml0X3Byb21vdGlvbnMpID8gaXRlbS51bml0X3Byb21vdGlvbnMgOiBbXSksXG4gICAgICAgICAgICAgICAgbGluZVByaWNpbmc6IGl0ZW0ubGluZVByaWNpbmcgfHwgaXRlbS5saW5lX3ByaWNpbmcsXG4gICAgICAgICAgICAgICAgbGluZV9wcmljaW5nOiBpdGVtLmxpbmVfcHJpY2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID4gMCA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2UpO1xuICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgaXRlbS5wcm9kdWN0LnByaWNlID0gaXRlbS50b3RhbCAvIGl0ZW0ucXVhbnRpdHkvLyA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2U7XG4gICAgICAgICAgICAvLyB9LCAxMDApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1eWUgbGEgbm9ybWFsaXphY2nDs24gZGUgcHJlY2lvcyBwYXJhIHVuIMOtdGVtIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gbm9ybWFsaXphZG8gZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgRXN0cnVjdHVyYSBgQ2FydEl0ZW1QcmljaW5nYCBjb24gcHJlY2lvIGJhc2UsIHRhY2hhZG8sIGZpbmFsIHkgZmxhZ3MgZGUgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJpY2luZyA9IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICogLy8gcHJpY2luZy5iYXNlUHJpY2UgPT4gdW5pdFByaWNlIGRlbCBiYWNrZW5kIG51ZXZvIG8gZmFsbGJhY2sgbGVnYWN5XG4gICAgICogLy8gcHJpY2luZy5maW5hbFByaWNlID0+IHVuaXRQcmljZSBkZWwgYmFja2VuZCBudWV2byBvIGPDoWxjdWxvIGxlZ2FjeVxuICAgICAqIC8vIHByaWNpbmcuZWZmZWN0aXZlRGlzY291bnRQZXJjZW50ID0+ICUgdG90YWwgY29udHJhIGVsIHByZWNpbyBkZSByZWZlcmVuY2lhXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZENhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiB7XG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtPy5wcm9kdWN0Py52YXJpYW50cz8uWzBdO1xuICAgICAgICBjb25zdCBjYXJ0QW5kU2lkZWJhclByaWNlcyA9IHZhcmlhbnQ/LmNhcnRBbmRTaWRlYmFyUHJpY2VzO1xuICAgICAgICAvLyBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYGNhcnRBbmRTaWRlYmFyUHJpY2VzYCwgZXNlIGVzIGVsIHByZWNpbyBjb3JyZWN0b1xuICAgICAgICAvLyBwYXJhIGNhcnJpdG8vc2lkZWJhciBwb3JxdWUgZXhjbHV5ZSBpbXB1ZXN0b3MgZGUgb3JkZW4gcXVlIG5vIHNlIGxpc3RhbiBwb3Igw610ZW0uXG4gICAgICAgIC8vIFNpIG5vIGV4aXN0ZSwgc2UgbWFudGllbmUgZWwgZmFsbGJhY2sgaGlzdMOzcmljby5cbiAgICAgICAgY29uc3QgZXhwbGljaXRVbml0UHJpY2UgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy51bml0UHJpY2UpO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFVuaXRQcmljZSA9IE51bWJlci5pc0Zpbml0ZShleHBsaWNpdFVuaXRQcmljZSk7XG4gICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IGhhc0V4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA/IGV4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA6IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyBjYXJ0QW5kU2lkZWJhclByaWNlcz8ucHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5wcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICAgICAgPz8gMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RyaWtlUHJpY2VDYW5kaWRhdGUgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShcbiAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5wcmljZVxuICAgICAgICAgICAgPz8gdmFyaWFudD8ucHJpY2VcbiAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICA/PyAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlUHJpY2UgPSBpc05hTihiYXNlUHJpY2UpID8gMCA6IGJhc2VQcmljZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0cmlrZVByaWNlID0gaXNOYU4oc3RyaWtlUHJpY2VDYW5kaWRhdGUpID8gMCA6IHN0cmlrZVByaWNlQ2FuZGlkYXRlO1xuICAgICAgICBjb25zdCB1bml0UHJvbW90aW9uVG90YWwgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKVxuICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zLnJlZHVjZSgodG90YWwsIHByb21vdGlvbikgPT4gdG90YWwgKyBOdW1iZXIocHJvbW90aW9uPy5hbW91bnQgfHwgMCksIDApXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGhhc1N0cmlrZVByaWNlID0gbm9ybWFsaXplZFN0cmlrZVByaWNlID4gbm9ybWFsaXplZEJhc2VQcmljZSAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMDtcbiAgICAgICAgY29uc3QgaGFzVW5pdFByb21vdGlvbnMgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKSAmJiBpdGVtLnVuaXRQcm9tb3Rpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHF1YW50aXR5ID0gTnVtYmVyKGl0ZW0/LnF1YW50aXR5IHx8IDApO1xuICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gaGFzRXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgID8gbm9ybWFsaXplZEJhc2VQcmljZVxuICAgICAgICAgICAgOiBoYXNVbml0UHJvbW90aW9ucyA/IG5vcm1hbGl6ZWRCYXNlUHJpY2UgKyB1bml0UHJvbW90aW9uVG90YWwgOiBub3JtYWxpemVkQmFzZVByaWNlO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlzY291bnQgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy5kaXNjb3VudCk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVByb2R1Y3REaXNjb3VudCA9IE51bWJlcihpdGVtPy5wcm9kdWN0Py5kaXNjb3VudCB8fCAwKTtcbiAgICAgICAgY29uc3QgZGlzY291bnRQZXJjZW50ID0gTnVtYmVyLmlzRmluaXRlKHByb2R1Y3REaXNjb3VudCkgJiYgcHJvZHVjdERpc2NvdW50IDwgMCAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMCAmJiBxdWFudGl0eSA+IDBcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoTWF0aC5hYnMocHJvZHVjdERpc2NvdW50KSAvIChub3JtYWxpemVkQmFzZVByaWNlICogcXVhbnRpdHkpKSAqIDEwMClcbiAgICAgICAgICAgIDogIWlzTmFOKGxlZ2FjeVByb2R1Y3REaXNjb3VudCkgJiYgbGVnYWN5UHJvZHVjdERpc2NvdW50ID4gMFxuICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZChsZWdhY3lQcm9kdWN0RGlzY291bnQpXG4gICAgICAgICAgICAgICAgOiBoYXNTdHJpa2VQcmljZVxuICAgICAgICAgICAgICAgICAgICA/IE1hdGgucm91bmQoKChub3JtYWxpemVkU3RyaWtlUHJpY2UgLSBub3JtYWxpemVkQmFzZVByaWNlKSAvIG5vcm1hbGl6ZWRTdHJpa2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPSBoYXNTdHJpa2VQcmljZSA/IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA6IG5vcm1hbGl6ZWRCYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCA9IGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID4gMCAmJiBmaW5hbFByaWNlID4gMCAmJiBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA+IGZpbmFsUHJpY2VcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlIC0gZmluYWxQcmljZSkgLyBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICA6IGRpc2NvdW50UGVyY2VudDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVByaWNlOiBub3JtYWxpemVkQmFzZVByaWNlLFxuICAgICAgICAgICAgc3RyaWtlUHJpY2U6IGhhc1N0cmlrZVByaWNlID8gbm9ybWFsaXplZFN0cmlrZVByaWNlIDogbnVsbCxcbiAgICAgICAgICAgIGZpbmFsUHJpY2UsXG4gICAgICAgICAgICB1bml0UHJvbW90aW9uVG90YWwsXG4gICAgICAgICAgICBoYXNTdHJpa2VQcmljZSxcbiAgICAgICAgICAgIGhhc1VuaXRQcm9tb3Rpb25zLFxuICAgICAgICAgICAgZGlzY291bnRQZXJjZW50LFxuICAgICAgICAgICAgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXphIHZhbG9yZXMgZGUgcHJlY2lvIHByb3ZlbmllbnRlcyBkZWwgYmFja2VuZCBhIGBudW1iZXJgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIG51bcOpcmljbyBvIHN0cmluZyBjb24gZm9ybWF0byBsb2NhbCAoYDEyMC4wMDBgLCBgMTIwMDAwYCwgYDEyMDAwMC0xYCwgZXRjLikuXG4gICAgICogQHJldHVybnMgTsO6bWVybyBwYXJzZWFkbyBvIGBOYU5gIHNpIGVsIHZhbG9yIG5vIGVzIHV0aWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNlIHVzYSBwYXJhIHNvcG9ydGFyIHJlc3B1ZXN0YXMgY29uIHNlcGFyYWRvcmVzIGRlIG1pbGVzLCBjb21hIGRlY2ltYWwgbyByYW5nb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVByaWNlVmFsdWUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXcgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmF3LmluY2x1ZGVzKCctJykgPyByYXcuc3BsaXQoJy0nKVswXS50cmltKCkgOiByYXc7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaXJzdFZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLig/PVxcZHszfShcXER8JCkpL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuXG4gICAgICAgIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG4gICAgfVxuXG5cbiAgICBnZXRDcmVkaXRBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFsYW5jZUN1c3RvbWVyKSA9PiBiYWxhbmNlQ3VzdG9tZXI/LmNyZWRpdEFtb3VudCA/PyBudWxsKVxuICAgICAgICApO1xuXG4gICAgZ2V0Q2xpZW50VGF4ZXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LmNsaWVudFRheGVzIDogMCkpO1xuXG4gICAgZ2V0UmVtYWluaW5nQ3JlZGl0cyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnBpcGUobWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8ucmVtYWluaW5nQ3JlZGl0cykpO1xuXG4gICAgcHVibGljIHVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGJhbGFuY2U6IGFueSwgdG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghYmFsYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRvdGFsID8/IDA7XG5cbiAgICAgICAgY29uc3QgYmFsYW5jZURhdGEgPSB7XG4gICAgICAgICAgICBhbGxvd0FueVBheW1lbnRNZXRob2Q6IGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlOiBiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSxcbiAgICAgICAgICAgIGNyZWRpdEFtb3VudDogYmFsYW5jZS5jcmVkaXRBbW91bnQsXG4gICAgICAgICAgICBzaG93TWF4OiBiYWxhbmNlLnNob3dNYXgsXG4gICAgICAgICAgICBzaG93UHJpY2U6IGJhbGFuY2Uuc2hvd1ByaWNlLFxuICAgICAgICAgICAgcmVtYWluaW5nQ3JlZGl0czpcbiAgICAgICAgICAgICAgICBiYWxhbmNlLmNyZWRpdEFtb3VudCAhPSBudWxsICYmIHRvdGFsQW1vdW50ICE9IG51bGwgJiYgYmFsYW5jZS5jcmVkaXRBbW91bnQgPj0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgPyBiYWxhbmNlLmNyZWRpdEFtb3VudCAtIHRvdGFsQW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGFwcGx5TWF4T3JkZXJzOiBiYWxhbmNlLmFwcGx5TWF4T3JkZXJzLFxuICAgICAgICAgICAgbWF4T3JkZXJzOiBiYWxhbmNlLm1heE9yZGVyc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5uZXh0KGJhbGFuY2VEYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==
2208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF3QnhJO0lBc0dJLHFCQUFvQixVQUE2QixFQUFVLGFBQTJCLEVBQVUsTUFBaUIsRUFDckcsV0FB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LENBQUMscUJBQXFCO1lBQ3BELGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0I7WUFDOUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQ1osT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLFdBQVc7Z0JBQ3RGLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLFdBQVc7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDO1lBQ1gsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO1lBQ3RDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztTQUMvQixDQUFDO1FBRUYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDOztnQkFyK0QrQixpQkFBaUI7Z0JBQXlCLFlBQVk7Z0JBQWtCLFNBQVM7Z0JBQ3hGLFdBQVc7Z0JBQXNCLG1CQUFtQjtnQkFBNEIsZ0JBQWdCO2dCQUN2RixvQkFBb0I7Z0JBQ2xDLE1BQU07Z0JBQ1ksd0JBQXdCOzs7SUExR3JELFdBQVc7UUFIdkIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLFdBQVcsQ0E2a0V2QjtzQkF4bkVEO0NBd25FQyxBQTdrRUQsSUE2a0VDO1NBN2tFWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xuaW1wb3J0IHsgQ2FydEl0ZW0sIENhcnRJdGVtUHJpY2luZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC1pdGVtJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvdXBvbkkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvdXBvbic7XG5pbXBvcnQgeyBPcmRlclV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvb3JkZXItdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrb3V0RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlY2tvdXQtZGF0YSc7XG5pbXBvcnQgeyBDYXJ0QWZmb3JkYWJsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC9jYXJ0LWFmZm9yZGFibGUnO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hhbm5lbCc7XG5pbXBvcnQgeyBDYXJ0VG90YWxQcmljaW5nVmFsdWUsIENhcnRUb3RhbHNQcmljaW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0LXRvdGFscyc7XG5pbXBvcnQgeyBDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uLCBDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uLCBQcmljZVByZXNlbnRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9wcmljZS1wcmVzZW50YXRpb24uc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FydFJlc3BvbnNlQ29udGV4dCB7XG4gICAgdG9rZW46IHN0cmluZyB8IG51bGw7XG4gICAgZ2VuZXJhdGlvbjogbnVtYmVyO1xuICAgIHJlcXVlc3RJZDogbnVtYmVyO1xuICAgIGFsbG93VG9rZW5DaGFuZ2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIENhcnRTeW5jU3RhdHVzID0gJ3JlYWR5JyB8ICdzeW5jaW5nJyB8ICdpbnZhbGlkYXRlZCcgfCAnZXJyb3InIHwgJ2F1dGhlbnRpY2F0aW9uLWNoYW5nZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhcnRTeW5jU3RhdGUge1xuICAgIHN0YXR1czogQ2FydFN5bmNTdGF0dXM7XG4gICAgcmVhc29uPzogJ2NoZWNrb3V0LWludGVycnVwdGVkJyB8ICduZXR3b3JrJyB8ICdzZXJ2ZXInIHwgJ3Rva2VuLXVuYXZhaWxhYmxlJyB8ICdhdXRoZW50aWNhdGlvbicgfCAnaW52YWxpZC1yZXNwb25zZScgfCAnY2FydC1ub3QtYWN0aXZlJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24ge1xuICAgIHRyYW5zaXRpb25JZDogc3RyaW5nO1xuICAgIHJlYXNvbjogJ2NoZWNrb3V0LWNvbXBsZXRlZCcgfCAnY2FydC1ub3QtYWN0aXZlJztcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDYXJ0U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBjYXJ0SXRlbXNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2FydEl0ZW1bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcbiAgICBwcml2YXRlIGNvdXBvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICBwcml2YXRlIGNhcnRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gICAgcHJpdmF0ZSByZXF1ZXN0SW5Qcm9jZXNzID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgcHJpdmF0ZSBjYXJ0U3luY1N0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FydFN5bmNTdGF0ZT4oeyBzdGF0dXM6ICdzeW5jaW5nJyB9KTtcbiAgICBwcml2YXRlIHByb21vdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXREYXRhW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gICAgcHJpdmF0ZSBjYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyByZWFzb246ICdpbmFjdGl2ZS10b2tlbi1yZXBsYWNlZCcgfT4oKTtcbiAgICBwcml2YXRlIGNhcnRDaGVja291dEludmFsaWRhdGlvblN1YmplY3QgPSBuZXcgU3ViamVjdDxDYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24+KCk7XG5cbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZD86IGJvb2xlYW47XG4gICAgICAgIGFsbG93RXhjZWVkQmFsYW5jZT86IGJvb2xlYW47XG4gICAgICAgIGNyZWRpdEFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICAgIHNob3dNYXg/OiBib29sZWFuO1xuICAgICAgICBzaG93UHJpY2U/OiBib29sZWFuO1xuICAgICAgICByZW1haW5pbmdDcmVkaXRzPzogbnVtYmVyO1xuICAgICAgICBhcHBseU1heE9yZGVycz86IGJvb2xlYW47XG4gICAgICAgIG1heE9yZGVycz86IG51bWJlcjtcbiAgICB9IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBpdGVtcyA9IFtdO1xuICAgIHByaXZhdGUgcGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzOiBBcnJheTx7IHByb2R1Y3Q6IFByb2R1Y3Q7IHF1YW50aXR5OiBudW1iZXI7IHZhcmlhbnRJZDogYW55OyBjb21tZW50cz86IHN0cmluZyB9PiA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4UGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzID0gMTA7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHNMaW1pdE5vdGlmaWVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbiA9IDA7XG5cbiAgICBwcml2YXRlIGNvdW50OiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgbG9jYWxlID0gXCJcIjtcbiAgICBwcml2YXRlIGxvZ2dlZF9pbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGF2ZV90b191cGRhdGUgPSB0cnVlO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIGNhcnRfYmFzZVVybCA9ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJy9jYXJ0cyc7XG5cbiAgICBwdWJsaWMgY2FydEl0ZW1zQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGFkZEl0ZW1BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRBbGxJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9tdWx0aXBsZS1pdGVtcycgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIHVwZGF0ZUl0ZW1RdWFudGl0eUFwaSA9IChpdGVtX2lkKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMvJyArIGl0ZW1faWQgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGRlbGV0ZUl0ZW1BcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBjb3Vwb25BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvY291cG9uJztcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvYWRkcmVzcy1ib29rJztcbiAgICBwdWJsaWMgdGF4ZXNBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMvdGF4JztcblxuICAgIHB1YmxpYyBjYXJ0X3Rva2VuO1xuICAgIHByaXZhdGUgY2FydExpZmVjeWNsZUdlbmVyYXRpb24gPSAwO1xuICAgIHByaXZhdGUgY2FydFJlcXVlc3RJZCA9IDA7XG4gICAgcHJpdmF0ZSBsYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFN5bmNLZXkgPSAnX19lYXN5Y29tbWVyY2VfY2FydF9zeW5jX18nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFiSWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWVuQ2FydFN5bmNFdmVudHM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBjYXJ0U3luY0Jsb2NrZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNhcnRTeW5jUmVhZGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FydFN5bmNSZWFkQWdhaW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGNhcnRTeW5jVGltZXI6IGFueTtcbiAgICBwcml2YXRlIHBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjYXJ0Tm90QWN0aXZlUmVjb3Zlcnk6IHsgdG9rZW46IHN0cmluZzsgdHJhbnNpdGlvbklkOiBzdHJpbmc7IHByb21pc2U6IFByb21pc2U8Ym9vbGVhbj4gfSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjYXJ0Tm90QWN0aXZlVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXI6IGFueTtcbiAgICBwcml2YXRlIGNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FydEJvb3RzdHJhcFBpY2t1cDogUHJvbWlzZTxib29sZWFuPiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FydEJvb3RzdHJhcEFsbG93c1BlbmRpbmdBZGRzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb246IHsgbmF2aWdhdGlvbklkOiBudW1iZXIgfCBudWxsOyBjb21wbGV0ZWQ6IGJvb2xlYW4gfSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbGFzdFJvdXRlck5hdmlnYXRpb25JZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByb3V0ZXJOYXZpZ2F0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNvbXBsZXRlZENoZWNrb3V0VHJhbnNpdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGF1dGhDb250ZXh0QmxvY2tlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2hlY2tvdXRSZWNvdmVyeVRpbWVyOiBhbnk7XG4gICAgcHJpdmF0ZSBjaGVja291dEludmFsaWRhdGVkQXQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hlY2tvdXRSZWNvdmVyeVRpbWVvdXRNcyA9IDEwMDAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFJlcXVlc3RUaW1lb3V0TXMgPSAxNTAwMDtcbiAgICBwcml2YXRlIGF1dGhSZXRyeUFsbG93ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGF1dGhDb250ZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IFN0b3JhZ2VFdmVudCkgPT4gdGhpcy5oYW5kbGVTdG9yYWdlRXZlbnQoZXZlbnQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlzaWJpbGl0eUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHRoaXMuY2hlY2tQZW5kaW5nQ2FydFN5bmMoKTtcbiAgICB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZXNob3dMaXN0ZW5lciA9ICgpID0+IHRoaXMuY2hlY2tQZW5kaW5nQ2FydFN5bmMoKTtcbiAgICBwdWJsaWMgY2FydEl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKGl0ZW1zID0+IHRoaXMuc3dpdGNoUHJpY2VJbkNhcnRJdGVtKGl0ZW1zKSkpXG4gICAgcHVibGljIGNvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgICAvKiogRXN0YWRvIHF1ZSBwZXJtaXRlIGEgbG9zIGNvbnN1bWlkb3JlcyBkaWZlcmVuY2lhciBlbCBjYXJyaXRvIGxpc3RvIGRlIHVuYSByZWN1cGVyYWNpw7NuIHBlbmRpZW50ZSBvIGZhbGxpZGEuICovXG4gICAgcHVibGljIGNhcnRTeW5jU3RhdGUgPSB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIC8qKiBFbWl0ZSDDum5pY2FtZW50ZSBzaSBlbCBib290c3RyYXAgZGVzY2FydMOzIHVuIHRva2VuIGluYWN0aXZvIHkgcmVjdXBlcsOzIG90cm8gY2Fycml0byBjb3JyZWN0YW1lbnRlLiAqL1xuICAgIHB1YmxpYyBjYXJ0Qm9vdHN0cmFwUmVjb3ZlcnkgPSB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgLyoqIE5vdGlmaWNhIGFsIGNoZWNrb3V0IG1vbnRhZG8gY3VhbmRvIHNlIGludmFsaWRhIGVsIHRva2VuIHF1ZSBzdSBDYXJ0U2VydmljZSBlc3RhYmEgdXNhbmRvLiAqL1xuICAgIHB1YmxpYyBjYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24gPSB0aGlzLmNhcnRDaGVja291dEludmFsaWRhdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGNhcnQgPSB0aGlzLmNhcnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm9tb3Rpb25zID0gdGhpcy5wcm9tb3Rpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZGVsZXRpbmc6IEJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYmFsYW5jZUN1c3RvbWVyJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgYWxsb3dBbnlQYXltZW50TWV0aG9kJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmFsbG93QW55UGF5bWVudE1ldGhvZCA/PyBudWxsKSk7XG4gICAgcHVibGljIGFsbG93RXhjZWVkQmFsYW5jZSQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5hbGxvd0V4Y2VlZEJhbGFuY2UgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBjcmVkaXRBbW91bnQkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uY3JlZGl0QW1vdW50ID8/IG51bGwpKTtcbiAgICBwdWJsaWMgc2hvd01heCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5zaG93TWF4ID8/IG51bGwpKTtcbiAgICBwdWJsaWMgc2hvd1ByaWNlJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LnNob3dQcmljZSA/PyBudWxsKSk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbm5lY3Rpb246IENvbm5lY3Rpb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSwgcHJpdmF0ZSBjb25zdHM6IENvbnN0YW50cyxcbiAgICAgICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByaXZhdGUgb3JkZXJVdGlsczogT3JkZXJVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5uZWxDb25maWdTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBwcmljZVByZXNlbnRhdGlvblNlcnZpY2U6IFByaWNlUHJlc2VudGF0aW9uU2VydmljZSkge1xuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLml0ZW1zID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydCcpKSB8fCBbXTtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICB0aGlzLmxhc3RSb3V0ZXJOYXZpZ2F0aW9uSWQgPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbj8uKCk/LmlkID8/IG51bGw7XG4gICAgICAgIHRoaXMucm91dGVyTmF2aWdhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cz8uc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkgdGhpcy5sYXN0Um91dGVyTmF2aWdhdGlvbklkID0gZXZlbnQuaWQ7XG4gICAgICAgIH0pIHx8IG51bGw7XG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmNoYW5uZWxDb25maWcgPSByZXMpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuc3RvcmFnZUxpc3RlbmVyKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgdGhpcy5wYWdlc2hvd0xpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMudmlzaWJpbGl0eUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jaGVja1BlbmRpbmdDYXJ0U3luYygpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2dlZEluLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXh0Q29udGV4dCA9IHRoaXMuZ2V0QXV0aENvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChuZXh0Q29udGV4dCAhPT0gdGhpcy5hdXRoQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29udGV4dCA9IEpTT04ucGFyc2UodGhpcy5hdXRoQ29udGV4dCB8fCAnW10nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBndWVzdFRva2VuID0gdGhpcy5jYXJ0X3Rva2VuIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNHdWVzdEl0ZW1zID0gdGhpcy5pdGVtcz8ubGVuZ3RoID4gMCB8fCB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGd1ZXN0VG9BdXRoZW50aWNhdGVkID0gIXByZXZpb3VzQ29udGV4dFswXSAmJiB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aFJldHJ5QWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChndWVzdFRvQXV0aGVudGljYXRlZCAmJiBndWVzdFRva2VuICYmIGhhc0d1ZXN0SXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbiA9IGd1ZXN0VG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gZ3Vlc3RUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRfdG9rZW4nLCBndWVzdFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENhcnRCeVRva2VuKGd1ZXN0VG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0d1ZXN0Q2FydEFzc29jaWF0aW9uVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSAmJiAhbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFN5bmNCbG9ja2VkICYmIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnc3luY2luZycpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FydCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLnN0b3JhZ2VMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIHRoaXMucGFnZXNob3dMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnZpc2liaWxpdHlMaXN0ZW5lcik7XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNhcnRTeW5jVGltZXIpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNoZWNrb3V0UmVjb3ZlcnlUaW1lcik7XG4gICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lcik7XG4gICAgICAgIHRoaXMucm91dGVyTmF2aWdhdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQ29uc3VtZSBlbCBldmVudG8gZGUgYm9vdHN0cmFwIHVuYSBzb2xhIHZleiB5IHNvbG8gZHVyYW50ZSBsYSBuYXZlZ2FjacOzbiBxdWUgaW5pY2nDsyBsYSByZWN1cGVyYWNpw7NuLiAqL1xuICAgIHB1YmxpYyBjb25zdW1lQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uO1xuICAgICAgICBpZiAoIXBlbmRpbmcgfHwgIXBlbmRpbmcuY29tcGxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFJlY292ZXJ5TmF2aWdhdGlvbiA9IG51bGw7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uSWQgPSB0aGlzLmdldEN1cnJlbnRSb3V0ZXJOYXZpZ2F0aW9uSWQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcubmF2aWdhdGlvbklkICE9PSBudWxsICYmIHBlbmRpbmcubmF2aWdhdGlvbklkID09PSBjdXJyZW50TmF2aWdhdGlvbklkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFJvdXRlck5hdmlnYXRpb25JZCA9ICgpOiBudW1iZXIgfCBudWxsID0+XG4gICAgICAgIHRoaXMucm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uPy4oKT8uaWQgPz8gdGhpcy5sYXN0Um91dGVyTmF2aWdhdGlvbklkO1xuXG4gICAgcHJpdmF0ZSBtYXJrQ2FydEJvb3RzdHJhcFJlY292ZXJ5UGVuZGluZyA9IChuYXZpZ2F0aW9uSWQ6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uID0geyBuYXZpZ2F0aW9uSWQsIGNvbXBsZXRlZDogZmFsc2UgfTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjb21wbGV0ZUNhcnRCb290c3RyYXBSZWNvdmVyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb24gfHwgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uLmNvbXBsZXRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb24uY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlTdWJqZWN0Lm5leHQoeyByZWFzb246ICdpbmFjdGl2ZS10b2tlbi1yZXBsYWNlZCcgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY3JlYXRlQ2FydFN5bmNJZCA9ICgpID0+IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcblxuICAgIHByaXZhdGUgZ2V0QXV0aENvbnRleHQgPSAoKSA9PiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdKV1RfVE9LRU4nKSwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1VTRVInKSxcbiAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0NVU1RPTUVSJyksIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDSEFOTkVMJylcbiAgICBdKTtcblxuICAgIHByaXZhdGUgY2FydFRyYW5zaXRpb25JZEZvclRva2VuID0gKHRva2VuOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICghdG9rZW4pIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZmlyc3QgPSAyMTY2MTM2MjYxO1xuICAgICAgICBsZXQgc2Vjb25kID0gNTM4MTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2VuLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHRva2VuLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBNYXRoLmltdWwoZmlyc3QgXiBjb2RlLCAxNjc3NzYxOSk7XG4gICAgICAgICAgICBzZWNvbmQgPSBNYXRoLmltdWwoc2Vjb25kLCAzMykgXiBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHsoZmlyc3QgPj4+IDApLnRvU3RyaW5nKDM2KX0tJHsoc2Vjb25kID4+PiAwKS50b1N0cmluZygzNil9YDtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBub3RpZnlDaGVja291dEludmFsaWRhdGlvbiA9ICh0cmFuc2l0aW9uSWQ6IHN0cmluZyB8IG51bGwsIHJlYXNvbjogQ2FydENoZWNrb3V0SW52YWxpZGF0aW9uWydyZWFzb24nXSwgdG9rZW4gPSB0aGlzLmNhcnRfdG9rZW4gfHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXRva2VuIHx8IHRva2VuICE9PSB0aGlzLmNhcnRfdG9rZW4gfHwgdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4odG9rZW4pICE9PSB0cmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb25TdWJqZWN0Lm5leHQoeyB0cmFuc2l0aW9uSWQsIHJlYXNvbiB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBwdWJsaXNoQ2FydFN5bmMgPSAodHlwZTogJ2NoYW5nZWQnIHwgJ2NoZWNrb3V0LWludmFsaWRhdGVkJyB8ICdjaGVja291dC1yZWFkeScgfCAnY2FydC1pbnZhbGlkYXRlZCcgfCAnY2FydC1yZWFkeScgfCAnY2FydC1yZWNvdmVyeS1mYWlsZWQnLCB0cmFuc2l0aW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0geyBldmVudElkOiB0aGlzLmNyZWF0ZUNhcnRTeW5jSWQoKSwgdHlwZSwgc291cmNlSWQ6IHRoaXMudGFiSWQsIC4uLih0cmFuc2l0aW9uSWQgPyB7IHRyYW5zaXRpb25JZCB9IDoge30pIH07XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuY2FydFN5bmNLZXksIEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlU3RvcmFnZUV2ZW50ID0gKGV2ZW50OiBTdG9yYWdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5jYXJ0U3luY0tleSAmJiBldmVudC5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IHNpZ25hbDogYW55O1xuICAgICAgICAgICAgdHJ5IHsgc2lnbmFsID0gSlNPTi5wYXJzZShldmVudC5uZXdWYWx1ZSk7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVDYXJ0U3luYyhzaWduYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ0pXVF9UT0tFTicsICdVU0VSJywgJ0NVU1RPTUVSJywgJ0NIQU5ORUwnXS5pbmRleE9mKGV2ZW50LmtleSkgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICBpZiAobmV4dENvbnRleHQgIT09IHRoaXMuYXV0aENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoUmV0cnlBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWNlaXZlQ2FydFN5bmMgPSAoc2lnbmFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFzaWduYWw/LmV2ZW50SWQgfHwgc2lnbmFsLnNvdXJjZUlkID09PSB0aGlzLnRhYklkIHx8IHRoaXMuc2VlbkNhcnRTeW5jRXZlbnRzLmluZGV4T2Yoc2lnbmFsLmV2ZW50SWQpID49IDApIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWVuQ2FydFN5bmNFdmVudHMucHVzaChzaWduYWwuZXZlbnRJZCk7XG4gICAgICAgIGlmICh0aGlzLnNlZW5DYXJ0U3luY0V2ZW50cy5sZW5ndGggPiA1MCkgdGhpcy5zZWVuQ2FydFN5bmNFdmVudHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHRCbG9ja2VkKSByZXR1cm47XG4gICAgICAgIGlmIChzaWduYWwudHlwZSA9PT0gJ2NoZWNrb3V0LWludmFsaWRhdGVkJykge1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBBbGxvd3NQZW5kaW5nQWRkcyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbklkID0gc2lnbmFsLnRyYW5zaXRpb25JZCB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25JZCAmJiB0aGlzLmNvbXBsZXRlZENoZWNrb3V0VHJhbnNpdGlvbklkID09PSB0cmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkICYmIHRyYW5zaXRpb25JZCAmJiB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkICE9PSB0cmFuc2l0aW9uSWQgJiYgIXNoYXJlZFRva2VuKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoZWNrb3V0SW52YWxpZGF0aW9uKHRyYW5zaXRpb25JZCwgJ2NoZWNrb3V0LWNvbXBsZXRlZCcpO1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25JZCAmJiBzaGFyZWRUb2tlbiAmJiB0aGlzLmNhcnRUcmFuc2l0aW9uSWRGb3JUb2tlbihzaGFyZWRUb2tlbikgIT09IHRyYW5zaXRpb25JZCkge1xuICAgICAgICAgICAgICAgIC8vIExhIHNlw7FhbCBwZXJ0ZW5lY2UgYSB1biB0b2tlbiBwcmV2aW8uIE5vIGJvcnJhciBlbCBzdWNlc29yIHlcbiAgICAgICAgICAgICAgICAvLyByZWNvbmNpbGlhciBlbCBlc3RhZG8gZ3VhcmRhZG8gYWN0dWFsbWVudGUuXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0cmFuc2l0aW9uSWQgJiYgc2hhcmVkVG9rZW4gJiYgdGhpcy5jYXJ0X3Rva2VuICYmIHNoYXJlZFRva2VuICE9PSB0aGlzLmNhcnRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgPSB0cmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRJbnZhbGlkYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgdHJ1ZSwgc2hhcmVkVG9rZW4gfHwgdGhpcy5jYXJ0X3Rva2VuIHx8IG51bGwpO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdpbnZhbGlkYXRlZCcpO1xuICAgICAgICAgICAgdGhpcy5zdGFydENoZWNrb3V0UmVjb3ZlcnlXYXRjaGRvZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaWduYWwudHlwZSA9PT0gJ2NoZWNrb3V0LXJlYWR5Jykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbklkID0gc2lnbmFsLnRyYW5zaXRpb25JZCB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgJiYgdHJhbnNpdGlvbklkICYmIHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgIT09IHRyYW5zaXRpb25JZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWRDaGVja291dFRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZCB8fCB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGVja291dFRyYW5zaXRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNoZWNrb3V0UmVjb3ZlcnlUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0SW52YWxpZGF0ZWRBdCA9IDA7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2godHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hbC50eXBlID09PSAnY2FydC1pbnZhbGlkYXRlZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwQWxsb3dzUGVuZGluZ0FkZHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JZCA9IHNpZ25hbC50cmFuc2l0aW9uSWQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hlY2tvdXRJbnZhbGlkYXRpb24odHJhbnNpdGlvbklkLCAnY2FydC1ub3QtYWN0aXZlJyk7XG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbklkICYmIHNoYXJlZFRva2VuICYmIHRoaXMuY2FydFRyYW5zaXRpb25JZEZvclRva2VuKHNoYXJlZFRva2VuKSAhPT0gdHJhbnNpdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQgPSB0cmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCB0cnVlLCBzaGFyZWRUb2tlbiB8fCB0aGlzLmNhcnRfdG9rZW4gfHwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2ludmFsaWRhdGVkJywgJ2NhcnQtbm90LWFjdGl2ZScpO1xuICAgICAgICAgICAgdGhpcy5zdGFydENhcnROb3RBY3RpdmVSZWNvdmVyeVdhdGNoZG9nKHRyYW5zaXRpb25JZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hbC50eXBlID09PSAnY2FydC1yZWFkeScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JZCA9IHNpZ25hbC50cmFuc2l0aW9uSWQgfHwgbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQgJiYgdHJhbnNpdGlvbklkICE9PSB0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmFsLnR5cGUgPT09ICdjYXJ0LXJlY292ZXJ5LWZhaWxlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JZCA9IHNpZ25hbC50cmFuc2l0aW9uSWQgfHwgbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQgJiYgdHJhbnNpdGlvbklkICE9PSB0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZDtcbiAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRva2VuID0gdGhpcy5jYXJ0Tm90QWN0aXZlVG9rZW4gfHwgdGhpcy5jYXJ0X3Rva2VuIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdlcnJvcicsICdjYXJ0LW5vdC1hY3RpdmUnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmFsLnR5cGUgPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgLy8gTGEgw7psdGltYSBzZcOxYWwgZGUgb3RyYSBwZXN0YcOxYSBwdWVkZSBzZWd1aXIgZW4gbG9jYWxTdG9yYWdlIGFsXG4gICAgICAgICAgICAvLyBhYnJpciB1bmEgc2VzacOzbiBudWV2YS4gU2luIHRva2VuIG5vIGhheSByZXN1bWVuIHF1ZSByZWZyZXNjYXI7XG4gICAgICAgICAgICAvLyBkZWphciBxdWUgaW5pdGlhbGl6ZS9nZXRDYXJ0IGhhZ2EgZWwgYm9vdHN0cmFwIGV2aXRhIGludmFsaWRhclxuICAgICAgICAgICAgLy8gZWwgUE9TVCAvY2FydHMgcXVlIGVzdMOhIGluaWNpw6FuZG9zZSBlbiBwYXJhbGVsby5cbiAgICAgICAgICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uKys7XG4gICAgICAgICAgICB0aGlzLmxhc3RBcHBsaWVkQ2FydFJlcXVlc3RJZCA9ICsrdGhpcy5jYXJ0UmVxdWVzdElkO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGNoZWNrUGVuZGluZ0NhcnRTeW5jID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm1hcmtJbnRlcnJ1cHRlZENoZWNrb3V0SWZFeHBpcmVkKCk7XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5jYXJ0U3luY0tleSk7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICAgIHRyeSB7IHRoaXMucmVjZWl2ZUNhcnRTeW5jKEpTT04ucGFyc2UodmFsdWUpKTsgfSBjYXRjaCAoXykgeyB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2NoZWR1bGVDYXJ0UmVmcmVzaCA9IChjaGVja291dFJlYWR5OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgaWYgKHRoaXMuY2FydFN5bmNUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2FydFN5bmNUaW1lcik7XG4gICAgICAgIHRoaXMuY2FydFN5bmNUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoQ2FydEZyb21CYWNrZW5kKGNoZWNrb3V0UmVhZHkpLCAwKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWZyZXNoQ2FydEZyb21CYWNrZW5kID0gKGNoZWNrb3V0UmVhZHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHRCbG9ja2VkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jUmVhZGluZykge1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY1JlYWRBZ2FpbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoQ29udGV4dCA9IHRoaXMuZ2V0QXV0aENvbnRleHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJyk7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnaW52YWxpZGF0ZWQnLCAndG9rZW4tdW5hdmFpbGFibGUnKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuY2FydFN5bmNSZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb247XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXRFcnJvck5vdEhhbmRsZXIoYHNob3AtYXBpLyR7dGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpfS9jYXJ0cy8ke3Rva2VufT9sb2NhbGU9JHt0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKX1gKVxuICAgICAgICAgICAgLnBpcGUodGltZW91dCh0aGlzLmNhcnRSZXF1ZXN0VGltZW91dE1zKSwgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNSZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydFN5bmNSZWFkQWdhaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY1JlYWRBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHRoaXMuaXNDYXJ0QnVzaW5lc3NFcnJvcihyZXNwb25zZSkgfHwgIXJlc3BvbnNlLnRva2VuVmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGNoZWNrb3V0UmVhZHk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQ6IENhcnRSZXNwb25zZUNvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLCBnZW5lcmF0aW9uLCByZXF1ZXN0SWQ6ICsrdGhpcy5jYXJ0UmVxdWVzdElkLCBhbGxvd1Rva2VuQ2hhbmdlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzcG9uc2UsIGNvbnRleHQsIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSByZXNwb25zZS5sb2NhbGUgfHwgdGhpcy5sb2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdyZWFkeScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gY2hlY2tvdXRSZWFkeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdlcnJvcicsICdpbnZhbGlkLXJlc3BvbnNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uIHx8IHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChbNDAwLCA0MDQsIDQxMF0uaW5kZXhPZihlcnJvcj8uc3RhdHVzKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSA9PT0gdG9rZW4pIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjYXJ0X3Rva2VuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydF90b2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdpbnZhbGlkYXRlZCcsICd0b2tlbi11bmF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yPy5zdGF0dXMgPT09IDQwMSB8fCBlcnJvcj8uc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHRCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoUmV0cnlBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpID09PSB0b2tlbikgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NhcnRfdG9rZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2F1dGhlbnRpY2F0aW9uLWNoYW5nZWQnLCAnYXV0aGVudGljYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gY2hlY2tvdXRSZWFkeTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSBlcnJvcj8uc3RhdHVzID49IDUwMCA/ICdzZXJ2ZXInIDogKGVycm9yPy5zdGF0dXMgPj0gNDAwICYmIGVycm9yPy5zdGF0dXMgPCA1MDAgJiYgZXJyb3I/LnN0YXR1cyAhPT0gNDI5ID8gJ2ludmFsaWQtcmVzcG9uc2UnIDogJ25ldHdvcmsnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRDYXJ0U3luY1N0YXRlID0gKHN0YXR1czogQ2FydFN5bmNTdGF0dXMsIHJlYXNvbj86IENhcnRTeW5jU3RhdGVbJ3JlYXNvbiddKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXR1cywgLi4uKHJlYXNvbiA/IHsgcmVhc29uIH0gOiB7fSkgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhcnRDaGVja291dFJlY292ZXJ5V2F0Y2hkb2cgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0UmVjb3ZlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVyKTtcbiAgICAgICAgdGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFya0ludGVycnVwdGVkQ2hlY2tvdXRJZkV4cGlyZWQoKSwgdGhpcy5jaGVja291dFJlY292ZXJ5VGltZW91dE1zKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBtYXJrSW50ZXJydXB0ZWRDaGVja291dElmRXhwaXJlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5IHx8ICF0aGlzLmNoZWNrb3V0SW52YWxpZGF0ZWRBdCB8fFxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIHRoaXMuY2hlY2tvdXRJbnZhbGlkYXRlZEF0IDwgdGhpcy5jaGVja291dFJlY292ZXJ5VGltZW91dE1zIHx8XG4gICAgICAgICAgICB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyAhPT0gJ2ludmFsaWRhdGVkJykgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgJ2NoZWNrb3V0LWludGVycnVwdGVkJyk7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBpbnZhbGlkYXRlTG9jYWxDYXJ0ID0gKGF1dGhDaGFuZ2VkOiBib29sZWFuLCBkaXNjYXJkVG9rZW4gPSBmYWxzZSwgZXhwZWN0ZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IG51bGw7XG4gICAgICAgIGlmIChkaXNjYXJkVG9rZW4gJiYgZXhwZWN0ZWRUb2tlbiAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpID09PSBleHBlY3RlZFRva2VuKSBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICB0aGlzLmNhcnRTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMobnVsbCk7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsICdbXScpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIGlmIChhdXRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXhwZWN0ZWRUb2tlbiAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpID09PSBleHBlY3RlZFRva2VuKSBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdhdXRoZW50aWNhdGlvbi1jaGFuZ2VkJywgJ2F1dGhlbnRpY2F0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzY2FyZFRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2ludmFsaWRhdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFJlaW50ZW50YSB1bmEgbGVjdHVyYSBmYWxsaWRhLiBTaSBlbCB0b2tlbiB5YSBmdWUgaW52YWxpZGFkbywgbm8gY3JlYSBvdHJvIGNhcnJpdG8uICovXG4gICAgcHVibGljIHJldHJ5Q2FydFN5bmMgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ3N5bmNpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdHdWVzdENhcnRBc3NvY2lhdGlvblRva2VuICYmIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVuZGluZ0d1ZXN0Q2FydEFzc29jaWF0aW9uVG9rZW47XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpIHx8IHRoaXMuY2FydF90b2tlbiAhPT0gdG9rZW4gfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSAhPT0gdG9rZW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICAgICAgdGhpcy5nZXRDYXJ0QnlUb2tlbih0b2tlbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSAmJiB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2FydEJvb3RzdHJhcFBpY2t1cCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ICYmIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3N5bmNpbmcnKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FydCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiAmJiB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiB8fCB0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeT8udG9rZW47XG4gICAgICAgICAgICBpZiAoIXRva2VuIHx8IHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdGFydENhcnROb3RBY3RpdmVSZWNvdmVyeSh0b2tlbiwgdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4odG9rZW4pKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dGhSZXRyeUFsbG93ZWQgfHwgdGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5hdXRoQ29udGV4dEJsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXV0aFJldHJ5QWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgICAgICB0aGlzLmdldENhcnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyAhPT0gJ2Vycm9yJyB8fCB0aGlzLmF1dGhDb250ZXh0ICE9PSB0aGlzLmdldEF1dGhDb250ZXh0KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIC8qKiBSZWFudWRhIGV4cGzDrWNpdGFtZW50ZSB1biBjaGVja291dCBpbnRlcnJ1bXBpZG8gY29uc3VsdGFuZG8gL2NhcnRzIHNpbiB0b2tlbi4gKi9cbiAgICBwdWJsaWMgcmVjb3ZlckludGVycnVwdGVkQ2hlY2tvdXQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja291dEludmFsaWRhdGVkQXQgfHwgdGhpcy5jYXJ0U3luY1N0YXRlU3ViamVjdC52YWx1ZS5zdGF0dXMgIT09ICdlcnJvcicpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkgPSB0cnVlO1xuICAgICAgICB0aGlzLmdldENhcnQodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKiogSW1waWRlIGVudmlhciBudWV2YXMgbXV0YWNpb25lcyBtaWVudHJhcyBsYSBwZXN0YcOxYSByZWNvbmNpbGlhIHVuYSBpbnZhbGlkYWNpw7NuIHJlbW90YS4gKi9cbiAgICBwdWJsaWMgY2FuTXV0YXRlQ2FydCA9ICgpID0+ICF0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCAmJiAhdGhpcy5jYXJ0U3luY0Jsb2NrZWQgJiYgISF0aGlzLmNhcnRfdG9rZW47XG5cbiAgICAvKiogQ29uZmlybWEgcXVlIGVsIHJlc3VtZW4gbGlzdG8geWEgcGVydGVuZWNlIGFsIGNvbnRleHRvIGRlIGF1dGVudGljYWNpw7NuIHZpZ2VudGUuICovXG4gICAgcHVibGljIGlzQ2FydFJlYWR5Rm9yQ3VycmVudEF1dGhDb250ZXh0ID0gKCkgPT5cbiAgICAgICAgdGhpcy5jYXJ0U3luY1N0YXRlU3ViamVjdC52YWx1ZS5zdGF0dXMgPT09ICdyZWFkeScgJiZcbiAgICAgICAgIXRoaXMuYXV0aENvbnRleHRCbG9ja2VkICYmXG4gICAgICAgICF0aGlzLmNhcnRTeW5jQmxvY2tlZCAmJlxuICAgICAgICAhdGhpcy5wZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbiAmJlxuICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID09PSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG5cbiAgICBwcml2YXRlIGRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzID0gW107XG4gICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzTGltaXROb3RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbisrO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGZsdXNoUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzLmxlbmd0aCB8fCB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkSW5GbGlnaHQgfHxcbiAgICAgICAgICAgICF0aGlzLmNhbk11dGF0ZUNhcnQoKSB8fCB0aGlzLnJlcXVlc3RJblByb2Nlc3MuZ2V0VmFsdWUoKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMuc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcXVldWVHZW5lcmF0aW9uID0gdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbjtcbiAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZGRUb0NhcnQocGVuZGluZy5wcm9kdWN0LCBwZW5kaW5nLnF1YW50aXR5LCBwZW5kaW5nLnZhcmlhbnRJZCwgcGVuZGluZy5jb21tZW50cywgdHJ1ZSwgcXVldWVHZW5lcmF0aW9uKTtcbiAgICAgICAgLy8gTGFzIHZhbGlkYWNpb25lcyBsb2NhbGVzIHB1ZWRlbiB0ZXJtaW5hciBzaW4gaW5pY2lhciBIVFRQLiBTaWd1ZSBjb25cbiAgICAgICAgLy8gbGEgcHLDs3hpbWEgaW50ZW5jacOzbiBlbiB2ZXogZGUgZGVqYXIgZWwgcmVzdG8gcGVuZGllbnRlLlxuICAgICAgICBpZiAocXVldWVHZW5lcmF0aW9uID09PSB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0UXVldWVHZW5lcmF0aW9uICYmICF0aGlzLnJlcXVlc3RJblByb2Nlc3MuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZsdXNoUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIERldGVjdGEgZWwgY29udHJhdG8gZGUgY2Fycml0byBmaW5hbGl6YWRvIHNpbiB0cmF0YXIgb3Ryb3MgY29uZmxpY3RvcyBIVFRQIGNvbW8gaW52YWxpZGV6IGRlbCBjYXJyaXRvLiAqL1xuICAgIHB1YmxpYyBpc0NhcnROb3RBY3RpdmVFcnJvciA9IChlcnJvcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChlcnJvcj8uc3RhdHVzICE9PSA0MDkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgaGVhZGVyQ29kZSA9IGVycm9yPy5oZWFkZXJzPy5nZXQgPyBlcnJvci5oZWFkZXJzLmdldCgnWC1FcnJvci1Db2RlJykgOiBudWxsO1xuICAgICAgICBjb25zdCBib2R5ID0gZXJyb3I/LmVycm9yO1xuICAgICAgICBjb25zdCBib2R5Q29kZXMgPSB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgPyBbYm9keV0gOiBbXG4gICAgICAgICAgICBib2R5Py5jb2RlLCBib2R5Py5lcnJvckNvZGUsIGJvZHk/LmVycm9yX2NvZGUsXG4gICAgICAgICAgICB0eXBlb2YgYm9keT8uZXJyb3IgPT09ICdzdHJpbmcnID8gYm9keS5lcnJvciA6IGJvZHk/LmVycm9yPy5jb2RlLFxuICAgICAgICAgICAgYm9keT8ubWVzc2FnZSwgYm9keT8uZGV0YWlsLCBib2R5Py5bJ2h5ZHJhOmRlc2NyaXB0aW9uJ11cbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIGhlYWRlckNvZGUgPT09ICdDQVJUX05PVF9BQ1RJVkUnIHx8IGJvZHlDb2Rlcy5pbmRleE9mKCdDQVJUX05PVF9BQ1RJVkUnKSA+PSAwO1xuICAgIH07XG5cbiAgICAvKiogQ29uc3VtZSB1biBDQVJUX05PVF9BQ1RJVkUsIGludmFsaWRhIHNvbG8gZWwgdG9rZW4gZGUgZXNhIHNvbGljaXR1ZCBlIGluaWNpYSB1bmEgcmVjdXBlcmFjacOzbiDDum5pY2EuICovXG4gICAgcHVibGljIGhhbmRsZUNhcnRNdXRhdGlvbkVycm9yID0gKGVycm9yOiBhbnksIHJlcXVlc3RUb2tlbjogc3RyaW5nIHwgbnVsbCA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc0NhcnROb3RBY3RpdmVFcnJvcihlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcEFsbG93c1BlbmRpbmdBZGRzID0gZmFsc2U7XG4gICAgICAgIGlmICghcmVxdWVzdFRva2VuKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbklkID0gdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4ocmVxdWVzdFRva2VuKTtcbiAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5Py50b2tlbiA9PT0gcmVxdWVzdFRva2VuKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9PT0gdHJhbnNpdGlvbklkKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjb25zdCBzaGFyZWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgfHwgbnVsbDtcbiAgICAgICAgaWYgKHNoYXJlZFRva2VuICYmIHNoYXJlZFRva2VuICE9PSByZXF1ZXN0VG9rZW4pIHtcbiAgICAgICAgICAgIC8vIE90cm8gY29udGV4dG8geWEgYWRvcHTDsyB1biBzdWNlc29yLiBSZWNvbmNpbGlhcmxvIGVuIHZleiBkZSBpbnZhbGlkYXJsbyBvIGNyZWFyIG90cm8uXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoZWNrb3V0SW52YWxpZGF0aW9uKHRyYW5zaXRpb25JZCwgJ2NhcnQtbm90LWFjdGl2ZScsIHJlcXVlc3RUb2tlbik7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXJlZFRva2VuICE9PSByZXF1ZXN0VG9rZW4pIHtcbiAgICAgICAgICAgIC8vIEVsIHRva2VuIGNvbXBhcnRpZG8geWEgZnVlIHJldGlyYWRvIHBvciBvdHJhIHBlc3Rhw7FhLCBxdWUgcHVkbyBjZXJyYXJzZVxuICAgICAgICAgICAgLy8gYW50ZXMgZGUgcHVibGljYXIgY2FydC1yZWFkeS4gRGVqYXIgZXN0ZSBjb250ZXh0byBpbnZhbGlkYWRvOyBlbCB3YXRjaGRvZ1xuICAgICAgICAgICAgLy8gaGFiaWxpdGEgZWwgcmVpbnRlbnRvIG1hbnVhbCwgc2luIHJlcGV0aXIgZXN0YSBtdXRhY2nDs24gbmkgY3JlYXIgb3RybyBjYXJyaXRvLlxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydF90b2tlbiA9PT0gcmVxdWVzdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGVja291dEludmFsaWRhdGlvbih0cmFuc2l0aW9uSWQsICdjYXJ0LW5vdC1hY3RpdmUnLCByZXF1ZXN0VG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRva2VuID0gcmVxdWVzdFRva2VuO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZDtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdpbnZhbGlkYXRlZCcsICdjYXJ0LW5vdC1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FydE5vdEFjdGl2ZVJlY292ZXJ5V2F0Y2hkb2codHJhbnNpdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXJ0Tm90QWN0aXZlVG9rZW4gPSByZXF1ZXN0VG9rZW47XG4gICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZDtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hlY2tvdXRJbnZhbGlkYXRpb24odHJhbnNpdGlvbklkLCAnY2FydC1ub3QtYWN0aXZlJywgcmVxdWVzdFRva2VuKTtcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCB0cnVlLCByZXF1ZXN0VG9rZW4pO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3N5bmNpbmcnKTtcbiAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NhcnQtaW52YWxpZGF0ZWQnLCB0cmFuc2l0aW9uSWQpO1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnY2FydC1ub3QtYWN0aXZlLXJlY292ZXJpbmcnKTtcbiAgICAgICAgdGhpcy5zdGFydENhcnROb3RBY3RpdmVSZWNvdmVyeShyZXF1ZXN0VG9rZW4sIHRyYW5zaXRpb25JZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXJ0Q2FydE5vdEFjdGl2ZVJlY292ZXJ5ID0gKGZhaWxlZFRva2VuOiBzdHJpbmcsIHRyYW5zaXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeT8udG9rZW4gPT09IGZhaWxlZFRva2VuKSByZXR1cm4gdGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnkucHJvbWlzZTtcbiAgICAgICAgY29uc3Qgc2hhcmVkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgIGlmIChzaGFyZWRUb2tlbiAmJiBzaGFyZWRUb2tlbiAhPT0gZmFpbGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgIGNvbnN0IGF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwge30pLnBpcGUodGltZW91dCh0aGlzLmNhcnRSZXF1ZXN0VGltZW91dE1zKSkudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSwgZmFpbGVkVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbiAmJiBjdXJyZW50VG9rZW4gIT09IGZhaWxlZFRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVDYXJ0KHJlc3BvbnNlLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnY2FydC1ub3QtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaENhcnRTeW5jKCdjYXJ0LXJlY292ZXJ5LWZhaWxlZCcsIHRyYW5zaXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0Tm90QWN0aXZlVHJhbnNpdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeVRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2FydC1yZWFkeScsIHRyYW5zaXRpb25JZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSwgZmFpbGVkVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yPy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFJldHJ5QWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlLCBmYWlsZWRUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnYXV0aGVudGljYXRpb24tY2hhbmdlZCcsICdhdXRoZW50aWNhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgZXJyb3I/LnN0YXR1cyA+PSA1MDAgPyAnc2VydmVyJyA6ICdjYXJ0LW5vdC1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2FydC1yZWNvdmVyeS1mYWlsZWQnLCB0cmFuc2l0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeT8udG9rZW4gPT09IGZhaWxlZFRva2VuKSB0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeSA9IHsgdG9rZW46IGZhaWxlZFRva2VuLCB0cmFuc2l0aW9uSWQsIHByb21pc2UgfTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhcnRDYXJ0Tm90QWN0aXZlUmVjb3ZlcnlXYXRjaGRvZyA9ICh0cmFuc2l0aW9uSWQ6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeVRpbWVyKTtcbiAgICAgICAgdGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCAhPT0gdHJhbnNpdGlvbklkIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY1N0YXRlU3ViamVjdC52YWx1ZS5zdGF0dXMgIT09ICdpbnZhbGlkYXRlZCcpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnY2FydC1ub3QtYWN0aXZlJyk7XG4gICAgICAgIH0sIHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVvdXRNcyk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBnZXRDYXJ0MigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzQm9vayA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5hZGRyZXNzQm9va0FwaSgpKS5waXBlKG1hcChyZXMgPT4gcmVzPy5sZW5ndGggJiYgcmVzLm1hcChhZGRyZXMgPT4geyByZXR1cm4gYWRkcmVzICYmIHsgLi4uYWRkcmVzLCBzZWxlY3RlZDogYWRkcmVzLmRlZmF1bHQgfSB9KSB8fCBudWxsKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgZ2V0VGF4ZXMgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRheGVzQXBpKCksIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KS5zdWJzY3JpYmUocmVzID0+IHJlcylcblxuICAgIHByaXZhdGUgZ2V0Q2FydCA9IGFzeW5jIChjaGVja291dFJlY292ZXJ5ID0gZmFsc2UpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cEluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcEFsbG93c1BlbmRpbmdBZGRzID0gIWNoZWNrb3V0UmVjb3Zlcnk7XG4gICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzTGltaXROb3RpZmllZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBQaWNrdXBSZXF1aXJlZEZvclJldHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0Q2FydEJvb3RzdHJhcFBpY2t1cChjaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KGZhbHNlKTtcbiAgICAgICAgY29uc3QgYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25JZCA9IHRoaXMuZ2V0Q3VycmVudFJvdXRlck5hdmlnYXRpb25JZCgpO1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3N5bmNpbmcnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5nZXRFcnJvck5vdEhhbmRsZXIoXG4gICAgICAgICAgICBgc2hvcC1hcGkvJHt0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCl9L2NhcnRzLyR7dG9rZW59P2xvY2FsZT0ke3RoaXMuY29uc3RzLmdldExvY2FsZSgpfWBcbiAgICAgICAgKS5waXBlKHRpbWVvdXQodGhpcy5jYXJ0UmVxdWVzdFRpbWVvdXRNcykpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24gfHwgY29udGV4dC5yZXF1ZXN0SWQgIT09IHRoaXMuY2FydFJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZUNhcnRCb290c3RyYXBJZkludmFsaWRhdGVkKGNoZWNrb3V0UmVjb3ZlcnkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydF90b2tlbiAhPT0gdG9rZW4gfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSAhPT0gdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5hdXRoQ29udGV4dEJsb2NrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FydEJvb3RzdHJhcFBpY2t1cChjaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplQ2FydChyZXNwb25zZSwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tvdXRSZWNvdmVyeSkgdGhpcy5maW5pc2hDaGVja291dENhcnRSZWNvdmVyeSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24gfHwgY29udGV4dC5yZXF1ZXN0SWQgIT09IHRoaXMuY2FydFJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZUNhcnRCb290c3RyYXBJZkludmFsaWRhdGVkKGNoZWNrb3V0UmVjb3ZlcnkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSwgdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydF90b2tlbiAhPT0gdG9rZW4gfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSAhPT0gdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuYXV0aENvbnRleHRCbG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQ2FydEJvb3RzdHJhcFJlY292ZXJ5UGVuZGluZyhuYXZpZ2F0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRDYXJ0Qm9vdHN0cmFwUGlja3VwKGNoZWNrb3V0UmVjb3ZlcnksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCB0cnVlLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya0NhcnRCb290c3RyYXBSZWNvdmVyeVBlbmRpbmcobmF2aWdhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRDYXJ0Qm9vdHN0cmFwUGlja3VwKGNoZWNrb3V0UmVjb3ZlcnksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yPy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUsIHRydWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCBjaGVja291dFJlY292ZXJ5ID8gJ2NoZWNrb3V0LWludGVycnVwdGVkJyA6IChlcnJvcj8uc3RhdHVzID49IDUwMCA/ICdzZXJ2ZXInIDogJ25ldHdvcmsnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydENhcnRCb290c3RyYXBQaWNrdXAgPSAoY2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlLCByZWNvdmVyZWRJbmFjdGl2ZVRva2VuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cCkgcmV0dXJuIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cDtcbiAgICAgICAgcmVjb3ZlcmVkSW5hY3RpdmVUb2tlbiA9IHJlY292ZXJlZEluYWN0aXZlVG9rZW4gfHwgISF0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb247XG4gICAgICAgIGNvbnN0IHNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICBpZiAoc2hhcmVkVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgIGNvbnN0IGF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dChmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmNhcnRJdGVtc0FwaSgpLCBudWxsKS5waXBlKHRpbWVvdXQodGhpcy5jYXJ0UmVxdWVzdFRpbWVvdXRNcykpLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhDb250ZXh0ICE9PSB0aGlzLmdldEF1dGhDb250ZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoQ29udGV4dCA9IHRoaXMuZ2V0QXV0aENvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2VuZXJhdGlvbiAhPT0gdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbiB8fCBjb250ZXh0LnJlcXVlc3RJZCAhPT0gdGhpcy5jYXJ0UmVxdWVzdElkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2hhcmVkVG9rZW4gJiYgY3VycmVudFNoYXJlZFRva2VuICE9PSBjb250ZXh0LnRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplQ2FydChyZXNwb25zZSwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3ZlcmVkSW5hY3RpdmVUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2hhbmdlZCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGVja291dFJlY292ZXJ5KSB0aGlzLmZpbmlzaENoZWNrb3V0Q2FydFJlY292ZXJ5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBQaWNrdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFJlY292ZXJ5TmF2aWdhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZW5lcmF0aW9uICE9PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSA0MDEgfHwgZXJyb3I/LnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgY2hlY2tvdXRSZWNvdmVyeSA/ICdjaGVja291dC1pbnRlcnJ1cHRlZCcgOiAoZXJyb3I/LnN0YXR1cyA+PSA1MDAgPyAnc2VydmVyJyA6ICduZXR3b3JrJykpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwID09PSByZXF1ZXN0KSB0aGlzLmNhcnRCb290c3RyYXBQaWNrdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB0aGlzLnJlc3VtZUNhcnRCb290c3RyYXBJZkludmFsaWRhdGVkKGNoZWNrb3V0UmVjb3ZlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwID0gcmVxdWVzdDtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVzdW1lQ2FydEJvb3RzdHJhcElmSW52YWxpZGF0ZWQgPSAoY2hlY2tvdXRSZWNvdmVyeTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aENvbnRleHRCbG9ja2VkICYmICF0aGlzLmNhcnRfdG9rZW4gJiYgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgJiZcbiAgICAgICAgICAgIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnaW52YWxpZGF0ZWQnICYmXG4gICAgICAgICAgICAhdGhpcy5jYXJ0Tm90QWN0aXZlVG9rZW4gJiYgIXRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FydChjaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGZpbmlzaENoZWNrb3V0Q2FydFJlY292ZXJ5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRJbnZhbGlkYXRlZEF0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpO1xuICAgICAgICB0aGlzLmNvbXBsZXRlZENoZWNrb3V0VHJhbnNpdGlvbklkID0gdGhpcy5hY3RpdmVDaGVja291dFRyYW5zaXRpb25JZDtcbiAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoZWNrb3V0LXJlYWR5JywgdGhpcy5hY3RpdmVDaGVja291dFRyYW5zaXRpb25JZCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgPSBudWxsO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGdldENhcnRCeVRva2VuID0gYXN5bmMgKHRva2VuID0gdGhpcy5jYXJ0X3Rva2VuKSA9PiB7XG4gICAgICAgIGlmICghdG9rZW4gfHwgdG9rZW4gIT09IHRoaXMuY2FydF90b2tlbiB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dChmYWxzZSk7XG4gICAgICAgIGNvbnN0IGF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuY2FydEl0ZW1zQXBpKCksIHsgdG9rZW4gfSkucGlwZSh0aW1lb3V0KHRoaXMuY2FydFJlcXVlc3RUaW1lb3V0TXMpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpIHx8IGNvbnRleHQuZ2VuZXJhdGlvbiAhPT0gdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbiB8fCB0aGlzLmNhcnRfdG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVDYXJ0KHJlcywgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdHdWVzdENhcnRBc3NvY2lhdGlvblRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpIHx8IGNvbnRleHQuZ2VuZXJhdGlvbiAhPT0gdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbiB8fCB0aGlzLmNhcnRfdG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdHdWVzdENhcnRBc3NvY2lhdGlvblRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdlcnJvcicsIGVycm9yPy5zdGF0dXMgPT09IDQwMSB8fCBlcnJvcj8uc3RhdHVzID09PSA0MDMgPyAnYXV0aGVudGljYXRpb24nIDogKGVycm9yPy5zdGF0dXMgPj0gNTAwID8gJ3NlcnZlcicgOiAnbmV0d29yaycpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXJ0QnlDdXN0b21lciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FwdHVyZUNhcnRSZXNwb25zZUNvbnRleHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzLCBjb250ZXh0KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqICBDQVJUIENSVUQgU0VSVkVSJ1MgU1lOQ1JPTklaRURcbiAgICAgKi9cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUNhcnQgPSAocmVzcG9uc2UsIGNvbnRleHQ6IENhcnRSZXNwb25zZUNvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcGx5Q2FydFJlc3BvbnNlKHJlc3BvbnNlLCBjb250ZXh0LCBmYWxzZSwgZmFsc2UsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9jYWxlID0gcmVzcG9uc2UubG9jYWxlO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3JlYWR5Jyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mbHVzaFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogQ2FwdHVyYSBsYSBnZW5lcmFjacOzbiBkZWwgY2ljbG8gZGVsIGNhcnJpdG8geSBlbCBvcmRlbiBkZSBpbmljaW8gZGUgbGEgcGV0aWNpw7NuLiAqL1xuICAgIHB1YmxpYyBjYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCA9IChhbGxvd1Rva2VuQ2hhbmdlID0gdHJ1ZSk6IENhcnRSZXNwb25zZUNvbnRleHQgPT4gKHtcbiAgICAgICAgdG9rZW46IHRoaXMuY2FydF90b2tlbiB8fCBudWxsLFxuICAgICAgICBnZW5lcmF0aW9uOiB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uLFxuICAgICAgICByZXF1ZXN0SWQ6ICsrdGhpcy5jYXJ0UmVxdWVzdElkLFxuICAgICAgICBhbGxvd1Rva2VuQ2hhbmdlXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgaXNDYXJ0UmVzcG9uc2VDb250ZXh0Q3VycmVudCA9IChjb250ZXh0OiBDYXJ0UmVzcG9uc2VDb250ZXh0KTogYm9vbGVhbiA9PiAhIWNvbnRleHQgJiZcbiAgICAgICAgY29udGV4dC5nZW5lcmF0aW9uID09PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uICYmXG4gICAgICAgIChjb250ZXh0LmFsbG93VG9rZW5DaGFuZ2UgfHwgY29udGV4dC50b2tlbiA9PT0gKHRoaXMuY2FydF90b2tlbiB8fCBudWxsKSkgJiZcbiAgICAgICAgY29udGV4dC5yZXF1ZXN0SWQgPj0gdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQ7XG5cbiAgICBwdWJsaWMgaXNDYXJ0QnVzaW5lc3NFcnJvciA9IChyZXNwb25zZTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlPy5lcnJvcnM7XG4gICAgICAgIHJldHVybiAhIShyZXNwb25zZT8uZXJyb3IgfHwgcmVzcG9uc2U/LmNvZGUgfHwgKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycy5sZW5ndGggPiAwIDogZXJyb3JzKSB8fFxuICAgICAgICAgICAgcmVzcG9uc2U/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnIHx8IHJlc3BvbnNlPy5jYXJ0X3Jlc3BvbnNlPy5zdGF0dXMgPT09ICdmYWlsdXJlJyB8fFxuICAgICAgICAgICAgcmVzcG9uc2U/LmNhcnQ/LmVycm9yIHx8IHJlc3BvbnNlPy5jYXJ0Py5zdGF0dXMgPT09ICdmYWlsdXJlJyk7XG4gICAgfVxuXG4gICAgLyoqIEFkb3B0YSB5IHNpbmNyb25pemEgdW4gcmVzdW1lbiBleGl0b3NvIHNpIHRvZGF2w61hIHBlcnRlbmVjZSBhIGxhIHZlcnNpw7NuIHZpZ2VudGUgZGVsIGNhcnJpdG8uICovXG4gICAgcHVibGljIGFwcGx5Q2FydFJlc3BvbnNlID0gKHJlc3BvbnNlOiBhbnksIGNvbnRleHQ6IENhcnRSZXNwb25zZUNvbnRleHQsIGVtaXRFdmVudCA9IHRydWUsIHB1Ymxpc2hJbnZhbGlkYXRpb24gPSB0cnVlLCBmbHVzaFBlbmRpbmdBZGRzID0gdHJ1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0NhcnRCdXNpbmVzc0Vycm9yKHJlc3BvbnNlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjYXJ0ID0gcmVzcG9uc2U/LmNhcnQgJiYgcmVzcG9uc2UuY2FydC50b2tlblZhbHVlID8gcmVzcG9uc2UuY2FydCA6IHJlc3BvbnNlO1xuICAgICAgICBpZiAoIWNhcnQgfHwgIWNhcnQudG9rZW5WYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShjYXJ0Lml0ZW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBVbmEgcmVzcHVlc3RhIGRlIHVuIGNpY2xvIGFudGVyaW9yIChwb3IgZWplbXBsbywgYW50ZXMgZGVsIGNoZWNrb3V0IG9cbiAgICAgICAgLy8gZGUgdW5hIGludmFsaWRhY2nDs24gcmVtb3RhKSBubyBkZWJlIHZvbHZlciBhIGFjdGl2YXIgbGEgc2luY3Jvbml6YWNpw7NuLlxuICAgICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5nZW5lcmF0aW9uICE9PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICBpZiAoc2hhcmVkVG9rZW4gIT09IGNvbnRleHQudG9rZW4pIHtcbiAgICAgICAgICAgIC8vIE90cmEgcGVzdGHDsWEgeWEgYXZhbnrDsyBlbCB0b2tlbiBjb21wYXJ0aWRvLiBMYSBtdXRhY2nDs24gcHVkb1xuICAgICAgICAgICAgLy8gZWplY3V0YXJzZSwgYXPDrSBxdWUgcmVjb25jaWxpYW1vcyBkZXNkZSBlc2UgdG9rZW4gc2luIGFkb3B0YXJsYS5cbiAgICAgICAgICAgIGlmIChwdWJsaXNoSW52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2godGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGEgbXV0YWNpw7NuIHB1ZG8gZWplY3V0YXJzZSBlbiBiYWNrZW5kLCBhdW5xdWUgb3RyYSByZXNwdWVzdGEgbcOhcyBudWV2YVxuICAgICAgICAvLyB5YSBoYXlhIHNpZG8gYXBsaWNhZGEgbG9jYWxtZW50ZS4gSW52YWxpZGFtb3MgeSBsZWVtb3MgZWwgdG9rZW4gdmlnZW50ZS5cbiAgICAgICAgaWYgKGNvbnRleHQucmVxdWVzdElkIDwgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIGlmIChwdWJsaXNoSW52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2godGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzQ2FydFJlc3BvbnNlQ29udGV4dEN1cnJlbnQoY29udGV4dCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoY2FydC50b2tlblZhbHVlICE9PSB0aGlzLmNhcnRfdG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FydF90b2tlbiA9IGNhcnQudG9rZW5WYWx1ZTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0X3Rva2VuJywgY2FydC50b2tlblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHVibGlzaEludmFsaWRhdGlvbikgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoYW5nZWQnKTtcbiAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSBjb250ZXh0LnJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGVtaXRFdmVudCk7XG4gICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShjYXJ0KTtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdyZWFkeScpO1xuICAgICAgICBpZiAoZmx1c2hQZW5kaW5nQWRkcykgdGhpcy5mbHVzaFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFzaWduYSBgcHJvZHVjdC5wcmljZWAgYWwgcHJlY2lvIGJhc2UgbGVnYWN5IHF1ZSBlc3BlcmEgZWwgdGVtcGxhdGUgaGlzdMOzcmljbyBkZWwgY2Fycml0by5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyDDjXRlbXMgbm9ybWFsaXphZG9zIGRlbCBjYXJyaXRvLlxuICAgICAqIEByZXR1cm5zIExvcyBtaXNtb3Mgw610ZW1zIGNvbiBgcHJvZHVjdC5wcmljZWAgYWxpbmVhZG8gYWwgcHJlY2lvIGJhc2UgbW9zdHJhZG8gZW4gbGEgdGFibGEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVzdGUgbcOpdG9kbyBubyBtb2RpZmljYSBgcHJpY2luZy5maW5hbFByaWNlYC4gU29sbyBwcmVzZXJ2YSBjb21wYXRpYmlsaWRhZCBjb24gdGVtcGxhdGVzXG4gICAgICogdmllam9zIHF1ZSB0b2RhdsOtYSBsZWVuIGBpdGVtLnByb2R1Y3QucHJpY2VgIGRpcmVjdGFtZW50ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN3aXRjaFByaWNlSW5DYXJ0SXRlbSA9IChpdGVtczogQ2FydEl0ZW1bXSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKFxuICAgICAgICAgICAgaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmljaW5nID0gdGhpcy5nZXRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGl0ZW0ucHJvZHVjdC52YXJpYW50cz8uWzBdO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2R1Y3QucHJpY2UgPSBwcmljaW5nPy5iYXNlUHJpY2UgfHwgdmFyaWFudD8uc2FsZXByaWNlIHx8IHZhcmlhbnQ/LnByaWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGVwQ2FydCA9IChyZXMpID0+IHtcbiAgICAgICAgcmVzLml0ZW1zLmxlbmd0aCA+IDAgJiYgcmVzLml0ZW1zLmZvckVhY2goXG4gICAgICAgICAgICBpdGVtID0+ICF0aGlzLmlzSXRlbUluTG9jYWwoaXRlbS5pZCkgJiYgdGhpcy5kZWxldGVDYXJ0SXRlbShpdGVtLCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRBbGxUb0NhcnQoXG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgICBpdGVtID0+ICFyZXMuaXRlbXMuc29tZShleHRlcm5hbF9pdGVtID0+IGV4dGVybmFsX2l0ZW0uaWQgPT0gaXRlbS5pdGVtX2lkKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJ0SXRlbXMgPSAoaXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB0aGlzLmNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICB0aGlzLmNhcnRJdGVtc1N1YmplY3QubmV4dCh0aGlzLml0ZW1zKTtcbiAgICAgICAgdGhpcy51cGRhdGVMb2NhbENhcnQoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbmNyb25pemEgYGNhcnRJdGVtc1N1YmplY3RgIGNvbiBsYSDDumx0aW1hIHJlc3B1ZXN0YSBkZWwgYmFja2VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXJ0IFJlc3B1ZXN0YSBkZSBjYXJyaXRvIHJlY2liaWRhIGRlc2RlIGN1YWxxdWllciBlbmRwb2ludCBxdWUgZGV2dWVsdmEgYGl0ZW1zYC5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2UgcmV1dGlsaXphIGRlc3B1w6lzIGRlIGFjdHVhbGl6YXIgY2FudGlkYWRlcywgYXBsaWNhciBjdXDDs24gbyByZW1vdmVyIHByb2R1Y3RvcyBwYXJhIGV2aXRhclxuICAgICAqIHF1ZSBsYSB0YWJsYSBxdWVkZSBjb24gc3VidG90YWxlcyBvIHByb21vY2lvbmVzIGRlc2FjdHVhbGl6YWRhcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UgPSAoY2FydCkgPT4ge1xuICAgICAgICBpZiAoIWNhcnQ/Lml0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTtcbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gdGhpcy50cmFuc2Zvcm1JdGVtcyhjYXJ0Lml0ZW1zKS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtOiBhbnkgPSBwcmV2aW91c0l0ZW1zLmZpbmQocHJldiA9PiBwcmV2Lml0ZW1faWQgPT0gaXRlbS5pdGVtX2lkKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldmlvdXNJdGVtLFxuICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgZmFpbGVkOiBwcmV2aW91c0l0ZW0/LmZhaWxlZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogcHJldmlvdXNJdGVtPy5lcnJvclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXMobmV4dEl0ZW1zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRJdGVtUXVhbnRpdHkgPSAodmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQ29tbWVudHMgPSBjb21tZW50cyAhPT0gdW5kZWZpbmVkID8gKGNvbW1lbnRzID8/ICcnKS50cmltKCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLml0ZW1zLm1hcChpdCA9PiB7XG4gICAgICAgICAgICBpZiAoaXQudmFyaWFudF9pZCAhPT0gdmFyaWFudF9pZCkgcmV0dXJuIGl0O1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZDogYW55ID0geyAuLi5pdCwgcXVhbnRpdHk6IE51bWJlcihxdWFudGl0eSkgfTtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkQ29tbWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQuY29tbWVudHMgPSBub3JtYWxpemVkQ29tbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pdGVtcyA9IG5ld0l0ZW1zO1xuICAgICAgICB0aGlzLmNhcnRJdGVtc1N1YmplY3QubmV4dCh0aGlzLml0ZW1zKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsQ2FydCgpO1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC11cGRhdGVkJywgeyBxdWFudGl0eSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZFRvQ2FydCA9IChjYXJ0KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihjYXJ0KTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICAvLyAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC1hZGRlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlQ2FydEl0ZW0gPSAoY2FydCwgcHJvZHVjdCwgdG9hc3QgPSB0cnVlLCBhbHJlYWR5U3luY2hyb25pemVkID0gZmFsc2UpID0+IHtcbiAgICAgICAgaWYgKCFhbHJlYWR5U3luY2hyb25pemVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRvYXN0ICYmIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdG9hc3QgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtcmVtb3ZlZCcpO1xuICAgICAgICAvLyB0aGlzLmdvb2dsZUFuYWx5dGljcy5yZW1vdmVGcm9tQ2FydChwcm9kdWN0KTtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgncmVtb3ZlX2Zyb21fY2FydCcsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RzLmN1cnJlbmN5LmNvZGUgfSlcblxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSWZBbGxyZWFkeUV4aXN0cyA9IChwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eUFkZCA9IDEsIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5maW5kKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC5pZCA9PSBwcm9kdWN0LmlkICYmIGl0ZW0udmFyaWFudF9pZCA9PSB2YXJpYW50X2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgdGhpcy5maW5kSXRlbShwcm9kdWN0LmlkKS5xdWFudGl0eSArIHF1YW50aXR5QWRkLCBjb21tZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2NhbENhcnQgPSAoKSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5pdGVtcykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRDYXJ0ID0gKG5leHQ/KSA9PiB7XG4gICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBBbGxvd3NQZW5kaW5nQWRkcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0b2tlblRvUmVzZXQgPSB0aGlzLmNhcnRfdG9rZW4gfHwgbnVsbDtcbiAgICAgICAgdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbisrO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhudWxsKTtcbiAgICAgICAgdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnQnLCBcIltdXCIpO1xuICAgICAgICBpZiAodG9rZW5Ub1Jlc2V0ICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgPT09IHRva2VuVG9SZXNldCkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NhcnRfdG9rZW4nKTtcbiAgICAgICAgbmV4dCAmJiBuZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJ0T2JqID0gKGNhcnQsIGVtaXRFdmVudCA9IHRydWUpOiBib29sZWFuID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGNhcnQ/LmJhbGFuY2VDdXN0b21lciwgY2FydD8udG90YWxzPy50b3RhbCk7XG4gICAgICAgIGVtaXRFdmVudCAmJiB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCdhZGRfdG9fY2FydCcsIGNhcnQpO1xuICAgICAgICB0aGlzLnByb21vdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5vcmRlclV0aWxzLmdldFByb21vdGlvbnMoY2FydCwgdHJ1ZSkpO1xuXG4gICAgICAgIGNhcnQuY291cG9uQ29kZVxuICAgICAgICAgICAgPyB0aGlzLmZvcm1hdENvdXBvbihjYXJ0KVxuICAgICAgICAgICAgOiB0aGlzLmNvdXBvblN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlQ2FydEFmdGVyUGF5bWVudFJlc3BvbnNlID0gKGNhcnQ6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIWNhcnQ/LnRvdGFscykgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSXRlbUluTG9jYWwgPSAoaXRlbV9pZCkgPT4gdGhpcy5pdGVtcy5zb21lKGl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGl0ZW1faWQpO1xuXG4gICAgLyoqXG4gICAgICogIEBwdWJsaWNcbiAgICAgKiAgQ0FSVCBDUlVEXG4gICAgICovXG5cbiAgICBhZGRUb0NhcnQgPSAocHJvZHVjdDogUHJvZHVjdCwgcXVhbnRpdHk6IG51bWJlciwgdmFyaWFudF9pZCwgY29tbWVudHM/OiBzdHJpbmcsIGZyb21Cb290c3RyYXBRdWV1ZSA9IGZhbHNlLCBxdWV1ZUdlbmVyYXRpb24/OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbk11dGF0ZUNhcnQoKSkge1xuICAgICAgICAgICAgLy8gRWwgYWdyZWdhZG8gYcO6biBubyBzZSBlbnZpw7MgYWwgYmFja2VuZC4gUmV0ZW5lcmxvIGR1cmFudGUgZWxcbiAgICAgICAgICAgIC8vIGJvb3RzdHJhcCBldml0YSBwZXJkZXIgZWwgcHJpbWVyIGNsaWNrIGRlc3B1w6lzIGRlIEY1LCBzaW5cbiAgICAgICAgICAgIC8vIGhhYmlsaXRhciBtdXRhY2lvbmVzIGR1cmFudGUgdW5hIGludmFsaWRhY2nDs24gbyB1biBlcnJvci5cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRCb290c3RyYXBBbGxvd3NQZW5kaW5nQWRkcyAmJiAhdGhpcy5hdXRoQ29udGV4dEJsb2NrZWQgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwSW5GbGlnaHQgfHwgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcy5sZW5ndGggPj0gdGhpcy5tYXhQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkc0xpbWl0Tm90aWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzTGltaXROb3RpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcy5wdXNoKHsgcHJvZHVjdCwgcXVhbnRpdHksIHZhcmlhbnRJZDogdmFyaWFudF9pZCwgY29tbWVudHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RJblByb2Nlc3MuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QudmFsdWU7XG4gICAgICAgIGNvbnN0IGFwcGx5TWF4T3JkZXJzID0gYmFsYW5jZT8uYXBwbHlNYXhPcmRlcnMgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1heE9yZGVycyA9IGJhbGFuY2U/Lm1heE9yZGVycyA/PyBJbmZpbml0eTtcblxuICAgICAgICBpZiAoYXBwbHlNYXhPcmRlcnMgJiYgKG1heE9yZGVycyA8PSAwIHx8IG1heE9yZGVycyA9PT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtYXgtb3JkZXJzLXJlYWNoZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBxdWFudGl0eSxcbiAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogdmFyaWFudF9pZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50cykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY29tbWVudHMgPSBjb21tZW50cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tQm9vdHN0cmFwUXVldWUgJiYgcXVldWVHZW5lcmF0aW9uID09PSB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0UXVldWVHZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYW5lamFyIGxhIHJlc3B1ZXN0YSBIVFRQIGV4aXRvc2EgKGPDs2RpZ28gMjAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSkgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmVqYXIgZWwgZXJyb3IgZGUgbGEgbGxhbWFkYSBIVFRQIChjw7NkaWdvIDUwMCB1IG90cm8gZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ8OzZGlnbyBkZSBlcnJvciA1MDAgKHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsIGNvbnRleHQudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdIYSBvY3VycmlkbyB1biBlcnJvciBhbCBhZ3JlZ2FyIGFsIGNhcnJpdG8uIFZ1ZWx2YSBhIGludGVudGFybG8uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90cm8gY8OzZGlnbyBkZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnRXJyb3IgaW5lc3BlcmFkby4gVnVlbHZhIGEgaW50ZW50YXJsbycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG5cbiAgICB9XG5cbiAgICBhZGRUb0xvdCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBpZD8sIG9yZGVyX2l0ZW1faWQ/LCBsb3RfcXVhbnRpdHk/LCB1bml0X3ByaWNlPywgdW5pdF90b3RhbD8sIGFqdXN0ZW1lbnRfdG90YWw/LCB0b3RhbF9sb3Q/LCBsb3Rfc3RhdHVzPywgZGF0ZV9yZXF1ZXN0Pywgbm90ZXM/LCBzaGlwcGluZ19hZGRyZXNzX2lkPywgc2hpcHBpbmdfYWRkcmVzc19uYW1lPywgYWN0aW9uPykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICBsZXQgYWRkZWQgPSAnJztcbiAgICAgICAgIWFkZGVkICYmIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkSXRlbUFwaSgpLCB7IHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLCBxdWFudGl0eTogcXVhbnRpdHksIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLCBpZDogaWQgfHwgJycsIG9yZGVyX2l0ZW1faWQ6IG9yZGVyX2l0ZW1faWQgfHwgJycsIGxvdF9xdWFudGl0eTogbG90X3F1YW50aXR5IHx8ICcnLCB1bml0X3ByaWNlOiB1bml0X3ByaWNlIHx8ICcnLCB1bml0X3RvdGFsOiB1bml0X3RvdGFsIHx8ICcnLCBhanVzdGVtZW50X3RvdGFsOiBhanVzdGVtZW50X3RvdGFsIHx8ICcnLCB0b3RhbF9sb3Q6IHRvdGFsX2xvdCB8fCAnJywgbG90X3N0YXR1czogbG90X3N0YXR1cyB8fCAnJywgZGF0ZV9yZXF1ZXN0OiBkYXRlX3JlcXVlc3QgfHwgJycsIG5vdGVzOiBub3RlcyB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogc2hpcHBpbmdfYWRkcmVzc19pZCB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiBzaGlwcGluZ19hZGRyZXNzX25hbWUgfHwgJycsIGFjdGlvbjogYWN0aW9uIHx8ICduZXdsb3QnIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB0aGlzLmFwcGx5Q2FydFJlc3BvbnNlKHJlcywgY29udGV4dCksXG4gICAgICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhZGRUb0NhcnRQcm9taXNlID0gYXN5bmMgKHByb2R1Y3Q6IFByb2R1Y3QsIHF1YW50aXR5OiBudW1iZXIsIHZhcmlhbnRfaWQsIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm4geyBlcnJvcjogdHJ1ZSB9O1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NhcnRCdXNpbmVzc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hcHBseUNhcnRSZXNwb25zZShyZXN1bHQsIGNvbnRleHQpKSByZXR1cm4geyBlcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciwgY29udGV4dC50b2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUgfTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlIH1cbiAgICB9XG5cblxuICAgIGFkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbk11dGF0ZUNhcnQoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBpdGVtczogdGhpcy5tZXJnZUl0ZW1zQWRkQWxsVG9DYXJ0KGl0ZW1zKSB9O1xuXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkQWxsSXRlbXNBcGkoKSwgcGFyYW1zKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpLnRoZW4oXG4gICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSAmJiByZXMuY2FydF9yZXNwb25zZS5zdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsIGNvbnRleHQudG9rZW4pO1xuICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFJlcGVhdE9yZGVyVG9DYXJ0KGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhcnQtbm90LWVtcHR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGVcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChpdGVtc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXByb2R1Y3RzLXRvLWFkZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zVG9BZGRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FwdHVyZUNhcnRSZXNwb25zZUNvbnRleHQoKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEFsbEl0ZW1zQXBpKCksIHBhcmFtcylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnIHx8IHJlcz8uY2FydF9yZXNwb25zZT8uc3RhdHVzID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yPy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJ18nKSB8fCAndW5rbm93bl9lcnJvcic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNSZXNwb25zZSA9IHJlcz8uaXRlbXNfcmVzcG9uc2UgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2FydEl0ZW1zID0gcmVzPy5jYXJ0Py5pdGVtcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mU3RvY2tJdGVtcyA9IGl0ZW1zUmVzcG9uc2UuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPT09ICdmYWlsdXJlJyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycy5zb21lKGVycm9yID0+IGVycm9yLmNvZGUgPT09ICdvdXRfb2Zfc3RvY2snKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnYWxsLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG91dE9mU3RvY2tJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzb21lLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsIGNvbnRleHQudG9rZW4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyZ2VJdGVtc0FkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IHBhcmFtc01lcmdlID0gW11cbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1JbnRlcm5vID0gaXRlbXMuZmluZChpdGVtUGFyYW0gPT4gaXRlbVBhcmFtLnZhcmlhbnRDb2RlID09IGl0ZW0udmFyaWFudF9pZClcbiAgICAgICAgICAgIHBhcmFtc01lcmdlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS52YXJpYW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbUludGVybm8gJiYgaXRlbUludGVybm8ucXVhbnRpdHkgfHwgaXRlbS5xdWFudGl0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtUGFyYW0gPT4gIXRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpKVxuXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXMsIC4uLnBhcmFtc01lcmdlXVxuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1RdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlUXVhbnRpdHkoaXRlbSwgcXVhbnRpdHkpICYmICh0aGlzLnZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzKGl0ZW0sIHF1YW50aXR5KSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlR2VuZXJhdGlvbiA9IHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRJbkZsaWdodCA/IHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRRdWV1ZUdlbmVyYXRpb24gOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7IHF1YW50aXR5OiBOdW1iZXIocXVhbnRpdHkpIH07XG4gICAgICAgICAgICBpZiAoY29tbWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSAoY29tbWVudHMgPz8gJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNvbW1lbnRzID0gY2xlYW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgLnB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtUXVhbnRpdHlBcGkodGhpcy5maW5kSXRlbUJ5SWRWYXJpYW50KGl0ZW0udmFyaWFudF9pZCkpLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWVHZW5lcmF0aW9uICE9PSBudWxsICYmIHF1ZXVlR2VuZXJhdGlvbiA9PT0gdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSkgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtdXBkYXRlZCcsIHsgcXVhbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgY29udGV4dC50b2tlbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhbGlkYXRlUXVhbnRpdHkgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5KSA9PiB7XG4gICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpID4gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1heGltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4aW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tYXhpbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgPCBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWluaW11bUl0ZW1zUXVhbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtaW5pbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgJiYgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSAlIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3QtYmUtbXVsdGlwbGUnLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eTogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QudmFsdWU7XG5cbiAgICAgICAgaWYgKCFiYWxhbmNlIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSBudWxsIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pdFByaWNlID0gaXRlbS50b3RhbCAvIGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxRdWFudGl0eSA9IHF1YW50aXR5IC0gaXRlbS5xdWFudGl0eTtcblxuICAgICAgICBpZiAoYWRkaXRpb25hbFF1YW50aXR5IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbENvc3QgPSB1bml0UHJpY2UgKiBhZGRpdGlvbmFsUXVhbnRpdHk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxDb3N0ID4gYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGhhc1N1ZmZpY2llbnRDcmVkaXRzRm9yQ2FydFRvdGFsID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuXG4gICAgICAgIGlmICghYmFsYW5jZSB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gbnVsbCB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5jYXJ0U3ViamVjdC52YWx1ZT8udG90YWxzPy50b3RhbCB8fCAwO1xuXG4gICAgICAgIC8vIFNpIE5PIHB1ZWRlIGV4Y2VkZXIgc2FsZG8geSBlbCB0b3RhbCBzdXBlcmEgZWwgY3JlZGl0bywgYmxvcXVlYXJcbiAgICAgICAgaWYgKCFiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSAmJiB0b3RhbCA+IGJhbGFuY2UuY3JlZGl0QW1vdW50KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgY2FsY3VsYXRlU3RvY2tDb3VudHMgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5KSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnByb2R1Y3Quc3RvY2sgPCBpdGVtLnF1YW50aXR5ICsgcXVhbnRpdHkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZGVsZXRlQ2FydEl0ZW0gPSAoaXRlbSwgdG9hc3QgPSB0cnVlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jYW5NdXRhdGVDYXJ0KCkpIHJldHVybjtcbiAgICAgICAgbGV0IGlkX2J1c2NhZG8gPSB0aGlzLmZpbmRJdGVtQnlJZFZhcmlhbnQoaXRlbS52YXJpYW50X2lkKVxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FwdHVyZUNhcnRSZXNwb25zZUNvbnRleHQoKTtcbiAgICAgICAgLy8gICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHsgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCwgcXVhbnRpdHk6IDAsIHZhcmlhbnRDb2RlOiBpdGVtLnZhcmlhbnRfaWQsIGlkOiAnJywgb3JkZXJfaXRlbV9pZDogaXRlbS5pdGVtX2lkLCBsb3RfcXVhbnRpdHk6ICcnLCB1bml0X3ByaWNlOiAnJywgdW5pdF90b3RhbDogJycsIGFqdXN0ZW1lbnRfdG90YWw6ICcnLCB0b3RhbF9sb3Q6ICcnLCBsb3Rfc3RhdHVzOiAnJywgZGF0ZV9yZXF1ZXN0OiAnJywgbm90ZXM6ICAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogJycsIHNoaXBwaW5nX2FkZHJlc3NfbmFtZTogJycsIGFjdGlvbjogICdkZWxldGVvcmRlcml0ZW0nfSlcbiAgICAgICAgLy8gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIC8vICAgICAgICAgICAgcmVzID0+IHRoaXMucmVtb3ZlQ2FydEl0ZW0ocmVzLCBpdGVtLCB0b2FzdCksXG4gICAgICAgIC8vICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxuICAgICAgICAvLyAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRlbGV0ZSh0aGlzLmRlbGV0ZUl0ZW1BcGkoaWRfYnVzY2FkbykpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzQ2FydEJ1c2luZXNzRXJyb3IocmVzKSAmJiBjb250ZXh0LmdlbmVyYXRpb24gPT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgIShyZXM/LnRva2VuVmFsdWUgJiYgQXJyYXkuaXNBcnJheShyZXMuaXRlbXMpKSAmJiAhKHJlcz8uY2FydD8udG9rZW5WYWx1ZSAmJiBBcnJheS5pc0FycmF5KHJlcy5jYXJ0Lml0ZW1zKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gREVMRVRFIHB1ZWRlIGNvbmZpcm1hciBsYSBlbGltaW5hY2nDs24gc2luIGRldm9sdmVyIHVuIHJlc3VtZW4uXG4gICAgICAgICAgICAgICAgICAgIC8vIFNvbG8gZXNhIG9wZXJhY2nDs24gY29ub2NlIHF1ZSBlbCBiYWNrZW5kIHPDrSBlamVjdXTDsyBlbCBjYW1iaW8uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaENhcnRTeW5jKCdjaGFuZ2VkJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVyciA9PiB7IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY2xlYXJDYXJ0KCkge1xuICAgICAgICAvL3NvbHVjaW9uIHByb3Zpc2FvcmlhXG4gICAgICAgIGxldCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXVxuICAgICAgICB3aGlsZSAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDYXJ0SXRlbShpdGVtcy5wb3AoKSwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnQpO1xuICAgIH1cblxuICAgIGNsZWFyQW5kUmVzZXRDYXJ0KCkge1xuICAgICAgICB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkID0gdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4odGhpcy5jYXJ0X3Rva2VuIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykpO1xuICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2hlY2tvdXQtaW52YWxpZGF0ZWQnLCB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGVja291dEludmFsaWRhdGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2ludmFsaWRhdGVkJyk7XG4gICAgICAgIHRoaXMuc3RhcnRDaGVja291dFJlY292ZXJ5V2F0Y2hkb2coKTtcbiAgICAgICAgdGhpcy5yZXNldENhcnQoKCkgPT4gdGhpcy5nZXRDYXJ0KHRydWUpKTtcbiAgICB9XG5cbiAgICBjbGVhckFuZFJlc2V0Q3VzdG9tZXJDYXJ0KCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNsZWFyaW5nIGFuZCByZXNldGluZy4uLlwiKVxuICAgICAgICB0aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnRCeUN1c3RvbWVyKVxuICAgIH1cblxuICAgIGhhbmRsZUVycm9yID0gKGVycm9yOiB7IGVycm9yOiBzdHJpbmcgfSwgcmVxdWVzdFRva2VuOiBzdHJpbmcgfCBudWxsID0gdGhpcy5jYXJ0X3Rva2VuIHx8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlQ2FydE11dGF0aW9uRXJyb3IoZXJyb3IsIHJlcXVlc3RUb2tlbikpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBnZXRDb3VudEZyb21JdGVtSW5DYXJ0ID0gKGNvZGVWYXJpYW50KTogbnVtYmVyID0+IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0udmFyaWFudF9pZCA9PSBjb2RlVmFyaWFudCk/LnF1YW50aXR5IHx8IDA7XG5cbiAgICBmaW5kSXRlbUJ5SWRWYXJpYW50ID0gKHZhcmlhbnRfaWQpID0+IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0udmFyaWFudF9pZCA9PSB2YXJpYW50X2lkKS5pdGVtX2lkXG5cbiAgICBmaW5kSXRlbSA9IChwcm9kdWN0X2lkKSA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnByb2R1Y3QuaWQgPT0gcHJvZHVjdF9pZCk7XG5cbiAgICAvKiogREFUQSBGT1IgT1RIRVIgU0VSVklDRVMgKi9cbiAgICBnZXRDYXJ0VG9rZW4gPSAoKSA9PiB0aGlzLmNhcnRfdG9rZW47XG5cbiAgICBnZXRMb2NhbGUgPSAoKSA9PiB0aGlzLmxvY2FsZTtcblxuICAgIGdldFRvdGFsQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IGNhcnQ/LnRvdGFscz8udG90YWwpKTtcblxuICAgIGdldFBheW1lbnRNZXRob2RBZGp1c3RtZW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnBheW1lbnRNZXRob2RBZGp1c3RtZW50ID8/IG51bGwpKTtcblxuICAgIGdldFBheW1lbnRNZXRob2RBZGp1c3RtZW50TGFiZWwgPSAoKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IGNhcnQ/LnRvdGFscz8ucGF5bWVudE1ldGhvZEFkanVzdG1lbnRMYWJlbCA/PyBudWxsKSk7XG5cbiAgICAvKiogVG90YWwgcGFyYSBjYXJyaXRvL3NpZGViYXIsIHNpbiBlbnbDrW8gcGVyc2lzdGlkbyBuaSByZWNhcmdvcyBkZSBjaGVja291dC4gKi9cbiAgICBnZXRDYXJ0VG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUb3RhbEFtb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q291bnRDYXJ0SXRlbXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChjYXJ0SXRlbXMpID0+IGNhcnRJdGVtcz8ubGVuZ3RoKSk7XG5cbiAgICBnZXRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8udGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRTdWJUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpKSk7XG5cbiAgICBnZXRDYXJ0VGF4ZXNBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUYXhlc0Ftb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q2FydENsaWVudFRheGVzQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0Q2xpZW50VGF4ZXNBbW91bnQoY2FydCkpKTtcblxuICAgIC8qKlxuICAgICAqIERldnVlbHZlIGVsIGRlc2N1ZW50byBxdWUgZGViZSBtb3N0cmFyc2UgZW4gZWwgcmVzdW1lbiBkZSBjb21wcmEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBtb250byBkZSBwcm9tb2Npb25lcyBkZSBvcmRlbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiB0aGlzLnN1bW1hcnlQcm9tb3Rpb25BbW91bnQkID0gdGhpcy5jYXJ0U2VydmljZS5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNpIGVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBgdG90YWxzLm9yZGVyRGlzY291bnRgLCBzZSB1c2EgZXNlIHZhbG9yLlxuICAgICAqIEVuIHN1IGF1c2VuY2lhLCBwcmlvcml6YSBgdG90YWxzLnByb21vdGlvbkJyZWFrZG93bi5vcmRlclByb21vdGlvbnNgIHlcbiAgICAgKiBsdWVnbyBoYWNlIGZhbGxiYWNrIGEgYHRvdGFscy5wcm9tb3Rpb25gIHBhcmEgbWFudGVuZXIgY29tcGF0aWJpbGlkYWQuXG4gICAgICovXG4gICAgZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLmdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24oY2FydCkub3JkZXJEaXNjb3VudCkpO1xuXG4gICAgLyoqIERlc2N1ZW50byBlc3BlY8OtZmljbyBkZWwgY3Vww7NuLCBzaSBlbCBiYWNrZW5kIGxvIGluZm9ybWEgcG9yIHNlcGFyYWRvLiAqL1xuICAgIGdldENvdXBvblByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5nZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uKGNhcnQpLmNvdXBvbkRpc2NvdW50KSk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2kgZXhpc3RlIHVuIGN1cMOzbiBhcGxpY2FkbyBlbiBlbCBjYXJyaXRvIGFjdHVhbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgYm9vbGVhbm8gcGFyYSBjb250cm9sYXIgbGEgdmlzaWJpbGlkYWQgZGUgYFF1aXRhciBjdXDDs25gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBObyBkZWJlIGF0YXJzZSBhIGBnZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KClgLCBwb3JxdWUgdW4gY3Vww7NuIHB1ZWRlIGFmZWN0YXJcbiAgICAgKiBzb2xvIHByb21vY2lvbmVzIHVuaXRhcmlhcyB5IGRlamFyIGVsIGRlc2N1ZW50byBkZSBvcmRlbiBlbiBgMGAuXG4gICAgICovXG4gICAgaGFzQXBwbGllZENvdXBvbiA9ICgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmhhc0FwcGxpZWRDb3Vwb24oY2FydCkpKTtcblxuICAgIHRvRGVjaW1hbCA9ICh0b3RhbCkgPT4gKHRvdGFsIC0gTWF0aC5mbG9vcih0b3RhbCkgPT0gMCkgPyB0b3RhbCAvIDEwMCA6IHRvdGFsXG5cbiAgICBnZXREaXNjb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbXMucGlwZShtYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IHRoaXMuaXRlbXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyLnByb2R1Y3Quc2FsZXByaWNlICogY3Vyci5xdWFudGl0eTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgbGV0IHN1YnRvdGFsID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIucHJvZHVjdC5wcmljZSAqIGN1cnIucXVhbnRpdHk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybiBzdWJ0b3RhbCAtIHRvdGFsO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0aWVuZSBlbCBwcmVjaW8gbm9ybWFsaXphZG8gZGUgdW4gw610ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZSBjYXJyaXRvIG5vcm1hbGl6YWRvLlxuICAgICAqIEByZXR1cm5zIE9iamV0byBgQ2FydEl0ZW1QcmljaW5nYCBsaXN0byBwYXJhIHJlbmRlcml6YXIgcHJlY2lvIGJhc2UsIHRhY2hhZG8geSBmaW5hbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiBjb25zdCBzaG93VG9vbHRpcCA9IHByaWNpbmcuaGFzVW5pdFByb21vdGlvbnM7XG4gICAgICogY29uc3QgZmluYWxQcmljZSA9IHByaWNpbmcuZmluYWxQcmljZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiBpdGVtPy5wcmljaW5nIHx8IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG5cbiAgICAvKiogUmVzdWVsdmUgbGEgcHJlc2VudGFjacOzbiBudWV2YSBkZSB1bmEgbMOtbmVhIHkgY29uc2VydmEgZWwgZmFsbGJhY2sgbGVnYWN5LiAqL1xuICAgIGdldENhcnRJdGVtUHJpY2VQcmVzZW50YXRpb24gPSAoaXRlbTogQ2FydEl0ZW0sIGNoYW5uZWw/OiBDaGFubmVsKTogQ2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbiA9PlxuICAgICAgICB0aGlzLnByaWNlUHJlc2VudGF0aW9uU2VydmljZS5nZXRDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uKFxuICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgIGNoYW5uZWwgfHwgdGhpcy5jaGFubmVsQ29uZmlnLFxuICAgICAgICAgICAgaXRlbT8ubGluZVByaWNpbmcgPyB1bmRlZmluZWQgOiB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pXG4gICAgICAgICk7XG5cbiAgICAvKiogUmVzdWVsdmUgZWwgcmVzdW1lbiB2aXNpYmxlIHVzYW5kbyBsaW5lUHJpY2luZyBzaW4gY29udmVydGlyIGltcG9ydGVzIGZpc2NhbGVzLiAqL1xuICAgIGdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPSAoXG4gICAgICAgIGNhcnQ6IGFueSA9IHRoaXMuY2FydFN1YmplY3QudmFsdWUsXG4gICAgICAgIGNoYW5uZWw/OiBDaGFubmVsLFxuICAgICAgICBpbmNsdWRlU2hpcHBpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZUl0ZW1zID0gQXJyYXkuaXNBcnJheShjYXJ0Py5pdGVtcykgJiYgY2FydC5pdGVtcy5sZW5ndGggPyBjYXJ0Lml0ZW1zIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXRlbXM6IENhcnRJdGVtW10gPSAocmVzcG9uc2VJdGVtcyB8fCAodGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlIHx8IFtdKSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLm5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyhpdGVtKSk7XG4gICAgICAgIGNvbnN0IGhhc0xpbmVQcmljaW5nID0gaXRlbXMubGVuZ3RoID4gMCAmJiBpdGVtcy5ldmVyeShpdGVtID0+ICEhaXRlbT8ubGluZVByaWNpbmcpO1xuICAgICAgICBjb25zdCBzaG93R3Jvc3MgPSAoY2hhbm5lbCB8fCB0aGlzLmNoYW5uZWxDb25maWcpPy5zaG93UHJpY2VXaXRoVGF4ZXNXaGlsZUJyb3dzaW5nID09PSB0cnVlO1xuICAgICAgICBjb25zdCBwcmljaW5nS2V5ID0gc2hvd0dyb3NzID8gJ2dyb3NzJyA6ICduZXQnO1xuICAgICAgICBjb25zdCB0YXhlcyA9IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VGF4ZXNBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFRheGVzID0gdGhpcy5vcmRlclV0aWxzLmdldENhcnRDbGllbnRUYXhlc0Ftb3VudChjYXJ0KTtcbiAgICAgICAgY29uc3QgbGVnYWN5U2hpcHBpbmcgPSBpbmNsdWRlU2hpcHBpbmcgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVNoaXBtZW50QW1vdW50KGNhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2hpcHBpbmdQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdzaGlwcGluZ19wcmljaW5nJywgJ3NoaXBwaW5nUHJpY2luZycpO1xuICAgICAgICBjb25zdCBzaGlwcGluZyA9IGluY2x1ZGVTaGlwcGluZ1xuICAgICAgICAgICAgPyAoc2hpcHBpbmdQcmljaW5nID8gc2hpcHBpbmdQcmljaW5nW3ByaWNpbmdLZXldIDogbGVnYWN5U2hpcHBpbmcpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaW5jbHVkZVNoaXBwaW5nXG4gICAgICAgICAgICA/IE51bWJlcihjYXJ0Py50b3RhbHM/LnRvdGFsIHx8IDApXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VG90YWxBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IG9yZGVyRGlzY291bnRQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdvcmRlcl9kaXNjb3VudF9wcmljaW5nJywgJ29yZGVyRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50UHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnY291cG9uX2Rpc2NvdW50X3ByaWNpbmcnLCAnY291cG9uRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50ID0gY291cG9uRGlzY291bnRQcmljaW5nXG4gICAgICAgICAgICA/IGNvdXBvbkRpc2NvdW50UHJpY2luZ1twcmljaW5nS2V5XVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q291cG9uUHJvbW90aW9uQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBvcmRlckRpc2NvdW50ID0gb3JkZXJEaXNjb3VudFByaWNpbmdcbiAgICAgICAgICAgID8gb3JkZXJEaXNjb3VudFByaWNpbmdbcHJpY2luZ0tleV1cbiAgICAgICAgICAgIDogdGhpcy5vcmRlclV0aWxzLmdldE9yZGVyUHJvbW90aW9uQW1vdW50XG4gICAgICAgICAgICAgICAgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0T3JkZXJQcm9tb3Rpb25BbW91bnQoY2FydClcbiAgICAgICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KGNhcnQpO1xuXG4gICAgICAgIGlmIChoYXNMaW5lUHJpY2luZykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0c0JlZm9yZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnVuaXRbcHJpY2luZ0tleV0gfHwgMCkgKiBOdW1iZXIoaXRlbS5xdWFudGl0eSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgbGluZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLmRpc2NvdW50W3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBzdWJ0b3RhbDogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnN1YnRvdGFsW3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBvcmRlckRpc2NvdW50LFxuICAgICAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgICAgIHRheGVzLFxuICAgICAgICAgICAgICAgIGNsaWVudFRheGVzLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICAgIHRheGVzSW5jbHVkZWRJblRvdGFsOiBzaG93R3Jvc3MgJiYgdGF4ZXMgIT09IDAsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnbGluZVByaWNpbmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb2R1Y3RzQmVmb3JlRGlzY291bnRzOiAwLFxuICAgICAgICAgICAgbGluZURpc2NvdW50czogMCxcbiAgICAgICAgICAgIHN1YnRvdGFsOiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpLFxuICAgICAgICAgICAgb3JkZXJEaXNjb3VudCxcbiAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgdGF4ZXMsXG4gICAgICAgICAgICBjbGllbnRUYXhlcyxcbiAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICB0YXhlc0luY2x1ZGVkSW5Ub3RhbDogZmFsc2UsXG4gICAgICAgICAgICBzb3VyY2U6ICdsZWdhY3knXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKiBOb3JtYWxpemEgc8OzbG8gZWwgYWxpYXMgc2VyaWFsaXphZG8gZGVsIGNvbnRyYXRvIGRlIGzDrW5lYS4gKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBhbnkpOiBDYXJ0SXRlbSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBsaW5lUHJpY2luZzogaXRlbT8ubGluZVByaWNpbmcgfHwgaXRlbT8ubGluZV9wcmljaW5nXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMZWUgZWwgY29udHJhdG8gbnVldm8gc2luIGNvbmZ1bmRpciB1biBvYmpldG8gdsOhbGlkbyBjb24gZmFsbGJhY2sgbGVnYWN5LFxuICAgICAqIGluY2x1c28gY3VhbmRvIHRvZG9zIHN1cyBpbXBvcnRlcyBzb24gY2Vyby5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRvdGFsc1ByaWNpbmcgPSAoXG4gICAgICAgIGNhcnQ6IGFueSxcbiAgICAgICAgc25ha2VDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZyxcbiAgICAgICAgY2FtZWxDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZ1xuICAgICk6IENhcnRUb3RhbFByaWNpbmdWYWx1ZSB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBjYXJ0Py50b3RhbHMgfHwge307XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdG90YWxzW3NuYWtlQ2FzZUtleV0gPz8gdG90YWxzW2NhbWVsQ2FzZUtleV07XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghW3ZhbHVlLm5ldCwgdmFsdWUudGF4LCB2YWx1ZS5ncm9zc10uZXZlcnkoYW1vdW50ID0+IE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYW1vdW50KSkpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV0OiBOdW1iZXIodmFsdWUubmV0KSxcbiAgICAgICAgICAgIHRheDogTnVtYmVyKHZhbHVlLnRheCksXG4gICAgICAgICAgICBncm9zczogTnVtYmVyKHZhbHVlLmdyb3NzKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBhZGRDb3Vwb24gPSBhc3luYyAoY29kZSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jYW5NdXRhdGVDYXJ0KCkpIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnaW52YWxpZC1jb3Vwb24nIH07XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnB1dCh0aGlzLmNvdXBvbkFwaSgpLCB7IGNvdXBvbjogY29kZSB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hcHBseUNhcnRSZXNwb25zZShyZXN1bHQsIGNvbnRleHQsIGZhbHNlKSkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdpbnZhbGlkLWNvdXBvbicgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgbWVzc2FnZTogJ29rJyB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYW5kbGVDYXJ0TXV0YXRpb25FcnJvcihlLCBjb250ZXh0LnRva2VuKSkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdjYXJ0LW5vdC1hY3RpdmUnIH07XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2ludmFsaWQtY291cG9uJyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlQ291cG9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuY291cG9uQXBpKCkpLnBpcGUobWFwKHJlcyA9PiB0aGlzLmFwcGx5Q2FydFJlc3BvbnNlKHJlcywgY29udGV4dCwgZmFsc2UpKSkudG9Qcm9taXNlKCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlQ2FydE11dGF0aW9uRXJyb3IoZXJyb3IsIGNvbnRleHQudG9rZW4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9ybWF0Q291cG9uID0gKGNhcnQpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRfY291cG9uID0gdGhpcy5jb3Vwb25TdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgY291cG9uOiBDb3Vwb25JID0geyBjb2RlOiBjYXJ0LmNvdXBvbkNvZGUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGNhcnQuY2FydERpc2NvdW50cylbMF07XG4gICAgICAgICAgICBjb3Vwb24gPSB7XG4gICAgICAgICAgICAgICAgLi4uY291cG9uLFxuICAgICAgICAgICAgICAgIGFtb3VudDogKGNhcnQuY2FydERpc2NvdW50cyAmJiBjYXJ0LmNhcnREaXNjb3VudHNba2V5XS5hbW91bnQuY3VycmVudCkgfHwgMCxcbiAgICAgICAgICAgICAgICBuYW1lOiAoY2FydC5jYXJ0RGlzY291bnRzICYmIGNhcnQuY2FydERpc2NvdW50c1trZXldLm5hbWUpIHx8ICduby1uYW1lJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIChjb3Vwb24gIT0gY3VycmVudF9jb3Vwb24pICYmIHRoaXMuY291cG9uU3ViamVjdC5uZXh0KGNvdXBvbik7XG4gICAgfVxuXG4gICAgY2hhbmdlSGF2ZVRvVXBkYXRlID0gKHZhbHVlKSA9PiB0aGlzLmhhdmVfdG9fdXBkYXRlID0gdmFsdWU7XG5cbiAgICByZWFkeUZvckNoZWNrb3V0ID0gKHN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLCBlcnJvckNhbGxiYWNrPzogRnVuY3Rpb24pOiBDYXJ0QWZmb3JkYWJsZSA9PiB7XG4gICAgICAgIGxldCBjYXJ0ID0gdGhpcy5jYXJ0U3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0OiBDYXJ0QWZmb3JkYWJsZSA9IHsgb2s6IHRydWUgfTtcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8IHRoaXMuY2hhbm5lbENvbmZpZy5taW5pbXVtUXVhbnRpdHlQdXJjaGFzZUl0ZW1zKSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1pdGVtcycgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FydC50b3RhbHMudG90YWwgPCB0aGlzLmNoYW5uZWxDb25maWcubWluaW11bVB1cmNoYXNlQW1vdW50KSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1hbW91bnQnIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjayB8fCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXN1bHQub2tcbiAgICAgICAgICAgICAgICA/IHN1Y2Nlc3NDYWxsYmFjayAmJiBzdWNjZXNzQ2FsbGJhY2soKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtc09uRXJyb3IgPSAoaXRlbXNXaXRoRXJyb3I6IGFueVtdLCBjb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNXaXRoRXJyb3IpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLml0ZW1zKTtcbiAgICAgICAgbGV0IGl0ZW1zVXBkYXRlZCA9IHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1XaXRoRXJyb3IgPSBpdGVtc1dpdGhFcnJvci5maW5kKGZhaWxlZEl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGZhaWxlZEl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1XaXRoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaXRlbS5lcnJvciA9IGNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNVcGRhdGVkKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXMoaXRlbXNVcGRhdGVkKTtcbiAgICB9XG5cbiAgICBsb2FkQ2FydEJ5VG9rZW4gPSBhc3luYyAodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4gIT09IHRoaXMuY2FydF90b2tlbikge1xuICAgICAgICAgICAgdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbisrO1xuICAgICAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRfdG9rZW4nLCB0b2tlbik7XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2hhbmdlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldENhcnRCeVRva2VuKClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVVElMU1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtYSBsb3Mgw610ZW1zIGNydWRvcyBkZWwgYmFja2VuZCBhbCBjb250cmF0byBpbnRlcm5vIGBDYXJ0SXRlbWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmVyX2l0ZW0gUmVzcHVlc3RhIGBpdGVtc2AgZGVsIGVuZHBvaW50IGRlIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgQXJyZWdsbyBkZSDDrXRlbXMgbm9ybWFsaXphZG9zLCBjYWRhIHVubyBjb24gYHByaWNpbmdgIHByZWNvbXB1dGFkby5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBlcyBlbCBwdW50byBkb25kZSBlbCBjb3JlOlxuICAgICAqIC0gcHJlc2VydmEgYHVuaXRQcm9tb3Rpb25zYFxuICAgICAqIC0gYXJtYSBgcHJpY2luZ2BcbiAgICAgKiAtIG1hbnRpZW5lIGxhIGZvcm1hIGhpc3TDs3JpY2EgZGVsIGl0ZW0gY29uc3VtaWRvIHBvciBsb3MgdGVtcGxhdGVzXG4gICAgICovXG4gICAgdHJhbnNmb3JtSXRlbXMgPSAoc2VydmVyX2l0ZW0pID0+IHNlcnZlcl9pdGVtLm1hcChcbiAgICAgICAgaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6IGl0ZW0ucHJvZHVjdCxcbiAgICAgICAgICAgICAgICB2YXJpYW50X2lkOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uY29kZSxcbiAgICAgICAgICAgICAgICBsb3Q6IGl0ZW0ub3JkZXJJdGVtTG90LFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBpdGVtLmNvbW1lbnRzIHx8ICcnLFxuICAgICAgICAgICAgICAgIGl0ZW1faWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IGl0ZW0udG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiBpdGVtLnVuaXRQcmljZSA/PyBpdGVtLnVuaXRfcHJpY2UsXG4gICAgICAgICAgICAgICAgZGlzY291bnQ6IGl0ZW0uZGlzY291bnQsXG4gICAgICAgICAgICAgICAgc3VidG90YWw6IGl0ZW0uc3VidG90YWwsXG4gICAgICAgICAgICAgICAgdGF4VG90YWw6IGl0ZW0udGF4VG90YWwgPz8gaXRlbS50YXhfdG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByb21vdGlvbnM6IEFycmF5LmlzQXJyYXkoaXRlbS51bml0UHJvbW90aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIDogKEFycmF5LmlzQXJyYXkoaXRlbS51bml0X3Byb21vdGlvbnMpID8gaXRlbS51bml0X3Byb21vdGlvbnMgOiBbXSksXG4gICAgICAgICAgICAgICAgbGluZVByaWNpbmc6IGl0ZW0ubGluZVByaWNpbmcgfHwgaXRlbS5saW5lX3ByaWNpbmcsXG4gICAgICAgICAgICAgICAgbGluZV9wcmljaW5nOiBpdGVtLmxpbmVfcHJpY2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID4gMCA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2UpO1xuICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgaXRlbS5wcm9kdWN0LnByaWNlID0gaXRlbS50b3RhbCAvIGl0ZW0ucXVhbnRpdHkvLyA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2U7XG4gICAgICAgICAgICAvLyB9LCAxMDApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1eWUgbGEgbm9ybWFsaXphY2nDs24gZGUgcHJlY2lvcyBwYXJhIHVuIMOtdGVtIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gbm9ybWFsaXphZG8gZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgRXN0cnVjdHVyYSBgQ2FydEl0ZW1QcmljaW5nYCBjb24gcHJlY2lvIGJhc2UsIHRhY2hhZG8sIGZpbmFsIHkgZmxhZ3MgZGUgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJpY2luZyA9IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICogLy8gcHJpY2luZy5iYXNlUHJpY2UgPT4gdW5pdFByaWNlIGRlbCBiYWNrZW5kIG51ZXZvIG8gZmFsbGJhY2sgbGVnYWN5XG4gICAgICogLy8gcHJpY2luZy5maW5hbFByaWNlID0+IHVuaXRQcmljZSBkZWwgYmFja2VuZCBudWV2byBvIGPDoWxjdWxvIGxlZ2FjeVxuICAgICAqIC8vIHByaWNpbmcuZWZmZWN0aXZlRGlzY291bnRQZXJjZW50ID0+ICUgdG90YWwgY29udHJhIGVsIHByZWNpbyBkZSByZWZlcmVuY2lhXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZENhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiB7XG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtPy5wcm9kdWN0Py52YXJpYW50cz8uWzBdO1xuICAgICAgICBjb25zdCBjYXJ0QW5kU2lkZWJhclByaWNlcyA9IHZhcmlhbnQ/LmNhcnRBbmRTaWRlYmFyUHJpY2VzO1xuICAgICAgICAvLyBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYGNhcnRBbmRTaWRlYmFyUHJpY2VzYCwgZXNlIGVzIGVsIHByZWNpbyBjb3JyZWN0b1xuICAgICAgICAvLyBwYXJhIGNhcnJpdG8vc2lkZWJhciBwb3JxdWUgZXhjbHV5ZSBpbXB1ZXN0b3MgZGUgb3JkZW4gcXVlIG5vIHNlIGxpc3RhbiBwb3Igw610ZW0uXG4gICAgICAgIC8vIFNpIG5vIGV4aXN0ZSwgc2UgbWFudGllbmUgZWwgZmFsbGJhY2sgaGlzdMOzcmljby5cbiAgICAgICAgY29uc3QgZXhwbGljaXRVbml0UHJpY2UgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy51bml0UHJpY2UpO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFVuaXRQcmljZSA9IE51bWJlci5pc0Zpbml0ZShleHBsaWNpdFVuaXRQcmljZSk7XG4gICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IGhhc0V4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA/IGV4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA6IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyBjYXJ0QW5kU2lkZWJhclByaWNlcz8ucHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5wcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICAgICAgPz8gMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RyaWtlUHJpY2VDYW5kaWRhdGUgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShcbiAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5wcmljZVxuICAgICAgICAgICAgPz8gdmFyaWFudD8ucHJpY2VcbiAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICA/PyAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlUHJpY2UgPSBpc05hTihiYXNlUHJpY2UpID8gMCA6IGJhc2VQcmljZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0cmlrZVByaWNlID0gaXNOYU4oc3RyaWtlUHJpY2VDYW5kaWRhdGUpID8gMCA6IHN0cmlrZVByaWNlQ2FuZGlkYXRlO1xuICAgICAgICBjb25zdCB1bml0UHJvbW90aW9uVG90YWwgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKVxuICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zLnJlZHVjZSgodG90YWwsIHByb21vdGlvbikgPT4gdG90YWwgKyBOdW1iZXIocHJvbW90aW9uPy5hbW91bnQgfHwgMCksIDApXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGhhc1N0cmlrZVByaWNlID0gbm9ybWFsaXplZFN0cmlrZVByaWNlID4gbm9ybWFsaXplZEJhc2VQcmljZSAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMDtcbiAgICAgICAgY29uc3QgaGFzVW5pdFByb21vdGlvbnMgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKSAmJiBpdGVtLnVuaXRQcm9tb3Rpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHF1YW50aXR5ID0gTnVtYmVyKGl0ZW0/LnF1YW50aXR5IHx8IDApO1xuICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gaGFzRXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgID8gbm9ybWFsaXplZEJhc2VQcmljZVxuICAgICAgICAgICAgOiBoYXNVbml0UHJvbW90aW9ucyA/IG5vcm1hbGl6ZWRCYXNlUHJpY2UgKyB1bml0UHJvbW90aW9uVG90YWwgOiBub3JtYWxpemVkQmFzZVByaWNlO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlzY291bnQgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy5kaXNjb3VudCk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVByb2R1Y3REaXNjb3VudCA9IE51bWJlcihpdGVtPy5wcm9kdWN0Py5kaXNjb3VudCB8fCAwKTtcbiAgICAgICAgY29uc3QgZGlzY291bnRQZXJjZW50ID0gTnVtYmVyLmlzRmluaXRlKHByb2R1Y3REaXNjb3VudCkgJiYgcHJvZHVjdERpc2NvdW50IDwgMCAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMCAmJiBxdWFudGl0eSA+IDBcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoTWF0aC5hYnMocHJvZHVjdERpc2NvdW50KSAvIChub3JtYWxpemVkQmFzZVByaWNlICogcXVhbnRpdHkpKSAqIDEwMClcbiAgICAgICAgICAgIDogIWlzTmFOKGxlZ2FjeVByb2R1Y3REaXNjb3VudCkgJiYgbGVnYWN5UHJvZHVjdERpc2NvdW50ID4gMFxuICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZChsZWdhY3lQcm9kdWN0RGlzY291bnQpXG4gICAgICAgICAgICAgICAgOiBoYXNTdHJpa2VQcmljZVxuICAgICAgICAgICAgICAgICAgICA/IE1hdGgucm91bmQoKChub3JtYWxpemVkU3RyaWtlUHJpY2UgLSBub3JtYWxpemVkQmFzZVByaWNlKSAvIG5vcm1hbGl6ZWRTdHJpa2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPSBoYXNTdHJpa2VQcmljZSA/IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA6IG5vcm1hbGl6ZWRCYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCA9IGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID4gMCAmJiBmaW5hbFByaWNlID4gMCAmJiBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA+IGZpbmFsUHJpY2VcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlIC0gZmluYWxQcmljZSkgLyBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICA6IGRpc2NvdW50UGVyY2VudDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVByaWNlOiBub3JtYWxpemVkQmFzZVByaWNlLFxuICAgICAgICAgICAgc3RyaWtlUHJpY2U6IGhhc1N0cmlrZVByaWNlID8gbm9ybWFsaXplZFN0cmlrZVByaWNlIDogbnVsbCxcbiAgICAgICAgICAgIGZpbmFsUHJpY2UsXG4gICAgICAgICAgICB1bml0UHJvbW90aW9uVG90YWwsXG4gICAgICAgICAgICBoYXNTdHJpa2VQcmljZSxcbiAgICAgICAgICAgIGhhc1VuaXRQcm9tb3Rpb25zLFxuICAgICAgICAgICAgZGlzY291bnRQZXJjZW50LFxuICAgICAgICAgICAgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXphIHZhbG9yZXMgZGUgcHJlY2lvIHByb3ZlbmllbnRlcyBkZWwgYmFja2VuZCBhIGBudW1iZXJgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIG51bcOpcmljbyBvIHN0cmluZyBjb24gZm9ybWF0byBsb2NhbCAoYDEyMC4wMDBgLCBgMTIwMDAwYCwgYDEyMDAwMC0xYCwgZXRjLikuXG4gICAgICogQHJldHVybnMgTsO6bWVybyBwYXJzZWFkbyBvIGBOYU5gIHNpIGVsIHZhbG9yIG5vIGVzIHV0aWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNlIHVzYSBwYXJhIHNvcG9ydGFyIHJlc3B1ZXN0YXMgY29uIHNlcGFyYWRvcmVzIGRlIG1pbGVzLCBjb21hIGRlY2ltYWwgbyByYW5nb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVByaWNlVmFsdWUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXcgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmF3LmluY2x1ZGVzKCctJykgPyByYXcuc3BsaXQoJy0nKVswXS50cmltKCkgOiByYXc7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaXJzdFZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLig/PVxcZHszfShcXER8JCkpL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuXG4gICAgICAgIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG4gICAgfVxuXG5cbiAgICBnZXRDcmVkaXRBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFsYW5jZUN1c3RvbWVyKSA9PiBiYWxhbmNlQ3VzdG9tZXI/LmNyZWRpdEFtb3VudCA/PyBudWxsKVxuICAgICAgICApO1xuXG4gICAgZ2V0Q2xpZW50VGF4ZXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LmNsaWVudFRheGVzIDogMCkpO1xuXG4gICAgZ2V0UmVtYWluaW5nQ3JlZGl0cyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnBpcGUobWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8ucmVtYWluaW5nQ3JlZGl0cykpO1xuXG4gICAgcHVibGljIHVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGJhbGFuY2U6IGFueSwgdG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghYmFsYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRvdGFsID8/IDA7XG5cbiAgICAgICAgY29uc3QgYmFsYW5jZURhdGEgPSB7XG4gICAgICAgICAgICBhbGxvd0FueVBheW1lbnRNZXRob2Q6IGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlOiBiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSxcbiAgICAgICAgICAgIGNyZWRpdEFtb3VudDogYmFsYW5jZS5jcmVkaXRBbW91bnQsXG4gICAgICAgICAgICBzaG93TWF4OiBiYWxhbmNlLnNob3dNYXgsXG4gICAgICAgICAgICBzaG93UHJpY2U6IGJhbGFuY2Uuc2hvd1ByaWNlLFxuICAgICAgICAgICAgcmVtYWluaW5nQ3JlZGl0czpcbiAgICAgICAgICAgICAgICBiYWxhbmNlLmNyZWRpdEFtb3VudCAhPSBudWxsICYmIHRvdGFsQW1vdW50ICE9IG51bGwgJiYgYmFsYW5jZS5jcmVkaXRBbW91bnQgPj0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgPyBiYWxhbmNlLmNyZWRpdEFtb3VudCAtIHRvdGFsQW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGFwcGx5TWF4T3JkZXJzOiBiYWxhbmNlLmFwcGx5TWF4T3JkZXJzLFxuICAgICAgICAgICAgbWF4T3JkZXJzOiBiYWxhbmNlLm1heE9yZGVyc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5uZXh0KGJhbGFuY2VEYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==