@pmcretail/mapper-library 0.0.43 → 0.0.45

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 (39) hide show
  1. package/bundles/pmcretail-mapper-library.umd.js +4165 -0
  2. package/bundles/pmcretail-mapper-library.umd.js.map +1 -0
  3. package/esm2015/lib/RJ-mapper.class.js +877 -0
  4. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -0
  5. package/esm2015/lib/WebReturn-mapper.class.js +326 -0
  6. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -0
  7. package/esm2015/lib/basket.service.js +527 -0
  8. package/esm2015/lib/mapper-library.component.js +26 -0
  9. package/esm2015/lib/mapper-library.module.js +21 -0
  10. package/esm2015/lib/number-util.service.js +42 -0
  11. package/{fesm2022/pmcretail-mapper-library.mjs → fesm2015/pmcretail-mapper-library.js} +173 -154
  12. package/fesm2015/pmcretail-mapper-library.js.map +1 -0
  13. package/lib/RJ-mapper.class.d.ts +1 -0
  14. package/lib/RJ-mapper.class.d.ts.map +1 -1
  15. package/lib/TransactionDocumentBuilder.d.ts +1 -0
  16. package/lib/TransactionDocumentBuilder.d.ts.map +1 -1
  17. package/lib/WebReturn-mapper.class.d.ts +1 -0
  18. package/lib/WebReturn-mapper.class.d.ts.map +1 -1
  19. package/lib/WebReturnSalesforceMapper.class.d.ts +1 -0
  20. package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -1
  21. package/lib/basket.service.d.ts +1 -0
  22. package/lib/basket.service.d.ts.map +1 -1
  23. package/lib/mapper-library.component.d.ts +1 -1
  24. package/lib/number-util.service.d.ts +1 -0
  25. package/lib/number-util.service.d.ts.map +1 -1
  26. package/package.json +9 -16
  27. package/esm2022/lib/RJ-mapper.class.mjs +0 -875
  28. package/esm2022/lib/TransactionDocumentBuilder.mjs +0 -1240
  29. package/esm2022/lib/WebReturn-mapper.class.mjs +0 -324
  30. package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +0 -410
  31. package/esm2022/lib/basket.service.mjs +0 -516
  32. package/esm2022/lib/mapper-library.component.mjs +0 -22
  33. package/esm2022/lib/mapper-library.module.mjs +0 -21
  34. package/esm2022/lib/number-util.service.mjs +0 -40
  35. package/fesm2022/pmcretail-mapper-library.mjs.map +0 -1
  36. /package/{esm2022/lib/mapper-library.model.mjs → esm2015/lib/mapper-library.model.js} +0 -0
  37. /package/{esm2022/pmcretail-mapper-library.mjs → esm2015/pmcretail-mapper-library.js} +0 -0
  38. /package/{esm2022/public-api.mjs → esm2015/public-api.js} +0 -0
  39. /package/{index.d.ts → pmcretail-mapper-library.d.ts} +0 -0
@@ -0,0 +1,527 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { DELIVERY_METHODS } from './mapper-library.model';
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class BasketService {
5
+ constructor(numberUtilService) {
6
+ this.numberUtilService = numberUtilService;
7
+ this.currentBasket = {
8
+ products: [],
9
+ transactionDiscount: [],
10
+ quantity: 0,
11
+ total: 0,
12
+ saleTotal: 0,
13
+ baseCurrency: ''
14
+ };
15
+ this.basketSource = new BehaviorSubject(null);
16
+ this.basket = this.basketSource.asObservable();
17
+ this.productSource = new BehaviorSubject(null);
18
+ this.product = this.productSource.asObservable();
19
+ this.peerSource = new BehaviorSubject(false);
20
+ this.peerSync = this.peerSource.asObservable();
21
+ this.scanSource = new BehaviorSubject(false);
22
+ this.scanner = this.scanSource.asObservable();
23
+ this.className = "BasketService";
24
+ }
25
+ get isMixedBasketSales() {
26
+ return this._isMixedBasketSales;
27
+ }
28
+ set isMixedBasketSales(v) {
29
+ this._isMixedBasketSales = v;
30
+ }
31
+ updateBasket(basket) {
32
+ this.currentBasket = basket;
33
+ this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
34
+ this.basketSource.next(basket);
35
+ }
36
+ /**
37
+ * calculates the total basket value and quantity
38
+ * @param null
39
+ * @returns void
40
+ */
41
+ updateBasketTotal(basketDetails, basketState) {
42
+ basketDetails.quantity = 0;
43
+ basketDetails.total = 0;
44
+ for (const p of basketDetails.products) {
45
+ basketDetails.quantity = basketDetails.quantity + p.quantity;
46
+ basketDetails.total =
47
+ this.numberUtilService.trimTo2Decimal(basketDetails.total) +
48
+ this.numberUtilService.trimTo2Decimal(p.total);
49
+ }
50
+ AppLoggerService.logDebug(this.className, "updateBasketTotal", `basketDetails updated values for transaction id
51
+ ${basketDetails.transactionId}, basketDetails
52
+ ${JSON.stringify(basketDetails)}`);
53
+ basketDetails.basketTotal = basketDetails.total;
54
+ basketState.updateBasket(basketDetails);
55
+ }
56
+ /**
57
+ * add Line promotion
58
+ * @param null
59
+ * @returns basketDetails
60
+ */
61
+ addlinePromotion(promotionList, basketDetails) {
62
+ AppLoggerService.logDebug(this.className, "addlinePromotion", `promotionList ${JSON.stringify(promotionList)} and
63
+ basketDetails
64
+ ${JSON.stringify(basketDetails)} for linePromotions`);
65
+ if (promotionList &&
66
+ promotionList.result &&
67
+ promotionList.result.linePromotions &&
68
+ promotionList.result.linePromotions.length > 0) {
69
+ for (var element of basketDetails.products) {
70
+ for (var promotionelement of promotionList.result.linePromotions) {
71
+ if (element.itemLineId.toString() ===
72
+ promotionelement.itemLineId.toString()) {
73
+ element.linePromotions = promotionelement;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return basketDetails;
79
+ }
80
+ /**
81
+ * add Transaction promotion
82
+ * @param null
83
+ * @returns basketDetails
84
+ */
85
+ addTransactionPromotion(promotionList, basketdetails) {
86
+ AppLoggerService.logDebug(this.className, "addTransactionPromotion", `promotionList ${JSON.stringify(promotionList)} and
87
+ basketDetails
88
+ ${JSON.stringify(basketdetails)} for transactionPromotions ${JSON.stringify(basketdetails.transactionPromotion)}`);
89
+ if (promotionList &&
90
+ promotionList.result &&
91
+ promotionList.result.transactionPromotion &&
92
+ promotionList.result.transactionPromotion.length > 0) {
93
+ promotionList.result.transactionPromotion.forEach((tPromotion) => {
94
+ let transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
95
+ transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((product) => {
96
+ return product.itemLineId;
97
+ });
98
+ if (!basketdetails.transactionPromotion) {
99
+ basketdetails.transactionPromotion = [];
100
+ }
101
+ basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
102
+ basketdetails = this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
103
+ });
104
+ }
105
+ AppLoggerService.logDebug(this.className, "addTransactionPromotion", "basket details in refund calculation file", basketdetails);
106
+ return basketdetails;
107
+ }
108
+ updateProductTotalForSummary(basketDetails) {
109
+ /*sale- product refundedQuantity = undefined
110
+ partial refund - product refundedQuantity is > 0
111
+ total refund - proudct refundedQuantity is > 0
112
+ exchange - exchange product refundedQuantity is > 0
113
+ new product refundedQuantity = undefined
114
+ old product without exchange refundedQuantity = 0
115
+ unreference refund-product refundedQuantity is > 0 */
116
+ basketDetails.total = 0;
117
+ basketDetails.quantity = 0;
118
+ for (var product of basketDetails.products) {
119
+ if (product.linePromotions) {
120
+ product.total = product.linePromotions.promotionLinePrice;
121
+ }
122
+ else if (product.lineDiscount && !product.linePromotions) {
123
+ product.total = product.lineDiscount.discountedLinePrice;
124
+ }
125
+ else {
126
+ product.total = product.totalLinePrice;
127
+ }
128
+ product.total =
129
+ product.total -
130
+ Math.abs(product.refundedTotal ? product.refundedTotal : 0);
131
+ basketDetails.total += product.total;
132
+ basketDetails.quantity =
133
+ basketDetails.quantity +
134
+ (product.quantity -
135
+ (product.refundedQuantity ? product.refundedQuantity : 0));
136
+ AppLoggerService.logDebug(this.className, "updateProductTotalForSummary", "update basketdetails total :" +
137
+ basketDetails.total +
138
+ " Product line ID : " +
139
+ product.itemLineId +
140
+ " product total : " +
141
+ product.total, "quantity : " + basketDetails.quantity);
142
+ }
143
+ return this.updateBasketTotalForSummary(basketDetails);
144
+ }
145
+ updateBasketTotalForSummary(basketDetails) {
146
+ basketDetails.basketTotal = basketDetails.total;
147
+ AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionDiscount ", basketDetails.transactionDiscount);
148
+ AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total for transaction transactionPromotion ", basketDetails.transactionPromotion);
149
+ basketDetails = this.updateTransactionPromotion(basketDetails);
150
+ basketDetails = this.updateTransactionDiscount(basketDetails);
151
+ basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
152
+ AppLoggerService.logInfo(this.className, "updateBasketTotalForSummary", "update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
153
+ return basketDetails;
154
+ }
155
+ updateTransactionDiscount(basketDetails) {
156
+ if (basketDetails.transactionDiscount &&
157
+ basketDetails.transactionDiscount.length > 0) {
158
+ const discountTotal = basketDetails.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
159
+ AppLoggerService.logDebug(this.className, "updateTransactionDiscount", "discountTotal ", discountTotal);
160
+ basketDetails.basketTotal =
161
+ basketDetails.basketTotal - Math.abs(discountTotal);
162
+ }
163
+ return basketDetails;
164
+ }
165
+ updateTransactionPromotion(basketDetails) {
166
+ if (basketDetails.transactionPromotion &&
167
+ basketDetails.transactionPromotion.length > 0) {
168
+ const discountTotal = basketDetails.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
169
+ basketDetails.basketTotal =
170
+ basketDetails.basketTotal - Math.abs(discountTotal);
171
+ }
172
+ return basketDetails;
173
+ }
174
+ updateBasketTotalWithoutDiscount(basket) {
175
+ basket.total = 0;
176
+ basket.quantity = 0;
177
+ for (var product of basket.products) {
178
+ if (product.linePromotions) {
179
+ product.total = product.linePromotions.promotionLinePrice;
180
+ }
181
+ else if (product.lineDiscount && !product.linePromotions) {
182
+ product.total = product.lineDiscount.discountedLinePrice || 0;
183
+ }
184
+ else {
185
+ product.total = product.totalLinePrice;
186
+ }
187
+ product.total =
188
+ product.total -
189
+ Math.abs(product.refundedTotal ? product.refundedTotal : 0);
190
+ basket.total += product.total;
191
+ basket.quantity =
192
+ basket.quantity +
193
+ (product.quantity -
194
+ (product.refundedQuantity ? product.refundedQuantity : 0));
195
+ AppLoggerService.logDebug(this.className, "updateBasketTotalWithoutDiscount", "e-basket:basket service:update basketdetails total :" +
196
+ JSON.stringify(basket) +
197
+ basket.total +
198
+ " Product line ID : " +
199
+ product.itemLineId +
200
+ " product total : " +
201
+ product.total);
202
+ }
203
+ basket.basketTotal = basket.total;
204
+ return basket;
205
+ }
206
+ updateBasketTotalWithDiscounts(basket) {
207
+ AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", `this.basketDetails new values ${basket},
208
+ ${JSON.stringify(basket.basketTotal)}`);
209
+ if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
210
+ const discountTotal = basket.transactionPromotion.reduce((n, { promotionAmount }) => n + promotionAmount, 0);
211
+ basket.basketTotal = basket.basketTotal - discountTotal;
212
+ }
213
+ if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
214
+ const discountTotal = basket.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
215
+ basket.basketTotal = basket.basketTotal - discountTotal;
216
+ }
217
+ AppLoggerService.logDebug(this.className, "updateBasketTotalWithDiscounts", "basket new values", basket);
218
+ return basket;
219
+ }
220
+ transactionDiscountAndPromotionProductortionCalculation(basket) {
221
+ if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
222
+ basket.transactionDiscount.forEach((discount) => (basket = this.transactionDiscountProductPortionCalc(basket, discount)));
223
+ }
224
+ if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
225
+ basket.transactionPromotion.forEach((promotion) => {
226
+ basket = this.transactionPromotionProductPortionCalc(basket, promotion);
227
+ });
228
+ }
229
+ AppLoggerService.logDebug(this.className, "transactionDiscountAndPromotionProductortionCalculation", `basket item discount protion calculation ,
230
+ ${basket},
231
+ ${basket.products}`);
232
+ return basket;
233
+ }
234
+ transactionPromotionProductPortionCalc(basket, promotion) {
235
+ let total = 0;
236
+ let percentage = 0;
237
+ {
238
+ basket.products.forEach((p) => {
239
+ if (promotion.itemLineIds.includes(p.itemLineId)) {
240
+ p = this.validateProductItemDiscount(p);
241
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
242
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
243
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
244
+ total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
245
+ }
246
+ });
247
+ AppLoggerService.logDebug(this.className, "transactionPromotionProductPortionCalc", `ebasket: trnsactionPromotion: ${JSON.stringify(promotion)}, selected products total: ${total}`);
248
+ basket.products.forEach((product) => {
249
+ product = this.validateProductItemDiscount(product);
250
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
251
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
252
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
253
+ if (promotion.itemLineIds.includes(product.itemLineId)) {
254
+ percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
255
+ product.itemDiscounts.trnPromotionsPortion +=
256
+ (promotion.promotionAmount * percentage) / 100;
257
+ product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
258
+ }
259
+ });
260
+ }
261
+ return basket;
262
+ }
263
+ transactionDiscountProductPortionCalc(basket, discount) {
264
+ let total = 0;
265
+ let percentage = 0;
266
+ basket.products.forEach((p) => {
267
+ if (discount.itemLineIds.includes(p.itemLineId)) {
268
+ p = this.validateProductItemDiscount(p);
269
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
270
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
271
+ this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
272
+ total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
273
+ }
274
+ });
275
+ AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", `ebasket: trnsactionDiscount: ${JSON.stringify(discount)}, selected products total: ${total}`);
276
+ basket.products.forEach((product) => {
277
+ product = this.validateProductItemDiscount(product);
278
+ AppLoggerService.logDebug(this.className, "transactionDiscountProductPortionCalc", "discountable in basket service", product.discountable);
279
+ const productContributionInTotal = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
280
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
281
+ this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
282
+ if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
283
+ percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
284
+ product.itemDiscounts.trnDiscountsPortion +=
285
+ (discount.discountAmount * percentage) / 100;
286
+ product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
287
+ }
288
+ });
289
+ return basket;
290
+ }
291
+ validateProductItemDiscount(product) {
292
+ if (!product.itemDiscounts) {
293
+ product.itemDiscounts = {
294
+ trnDiscountsPortion: 0,
295
+ trnPromotionsPortion: 0,
296
+ refundPortion: 0,
297
+ };
298
+ }
299
+ return product;
300
+ }
301
+ markProduct(product) {
302
+ this.productSource.next(product);
303
+ }
304
+ stopPeerSyncProcess(peerSync) {
305
+ this.peerSource.next(peerSync);
306
+ }
307
+ scanStart(isScanning) {
308
+ this.scanSource.next(isScanning);
309
+ }
310
+ promotionRemainingCalculation(promotion) {
311
+ var promotionValue = 0;
312
+ promotion.forEach((element) => {
313
+ promotionValue += element.promotionAmount;
314
+ });
315
+ return promotionValue;
316
+ }
317
+ discountRemainingCalculation(discount) {
318
+ var discountValue = 0;
319
+ discount.forEach((element) => {
320
+ discountValue += element.discountAmount;
321
+ });
322
+ return discountValue;
323
+ }
324
+ discountRefundedCalculation(discount) {
325
+ var discountValue = 0;
326
+ discount.forEach((element) => {
327
+ if (element.discountAmount < 0) {
328
+ discountValue += element.discountAmount;
329
+ }
330
+ });
331
+ return discountValue;
332
+ }
333
+ generateNewItemLineId(products) {
334
+ let largestNumber = 0;
335
+ if (products.length > 0) {
336
+ let itemLineIdArray = products.map((product) => {
337
+ return product.itemLineId;
338
+ });
339
+ largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
340
+ }
341
+ return largestNumber + 1;
342
+ }
343
+ updateBasketProductDataAsPerQuantity(product, quantity) {
344
+ AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
345
+ product.quantity = quantity;
346
+ if (product.hasOwnProperty("lineDiscount")) {
347
+ // && this.product.quantity !== this.productDetailForm.controls.quantity.value
348
+ product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
349
+ product.lineDiscount.discountAmount =
350
+ product.totalLinePrice - product.lineDiscount.discountedLinePrice;
351
+ }
352
+ else {
353
+ product.totalLinePrice =
354
+ quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
355
+ }
356
+ if (product.lineDiscount) {
357
+ product.total = product.lineDiscount.discountedLinePrice;
358
+ }
359
+ else {
360
+ product.total = product.totalLinePrice;
361
+ }
362
+ AppLoggerService.logDebug(this.className, "updateBasketProductDataAsPerQuantity", `ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);
363
+ return product;
364
+ }
365
+ filterProductListWithWebOrder(isWebOrder) {
366
+ AppLoggerService.logDebug(this.className, "filterProductListWithWebOrder", "filterProductListWithWebOrder hit", this.currentBasket.products);
367
+ if (isWebOrder)
368
+ return this.currentBasket.products.filter((x) => x.isWebOrder);
369
+ else {
370
+ return this.currentBasket.products.filter((x) => !x.isWebOrder);
371
+ }
372
+ }
373
+ filterProductListWithDelivery() {
374
+ AppLoggerService.logDebug(this.className, "filterProductListWithDelivery", "filterProductListWithDelivery hit", this.currentBasket.products);
375
+ return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());
376
+ }
377
+ filterProductListWithDeliveryGroup(group, products) {
378
+ AppLoggerService.logDebug(this.className, "filterProductListWithDeliveryGroup", "filterProductListWithDeliveryGroup hit", products);
379
+ return products.filter((x) => x.deliveryGroup === group);
380
+ }
381
+ generateNewDeliveryGroupNumber(products) {
382
+ let largestNumber = 0;
383
+ if (products.length > 0) {
384
+ let deliveryGroupArr = products.map((product) => {
385
+ if (product.deliveryGroup) {
386
+ return parseInt(product.deliveryGroup);
387
+ }
388
+ return 0;
389
+ });
390
+ largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));
391
+ }
392
+ return (largestNumber + 1).toString();
393
+ }
394
+ getDeliveryGroupNumbers(products) {
395
+ AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers initiating : ", products);
396
+ let uniqueAndsortedResult = [];
397
+ if (products.length > 0) {
398
+ let deliveryGroupArr = products.map((product) => {
399
+ if (product.deliveryGroup) {
400
+ return parseInt(product.deliveryGroup);
401
+ }
402
+ else if (product.deliveryMethod === "1") {
403
+ return 1;
404
+ }
405
+ return 0;
406
+ });
407
+ uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);
408
+ AppLoggerService.logDebug(this.className, "getDeliveryGroupNumbers", "getDeliveryGroupNumbers : uniqueAndsortedResult", uniqueAndsortedResult);
409
+ }
410
+ return uniqueAndsortedResult;
411
+ }
412
+ updateProductsWithNewDeliveryGroupNumber(products) {
413
+ AppLoggerService.logDebug(this.className, "updateProductsWithNewDeliveryGroupNumber", "initiating : ", products);
414
+ let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
415
+ if (products.length > 0) {
416
+ this.currentBasket.products.forEach(cBProducts => {
417
+ products.forEach(element => {
418
+ if (cBProducts.itemLineId === element.itemLineId) {
419
+ cBProducts.deliveryGroup = newGroupNumber;
420
+ }
421
+ });
422
+ });
423
+ }
424
+ this.updateBasket(this.currentBasket);
425
+ return;
426
+ }
427
+ calculateEstimatedTime(products) {
428
+ try {
429
+ let time;
430
+ let estmatedTime = 0;
431
+ let estimatedDays = "Hours";
432
+ products.forEach((element) => {
433
+ if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
434
+ time = Number(element.leadTime.value) * 24 * 7;
435
+ estmatedTime = Math.max(estmatedTime, time);
436
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
437
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `week ${estmatedTime} ${estimatedDays}`);
438
+ }
439
+ else if (element.leadTime.type.toLocaleLowerCase() === "days") {
440
+ time = Number(element.leadTime.value) * 24;
441
+ estmatedTime = Math.max(estmatedTime, time);
442
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
443
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `days ${estmatedTime} ${estimatedDays}`);
444
+ }
445
+ else if (element.leadTime.type.toLocaleLowerCase() === "months") {
446
+ time = Number(element.leadTime.value) * 24 * 30;
447
+ estmatedTime = Math.max(estmatedTime, time);
448
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
449
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `months ${estmatedTime} ${estimatedDays}`);
450
+ }
451
+ else if (element.leadTime.type.toLocaleLowerCase() === "years") {
452
+ time = Number(element.leadTime.value) * 24 * 365;
453
+ estmatedTime = Math.max(estmatedTime, time);
454
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
455
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `years ${estmatedTime} ${estimatedDays}`);
456
+ }
457
+ else {
458
+ time = Number(element.leadTime.value);
459
+ estmatedTime = Math.max(estmatedTime, time);
460
+ estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;
461
+ AppLoggerService.logDebug(this.className, "calculateEstimatedTime", `hours ${estmatedTime} ${estimatedDays}`);
462
+ }
463
+ });
464
+ if (estimatedDays.toLocaleLowerCase() === "days") {
465
+ estmatedTime = estmatedTime / 24;
466
+ }
467
+ else if (estimatedDays.toLocaleLowerCase() === "weeks") {
468
+ estmatedTime = estmatedTime / (24 * 7);
469
+ }
470
+ else if (estimatedDays.toLocaleLowerCase() === "months") {
471
+ estmatedTime = estmatedTime / (24 * 30);
472
+ }
473
+ else if (estimatedDays.toLocaleLowerCase() === "years") {
474
+ estmatedTime = estmatedTime / (24 * 365);
475
+ }
476
+ let estimate = {
477
+ value: estmatedTime.toString(),
478
+ type: estimatedDays
479
+ };
480
+ return estimate;
481
+ }
482
+ catch (error) {
483
+ AppLoggerService.logError(this.className, "calculateEstimatedTime", "error in calculateEstimatedTime", error);
484
+ }
485
+ return 0;
486
+ }
487
+ updateProductsWithDeliveryGroupNumber(oldGroup, newGroup) {
488
+ AppLoggerService.logDebug(this.className, "updateProductsWithDeliveryGroupNumber initiating");
489
+ this.currentBasket.products.forEach(cBProducts => {
490
+ if (cBProducts.deliveryGroup === oldGroup) {
491
+ cBProducts.deliveryGroup = newGroup;
492
+ }
493
+ });
494
+ this.updateBasket(this.currentBasket);
495
+ return;
496
+ }
497
+ getDeliveryInfo() {
498
+ AppLoggerService.logDebug(this.className, "getDeliveryInfo", "getDeliveryGroupInfor initiating");
499
+ try {
500
+ let groupInfo = {
501
+ groups: []
502
+ };
503
+ this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {
504
+ let group = {
505
+ groupNumber: groupNumber,
506
+ items: [],
507
+ estimate: {
508
+ type: "Hours",
509
+ value: "0"
510
+ }
511
+ };
512
+ this.currentBasket.products.forEach(cBProducts => {
513
+ if (cBProducts.deliveryGroup === groupNumber.toString()) {
514
+ group.items.push(cBProducts);
515
+ }
516
+ });
517
+ group.estimate = this.calculateEstimatedTime(group.items);
518
+ groupInfo.groups.push(group);
519
+ });
520
+ return groupInfo;
521
+ }
522
+ catch (error) {
523
+ AppLoggerService.logError(this.className, "getDeliveryInfo", "error while getting delivery info", error);
524
+ }
525
+ }
526
+ }
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFdEYsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFTekMsY0FBUyxHQUFHLGVBQWUsQ0FBQztJQUVnQyxDQUFDO0lBUjdELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFXLGtCQUFrQixDQUFDLENBQU07UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBS0QsWUFBWSxDQUFDLE1BQWM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsYUFBd0csRUFBRSxXQUFtRDtRQUM3SyxhQUFhLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUMzQixhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDdEMsYUFBYSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDN0QsYUFBYSxDQUFDLEtBQUs7Z0JBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztvQkFDMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsRUFDM0Q7UUFDRSxhQUFhLENBQUMsYUFBYTtRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQ2xDLENBQUM7UUFDRixhQUFhLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDaEQsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLGFBQStELEVBQUUsYUFBaUM7UUFDakgsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQzFELGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQzs7UUFFNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQ3JELENBQUM7UUFDRixJQUNFLGFBQWE7WUFDYixhQUFhLENBQUMsTUFBTTtZQUNwQixhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWM7WUFDbkMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDOUM7WUFDQSxLQUFLLElBQUksT0FBTyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUU7Z0JBQzFDLEtBQUssSUFBSSxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTtvQkFDaEUsSUFDRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTt3QkFDN0IsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUN0Qzt3QkFDQSxPQUFPLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFDO3FCQUMzQztpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUVILHVCQUF1QixDQUFDLGFBQXlELEVBQUUsYUFBcUI7UUFDdEcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseUJBQXlCLEVBQ2pFLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQzs7UUFFNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FDbEgsQ0FBQztRQUNGLElBQ0UsYUFBYTtZQUNiLGFBQWEsQ0FBQyxNQUFNO1lBQ3BCLGFBQWEsQ0FBQyxNQUFNLENBQUMsb0JBQW9CO1lBQ3pDLGFBQWEsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDcEQ7WUFDQSxhQUFhLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFO2dCQUNwRSxJQUFJLGdDQUFnQyxHQUFRLE1BQU0sQ0FBQyxNQUFNLENBQ3ZELEVBQUUsRUFDRixVQUFVLENBQ1gsQ0FBQztnQkFFRixnQ0FBZ0MsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQ3ZFLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ1YsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUM1QixDQUFDLENBQ0YsQ0FBQztnQkFFRixJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO29CQUN2QyxhQUFhLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO2lCQUN6QztnQkFDRCxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUNyQyxnQ0FBZ0MsQ0FDakMsQ0FBQztnQkFFRixhQUFhLEdBQUcsSUFBSSxDQUFDLHNDQUFzQyxDQUN6RCxhQUFhLEVBQ2IsZ0NBQWdDLENBQ2pDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseUJBQXlCLEVBQ2pFLDJDQUEyQyxFQUMzQyxhQUFhLENBQ2QsQ0FBQztRQUNGLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxhQUFvRjtRQUMvRzs7Ozs7OzZEQU1xRDtRQUVyRCxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN4QixhQUFhLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUMzQixLQUFLLElBQUksT0FBTyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDMUMsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUMxQixPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUM7YUFDM0Q7aUJBQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDMUQsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO2FBQzFEO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQzthQUN4QztZQUNELE9BQU8sQ0FBQyxLQUFLO2dCQUNYLE9BQU8sQ0FBQyxLQUFLO29CQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFOUQsYUFBYSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3JDLGFBQWEsQ0FBQyxRQUFRO2dCQUNwQixhQUFhLENBQUMsUUFBUTtvQkFDdEIsQ0FBQyxPQUFPLENBQUMsUUFBUTt3QkFDZixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDhCQUE4QixFQUN0RSw4QkFBOEI7Z0JBQzlCLGFBQWEsQ0FBQyxLQUFLO2dCQUNuQixxQkFBcUI7Z0JBQ3JCLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQixtQkFBbUI7Z0JBQ25CLE9BQU8sQ0FBQyxLQUFLLEVBQ2IsY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQ3hDLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxhQUFrQjtRQUM1QyxhQUFhLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDaEQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkJBQTZCLEVBQ3BFLDJEQUEyRCxFQUMzRCxhQUFhLENBQUMsbUJBQW1CLENBQ2xDLENBQUM7UUFFRixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSw2QkFBNkIsRUFDcEUsNERBQTRELEVBQzVELGFBQWEsQ0FBQyxvQkFBb0IsQ0FDbkMsQ0FBQztRQUVGLGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0QsYUFBYSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxhQUFhLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDZCQUE2QixFQUNwRSwyRUFBMkUsRUFDM0UsYUFBYSxDQUFDLFdBQVcsQ0FDMUIsQ0FBQztRQUNGLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxhQUFtRTtRQUMzRixJQUNFLGFBQWEsQ0FBQyxtQkFBbUI7WUFDakMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzVDO1lBQ0EsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FDNUQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxjQUFjLEVBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFDdkQsQ0FBQyxDQUNGLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQkFBMkIsRUFBRyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN6RyxhQUFhLENBQUMsV0FBVztnQkFDdkIsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELDBCQUEwQixDQUFDLGFBQW9FO1FBQzdGLElBQ0UsYUFBYSxDQUFDLG9CQUFvQjtZQUNsQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDN0M7WUFDQSxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUM3RCxDQUFDLENBQU0sRUFBRSxFQUFFLGVBQWUsRUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxFQUN6RCxDQUFDLENBQ0YsQ0FBQztZQUNGLGFBQWEsQ0FBQyxXQUFXO2dCQUN2QixhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0NBQWdDLENBQUMsTUFBYztRQUM3QyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVwQixLQUFLLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDbkMsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUMxQixPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUM7YUFDM0Q7aUJBQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDMUQsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQzthQUMvRDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7YUFDeEM7WUFFRCxPQUFPLENBQUMsS0FBSztnQkFDWCxPQUFPLENBQUMsS0FBSztvQkFDYixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztZQUM5QixNQUFNLENBQUMsUUFBUTtnQkFDYixNQUFNLENBQUMsUUFBUTtvQkFDZixDQUFDLE9BQU8sQ0FBQyxRQUFRO3dCQUNmLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFL0QsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0NBQWtDLEVBQzFFLHNEQUFzRDtnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxLQUFLO2dCQUNaLHFCQUFxQjtnQkFDckIsT0FBTyxDQUFDLFVBQVU7Z0JBQ2xCLG1CQUFtQjtnQkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FDZCxDQUFDO1NBQ0g7UUFFRCxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELDhCQUE4QixDQUFDLE1BQVc7UUFDeEMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLEVBQ3hFLGtDQUFrQyxNQUFNO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQ3ZDLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUN0RCxDQUFDLENBQU0sRUFBRSxFQUFFLGVBQWUsRUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxFQUN6RCxDQUFDLENBQ0YsQ0FBQztZQUNGLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7U0FDekQ7UUFDRCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUNyRCxDQUFDLENBQU0sRUFBRSxFQUFFLGNBQWMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsY0FBYyxFQUN2RCxDQUFDLENBQ0YsQ0FBQztZQUVGLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7U0FDekQ7UUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQ0FBZ0MsRUFDeEUsbUJBQW1CLEVBQ25CLE1BQU0sQ0FDUCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHVEQUF1RCxDQUFDLE1BQWM7UUFDcEUsSUFBSSxNQUFNLENBQUMsbUJBQW1CLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FDaEMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUNiLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxxQ0FBcUMsQ0FDbEQsTUFBTSxFQUNOLFFBQVEsQ0FDVCxDQUFDLENBQ0gsQ0FBQztTQUNIO1FBRUQsSUFBSSxNQUFNLENBQUMsb0JBQW9CLElBQUksTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekUsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNoRCxNQUFNLEdBQUcsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseURBQXlELEVBQ2pHO1FBQ0UsTUFBTTtRQUNOLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FDcEIsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxzQ0FBc0MsQ0FDcEMsTUFBVyxFQUNYLFNBQWM7UUFFZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkI7WUFDRSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO2dCQUNoQyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDaEQsQ0FBQyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEMsTUFBTSwwQkFBMEIsR0FDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDO3dCQUMzRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUM7d0JBQzVFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDeEUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztpQkFDekY7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdDQUF3QyxFQUNoRixpQ0FBaUMsSUFBSSxDQUFDLFNBQVMsQ0FDN0MsU0FBUyxDQUNWLDhCQUE4QixLQUFLLEVBQUUsQ0FDdkMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQ3ZDLE9BQU8sR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXBELE1BQU0sMEJBQTBCLEdBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDakYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDO29CQUNsRixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRTlFLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO29CQUN0RCxVQUFVLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNsSCxPQUFPLENBQUMsYUFBYSxDQUFDLG9CQUFvQjt3QkFDeEMsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztvQkFDakQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztpQkFDakk7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHFDQUFxQyxDQUNuQyxNQUFXLEVBQ1gsUUFBYTtRQUViLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ2pDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLDBCQUEwQixHQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUM7b0JBQzNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDNUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUd4RSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO2FBQ3pGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx1Q0FBdUMsRUFDL0UsZ0NBQWdDLElBQUksQ0FBQyxTQUFTLENBQzVDLFFBQVEsQ0FDVCw4QkFBOEIsS0FBSyxFQUFFLENBQ3ZDLENBQUM7UUFFRixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFO1lBQ3RDLE9BQU8sR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsdUNBQXVDLEVBQUUsZ0NBQWdDLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTNJLE1BQU0sMEJBQTBCLEdBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDakYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDO2dCQUNsRixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFOUUsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7Z0JBQ3JGLFVBQVUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ2xILE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CO29CQUN2QyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUMvQyxPQUFPLENBQUMsYUFBYSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2FBQzlIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sMkJBQTJCLENBQUMsT0FBZ0I7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDMUIsT0FBTyxDQUFDLGFBQWEsR0FBRztnQkFDdEIsbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsb0JBQW9CLEVBQUUsQ0FBQztnQkFDdkIsYUFBYSxFQUFFLENBQUM7YUFDakIsQ0FBQztTQUNIO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFnQjtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsUUFBaUI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFNBQVMsQ0FBQyxVQUFtQjtRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNkJBQTZCLENBQUMsU0FBaUM7UUFDN0QsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1QixjQUFjLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxRQUErQjtRQUMxRCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLGFBQWEsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELDJCQUEyQixDQUFDLFFBQStCO1FBQ3pELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxPQUFPLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDOUIsYUFBYSxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUM7YUFDekM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFtQjtRQUN2QyxJQUFJLGFBQWEsR0FBUSxDQUFDLENBQUM7UUFFM0IsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzdDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztZQUVILGFBQWEsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sYUFBYSxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsb0NBQW9DLENBQ2xDLE9BQVksRUFDWixRQUFnQjtRQUdoQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxzQ0FBc0MsRUFBRSxtREFBbUQsUUFBUSxhQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JMLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMxQyw4RUFBOEU7WUFDOUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQ3BDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLFFBQVEsRUFDekMsQ0FBQyxDQUNGLENBQ0YsQ0FBQztZQUNGLE9BQU8sQ0FBQyxZQUFZLENBQUMsY0FBYztnQkFDakMsT0FBTyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO1NBQ3JFO2FBQU07WUFDTCxPQUFPLENBQUMsY0FBYztnQkFDcEIsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztTQUMxRDthQUFNO1lBQ0wsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1NBQ3hDO1FBQ0QsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsc0NBQXNDLEVBQUUsbURBQW1ELFFBQVEsYUFBYSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVyTCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsNkJBQTZCLENBQUMsVUFBbUI7UUFDL0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsK0JBQStCLEVBQUUsbUNBQW1DLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3SSxJQUFJLFVBQVU7WUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVEO1lBQ0gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVELDZCQUE2QjtRQUMzQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwrQkFBK0IsRUFBRSxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxLQUFLLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFRCxrQ0FBa0MsQ0FBQyxLQUFhLEVBQUUsUUFBbUI7UUFDbkUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0NBQW9DLEVBQUUsd0NBQXdDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEksT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxRQUFtQjtRQUNoRCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFFdEIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixJQUFJLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO29CQUN6QixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ3hDO2dCQUNELE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUM7WUFFSCxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRTtRQUVELE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELHVCQUF1QixDQUFDLFFBQW1CO1FBQ3pDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHlCQUF5QixFQUFFLHVDQUF1QyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZILElBQUkscUJBQXFCLEdBQWEsRUFBRSxDQUFDO1FBRXpDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzlDLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRTtvQkFDekIsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUN4QztxQkFDSSxJQUFJLE9BQU8sQ0FBQyxjQUFjLEtBQUssR0FBRyxFQUFFO29CQUN2QyxPQUFPLENBQUMsQ0FBQztpQkFDVjtnQkFDRCxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1lBRUgscUJBQXFCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHlCQUF5QixFQUFFLGlEQUFpRCxFQUFFLHFCQUFxQixDQUFDLENBQUM7U0FDaEo7UUFDRCxPQUFPLHFCQUFxQixDQUFDO0lBQy9CLENBQUM7SUFFRCx3Q0FBd0MsQ0FBQyxRQUFtQjtRQUMxRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwwQ0FBMEMsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFakgsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEYsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQy9DLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3pCLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsVUFBVSxFQUFFO3dCQUNoRCxVQUFVLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQztxQkFDM0M7Z0JBRUgsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUVKO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsT0FBTztJQUNULENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxRQUFlO1FBQ3BDLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQztZQUNULElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztZQUM3QixJQUFJLGFBQWEsR0FBVyxPQUFPLENBQUM7WUFDcEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQXFELEVBQUUsRUFBRTtnQkFFekUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLE9BQU8sRUFBRTtvQkFDekQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQy9DLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUMsYUFBYSxHQUFHLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO29CQUMvRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxRQUFRLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDO2lCQUU5RztxQkFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssTUFBTSxFQUFFO29CQUMvRCxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUMzQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzVDLGFBQWEsR0FBRyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtvQkFFL0UsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxZQUFZLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQztpQkFFOUc7cUJBQ0ksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLFFBQVEsRUFBRTtvQkFDL0QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7b0JBQ2hELFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUMsYUFBYSxHQUFHLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO29CQUUvRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLFlBQVksS0FBSyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2lCQUVqSDtxQkFDSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssT0FBTyxFQUFFO29CQUM5RCxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDakQsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1QyxhQUFhLEdBQUcsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUE7b0JBRS9FLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsWUFBWSxLQUFLLGFBQWEsRUFBRSxDQUFDLENBQUM7aUJBRWhIO3FCQUFNO29CQUNMLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1QyxhQUFhLEdBQUcsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7b0JBQ2hGLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixFQUFFLFVBQVUsWUFBWSxLQUFLLGFBQWEsRUFBRSxDQUFDLENBQUM7aUJBRWpIO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLE1BQU0sRUFBRTtnQkFDaEQsWUFBWSxHQUFHLFlBQVksR0FBRyxFQUFFLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxhQUFhLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxPQUFPLEVBQUU7Z0JBQ3hELFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDeEM7aUJBQU0sSUFBSSxhQUFhLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQ3pELFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDekM7aUJBQU0sSUFBSSxhQUFhLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxPQUFPLEVBQUU7Z0JBQ3hELFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDMUM7WUFFRCxJQUFJLFFBQVEsR0FBRztnQkFDYixLQUFLLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRTtnQkFDOUIsSUFBSSxFQUFFLGFBQWE7YUFDcEIsQ0FBQTtZQUNELE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMvRztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELHFDQUFxQyxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDdEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0RBQWtELENBQUMsQ0FBQztRQUU5RixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0MsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFFBQVEsRUFBRTtnQkFDekMsVUFBVSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7YUFDckM7UUFFSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLE9BQU87SUFDVCxDQUFDO0lBRUQsZUFBZTtRQUNiLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFDakcsSUFBSTtZQUNGLElBQUksU0FBUyxHQUFpQjtnQkFDNUIsTUFBTSxFQUFFLEVBQUU7YUFDWCxDQUFBO1lBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hGLElBQUksS0FBSyxHQUFRO29CQUNmLFdBQVcsRUFBRSxXQUFXO29CQUN4QixLQUFLLEVBQUUsRUFBRTtvQkFDVCxRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLE9BQU87d0JBQ2IsS0FBSyxFQUFFLEdBQUc7cUJBQ1g7aUJBQ0YsQ0FBQTtnQkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQy9DLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ3ZELEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUM5QjtnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTFELFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9CLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLEtBQUssRUFBRTtZQUNaLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzFHO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBERUxJVkVSWV9NRVRIT0RTIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBCYXNrZXQsIERlbGl2ZXJ5R3JvdXBJbmZvLCBEZWxpdmVyeUluZm8sIFByb2R1Y3QsIFRyYW5zYWN0aW9uUHJvbW90aW9uIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkRpc2NvdW50IH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gJy4vbnVtYmVyLXV0aWwuc2VydmljZSc7XG5pbXBvcnQge0FwcExvZ2dlclNlcnZpY2V9IGZyb20gJ0BwbWNyZXRhaWwvY29tbW9uLXNlcnZpY2VzL2NvbW1vbi9hcHAtbG9nZ2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQmFza2V0U2VydmljZSB7XG4gIGN1cnJlbnRCYXNrZXQ6IEJhc2tldCA9IHtcbiAgICBwcm9kdWN0czogW10sXG4gICAgdHJhbnNhY3Rpb25EaXNjb3VudDogW10sXG4gICAgcXVhbnRpdHk6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgc2FsZVRvdGFsOiAwLFxuICAgIGJhc2VDdXJyZW5jeTogJydcbiAgfTtcblxuICBwcml2YXRlIGJhc2tldFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgYmFza2V0ID0gdGhpcy5iYXNrZXRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBwcm9kdWN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwcm9kdWN0ID0gdGhpcy5wcm9kdWN0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcGVlclNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwZWVyU3luYyA9IHRoaXMucGVlclNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHNjYW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgc2Nhbm5lciA9IHRoaXMuc2NhblNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIF9pc01peGVkQmFza2V0U2FsZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBnZXQgaXNNaXhlZEJhc2tldFNhbGVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTWl4ZWRCYXNrZXRTYWxlcztcbiAgfVxuICBwdWJsaWMgc2V0IGlzTWl4ZWRCYXNrZXRTYWxlcyh2OiBhbnkpIHtcbiAgICB0aGlzLl9pc01peGVkQmFza2V0U2FsZXMgPSB2O1xuICB9XG4gIGNsYXNzTmFtZSA9IFwiQmFza2V0U2VydmljZVwiO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cblxuICB1cGRhdGVCYXNrZXQoYmFza2V0OiBCYXNrZXQpIHtcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XG4gICAgdGhpcy5pc01peGVkQmFza2V0U2FsZXMgPSB0aGlzLmZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyKHRydWUpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5iYXNrZXRTb3VyY2UubmV4dChiYXNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcbiAgICogQHBhcmFtICBudWxsXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHVwZGF0ZUJhc2tldFRvdGFsKGJhc2tldERldGFpbHM6IHsgcXVhbnRpdHk6IG51bWJlcjsgdG90YWw6IG51bWJlcjsgcHJvZHVjdHM6IGFueTsgdHJhbnNhY3Rpb25JZDogYW55OyBiYXNrZXRUb3RhbDogYW55OyB9LCBiYXNrZXRTdGF0ZTogeyB1cGRhdGVCYXNrZXQ6IChhcmcwOiBhbnkpID0+IHZvaWQ7IH0pIHtcbiAgICBiYXNrZXREZXRhaWxzLnF1YW50aXR5ID0gMDtcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xuICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IGJhc2tldERldGFpbHMucXVhbnRpdHkgKyBwLnF1YW50aXR5O1xuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwoYmFza2V0RGV0YWlscy50b3RhbCkgK1xuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsKHAudG90YWwpO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsXCIsXG4gICAgICBgYmFza2V0RGV0YWlscyB1cGRhdGVkIHZhbHVlcyBmb3IgdHJhbnNhY3Rpb24gaWRcbiAgICAgICR7YmFza2V0RGV0YWlscy50cmFuc2FjdGlvbklkfSwgIGJhc2tldERldGFpbHNcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscyl9YFxuICAgICk7XG4gICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9IGJhc2tldERldGFpbHMudG90YWw7XG4gICAgYmFza2V0U3RhdGUudXBkYXRlQmFza2V0KGJhc2tldERldGFpbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBMaW5lIHByb21vdGlvblxuICAgKiBAcGFyYW0gIG51bGxcbiAgICogQHJldHVybnMgYmFza2V0RGV0YWlsc1xuICAgKi9cbiAgYWRkbGluZVByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyBsaW5lUHJvbW90aW9uczogc3RyaW5nIHwgYW55W107IH07IH0sIGJhc2tldERldGFpbHM6IHsgcHJvZHVjdHM6IGFueTsgfSkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkbGluZVByb21vdGlvblwiLFxuICAgICAgYHByb21vdGlvbkxpc3QgJHtKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KX0gYW5kIFxuICAgICAgIGJhc2tldERldGFpbHNcbiAgICAgICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscyl9IGZvciBsaW5lUHJvbW90aW9uc2BcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHByb21vdGlvbkxpc3QgJiZcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0ICYmXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC5saW5lUHJvbW90aW9ucyAmJlxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgZm9yICh2YXIgZWxlbWVudCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XG4gICAgICAgIGZvciAodmFyIHByb21vdGlvbmVsZW1lbnQgb2YgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSA9PT1cbiAgICAgICAgICAgIHByb21vdGlvbmVsZW1lbnQuaXRlbUxpbmVJZC50b1N0cmluZygpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zID0gcHJvbW90aW9uZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICAvKipcbiAgICogYWRkIFRyYW5zYWN0aW9uIHByb21vdGlvblxuICAgKiBAcGFyYW0gIG51bGxcbiAgICogQHJldHVybnMgYmFza2V0RGV0YWlsc1xuICAgKi9cblxuICBhZGRUcmFuc2FjdGlvblByb21vdGlvbihwcm9tb3Rpb25MaXN0OiB7IHJlc3VsdDogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55IH07IH0sIGJhc2tldGRldGFpbHM6IEJhc2tldCkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgIGBwcm9tb3Rpb25MaXN0ICR7SlNPTi5zdHJpbmdpZnkocHJvbW90aW9uTGlzdCl9IGFuZCBcbiAgICAgICBiYXNrZXREZXRhaWxzXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMpfSBmb3IgdHJhbnNhY3Rpb25Qcm9tb3Rpb25zICR7SlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbil9YFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcHJvbW90aW9uTGlzdCAmJlxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQgJiZcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0UHJvbW90aW9uOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkOiBhbnkgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHRQcm9tb3Rpb25cbiAgICAgICAgKTtcblxuICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZC5pdGVtTGluZUlkcyA9IGJhc2tldGRldGFpbHMucHJvZHVjdHMubWFwKFxuICAgICAgICAgIChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5pdGVtTGluZUlkO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcbiAgICAgICAgICBiYXNrZXRkZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5wdXNoKFxuICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uRW50cnlVcGRhdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgYmFza2V0ZGV0YWlscyA9IHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoXG4gICAgICAgICAgYmFza2V0ZGV0YWlscyxcbiAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYWRkVHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgIFwiYmFza2V0IGRldGFpbHMgaW4gcmVmdW5kIGNhbGN1bGF0aW9uIGZpbGVcIixcbiAgICAgIGJhc2tldGRldGFpbHNcbiAgICApO1xuICAgIHJldHVybiBiYXNrZXRkZXRhaWxzO1xuICB9XG5cbiAgdXBkYXRlUHJvZHVjdFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiB7IHRvdGFsOiBzdHJpbmcgfCBudW1iZXI7IHF1YW50aXR5OiBzdHJpbmcgfCBudW1iZXI7IHByb2R1Y3RzOiBhbnk7IH0pIHtcbiAgICAvKnNhbGUtICAgICAgICAgICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkXG4gICAgcGFydGlhbCByZWZ1bmQgLSAgIHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcbiAgICB0b3RhbCByZWZ1bmQgLSAgICAgcHJvdWRjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMFxuICAgIGV4Y2hhbmdlIC0gICAgICAgICBleGNoYW5nZSBwcm9kdWN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwICBcbiAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb2R1Y3QgcmVmdW5kZWRRdWFudGl0eSA9IHVuZGVmaW5lZCAgXG4gICAgICAgICAgICAgICAgICAgICAgIG9sZCBwcm9kdWN0IHdpdGhvdXQgZXhjaGFuZ2UgcmVmdW5kZWRRdWFudGl0eSA9IDBcbiAgICB1bnJlZmVyZW5jZSByZWZ1bmQtcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAqL1xuXG4gICAgYmFza2V0RGV0YWlscy50b3RhbCA9IDA7XG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XG4gICAgICBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QubGluZURpc2NvdW50ICYmICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XG4gICAgICB9XG4gICAgICBwcm9kdWN0LnRvdGFsID1cbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xuXG4gICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICs9IHByb2R1Y3QudG90YWw7XG4gICAgICBiYXNrZXREZXRhaWxzLnF1YW50aXR5ID1cbiAgICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSArXG4gICAgICAgIChwcm9kdWN0LnF1YW50aXR5IC1cbiAgICAgICAgICAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID8gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5IDogMCkpO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVQcm9kdWN0VG90YWxGb3JTdW1tYXJ5XCIsXG4gICAgICAgIFwidXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcbiAgICAgICAgYmFza2V0RGV0YWlscy50b3RhbCArXG4gICAgICAgIFwiIFByb2R1Y3QgbGluZSBJRCA6IFwiICtcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcbiAgICAgICAgcHJvZHVjdC50b3RhbCxcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcbiAgfVxuXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbDtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxGb3JTdW1tYXJ5XCIsXG4gICAgICBcInVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50XG4gICAgKTtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbEZvclN1bW1hcnlcIixcbiAgICAgIFwidXBkYXRlIEJhc2tldCBUb3RhbCBmb3IgdHJhbnNhY3Rpb24gdHJhbnNhY3Rpb25Qcm9tb3Rpb24gIFwiLFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvblxuICAgICk7XG5cbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvblByb21vdGlvbihiYXNrZXREZXRhaWxzKTtcbiAgICBiYXNrZXREZXRhaWxzID0gdGhpcy51cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHMpO1xuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBOdW1iZXIoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbC50b0ZpeGVkKDIpKTtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbEZvclN1bW1hcnlcIixcbiAgICAgIFwidXBkYXRlIEJhc2tldCBUb3RhbDogYmFza2V0VG90YWwgYWZ0ZXIgcHJvbW90aW9uIGFwcGxpZWQgIGZvciBiYXNrZXRUb3RhbFwiLFxuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbFxuICAgICk7XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICB1cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25EaXNjb3VudDogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQgJiZcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcbiAgICAgICAgKG46IGFueSwgeyBkaXNjb3VudEFtb3VudCB9OiBhbnkpID0+IG4gKyBkaXNjb3VudEFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudFwiLCAgXCJkaXNjb3VudFRvdGFsIFwiLCBkaXNjb3VudFRvdGFsKTtcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxuICAgICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsIC0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XG4gICAgfVxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xuICB9XG5cbiAgdXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogeyB0cmFuc2FjdGlvblByb21vdGlvbjogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcbiAgICAgICAgKG46IGFueSwgeyBwcm9tb3Rpb25BbW91bnQgfTogYW55KSA9PiBuICsgcHJvbW90aW9uQW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCA9XG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudChiYXNrZXQ6IEJhc2tldCk6IEJhc2tldCB7XG4gICAgYmFza2V0LnRvdGFsID0gMDtcbiAgICBiYXNrZXQucXVhbnRpdHkgPSAwO1xuXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXQucHJvZHVjdHMpIHtcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcbiAgICAgICAgcHJvZHVjdC50b3RhbCA9IHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgfVxuXG4gICAgICBwcm9kdWN0LnRvdGFsID1cbiAgICAgICAgcHJvZHVjdC50b3RhbCAtXG4gICAgICAgIE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IHByb2R1Y3QucmVmdW5kZWRUb3RhbCA6IDApO1xuICAgICAgYmFza2V0LnRvdGFsICs9IHByb2R1Y3QudG90YWw7XG4gICAgICBiYXNrZXQucXVhbnRpdHkgPVxuICAgICAgICBiYXNrZXQucXVhbnRpdHkgK1xuICAgICAgICAocHJvZHVjdC5xdWFudGl0eSAtXG4gICAgICAgICAgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA6IDApKTtcblxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRUb3RhbFdpdGhvdXREaXNjb3VudFwiLFxuICAgICAgICBcImUtYmFza2V0OmJhc2tldCBzZXJ2aWNlOnVwZGF0ZSBiYXNrZXRkZXRhaWxzIHRvdGFsIDpcIiArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xuICAgICAgICBiYXNrZXQudG90YWwgK1xuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXG4gICAgICAgIFwiIHByb2R1Y3QgdG90YWwgOiBcIiArXG4gICAgICAgIHByb2R1Y3QudG90YWxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRUb3RhbFdpdGhEaXNjb3VudHMoYmFza2V0OiBhbnkpOiBCYXNrZXQge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQmFza2V0VG90YWxXaXRoRGlzY291bnRzXCIsXG4gICAgICBgdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXMgICR7YmFza2V0fSwgXG4gICAgICAke0pTT04uc3RyaW5naWZ5KGJhc2tldC5iYXNrZXRUb3RhbCl9YFxuICAgICk7XG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgcHJvbW90aW9uQW1vdW50IH06IGFueSkgPT4gbiArIHByb21vdGlvbkFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XG4gICAgfVxuICAgIGlmIChiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJiBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50c1wiLFxuICAgICAgXCJiYXNrZXQgbmV3IHZhbHVlc1wiLFxuICAgICAgYmFza2V0XG4gICAgKTtcblxuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRpc2NvdW50QW5kUHJvbW90aW9uUHJvZHVjdG9ydGlvbkNhbGN1bGF0aW9uKGJhc2tldDogQmFza2V0KSB7XG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goXG4gICAgICAgIChkaXNjb3VudCkgPT5cbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICAgICAgICBiYXNrZXQsXG4gICAgICAgICAgZGlzY291bnRcbiAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKHByb21vdGlvbikgPT4ge1xuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb25cIixcbiAgICAgIGBiYXNrZXQgaXRlbSBkaXNjb3VudCBwcm90aW9uIGNhbGN1bGF0aW9uICxcbiAgICAgICR7YmFza2V0fSxcbiAgICAgICR7YmFza2V0LnByb2R1Y3RzfWBcbiAgICApO1xuICAgIHJldHVybiBiYXNrZXQ7XG4gIH1cblxuICB0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICBiYXNrZXQ6IGFueSxcbiAgICBwcm9tb3Rpb246IGFueVxuICApIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBwZXJjZW50YWdlID0gMDtcbiAgICB7XG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocDphbnkpID0+IHtcbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwLml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgcCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHApO1xuICAgICAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXG4gICAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcbiAgICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsY1wiLFxuICAgICAgICBgZWJhc2tldDogdHJuc2FjdGlvblByb21vdGlvbjogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwcm9tb3Rpb25cbiAgICAgICAgKX0sIHNlbGVjdGVkIHByb2R1Y3RzIHRvdGFsOiAke3RvdGFsfWBcbiAgICAgICk7XG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XG4gICAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcblxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XG5cbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwcm9kdWN0Lml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XG4gICAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uICs9XG4gICAgICAgICAgICAocHJvbW90aW9uLnByb21vdGlvbkFtb3VudCAqIHBlcmNlbnRhZ2UpIC8gMTAwO1xuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgdHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcbiAgICBiYXNrZXQ6IGFueSxcbiAgICBkaXNjb3VudDogYW55XG4gICkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHA6IGFueSkgPT4ge1xuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcbiAgICAgICAgcCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHApO1xuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XG5cblxuICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uRGlzY291bnRQcm9kdWN0UG9ydGlvbkNhbGNcIixcbiAgICAgIGBlYmFza2V0OiB0cm5zYWN0aW9uRGlzY291bnQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGRpc2NvdW50XG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxuICAgICk7XG5cbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcbiAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsY1wiLCBcImRpc2NvdW50YWJsZSBpbiBiYXNrZXQgc2VydmljZVwiLCBwcm9kdWN0LmRpc2NvdW50YWJsZSk7XG5cbiAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uKTtcblxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHByb2R1Y3QuaXRlbUxpbmVJZCkgJiYgcHJvZHVjdC5kaXNjb3VudGFibGUgPT0gdHJ1ZSkge1xuICAgICAgICBwZXJjZW50YWdlID0gKChwcm9kdWN0LnRvdGFsIC0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwpKSAvIHRvdGFsKSAqIDEwMDtcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gKz1cbiAgICAgICAgICAoZGlzY291bnQuZGlzY291bnRBbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbilcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0OiBQcm9kdWN0KSB7XG4gICAgaWYgKCFwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcbiAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cyA9IHtcbiAgICAgICAgdHJuRGlzY291bnRzUG9ydGlvbjogMCxcbiAgICAgICAgdHJuUHJvbW90aW9uc1BvcnRpb246IDAsXG4gICAgICAgIHJlZnVuZFBvcnRpb246IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuXG4gIG1hcmtQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICB0aGlzLnByb2R1Y3RTb3VyY2UubmV4dChwcm9kdWN0KTtcbiAgfVxuICBzdG9wUGVlclN5bmNQcm9jZXNzKHBlZXJTeW5jOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZWVyU291cmNlLm5leHQocGVlclN5bmMpO1xuICB9XG5cbiAgc2NhblN0YXJ0KGlzU2Nhbm5pbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNjYW5Tb3VyY2UubmV4dChpc1NjYW5uaW5nKTtcbiAgfVxuXG4gIHByb21vdGlvblJlbWFpbmluZ0NhbGN1bGF0aW9uKHByb21vdGlvbjogVHJhbnNhY3Rpb25Qcm9tb3Rpb25bXSkge1xuICAgIHZhciBwcm9tb3Rpb25WYWx1ZSA9IDA7XG4gICAgcHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIHByb21vdGlvblZhbHVlICs9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9tb3Rpb25WYWx1ZTtcbiAgfVxuXG4gIGRpc2NvdW50UmVtYWluaW5nQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBkaXNjb3VudFZhbHVlICs9IGVsZW1lbnQuZGlzY291bnRBbW91bnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc2NvdW50VmFsdWU7XG4gIH1cblxuICBkaXNjb3VudFJlZnVuZGVkQ2FsY3VsYXRpb24oZGlzY291bnQ6IFRyYW5zYWN0aW9uRGlzY291bnRbXSkge1xuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDApIHtcbiAgICAgICAgZGlzY291bnRWYWx1ZSArPSBlbGVtZW50LmRpc2NvdW50QW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkaXNjb3VudFZhbHVlO1xuICB9XG5cbiAgZ2VuZXJhdGVOZXdJdGVtTGluZUlkKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICBsZXQgbGFyZ2VzdE51bWJlcjogYW55ID0gMDtcblxuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gcHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWQ7XG4gICAgICB9KTtcblxuICAgICAgbGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGEgOmFueSwgYjphbnkpID0+IE1hdGgubWF4KGEsIGIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFyZ2VzdE51bWJlciArIDE7XG4gIH1cblxuICB1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHkoXG4gICAgcHJvZHVjdDogYW55LFxuICAgIHF1YW50aXR5OiBudW1iZXJcbiAgKTogUHJvZHVjdCB7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eVwiLCBgZWJhc2tldDogdXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5IDogJHtxdWFudGl0eX0gcHJvZHVjdDogJHtKU09OLnN0cmluZ2lmeShwcm9kdWN0KX1gKTtcbiAgICBwcm9kdWN0LnF1YW50aXR5ID0gcXVhbnRpdHk7XG4gICAgaWYgKHByb2R1Y3QuaGFzT3duUHJvcGVydHkoXCJsaW5lRGlzY291bnRcIikpIHtcbiAgICAgIC8vICYmIHRoaXMucHJvZHVjdC5xdWFudGl0eSAhPT0gdGhpcy5wcm9kdWN0RGV0YWlsRm9ybS5jb250cm9scy5xdWFudGl0eS52YWx1ZVxuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSA9IE51bWJlcihcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS5nZXRGbG9vcmVkRml4ZWQoXG4gICAgICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQudW5pdFByaWNlICogcXVhbnRpdHksXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgPVxuICAgICAgICBwcm9kdWN0LnRvdGFsTGluZVByaWNlIC0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSA9XG4gICAgICAgIHF1YW50aXR5ICogdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwcm9kdWN0LnNlbGVjdGVkUHJpY2UpO1xuICAgIH1cbiAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcbiAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcbiAgICB9XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVCYXNrZXRQcm9kdWN0RGF0YUFzUGVyUXVhbnRpdHlcIiwgYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XG5cbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aFdlYk9yZGVyKGlzV2ViT3JkZXI6IGJvb2xlYW4pOiBQcm9kdWN0W10ge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXJcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhXZWJPcmRlciBoaXRcIiwgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcbiAgICBpZiAoaXNXZWJPcmRlcilcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmlzV2ViT3JkZXIpO1xuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5maWx0ZXIoKHgpID0+ICF4LmlzV2ViT3JkZXIpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5KCk6IFByb2R1Y3RbXSB7XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeVwiLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5IGhpdFwiLCB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5R3JvdXBcIiwgXCJmaWx0ZXJQcm9kdWN0TGlzdFdpdGhEZWxpdmVyeUdyb3VwIGhpdFwiLCBwcm9kdWN0cyk7XG4gICAgcmV0dXJuIHByb2R1Y3RzLmZpbHRlcigoeCkgPT4geC5kZWxpdmVyeUdyb3VwID09PSBncm91cCk7XG4gIH1cblxuICBnZW5lcmF0ZU5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcblxuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xuICAgICAgICBpZiAocHJvZHVjdC5kZWxpdmVyeUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHByb2R1Y3QuZGVsaXZlcnlHcm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgbGFyZ2VzdE51bWJlciA9IGRlbGl2ZXJ5R3JvdXBBcnIucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChsYXJnZXN0TnVtYmVyICsgMSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgaW5pdGlhdGluZyA6IFwiLHByb2R1Y3RzKTtcblxuICAgIGxldCB1bmlxdWVBbmRzb3J0ZWRSZXN1bHQ6IG51bWJlcltdID0gW107XG5cbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGRlbGl2ZXJ5R3JvdXBBcnIgPSBwcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgaWYgKHByb2R1Y3QuZGVsaXZlcnlHcm91cCkge1xuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgPT09IFwiMVwiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgdW5pcXVlQW5kc29ydGVkUmVzdWx0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGRlbGl2ZXJ5R3JvdXBBcnIpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzXCIsIFwiZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMgOiB1bmlxdWVBbmRzb3J0ZWRSZXN1bHRcIiwgdW5pcXVlQW5kc29ydGVkUmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDtcbiAgfVxuXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aE5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoTmV3RGVsaXZlcnlHcm91cE51bWJlclwiLCBcImluaXRpYXRpbmcgOiBcIiwgcHJvZHVjdHMpO1xuXG4gICAgbGV0IG5ld0dyb3VwTnVtYmVyID0gdGhpcy5nZW5lcmF0ZU5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIodGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKTtcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XG4gICAgICAgIHByb2R1Y3RzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgaWYgKGNCUHJvZHVjdHMuaXRlbUxpbmVJZCA9PT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XG4gICAgICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cE51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQmFza2V0KHRoaXMuY3VycmVudEJhc2tldCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY2FsY3VsYXRlRXN0aW1hdGVkVGltZShwcm9kdWN0czogYW55W10pIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRpbWU7XG4gICAgICBsZXQgZXN0bWF0ZWRUaW1lOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGVzdGltYXRlZERheXM6IHN0cmluZyA9IFwiSG91cnNcIjtcbiAgICAgIHByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IHsgbGVhZFRpbWU6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55OyB9OyB9KSA9PiB7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubGVhZFRpbWUudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiA3O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgd2VlayAke2VzdG1hdGVkVGltZX0gJHtlc3RpbWF0ZWREYXlzfWApO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sZWFkVGltZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBkYXlzICR7ZXN0bWF0ZWRUaW1lfSAke2VzdGltYXRlZERheXN9YCk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSkgKiAyNCAqIDMwO1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGBtb250aHMgJHtlc3RtYXRlZFRpbWV9ICAke2VzdGltYXRlZERheXN9YCk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogMzY1O1xuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xuXG4gICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjYWxjdWxhdGVFc3RpbWF0ZWRUaW1lXCIsIGB5ZWFycyAke2VzdG1hdGVkVGltZX0gICR7ZXN0aW1hdGVkRGF5c31gKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSk7XG4gICAgICAgICAgZXN0bWF0ZWRUaW1lID0gTWF0aC5tYXgoZXN0bWF0ZWRUaW1lLCB0aW1lKTtcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzO1xuICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBgaG91cnMgICR7ZXN0bWF0ZWRUaW1lfSAgJHtlc3RpbWF0ZWREYXlzfWApO1xuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcImRheXNcIikge1xuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAyNDtcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gKDI0ICogNyk7XG4gICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZERheXMudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XG4gICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZERheXMudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XG4gICAgICAgIGVzdG1hdGVkVGltZSA9IGVzdG1hdGVkVGltZSAvICgyNCAqIDM2NSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBlc3RpbWF0ZSA9IHtcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxuICAgICAgICB0eXBlOiBlc3RpbWF0ZWREYXlzXG4gICAgICB9XG4gICAgICByZXR1cm4gZXN0aW1hdGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiY2FsY3VsYXRlRXN0aW1hdGVkVGltZVwiLCBcImVycm9yIGluIGNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aERlbGl2ZXJ5R3JvdXBOdW1iZXIob2xkR3JvdXA6IHN0cmluZywgbmV3R3JvdXA6IHN0cmluZykge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlciBpbml0aWF0aW5nXCIpO1xuXG4gICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XG4gICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBvbGRHcm91cCkge1xuICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cDtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVCYXNrZXQodGhpcy5jdXJyZW50QmFza2V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXREZWxpdmVyeUluZm8oKTogYW55IHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImdldERlbGl2ZXJ5SW5mb1wiLCBcImdldERlbGl2ZXJ5R3JvdXBJbmZvciBpbml0aWF0aW5nXCIpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgZ3JvdXBJbmZvOiBEZWxpdmVyeUluZm8gPSB7XG4gICAgICAgIGdyb3VwczogW11cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXREZWxpdmVyeUdyb3VwTnVtYmVycyh0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpLmZvckVhY2goKGdyb3VwTnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBncm91cDogYW55ID0ge1xuICAgICAgICAgIGdyb3VwTnVtYmVyOiBncm91cE51bWJlcixcbiAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgZXN0aW1hdGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiSG91cnNcIixcbiAgICAgICAgICAgIHZhbHVlOiBcIjBcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZm9yRWFjaChjQlByb2R1Y3RzID0+IHtcbiAgICAgICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBncm91cE51bWJlci50b1N0cmluZygpKSB7XG4gICAgICAgICAgICBncm91cC5pdGVtcy5wdXNoKGNCUHJvZHVjdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ3JvdXAuZXN0aW1hdGUgPSB0aGlzLmNhbGN1bGF0ZUVzdGltYXRlZFRpbWUoZ3JvdXAuaXRlbXMpO1xuXG4gICAgICAgIGdyb3VwSW5mby5ncm91cHMucHVzaChncm91cCk7XG5cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZ3JvdXBJbmZvO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiZ2V0RGVsaXZlcnlJbmZvXCIsIFwiZXJyb3Igd2hpbGUgZ2V0dGluZyBkZWxpdmVyeSBpbmZvXCIsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==