@pmcretail/mapper-library 0.0.49 → 0.0.51

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 (32) hide show
  1. package/README.md +24 -24
  2. package/bundles/pmcretail-mapper-library.umd.js +4377 -4373
  3. package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
  4. package/esm2015/lib/RJ-mapper.class.js +877 -877
  5. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -1244
  6. package/esm2015/lib/WebReturn-mapper.class.js +326 -326
  7. package/esm2015/lib/WebReturnMagento2RestV1.class.js +273 -269
  8. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -409
  9. package/esm2015/lib/basket.service.js +527 -527
  10. package/esm2015/lib/mapper-library.component.js +26 -26
  11. package/esm2015/lib/mapper-library.model.js +41 -41
  12. package/esm2015/lib/mapper-library.module.js +21 -21
  13. package/esm2015/lib/number-util.service.js +42 -42
  14. package/esm2015/pmcretail-mapper-library.js +4 -4
  15. package/esm2015/public-api.js +10 -10
  16. package/fesm2015/pmcretail-mapper-library.js +3741 -3737
  17. package/fesm2015/pmcretail-mapper-library.js.map +1 -1
  18. package/lib/RJ-mapper.class.d.ts +80 -80
  19. package/lib/TransactionDocumentBuilder.d.ts +271 -271
  20. package/lib/WebReturn-mapper.class.d.ts +27 -27
  21. package/lib/WebReturnMagento2RestV1.class.d.ts +30 -30
  22. package/lib/WebReturnMagento2RestV1.class.d.ts.map +1 -1
  23. package/lib/WebReturnSalesforceMapper.class.d.ts +35 -35
  24. package/lib/basket.service.d.ts +105 -105
  25. package/lib/mapper-library.component.d.ts +8 -8
  26. package/lib/mapper-library.model.d.ts +702 -701
  27. package/lib/mapper-library.model.d.ts.map +1 -1
  28. package/lib/mapper-library.module.d.ts +7 -7
  29. package/lib/number-util.service.d.ts +13 -13
  30. package/package.json +2 -2
  31. package/pmcretail-mapper-library.d.ts +5 -5
  32. package/public-api.d.ts +6 -6
@@ -1,877 +1,877 @@
1
- import { DISCOUNTTYPE, TRANSACTION_TYPE } from "./mapper-library.model";
2
- import { TransactionDocumentBuilder } from "./TransactionDocumentBuilder";
3
- import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
- export class RJMapperBuilderClass {
5
- constructor(transactionDoc) {
6
- this.className = "RJMapperBuilderClass";
7
- this.itemCount = 0;
8
- this.largestNumber = 0;
9
- this.rjObject = {};
10
- if (transactionDoc) {
11
- this.transactionDocument = transactionDoc;
12
- }
13
- else {
14
- this.transactionDocument = {
15
- transactionId: "",
16
- offlineTransactionId: "",
17
- transactionRef: "",
18
- dateTime: "",
19
- orgCode: "",
20
- storeId: "",
21
- storeNodeId: "",
22
- storeNodeStructure: "",
23
- deviceId: "",
24
- terminalId: "",
25
- userId: "",
26
- initiatingModule: "eBasket",
27
- export: false,
28
- basket: {},
29
- basketSummary: {},
30
- baseCurrency: "",
31
- type: "",
32
- operationStatus: "",
33
- createdAt: "",
34
- updatedAt: "",
35
- id: "",
36
- currentTransactionDetails: {},
37
- saleTotal: 0,
38
- };
39
- }
40
- this.initilizeItemCount();
41
- this.setLineNumberForProducts();
42
- this.createdAt = this.getDate(this.transactionDocument.createdAt);
43
- this.updatedAt = this.getDate(this.transactionDocument.updatedAt);
44
- }
45
- getPosbasketInfo() {
46
- this.rjObject['Keyword'] = this.generateKeyword();
47
- this.rjObject['ID'] = this.generateId(this.createdAt);
48
- this.rjObject['XMLSchemaVersion'] = '2';
49
- this.rjObject['LastUpdated'] = this.updatedAt;
50
- this.rjObject['MajorVersion'] = this.majorVersion;
51
- this.rjObject['MinorVersion'] = this.minorVersion;
52
- this.rjObject['ManifestVersion'] = this.manifestVersion;
53
- this.rjObject['DatabaseSchemaVersion'] = this.databaseSchemaVersion;
54
- this.rjObject['BasketType'] = this.basketType;
55
- this.rjObject['State'] = this.getState();
56
- this.rjObject['ExternalState'] = this.externalState;
57
- return this;
58
- }
59
- getheaderInfo() {
60
- this.rjObject['Header'] = {};
61
- this.rjObject['Header'].TimeZoneOffset = this.convertToString(this.generateTimezoneoffset(this.transactionDocument.createdAt));
62
- this.rjObject['Header'].DateTimeCreated = this.createdAt;
63
- this.rjObject['Header'].OriginatedBy = {};
64
- this.rjObject['Header'].OriginatedBy.DeviceID = this.deviceId;
65
- this.rjObject['Header'].OriginatedBy.CashierID = this.cashierId;
66
- this.rjObject['Header'].OriginatedBy.CompanyID = this.companyId;
67
- this.rjObject['Header'].OriginatedBy.StoreID = this.transactionDocument.storeId;
68
- this.rjObject['Header'].OriginatedBy.BranchID = this.branchId;
69
- this.rjObject['Header'].OriginatedBy.TerminalNumber = this.terminalNumber;
70
- this.rjObject['Header'].OriginatedBy.TransactionNumber = this.transactionNumber;
71
- this.rjObject['Header'].TaxMethodID = this.taxMethodId;
72
- this.rjObject['Header'].DynamicStockLookup = this.generateDynamicStockLookUp();
73
- this.rjObject['Header'].BasketLanguageID = this.basketLanguageId; //todo
74
- this.rjObject['Header'].BasketCountryID = this.basketCountryId; //todo
75
- this.rjObject['Header'].BasketCurrencyID = this.transactionDocument.baseCurrency;
76
- this.rjObject['Header'].TradingRegionID = this.tradingRegionId;
77
- this.rjObject['Header'].Eurozone = " "; //unknown
78
- this.rjObject['Header'].EuroBaseExchangeRate = ""; //unknown
79
- this.rjObject['Header'].PrintableName = this.transactionDocument.userName; //unknown
80
- return this;
81
- }
82
- rjMapper() {
83
- var transactionDiscount = [];
84
- if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {
85
- transactionDiscount = this.transactionDocument.basket.transactionDiscount;
86
- }
87
- if (this.transactionDocument.type === TRANSACTION_TYPE.SALE) {
88
- this.rjObject['ProductSale'] = [];
89
- this.rjObject['ModifierItem'] = [];
90
- this.transactionDocument.basket.products.forEach((element) => {
91
- let lineDiscount = [];
92
- if (this.transactionDocument.basket.lineDiscount && this.transactionDocument.basket.lineDiscount.length > 0) {
93
- lineDiscount = this.transactionDocument.basket.lineDiscount.filter((x) => x.itemLineId === element.itemLineId);
94
- if (lineDiscount.length > 0) {
95
- const index = this.transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);
96
- if (index > -1) {
97
- this.transactionDocument.basket.lineDiscount.splice(index, 1);
98
- }
99
- }
100
- }
101
- let data = this.addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
102
- this.rjObject['ProductSale'].push(data);
103
- this.getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);
104
- });
105
- let transactionPromotion = [];
106
- if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {
107
- transactionPromotion = this.transactionDocument.basket.transactionPromotion;
108
- this.getTransactionPromotion(transactionPromotion);
109
- }
110
- }
111
- else if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
112
- this.rjObject['ProductReturn'] = [];
113
- this.rjObject['ModifierItem'] = [];
114
- this.transactionDocument.basket.products.forEach((element) => {
115
- let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
116
- this.rjObject['ProductReturn'].push(data);
117
- this.getModifierItem(element.lineDiscount, element.itemLineId);
118
- });
119
- }
120
- else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
121
- this.rjObject['ProductReturn'] = [];
122
- this.rjObject['ModifierItem'] = [];
123
- let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
124
- transactionDoc.basket.products.forEach((element) => {
125
- let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
126
- let obj = {
127
- "OriginalReceiptSupplied": 0,
128
- "OriginalBranchID": 0,
129
- "OriginalTerminalNumber": 0,
130
- "OriginalTransactionNumber": 0,
131
- "OriginalCashierNumber": 0
132
- };
133
- data['Return'] = Object.assign(Object.assign({}, data['Return']), obj);
134
- this.rjObject['ProductReturn'].push(data);
135
- this.getModifierItem(element.lineDiscount, element.itemLineId);
136
- });
137
- }
138
- else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
139
- this.rjObject['ProductReturn'] = [];
140
- this.rjObject['ProductSale'] = [];
141
- this.rjObject['ModifierItem'] = [];
142
- let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
143
- transactionDoc.basket.products.forEach((element) => {
144
- if (element.refundedQuantity > 0) {
145
- let returnProduct = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
146
- let obj = {
147
- "OriginalReceiptSupplied": 0,
148
- "OriginalBranchID": 0,
149
- "OriginalTerminalNumber": 0,
150
- "OriginalTransactionNumber": 0,
151
- "OriginalCashierNumber": 0
152
- };
153
- returnProduct['Return'] = Object.assign(Object.assign({}, returnProduct['Return']), obj);
154
- this.rjObject['ProductReturn'].push(returnProduct);
155
- }
156
- else {
157
- let addProduct = this.addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
158
- this.rjObject['ProductSale'].push(addProduct);
159
- }
160
- this.getModifierItem(element.lineDiscount, element.itemLineId);
161
- });
162
- }
163
- return this;
164
- }
165
- getBasketDiscount() {
166
- if (!this.transactionDocument.basket.transactionDiscount)
167
- return this;
168
- this.rjObject['BasketDiscount'] = [];
169
- this.transactionDocument.basket.transactionDiscount.forEach((element) => {
170
- let obj = {};
171
- obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
172
- obj['DeviceID'] = this.deviceId;
173
- obj['DateTimeCreated'] = this.updatedAt;
174
- obj['NetValue'] = this.convertToString(element.discountAmount * -1);
175
- obj['EffectiveNetValue'] = this.convertToString(element.discountAmount * -1);
176
- obj['Description'] = element.reasonDisplayText;
177
- obj['UserID'] = this.transactionDocument.userName;
178
- obj['ReasonCodeID'] = element.reasonCode;
179
- obj['DiscountType'] = this.convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1);
180
- obj['RoundingRule'] = this.convertToString(2);
181
- obj['ModifiedLineNumber'] = element.itemLineIds;
182
- obj['LineNumber'] = this.convertToString(this.generateLineNumber());
183
- obj['DiscountedValue'] = this.transactionDocument.basketSummary.basketTotal + this.transactionDocument.basketSummary.discountTotal;
184
- if (element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()) {
185
- obj['DiscountPercentage'] = this.convertToString((element.discountAmount / this.transactionDocument.basketSummary.basketTotal).toFixed(1));
186
- }
187
- if (this.transactionDocument.type === 'REFUND') {
188
- obj['NetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
189
- obj['EffectiveNetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
190
- }
191
- this.rjObject['BasketDiscount'].push(obj);
192
- });
193
- return this;
194
- }
195
- getModifierItem(data, lineNo) {
196
- if (data && lineNo) {
197
- let obj = {};
198
- obj.XMLSchemaVersion = 1;
199
- obj.LineNumber = this.generateLineNumber();
200
- obj.NetValue = 0;
201
- obj.EffectiveNetValue = 0;
202
- obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;
203
- obj.DeviceID = this.deviceId;
204
- obj.UserID = this.transactionDocument.userName;
205
- obj.DateTimeCreated = this.updatedAt;
206
- obj.AuthorisingUserID = this.transactionDocument.userName;
207
- obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;
208
- obj.ModifiedLineNumber = lineNo;
209
- obj.ModifiedIndex = 1;
210
- this.rjObject['ModifierItem'].push(obj);
211
- }
212
- }
213
- getTrailerInfo() {
214
- this.rjObject['Trailer'] = {};
215
- this.rjObject.Trailer.DateTimeCompleted = this.updatedAt;
216
- this.rjObject.Trailer.CompletedBy = {};
217
- this.rjObject.Trailer.CompletedBy.DeviceID = this.deviceId;
218
- this.rjObject.Trailer.CompletedBy.CashierID = this.cashierId;
219
- this.rjObject.Trailer.CompletedBy.StoreID = this.transactionDocument.storeId;
220
- this.rjObject.Trailer.CompletedBy.BranchID = this.branchId;
221
- this.rjObject.Trailer.CompletedBy.TerminalNumber = this.terminalNumber;
222
- this.rjObject.Trailer.CompletedBy.TransactionNumber = this.transactionNumber;
223
- this.rjObject.Trailer.Total = this.convertToString(this.transactionDocument.basketSummary.basketTotal * 100);
224
- this.rjObject.Trailer.ItemCount = this.itemCount; //gives total count for product
225
- this.rjObject.Trailer.ItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
226
- this.rjObject.Trailer.NetItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
227
- this.rjObject.Trailer.TaxTotal = this.convertToString(this.removeDecimal(this.transactionDocument.basketSummary.VATTotal));
228
- this.rjObject.Trailer.SequenceDeviceID = this.deviceId;
229
- this.rjObject.Trailer.SequenceNumber = 'snsn'; //static for now
230
- this.rjObject['Trailer']['TaxItem'] = [];
231
- this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element) => {
232
- let obj = {};
233
- obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
234
- obj['TaxRate'] = this.convertToString(element.VATCode);
235
- obj['TaxableTotal'] = this.convertToString(this.removeDecimal(element.taxableAmount));
236
- obj['TaxTotal'] = this.convertToString(this.removeDecimal(this.removeDecimal(element.taxLineTotal)));
237
- obj['TaxDescription'] = this.convertToString(element.VATCode);
238
- obj['TaxIncluded'] = '1';
239
- obj['TaxPercentage'] = this.addDecimal(element.VAT.toFixed(2)).toFixed(2);
240
- this.rjObject['Trailer']['TaxItem'].push(obj);
241
- });
242
- if (this.transactionDocument.basket.linePromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
243
- this.rjObject['Trailer']['PromotionItem'] = [];
244
- if (this.transactionDocument.basket.linePromotion.length > 0) {
245
- this.transactionDocument.basket.linePromotion.forEach((element) => {
246
- let obj = {};
247
- obj['PromotionID'] = element.promotionId;
248
- obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
249
- obj['PromotionQuantity'] = "1";
250
- obj['PromotionDescription'] = element.displayText;
251
- obj['PromotionHit'] = {};
252
- obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
253
- obj['PromotionHit']['HitNumber'] = "1";
254
- obj['PromotionHit']['HitQuantity'] = "1";
255
- obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
256
- obj['PromotionHit']['PromotionTrigger'] = {};
257
- let product = this.transactionDocument.basket.products.find((item) => item.itemLineId == element.itemLineId);
258
- obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = this.xmlSchemaVersion;
259
- obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;
260
- obj['PromotionHit']['PromotionTrigger']['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
261
- obj['PromotionHit']['PromotionTrigger']['LineNumber'] = this.getNumber(product.SKU);
262
- obj['PromotionHit']['PromotionTrigger']['Quantity'] = this.convertToString(product.quantity.toFixed(1));
263
- obj['PromotionHit']['PromotionTrigger']['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == element.itemLineId).VATCode;
264
- this.rjObject['Trailer']['PromotionItem'].push(obj);
265
- });
266
- }
267
- if (this.transactionDocument.basket.transactionPromotion.length > 0) {
268
- this.transactionDocument.basket.transactionPromotion.forEach((element) => {
269
- let obj = {};
270
- obj['PromotionID'] = element.promotionId;
271
- obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
272
- obj['PromotionQuantity'] = "1";
273
- obj['PromotionDescription'] = element.displayText;
274
- obj['PromotionHit'] = {};
275
- obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
276
- obj['PromotionHit']['HitNumber'] = "1";
277
- obj['PromotionHit']['HitQuantity'] = "1";
278
- obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
279
- obj['PromotionHit']['PromotionTrigger'] = [];
280
- this.transactionDocument.basket.products.forEach((product) => {
281
- let promotionTrigger = {};
282
- element.itemLineIds.forEach((itemLineId) => {
283
- if (JSON.stringify(itemLineId) === product.itemLineId) {
284
- promotionTrigger['XMLSchemaVersion'] = this.xmlSchemaVersion;
285
- promotionTrigger['ProductID'] = product.SKU;
286
- promotionTrigger['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
287
- promotionTrigger['LineNumber'] = this.getNumber(product.SKU);
288
- promotionTrigger['Quantity'] = this.convertToString(product.quantity);
289
- promotionTrigger['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == product.itemLineId).VATCode;
290
- obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);
291
- }
292
- });
293
- });
294
- this.rjObject['Trailer']['PromotionItem'].push(obj);
295
- });
296
- }
297
- }
298
- return this;
299
- }
300
- getTenderInfo() {
301
- if (this.transactionDocument.paymentDetails && this.transactionDocument.paymentDetails.length > 0) {
302
- this.transactionDocument.paymentDetails.forEach((element) => {
303
- if (element.externalTenderKey) {
304
- this.rjObject[element.externalTenderKey] = [];
305
- if (element.paymentType.toUpperCase() === 'GIFT CARD') {
306
- let obj = {
307
- XMLSchemaVersion: this.xmlSchemaVersion,
308
- LineNumber: this.generateLineNumber(),
309
- NetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
310
- EffectiveNetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
311
- Description: this.getDescription(element),
312
- DeviceID: this.deviceId,
313
- UserID: this.transactionDocument.userName,
314
- DateTimeCreated: this.updatedAt,
315
- TenderType: element.externalTenderType ? element.externalTenderType : '',
316
- TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
317
- TenderAmount: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
318
- CurrencyID: this.transactionDocument.baseCurrency,
319
- CurrencyDescription: this.transactionDocument.baseCurrency,
320
- GiftVoucherSalesAllowed: '',
321
- AllowRechargeableVoucherSales: '',
322
- GiftVoucherID: ''
323
- };
324
- this.rjObject[element.externalTenderKey].push(obj);
325
- }
326
- else {
327
- let obj1 = {
328
- XMLSchemaVersion: "1",
329
- LineNumber: this.generateLineNumber(),
330
- NetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
331
- EffectiveNetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
332
- Description: this.getDescription(element),
333
- DeviceID: this.deviceId,
334
- UserID: this.transactionDocument.userName,
335
- DateTimeCreated: this.updatedAt,
336
- TenderType: element.externalTenderType ? element.externalTenderType : '',
337
- TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
338
- TenderAmount: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
339
- CurrencyID: this.transactionDocument.baseCurrency,
340
- CurrencyDescription: this.transactionDocument.baseCurrency,
341
- IncludeInTransactionTotalCheck: "1",
342
- AllowRechargeableVoucherSales: "1",
343
- OpenDrawerAtEnd: "1"
344
- };
345
- this.rjObject[element.externalTenderKey].push(obj1);
346
- }
347
- }
348
- else {
349
- this.rjObject['CashTender'] = [];
350
- if (element.paymentType.toUpperCase() === 'GIFT CARD') {
351
- let obj = {
352
- XMLSchemaVersion: this.xmlSchemaVersion,
353
- LineNumber: this.generateLineNumber(),
354
- NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
355
- EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
356
- Description: this.getDescription(element),
357
- DeviceID: this.deviceId,
358
- UserID: this.transactionDocument.userName,
359
- DateTimeCreated: this.updatedAt,
360
- TenderType: element.externalTenderType ? element.externalTenderType : '',
361
- TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
362
- TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
363
- CurrencyID: this.transactionDocument.baseCurrency,
364
- CurrencyDescription: this.transactionDocument.baseCurrency,
365
- GiftVoucherSalesAllowed: '',
366
- AllowRechargeableVoucherSales: '',
367
- GiftVoucherID: ''
368
- };
369
- this.rjObject['CashTender'].push(obj);
370
- }
371
- else {
372
- let obj1 = {
373
- XMLSchemaVersion: "1",
374
- LineNumber: this.generateLineNumber(),
375
- NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
376
- EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
377
- Description: this.getDescription(element),
378
- DeviceID: this.deviceId,
379
- UserID: this.transactionDocument.userName,
380
- DateTimeCreated: this.updatedAt,
381
- TenderType: element.externalTenderType ? element.externalTenderType : '',
382
- TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
383
- TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
384
- CurrencyID: this.transactionDocument.baseCurrency,
385
- CurrencyDescription: this.transactionDocument.baseCurrency,
386
- IncludeInTransactionTotalCheck: "1",
387
- AllowRechargeableVoucherSales: "1",
388
- OpenDrawerAtEnd: "1"
389
- };
390
- this.rjObject['CashTender'].push(obj1);
391
- }
392
- }
393
- });
394
- }
395
- return this;
396
- }
397
- getNumber(productId) {
398
- let lineNumber;
399
- for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {
400
- const element = this.rjObject['ProductSale'][i];
401
- if (JSON.stringify(productId) === JSON.stringify(element.ProductID)) {
402
- lineNumber = element.LineNumber;
403
- break;
404
- }
405
- }
406
- return lineNumber;
407
- }
408
- setLineNumberForProducts() {
409
- let itemLineIdArray = [];
410
- itemLineIdArray = this.transactionDocument.basket.products.map((product) => {
411
- return parseInt(product.itemLineId);
412
- });
413
- this.largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
414
- }
415
- generateLineNumber() {
416
- this.largestNumber += 1;
417
- this.itemCount += 1;
418
- return this.largestNumber;
419
- }
420
- initilizeItemCount() {
421
- this.itemCount = this.transactionDocument.basket.products.length;
422
- }
423
- build() {
424
- return this.rjObject;
425
- }
426
- getDescription(element) {
427
- if (element.paymentType.toUpperCase() === 'CARD') {
428
- return element.cardType;
429
- }
430
- else {
431
- return element.paymentType;
432
- }
433
- }
434
- getMMGROUPID(attributes) {
435
- if (attributes && attributes.length > 0) {
436
- let filterValue = attributes.filter((attribute) => attribute.name === "MMGROUPID");
437
- if (filterValue && filterValue.length > 0) {
438
- return filterValue[0].value;
439
- }
440
- }
441
- }
442
- setDeviceInfo(id) {
443
- this.deviceId = id;
444
- return this;
445
- }
446
- removeDecimal(value) {
447
- return value * 100;
448
- }
449
- addDecimal(value) {
450
- return value / 100;
451
- }
452
- setTransactionNumber(value) {
453
- this.transactionNumber = value;
454
- return this;
455
- }
456
- setManifestVersion(value) {
457
- this.manifestVersion = value;
458
- return this;
459
- }
460
- setDatabaseSchemaVersion(value) {
461
- this.databaseSchemaVersion = value;
462
- return this;
463
- }
464
- setBasketType(value) {
465
- this.basketType = value;
466
- return this;
467
- }
468
- setTradingRegionID(value) {
469
- this.tradingRegionId = value;
470
- return this;
471
- }
472
- setCompanyID(value) {
473
- this.companyId = value;
474
- return this;
475
- }
476
- setTaxMethodID(value) {
477
- this.taxMethodId = value;
478
- return this;
479
- }
480
- setMajorVersion(value) {
481
- this.majorVersion = value;
482
- return this;
483
- }
484
- setMinorVersion(value) {
485
- this.minorVersion = value;
486
- return this;
487
- }
488
- setXMLSchemaVersion(value) {
489
- this.xmlSchemaVersion = value;
490
- return this;
491
- }
492
- setExternalState(value) {
493
- this.externalState = value;
494
- return this;
495
- }
496
- setCashierID() {
497
- this.cashierId = (this.transactionDocument && this.transactionDocument.userName) ? this.transactionDocument.userName : '';
498
- return this;
499
- }
500
- setTerminalNumber(value) {
501
- this.terminalNumber = value;
502
- return this;
503
- }
504
- setBasketLanguageID(value) {
505
- this.basketLanguageId = value;
506
- return this;
507
- }
508
- setBasketCountryID(value) {
509
- this.basketCountryId = value;
510
- return this;
511
- }
512
- setBasketCurrencyID(value) {
513
- this.basketCurrencyId = value;
514
- return this;
515
- }
516
- setBranchID(value) {
517
- this.branchId = value;
518
- return this;
519
- }
520
- setSalesPersonName(value) {
521
- this.salesPersonName = value;
522
- return this;
523
- }
524
- generateId(date) {
525
- let newDateTime = date.replace(/[^0-9]/g, '');
526
- let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();
527
- return id;
528
- }
529
- generateTimezoneoffset(date) {
530
- let x = date ? date : '';
531
- return new Date(x).getTimezoneOffset();
532
- }
533
- generateKeyword() {
534
- let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();
535
- return x;
536
- }
537
- getState() {
538
- if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {
539
- return 'Completed';
540
- }
541
- else {
542
- return 'Cancelled';
543
- }
544
- }
545
- returnProduct(element, lineDiscount, transactionDiscount) {
546
- let obj = {};
547
- let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
548
- obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
549
- obj['LineNumber'] = element['itemLineId'];
550
- obj['NetValue'] = this.removeDecimal(element['refundedTotal']);
551
- obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);
552
- obj['Description'] = element['description'];
553
- obj['DeviceID'] = this.transactionDocument['terminalId'];
554
- obj['UserID'] = this.transactionDocument.userName;
555
- obj['DateTimeCreated'] = this.createdAt;
556
- obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice'] * -1);
557
- obj['UnitPrice'] = this.removeDecimal(element['price']);
558
- obj['Quantity'] = this.getQuantity(element);
559
- obj['OriginalTaxAmountSet'] = 1;
560
- obj['ProductID'] = element['SKU'];
561
- obj['HandKeyed'] = 1;
562
- obj['LongDescription'] = element['description'];
563
- obj['Return'] = {};
564
- obj['Return']['ReturnReasonID'] = element['refundedReason'];
565
- obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];
566
- obj['Return']['ReturnToStock'] = this.getQuantity(element);
567
- obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode;
568
- obj['DisplayTaxCode'] = ''; // todo
569
- obj['ProductAttributes'] = ''; //todo - not required
570
- obj['Perishable'] = this.getMMGROUPID(element.attributes);
571
- //obj['MMGroupID'] = this.getCaregories(element);
572
- obj['MMGroupID'] = this.getMMGROUPID(element.attributes);
573
- obj['CustomerDetails'] = ""; // todo - blank
574
- obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO
575
- obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT) * -1)).toFixed(2));
576
- obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ? (taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));
577
- if (lineDiscount) {
578
- if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
579
- // line discount
580
- obj['Discount'] = {};
581
- obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
582
- obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
583
- obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
584
- obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
585
- obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
586
- obj['Discount'].DiscountType = lineDiscount.discountType;
587
- obj['Discount'].XMLSchemaVersion = 1;
588
- obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
589
- obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
590
- obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
591
- obj['Discount'].RoundingRule = 2;
592
- }
593
- if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
594
- //price override
595
- obj['PriceOverride'] = {};
596
- obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
597
- obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
598
- obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
599
- obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
600
- obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
601
- obj['PriceOverride'].XMLSchemaVersion = 1;
602
- obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
603
- obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
604
- }
605
- //update the product price
606
- obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
607
- obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
608
- obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
609
- obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
610
- }
611
- if (transactionDiscount) {
612
- obj['BasketDiscountModifier'] = [];
613
- this.transactionDocument.basket.transactionDiscount.forEach((e) => {
614
- let discountObj = {};
615
- e.itemLineIds.forEach((x) => {
616
- if (x == element.itemLineId) {
617
- var discountAmount = this.convertToString(e.discountAmount * -1);
618
- discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
619
- discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
620
- discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);
621
- obj['BasketDiscountModifier'].push(discountObj);
622
- }
623
- });
624
- });
625
- var totaltransactionDiscount = 0;
626
- obj['BasketDiscountModifier'].forEach((value) => {
627
- totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
628
- });
629
- //update the product price
630
- obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
631
- }
632
- if (this.transactionDocument.basket.transactionPromotion.length > 0) {
633
- obj['PromotionSaving'] = [];
634
- this.transactionDocument.basket.transactionPromotion.forEach((transactionPromo) => {
635
- let promotionObj = {};
636
- transactionPromo.itemLineIds.forEach((itemLineId) => {
637
- if (itemLineId == element.itemLineId) {
638
- promotionObj.ModifierValue = transactionPromo.promotionAmount;
639
- promotionObj.ModifierDateTime = this.transactionDocument.createdAt;
640
- promotionObj.ModifierDescription = transactionPromo.displayText;
641
- promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;
642
- promotionObj.PromotionID = transactionPromo.promotionId;
643
- promotionObj.PromotionDescription = transactionPromo.displayText;
644
- promotionObj.HitNumber = '1';
645
- promotionObj.PromotionHitProductQuantity = this.getQuantity(element);
646
- promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;
647
- obj['PromotionSaving'].push(promotionObj);
648
- }
649
- });
650
- });
651
- }
652
- return obj;
653
- }
654
- addProduct(element, lineDiscount, transactionDiscount) {
655
- let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
656
- let obj = {
657
- XMLSchemaVersion: this.xmlSchemaVersion,
658
- LineNumber: element.itemLineId,
659
- NetValue: this.removeDecimal(element.totalLinePrice),
660
- EffectiveNetValue: this.removeDecimal(element.totalLinePrice),
661
- Description: element.description,
662
- DeviceID: this.deviceId,
663
- UserID: this.transactionDocument.userName,
664
- DateTimeCreated: this.createdAt,
665
- ExtendedValue: this.removeDecimal(element.price),
666
- UnitPrice: this.removeDecimal(element.price),
667
- //MMGroupID: this.getCaregories(element),
668
- Quantity: element.quantity,
669
- SalespersonID: this.transactionDocument.userName,
670
- SalespersonName: this.salesPersonName,
671
- TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode,
672
- TaxModifiable: "1",
673
- OriginalTaxAmount: this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT)).toFixed(2))),
674
- TaxAmount: this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),
675
- OriginalTaxAmountSet: "1",
676
- ProductID: element.SKU,
677
- HandKeyed: "1",
678
- CustomerDetails: "",
679
- Perishable: this.getMMGROUPID(element.attributes),
680
- MMGroupID: this.getMMGROUPID(element.attributes)
681
- };
682
- if (lineDiscount) {
683
- if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
684
- // line discount
685
- obj['Discount'] = {};
686
- obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
687
- obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
688
- obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
689
- obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
690
- obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
691
- obj['Discount'].DiscountType = lineDiscount.discountType;
692
- obj['Discount'].XMLSchemaVersion = 1;
693
- obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
694
- obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
695
- obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
696
- obj['Discount'].RoundingRule = 2;
697
- }
698
- if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
699
- //price override
700
- obj['PriceOverride'] = {};
701
- obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
702
- obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
703
- obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
704
- obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
705
- obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
706
- obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;
707
- obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
708
- obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
709
- }
710
- //update the product price
711
- obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
712
- obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
713
- obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
714
- obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
715
- }
716
- if (transactionDiscount) {
717
- obj['BasketDiscountModifier'] = [];
718
- this.transactionDocument.basket.transactionDiscount.forEach((e) => {
719
- let discountObj = {};
720
- e.itemLineIds.forEach((itemLineId) => {
721
- if (itemLineId == element.itemLineId) {
722
- let discountAmount = this.convertToString(e.discountAmount * -1);
723
- discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
724
- discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));
725
- discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
726
- obj['BasketDiscountModifier'].push(discountObj);
727
- }
728
- });
729
- });
730
- let totaltransactionDiscount = 0;
731
- obj['BasketDiscountModifier'].forEach((value) => {
732
- totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
733
- });
734
- //update the product price
735
- obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
736
- }
737
- if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
738
- obj['DistributedPromotionSaving'] = [];
739
- if (this.transactionDocument.basket.transactionPromotion.length > 0) {
740
- this.transactionDocument.basket.transactionPromotion.forEach((e) => {
741
- let promotionObj = {};
742
- e.itemLineIds.forEach((itemLineId) => {
743
- if (itemLineId == element.itemLineId) {
744
- promotionObj.PromotionID = e.promotionId;
745
- promotionObj.Hit = '1';
746
- promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);
747
- promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);
748
- obj['DistributedPromotionSaving'].push(promotionObj);
749
- }
750
- });
751
- });
752
- }
753
- if (this.transactionDocument.basket.linePromotion.length > 0) {
754
- this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
755
- let promotionObj = {};
756
- if (element.itemLineId == linePromotion.itemLineId) {
757
- promotionObj.PromotionID = linePromotion.promotionId;
758
- promotionObj.Hit = "1";
759
- promotionObj.Saving = linePromotion.promotionLinePrice;
760
- promotionObj.ISaving = linePromotion.promotionLinePrice;
761
- obj['DistributedPromotionSaving'].push(promotionObj);
762
- }
763
- });
764
- }
765
- let transactionPromotion = 0;
766
- obj['DistributedPromotionSaving'].forEach((value) => {
767
- transactionPromotion = transactionPromotion + value.Saving;
768
- });
769
- obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;
770
- }
771
- return obj;
772
- }
773
- getSaving(price, promotionAmount) {
774
- let Saving = (price * promotionAmount) / this.transactionDocument.basketSummary.saleTotal;
775
- return Saving;
776
- }
777
- getLineNumber(value, discountAmount) {
778
- let lineNumber;
779
- for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {
780
- const element = this.rjObject['BasketDiscount'][i];
781
- if (value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue) {
782
- lineNumber = element.LineNumber;
783
- break;
784
- }
785
- }
786
- return lineNumber;
787
- }
788
- getDiscountedValue(price, discountAmount) {
789
- let DiscountedValue = ((price * discountAmount) / this.transactionDocument.basketSummary.saleTotal) * 100;
790
- return DiscountedValue;
791
- }
792
- getOriginalTax(element, VAT) {
793
- let pricebeforetax = (element.price * 100) / (100 + VAT);
794
- let originaltax = element.price - pricebeforetax;
795
- return originaltax;
796
- }
797
- convertToString(value) {
798
- try {
799
- value = JSON.stringify(value);
800
- return value;
801
- }
802
- catch (e) {
803
- AppLoggerService.logError(this.className, "convertToString", 'can not be converted in string', e);
804
- }
805
- }
806
- generateDynamicStockLookUp() {
807
- let x = '0';
808
- this.transactionDocument.basket.products.forEach((element) => {
809
- if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {
810
- x = '1';
811
- }
812
- });
813
- return x;
814
- }
815
- // getAttributes(){
816
- // let name: string | any[] = []
817
- // this.transactionDocument.basket.products.forEach((element: any) => {
818
- // if (element && element.attributes && element.attributes.length > 0) {
819
- // name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());
820
- // }
821
- // });
822
- // if (name.length > 0) {
823
- // return name[0].value
824
- // }
825
- // else{
826
- // return ""
827
- // }
828
- // }
829
- // getCaregories(element) {
830
- // let MMGroupId = " ";
831
- // if (element.categories && element.categories.length > 0) {
832
- // let categories = element.categories.filter((x) => x.parentId != '');
833
- // let value = categories.filter((x) => x.id != x.parentId);
834
- // MMGroupId = value[0].name;
835
- // }
836
- // return MMGroupId;
837
- // }
838
- getDate(date) {
839
- let offset = this.generateTimezoneoffset(date) * -1;
840
- let offsetHours = Math.abs(Math.floor(offset / 60));
841
- let offsetMinutes = Math.abs(offset) - offsetHours * 60;
842
- let offsetSign = '+';
843
- if (offset < 0) {
844
- offsetSign = '-';
845
- }
846
- let newdate = date.substring(0, 19);
847
- const x = (newdate + offsetSign + String(offsetHours).padStart(2, '0') + ':' + String(offsetMinutes).padStart(2, '0')).toString();
848
- return x;
849
- }
850
- getTransactionPromotion(transactionPromotion) {
851
- if (transactionPromotion && transactionPromotion.length > 0) {
852
- this.rjObject['PromoVoucherItem'] = {};
853
- this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;
854
- this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();
855
- this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
856
- this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
857
- this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;
858
- this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;
859
- this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;
860
- this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;
861
- this.rjObject['PromoVoucherItem']['ProductId'] = ""; //todo
862
- this.rjObject['PromoVoucherItem']['SerialNumber'] = ""; //todo
863
- this.rjObject['PromoVoucherItem']['MMGroupId'] = "";
864
- }
865
- }
866
- getQuantity(element) {
867
- let quantity;
868
- if (this.transactionDocument.unreferencedRefund) {
869
- quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);
870
- }
871
- else {
872
- quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);
873
- }
874
- return quantity;
875
- }
876
- }
877
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkotbWFwcGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWFwcGVyLWxpYnJhcnkvc3JjL2xpYi9SSi1tYXBwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBb0UsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN6SSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUN0RixNQUFNLE9BQU8sb0JBQW9CO0lBNkI3QixZQUFZLGNBQW9DO1FBM0JoRCxjQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFtQjNCLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUtsQixhQUFRLEdBQVEsRUFBRSxDQUFBO1FBR3RCLElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxjQUFjLENBQUM7U0FDN0M7YUFBTTtZQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRztnQkFDdkIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3hCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxXQUFXLEVBQUUsRUFBRTtnQkFDZixrQkFBa0IsRUFBRSxFQUFFO2dCQUN0QixRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixnQkFBZ0IsRUFBRSxTQUFTO2dCQUMzQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsRUFBUztnQkFDakIsYUFBYSxFQUFFLEVBQVM7Z0JBQ3hCLFlBQVksRUFBRSxFQUFFO2dC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QUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBRSxDQUFDLE1BQU07WUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBWTtRQUNwQixJQUFJLFFBQVEsQ0FBQTtRQUNaLElBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFDO1lBQzNDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNyRjthQUNHO1lBQ0EsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1NBQzdHO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRElTQ09VTlRUWVBFLCBMaW5lRGlzY291bnQsIFRQcm9kdWN0LCBUcmFuc2FjdGlvbkRpc2NvdW50LCBUcmFuc2FjdGlvbkRvY3VtZW50LCBUUkFOU0FDVElPTl9UWVBFIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIlxyXG5pbXBvcnQgeyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB9IGZyb20gXCIuL1RyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyXCI7XHJcbmltcG9ydCB7QXBwTG9nZ2VyU2VydmljZX0gZnJvbSAnQHBtY3JldGFpbC9jb21tb24tc2VydmljZXMvY29tbW9uL2FwcC1sb2dnZXIuc2VydmljZSc7XHJcbmV4cG9ydCBjbGFzcyBSSk1hcHBlckJ1aWxkZXJDbGFzcyB7XHJcblxyXG4gICAgY2xhc3NOYW1lID0gXCJSSk1hcHBlckJ1aWxkZXJDbGFzc1wiO1xyXG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50O1xyXG4gICAgcHJpdmF0ZSBkZXZpY2VJZDogYW55O1xyXG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbk51bWJlcjogYW55O1xyXG4gICAgcHJpdmF0ZSBtYW5pZmVzdFZlcnNpb246IGFueTtcclxuICAgIHByaXZhdGUgZGF0YWJhc2VTY2hlbWFWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIGJhc2tldFR5cGU6IGFueTtcclxuICAgIHByaXZhdGUgeG1sU2NoZW1hVmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBtYWpvclZlcnNpb246IGFueTtcclxuICAgIHByaXZhdGUgbWlub3JWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIGV4dGVybmFsU3RhdGU6IGFueTtcclxuICAgIHByaXZhdGUgY2FzaGllcklkOiBhbnk7XHJcbiAgICBwcml2YXRlIGNvbXBhbnlJZDogYW55O1xyXG4gICAgcHJpdmF0ZSB0ZXJtaW5hbE51bWJlcjogYW55O1xyXG4gICAgcHJpdmF0ZSB0YXhNZXRob2RJZDogYW55O1xyXG4gICAgcHJpdmF0ZSB0cmFkaW5nUmVnaW9uSWQ6IGFueTtcclxuICAgIHByaXZhdGUgYmFza2V0Q3VycmVuY3lJZDogYW55O1xyXG4gICAgcHJpdmF0ZSBiYXNrZXRDb3VudHJ5SWQ6IGFueTtcclxuICAgIHByaXZhdGUgYmFza2V0TGFuZ3VhZ2VJZDogYW55O1xyXG4gICAgcHJpdmF0ZSBpdGVtQ291bnQgPSAwO1xyXG4gICAgcHJpdmF0ZSBsYXJnZXN0TnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgYnJhbmNoSWQ6IGFueTtcclxuICAgIHByaXZhdGUgY3JlYXRlZEF0OiBhbnk7XHJcbiAgICBwcml2YXRlIHVwZGF0ZWRBdCA6YW55O1xyXG4gICAgcHJpdmF0ZSBzYWxlc1BlcnNvbk5hbWU6IGFueTtcclxuICAgIHByaXZhdGUgcmpPYmplY3Q6IGFueSA9IHt9XHJcblxyXG4gICAgY29uc3RydWN0b3IodHJhbnNhY3Rpb25Eb2M/OiBUcmFuc2FjdGlvbkRvY3VtZW50KSB7XHJcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uRG9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHRyYW5zYWN0aW9uRG9jO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBvZmZsaW5lVHJhbnNhY3Rpb25JZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUmVmOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgZGF0ZVRpbWU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBvcmdDb2RlOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgc3RvcmVJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgc3RvcmVOb2RlU3RydWN0dXJlOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgZGV2aWNlSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdXNlcklkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgaW5pdGlhdGluZ01vZHVsZTogXCJlQmFza2V0XCIsXHJcbiAgICAgICAgICAgICAgICBleHBvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYmFza2V0OiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3RhdHVzOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzOiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICBzYWxlVG90YWw6IDAsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5pdGlsaXplSXRlbUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVyRm9yUHJvZHVjdHMoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRBdCA9IHRoaXMuZ2V0RGF0ZSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdCA9IHRoaXMuZ2V0RGF0ZSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXBkYXRlZEF0KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3NiYXNrZXRJbmZvKCkge1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0tleXdvcmQnXSA9IHRoaXMuZ2VuZXJhdGVLZXl3b3JkKCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSUQnXSA9IHRoaXMuZ2VuZXJhdGVJZCh0aGlzLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnWE1MU2NoZW1hVmVyc2lvbiddID0gJzInO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0xhc3RVcGRhdGVkJ10gPSB0aGlzLnVwZGF0ZWRBdDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydNYWpvclZlcnNpb24nXSA9IHRoaXMubWFqb3JWZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ01pbm9yVmVyc2lvbiddID0gdGhpcy5taW5vclZlcnNpb247XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWFuaWZlc3RWZXJzaW9uJ10gPSB0aGlzLm1hbmlmZXN0VmVyc2lvbjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydEYXRhYmFzZVNjaGVtYVZlcnNpb24nXSA9IHRoaXMuZGF0YWJhc2VTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldFR5cGUnXSA9IHRoaXMuYmFza2V0VHlwZTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydTdGF0ZSddID0gdGhpcy5nZXRTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0V4dGVybmFsU3RhdGUnXSA9IHRoaXMuZXh0ZXJuYWxTdGF0ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldGhlYWRlckluZm8oKSB7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10gPSB7fTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UaW1lWm9uZU9mZnNldCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZ2VuZXJhdGVUaW1lem9uZW9mZnNldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0KSk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRGF0ZVRpbWVDcmVhdGVkID0gdGhpcy5jcmVhdGVkQXQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5ID0ge307XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuQ2FzaGllcklEID0gdGhpcy5jYXNoaWVySWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkNvbXBhbnlJRCA9IHRoaXMuY29tcGFueUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5TdG9yZUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkJyYW5jaElEID0gdGhpcy5icmFuY2hJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuVGVybWluYWxOdW1iZXIgPSB0aGlzLnRlcm1pbmFsTnVtYmVyO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UcmFuc2FjdGlvbk51bWJlciA9IHRoaXMudHJhbnNhY3Rpb25OdW1iZXI7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uVGF4TWV0aG9kSUQgPSB0aGlzLnRheE1ldGhvZElkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkR5bmFtaWNTdG9ja0xvb2t1cCA9IHRoaXMuZ2VuZXJhdGVEeW5hbWljU3RvY2tMb29rVXAoKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRMYW5ndWFnZUlEID0gdGhpcy5iYXNrZXRMYW5ndWFnZUlkOyAvL3RvZG9cclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRDb3VudHJ5SUQgPSB0aGlzLmJhc2tldENvdW50cnlJZDsgLy90b2RvXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uQmFza2V0Q3VycmVuY3lJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3k7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uVHJhZGluZ1JlZ2lvbklEID0gdGhpcy50cmFkaW5nUmVnaW9uSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRXVyb3pvbmUgPSBcIiBcIjsvL3Vua25vd25cclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5FdXJvQmFzZUV4Y2hhbmdlUmF0ZSA9IFwiXCI7IC8vdW5rbm93blxyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlByaW50YWJsZU5hbWUgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7IC8vdW5rbm93blxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICByak1hcHBlcigpIHtcclxuICAgICAgICB2YXIgdHJhbnNhY3Rpb25EaXNjb3VudDphbnkgPSBbXSA7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgdHJhbnNhY3Rpb25EaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRSkge1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpbmVEaXNjb3VudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5lRGlzY291bnQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5maWx0ZXIoKHg6IGFueSkgPT4geC5pdGVtTGluZUlkID09PSBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmluZGV4T2YobGluZURpc2NvdW50WzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuYWRkUHJvZHVjdChlbGVtZW50LCAobGluZURpc2NvdW50Lmxlbmd0aCA+IDAgPyBsaW5lRGlzY291bnRbMF0gOiBudWxsKSwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwID8gbGluZURpc2NvdW50WzBdIDogbnVsbCwgZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvblByb21vdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25Qcm9tb3Rpb24odHJhbnNhY3Rpb25Qcm9tb3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5SRUZVTkQpIHtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMucmV0dXJuUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShlbGVtZW50LmxpbmVEaXNjb3VudCwgZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCkge1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbkRvYzogYW55ID0gbmV3IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyKCkuYmFza2V0KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKS5idWlsZCgpO1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkRvYy5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMucmV0dXJuUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsUmVjZWlwdFN1cHBsaWVkXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbEJyYW5jaElEXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFRlcm1pbmFsTnVtYmVyXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFRyYW5zYWN0aW9uTnVtYmVyXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbENhc2hpZXJOdW1iZXJcIjogMFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGRhdGFbJ1JldHVybiddID0gey4uLmRhdGFbJ1JldHVybiddLCAuLi5vYmp9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShlbGVtZW50LmxpbmVEaXNjb3VudCwgZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbkRvYzogYW55ID0gbmV3IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyKCkuYmFza2V0KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKS5idWlsZCgpO1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkRvYy5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5Qcm9kdWN0ID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFJlY2VpcHRTdXBwbGllZFwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsQnJhbmNoSURcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFRlcm1pbmFsTnVtYmVyXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxUcmFuc2FjdGlvbk51bWJlclwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsQ2FzaGllck51bWJlclwiOiAwXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5Qcm9kdWN0WydSZXR1cm4nXSA9IHsuLi5yZXR1cm5Qcm9kdWN0WydSZXR1cm4nXSwgLi4ub2JqfTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10ucHVzaChyZXR1cm5Qcm9kdWN0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZFByb2R1Y3QgPSB0aGlzLmFkZFByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSAsKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5wdXNoKGFkZFByb2R1Y3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRCYXNrZXREaXNjb3VudCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCkgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnQmFza2V0RGlzY291bnQnXSA9IFtdO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge31cclxuICAgICAgICAgICAgb2JqWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgIG9ialsnRGV2aWNlSUQnXT10aGlzLmRldmljZUlkO1xyXG4gICAgICAgICAgICBvYmpbJ0RhdGVUaW1lQ3JlYXRlZCddPXRoaXMudXBkYXRlZEF0O1xyXG4gICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LmRpc2NvdW50QW1vdW50ICogLTEpO1xyXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPXRoaXMuY29udmVydFRvU3RyaW5nKCBlbGVtZW50LmRpc2NvdW50QW1vdW50ICogLTEpO1xyXG4gICAgICAgICAgICBvYmpbJ0Rlc2NyaXB0aW9uJ10gPSBlbGVtZW50LnJlYXNvbkRpc3BsYXlUZXh0O1xyXG4gICAgICAgICAgICBvYmpbJ1VzZXJJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICBvYmpbJ1JlYXNvbkNvZGVJRCddID0gZWxlbWVudC5yZWFzb25Db2RlO1xyXG4gICAgICAgICAgICBvYmpbJ0Rpc2NvdW50VHlwZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpID8gMCA6IDEpOyBcclxuICAgICAgICAgICAgb2JqWydSb3VuZGluZ1J1bGUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKDIpO1xyXG4gICAgICAgICAgICBvYmpbJ01vZGlmaWVkTGluZU51bWJlciddID0gZWxlbWVudC5pdGVtTGluZUlkczsgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvYmpbJ0xpbmVOdW1iZXInXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCkpOyBcclxuICAgICAgICAgICAgb2JqWydEaXNjb3VudGVkVmFsdWUnXSA9ICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCArIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmRpc2NvdW50VG90YWw7XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQuZGlzY291bnRUeXBlLnRvVXBwZXJDYXNlKCkgPT0gRElTQ09VTlRUWVBFLlBFUkNFTlQudG9VcHBlckNhc2UoKSl7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50UGVyY2VudGFnZSddID0gIHRoaXMuY29udmVydFRvU3RyaW5nKChlbGVtZW50LmRpc2NvdW50QW1vdW50IC8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwpLnRvRml4ZWQoMSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09ICdSRUZVTkQnKXtcclxuICAgICAgICAgICAgICAgIG9ialsnTmV0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuZGlzY291bnRBbW91bnQgPCAwID8gLWVsZW1lbnQuZGlzY291bnRBbW91bnQgOiBlbGVtZW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9dGhpcy5jb252ZXJ0VG9TdHJpbmcoIGVsZW1lbnQuZGlzY291bnRBbW91bnQgPCAwID8gLWVsZW1lbnQuZGlzY291bnRBbW91bnQgOiBlbGVtZW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQmFza2V0RGlzY291bnQnXS5wdXNoKG9iaik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TW9kaWZpZXJJdGVtKGRhdGE6IGFueSwgbGluZU5vOiBhbnkpIHtcclxuICAgICAgICBpZiAoZGF0YSAmJiBsaW5lTm8pIHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgIG9iai5YTUxTY2hlbWFWZXJzaW9uID0gMTtcclxuICAgICAgICAgICAgb2JqLkxpbmVOdW1iZXIgPSB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpO1xyXG4gICAgICAgICAgICBvYmouTmV0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICBvYmouRWZmZWN0aXZlTmV0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICBvYmouRGVzY3JpcHRpb24gPSBkYXRhLnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWUgPyBkYXRhLnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWUgOiBkYXRhLnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICBvYmouRGV2aWNlSUQgPSB0aGlzLmRldmljZUlkO1xyXG4gICAgICAgICAgICBvYmouVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICBvYmouRGF0ZVRpbWVDcmVhdGVkID0gdGhpcy51cGRhdGVkQXQ7XHJcbiAgICAgICAgICAgIG9iai5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgb2JqLlJlYXNvbkNvZGVJRCA9IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSA/IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSA6IGRhdGEucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgIG9iai5Nb2RpZmllZExpbmVOdW1iZXIgPSBsaW5lTm87XHJcbiAgICAgICAgICAgIG9iai5Nb2RpZmllZEluZGV4ID0gMTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VHJhaWxlckluZm8oKSB7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddID0ge307XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkRhdGVUaW1lQ29tcGxldGVkID0gdGhpcy51cGRhdGVkQXQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5ID0ge307XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuQ2FzaGllcklEID0gdGhpcy5jYXNoaWVySWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LlN0b3JlSUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuQnJhbmNoSUQgPSB0aGlzLmJyYW5jaElkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5UZXJtaW5hbE51bWJlciA9IHRoaXMudGVybWluYWxOdW1iZXI7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LlRyYW5zYWN0aW9uTnVtYmVyID0gdGhpcy50cmFuc2FjdGlvbk51bWJlcjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuVG90YWwgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCAqIDEwMCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkl0ZW1Db3VudCA9IHRoaXMuaXRlbUNvdW50OyAvL2dpdmVzIHRvdGFsIGNvdW50IGZvciBwcm9kdWN0XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkl0ZW1RdWFudGl0eSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnRvdGFsSXRlbXMpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5OZXRJdGVtUXVhbnRpdHkgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuVGF4VG90YWwgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuVkFUVG90YWwpKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuU2VxdWVuY2VEZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlNlcXVlbmNlTnVtYmVyID0gJ3Nuc24nIC8vc3RhdGljIGZvciBub3dcclxuXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydUYXhJdGVtJ10gPSBbXTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcblxyXG4gICAgICAgICAgICBvYmpbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgb2JqWydUYXhSYXRlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LlZBVENvZGUpO1xyXG4gICAgICAgICAgICBvYmpbJ1RheGFibGVUb3RhbCddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudGF4YWJsZUFtb3VudCkpO1xyXG4gICAgICAgICAgICBvYmpbJ1RheFRvdGFsJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudGF4TGluZVRvdGFsKSkpO1xyXG4gICAgICAgICAgICBvYmpbJ1RheERlc2NyaXB0aW9uJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LlZBVENvZGUpO1xyXG4gICAgICAgICAgICBvYmpbJ1RheEluY2x1ZGVkJ10gPSAnMSc7XHJcbiAgICAgICAgICAgIG9ialsnVGF4UGVyY2VudGFnZSddID0gdGhpcy5hZGREZWNpbWFsKGVsZW1lbnQuVkFULnRvRml4ZWQoMikpLnRvRml4ZWQoMik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1RheEl0ZW0nXS5wdXNoKG9iailcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDAgfHwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydQcm9tb3Rpb25JdGVtJ10gPSBbXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSUQnXSA9IGVsZW1lbnQucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uUXVhbnRpdHknXSA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uRGVzY3JpcHRpb24nXSA9IGVsZW1lbnQuZGlzcGxheVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXSA9IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdE51bWJlciddID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0UXVhbnRpdHknXSA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdFNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2R1Y3QgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydQcm9kdWN0SUQnXSA9IHByb2R1Y3QuU0tVO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnVW5pdFZhbHVlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LnByb21vdGlvbkxpbmVQcmljZSAvIHByb2R1Y3QucXVhbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnTGluZU51bWJlciddID0gdGhpcy5nZXROdW1iZXIocHJvZHVjdC5TS1UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnUXVhbnRpdHknXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHByb2R1Y3QucXVhbnRpdHkudG9GaXhlZCgxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydUYXhDb2RlJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpLlZBVENvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydQcm9tb3Rpb25JdGVtJ10ucHVzaChvYmopO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSUQnXSA9IGVsZW1lbnQucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uUXVhbnRpdHknXSA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uRGVzY3JpcHRpb24nXSA9IGVsZW1lbnQuZGlzcGxheVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXSA9IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdE51bWJlciddID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0UXVhbnRpdHknXSA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdFNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvblRyaWdnZXIgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pdGVtTGluZUlkcy5mb3JFYWNoKChpdGVtTGluZUlkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpdGVtTGluZUlkKSA9PT0gcHJvZHVjdC5pdGVtTGluZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1Byb2R1Y3RJRCddID0gcHJvZHVjdC5TS1U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnVW5pdFZhbHVlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LnByb21vdGlvbkxpbmVQcmljZSAvIHByb2R1Y3QucXVhbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ0xpbmVOdW1iZXInXSA9IHRoaXMuZ2V0TnVtYmVyKHByb2R1Y3QuU0tVKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydRdWFudGl0eSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcocHJvZHVjdC5xdWFudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnVGF4Q29kZSddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gcHJvZHVjdC5pdGVtTGluZUlkKS5WQVRDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXS5wdXNoKHByb21vdGlvblRyaWdnZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1Byb21vdGlvbkl0ZW0nXS5wdXNoKG9iaik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRUZW5kZXJJbmZvKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucGF5bWVudERldGFpbHMgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZihlbGVtZW50LmV4dGVybmFsVGVuZGVyS2V5KXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbZWxlbWVudC5leHRlcm5hbFRlbmRlcktleV0gPSBbXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBheW1lbnRUeXBlLnRvVXBwZXJDYXNlKCkgPT09ICdHSUZUIENBUkQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgWE1MU2NoZW1hVmVyc2lvbjogdGhpcy54bWxTY2hlbWFWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMaW5lTnVtYmVyOiB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogdGhpcy5nZXREZXNjcmlwdGlvbihlbGVtZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUNyZWF0ZWQ6IHRoaXMudXBkYXRlZEF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyQW1vdW50OiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5RGVzY3JpcHRpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdpZnRWb3VjaGVyU2FsZXNBbGxvd2VkOiAnJywvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6ICcnLC8vdG9kb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHaWZ0Vm91Y2hlcklEOiAnJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldLnB1c2gob2JqKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMaW5lTnVtYmVyOiB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpLC8vdG9kb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyU3ViVHlwZTogZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5RGVzY3JpcHRpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVJblRyYW5zYWN0aW9uVG90YWxDaGVjazogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkRyYXdlckF0RW5kOiBcIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldLnB1c2gob2JqMSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXltZW50VHlwZS50b1VwcGVyQ2FzZSgpID09PSAnR0lGVCBDQVJEJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlcjogdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUlEOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyVHlwZTogZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeUlEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBHaWZ0Vm91Y2hlclNhbGVzQWxsb3dlZDogJycsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiAnJywvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddLnB1c2gob2JqKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMaW5lTnVtYmVyOiB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogdGhpcy5nZXREZXNjcmlwdGlvbihlbGVtZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUNyZWF0ZWQ6IHRoaXMudXBkYXRlZEF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyQW1vdW50OiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5RGVzY3JpcHRpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVJblRyYW5zYWN0aW9uVG90YWxDaGVjazogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkRyYXdlckF0RW5kOiBcIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydDYXNoVGVuZGVyJ10ucHVzaChvYmoxKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZXROdW1iZXIocHJvZHVjdElkKSB7XHJcbiAgICAgICAgbGV0IGxpbmVOdW1iZXI7IFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXVtpXTtcclxuICAgICAgICAgICAgaWYoSlNPTi5zdHJpbmdpZnkocHJvZHVjdElkKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudC5Qcm9kdWN0SUQpKXtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbGVtZW50LkxpbmVOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGluZU51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRMaW5lTnVtYmVyRm9yUHJvZHVjdHMoKSB7XHJcbiAgICAgICAgbGV0IGl0ZW1MaW5lSWRBcnJheSA9IFtdO1xyXG4gICAgICAgIGl0ZW1MaW5lSWRBcnJheSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubWFwKChwcm9kdWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHByb2R1Y3QuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmxhcmdlc3ROdW1iZXIgPSBpdGVtTGluZUlkQXJyYXkucmVkdWNlKChhOiBhbnksIGI6IGFueSkgPT4gTWF0aC5tYXgoYSwgYikpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlTGluZU51bWJlcigpIHtcclxuICAgICAgICB0aGlzLmxhcmdlc3ROdW1iZXIgKz0gMTtcclxuICAgICAgICB0aGlzLml0ZW1Db3VudCArPSAxO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxhcmdlc3ROdW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlsaXplSXRlbUNvdW50KCkge1xyXG4gICAgICAgIHRoaXMuaXRlbUNvdW50ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmpPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGVzY3JpcHRpb24oZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0NBUkQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNhcmRUeXBlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wYXltZW50VHlwZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TU1HUk9VUElEKGF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGZpbHRlclZhbHVlID0gYXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUgPT09IFwiTU1HUk9VUElEXCIpO1xyXG4gICAgICAgICAgICBpZihmaWx0ZXJWYWx1ZSAmJiBmaWx0ZXJWYWx1ZS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclZhbHVlWzBdLnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldERldmljZUluZm8oaWQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZGV2aWNlSWQgPSBpZFxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRGVjaW1hbCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICogMTAwO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZERlY2ltYWwodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSAvMTAwO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRyYW5zYWN0aW9uTnVtYmVyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRNYW5pZmVzdFZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMubWFuaWZlc3RWZXJzaW9uID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXREYXRhYmFzZVNjaGVtYVZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2VTY2hlbWFWZXJzaW9uID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNrZXRUeXBlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJhc2tldFR5cGUgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRyYWRpbmdSZWdpb25JRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy50cmFkaW5nUmVnaW9uSWQgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q29tcGFueUlEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmNvbXBhbnlJZCA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRUYXhNZXRob2RJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy50YXhNZXRob2RJZCA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRNYWpvclZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMubWFqb3JWZXJzaW9uID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldE1pbm9yVmVyc2lvbih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5taW5vclZlcnNpb24gPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0WE1MU2NoZW1hVmVyc2lvbih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy54bWxTY2hlbWFWZXJzaW9uID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldEV4dGVybmFsU3RhdGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZXh0ZXJuYWxTdGF0ZSA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRDYXNoaWVySUQoKSB7XHJcbiAgICAgICAgdGhpcy5jYXNoaWVySWQgPSAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSkgPyAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lIDogJyc7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRUZXJtaW5hbE51bWJlcih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy50ZXJtaW5hbE51bWJlciA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJhc2tldExhbmd1YWdlSUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuYmFza2V0TGFuZ3VhZ2VJZCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0QmFza2V0Q291bnRyeUlEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJhc2tldENvdW50cnlJZCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJhc2tldEN1cnJlbmN5SUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuYmFza2V0Q3VycmVuY3lJZCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJyYW5jaElEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJyYW5jaElkID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2FsZXNQZXJzb25OYW1lKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNhbGVzUGVyc29uTmFtZSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlSWQoZGF0ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IG5ld0RhdGVUaW1lID0gZGF0ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpXHJcbiAgICAgICAgbGV0IGlkID0gKHRoaXMuZGV2aWNlSWQgKyAnfCcgKyBuZXdEYXRlVGltZSArICd8JyArIHRoaXMudHJhbnNhY3Rpb25OdW1iZXIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuIGlkO1xyXG4gICAgfSBcclxuXHJcbiAgICBnZW5lcmF0ZVRpbWV6b25lb2Zmc2V0KGRhdGU6IGFueSkge1xyXG4gICAgICAgIGxldCB4ID0gZGF0ZSA/IGRhdGUgOiAnJztcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUoeCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUtleXdvcmQoKSB7XHJcbiAgICAgICAgbGV0IHggPSAodGhpcy5jb21wYW55SWQgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZCArICd8JyArIHRoaXMudGVybWluYWxOdW1iZXIgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgIHJldHVybiB4O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub3BlcmF0aW9uU3RhdHVzID09PSAnUEFZX1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQ29tcGxldGVkJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQ2FuY2VsbGVkJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuUHJvZHVjdChlbGVtZW50OiBhbnksIGxpbmVEaXNjb3VudDogTGluZURpc2NvdW50ICwgdHJhbnNhY3Rpb25EaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudCkge1xyXG4gICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICAgIGxldCB0YXhUb3RhbCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRbJ3RheEJyZWFrZG93biddWyd0YXhMaW5lcyddLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnRbJ2l0ZW1MaW5lSWQnXSk7XHJcbiAgICAgICAgb2JqWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgb2JqWydMaW5lTnVtYmVyJ10gPSBlbGVtZW50WydpdGVtTGluZUlkJ107XHJcbiAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3JlZnVuZGVkVG90YWwnXSk7XHJcbiAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3JlZnVuZGVkVG90YWwnXSk7XHJcbiAgICAgICAgb2JqWydEZXNjcmlwdGlvbiddID0gZWxlbWVudFsnZGVzY3JpcHRpb24nXTtcclxuICAgICAgICBvYmpbJ0RldmljZUlEJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnRbJ3Rlcm1pbmFsSWQnXTtcclxuICAgICAgICBvYmpbJ1VzZXJJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgIG9ialsnRGF0ZVRpbWVDcmVhdGVkJ10gPSB0aGlzLmNyZWF0ZWRBdDtcclxuICAgICAgICBvYmpbJ0V4dGVuZGVkVmFsdWUnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50Wyd0b3RhbExpbmVQcmljZSddKi0xKTtcclxuICAgICAgICBvYmpbJ1VuaXRQcmljZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3ByaWNlJ10pO1xyXG4gICAgICAgIG9ialsnUXVhbnRpdHknXSA9IHRoaXMuZ2V0UXVhbnRpdHkoZWxlbWVudCk7XHJcbiAgICAgICAgb2JqWydPcmlnaW5hbFRheEFtb3VudFNldCddID0gMTtcclxuICAgICAgICBvYmpbJ1Byb2R1Y3RJRCddID0gZWxlbWVudFsnU0tVJ107XHJcbiAgICAgICAgb2JqWydIYW5kS2V5ZWQnXSA9IDE7XHJcbiAgICAgICAgb2JqWydMb25nRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ2Rlc2NyaXB0aW9uJ107XHJcbiAgICAgICAgb2JqWydSZXR1cm4nXSA9IHt9O1xyXG4gICAgICAgIG9ialsnUmV0dXJuJ11bJ1JldHVyblJlYXNvbklEJ10gPSBlbGVtZW50WydyZWZ1bmRlZFJlYXNvbiddO1xyXG4gICAgICAgIG9ialsnUmV0dXJuJ11bJ1JldHVybkRlc2NyaXB0aW9uJ10gPSBlbGVtZW50WydyZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uJ107XHJcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuVG9TdG9jayddID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KTtcclxuICAgICAgICBvYmpbJ1RheENvZGUnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRbJ3RheEJyZWFrZG93biddWyd0YXhMaW5lcyddLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnRbJ2l0ZW1MaW5lSWQnXSkuVkFUQ29kZTtcclxuXHJcbiAgICAgICAgb2JqWydEaXNwbGF5VGF4Q29kZSddID0gJyc7IC8vIHRvZG9cclxuICAgICAgICBvYmpbJ1Byb2R1Y3RBdHRyaWJ1dGVzJ10gPSAnJzsgLy90b2RvIC0gbm90IHJlcXVpcmVkXHJcbiAgICAgICAgb2JqWydQZXJpc2hhYmxlJ10gPSB0aGlzLmdldE1NR1JPVVBJRChlbGVtZW50LmF0dHJpYnV0ZXMpO1xyXG4gICAgICAgIC8vb2JqWydNTUdyb3VwSUQnXSA9IHRoaXMuZ2V0Q2FyZWdvcmllcyhlbGVtZW50KTtcclxuICAgICAgICBvYmpbJ01NR3JvdXBJRCddID0gdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKTtcclxuICAgICAgICBvYmpbJ0N1c3RvbWVyRGV0YWlscyddID0gXCJcIjsgLy8gdG9kbyAtIGJsYW5rXHJcbiAgICAgICAgb2JqWydUb3RhbFByb21vdGlvblNhdmluZyddID0gZWxlbWVudFsncHJvbW90aW9uQW1vdW50J10gfHwgLTE7IC8vIFRPRE9cclxuICAgICAgICBvYmpbJ09yaWdpbmFsVGF4QW1vdW50J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZygodGhpcy5yZW1vdmVEZWNpbWFsKHRoaXMuZ2V0T3JpZ2luYWxUYXgoZWxlbWVudCx0YXhUb3RhbC5WQVQpICogLTEpKS50b0ZpeGVkKDIpKTtcclxuICAgICAgICBvYmpbJ3RheEFtb3VudCddID0gdGhpcy5yZW1vdmVEZWNpbWFsKHRheFRvdGFsLnRheExpbmVUb3RhbCA8IDAgPyh0YXhUb3RhbC50YXhMaW5lVG90YWwpIDogKC10YXhUb3RhbC50YXhMaW5lVG90YWwpKTtcclxuXHJcbiAgICAgICAgaWYgKGxpbmVEaXNjb3VudCkge1xyXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWUgJiYgbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllckRlc2NyaXB0aW9uID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRUeXBlID0gbGluZURpc2NvdW50LmRpc2NvdW50VHlwZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRlZFZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50UGVyY2VudGFnZSA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy9wcmljZSBvdmVycmlkZVxyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJEYXRlVGltZSA9IG9iai5EYXRlVGltZUNyZWF0ZWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uWE1MU2NoZW1hVmVyc2lvbiA9IDE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5OZXdQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXHJcbiAgICAgICAgICAgIG9iai5OZXRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgIG9iai5FZmZlY3RpdmVOZXRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgIG9iai5FeHRlbmRlZFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgb2JqLlVuaXRQcmljZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0cmFuc2FjdGlvbkRpc2NvdW50KSB7XHJcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5mb3JFYWNoKChlOiBhbnkpID0+IHsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGRpc2NvdW50T2JqOiBhbnkgPXt9XHJcbiAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHsgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzY291bnRBbW91bnQgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlLmRpc2NvdW50QW1vdW50ICogLTEpOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLkJhc2tldERpc2NvdW50TGluZU51bWJlciA9IHRoaXMuZ2V0TGluZU51bWJlcihlLGRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouWE1MU2NoZW1hVmVyc2lvbiA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouRGlzY291bnRlZFZhbHVlID0gdGhpcy5nZXREaXNjb3VudGVkVmFsdWUoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLnB1c2goZGlzY291bnRPYmopO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZhciB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgPSAwO1xyXG4gICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXS5mb3JFYWNoKCh2YWx1ZTphbnkpPT57XHJcbiAgICAgICAgICAgICAgICB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgPSB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgKyB2YWx1ZS5EaXNjb3VudGVkVmFsdWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxyXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvYmpbJ1Byb21vdGlvblNhdmluZyddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCgodHJhbnNhY3Rpb25Qcm9tbzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW8uaXRlbUxpbmVJZHMuZm9yRWFjaCgoaXRlbUxpbmVJZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Nb2RpZmllclZhbHVlID0gdHJhbnNhY3Rpb25Qcm9tby5wcm9tb3Rpb25BbW91bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Nb2RpZmllckRhdGVUaW1lID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLk1vZGlmaWVyRGVzY3JpcHRpb24gPSB0cmFuc2FjdGlvblByb21vLmRpc3BsYXlUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouWE1MU2NoZW1hVmVyc2lvbiA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbklEID0gdHJhbnNhY3Rpb25Qcm9tby5wcm9tb3Rpb25JZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbkRlc2NyaXB0aW9uID0gdHJhbnNhY3Rpb25Qcm9tby5kaXNwbGF5VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdE51bWJlciA9ICcxJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbkhpdFByb2R1Y3RRdWFudGl0eSA9IHRoaXMuZ2V0UXVhbnRpdHkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25IaXRRdWFudGl0eSA9IHRoaXMuZ2V0UXVhbnRpdHkoZWxlbWVudCkgKiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBhZGRQcm9kdWN0KGVsZW1lbnQ6IFRQcm9kdWN0LCBsaW5lRGlzY291bnQ6IExpbmVEaXNjb3VudCwgdHJhbnNhY3Rpb25EaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudCkge1xyXG4gICAgICAgIGxldCB0YXhUb3RhbCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRbJ3RheEJyZWFrZG93biddWyd0YXhMaW5lcyddLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnRbJ2l0ZW1MaW5lSWQnXSk7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0ge1xyXG4gICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiB0aGlzLnhtbFNjaGVtYVZlcnNpb24sXHJcbiAgICAgICAgICAgIExpbmVOdW1iZXI6IGVsZW1lbnQuaXRlbUxpbmVJZCxcclxuICAgICAgICAgICAgTmV0VmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRvdGFsTGluZVByaWNlKSxcclxuICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRvdGFsTGluZVByaWNlKSxcclxuICAgICAgICAgICAgRGVzY3JpcHRpb246IGVsZW1lbnQuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIERldmljZUlEOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcclxuICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLmNyZWF0ZWRBdCxcclxuICAgICAgICAgICAgRXh0ZW5kZWRWYWx1ZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQucHJpY2UpLFxyXG4gICAgICAgICAgICBVbml0UHJpY2U6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnByaWNlKSxcclxuICAgICAgICAgICAgLy9NTUdyb3VwSUQ6IHRoaXMuZ2V0Q2FyZWdvcmllcyhlbGVtZW50KSxcclxuICAgICAgICAgICAgUXVhbnRpdHk6IGVsZW1lbnQucXVhbnRpdHksXHJcbiAgICAgICAgICAgIFNhbGVzcGVyc29uSUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcclxuICAgICAgICAgICAgU2FsZXNwZXJzb25OYW1lOiB0aGlzLnNhbGVzUGVyc29uTmFtZSxcclxuICAgICAgICAgICAgVGF4Q29kZTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKS5WQVRDb2RlLFxyXG4gICAgICAgICAgICBUYXhNb2RpZmlhYmxlOiBcIjFcIiwgLy90b2RvXHJcbiAgICAgICAgICAgIE9yaWdpbmFsVGF4QW1vdW50IDogdGhpcy5jb252ZXJ0VG9TdHJpbmcoKHRoaXMucmVtb3ZlRGVjaW1hbCh0aGlzLmdldE9yaWdpbmFsVGF4KGVsZW1lbnQsdGF4VG90YWwuVkFUKSkudG9GaXhlZCgyKSkpLFxyXG4gICAgICAgICAgICBUYXhBbW91bnQgOiB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwodGF4VG90YWwudGF4TGluZVRvdGFsKSksXHJcbiAgICAgICAgICAgIE9yaWdpbmFsVGF4QW1vdW50U2V0OiBcIjFcIiwvL3RvZG9cclxuICAgICAgICAgICAgUHJvZHVjdElEOiBlbGVtZW50LlNLVSxcclxuICAgICAgICAgICAgSGFuZEtleWVkOiBcIjFcIiwvL3RvZG9cclxuICAgICAgICAgICAgQ3VzdG9tZXJEZXRhaWxzOiBcIlwiLFxyXG4gICAgICAgICAgICBQZXJpc2hhYmxlOiB0aGlzLmdldE1NR1JPVVBJRChlbGVtZW50LmF0dHJpYnV0ZXMpLFxyXG4gICAgICAgICAgICBNTUdyb3VwSUQ6IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxpbmVEaXNjb3VudCkge1xyXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWUgJiYgbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllckRlc2NyaXB0aW9uID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRUeXBlID0gbGluZURpc2NvdW50LmRpc2NvdW50VHlwZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRlZFZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50UGVyY2VudGFnZSA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy9wcmljZSBvdmVycmlkZVxyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJEYXRlVGltZSA9IG9iai5EYXRlVGltZUNyZWF0ZWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uWE1MU2NoZW1hVmVyc2lvbiA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk5ld1ByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uT3JpZ2luYWxQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIHByb2R1Y3QgcHJpY2VcclxuICAgICAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICBvYmpbJ0V4dGVuZGVkVmFsdWUnXSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICBvYmpbJ1VuaXRQcmljZSddID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0cmFuc2FjdGlvbkRpc2NvdW50KSB7XHJcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5mb3JFYWNoKChlOmFueSkgPT4geyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBkaXNjb3VudE9iajogYW55ID17fTtcclxuICAgICAgICAgICAgICAgICBlLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkgeyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpc2NvdW50QW1vdW50ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZS5kaXNjb3VudEFtb3VudCAqIC0xKTsgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5EaXNjb3VudGVkVmFsdWUgPSAtKHRoaXMuZ2V0RGlzY291bnRlZFZhbHVlKGVsZW1lbnQudG90YWxMaW5lUHJpY2UsIGUuZGlzY291bnRBbW91bnQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouQmFza2V0RGlzY291bnRMaW5lTnVtYmVyID0gdGhpcy5nZXRMaW5lTnVtYmVyKGUsZGlzY291bnRBbW91bnQpIDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10ucHVzaChkaXNjb3VudE9iaik7IFxyXG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBsZXQgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gMDtcclxuICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10uZm9yRWFjaCgodmFsdWU6YW55KT0+e1xyXG4gICAgICAgICAgICAgICAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ICsgdmFsdWUuRGlzY291bnRlZFZhbHVlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIHByb2R1Y3QgcHJpY2VcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gb2JqLkVmZmVjdGl2ZU5ldFZhbHVlICsgIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudDsgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwIHx8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ialsnRGlzdHJpYnV0ZWRQcm9tb3Rpb25TYXZpbmcnXSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25PYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGUuaXRlbUxpbmVJZHMuZm9yRWFjaCgoaXRlbUxpbmVJZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbklEID0gZS5wcm9tb3Rpb25JZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5IaXQgPSAnMSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouU2F2aW5nID0gdGhpcy5nZXRTYXZpbmcoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5wcm9tb3Rpb25BbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLklTYXZpbmcgPSB0aGlzLmdldFNhdmluZyhlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLnByb21vdGlvbkFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10ucHVzaChwcm9tb3Rpb25PYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbk9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXRlbUxpbmVJZCA9PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbklEID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25JZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdCA9IFwiMVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouU2F2aW5nID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5JU2F2aW5nID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnRGlzdHJpYnV0ZWRQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uID0gMDtcclxuICAgICAgICAgICAgb2JqWydEaXN0cmlidXRlZFByb21vdGlvblNhdmluZyddLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uID0gdHJhbnNhY3Rpb25Qcm9tb3Rpb24gKyB2YWx1ZS5TYXZpbmc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyB0cmFuc2FjdGlvblByb21vdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTYXZpbmcocHJpY2UscHJvbW90aW9uQW1vdW50KTogYW55IHtcclxuICAgICAgICBsZXQgU2F2aW5nID0gKHByaWNlKnByb21vdGlvbkFtb3VudCkvdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsO1xyXG4gICAgICAgIHJldHVybiBTYXZpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGluZU51bWJlcih2YWx1ZTogYW55LGRpc2NvdW50QW1vdW50OnN0cmluZyApe1xyXG4gICAgICAgIGxldCBsaW5lTnVtYmVyO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yak9iamVjdFsnQmFza2V0RGlzY291bnQnXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yak9iamVjdFsnQmFza2V0RGlzY291bnQnXVtpXTtcclxuICAgICAgICAgICAgaWYoIHZhbHVlLnJlYXNvbkNvZGUgPT09IGVsZW1lbnQuUmVhc29uQ29kZUlEICYmIGRpc2NvdW50QW1vdW50ID09PSBlbGVtZW50Lk5ldFZhbHVlKXtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbGVtZW50LkxpbmVOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGluZU51bWJlcjsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXREaXNjb3VudGVkVmFsdWUocHJpY2U6YW55ICxkaXNjb3VudEFtb3VudDphbnkgKSB7XHJcbiAgICAgICAgbGV0IERpc2NvdW50ZWRWYWx1ZSA9KChwcmljZSAqIGRpc2NvdW50QW1vdW50KS90aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwpKjEwMCA7XHJcbiAgICAgICAgcmV0dXJuIERpc2NvdW50ZWRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRPcmlnaW5hbFRheChlbGVtZW50OiBUUHJvZHVjdCwgVkFUKSB7XHJcbiAgICAgICAgbGV0IHByaWNlYmVmb3JldGF4ID0gKGVsZW1lbnQucHJpY2UgKiAxMDApLygxMDAgKyBWQVQgKVxyXG4gICAgICAgIGxldCBvcmlnaW5hbHRheD0gZWxlbWVudC5wcmljZSAtIHByaWNlYmVmb3JldGF4XHJcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsdGF4O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnZlcnRUb1N0cmluZyh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dFcnJvcih0aGlzLmNsYXNzTmFtZSwgXCJjb252ZXJ0VG9TdHJpbmdcIiwgICdjYW4gbm90IGJlIGNvbnZlcnRlZCBpbiBzdHJpbmcnLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVEeW5hbWljU3RvY2tMb29rVXAoKSB7XHJcbiAgICAgICAgbGV0IHggPSAnMCc7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVsaXZlcnlNZXRob2QgPT09ICcxJyB8fCBlbGVtZW50LmRlbGl2ZXJ5TWV0aG9kID09PSAnMicpIHtcclxuICAgICAgICAgICAgICAgIHggPSAnMSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4geDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXRBdHRyaWJ1dGVzKCl7XHJcbiAgICAvLyAgICAgbGV0IG5hbWU6IHN0cmluZyB8IGFueVtdID0gW11cclxuICAgIC8vICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZmlsdGVyKCh4OiBhbnkpID0+IHgubmFtZS50b1VwcGVyQ2FzZSgpID09PSBlbGVtZW50Lm5hbWUudG9VcHBlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICBpZiAobmFtZS5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBuYW1lWzBdLnZhbHVlXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGVsc2V7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBcIlwiXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGdldENhcmVnb3JpZXMoZWxlbWVudCkge1xyXG4gICAgLy8gICAgIGxldCBNTUdyb3VwSWQgPSBcIiBcIjtcclxuICAgIC8vICAgICBpZiAoZWxlbWVudC5jYXRlZ29yaWVzICYmIGVsZW1lbnQuY2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gZWxlbWVudC5jYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5wYXJlbnRJZCAhPSAnJyk7XHJcbiAgICAvLyAgICAgICAgIGxldCB2YWx1ZSA9IGNhdGVnb3JpZXMuZmlsdGVyKCh4KSA9PiB4LmlkICE9IHgucGFyZW50SWQpO1xyXG4gICAgLy8gICAgICAgICBNTUdyb3VwSWQgPSB2YWx1ZVswXS5uYW1lO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gTU1Hcm91cElkO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGdldERhdGUoZGF0ZTpzdHJpbmcpe1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLmdlbmVyYXRlVGltZXpvbmVvZmZzZXQoZGF0ZSkgKiAtMTtcclxuICAgICAgICBsZXQgb2Zmc2V0SG91cnMgPSBNYXRoLmFicyhNYXRoLmZsb29yKG9mZnNldCAvIDYwKSk7ICAgICAgICBcclxuXHQgICAgbGV0IG9mZnNldE1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXQpIC0gb2Zmc2V0SG91cnMgKiA2MDtcclxuXHJcbiAgICAgICAgbGV0IG9mZnNldFNpZ24gPSAnKyc7XHJcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcclxuICAgICAgICAgICAgb2Zmc2V0U2lnbiA9ICctJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuZXdkYXRlID0gZGF0ZS5zdWJzdHJpbmcoMCwxOSk7XHJcbiAgICAgICAgY29uc3QgeCA9IChuZXdkYXRlKyBvZmZzZXRTaWduICtTdHJpbmcob2Zmc2V0SG91cnMpLnBhZFN0YXJ0KDIsICcwJykrJzonK1N0cmluZyhvZmZzZXRNaW51dGVzKS5wYWRTdGFydCgyLCAnMCcpKS50b1N0cmluZygpO1xyXG4gICAgICAgIHJldHVybiB4OyAgICAgICAgXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldFRyYW5zYWN0aW9uUHJvbW90aW9uKHRyYW5zYWN0aW9uUHJvbW90aW9uKXtcclxuICAgICAgICBpZih0cmFuc2FjdGlvblByb21vdGlvbiAmJiB0cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddID0ge307XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0xpbmVOdW1iZXInXSA9IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTmV0VmFsdWUnXSA9ICB0aGlzLnJlbW92ZURlY2ltYWwodHJhbnNhY3Rpb25Qcm9tb3Rpb25bMF0ucHJvbW90aW9uTGluZVByaWNlKSAqIC0xO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwodHJhbnNhY3Rpb25Qcm9tb3Rpb25bMF0ucHJvbW90aW9uTGluZVByaWNlKSAqIC0xO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0Rlc2NyaXB0aW9uJ10gPSB0cmFuc2FjdGlvblByb21vdGlvblswXS5wcm9tb3Rpb25JbmZvO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0RldmljZUlEJ10gPSB0aGlzLmRldmljZUlkO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ1VzZXJJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0RhdGVUaW1lQ3JlYXRlZCddID0gdGhpcy5jcmVhdGVkQXQ7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnUHJvZHVjdElkJ10gPSBcIlwiOyAvL3RvZG9cclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydTZXJpYWxOdW1iZXInXSA9IFwiXCIgOyAvL3RvZG9cclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydNTUdyb3VwSWQnXSA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRRdWFudGl0eShlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgcXVhbnRpdHlcclxuICAgICAgICBpZih0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudW5yZWZlcmVuY2VkUmVmdW5kKXtcclxuICAgICAgICAgICAgcXVhbnRpdHkgPSBlbGVtZW50WydxdWFudGl0eSddIDwgMCA/IGVsZW1lbnRbJ3F1YW50aXR5J10gOiAoLWVsZW1lbnRbJ3F1YW50aXR5J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBxdWFudGl0eSA9IGVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSA8IDAgPyBlbGVtZW50WydyZWZ1bmRlZFF1YW50aXR5J10gOiAoLWVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBxdWFudGl0eTtcclxuICAgIH1cclxufVxyXG4iXX0=
1
+ import { DISCOUNTTYPE, TRANSACTION_TYPE } from "./mapper-library.model";
2
+ import { TransactionDocumentBuilder } from "./TransactionDocumentBuilder";
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class RJMapperBuilderClass {
5
+ constructor(transactionDoc) {
6
+ this.className = "RJMapperBuilderClass";
7
+ this.itemCount = 0;
8
+ this.largestNumber = 0;
9
+ this.rjObject = {};
10
+ if (transactionDoc) {
11
+ this.transactionDocument = transactionDoc;
12
+ }
13
+ else {
14
+ this.transactionDocument = {
15
+ transactionId: "",
16
+ offlineTransactionId: "",
17
+ transactionRef: "",
18
+ dateTime: "",
19
+ orgCode: "",
20
+ storeId: "",
21
+ storeNodeId: "",
22
+ storeNodeStructure: "",
23
+ deviceId: "",
24
+ terminalId: "",
25
+ userId: "",
26
+ initiatingModule: "eBasket",
27
+ export: false,
28
+ basket: {},
29
+ basketSummary: {},
30
+ baseCurrency: "",
31
+ type: "",
32
+ operationStatus: "",
33
+ createdAt: "",
34
+ updatedAt: "",
35
+ id: "",
36
+ currentTransactionDetails: {},
37
+ saleTotal: 0,
38
+ };
39
+ }
40
+ this.initilizeItemCount();
41
+ this.setLineNumberForProducts();
42
+ this.createdAt = this.getDate(this.transactionDocument.createdAt);
43
+ this.updatedAt = this.getDate(this.transactionDocument.updatedAt);
44
+ }
45
+ getPosbasketInfo() {
46
+ this.rjObject['Keyword'] = this.generateKeyword();
47
+ this.rjObject['ID'] = this.generateId(this.createdAt);
48
+ this.rjObject['XMLSchemaVersion'] = '2';
49
+ this.rjObject['LastUpdated'] = this.updatedAt;
50
+ this.rjObject['MajorVersion'] = this.majorVersion;
51
+ this.rjObject['MinorVersion'] = this.minorVersion;
52
+ this.rjObject['ManifestVersion'] = this.manifestVersion;
53
+ this.rjObject['DatabaseSchemaVersion'] = this.databaseSchemaVersion;
54
+ this.rjObject['BasketType'] = this.basketType;
55
+ this.rjObject['State'] = this.getState();
56
+ this.rjObject['ExternalState'] = this.externalState;
57
+ return this;
58
+ }
59
+ getheaderInfo() {
60
+ this.rjObject['Header'] = {};
61
+ this.rjObject['Header'].TimeZoneOffset = this.convertToString(this.generateTimezoneoffset(this.transactionDocument.createdAt));
62
+ this.rjObject['Header'].DateTimeCreated = this.createdAt;
63
+ this.rjObject['Header'].OriginatedBy = {};
64
+ this.rjObject['Header'].OriginatedBy.DeviceID = this.deviceId;
65
+ this.rjObject['Header'].OriginatedBy.CashierID = this.cashierId;
66
+ this.rjObject['Header'].OriginatedBy.CompanyID = this.companyId;
67
+ this.rjObject['Header'].OriginatedBy.StoreID = this.transactionDocument.storeId;
68
+ this.rjObject['Header'].OriginatedBy.BranchID = this.branchId;
69
+ this.rjObject['Header'].OriginatedBy.TerminalNumber = this.terminalNumber;
70
+ this.rjObject['Header'].OriginatedBy.TransactionNumber = this.transactionNumber;
71
+ this.rjObject['Header'].TaxMethodID = this.taxMethodId;
72
+ this.rjObject['Header'].DynamicStockLookup = this.generateDynamicStockLookUp();
73
+ this.rjObject['Header'].BasketLanguageID = this.basketLanguageId; //todo
74
+ this.rjObject['Header'].BasketCountryID = this.basketCountryId; //todo
75
+ this.rjObject['Header'].BasketCurrencyID = this.transactionDocument.baseCurrency;
76
+ this.rjObject['Header'].TradingRegionID = this.tradingRegionId;
77
+ this.rjObject['Header'].Eurozone = " "; //unknown
78
+ this.rjObject['Header'].EuroBaseExchangeRate = ""; //unknown
79
+ this.rjObject['Header'].PrintableName = this.transactionDocument.userName; //unknown
80
+ return this;
81
+ }
82
+ rjMapper() {
83
+ var transactionDiscount = [];
84
+ if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {
85
+ transactionDiscount = this.transactionDocument.basket.transactionDiscount;
86
+ }
87
+ if (this.transactionDocument.type === TRANSACTION_TYPE.SALE) {
88
+ this.rjObject['ProductSale'] = [];
89
+ this.rjObject['ModifierItem'] = [];
90
+ this.transactionDocument.basket.products.forEach((element) => {
91
+ let lineDiscount = [];
92
+ if (this.transactionDocument.basket.lineDiscount && this.transactionDocument.basket.lineDiscount.length > 0) {
93
+ lineDiscount = this.transactionDocument.basket.lineDiscount.filter((x) => x.itemLineId === element.itemLineId);
94
+ if (lineDiscount.length > 0) {
95
+ const index = this.transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);
96
+ if (index > -1) {
97
+ this.transactionDocument.basket.lineDiscount.splice(index, 1);
98
+ }
99
+ }
100
+ }
101
+ let data = this.addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
102
+ this.rjObject['ProductSale'].push(data);
103
+ this.getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);
104
+ });
105
+ let transactionPromotion = [];
106
+ if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {
107
+ transactionPromotion = this.transactionDocument.basket.transactionPromotion;
108
+ this.getTransactionPromotion(transactionPromotion);
109
+ }
110
+ }
111
+ else if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
112
+ this.rjObject['ProductReturn'] = [];
113
+ this.rjObject['ModifierItem'] = [];
114
+ this.transactionDocument.basket.products.forEach((element) => {
115
+ let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
116
+ this.rjObject['ProductReturn'].push(data);
117
+ this.getModifierItem(element.lineDiscount, element.itemLineId);
118
+ });
119
+ }
120
+ else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
121
+ this.rjObject['ProductReturn'] = [];
122
+ this.rjObject['ModifierItem'] = [];
123
+ let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
124
+ transactionDoc.basket.products.forEach((element) => {
125
+ let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
126
+ let obj = {
127
+ "OriginalReceiptSupplied": 0,
128
+ "OriginalBranchID": 0,
129
+ "OriginalTerminalNumber": 0,
130
+ "OriginalTransactionNumber": 0,
131
+ "OriginalCashierNumber": 0
132
+ };
133
+ data['Return'] = Object.assign(Object.assign({}, data['Return']), obj);
134
+ this.rjObject['ProductReturn'].push(data);
135
+ this.getModifierItem(element.lineDiscount, element.itemLineId);
136
+ });
137
+ }
138
+ else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
139
+ this.rjObject['ProductReturn'] = [];
140
+ this.rjObject['ProductSale'] = [];
141
+ this.rjObject['ModifierItem'] = [];
142
+ let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
143
+ transactionDoc.basket.products.forEach((element) => {
144
+ if (element.refundedQuantity > 0) {
145
+ let returnProduct = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
146
+ let obj = {
147
+ "OriginalReceiptSupplied": 0,
148
+ "OriginalBranchID": 0,
149
+ "OriginalTerminalNumber": 0,
150
+ "OriginalTransactionNumber": 0,
151
+ "OriginalCashierNumber": 0
152
+ };
153
+ returnProduct['Return'] = Object.assign(Object.assign({}, returnProduct['Return']), obj);
154
+ this.rjObject['ProductReturn'].push(returnProduct);
155
+ }
156
+ else {
157
+ let addProduct = this.addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
158
+ this.rjObject['ProductSale'].push(addProduct);
159
+ }
160
+ this.getModifierItem(element.lineDiscount, element.itemLineId);
161
+ });
162
+ }
163
+ return this;
164
+ }
165
+ getBasketDiscount() {
166
+ if (!this.transactionDocument.basket.transactionDiscount)
167
+ return this;
168
+ this.rjObject['BasketDiscount'] = [];
169
+ this.transactionDocument.basket.transactionDiscount.forEach((element) => {
170
+ let obj = {};
171
+ obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
172
+ obj['DeviceID'] = this.deviceId;
173
+ obj['DateTimeCreated'] = this.updatedAt;
174
+ obj['NetValue'] = this.convertToString(element.discountAmount * -1);
175
+ obj['EffectiveNetValue'] = this.convertToString(element.discountAmount * -1);
176
+ obj['Description'] = element.reasonDisplayText;
177
+ obj['UserID'] = this.transactionDocument.userName;
178
+ obj['ReasonCodeID'] = element.reasonCode;
179
+ obj['DiscountType'] = this.convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1);
180
+ obj['RoundingRule'] = this.convertToString(2);
181
+ obj['ModifiedLineNumber'] = element.itemLineIds;
182
+ obj['LineNumber'] = this.convertToString(this.generateLineNumber());
183
+ obj['DiscountedValue'] = this.transactionDocument.basketSummary.basketTotal + this.transactionDocument.basketSummary.discountTotal;
184
+ if (element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()) {
185
+ obj['DiscountPercentage'] = this.convertToString((element.discountAmount / this.transactionDocument.basketSummary.basketTotal).toFixed(1));
186
+ }
187
+ if (this.transactionDocument.type === 'REFUND') {
188
+ obj['NetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
189
+ obj['EffectiveNetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
190
+ }
191
+ this.rjObject['BasketDiscount'].push(obj);
192
+ });
193
+ return this;
194
+ }
195
+ getModifierItem(data, lineNo) {
196
+ if (data && lineNo) {
197
+ let obj = {};
198
+ obj.XMLSchemaVersion = 1;
199
+ obj.LineNumber = this.generateLineNumber();
200
+ obj.NetValue = 0;
201
+ obj.EffectiveNetValue = 0;
202
+ obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;
203
+ obj.DeviceID = this.deviceId;
204
+ obj.UserID = this.transactionDocument.userName;
205
+ obj.DateTimeCreated = this.updatedAt;
206
+ obj.AuthorisingUserID = this.transactionDocument.userName;
207
+ obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;
208
+ obj.ModifiedLineNumber = lineNo;
209
+ obj.ModifiedIndex = 1;
210
+ this.rjObject['ModifierItem'].push(obj);
211
+ }
212
+ }
213
+ getTrailerInfo() {
214
+ this.rjObject['Trailer'] = {};
215
+ this.rjObject.Trailer.DateTimeCompleted = this.updatedAt;
216
+ this.rjObject.Trailer.CompletedBy = {};
217
+ this.rjObject.Trailer.CompletedBy.DeviceID = this.deviceId;
218
+ this.rjObject.Trailer.CompletedBy.CashierID = this.cashierId;
219
+ this.rjObject.Trailer.CompletedBy.StoreID = this.transactionDocument.storeId;
220
+ this.rjObject.Trailer.CompletedBy.BranchID = this.branchId;
221
+ this.rjObject.Trailer.CompletedBy.TerminalNumber = this.terminalNumber;
222
+ this.rjObject.Trailer.CompletedBy.TransactionNumber = this.transactionNumber;
223
+ this.rjObject.Trailer.Total = this.convertToString(this.transactionDocument.basketSummary.basketTotal * 100);
224
+ this.rjObject.Trailer.ItemCount = this.itemCount; //gives total count for product
225
+ this.rjObject.Trailer.ItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
226
+ this.rjObject.Trailer.NetItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
227
+ this.rjObject.Trailer.TaxTotal = this.convertToString(this.removeDecimal(this.transactionDocument.basketSummary.VATTotal));
228
+ this.rjObject.Trailer.SequenceDeviceID = this.deviceId;
229
+ this.rjObject.Trailer.SequenceNumber = 'snsn'; //static for now
230
+ this.rjObject['Trailer']['TaxItem'] = [];
231
+ this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element) => {
232
+ let obj = {};
233
+ obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
234
+ obj['TaxRate'] = this.convertToString(element.VATCode);
235
+ obj['TaxableTotal'] = this.convertToString(this.removeDecimal(element.taxableAmount));
236
+ obj['TaxTotal'] = this.convertToString(this.removeDecimal(this.removeDecimal(element.taxLineTotal)));
237
+ obj['TaxDescription'] = this.convertToString(element.VATCode);
238
+ obj['TaxIncluded'] = '1';
239
+ obj['TaxPercentage'] = this.addDecimal(element.VAT.toFixed(2)).toFixed(2);
240
+ this.rjObject['Trailer']['TaxItem'].push(obj);
241
+ });
242
+ if (this.transactionDocument.basket.linePromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
243
+ this.rjObject['Trailer']['PromotionItem'] = [];
244
+ if (this.transactionDocument.basket.linePromotion.length > 0) {
245
+ this.transactionDocument.basket.linePromotion.forEach((element) => {
246
+ let obj = {};
247
+ obj['PromotionID'] = element.promotionId;
248
+ obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
249
+ obj['PromotionQuantity'] = "1";
250
+ obj['PromotionDescription'] = element.displayText;
251
+ obj['PromotionHit'] = {};
252
+ obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
253
+ obj['PromotionHit']['HitNumber'] = "1";
254
+ obj['PromotionHit']['HitQuantity'] = "1";
255
+ obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
256
+ obj['PromotionHit']['PromotionTrigger'] = {};
257
+ let product = this.transactionDocument.basket.products.find((item) => item.itemLineId == element.itemLineId);
258
+ obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = this.xmlSchemaVersion;
259
+ obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;
260
+ obj['PromotionHit']['PromotionTrigger']['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
261
+ obj['PromotionHit']['PromotionTrigger']['LineNumber'] = this.getNumber(product.SKU);
262
+ obj['PromotionHit']['PromotionTrigger']['Quantity'] = this.convertToString(product.quantity.toFixed(1));
263
+ obj['PromotionHit']['PromotionTrigger']['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == element.itemLineId).VATCode;
264
+ this.rjObject['Trailer']['PromotionItem'].push(obj);
265
+ });
266
+ }
267
+ if (this.transactionDocument.basket.transactionPromotion.length > 0) {
268
+ this.transactionDocument.basket.transactionPromotion.forEach((element) => {
269
+ let obj = {};
270
+ obj['PromotionID'] = element.promotionId;
271
+ obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
272
+ obj['PromotionQuantity'] = "1";
273
+ obj['PromotionDescription'] = element.displayText;
274
+ obj['PromotionHit'] = {};
275
+ obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
276
+ obj['PromotionHit']['HitNumber'] = "1";
277
+ obj['PromotionHit']['HitQuantity'] = "1";
278
+ obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
279
+ obj['PromotionHit']['PromotionTrigger'] = [];
280
+ this.transactionDocument.basket.products.forEach((product) => {
281
+ let promotionTrigger = {};
282
+ element.itemLineIds.forEach((itemLineId) => {
283
+ if (JSON.stringify(itemLineId) === product.itemLineId) {
284
+ promotionTrigger['XMLSchemaVersion'] = this.xmlSchemaVersion;
285
+ promotionTrigger['ProductID'] = product.SKU;
286
+ promotionTrigger['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
287
+ promotionTrigger['LineNumber'] = this.getNumber(product.SKU);
288
+ promotionTrigger['Quantity'] = this.convertToString(product.quantity);
289
+ promotionTrigger['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == product.itemLineId).VATCode;
290
+ obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);
291
+ }
292
+ });
293
+ });
294
+ this.rjObject['Trailer']['PromotionItem'].push(obj);
295
+ });
296
+ }
297
+ }
298
+ return this;
299
+ }
300
+ getTenderInfo() {
301
+ if (this.transactionDocument.paymentDetails && this.transactionDocument.paymentDetails.length > 0) {
302
+ this.transactionDocument.paymentDetails.forEach((element) => {
303
+ if (element.externalTenderKey) {
304
+ this.rjObject[element.externalTenderKey] = [];
305
+ if (element.paymentType.toUpperCase() === 'GIFT CARD') {
306
+ let obj = {
307
+ XMLSchemaVersion: this.xmlSchemaVersion,
308
+ LineNumber: this.generateLineNumber(),
309
+ NetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
310
+ EffectiveNetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
311
+ Description: this.getDescription(element),
312
+ DeviceID: this.deviceId,
313
+ UserID: this.transactionDocument.userName,
314
+ DateTimeCreated: this.updatedAt,
315
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
316
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
317
+ TenderAmount: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
318
+ CurrencyID: this.transactionDocument.baseCurrency,
319
+ CurrencyDescription: this.transactionDocument.baseCurrency,
320
+ GiftVoucherSalesAllowed: '',
321
+ AllowRechargeableVoucherSales: '',
322
+ GiftVoucherID: ''
323
+ };
324
+ this.rjObject[element.externalTenderKey].push(obj);
325
+ }
326
+ else {
327
+ let obj1 = {
328
+ XMLSchemaVersion: "1",
329
+ LineNumber: this.generateLineNumber(),
330
+ NetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
331
+ EffectiveNetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
332
+ Description: this.getDescription(element),
333
+ DeviceID: this.deviceId,
334
+ UserID: this.transactionDocument.userName,
335
+ DateTimeCreated: this.updatedAt,
336
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
337
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
338
+ TenderAmount: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
339
+ CurrencyID: this.transactionDocument.baseCurrency,
340
+ CurrencyDescription: this.transactionDocument.baseCurrency,
341
+ IncludeInTransactionTotalCheck: "1",
342
+ AllowRechargeableVoucherSales: "1",
343
+ OpenDrawerAtEnd: "1"
344
+ };
345
+ this.rjObject[element.externalTenderKey].push(obj1);
346
+ }
347
+ }
348
+ else {
349
+ this.rjObject['CashTender'] = [];
350
+ if (element.paymentType.toUpperCase() === 'GIFT CARD') {
351
+ let obj = {
352
+ XMLSchemaVersion: this.xmlSchemaVersion,
353
+ LineNumber: this.generateLineNumber(),
354
+ NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
355
+ EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
356
+ Description: this.getDescription(element),
357
+ DeviceID: this.deviceId,
358
+ UserID: this.transactionDocument.userName,
359
+ DateTimeCreated: this.updatedAt,
360
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
361
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
362
+ TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
363
+ CurrencyID: this.transactionDocument.baseCurrency,
364
+ CurrencyDescription: this.transactionDocument.baseCurrency,
365
+ GiftVoucherSalesAllowed: '',
366
+ AllowRechargeableVoucherSales: '',
367
+ GiftVoucherID: ''
368
+ };
369
+ this.rjObject['CashTender'].push(obj);
370
+ }
371
+ else {
372
+ let obj1 = {
373
+ XMLSchemaVersion: "1",
374
+ LineNumber: this.generateLineNumber(),
375
+ NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
376
+ EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
377
+ Description: this.getDescription(element),
378
+ DeviceID: this.deviceId,
379
+ UserID: this.transactionDocument.userName,
380
+ DateTimeCreated: this.updatedAt,
381
+ TenderType: element.externalTenderType ? element.externalTenderType : '',
382
+ TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
383
+ TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
384
+ CurrencyID: this.transactionDocument.baseCurrency,
385
+ CurrencyDescription: this.transactionDocument.baseCurrency,
386
+ IncludeInTransactionTotalCheck: "1",
387
+ AllowRechargeableVoucherSales: "1",
388
+ OpenDrawerAtEnd: "1"
389
+ };
390
+ this.rjObject['CashTender'].push(obj1);
391
+ }
392
+ }
393
+ });
394
+ }
395
+ return this;
396
+ }
397
+ getNumber(productId) {
398
+ let lineNumber;
399
+ for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {
400
+ const element = this.rjObject['ProductSale'][i];
401
+ if (JSON.stringify(productId) === JSON.stringify(element.ProductID)) {
402
+ lineNumber = element.LineNumber;
403
+ break;
404
+ }
405
+ }
406
+ return lineNumber;
407
+ }
408
+ setLineNumberForProducts() {
409
+ let itemLineIdArray = [];
410
+ itemLineIdArray = this.transactionDocument.basket.products.map((product) => {
411
+ return parseInt(product.itemLineId);
412
+ });
413
+ this.largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
414
+ }
415
+ generateLineNumber() {
416
+ this.largestNumber += 1;
417
+ this.itemCount += 1;
418
+ return this.largestNumber;
419
+ }
420
+ initilizeItemCount() {
421
+ this.itemCount = this.transactionDocument.basket.products.length;
422
+ }
423
+ build() {
424
+ return this.rjObject;
425
+ }
426
+ getDescription(element) {
427
+ if (element.paymentType.toUpperCase() === 'CARD') {
428
+ return element.cardType;
429
+ }
430
+ else {
431
+ return element.paymentType;
432
+ }
433
+ }
434
+ getMMGROUPID(attributes) {
435
+ if (attributes && attributes.length > 0) {
436
+ let filterValue = attributes.filter((attribute) => attribute.name === "MMGROUPID");
437
+ if (filterValue && filterValue.length > 0) {
438
+ return filterValue[0].value;
439
+ }
440
+ }
441
+ }
442
+ setDeviceInfo(id) {
443
+ this.deviceId = id;
444
+ return this;
445
+ }
446
+ removeDecimal(value) {
447
+ return value * 100;
448
+ }
449
+ addDecimal(value) {
450
+ return value / 100;
451
+ }
452
+ setTransactionNumber(value) {
453
+ this.transactionNumber = value;
454
+ return this;
455
+ }
456
+ setManifestVersion(value) {
457
+ this.manifestVersion = value;
458
+ return this;
459
+ }
460
+ setDatabaseSchemaVersion(value) {
461
+ this.databaseSchemaVersion = value;
462
+ return this;
463
+ }
464
+ setBasketType(value) {
465
+ this.basketType = value;
466
+ return this;
467
+ }
468
+ setTradingRegionID(value) {
469
+ this.tradingRegionId = value;
470
+ return this;
471
+ }
472
+ setCompanyID(value) {
473
+ this.companyId = value;
474
+ return this;
475
+ }
476
+ setTaxMethodID(value) {
477
+ this.taxMethodId = value;
478
+ return this;
479
+ }
480
+ setMajorVersion(value) {
481
+ this.majorVersion = value;
482
+ return this;
483
+ }
484
+ setMinorVersion(value) {
485
+ this.minorVersion = value;
486
+ return this;
487
+ }
488
+ setXMLSchemaVersion(value) {
489
+ this.xmlSchemaVersion = value;
490
+ return this;
491
+ }
492
+ setExternalState(value) {
493
+ this.externalState = value;
494
+ return this;
495
+ }
496
+ setCashierID() {
497
+ this.cashierId = (this.transactionDocument && this.transactionDocument.userName) ? this.transactionDocument.userName : '';
498
+ return this;
499
+ }
500
+ setTerminalNumber(value) {
501
+ this.terminalNumber = value;
502
+ return this;
503
+ }
504
+ setBasketLanguageID(value) {
505
+ this.basketLanguageId = value;
506
+ return this;
507
+ }
508
+ setBasketCountryID(value) {
509
+ this.basketCountryId = value;
510
+ return this;
511
+ }
512
+ setBasketCurrencyID(value) {
513
+ this.basketCurrencyId = value;
514
+ return this;
515
+ }
516
+ setBranchID(value) {
517
+ this.branchId = value;
518
+ return this;
519
+ }
520
+ setSalesPersonName(value) {
521
+ this.salesPersonName = value;
522
+ return this;
523
+ }
524
+ generateId(date) {
525
+ let newDateTime = date.replace(/[^0-9]/g, '');
526
+ let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();
527
+ return id;
528
+ }
529
+ generateTimezoneoffset(date) {
530
+ let x = date ? date : '';
531
+ return new Date(x).getTimezoneOffset();
532
+ }
533
+ generateKeyword() {
534
+ let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();
535
+ return x;
536
+ }
537
+ getState() {
538
+ if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {
539
+ return 'Completed';
540
+ }
541
+ else {
542
+ return 'Cancelled';
543
+ }
544
+ }
545
+ returnProduct(element, lineDiscount, transactionDiscount) {
546
+ let obj = {};
547
+ let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
548
+ obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
549
+ obj['LineNumber'] = element['itemLineId'];
550
+ obj['NetValue'] = this.removeDecimal(element['refundedTotal']);
551
+ obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);
552
+ obj['Description'] = element['description'];
553
+ obj['DeviceID'] = this.transactionDocument['terminalId'];
554
+ obj['UserID'] = this.transactionDocument.userName;
555
+ obj['DateTimeCreated'] = this.createdAt;
556
+ obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice'] * -1);
557
+ obj['UnitPrice'] = this.removeDecimal(element['price']);
558
+ obj['Quantity'] = this.getQuantity(element);
559
+ obj['OriginalTaxAmountSet'] = 1;
560
+ obj['ProductID'] = element['SKU'];
561
+ obj['HandKeyed'] = 1;
562
+ obj['LongDescription'] = element['description'];
563
+ obj['Return'] = {};
564
+ obj['Return']['ReturnReasonID'] = element['refundedReason'];
565
+ obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];
566
+ obj['Return']['ReturnToStock'] = this.getQuantity(element);
567
+ obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode;
568
+ obj['DisplayTaxCode'] = ''; // todo
569
+ obj['ProductAttributes'] = ''; //todo - not required
570
+ obj['Perishable'] = this.getMMGROUPID(element.attributes);
571
+ //obj['MMGroupID'] = this.getCaregories(element);
572
+ obj['MMGroupID'] = this.getMMGROUPID(element.attributes);
573
+ obj['CustomerDetails'] = ""; // todo - blank
574
+ obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO
575
+ obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT) * -1)).toFixed(2));
576
+ obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ? (taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));
577
+ if (lineDiscount) {
578
+ if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
579
+ // line discount
580
+ obj['Discount'] = {};
581
+ obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
582
+ obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
583
+ obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
584
+ obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
585
+ obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
586
+ obj['Discount'].DiscountType = lineDiscount.discountType;
587
+ obj['Discount'].XMLSchemaVersion = 1;
588
+ obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
589
+ obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
590
+ obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
591
+ obj['Discount'].RoundingRule = 2;
592
+ }
593
+ if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
594
+ //price override
595
+ obj['PriceOverride'] = {};
596
+ obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
597
+ obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
598
+ obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
599
+ obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
600
+ obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
601
+ obj['PriceOverride'].XMLSchemaVersion = 1;
602
+ obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
603
+ obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
604
+ }
605
+ //update the product price
606
+ obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
607
+ obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
608
+ obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
609
+ obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
610
+ }
611
+ if (transactionDiscount) {
612
+ obj['BasketDiscountModifier'] = [];
613
+ this.transactionDocument.basket.transactionDiscount.forEach((e) => {
614
+ let discountObj = {};
615
+ e.itemLineIds.forEach((x) => {
616
+ if (x == element.itemLineId) {
617
+ var discountAmount = this.convertToString(e.discountAmount * -1);
618
+ discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
619
+ discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
620
+ discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);
621
+ obj['BasketDiscountModifier'].push(discountObj);
622
+ }
623
+ });
624
+ });
625
+ var totaltransactionDiscount = 0;
626
+ obj['BasketDiscountModifier'].forEach((value) => {
627
+ totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
628
+ });
629
+ //update the product price
630
+ obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
631
+ }
632
+ if (this.transactionDocument.basket.transactionPromotion.length > 0) {
633
+ obj['PromotionSaving'] = [];
634
+ this.transactionDocument.basket.transactionPromotion.forEach((transactionPromo) => {
635
+ let promotionObj = {};
636
+ transactionPromo.itemLineIds.forEach((itemLineId) => {
637
+ if (itemLineId == element.itemLineId) {
638
+ promotionObj.ModifierValue = transactionPromo.promotionAmount;
639
+ promotionObj.ModifierDateTime = this.transactionDocument.createdAt;
640
+ promotionObj.ModifierDescription = transactionPromo.displayText;
641
+ promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;
642
+ promotionObj.PromotionID = transactionPromo.promotionId;
643
+ promotionObj.PromotionDescription = transactionPromo.displayText;
644
+ promotionObj.HitNumber = '1';
645
+ promotionObj.PromotionHitProductQuantity = this.getQuantity(element);
646
+ promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;
647
+ obj['PromotionSaving'].push(promotionObj);
648
+ }
649
+ });
650
+ });
651
+ }
652
+ return obj;
653
+ }
654
+ addProduct(element, lineDiscount, transactionDiscount) {
655
+ let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
656
+ let obj = {
657
+ XMLSchemaVersion: this.xmlSchemaVersion,
658
+ LineNumber: element.itemLineId,
659
+ NetValue: this.removeDecimal(element.totalLinePrice),
660
+ EffectiveNetValue: this.removeDecimal(element.totalLinePrice),
661
+ Description: element.description,
662
+ DeviceID: this.deviceId,
663
+ UserID: this.transactionDocument.userName,
664
+ DateTimeCreated: this.createdAt,
665
+ ExtendedValue: this.removeDecimal(element.price),
666
+ UnitPrice: this.removeDecimal(element.price),
667
+ //MMGroupID: this.getCaregories(element),
668
+ Quantity: element.quantity,
669
+ SalespersonID: this.transactionDocument.userName,
670
+ SalespersonName: this.salesPersonName,
671
+ TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode,
672
+ TaxModifiable: "1",
673
+ OriginalTaxAmount: this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT)).toFixed(2))),
674
+ TaxAmount: this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),
675
+ OriginalTaxAmountSet: "1",
676
+ ProductID: element.SKU,
677
+ HandKeyed: "1",
678
+ CustomerDetails: "",
679
+ Perishable: this.getMMGROUPID(element.attributes),
680
+ MMGroupID: this.getMMGROUPID(element.attributes)
681
+ };
682
+ if (lineDiscount) {
683
+ if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
684
+ // line discount
685
+ obj['Discount'] = {};
686
+ obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
687
+ obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
688
+ obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
689
+ obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
690
+ obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
691
+ obj['Discount'].DiscountType = lineDiscount.discountType;
692
+ obj['Discount'].XMLSchemaVersion = 1;
693
+ obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
694
+ obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
695
+ obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
696
+ obj['Discount'].RoundingRule = 2;
697
+ }
698
+ if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
699
+ //price override
700
+ obj['PriceOverride'] = {};
701
+ obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
702
+ obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
703
+ obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
704
+ obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
705
+ obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
706
+ obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;
707
+ obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
708
+ obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
709
+ }
710
+ //update the product price
711
+ obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
712
+ obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
713
+ obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
714
+ obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
715
+ }
716
+ if (transactionDiscount) {
717
+ obj['BasketDiscountModifier'] = [];
718
+ this.transactionDocument.basket.transactionDiscount.forEach((e) => {
719
+ let discountObj = {};
720
+ e.itemLineIds.forEach((itemLineId) => {
721
+ if (itemLineId == element.itemLineId) {
722
+ let discountAmount = this.convertToString(e.discountAmount * -1);
723
+ discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
724
+ discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));
725
+ discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
726
+ obj['BasketDiscountModifier'].push(discountObj);
727
+ }
728
+ });
729
+ });
730
+ let totaltransactionDiscount = 0;
731
+ obj['BasketDiscountModifier'].forEach((value) => {
732
+ totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
733
+ });
734
+ //update the product price
735
+ obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
736
+ }
737
+ if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
738
+ obj['DistributedPromotionSaving'] = [];
739
+ if (this.transactionDocument.basket.transactionPromotion.length > 0) {
740
+ this.transactionDocument.basket.transactionPromotion.forEach((e) => {
741
+ let promotionObj = {};
742
+ e.itemLineIds.forEach((itemLineId) => {
743
+ if (itemLineId == element.itemLineId) {
744
+ promotionObj.PromotionID = e.promotionId;
745
+ promotionObj.Hit = '1';
746
+ promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);
747
+ promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);
748
+ obj['DistributedPromotionSaving'].push(promotionObj);
749
+ }
750
+ });
751
+ });
752
+ }
753
+ if (this.transactionDocument.basket.linePromotion.length > 0) {
754
+ this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
755
+ let promotionObj = {};
756
+ if (element.itemLineId == linePromotion.itemLineId) {
757
+ promotionObj.PromotionID = linePromotion.promotionId;
758
+ promotionObj.Hit = "1";
759
+ promotionObj.Saving = linePromotion.promotionLinePrice;
760
+ promotionObj.ISaving = linePromotion.promotionLinePrice;
761
+ obj['DistributedPromotionSaving'].push(promotionObj);
762
+ }
763
+ });
764
+ }
765
+ let transactionPromotion = 0;
766
+ obj['DistributedPromotionSaving'].forEach((value) => {
767
+ transactionPromotion = transactionPromotion + value.Saving;
768
+ });
769
+ obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;
770
+ }
771
+ return obj;
772
+ }
773
+ getSaving(price, promotionAmount) {
774
+ let Saving = (price * promotionAmount) / this.transactionDocument.basketSummary.saleTotal;
775
+ return Saving;
776
+ }
777
+ getLineNumber(value, discountAmount) {
778
+ let lineNumber;
779
+ for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {
780
+ const element = this.rjObject['BasketDiscount'][i];
781
+ if (value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue) {
782
+ lineNumber = element.LineNumber;
783
+ break;
784
+ }
785
+ }
786
+ return lineNumber;
787
+ }
788
+ getDiscountedValue(price, discountAmount) {
789
+ let DiscountedValue = ((price * discountAmount) / this.transactionDocument.basketSummary.saleTotal) * 100;
790
+ return DiscountedValue;
791
+ }
792
+ getOriginalTax(element, VAT) {
793
+ let pricebeforetax = (element.price * 100) / (100 + VAT);
794
+ let originaltax = element.price - pricebeforetax;
795
+ return originaltax;
796
+ }
797
+ convertToString(value) {
798
+ try {
799
+ value = JSON.stringify(value);
800
+ return value;
801
+ }
802
+ catch (e) {
803
+ AppLoggerService.logError(this.className, "convertToString", 'can not be converted in string', e);
804
+ }
805
+ }
806
+ generateDynamicStockLookUp() {
807
+ let x = '0';
808
+ this.transactionDocument.basket.products.forEach((element) => {
809
+ if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {
810
+ x = '1';
811
+ }
812
+ });
813
+ return x;
814
+ }
815
+ // getAttributes(){
816
+ // let name: string | any[] = []
817
+ // this.transactionDocument.basket.products.forEach((element: any) => {
818
+ // if (element && element.attributes && element.attributes.length > 0) {
819
+ // name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());
820
+ // }
821
+ // });
822
+ // if (name.length > 0) {
823
+ // return name[0].value
824
+ // }
825
+ // else{
826
+ // return ""
827
+ // }
828
+ // }
829
+ // getCaregories(element) {
830
+ // let MMGroupId = " ";
831
+ // if (element.categories && element.categories.length > 0) {
832
+ // let categories = element.categories.filter((x) => x.parentId != '');
833
+ // let value = categories.filter((x) => x.id != x.parentId);
834
+ // MMGroupId = value[0].name;
835
+ // }
836
+ // return MMGroupId;
837
+ // }
838
+ getDate(date) {
839
+ let offset = this.generateTimezoneoffset(date) * -1;
840
+ let offsetHours = Math.abs(Math.floor(offset / 60));
841
+ let offsetMinutes = Math.abs(offset) - offsetHours * 60;
842
+ let offsetSign = '+';
843
+ if (offset < 0) {
844
+ offsetSign = '-';
845
+ }
846
+ let newdate = date.substring(0, 19);
847
+ const x = (newdate + offsetSign + String(offsetHours).padStart(2, '0') + ':' + String(offsetMinutes).padStart(2, '0')).toString();
848
+ return x;
849
+ }
850
+ getTransactionPromotion(transactionPromotion) {
851
+ if (transactionPromotion && transactionPromotion.length > 0) {
852
+ this.rjObject['PromoVoucherItem'] = {};
853
+ this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;
854
+ this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();
855
+ this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
856
+ this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
857
+ this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;
858
+ this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;
859
+ this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;
860
+ this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;
861
+ this.rjObject['PromoVoucherItem']['ProductId'] = ""; //todo
862
+ this.rjObject['PromoVoucherItem']['SerialNumber'] = ""; //todo
863
+ this.rjObject['PromoVoucherItem']['MMGroupId'] = "";
864
+ }
865
+ }
866
+ getQuantity(element) {
867
+ let quantity;
868
+ if (this.transactionDocument.unreferencedRefund) {
869
+ quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);
870
+ }
871
+ else {
872
+ quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);
873
+ }
874
+ return quantity;
875
+ }
876
+ }
877
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkotbWFwcGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWFwcGVyLWxpYnJhcnkvc3JjL2xpYi9SSi1tYXBwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBb0UsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN6SSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUN0RixNQUFNLE9BQU8sb0JBQW9CO0lBNkI3QixZQUFZLGNBQW9DO1FBM0JoRCxjQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFtQjNCLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUtsQixhQUFRLEdBQVEsRUFBRSxDQUFBO1FBR3RCLElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxjQUFjLENBQUM7U0FDN0M7YUFBTTtZQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRztnQkFDdkIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3hCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxXQUFXLEVBQUUsRUFBRTtnQkFDZixrQkFBa0IsRUFBRSxFQUFFO2dCQUN0QixRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixnQkFBZ0IsRUFBRSxTQUFTO2dCQUMzQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsRUFBUztnQkFDakIsYUFBYSxFQUFFLEVBQVM7Z0JBQ3hCLFlBQVksRUFBRSxFQUFFO2dC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QUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBRSxDQUFDLE1BQU07WUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBWTtRQUNwQixJQUFJLFFBQVEsQ0FBQTtRQUNaLElBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFDO1lBQzNDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNyRjthQUNHO1lBQ0EsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1NBQzdHO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRElTQ09VTlRUWVBFLCBMaW5lRGlzY291bnQsIFRQcm9kdWN0LCBUcmFuc2FjdGlvbkRpc2NvdW50LCBUcmFuc2FjdGlvbkRvY3VtZW50LCBUUkFOU0FDVElPTl9UWVBFIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIlxuaW1wb3J0IHsgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgfSBmcm9tIFwiLi9UcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlclwiO1xuaW1wb3J0IHtBcHBMb2dnZXJTZXJ2aWNlfSBmcm9tICdAcG1jcmV0YWlsL2NvbW1vbi1zZXJ2aWNlcy9jb21tb24vYXBwLWxvZ2dlci5zZXJ2aWNlJztcbmV4cG9ydCBjbGFzcyBSSk1hcHBlckJ1aWxkZXJDbGFzcyB7XG5cbiAgICBjbGFzc05hbWUgPSBcIlJKTWFwcGVyQnVpbGRlckNsYXNzXCI7XG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50O1xuICAgIHByaXZhdGUgZGV2aWNlSWQ6IGFueTtcbiAgICBwcml2YXRlIHRyYW5zYWN0aW9uTnVtYmVyOiBhbnk7XG4gICAgcHJpdmF0ZSBtYW5pZmVzdFZlcnNpb246IGFueTtcbiAgICBwcml2YXRlIGRhdGFiYXNlU2NoZW1hVmVyc2lvbjogYW55O1xuICAgIHByaXZhdGUgYmFza2V0VHlwZTogYW55O1xuICAgIHByaXZhdGUgeG1sU2NoZW1hVmVyc2lvbjogYW55O1xuICAgIHByaXZhdGUgbWFqb3JWZXJzaW9uOiBhbnk7XG4gICAgcHJpdmF0ZSBtaW5vclZlcnNpb246IGFueTtcbiAgICBwcml2YXRlIGV4dGVybmFsU3RhdGU6IGFueTtcbiAgICBwcml2YXRlIGNhc2hpZXJJZDogYW55O1xuICAgIHByaXZhdGUgY29tcGFueUlkOiBhbnk7XG4gICAgcHJpdmF0ZSB0ZXJtaW5hbE51bWJlcjogYW55O1xuICAgIHByaXZhdGUgdGF4TWV0aG9kSWQ6IGFueTtcbiAgICBwcml2YXRlIHRyYWRpbmdSZWdpb25JZDogYW55O1xuICAgIHByaXZhdGUgYmFza2V0Q3VycmVuY3lJZDogYW55O1xuICAgIHByaXZhdGUgYmFza2V0Q291bnRyeUlkOiBhbnk7XG4gICAgcHJpdmF0ZSBiYXNrZXRMYW5ndWFnZUlkOiBhbnk7XG4gICAgcHJpdmF0ZSBpdGVtQ291bnQgPSAwO1xuICAgIHByaXZhdGUgbGFyZ2VzdE51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBicmFuY2hJZDogYW55O1xuICAgIHByaXZhdGUgY3JlYXRlZEF0OiBhbnk7XG4gICAgcHJpdmF0ZSB1cGRhdGVkQXQgOmFueTtcbiAgICBwcml2YXRlIHNhbGVzUGVyc29uTmFtZTogYW55O1xuICAgIHByaXZhdGUgcmpPYmplY3Q6IGFueSA9IHt9XG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2FjdGlvbkRvYz86IFRyYW5zYWN0aW9uRG9jdW1lbnQpIHtcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uRG9jKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgPSB0cmFuc2FjdGlvbkRvYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiBcIlwiLFxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUmVmOiBcIlwiLFxuICAgICAgICAgICAgICAgIGRhdGVUaW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIG9yZ0NvZGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgc3RvcmVJZDogXCJcIixcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVJZDogXCJcIixcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVTdHJ1Y3R1cmU6IFwiXCIsXG4gICAgICAgICAgICAgICAgZGV2aWNlSWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVybWluYWxJZDogXCJcIixcbiAgICAgICAgICAgICAgICB1c2VySWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgaW5pdGlhdGluZ01vZHVsZTogXCJlQmFza2V0XCIsXG4gICAgICAgICAgICAgICAgZXhwb3J0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiYXNrZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSBhcyBhbnksXG4gICAgICAgICAgICAgICAgYmFzZUN1cnJlbmN5OiBcIlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3RhdHVzOiBcIlwiLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogXCJcIixcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsczoge30gYXMgYW55LFxuICAgICAgICAgICAgICAgIHNhbGVUb3RhbDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWxpemVJdGVtQ291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVyRm9yUHJvZHVjdHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSB0aGlzLmdldERhdGUodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdCk7XG4gICAgICAgIHRoaXMudXBkYXRlZEF0ID0gdGhpcy5nZXREYXRlKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQpO1xuICAgIH1cblxuICAgIGdldFBvc2Jhc2tldEluZm8oKSB7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0tleXdvcmQnXSA9IHRoaXMuZ2VuZXJhdGVLZXl3b3JkKCk7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0lEJ10gPSB0aGlzLmdlbmVyYXRlSWQodGhpcy5jcmVhdGVkQXQpO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydYTUxTY2hlbWFWZXJzaW9uJ10gPSAnMic7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0xhc3RVcGRhdGVkJ10gPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWFqb3JWZXJzaW9uJ10gPSB0aGlzLm1ham9yVmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWlub3JWZXJzaW9uJ10gPSB0aGlzLm1pbm9yVmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWFuaWZlc3RWZXJzaW9uJ10gPSB0aGlzLm1hbmlmZXN0VmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnRGF0YWJhc2VTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLmRhdGFiYXNlU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnQmFza2V0VHlwZSddID0gdGhpcy5iYXNrZXRUeXBlO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydTdGF0ZSddID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydFeHRlcm5hbFN0YXRlJ10gPSB0aGlzLmV4dGVybmFsU3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBnZXRoZWFkZXJJbmZvKCkge1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXSA9IHt9O1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UaW1lWm9uZU9mZnNldCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZ2VuZXJhdGVUaW1lem9uZW9mZnNldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0KSk7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkRhdGVUaW1lQ3JlYXRlZCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkgPSB7fTtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuQ29tcGFueUlEID0gdGhpcy5jb21wYW55SWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5TdG9yZUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5CcmFuY2hJRCA9IHRoaXMuYnJhbmNoSWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UZXJtaW5hbE51bWJlciA9IHRoaXMudGVybWluYWxOdW1iZXI7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UcmFuc2FjdGlvbk51bWJlciA9IHRoaXMudHJhbnNhY3Rpb25OdW1iZXI7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlRheE1ldGhvZElEID0gdGhpcy50YXhNZXRob2RJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRHluYW1pY1N0b2NrTG9va3VwID0gdGhpcy5nZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpO1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRMYW5ndWFnZUlEID0gdGhpcy5iYXNrZXRMYW5ndWFnZUlkOyAvL3RvZG9cbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uQmFza2V0Q291bnRyeUlEID0gdGhpcy5iYXNrZXRDb3VudHJ5SWQ7IC8vdG9kb1xuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRDdXJyZW5jeUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uVHJhZGluZ1JlZ2lvbklEID0gdGhpcy50cmFkaW5nUmVnaW9uSWQ7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm96b25lID0gXCIgXCI7Ly91bmtub3duXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm9CYXNlRXhjaGFuZ2VSYXRlID0gXCJcIjsgLy91bmtub3duXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlByaW50YWJsZU5hbWUgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7IC8vdW5rbm93blxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJqTWFwcGVyKCkge1xuICAgICAgICB2YXIgdHJhbnNhY3Rpb25EaXNjb3VudDphbnkgPSBbXSA7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEUpIHtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVEaXNjb3VudCA9IFtdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmZpbHRlcigoeDogYW55KSA9PiB4Lml0ZW1MaW5lSWQgPT09IGVsZW1lbnQuaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5pbmRleE9mKGxpbmVEaXNjb3VudFswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmFkZFByb2R1Y3QoZWxlbWVudCwgKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwID8gbGluZURpc2NvdW50WzBdIDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwID8gbGluZURpc2NvdW50WzBdIDogbnVsbCwgZWxlbWVudC5pdGVtTGluZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvblByb21vdGlvbih0cmFuc2FjdGlvblByb21vdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuUkVGVU5EKSB7XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107ICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCkge1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddID0gW107XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Eb2M6IGFueSA9IG5ldyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcigpLmJhc2tldCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscykuYnVpbGQoKTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uRG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMucmV0dXJuUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xuICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxSZWNlaXB0U3VwcGxpZWRcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbEJyYW5jaElEXCI6IDAsXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxUZXJtaW5hbE51bWJlclwiOiAwLFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVHJhbnNhY3Rpb25OdW1iZXJcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbENhc2hpZXJOdW1iZXJcIjogMFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZGF0YVsnUmV0dXJuJ10gPSB7Li4uZGF0YVsnUmV0dXJuJ10sIC4uLm9ian07XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0oZWxlbWVudC5saW5lRGlzY291bnQsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uRG9jOiBhbnkgPSBuZXcgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIoKS5iYXNrZXQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpLmJ1aWxkKCk7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbkRvYy5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHVyblByb2R1Y3QgPSB0aGlzLnJldHVyblByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxSZWNlaXB0U3VwcGxpZWRcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxCcmFuY2hJRFwiOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFRlcm1pbmFsTnVtYmVyXCI6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVHJhbnNhY3Rpb25OdW1iZXJcIjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxDYXNoaWVyTnVtYmVyXCI6IDBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuUHJvZHVjdFsnUmV0dXJuJ10gPSB7Li4ucmV0dXJuUHJvZHVjdFsnUmV0dXJuJ10sIC4uLm9ian07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXS5wdXNoKHJldHVyblByb2R1Y3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGRQcm9kdWN0ID0gdGhpcy5hZGRQcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCkgLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLnB1c2goYWRkUHJvZHVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGVsZW1lbnQubGluZURpc2NvdW50LCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldEJhc2tldERpc2NvdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCkgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10gPSBbXTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge31cbiAgICAgICAgICAgIG9ialsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgb2JqWydEZXZpY2VJRCddPXRoaXMuZGV2aWNlSWQ7XG4gICAgICAgICAgICBvYmpbJ0RhdGVUaW1lQ3JlYXRlZCddPXRoaXMudXBkYXRlZEF0O1xuICAgICAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudEFtb3VudCAqIC0xKTtcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9dGhpcy5jb252ZXJ0VG9TdHJpbmcoIGVsZW1lbnQuZGlzY291bnRBbW91bnQgKiAtMSk7XG4gICAgICAgICAgICBvYmpbJ0Rlc2NyaXB0aW9uJ10gPSBlbGVtZW50LnJlYXNvbkRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgb2JqWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgIG9ialsnUmVhc29uQ29kZUlEJ10gPSBlbGVtZW50LnJlYXNvbkNvZGU7XG4gICAgICAgICAgICBvYmpbJ0Rpc2NvdW50VHlwZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpID8gMCA6IDEpOyBcbiAgICAgICAgICAgIG9ialsnUm91bmRpbmdSdWxlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZygyKTtcbiAgICAgICAgICAgIG9ialsnTW9kaWZpZWRMaW5lTnVtYmVyJ10gPSBlbGVtZW50Lml0ZW1MaW5lSWRzOyAgICAgICAgICAgXG4gICAgICAgICAgICBvYmpbJ0xpbmVOdW1iZXInXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCkpOyBcbiAgICAgICAgICAgIG9ialsnRGlzY291bnRlZFZhbHVlJ10gPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgKyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsO1xuICAgICAgICAgICAgaWYoZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpKXtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50UGVyY2VudGFnZSddID0gIHRoaXMuY29udmVydFRvU3RyaW5nKChlbGVtZW50LmRpc2NvdW50QW1vdW50IC8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwpLnRvRml4ZWQoMSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gJ1JFRlVORCcpe1xuICAgICAgICAgICAgICAgIG9ialsnTmV0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuZGlzY291bnRBbW91bnQgPCAwID8gLWVsZW1lbnQuZGlzY291bnRBbW91bnQgOiBlbGVtZW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPXRoaXMuY29udmVydFRvU3RyaW5nKCBlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCA/IC1lbGVtZW50LmRpc2NvdW50QW1vdW50IDogZWxlbWVudC5kaXNjb3VudEFtb3VudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10ucHVzaChvYmopO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0TW9kaWZpZXJJdGVtKGRhdGE6IGFueSwgbGluZU5vOiBhbnkpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgbGluZU5vKSB7XG4gICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIG9iai5YTUxTY2hlbWFWZXJzaW9uID0gMTtcbiAgICAgICAgICAgIG9iai5MaW5lTnVtYmVyID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgIG9iai5OZXRWYWx1ZSA9IDA7XG4gICAgICAgICAgICBvYmouRWZmZWN0aXZlTmV0VmFsdWUgPSAwO1xuICAgICAgICAgICAgb2JqLkRlc2NyaXB0aW9uID0gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lID8gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lIDogZGF0YS5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcbiAgICAgICAgICAgIG9iai5EZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XG4gICAgICAgICAgICBvYmouVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xuICAgICAgICAgICAgb2JqLkRhdGVUaW1lQ3JlYXRlZCA9IHRoaXMudXBkYXRlZEF0O1xuICAgICAgICAgICAgb2JqLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xuICAgICAgICAgICAgb2JqLlJlYXNvbkNvZGVJRCA9IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSA/IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSA6IGRhdGEucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XG4gICAgICAgICAgICBvYmouTW9kaWZpZWRMaW5lTnVtYmVyID0gbGluZU5vO1xuICAgICAgICAgICAgb2JqLk1vZGlmaWVkSW5kZXggPSAxO1xuXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXS5wdXNoKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRUcmFpbGVySW5mbygpIHtcbiAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddID0ge307XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5EYXRlVGltZUNvbXBsZXRlZCA9IHRoaXMudXBkYXRlZEF0O1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkgPSB7fTtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuU3RvcmVJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuQnJhbmNoSUQgPSB0aGlzLmJyYW5jaElkO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuVGVybWluYWxOdW1iZXIgPSB0aGlzLnRlcm1pbmFsTnVtYmVyO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuVHJhbnNhY3Rpb25OdW1iZXIgPSB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyO1xuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuVG90YWwgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCAqIDEwMCk7XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5JdGVtQ291bnQgPSB0aGlzLml0ZW1Db3VudDsgLy9naXZlcyB0b3RhbCBjb3VudCBmb3IgcHJvZHVjdFxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuSXRlbVF1YW50aXR5ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyk7XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5OZXRJdGVtUXVhbnRpdHkgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlRheFRvdGFsID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5yZW1vdmVEZWNpbWFsKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsKSk7XG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5TZXF1ZW5jZURldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlNlcXVlbmNlTnVtYmVyID0gJ3Nuc24nIC8vc3RhdGljIGZvciBub3dcblxuICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1RheEl0ZW0nXSA9IFtdO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xuXG4gICAgICAgICAgICBvYmpbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgIG9ialsnVGF4UmF0ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcbiAgICAgICAgICAgIG9ialsnVGF4YWJsZVRvdGFsJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC50YXhhYmxlQW1vdW50KSk7XG4gICAgICAgICAgICBvYmpbJ1RheFRvdGFsJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudGF4TGluZVRvdGFsKSkpO1xuICAgICAgICAgICAgb2JqWydUYXhEZXNjcmlwdGlvbiddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcbiAgICAgICAgICAgIG9ialsnVGF4SW5jbHVkZWQnXSA9ICcxJztcbiAgICAgICAgICAgIG9ialsnVGF4UGVyY2VudGFnZSddID0gdGhpcy5hZGREZWNpbWFsKGVsZW1lbnQuVkFULnRvRml4ZWQoMikpLnRvRml4ZWQoMik7XG5cbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnVGF4SXRlbSddLnB1c2gob2JqKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwIHx8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1Byb21vdGlvbkl0ZW0nXSA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbklEJ10gPSBlbGVtZW50LnByb21vdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uUXVhbnRpdHknXSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkRlc2NyaXB0aW9uJ10gPSBlbGVtZW50LmRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddID0ge31cbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXROdW1iZXInXSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRRdWFudGl0eSddID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ0hpdFNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnUHJvZHVjdElEJ10gPSBwcm9kdWN0LlNLVTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydVbml0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQucHJvbW90aW9uTGluZVByaWNlIC8gcHJvZHVjdC5xdWFudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1Byb21vdGlvblRyaWdnZXInXVsnTGluZU51bWJlciddID0gdGhpcy5nZXROdW1iZXIocHJvZHVjdC5TS1UpO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1F1YW50aXR5J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhwcm9kdWN0LnF1YW50aXR5LnRvRml4ZWQoMSkpO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1RheENvZGUnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkuVkFUQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydQcm9tb3Rpb25JdGVtJ10ucHVzaChvYmopO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25JRCddID0gZWxlbWVudC5wcm9tb3Rpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblF1YW50aXR5J10gPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25EZXNjcmlwdGlvbiddID0gZWxlbWVudC5kaXNwbGF5VGV4dDtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXSA9IHt9XG4gICAgICAgICAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0TnVtYmVyJ10gPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0UXVhbnRpdHknXSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRTYXZpbmcnXSA9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDwgMCA/IGVsZW1lbnQucHJvbW90aW9uQW1vdW50IDogLWVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25UcmlnZ2VyID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpdGVtTGluZUlkKSA9PT0gcHJvZHVjdC5pdGVtTGluZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnUHJvZHVjdElEJ10gPSBwcm9kdWN0LlNLVTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnVW5pdFZhbHVlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LnByb21vdGlvbkxpbmVQcmljZSAvIHByb2R1Y3QucXVhbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydMaW5lTnVtYmVyJ10gPSB0aGlzLmdldE51bWJlcihwcm9kdWN0LlNLVSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1F1YW50aXR5J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhwcm9kdWN0LnF1YW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnVGF4Q29kZSddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gcHJvZHVjdC5pdGVtTGluZUlkKS5WQVRDb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10ucHVzaChwcm9tb3Rpb25UcmlnZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnUHJvbW90aW9uSXRlbSddLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRUZW5kZXJJbmZvKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucGF5bWVudERldGFpbHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZihlbGVtZW50LmV4dGVybmFsVGVuZGVyS2V5KXtcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0dJRlQgQ0FSRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJTYWxlc0FsbG93ZWQ6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldLnB1c2gob2JqKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksLy90b2RvXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUluVHJhbnNhY3Rpb25Ub3RhbENoZWNrOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5EcmF3ZXJBdEVuZDogXCIxXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0W2VsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXldLnB1c2gob2JqMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0dJRlQgQ0FSRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJTYWxlc0FsbG93ZWQ6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6ICcnLC8vdG9kb1xuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydDYXNoVGVuZGVyJ10ucHVzaChvYmopXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqMSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlcjogdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ldFZhbHVlOiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5RGVzY3JpcHRpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW5UcmFuc2FjdGlvblRvdGFsQ2hlY2s6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkRyYXdlckF0RW5kOiBcIjFcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Nhc2hUZW5kZXInXS5wdXNoKG9iajEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0TnVtYmVyKHByb2R1Y3RJZCkge1xuICAgICAgICBsZXQgbGluZU51bWJlcjsgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ11baV07XG4gICAgICAgICAgICBpZihKU09OLnN0cmluZ2lmeShwcm9kdWN0SWQpID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50LlByb2R1Y3RJRCkpe1xuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbGVtZW50LkxpbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7XG4gICAgfVxuXG4gICAgc2V0TGluZU51bWJlckZvclByb2R1Y3RzKCkge1xuICAgICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gW107XG4gICAgICAgIGl0ZW1MaW5lSWRBcnJheSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubWFwKChwcm9kdWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0Lml0ZW1MaW5lSWQpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLmxhcmdlc3ROdW1iZXIgPSBpdGVtTGluZUlkQXJyYXkucmVkdWNlKChhOiBhbnksIGI6IGFueSkgPT4gTWF0aC5tYXgoYSwgYikpO1xuICAgIH1cblxuICAgIGdlbmVyYXRlTGluZU51bWJlcigpIHtcbiAgICAgICAgdGhpcy5sYXJnZXN0TnVtYmVyICs9IDE7XG4gICAgICAgIHRoaXMuaXRlbUNvdW50ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmxhcmdlc3ROdW1iZXI7XG4gICAgfVxuXG4gICAgaW5pdGlsaXplSXRlbUNvdW50KCkge1xuICAgICAgICB0aGlzLml0ZW1Db3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubGVuZ3RoO1xuICAgIH1cblxuICAgIGJ1aWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yak9iamVjdDtcbiAgICB9XG5cbiAgICBnZXREZXNjcmlwdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0NBUkQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jYXJkVHlwZVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucGF5bWVudFR5cGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNTUdST1VQSUQoYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGF0dHJpYnV0ZXMuZmlsdGVyKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lID09PSBcIk1NR1JPVVBJRFwiKTtcbiAgICAgICAgICAgIGlmKGZpbHRlclZhbHVlICYmIGZpbHRlclZhbHVlLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclZhbHVlWzBdLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGV2aWNlSW5mbyhpZDogYW55KSB7XG4gICAgICAgIHRoaXMuZGV2aWNlSWQgPSBpZFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHJlbW92ZURlY2ltYWwodmFsdWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdmFsdWUgKiAxMDA7XG4gICAgfVxuXG4gICAgYWRkRGVjaW1hbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAvMTAwO1xuICAgIH1cblxuICAgIHNldFRyYW5zYWN0aW9uTnVtYmVyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbk51bWJlciA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNldE1hbmlmZXN0VmVyc2lvbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubWFuaWZlc3RWZXJzaW9uID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0RGF0YWJhc2VTY2hlbWFWZXJzaW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZVNjaGVtYVZlcnNpb24gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRCYXNrZXRUeXBlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5iYXNrZXRUeXBlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0VHJhZGluZ1JlZ2lvbklEKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy50cmFkaW5nUmVnaW9uSWQgPSB2YWx1ZVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNldENvbXBhbnlJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY29tcGFueUlkID0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRUYXhNZXRob2RJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMudGF4TWV0aG9kSWQgPSB2YWx1ZVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHNldE1ham9yVmVyc2lvbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubWFqb3JWZXJzaW9uID0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRNaW5vclZlcnNpb24odmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm1pbm9yVmVyc2lvbiA9IHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0WE1MU2NoZW1hVmVyc2lvbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMueG1sU2NoZW1hVmVyc2lvbiA9IHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0RXh0ZXJuYWxTdGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxTdGF0ZSA9IHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgc2V0Q2FzaGllcklEKCkge1xuICAgICAgICB0aGlzLmNhc2hpZXJJZCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lKSA/ICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUgOiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzZXRUZXJtaW5hbE51bWJlcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMudGVybWluYWxOdW1iZXIgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0QmFza2V0TGFuZ3VhZ2VJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYmFza2V0TGFuZ3VhZ2VJZCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QmFza2V0Q291bnRyeUlEKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5iYXNrZXRDb3VudHJ5SWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0QmFza2V0Q3VycmVuY3lJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYmFza2V0Q3VycmVuY3lJZCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzZXRCcmFuY2hJRCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJhbmNoSWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0U2FsZXNQZXJzb25OYW1lKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zYWxlc1BlcnNvbk5hbWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVJZChkYXRlOiBhbnkpIHtcbiAgICAgICAgbGV0IG5ld0RhdGVUaW1lID0gZGF0ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpXG4gICAgICAgIGxldCBpZCA9ICh0aGlzLmRldmljZUlkICsgJ3wnICsgbmV3RGF0ZVRpbWUgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyKS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfSBcblxuICAgIGdlbmVyYXRlVGltZXpvbmVvZmZzZXQoZGF0ZTogYW55KSB7XG4gICAgICAgIGxldCB4ID0gZGF0ZSA/IGRhdGUgOiAnJztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVLZXl3b3JkKCkge1xuICAgICAgICBsZXQgeCA9ICh0aGlzLmNvbXBhbnlJZCArICd8JyArIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkICsgJ3wnICsgdGhpcy50ZXJtaW5hbE51bWJlciArICd8JyArIHRoaXMudHJhbnNhY3Rpb25OdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cblxuICAgIGdldFN0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9wZXJhdGlvblN0YXR1cyA9PT0gJ1BBWV9TVUNDRVNTJykge1xuICAgICAgICAgICAgcmV0dXJuICdDb21wbGV0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdDYW5jZWxsZWQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuUHJvZHVjdChlbGVtZW50OiBhbnksIGxpbmVEaXNjb3VudDogTGluZURpc2NvdW50ICwgdHJhbnNhY3Rpb25EaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudCkge1xuICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgICAgbGV0IHRheFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKTtcbiAgICAgICAgb2JqWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XG4gICAgICAgIG9ialsnTGluZU51bWJlciddID0gZWxlbWVudFsnaXRlbUxpbmVJZCddO1xuICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsncmVmdW5kZWRUb3RhbCddKTtcbiAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3JlZnVuZGVkVG90YWwnXSk7XG4gICAgICAgIG9ialsnRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ2Rlc2NyaXB0aW9uJ107XG4gICAgICAgIG9ialsnRGV2aWNlSUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudFsndGVybWluYWxJZCddO1xuICAgICAgICBvYmpbJ1VzZXJJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xuICAgICAgICBvYmpbJ0RhdGVUaW1lQ3JlYXRlZCddID0gdGhpcy5jcmVhdGVkQXQ7XG4gICAgICAgIG9ialsnRXh0ZW5kZWRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3RvdGFsTGluZVByaWNlJ10qLTEpO1xuICAgICAgICBvYmpbJ1VuaXRQcmljZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3ByaWNlJ10pO1xuICAgICAgICBvYmpbJ1F1YW50aXR5J10gPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xuICAgICAgICBvYmpbJ09yaWdpbmFsVGF4QW1vdW50U2V0J10gPSAxO1xuICAgICAgICBvYmpbJ1Byb2R1Y3RJRCddID0gZWxlbWVudFsnU0tVJ107XG4gICAgICAgIG9ialsnSGFuZEtleWVkJ10gPSAxO1xuICAgICAgICBvYmpbJ0xvbmdEZXNjcmlwdGlvbiddID0gZWxlbWVudFsnZGVzY3JpcHRpb24nXTtcbiAgICAgICAgb2JqWydSZXR1cm4nXSA9IHt9O1xuICAgICAgICBvYmpbJ1JldHVybiddWydSZXR1cm5SZWFzb25JRCddID0gZWxlbWVudFsncmVmdW5kZWRSZWFzb24nXTtcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ3JlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24nXTtcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuVG9TdG9jayddID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KTtcbiAgICAgICAgb2JqWydUYXhDb2RlJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pLlZBVENvZGU7XG5cbiAgICAgICAgb2JqWydEaXNwbGF5VGF4Q29kZSddID0gJyc7IC8vIHRvZG9cbiAgICAgICAgb2JqWydQcm9kdWN0QXR0cmlidXRlcyddID0gJyc7IC8vdG9kbyAtIG5vdCByZXF1aXJlZFxuICAgICAgICBvYmpbJ1BlcmlzaGFibGUnXSA9IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgICAgIC8vb2JqWydNTUdyb3VwSUQnXSA9IHRoaXMuZ2V0Q2FyZWdvcmllcyhlbGVtZW50KTtcbiAgICAgICAgb2JqWydNTUdyb3VwSUQnXSA9IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgICAgIG9ialsnQ3VzdG9tZXJEZXRhaWxzJ10gPSBcIlwiOyAvLyB0b2RvIC0gYmxhbmtcbiAgICAgICAgb2JqWydUb3RhbFByb21vdGlvblNhdmluZyddID0gZWxlbWVudFsncHJvbW90aW9uQW1vdW50J10gfHwgLTE7IC8vIFRPRE9cbiAgICAgICAgb2JqWydPcmlnaW5hbFRheEFtb3VudCddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoKHRoaXMucmVtb3ZlRGVjaW1hbCh0aGlzLmdldE9yaWdpbmFsVGF4KGVsZW1lbnQsdGF4VG90YWwuVkFUKSAqIC0xKSkudG9GaXhlZCgyKSk7XG4gICAgICAgIG9ialsndGF4QW1vdW50J10gPSB0aGlzLnJlbW92ZURlY2ltYWwodGF4VG90YWwudGF4TGluZVRvdGFsIDwgMCA/KHRheFRvdGFsLnRheExpbmVUb3RhbCkgOiAoLXRheFRvdGFsLnRheExpbmVUb3RhbCkpO1xuXG4gICAgICAgIGlmIChsaW5lRGlzY291bnQpIHtcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10gPSB7fTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50VHlwZSA9IGxpbmVEaXNjb3VudC5kaXNjb3VudFR5cGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vcHJpY2Ugb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5OZXdQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDAgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxuICAgICAgICAgICAgb2JqLk5ldFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcbiAgICAgICAgICAgIG9iai5FZmZlY3RpdmVOZXRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICBvYmouRXh0ZW5kZWRWYWx1ZSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICBvYmouVW5pdFByaWNlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uRGlzY291bnQpIHtcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddID0gW107XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZTogYW55KSA9PiB7ICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRPYmo6IGFueSA9e31cbiAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0gZWxlbWVudC5pdGVtTGluZUlkKSB7ICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXNjb3VudEFtb3VudCA9IHRoaXMuY29udmVydFRvU3RyaW5nKGUuZGlzY291bnRBbW91bnQgKiAtMSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLkJhc2tldERpc2NvdW50TGluZU51bWJlciA9IHRoaXMuZ2V0TGluZU51bWJlcihlLGRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLlhNTFNjaGVtYVZlcnNpb24gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5EaXNjb3VudGVkVmFsdWUgPSB0aGlzLmdldERpc2NvdW50ZWRWYWx1ZShlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLnB1c2goZGlzY291bnRPYmopO1xuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gMDtcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLmZvckVhY2goKHZhbHVlOmFueSk9PntcbiAgICAgICAgICAgICAgICB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgPSB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgKyB2YWx1ZS5EaXNjb3VudGVkVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0cmFuc2FjdGlvblByb21vOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Nb2RpZmllclZhbHVlID0gdHJhbnNhY3Rpb25Qcm9tby5wcm9tb3Rpb25BbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJEYXRlVGltZSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJEZXNjcmlwdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW8uZGlzcGxheVRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouWE1MU2NoZW1hVmVyc2lvbiA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IHRyYW5zYWN0aW9uUHJvbW8ucHJvbW90aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uRGVzY3JpcHRpb24gPSB0cmFuc2FjdGlvblByb21vLmRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdE51bWJlciA9ICcxJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25IaXRQcm9kdWN0UXVhbnRpdHkgPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbkhpdFF1YW50aXR5ID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KSAqIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBhZGRQcm9kdWN0KGVsZW1lbnQ6IFRQcm9kdWN0LCBsaW5lRGlzY291bnQ6IExpbmVEaXNjb3VudCwgdHJhbnNhY3Rpb25EaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudCkge1xuICAgICAgICBsZXQgdGF4VG90YWwgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pO1xuICAgICAgICBsZXQgb2JqOiBhbnkgPSB7XG4gICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiB0aGlzLnhtbFNjaGVtYVZlcnNpb24sXG4gICAgICAgICAgICBMaW5lTnVtYmVyOiBlbGVtZW50Lml0ZW1MaW5lSWQsXG4gICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudG90YWxMaW5lUHJpY2UpLFxuICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRvdGFsTGluZVByaWNlKSxcbiAgICAgICAgICAgIERlc2NyaXB0aW9uOiBlbGVtZW50LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBFeHRlbmRlZFZhbHVlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC5wcmljZSksXG4gICAgICAgICAgICBVbml0UHJpY2U6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnByaWNlKSxcbiAgICAgICAgICAgIC8vTU1Hcm91cElEOiB0aGlzLmdldENhcmVnb3JpZXMoZWxlbWVudCksXG4gICAgICAgICAgICBRdWFudGl0eTogZWxlbWVudC5xdWFudGl0eSxcbiAgICAgICAgICAgIFNhbGVzcGVyc29uSUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcbiAgICAgICAgICAgIFNhbGVzcGVyc29uTmFtZTogdGhpcy5zYWxlc1BlcnNvbk5hbWUsXG4gICAgICAgICAgICBUYXhDb2RlOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pLlZBVENvZGUsXG4gICAgICAgICAgICBUYXhNb2RpZmlhYmxlOiBcIjFcIiwgLy90b2RvXG4gICAgICAgICAgICBPcmlnaW5hbFRheEFtb3VudCA6IHRoaXMuY29udmVydFRvU3RyaW5nKCh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5nZXRPcmlnaW5hbFRheChlbGVtZW50LHRheFRvdGFsLlZBVCkpLnRvRml4ZWQoMikpKSxcbiAgICAgICAgICAgIFRheEFtb3VudCA6IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMucmVtb3ZlRGVjaW1hbCh0YXhUb3RhbC50YXhMaW5lVG90YWwpKSxcbiAgICAgICAgICAgIE9yaWdpbmFsVGF4QW1vdW50U2V0OiBcIjFcIiwvL3RvZG9cbiAgICAgICAgICAgIFByb2R1Y3RJRDogZWxlbWVudC5TS1UsXG4gICAgICAgICAgICBIYW5kS2V5ZWQ6IFwiMVwiLC8vdG9kb1xuICAgICAgICAgICAgQ3VzdG9tZXJEZXRhaWxzOiBcIlwiLFxuICAgICAgICAgICAgUGVyaXNoYWJsZTogdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIE1NR3JvdXBJRDogdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lRGlzY291bnQpIHtcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10gPSB7fTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50VHlwZSA9IGxpbmVEaXNjb3VudC5kaXNjb3VudFR5cGU7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50ZWRWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKTtcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vcHJpY2Ugb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk5ld1ByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXG4gICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9ICgobGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgfHwgMCkgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xuICAgICAgICAgICAgb2JqWydFeHRlbmRlZFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgICAgIG9ialsnVW5pdFByaWNlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uRGlzY291bnQpIHtcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddID0gW107XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZTphbnkpID0+IHsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGRpc2NvdW50T2JqOiBhbnkgPXt9O1xuICAgICAgICAgICAgICAgICBlLml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRBbW91bnQgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlLmRpc2NvdW50QW1vdW50ICogLTEpOyAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouRGlzY291bnRlZFZhbHVlID0gLSh0aGlzLmdldERpc2NvdW50ZWRWYWx1ZShlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLmRpc2NvdW50QW1vdW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5CYXNrZXREaXNjb3VudExpbmVOdW1iZXIgPSB0aGlzLmdldExpbmVOdW1iZXIoZSxkaXNjb3VudEFtb3VudCkgO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10ucHVzaChkaXNjb3VudE9iaik7IFxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCA9IDA7XG4gICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXS5mb3JFYWNoKCh2YWx1ZTphbnkpPT57XG4gICAgICAgICAgICAgICAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ID0gdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50ICsgdmFsdWUuRGlzY291bnRlZFZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gb2JqLkVmZmVjdGl2ZU5ldFZhbHVlICsgIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudDsgICAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwIHx8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKChpdGVtTGluZUlkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5Qcm9tb3Rpb25JRCA9IGUucHJvbW90aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdCA9ICcxJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouU2F2aW5nID0gdGhpcy5nZXRTYXZpbmcoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5wcm9tb3Rpb25BbW91bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5JU2F2aW5nID0gdGhpcy5nZXRTYXZpbmcoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5wcm9tb3Rpb25BbW91bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnRGlzdHJpYnV0ZWRQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25PYmo6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pdGVtTGluZUlkID09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbklEID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5IaXQgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5TYXZpbmcgPSBsaW5lUHJvbW90aW9uLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5JU2F2aW5nID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10ucHVzaChwcm9tb3Rpb25PYmopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSAwO1xuICAgICAgICAgICAgb2JqWydEaXN0cmlidXRlZFByb21vdGlvblNhdmluZyddLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW90aW9uICsgdmFsdWUuU2F2aW5nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyB0cmFuc2FjdGlvblByb21vdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIGdldFNhdmluZyhwcmljZSxwcm9tb3Rpb25BbW91bnQpOiBhbnkge1xuICAgICAgICBsZXQgU2F2aW5nID0gKHByaWNlKnByb21vdGlvbkFtb3VudCkvdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsO1xuICAgICAgICByZXR1cm4gU2F2aW5nO1xuICAgIH1cblxuICAgIGdldExpbmVOdW1iZXIodmFsdWU6IGFueSxkaXNjb3VudEFtb3VudDpzdHJpbmcgKXtcbiAgICAgICAgbGV0IGxpbmVOdW1iZXI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yak9iamVjdFsnQmFza2V0RGlzY291bnQnXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J11baV07XG4gICAgICAgICAgICBpZiggdmFsdWUucmVhc29uQ29kZSA9PT0gZWxlbWVudC5SZWFzb25Db2RlSUQgJiYgZGlzY291bnRBbW91bnQgPT09IGVsZW1lbnQuTmV0VmFsdWUpe1xuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbGVtZW50LkxpbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7ICAgICAgICBcbiAgICB9XG5cblxuICAgIGdldERpc2NvdW50ZWRWYWx1ZShwcmljZTphbnkgLGRpc2NvdW50QW1vdW50OmFueSApIHtcbiAgICAgICAgbGV0IERpc2NvdW50ZWRWYWx1ZSA9KChwcmljZSAqIGRpc2NvdW50QW1vdW50KS90aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwpKjEwMCA7XG4gICAgICAgIHJldHVybiBEaXNjb3VudGVkVmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0T3JpZ2luYWxUYXgoZWxlbWVudDogVFByb2R1Y3QsIFZBVCkge1xuICAgICAgICBsZXQgcHJpY2ViZWZvcmV0YXggPSAoZWxlbWVudC5wcmljZSAqIDEwMCkvKDEwMCArIFZBVCApXG4gICAgICAgIGxldCBvcmlnaW5hbHRheD0gZWxlbWVudC5wcmljZSAtIHByaWNlYmVmb3JldGF4XG4gICAgICAgIHJldHVybiBvcmlnaW5hbHRheDtcbiAgICB9XG5cbiAgICBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IGFueSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRXJyb3IodGhpcy5jbGFzc05hbWUsIFwiY29udmVydFRvU3RyaW5nXCIsICAnY2FuIG5vdCBiZSBjb252ZXJ0ZWQgaW4gc3RyaW5nJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpIHtcbiAgICAgICAgbGV0IHggPSAnMCc7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kZWxpdmVyeU1ldGhvZCA9PT0gJzEnIHx8IGVsZW1lbnQuZGVsaXZlcnlNZXRob2QgPT09ICcyJykge1xuICAgICAgICAgICAgICAgIHggPSAnMSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG5cbiAgICAvLyBnZXRBdHRyaWJ1dGVzKCl7XG4gICAgLy8gICAgIGxldCBuYW1lOiBzdHJpbmcgfCBhbnlbXSA9IFtdXG4gICAgLy8gICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgLy8gICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC5hdHRyaWJ1dGVzLmZpbHRlcigoeDogYW55KSA9PiB4Lm5hbWUudG9VcHBlckNhc2UoKSA9PT0gZWxlbWVudC5uYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgaWYgKG5hbWUubGVuZ3RoID4gMCkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIG5hbWVbMF0udmFsdWVcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBlbHNle1xuICAgIC8vICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIC8vIGdldENhcmVnb3JpZXMoZWxlbWVudCkge1xuICAgIC8vICAgICBsZXQgTU1Hcm91cElkID0gXCIgXCI7XG4gICAgLy8gICAgIGlmIChlbGVtZW50LmNhdGVnb3JpZXMgJiYgZWxlbWVudC5jYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gZWxlbWVudC5jYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5wYXJlbnRJZCAhPSAnJyk7XG4gICAgLy8gICAgICAgICBsZXQgdmFsdWUgPSBjYXRlZ29yaWVzLmZpbHRlcigoeCkgPT4geC5pZCAhPSB4LnBhcmVudElkKTtcbiAgICAvLyAgICAgICAgIE1NR3JvdXBJZCA9IHZhbHVlWzBdLm5hbWU7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIE1NR3JvdXBJZDtcbiAgICAvLyB9XG5cbiAgICBnZXREYXRlKGRhdGU6c3RyaW5nKXtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuZ2VuZXJhdGVUaW1lem9uZW9mZnNldChkYXRlKSAqIC0xO1xuICAgICAgICBsZXQgb2Zmc2V0SG91cnMgPSBNYXRoLmFicyhNYXRoLmZsb29yKG9mZnNldCAvIDYwKSk7ICAgICAgICBcblx0ICAgIGxldCBvZmZzZXRNaW51dGVzID0gTWF0aC5hYnMob2Zmc2V0KSAtIG9mZnNldEhvdXJzICogNjA7XG5cbiAgICAgICAgbGV0IG9mZnNldFNpZ24gPSAnKyc7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICBvZmZzZXRTaWduID0gJy0nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld2RhdGUgPSBkYXRlLnN1YnN0cmluZygwLDE5KTtcbiAgICAgICAgY29uc3QgeCA9IChuZXdkYXRlKyBvZmZzZXRTaWduICtTdHJpbmcob2Zmc2V0SG91cnMpLnBhZFN0YXJ0KDIsICcwJykrJzonK1N0cmluZyhvZmZzZXRNaW51dGVzKS5wYWRTdGFydCgyLCAnMCcpKS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4geDsgICAgICAgIFxuICAgIH1cbiAgICBcbiAgICBnZXRUcmFuc2FjdGlvblByb21vdGlvbih0cmFuc2FjdGlvblByb21vdGlvbil7XG4gICAgICAgIGlmKHRyYW5zYWN0aW9uUHJvbW90aW9uICYmIHRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddID0ge307XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTGluZU51bWJlciddID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTmV0VmFsdWUnXSA9ICB0aGlzLnJlbW92ZURlY2ltYWwodHJhbnNhY3Rpb25Qcm9tb3Rpb25bMF0ucHJvbW90aW9uTGluZVByaWNlKSAqIC0xO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkxpbmVQcmljZSkgKiAtMTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGVzY3JpcHRpb24nXSA9IHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkluZm87XG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ0RldmljZUlEJ10gPSB0aGlzLmRldmljZUlkO1xuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGF0ZVRpbWVDcmVhdGVkJ10gPSB0aGlzLmNyZWF0ZWRBdDtcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnUHJvZHVjdElkJ10gPSBcIlwiOyAvL3RvZG9cbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnU2VyaWFsTnVtYmVyJ10gPSBcIlwiIDsgLy90b2RvXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ01NR3JvdXBJZCddID0gXCJcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBnZXRRdWFudGl0eShlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IHF1YW50aXR5XG4gICAgICAgIGlmKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51bnJlZmVyZW5jZWRSZWZ1bmQpe1xuICAgICAgICAgICAgcXVhbnRpdHkgPSBlbGVtZW50WydxdWFudGl0eSddIDwgMCA/IGVsZW1lbnRbJ3F1YW50aXR5J10gOiAoLWVsZW1lbnRbJ3F1YW50aXR5J10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBxdWFudGl0eSA9IGVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSA8IDAgPyBlbGVtZW50WydyZWZ1bmRlZFF1YW50aXR5J10gOiAoLWVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1YW50aXR5O1xuICAgIH1cbn1cbiJdfQ==