@colijnit/transaction 1.9.31 → 12.0.1

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 (125) hide show
  1. package/app/component/common/icon/icon.component.d.ts +1 -2
  2. package/bundles/colijnit-transaction.umd.js +950 -983
  3. package/bundles/colijnit-transaction.umd.js.map +1 -1
  4. package/colijnit-transaction.d.ts +14 -14
  5. package/colijnit-transaction.metadata.json +1 -1
  6. package/esm2015/app/component/checkout/checkout/checkout.component.js +22 -26
  7. package/esm2015/app/component/checkout/checkout-login/checkout-login.component.js +18 -27
  8. package/esm2015/app/component/checkout/checkout-overview/checkout-overview.component.js +26 -49
  9. package/esm2015/app/component/checkout/checkout-overview-block/checkout-overview-block.component.js +17 -24
  10. package/esm2015/app/component/checkout/checkout-overview-delivery-address/checkout-overview-delivery-address.component.js +18 -24
  11. package/esm2015/app/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +27 -42
  12. package/esm2015/app/component/checkout/checkout-overview-relation-address/checkout-overview-relation-address.component.js +19 -22
  13. package/esm2015/app/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +25 -36
  14. package/esm2015/app/component/checkout/checkout-relation-suggestions-list/checkout-relation-suggestions-list.component.js +18 -24
  15. package/esm2015/app/component/checkout/checkout-relation-suggestions-list-item/checkout-relation-suggestions-list-item.component.js +16 -21
  16. package/esm2015/app/component/checkout/ione-checkout.component.js +27 -34
  17. package/esm2015/app/component/checkout/ione-checkout.module.js +55 -58
  18. package/esm2015/app/component/checkout/retail-transaction-checkout/retail-transaction-checkout.component.js +16 -18
  19. package/esm2015/app/component/common/icon/icon.component.js +14 -18
  20. package/esm2015/app/component/common/image-display/image-display.component.js +19 -36
  21. package/esm2015/app/component/common/no-image-display/no-image-display.component.js +14 -20
  22. package/esm2015/app/component/core/core.module.js +32 -34
  23. package/esm2015/app/component/shopping-cart/characteristic-answer/characteristic-answer.component.js +20 -27
  24. package/esm2015/app/component/shopping-cart/ione-shopping-cart.component.js +31 -48
  25. package/esm2015/app/component/shopping-cart/ione-shopping-cart.module.js +51 -52
  26. package/esm2015/app/component/shopping-cart/shopping-cart/shopping-cart.component.js +29 -49
  27. package/esm2015/app/component/shopping-cart/shopping-cart-line/shopping-cart-line.component.js +25 -38
  28. package/esm2015/app/component/shopping-cart/shopping-cart-manager/shopping-cart-manager.component.js +27 -38
  29. package/esm2015/app/component/shopping-cart/stock-status-indicator/stock-status-indicator.component.js +13 -17
  30. package/esm2015/app/enum/checkout-steps.enum.js +1 -1
  31. package/esm2015/app/enum/content-view-mode.enum.js +1 -1
  32. package/esm2015/app/enum/direction.enum.js +1 -1
  33. package/esm2015/app/enum/language-code.enum.js +1 -1
  34. package/esm2015/app/enum/order-discount-type.enum.js +1 -1
  35. package/esm2015/app/enum/time-size.type.js +1 -1
  36. package/esm2015/app/model/business-object.js +6 -6
  37. package/esm2015/app/model/text-value-container.js +1 -1
  38. package/esm2015/app/pipe/append.pipe.js +6 -8
  39. package/esm2015/app/pipe/co-currency.pipe.js +8 -11
  40. package/esm2015/app/pipe/date-duration.pipe.js +6 -8
  41. package/esm2015/app/pipe/delivery-time.pipe.js +6 -8
  42. package/esm2015/app/pipe/localize.pipe.js +9 -13
  43. package/esm2015/app/pipe/safe-style-pipe.js +9 -11
  44. package/esm2015/app/service/dictionary.service.js +10 -10
  45. package/esm2015/app/service/ione-connector-adapter.service.js +8 -8
  46. package/esm2015/app/service/options.service.js +8 -8
  47. package/esm2015/app/service/transaction-event.service.js +6 -8
  48. package/esm2015/app/service/transaction.service.js +11 -12
  49. package/esm2015/app/utils/string-utils.js +1 -1
  50. package/esm2015/assets/dictionary/text.properties.js +1 -1
  51. package/esm2015/colijnit-transaction.js +15 -15
  52. package/esm2015/factory/business-object-factory.js +1 -1
  53. package/esm2015/factory/decorators/boolean.decorator.js +1 -1
  54. package/esm2015/factory/decorators/complex-array.decorator.js +1 -1
  55. package/esm2015/factory/decorators/complex-field.decorator.js +2 -2
  56. package/esm2015/factory/decorators/date-field.decorator.js +1 -1
  57. package/esm2015/factory/decorators/string-number.decorator.js +1 -1
  58. package/esm2015/public_api.js +1 -1
  59. package/esm2015/utils/array-utils.js +1 -1
  60. package/esm2015/utils/is-nill.function.js +1 -1
  61. package/fesm2015/colijnit-transaction.js +640 -799
  62. package/fesm2015/colijnit-transaction.js.map +1 -1
  63. package/package.json +33 -23
  64. package/bundles/colijnit-transaction.umd.min.js +0 -16
  65. package/bundles/colijnit-transaction.umd.min.js.map +0 -1
  66. package/enum/icon.enum.d.ts +0 -281
  67. package/esm2015/enum/icon.enum.js +0 -283
  68. package/esm5/app/component/checkout/checkout/checkout.component.js +0 -196
  69. package/esm5/app/component/checkout/checkout-login/checkout-login.component.js +0 -62
  70. package/esm5/app/component/checkout/checkout-overview/checkout-overview.component.js +0 -183
  71. package/esm5/app/component/checkout/checkout-overview-block/checkout-overview-block.component.js +0 -48
  72. package/esm5/app/component/checkout/checkout-overview-delivery-address/checkout-overview-delivery-address.component.js +0 -34
  73. package/esm5/app/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +0 -298
  74. package/esm5/app/component/checkout/checkout-overview-relation-address/checkout-overview-relation-address.component.js +0 -98
  75. package/esm5/app/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +0 -303
  76. package/esm5/app/component/checkout/checkout-relation-suggestions-list/checkout-relation-suggestions-list.component.js +0 -33
  77. package/esm5/app/component/checkout/checkout-relation-suggestions-list-item/checkout-relation-suggestions-list-item.component.js +0 -48
  78. package/esm5/app/component/checkout/ione-checkout.component.js +0 -163
  79. package/esm5/app/component/checkout/ione-checkout.module.js +0 -82
  80. package/esm5/app/component/checkout/retail-transaction-checkout/retail-transaction-checkout.component.js +0 -62
  81. package/esm5/app/component/common/icon/icon.component.js +0 -40
  82. package/esm5/app/component/common/image-display/image-display.component.js +0 -57
  83. package/esm5/app/component/common/no-image-display/no-image-display.component.js +0 -29
  84. package/esm5/app/component/core/core.module.js +0 -48
  85. package/esm5/app/component/shopping-cart/characteristic-answer/characteristic-answer.component.js +0 -66
  86. package/esm5/app/component/shopping-cart/ione-shopping-cart.component.js +0 -169
  87. package/esm5/app/component/shopping-cart/ione-shopping-cart.module.js +0 -70
  88. package/esm5/app/component/shopping-cart/shopping-cart/shopping-cart.component.js +0 -179
  89. package/esm5/app/component/shopping-cart/shopping-cart-line/shopping-cart-line.component.js +0 -208
  90. package/esm5/app/component/shopping-cart/shopping-cart-manager/shopping-cart-manager.component.js +0 -563
  91. package/esm5/app/component/shopping-cart/stock-status-indicator/stock-status-indicator.component.js +0 -28
  92. package/esm5/app/enum/checkout-steps.enum.js +0 -10
  93. package/esm5/app/enum/content-view-mode.enum.js +0 -10
  94. package/esm5/app/enum/direction.enum.js +0 -9
  95. package/esm5/app/enum/language-code.enum.js +0 -8
  96. package/esm5/app/enum/order-discount-type.enum.js +0 -7
  97. package/esm5/app/enum/time-size.type.js +0 -10
  98. package/esm5/app/model/business-object.js +0 -85
  99. package/esm5/app/model/text-value-container.js +0 -7
  100. package/esm5/app/pipe/append.pipe.js +0 -22
  101. package/esm5/app/pipe/co-currency.pipe.js +0 -55
  102. package/esm5/app/pipe/date-duration.pipe.js +0 -61
  103. package/esm5/app/pipe/delivery-time.pipe.js +0 -38
  104. package/esm5/app/pipe/localize.pipe.js +0 -34
  105. package/esm5/app/pipe/safe-style-pipe.js +0 -22
  106. package/esm5/app/service/dictionary.service.js +0 -83
  107. package/esm5/app/service/ione-connector-adapter.service.js +0 -549
  108. package/esm5/app/service/options.service.js +0 -108
  109. package/esm5/app/service/transaction-event.service.js +0 -21
  110. package/esm5/app/service/transaction.service.js +0 -690
  111. package/esm5/app/utils/string-utils.js +0 -73
  112. package/esm5/assets/dictionary/text.properties.js +0 -282
  113. package/esm5/colijnit-transaction.js +0 -36
  114. package/esm5/enum/icon.enum.js +0 -283
  115. package/esm5/factory/business-object-factory.js +0 -122
  116. package/esm5/factory/decorators/boolean.decorator.js +0 -106
  117. package/esm5/factory/decorators/complex-array.decorator.js +0 -59
  118. package/esm5/factory/decorators/complex-field.decorator.js +0 -61
  119. package/esm5/factory/decorators/date-field.decorator.js +0 -40
  120. package/esm5/factory/decorators/string-number.decorator.js +0 -47
  121. package/esm5/public_api.js +0 -8
  122. package/esm5/utils/array-utils.js +0 -188
  123. package/esm5/utils/is-nill.function.js +0 -5
  124. package/fesm5/colijnit-transaction.js +0 -5620
  125. package/fesm5/colijnit-transaction.js.map +0 -1
@@ -1,563 +0,0 @@
1
- import { __awaiter, __decorate, __generator } from "tslib";
2
- import { Component, EventEmitter, Output, ViewChild } from "@angular/core";
3
- import { TransactionService } from "../../../service/transaction.service";
4
- import { NumberUtils } from "@colijnit/transactionapi/build/utils/number-utils";
5
- import { throwError } from "rxjs";
6
- import { TransactionEventService } from "../../../service/transaction-event.service";
7
- import { ResolvePendingLineReasonRequest } from "@colijnit/transactionapi/build/model/resolve-pending-reason-request.bo";
8
- import { TransactionLineType } from "@colijnit/transactionapi/build/enum/transaction-line-type.enum";
9
- import { CoDialogComponent, CoGridComponent, PromptService } from "@colijnit/corecomponents_v9";
10
- import { PendingReasonType } from "@colijnit/transactionapi/build/enum/pending-reason-type.enum";
11
- import { DictionaryService } from "../../../service/dictionary.service";
12
- var ShoppingCartManagerComponent = /** @class */ (function () {
13
- function ShoppingCartManagerComponent(service, transactionEvents, promptService, _dictionaryService) {
14
- var _this = this;
15
- this.service = service;
16
- this.transactionEvents = transactionEvents;
17
- this.promptService = promptService;
18
- this._dictionaryService = _dictionaryService;
19
- this.linesChanged = new EventEmitter();
20
- this.openCart = new EventEmitter();
21
- this.articleAdded = new EventEmitter();
22
- this.isReturn = false;
23
- this.waitForLinesChangedToOpenCart = false;
24
- this.message = "CHECK_WAREHOUSE_AND_COMMISSIONCODE";
25
- this.commissionCodes = [];
26
- this.commissionFields = { text: "description", value: "code" };
27
- this.transactionArticleWarehouses = [];
28
- this.transactionArticleWarehouseFields = { text: "warehouseDesc", value: "warehouseNr" };
29
- this.columns = [];
30
- this.dialogPromptHeader = "";
31
- this.rootElement = null;
32
- this._subscriptions = [];
33
- this._inOutCollection = [];
34
- this._okOrCancelClick = false;
35
- this._showCharacteristic = false;
36
- this._subscriptions.push(this.service.transactionUpdated.subscribe(function () {
37
- _this.linesChanged.emit(_this.waitForLinesChangedToOpenCart);
38
- _this.waitForLinesChangedToOpenCart = false;
39
- }), this.transactionEvents.addToCartBySku.subscribe(function (params) {
40
- _this.waitForLinesChangedToOpenCart = params.popCart;
41
- _this.addToCart(params.sku, params.amount).then();
42
- }), this.transactionEvents.addToCartBySelectorResult.subscribe(function (params) {
43
- _this.waitForLinesChangedToOpenCart = params.popCart;
44
- _this.addToCartBySelectorResult(params.selectorResult).then();
45
- }), this.transactionEvents.openShoppingCartModule.subscribe(function () {
46
- _this.openCart.emit(false);
47
- }), this.transactionEvents.addUserRelationShoppingCartModule.subscribe(function (login) {
48
- _this.addUserRelationToTransactionAndLogin(login.user, login.pw);
49
- }), this.transactionEvents.addNewUserToShoppingCartModule.subscribe(function (emailAddress) {
50
- _this.addEmailAddressToTransaction(emailAddress);
51
- }));
52
- this.columns.push({ field: "warehouseNr", headerText: this._dictionaryService.get("WAREHOUSE"), allowFiltering: false }, { field: "warehouseDesc", headerText: this._dictionaryService.get("DESCRIPTION") }, { field: "stockAmount", headerText: this._dictionaryService.get("STOCK") });
53
- }
54
- Object.defineProperty(ShoppingCartManagerComponent.prototype, "amountOfLines", {
55
- get: function () {
56
- return NumberUtils.NrOrDefault(this.service.articleAmount, 0);
57
- },
58
- enumerable: true,
59
- configurable: true
60
- });
61
- Object.defineProperty(ShoppingCartManagerComponent.prototype, "showCharacteristicDialog", {
62
- get: function () {
63
- return this._showCharacteristic;
64
- },
65
- set: function (value) {
66
- this._showCharacteristic = value;
67
- },
68
- enumerable: true,
69
- configurable: true
70
- });
71
- ShoppingCartManagerComponent.prototype.ngOnInit = function () {
72
- return __awaiter(this, void 0, void 0, function () {
73
- var _a;
74
- return __generator(this, function (_b) {
75
- switch (_b.label) {
76
- case 0:
77
- _a = this;
78
- return [4 /*yield*/, this.service.getCommissionCodes("NL")];
79
- case 1:
80
- _a.commissionCodes = _b.sent();
81
- this.linesChanged.emit(this.waitForLinesChangedToOpenCart);
82
- this.waitForLinesChangedToOpenCart = false;
83
- return [2 /*return*/];
84
- }
85
- });
86
- });
87
- };
88
- ShoppingCartManagerComponent.prototype.ngOnDestroy = function () {
89
- this._subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
90
- this.warehouseDialog.close();
91
- };
92
- ShoppingCartManagerComponent.prototype.addToCart = function (sku, amount) {
93
- return __awaiter(this, void 0, void 0, function () {
94
- var goodId;
95
- return __generator(this, function (_a) {
96
- switch (_a.label) {
97
- case 0: return [4 /*yield*/, this.service.getGoodIdFromArticleNr(sku)];
98
- case 1:
99
- goodId = _a.sent();
100
- return [4 /*yield*/, this._loadArticle(goodId)];
101
- case 2:
102
- _a.sent();
103
- return [4 /*yield*/, this._createTransaction()];
104
- case 3:
105
- _a.sent();
106
- return [4 /*yield*/, this._handleAddArticle(amount)];
107
- case 4:
108
- _a.sent();
109
- this.articleAdded.emit();
110
- return [2 /*return*/];
111
- }
112
- });
113
- });
114
- };
115
- ShoppingCartManagerComponent.prototype.addToCartBySelectorResult = function (result) {
116
- return __awaiter(this, void 0, void 0, function () {
117
- return __generator(this, function (_a) {
118
- switch (_a.label) {
119
- case 0: return [4 /*yield*/, this._loadArticle(result.goodId)];
120
- case 1:
121
- _a.sent();
122
- return [4 /*yield*/, this._createTransaction()];
123
- case 2:
124
- _a.sent();
125
- return [4 /*yield*/, this._handleAddArticle(result.quantity)];
126
- case 3:
127
- _a.sent();
128
- this.articleAdded.emit();
129
- return [2 /*return*/];
130
- }
131
- });
132
- });
133
- };
134
- // TODO public user logs in.... how reconnect the Connector?
135
- ShoppingCartManagerComponent.prototype.addUserRelationToTransactionAndLogin = function (userName, password) {
136
- return __awaiter(this, void 0, void 0, function () {
137
- var success;
138
- return __generator(this, function (_a) {
139
- switch (_a.label) {
140
- case 0: return [4 /*yield*/, this.service.setRelationByUser(userName, password)];
141
- case 1:
142
- success = _a.sent();
143
- if (success) {
144
- this.transactionEvents.loggedIn.next();
145
- }
146
- return [2 /*return*/];
147
- }
148
- });
149
- });
150
- };
151
- ShoppingCartManagerComponent.prototype.showStockManager = function (line) {
152
- return __awaiter(this, void 0, void 0, function () {
153
- return __generator(this, function (_a) {
154
- this.selectedWarehouseNr = line.warehouseNumber;
155
- this.amount = line.amount;
156
- this.commissionCode = line.commissionCode;
157
- this.show(line.articleNumber);
158
- return [2 /*return*/];
159
- });
160
- });
161
- };
162
- ShoppingCartManagerComponent.prototype.hide = function () {
163
- return __awaiter(this, void 0, void 0, function () {
164
- return __generator(this, function (_a) {
165
- switch (_a.label) {
166
- case 0:
167
- if (this._okOrCancelClick) {
168
- this._okOrCancelClick = false;
169
- return [2 /*return*/];
170
- }
171
- return [4 /*yield*/, this.onStockManagerCancelClick()];
172
- case 1:
173
- _a.sent();
174
- return [2 /*return*/];
175
- }
176
- });
177
- });
178
- };
179
- ShoppingCartManagerComponent.prototype.show = function (articleNr) {
180
- this._reloadDataCollections(articleNr).then();
181
- this.message = this.currentOperationStatus.pendingReason;
182
- this.warehouseGrid.selectRow(this.selectedWarehouseNr);
183
- this.warehouseDialog.targetElement = null;
184
- this.warehouseDialog.open();
185
- };
186
- ShoppingCartManagerComponent.prototype.onStockManagerCancelClick = function () {
187
- return __awaiter(this, void 0, void 0, function () {
188
- return __generator(this, function (_a) {
189
- switch (_a.label) {
190
- case 0:
191
- this._okOrCancelClick = true;
192
- this.warehouseDialog.close();
193
- if (!this.currentReason) return [3 /*break*/, 2];
194
- return [4 /*yield*/, this.service.cancelAddTransactionLine(this.currentReason.lineUuid)];
195
- case 1:
196
- _a.sent();
197
- _a.label = 2;
198
- case 2:
199
- this.editingLine = undefined;
200
- return [2 /*return*/];
201
- }
202
- });
203
- });
204
- };
205
- ShoppingCartManagerComponent.prototype.onStockManagerOkClick = function () {
206
- return __awaiter(this, void 0, void 0, function () {
207
- var _this = this;
208
- return __generator(this, function (_a) {
209
- switch (_a.label) {
210
- case 0:
211
- this._okOrCancelClick = true;
212
- this.warehouseDialog.close();
213
- if (this.commissionCode !== undefined) {
214
- this.currentReason.commissionCode = this.commissionCode.valueOf();
215
- }
216
- if (this.amount !== undefined) {
217
- this.currentReason.quantity = this.amount.valueOf();
218
- }
219
- if (this.selectedWarehouseNr !== undefined) {
220
- this.currentReason.warehouseNr = this.selectedWarehouseNr;
221
- }
222
- if (!this.currentReason) return [3 /*break*/, 2];
223
- return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
224
- .then(function (value) {
225
- _this._handleLineOperationStatus();
226
- })];
227
- case 1:
228
- _a.sent();
229
- return [3 /*break*/, 6];
230
- case 2:
231
- if (!(this.editingLine === undefined)) return [3 /*break*/, 4];
232
- return [4 /*yield*/, this.service.addTransactionLine(TransactionLineType.ArticleLine, this.newArticleNr, this.amount, this.selectedWarehouseNr, this.commissionCode, this.isReturn)
233
- .then(function (value) {
234
- _this._handleLineOperationStatus();
235
- })];
236
- case 3:
237
- _a.sent();
238
- return [3 /*break*/, 6];
239
- case 4: return [4 /*yield*/, this.service.changeTransactionLineQuantity(this.editingLine.uuid, this.amount)
240
- .then(function (value) {
241
- _this._handleLineOperationStatus();
242
- })];
243
- case 5:
244
- _a.sent();
245
- _a.label = 6;
246
- case 6:
247
- this.editingLine = undefined;
248
- return [2 /*return*/];
249
- }
250
- });
251
- });
252
- };
253
- ShoppingCartManagerComponent.prototype.handleRowsSelected = function (rows) {
254
- this.selectedWarehouseNr = (rows.find(function (x) { return x !== undefined; })).warehouseNr;
255
- };
256
- ShoppingCartManagerComponent.prototype.handleCharacteristicAnswerOkClick = function (answer) {
257
- return __awaiter(this, void 0, void 0, function () {
258
- var _this = this;
259
- return __generator(this, function (_a) {
260
- switch (_a.label) {
261
- case 0:
262
- this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
263
- this.currentReason.textualUserInput = answer;
264
- return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
265
- .then(function (value) {
266
- _this._handleLineOperationStatus();
267
- })];
268
- case 1:
269
- _a.sent();
270
- return [2 /*return*/];
271
- }
272
- });
273
- });
274
- };
275
- ShoppingCartManagerComponent.prototype._reloadDataCollections = function (articleNr) {
276
- return __awaiter(this, void 0, void 0, function () {
277
- var goodId, _a;
278
- return __generator(this, function (_b) {
279
- switch (_b.label) {
280
- case 0: return [4 /*yield*/, this.service.getGoodIdFromArticleNr(articleNr)];
281
- case 1:
282
- goodId = _b.sent();
283
- _a = this;
284
- return [4 /*yield*/, this.service.getTransactionArticleWarehouses(goodId)];
285
- case 2:
286
- _a.transactionArticleWarehouses = _b.sent();
287
- return [2 /*return*/];
288
- }
289
- });
290
- });
291
- };
292
- ShoppingCartManagerComponent.prototype._handleAddArticle = function (amount) {
293
- if (amount === void 0) { amount = 1; }
294
- return __awaiter(this, void 0, void 0, function () {
295
- var _this = this;
296
- return __generator(this, function (_a) {
297
- switch (_a.label) {
298
- case 0: return [4 /*yield*/, this.service.addTransactionLine(TransactionLineType.ArticleLine, this.newArticleNr, amount, this.newArticle.standardWareHouse, this.newArticle.commissionCode)
299
- .then(function (value) {
300
- _this._handleLineOperationStatus();
301
- }, function (error) { return _this.promptService.showError(error); })];
302
- case 1:
303
- _a.sent();
304
- return [2 /*return*/];
305
- }
306
- });
307
- });
308
- };
309
- ShoppingCartManagerComponent.prototype._getWareHouseNoFromArticle = function () {
310
- if (this.newArticle !== undefined && this.newArticle.stockLocations !== undefined && this.newArticle.stockLocations.length) {
311
- return this.newArticle.stockLocations[0].warehouseNr;
312
- }
313
- return 0;
314
- };
315
- ShoppingCartManagerComponent.prototype._isLineOperationStatus = function () {
316
- this.currentOperationStatus = this.service.currentLineOperationStatus;
317
- if (this.currentOperationStatus !== undefined) {
318
- return true;
319
- }
320
- return false;
321
- };
322
- ShoppingCartManagerComponent.prototype._checkIfShoppingCartNeedsToDisplay = function () {
323
- if (this.service.currentTransaction && this.service.currentTransaction.transactionNr) {
324
- this.linesChanged.emit(this.waitForLinesChangedToOpenCart);
325
- this.waitForLinesChangedToOpenCart = false;
326
- }
327
- };
328
- ShoppingCartManagerComponent.prototype._confirmAction = function () {
329
- return __awaiter(this, void 0, void 0, function () {
330
- var pendingReasonText, _a;
331
- var _this = this;
332
- return __generator(this, function (_b) {
333
- switch (_b.label) {
334
- case 0:
335
- this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
336
- return [4 /*yield*/, this._getPendingReasonText(this.currentOperationStatus.pendingReason)];
337
- case 1:
338
- pendingReasonText = _b.sent();
339
- _a = this.currentReason;
340
- return [4 /*yield*/, this.promptService.showYesNo(pendingReasonText, " ")];
341
- case 2:
342
- _a.confirmation = _b.sent();
343
- return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
344
- .then(function (value) {
345
- _this._handleLineOperationStatus();
346
- })];
347
- case 3:
348
- _b.sent();
349
- return [2 /*return*/];
350
- }
351
- });
352
- });
353
- };
354
- ShoppingCartManagerComponent.prototype._showInformation = function () {
355
- return __awaiter(this, void 0, void 0, function () {
356
- var pendingReasonText;
357
- var _this = this;
358
- return __generator(this, function (_a) {
359
- switch (_a.label) {
360
- case 0:
361
- this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
362
- return [4 /*yield*/, this._getPendingReasonText(this.currentOperationStatus.pendingReason)];
363
- case 1:
364
- pendingReasonText = _a.sent();
365
- return [4 /*yield*/, this.promptService.showOkModal(pendingReasonText, " ")];
366
- case 2:
367
- _a.sent();
368
- return [4 /*yield*/, this.service.resolvePendingLineReason(this.currentReason)
369
- .then(function (value) {
370
- _this._handleLineOperationStatus();
371
- })];
372
- case 3:
373
- _a.sent();
374
- return [2 /*return*/];
375
- }
376
- });
377
- });
378
- };
379
- ShoppingCartManagerComponent.prototype._getPendingReasonText = function (pendingReason) {
380
- return __awaiter(this, void 0, void 0, function () {
381
- var _a, _b, _c;
382
- return __generator(this, function (_d) {
383
- switch (_d.label) {
384
- case 0:
385
- if (!(pendingReason === "ARTICLE_IS_DISCONTINUED_DO_YOU_WANT_TO_CONTINUE_PLEASE_CONFIRM")) return [3 /*break*/, 2];
386
- _b = (_a = this._dictionaryService.get("ARTICLE_IN_OUT_COLLECTION")).replace;
387
- _c = ["|~"];
388
- return [4 /*yield*/, this.getInOutCollectionOfArticle()];
389
- case 1: return [2 /*return*/, _b.apply(_a, _c.concat([_d.sent()]))];
390
- case 2: return [2 /*return*/, this._dictionaryService.get(pendingReason)];
391
- }
392
- });
393
- });
394
- };
395
- ShoppingCartManagerComponent.prototype.getInOutCollectionOfArticle = function () {
396
- return __awaiter(this, void 0, void 0, function () {
397
- var _a, domainValue;
398
- var _this = this;
399
- return __generator(this, function (_b) {
400
- switch (_b.label) {
401
- case 0:
402
- if (!!this._inOutCollection.length) return [3 /*break*/, 2];
403
- _a = this;
404
- return [4 /*yield*/, this.service.getInOutCollection("NL")];
405
- case 1:
406
- _a._inOutCollection = _b.sent();
407
- _b.label = 2;
408
- case 2:
409
- domainValue = this._inOutCollection.find(function (element) { return element.code === _this.newArticle.inOutCollection; });
410
- if (domainValue) {
411
- return [2 /*return*/, domainValue.description];
412
- }
413
- return [2 /*return*/, ""];
414
- }
415
- });
416
- });
417
- };
418
- ShoppingCartManagerComponent.prototype._handleLineOperationStatus = function () {
419
- return __awaiter(this, void 0, void 0, function () {
420
- return __generator(this, function (_a) {
421
- switch (_a.label) {
422
- case 0:
423
- if (!this._isLineOperationStatus()) return [3 /*break*/, 2];
424
- return [4 /*yield*/, this._handlePendingLine(this.currentOperationStatus.uuid).then()];
425
- case 1:
426
- _a.sent();
427
- return [3 /*break*/, 3];
428
- case 2:
429
- this._checkIfShoppingCartNeedsToDisplay();
430
- _a.label = 3;
431
- case 3: return [2 /*return*/];
432
- }
433
- });
434
- });
435
- };
436
- ShoppingCartManagerComponent.prototype._handlePendingLine = function (lineUuid) {
437
- return __awaiter(this, void 0, void 0, function () {
438
- var _a;
439
- return __generator(this, function (_b) {
440
- switch (_b.label) {
441
- case 0:
442
- this.currentReason = new ResolvePendingLineReasonRequest(this.currentOperationStatus.uuid, this.currentOperationStatus.pendingReason, this.currentOperationStatus.pendingReasonType);
443
- this.currentPendingLine = this.service.currentLines.find(function (l) { return l.uuid === lineUuid; });
444
- _a = this.currentOperationStatus.pendingReasonType;
445
- switch (_a) {
446
- case PendingReasonType.ABORTED: return [3 /*break*/, 1];
447
- case PendingReasonType.CANCELLED: return [3 /*break*/, 1];
448
- case PendingReasonType.CONFIRMATION_NEEDED: return [3 /*break*/, 2];
449
- case PendingReasonType.INVALID_LOGISTICS: return [3 /*break*/, 4];
450
- case PendingReasonType.NON_CRITICAL_DISCONTINUATION: return [3 /*break*/, 6];
451
- case PendingReasonType.CHARACTERISTICS_ANSWER_NEEDED: return [3 /*break*/, 8];
452
- case PendingReasonType.NONE: return [3 /*break*/, 9];
453
- }
454
- return [3 /*break*/, 9];
455
- case 1:
456
- this.service.cancelAddTransactionLine(this.currentPendingLine.uuid).then();
457
- return [3 /*break*/, 10];
458
- case 2: return [4 /*yield*/, this._confirmAction()];
459
- case 3:
460
- _b.sent();
461
- return [3 /*break*/, 10];
462
- case 4: return [4 /*yield*/, this.showStockManager(this.currentPendingLine)];
463
- case 5:
464
- _b.sent();
465
- return [3 /*break*/, 10];
466
- case 6: return [4 /*yield*/, this._showInformation()];
467
- case 7:
468
- _b.sent();
469
- return [3 /*break*/, 10];
470
- case 8:
471
- this.CharacteristicsAnswerNeeded();
472
- return [3 /*break*/, 10];
473
- case 9:
474
- this.currentReason = undefined;
475
- this.currentPendingLine = undefined;
476
- return [3 /*break*/, 10];
477
- case 10: return [2 /*return*/];
478
- }
479
- });
480
- });
481
- };
482
- ShoppingCartManagerComponent.prototype._createTransaction = function () {
483
- return __awaiter(this, void 0, void 0, function () {
484
- return __generator(this, function (_a) {
485
- switch (_a.label) {
486
- case 0:
487
- if (!!this.service.currentTransaction.transactionNr) return [3 /*break*/, 2];
488
- return [4 /*yield*/, this.service.createTransaction()];
489
- case 1:
490
- if (!(_a.sent())) {
491
- throwError("Failed to create transaction");
492
- }
493
- _a.label = 2;
494
- case 2: return [2 /*return*/];
495
- }
496
- });
497
- });
498
- };
499
- ShoppingCartManagerComponent.prototype._loadArticle = function (goodId) {
500
- return __awaiter(this, void 0, void 0, function () {
501
- var _a;
502
- return __generator(this, function (_b) {
503
- switch (_b.label) {
504
- case 0:
505
- _a = this;
506
- return [4 /*yield*/, this.service.getArticleFullObject(goodId)];
507
- case 1:
508
- _a.newArticle = _b.sent();
509
- this.newArticleNr = this.newArticle.articleNr;
510
- return [2 /*return*/];
511
- }
512
- });
513
- });
514
- };
515
- ShoppingCartManagerComponent.prototype.addEmailAddressToTransaction = function (emailAddress) {
516
- this.service.emailAddress = emailAddress;
517
- };
518
- ShoppingCartManagerComponent.prototype.CharacteristicsAnswerNeeded = function () {
519
- var _this = this;
520
- this.characteristicAnswer.question = this.currentOperationStatus.characteristic.question;
521
- this.characteristicAnswer.title = this.newArticle.description;
522
- this.characteristicAnswer.value = this.currentOperationStatus.characteristic.value;
523
- this.characteristicAnswer.characteristics = this.currentOperationStatus.characteristic.transactionLineCharacteristicChoices;
524
- setTimeout(function () {
525
- _this.characteristicAnswer.open();
526
- // tslint:disable-next-line:no-magic-numbers
527
- }, 1000);
528
- };
529
- ShoppingCartManagerComponent.ctorParameters = function () { return [
530
- { type: TransactionService },
531
- { type: TransactionEventService },
532
- { type: PromptService },
533
- { type: DictionaryService }
534
- ]; };
535
- __decorate([
536
- ViewChild("warehouseDialog")
537
- ], ShoppingCartManagerComponent.prototype, "warehouseDialog", void 0);
538
- __decorate([
539
- ViewChild("warehouseGrid")
540
- ], ShoppingCartManagerComponent.prototype, "warehouseGrid", void 0);
541
- __decorate([
542
- ViewChild("characteristicAnswer")
543
- ], ShoppingCartManagerComponent.prototype, "characteristicAnswer", void 0);
544
- __decorate([
545
- Output()
546
- ], ShoppingCartManagerComponent.prototype, "linesChanged", void 0);
547
- __decorate([
548
- Output()
549
- ], ShoppingCartManagerComponent.prototype, "openCart", void 0);
550
- __decorate([
551
- Output()
552
- ], ShoppingCartManagerComponent.prototype, "articleAdded", void 0);
553
- ShoppingCartManagerComponent = __decorate([
554
- Component({
555
- selector: "shopping-cart-manager",
556
- template: "\n <co-dialog #warehouseDialog\n (closeClick)=\"hide()\"\n (overlayClick)=\"onStockManagerCancelClick()\"\n >\n <ng-container header>{{ 'STOCK_NOTIFICATION' | localize }}</ng-container>\n\n <ng-container content>\n <co-form>\n <div class=\"form-content\">\n <span *ngIf=\"message\" class=\"message-field\" [textContent]=\"message | localize\"></span>\n <div class=\"commission-fields\" fxLayout=\"row\">\n <co-input-number-picker class=\"horizontal\" [(model)]=\"amount\" [min]=\"0\" decimals=\"3\"></co-input-number-picker>\n <co-input-combo-box [(model)]=\"commissionCode\"\n [source]=\"commissionCodes\"\n [fields]=\"commissionFields\"\n [placeholder]=\"'COMMISSION_CODE' | localize\"\n [required]=\"true\"\n ></co-input-combo-box>\n </div>\n <div>\n <co-grid #warehouseGrid\n [data]=\"transactionArticleWarehouses\"\n [columns]=\"columns\"\n [pagingEnabled]=\"'true'\"\n [maxNumberOfRows]=\"'20'\"\n (rowsSelected)=\"handleRowsSelected($event)\"\n ></co-grid>\n </div>\n </div>\n </co-form>\n </ng-container>\n\n <ng-container footer>\n <div class=\"flex-center\">\n <co-button [label]=\"'OK' | localize\" (click)=\"onStockManagerOkClick()\"></co-button>\n <co-button [label]=\"'CANCEL' | localize\" (click)=\"onStockManagerCancelClick()\"></co-button>\n </div>\n </ng-container>\n </co-dialog>\n\n <characteristic-answer\n #characteristicAnswer\n (okClick)=\"handleCharacteristicAnswerOkClick($event)\"\n ></characteristic-answer>\n ",
557
- styles: ["body,html{height:100%}body{margin:0;font-family:Roboto,\"Helvetica Neue\",sans-serif}.flex-center,.warehouse-line-container{display:flex;flex-direction:row}.commission-fields,::ng-deep #warehouseDialog ::ng-deep .form-content .message-field{margin-left:11px}.triangle{border-radius:3px}.full-width{width:100%}.flex-center{align-items:center!important;justify-content:center!important;margin:10px 0}::ng-deep #warehouseDialog{align-items:center;max-height:100%}::ng-deep #warehouseDialog ::ng-deep co-form{height:100%;width:500px}::ng-deep #warehouseDialog ::ng-deep .form-content{height:calc(100% - 80px);width:100%}::ng-deep #warehouseDialog ::ng-deep .form-content .message-field{height:20px;word-wrap:break-word;white-space:normal}co-button:not(:last-child){margin-right:10px}.commission-fields{justify-content:space-between;margin:10px 0}.warehouse-description-item{width:15rem}.warehouse-nr-item{width:5rem}co-input-number-picker co-button{max-width:20px}"]
558
- })
559
- ], ShoppingCartManagerComponent);
560
- return ShoppingCartManagerComponent;
561
- }());
562
- export { ShoppingCartManagerComponent };
563
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcHBpbmctY2FydC1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC90cmFuc2FjdGlvbi8iLCJzb3VyY2VzIjpbImFwcC9jb21wb25lbnQvc2hvcHBpbmctY2FydC9zaG9wcGluZy1jYXJ0LW1hbmFnZXIvc2hvcHBpbmctY2FydC1tYW5hZ2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQTZCLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBQzlFLE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFHbkYsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDdkgsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFJbkcsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUUvRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQXNEdEU7SUErREUsc0NBQ1MsT0FBMkIsRUFDM0IsaUJBQTBDLEVBQzFDLGFBQTRCLEVBQzVCLGtCQUFxQztRQUo5QyxpQkEwQ0M7UUF6Q1EsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQUMxQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix1QkFBa0IsR0FBbEIsa0JBQWtC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QUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyw0Q0FBNEM7UUFDOUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRVgsQ0FBQzs7Z0JBbFRpQixrQkFBa0I7Z0JBQ1IsdUJBQXVCO2dCQUMzQixhQUFhO2dCQUNSLGlCQUFpQjs7SUFqRTlDO1FBREMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO3lFQUNhO0lBRzFDO1FBREMsU0FBUyxDQUFDLGVBQWUsQ0FBQzt1RUFDZ0I7SUFHM0M7UUFEQyxTQUFTLENBQUMsc0JBQXNCLENBQUM7OEVBQ3lCO0lBRzNEO1FBREMsTUFBTSxFQUFFO3NFQUN5RTtJQUdsRjtRQURDLE1BQU0sRUFBRTtrRUFDcUU7SUFHOUU7UUFEQyxNQUFNLEVBQUU7c0VBQ3lFO0lBakJ2RSw0QkFBNEI7UUFsRHhDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsUUFBUSxFQUFFLDQ2REE2Q1Q7O1NBRUYsQ0FBQztPQUNXLDRCQUE0QixDQW1YeEM7SUFBRCxtQ0FBQztDQUFBLEFBblhELElBbVhDO1NBblhZLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlL3RyYW5zYWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvdXRpbHMvbnVtYmVyLXV0aWxzXCI7XG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgdGhyb3dFcnJvcn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25FdmVudFNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlL3RyYW5zYWN0aW9uLWV2ZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7Q29tbWlzc2lvbkNvZGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vcmVmY29kZS9jb21taXNzaW9uLWNvZGUtdHlwZS5lbnVtXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uTGluZUluZm99IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tbGluZS1pbmZvLmJvXCI7XG5pbXBvcnQge1Jlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVzb2x2ZS1wZW5kaW5nLXJlYXNvbi1yZXF1ZXN0LmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uTGluZVR5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS90cmFuc2FjdGlvbi1saW5lLXR5cGUuZW51bVwiO1xuaW1wb3J0IHtDb0RvbWFpblZhbHVlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2NvLWRvbWFpbi12YWx1ZS5ib1wiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2V9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tYXJ0aWNsZS13YXJlaG91c2UuYm9cIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9saW5lLW9wZXJhdGlvbi1zdGF0dXMuYm9cIjtcbmltcG9ydCB7Q29EaWFsb2dDb21wb25lbnQsIENvR3JpZENvbXBvbmVudCwgUHJvbXB0U2VydmljZX0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192OVwiO1xuaW1wb3J0IHtQZW5kaW5nUmVhc29uVHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3BlbmRpbmctcmVhc29uLXR5cGUuZW51bVwiO1xuaW1wb3J0IHtBcnRpY2xlRnVsbE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLWZ1bGwtb2JqZWN0XCI7XG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZS9kaWN0aW9uYXJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblJlc3BvbnNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2xpbmUtb3BlcmF0aW9uLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge0NoYXJhY3RlcmlzdGljQW5zd2VyQ29tcG9uZW50fSBmcm9tIFwiLi4vY2hhcmFjdGVyaXN0aWMtYW5zd2VyL2NoYXJhY3RlcmlzdGljLWFuc3dlci5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNob3BwaW5nLWNhcnQtbWFuYWdlclwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxjby1kaWFsb2cgI3dhcmVob3VzZURpYWxvZ1xuICAgICAgICAgICAgICAgKGNsb3NlQ2xpY2spPVwiaGlkZSgpXCJcbiAgICAgICAgICAgICAgIChvdmVybGF5Q2xpY2spPVwib25TdG9ja01hbmFnZXJDYW5jZWxDbGljaygpXCJcbiAgICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgaGVhZGVyPnt7ICdTVE9DS19OT1RJRklDQVRJT04nIHwgbG9jYWxpemUgfX08L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBjb250ZW50PlxuICAgICAgICA8Y28tZm9ybT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250ZW50XCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1lc3NhZ2VcIiBjbGFzcz1cIm1lc3NhZ2UtZmllbGRcIiBbdGV4dENvbnRlbnRdPVwibWVzc2FnZSB8IGxvY2FsaXplXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWlzc2lvbi1maWVsZHNcIiBmeExheW91dD1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxjby1pbnB1dC1udW1iZXItcGlja2VyIGNsYXNzPVwiaG9yaXpvbnRhbFwiIFsobW9kZWwpXT1cImFtb3VudFwiIFttaW5dPVwiMFwiIGRlY2ltYWxzPVwiM1wiPjwvY28taW5wdXQtbnVtYmVyLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8Y28taW5wdXQtY29tYm8tYm94IFsobW9kZWwpXT1cImNvbW1pc3Npb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJjb21taXNzaW9uQ29kZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cImNvbW1pc3Npb25GaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0NPTU1JU1NJT05fQ09ERScgfCBsb2NhbGl6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9jby1pbnB1dC1jb21iby1ib3g+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxjby1ncmlkICN3YXJlaG91c2VHcmlkXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJ0cmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzXCJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgW3BhZ2luZ0VuYWJsZWRdPVwiJ3RydWUnXCJcbiAgICAgICAgICAgICAgICAgIFttYXhOdW1iZXJPZlJvd3NdPVwiJzIwJ1wiXG4gICAgICAgICAgICAgICAgICAocm93c1NlbGVjdGVkKT1cImhhbmRsZVJvd3NTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9jby1ncmlkPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jby1mb3JtPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgZm9vdGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNlbnRlclwiPlxuICAgICAgICAgICAgPGNvLWJ1dHRvbiBbbGFiZWxdPVwiJ09LJyB8IGxvY2FsaXplXCIgKGNsaWNrKT1cIm9uU3RvY2tNYW5hZ2VyT2tDbGljaygpXCI+PC9jby1idXR0b24+XG4gICAgICAgICAgICA8Y28tYnV0dG9uIFtsYWJlbF09XCInQ0FOQ0VMJyB8IGxvY2FsaXplXCIgKGNsaWNrKT1cIm9uU3RvY2tNYW5hZ2VyQ2FuY2VsQ2xpY2soKVwiPjwvY28tYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jby1kaWFsb2c+XG5cbiAgICA8Y2hhcmFjdGVyaXN0aWMtYW5zd2VyXG4gICAgICAjY2hhcmFjdGVyaXN0aWNBbnN3ZXJcbiAgICAgIChva0NsaWNrKT1cImhhbmRsZUNoYXJhY3RlcmlzdGljQW5zd2VyT2tDbGljaygkZXZlbnQpXCJcbiAgICA+PC9jaGFyYWN0ZXJpc3RpYy1hbnN3ZXI+XG4gIGAsXG4gIHN0eWxlVXJsczogW1wiLi9zaG9wcGluZy1jYXJ0LW1hbmFnZXIuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgU2hvcHBpbmdDYXJ0TWFuYWdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChcIndhcmVob3VzZURpYWxvZ1wiKVxuICBwdWJsaWMgd2FyZWhvdXNlRGlhbG9nOiBDb0RpYWxvZ0NvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKFwid2FyZWhvdXNlR3JpZFwiKVxuICBwdWJsaWMgd2FyZWhvdXNlR3JpZDogQ29HcmlkQ29tcG9uZW50PGFueT47XG5cbiAgQFZpZXdDaGlsZChcImNoYXJhY3RlcmlzdGljQW5zd2VyXCIpXG4gIHB1YmxpYyBjaGFyYWN0ZXJpc3RpY0Fuc3dlcjogQ2hhcmFjdGVyaXN0aWNBbnN3ZXJDb21wb25lbnQ7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBsaW5lc0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IG9wZW5DYXJ0OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBhcnRpY2xlQWRkZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgZ2V0IGFtb3VudE9mTGluZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTnVtYmVyVXRpbHMuTnJPckRlZmF1bHQodGhpcy5zZXJ2aWNlLmFydGljbGVBbW91bnQsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93Q2hhcmFjdGVyaXN0aWNEaWFsb2coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dDaGFyYWN0ZXJpc3RpYztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hvd0NoYXJhY3RlcmlzdGljRGlhbG9nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0NoYXJhY3RlcmlzdGljID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgYnJhbmNoTnI6IHN0cmluZztcbiAgcHVibGljIG5ld0FydGljbGVOcjogc3RyaW5nO1xuICBwdWJsaWMgbmV3QXJ0aWNsZTogQXJ0aWNsZUZ1bGxPYmplY3Q7XG4gIHB1YmxpYyBzZWxlY3RlZFdhcmVob3VzZU5yOiBudW1iZXI7XG4gIHB1YmxpYyBhbW91bnQ6IG51bWJlcjtcbiAgcHVibGljIGlzUmV0dXJuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIHdhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBcIkNIRUNLX1dBUkVIT1VTRV9BTkRfQ09NTUlTU0lPTkNPREVcIjtcblxuICBwdWJsaWMgY29tbWlzc2lvbkNvZGU6IENvbW1pc3Npb25Db2RlVHlwZTtcbiAgcHVibGljIGNvbW1pc3Npb25Db2RlczogQ29Eb21haW5WYWx1ZVtdID0gW107XG4gIHB1YmxpYyBjb21taXNzaW9uRmllbGRzOiBPYmplY3QgPSB7IHRleHQ6IFwiZGVzY3JpcHRpb25cIiwgdmFsdWU6IFwiY29kZVwiIH07XG5cbiAgcHVibGljIHRyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZXM6IFRyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZVtdID0gW107XG4gIHB1YmxpYyB0cmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VGaWVsZHM6IE9iamVjdCA9IHsgdGV4dDogXCJ3YXJlaG91c2VEZXNjXCIsIHZhbHVlOiBcIndhcmVob3VzZU5yXCIgfTtcbiAgcHVibGljIGNvbHVtbnM6IGFueVtdID0gW107XG5cbiAgcHVibGljIGN1cnJlbnRQZW5kaW5nTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbztcbiAgcHVibGljIGN1cnJlbnRSZWFzb246IFJlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3Q7XG4gIHB1YmxpYyBlZGl0aW5nTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbztcblxuICBwdWJsaWMgZGlhbG9nUHJvbXB0SGVhZGVyOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHB1YmxpYyByb290RWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgY3VycmVudE9wZXJhdGlvblN0YXR1czogTGluZU9wZXJhdGlvblN0YXR1cztcbiAgcHJpdmF0ZSBfaW5PdXRDb2xsZWN0aW9uOiBDb0RvbWFpblZhbHVlW10gPSBbXTtcbiAgcHJpdmF0ZSBfb2tPckNhbmNlbENsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dDaGFyYWN0ZXJpc3RpYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzZXJ2aWNlOiBUcmFuc2FjdGlvblNlcnZpY2UsXG4gICAgcHVibGljIHRyYW5zYWN0aW9uRXZlbnRzOiBUcmFuc2FjdGlvbkV2ZW50U2VydmljZSxcbiAgICBwdWJsaWMgcHJvbXB0U2VydmljZTogUHJvbXB0U2VydmljZSxcbiAgICBwdWJsaWMgX2RpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZXJ2aWNlLnRyYW5zYWN0aW9uVXBkYXRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpbmVzQ2hhbmdlZC5lbWl0KHRoaXMud2FpdEZvckxpbmVzQ2hhbmdlZFRvT3BlbkNhcnQpO1xuICAgICAgICB0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0ID0gZmFsc2U7XG4gICAgICB9KSxcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50cy5hZGRUb0NhcnRCeVNrdS5zdWJzY3JpYmUoKHBhcmFtczoge3NrdTogc3RyaW5nLCBhbW91bnQ6IG51bWJlciwgcG9wQ2FydDogYm9vbGVhbn0pID0+IHtcbiAgICAgICAgICB0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0ID0gcGFyYW1zLnBvcENhcnQ7XG4gICAgICAgICAgdGhpcy5hZGRUb0NhcnQocGFyYW1zLnNrdSwgcGFyYW1zLmFtb3VudCkudGhlbigpO1xuICAgICAgICB9KSxcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50cy5hZGRUb0NhcnRCeVNlbGVjdG9yUmVzdWx0LnN1YnNjcmliZShcbiAgICAgICAgKHBhcmFtczoge3NlbGVjdG9yUmVzdWx0OiB7Z29vZElkOiBudW1iZXIsIGJhc2VHb29kSWQ6IG51bWJlciwgc2VsZWN0b3JEYXRhOiBhbnksIHF1YW50aXR5OiBudW1iZXJ9LCBwb3BDYXJ0OiBib29sZWFufSkgPT4ge1xuICAgICAgICAgIHRoaXMud2FpdEZvckxpbmVzQ2hhbmdlZFRvT3BlbkNhcnQgPSBwYXJhbXMucG9wQ2FydDtcbiAgICAgICAgICB0aGlzLmFkZFRvQ2FydEJ5U2VsZWN0b3JSZXN1bHQocGFyYW1zLnNlbGVjdG9yUmVzdWx0KS50aGVuKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRzLm9wZW5TaG9wcGluZ0NhcnRNb2R1bGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vcGVuQ2FydC5lbWl0KGZhbHNlKTtcbiAgICAgIH0pLFxuXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRzLmFkZFVzZXJSZWxhdGlvblNob3BwaW5nQ2FydE1vZHVsZS5zdWJzY3JpYmUoKGxvZ2luOiB7dXNlcjogc3RyaW5nLCBwdzogc3RyaW5nfSkgPT4ge1xuICAgICAgICB0aGlzLmFkZFVzZXJSZWxhdGlvblRvVHJhbnNhY3Rpb25BbmRMb2dpbihsb2dpbi51c2VyLCBsb2dpbi5wdyk7XG4gICAgICB9KSxcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50cy5hZGROZXdVc2VyVG9TaG9wcGluZ0NhcnRNb2R1bGUuc3Vic2NyaWJlKChlbWFpbEFkZHJlc3MpID0+IHtcbiAgICAgICAgdGhpcy5hZGRFbWFpbEFkZHJlc3NUb1RyYW5zYWN0aW9uKGVtYWlsQWRkcmVzcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmNvbHVtbnMucHVzaChcbiAgICAgIHtmaWVsZDogXCJ3YXJlaG91c2VOclwiLCBoZWFkZXJUZXh0OiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoXCJXQVJFSE9VU0VcIiksIGFsbG93RmlsdGVyaW5nOiBmYWxzZX0sXG4gICAgICB7ZmllbGQ6IFwid2FyZWhvdXNlRGVzY1wiLCBoZWFkZXJUZXh0OiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoXCJERVNDUklQVElPTlwiKX0sXG4gICAgICB7ZmllbGQ6IFwic3RvY2tBbW91bnRcIiwgaGVhZGVyVGV4dDogdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiU1RPQ0tcIil9XG4gICAgKTtcblxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jb21taXNzaW9uQ29kZXMgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0Q29tbWlzc2lvbkNvZGVzKFwiTkxcIik7XG4gICAgdGhpcy5saW5lc0NoYW5nZWQuZW1pdCh0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0KTtcbiAgICB0aGlzLndhaXRGb3JMaW5lc0NoYW5nZWRUb09wZW5DYXJ0ID0gZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLndhcmVob3VzZURpYWxvZy5jbG9zZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRvQ2FydChza3U6IHN0cmluZywgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciAgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0R29vZElkRnJvbUFydGljbGVOcihza3UpO1xuICAgIGF3YWl0IHRoaXMuX2xvYWRBcnRpY2xlKGdvb2RJZCk7XG4gICAgYXdhaXQgdGhpcy5fY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLl9oYW5kbGVBZGRBcnRpY2xlKGFtb3VudCk7XG4gICAgdGhpcy5hcnRpY2xlQWRkZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRvQ2FydEJ5U2VsZWN0b3JSZXN1bHQocmVzdWx0OiB7Z29vZElkOiBudW1iZXIsIGJhc2VHb29kSWQ6IG51bWJlciwgc2VsZWN0b3JEYXRhOiBhbnksIHF1YW50aXR5OiBudW1iZXJ9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5fbG9hZEFydGljbGUocmVzdWx0Lmdvb2RJZCk7XG4gICAgYXdhaXQgdGhpcy5fY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLl9oYW5kbGVBZGRBcnRpY2xlKHJlc3VsdC5xdWFudGl0eSk7XG4gICAgdGhpcy5hcnRpY2xlQWRkZWQuZW1pdCgpO1xuICB9XG5cbiAgLy8gVE9ETyBwdWJsaWMgdXNlciBsb2dzIGluLi4uLiBob3cgcmVjb25uZWN0IHRoZSBDb25uZWN0b3I/XG4gIHB1YmxpYyBhc3luYyBhZGRVc2VyUmVsYXRpb25Ub1RyYW5zYWN0aW9uQW5kTG9naW4odXNlck5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UmVsYXRpb25CeVVzZXIodXNlck5hbWUsIHBhc3N3b3JkKTtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRzLmxvZ2dlZEluLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2hvd1N0b2NrTWFuYWdlcihsaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZWxlY3RlZFdhcmVob3VzZU5yID0gbGluZS53YXJlaG91c2VOdW1iZXI7XG4gICAgdGhpcy5hbW91bnQgPSBsaW5lLmFtb3VudDtcbiAgICB0aGlzLmNvbW1pc3Npb25Db2RlID0gbGluZS5jb21taXNzaW9uQ29kZTtcbiAgICB0aGlzLnNob3cobGluZS5hcnRpY2xlTnVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9va09yQ2FuY2VsQ2xpY2spIHtcbiAgICAgIHRoaXMuX29rT3JDYW5jZWxDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLm9uU3RvY2tNYW5hZ2VyQ2FuY2VsQ2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93KGFydGljbGVOcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVsb2FkRGF0YUNvbGxlY3Rpb25zKGFydGljbGVOcikudGhlbigpO1xuXG4gICAgdGhpcy5tZXNzYWdlID0gdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb247XG4gICAgdGhpcy53YXJlaG91c2VHcmlkLnNlbGVjdFJvdyh0aGlzLnNlbGVjdGVkV2FyZWhvdXNlTnIpO1xuICAgIHRoaXMud2FyZWhvdXNlRGlhbG9nLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMud2FyZWhvdXNlRGlhbG9nLm9wZW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBvblN0b2NrTWFuYWdlckNhbmNlbENsaWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX29rT3JDYW5jZWxDbGljayA9IHRydWU7XG4gICAgdGhpcy53YXJlaG91c2VEaWFsb2cuY2xvc2UoKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRSZWFzb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5jYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUodGhpcy5jdXJyZW50UmVhc29uLmxpbmVVdWlkKTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRpbmdMaW5lID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG9uU3RvY2tNYW5hZ2VyT2tDbGljaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9va09yQ2FuY2VsQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMud2FyZWhvdXNlRGlhbG9nLmNsb3NlKCk7XG5cbiAgICBpZiAodGhpcy5jb21taXNzaW9uQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRSZWFzb24uY29tbWlzc2lvbkNvZGUgPSB0aGlzLmNvbW1pc3Npb25Db2RlLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJyZW50UmVhc29uLnF1YW50aXR5ID0gdGhpcy5hbW91bnQudmFsdWVPZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkV2FyZWhvdXNlTnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJyZW50UmVhc29uLndhcmVob3VzZU5yID0gdGhpcy5zZWxlY3RlZFdhcmVob3VzZU5yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRSZWFzb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24odGhpcy5jdXJyZW50UmVhc29uKVxuICAgICAgICAudGhlbigodmFsdWU6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmVkaXRpbmdMaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmFkZFRyYW5zYWN0aW9uTGluZShUcmFuc2FjdGlvbkxpbmVUeXBlLkFydGljbGVMaW5lLCB0aGlzLm5ld0FydGljbGVOciwgdGhpcy5hbW91bnQsIHRoaXMuc2VsZWN0ZWRXYXJlaG91c2VOciwgdGhpcy5jb21taXNzaW9uQ29kZSwgdGhpcy5pc1JldHVybilcbiAgICAgICAgICAudGhlbigodmFsdWU6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KHRoaXMuZWRpdGluZ0xpbmUudXVpZCwgdGhpcy5hbW91bnQpXG4gICAgICAgICAgLnRoZW4oKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVkaXRpbmdMaW5lID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJvd3NTZWxlY3RlZChyb3dzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkV2FyZWhvdXNlTnIgPSAocm93cy5maW5kKHggPT4geCAhPT0gdW5kZWZpbmVkKSkud2FyZWhvdXNlTnI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlQ2hhcmFjdGVyaXN0aWNBbnN3ZXJPa0NsaWNrKGFuc3dlcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50UmVhc29uID0gbmV3IFJlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3QodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnV1aWQsIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uLCB0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpO1xuICAgIHRoaXMuY3VycmVudFJlYXNvbi50ZXh0dWFsVXNlcklucHV0ID0gYW5zd2VyO1xuICAgIGF3YWl0IHRoaXMuc2VydmljZS5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24odGhpcy5jdXJyZW50UmVhc29uKVxuICAgICAgLnRoZW4oKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZWxvYWREYXRhQ29sbGVjdGlvbnMoYXJ0aWNsZU5yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciAgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZ2V0R29vZElkRnJvbUFydGljbGVOcihhcnRpY2xlTnIpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlcyA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVBZGRBcnRpY2xlKGFtb3VudDogbnVtYmVyID0gMSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VydmljZS5hZGRUcmFuc2FjdGlvbkxpbmUoVHJhbnNhY3Rpb25MaW5lVHlwZS5BcnRpY2xlTGluZSxcbiAgICAgIHRoaXMubmV3QXJ0aWNsZU5yLFxuICAgICAgYW1vdW50LFxuICAgICAgdGhpcy5uZXdBcnRpY2xlLnN0YW5kYXJkV2FyZUhvdXNlLFxuICAgICAgdGhpcy5uZXdBcnRpY2xlLmNvbW1pc3Npb25Db2RlKVxuICAgICAgLnRoZW4oKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB0aGlzLnByb21wdFNlcnZpY2Uuc2hvd0Vycm9yKGVycm9yKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRXYXJlSG91c2VOb0Zyb21BcnRpY2xlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmV3QXJ0aWNsZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubmV3QXJ0aWNsZS5zdG9ja0xvY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHRoaXMubmV3QXJ0aWNsZS5zdG9ja0xvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ld0FydGljbGUuc3RvY2tMb2NhdGlvbnNbMF0ud2FyZWhvdXNlTnI7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNMaW5lT3BlcmF0aW9uU3RhdHVzKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cyA9IHRoaXMuc2VydmljZS5jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1cztcbiAgICBpZiAodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0lmU2hvcHBpbmdDYXJ0TmVlZHNUb0Rpc3BsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24gJiYgdGhpcy5zZXJ2aWNlLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbk5yKSB7XG4gICAgICB0aGlzLmxpbmVzQ2hhbmdlZC5lbWl0KHRoaXMud2FpdEZvckxpbmVzQ2hhbmdlZFRvT3BlbkNhcnQpO1xuICAgICAgdGhpcy53YWl0Rm9yTGluZXNDaGFuZ2VkVG9PcGVuQ2FydCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbmZpcm1BY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50UmVhc29uID0gbmV3IFJlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3QodGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnV1aWQsIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uLCB0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpO1xuICAgIGNvbnN0IHBlbmRpbmdSZWFzb25UZXh0OiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9nZXRQZW5kaW5nUmVhc29uVGV4dCh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbik7XG4gICAgdGhpcy5jdXJyZW50UmVhc29uLmNvbmZpcm1hdGlvbiAgPSBhd2FpdCB0aGlzLnByb21wdFNlcnZpY2Uuc2hvd1llc05vKHBlbmRpbmdSZWFzb25UZXh0LCBcIiBcIik7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnJlc29sdmVQZW5kaW5nTGluZVJlYXNvbih0aGlzLmN1cnJlbnRSZWFzb24pXG4gICAgICAudGhlbigodmFsdWU6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLl9oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3Nob3dJbmZvcm1hdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmN1cnJlbnRSZWFzb24gPSBuZXcgUmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uUmVxdWVzdCh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMudXVpZCwgdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb24sIHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uVHlwZSk7XG4gICAgY29uc3QgcGVuZGluZ1JlYXNvblRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuX2dldFBlbmRpbmdSZWFzb25UZXh0KHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5wZW5kaW5nUmVhc29uKTtcbiAgICBhd2FpdCB0aGlzLnByb21wdFNlcnZpY2Uuc2hvd09rTW9kYWwocGVuZGluZ1JlYXNvblRleHQsIFwiIFwiKTtcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UucmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHRoaXMuY3VycmVudFJlYXNvbilcbiAgICAgIC50aGVuKCh2YWx1ZTogTGluZU9wZXJhdGlvblJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0UGVuZGluZ1JlYXNvblRleHQocGVuZGluZ1JlYXNvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocGVuZGluZ1JlYXNvbiA9PT0gXCJBUlRJQ0xFX0lTX0RJU0NPTlRJTlVFRF9ET19ZT1VfV0FOVF9UT19DT05USU5VRV9QTEVBU0VfQ09ORklSTVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiQVJUSUNMRV9JTl9PVVRfQ09MTEVDVElPTlwiKS5yZXBsYWNlKFwifH5cIiwgYXdhaXQgdGhpcy5nZXRJbk91dENvbGxlY3Rpb25PZkFydGljbGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQocGVuZGluZ1JlYXNvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEluT3V0Q29sbGVjdGlvbk9mQXJ0aWNsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5faW5PdXRDb2xsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgdGhpcy5faW5PdXRDb2xsZWN0aW9uID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldEluT3V0Q29sbGVjdGlvbihcIk5MXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRvbWFpblZhbHVlOiBDb0RvbWFpblZhbHVlID0gdGhpcy5faW5PdXRDb2xsZWN0aW9uLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT09IHRoaXMubmV3QXJ0aWNsZS5pbk91dENvbGxlY3Rpb24pO1xuICAgIGlmIChkb21haW5WYWx1ZSkge1xuICAgICAgcmV0dXJuIGRvbWFpblZhbHVlLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2lzTGluZU9wZXJhdGlvblN0YXR1cygpKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVQZW5kaW5nTGluZSh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMudXVpZCkudGhlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jaGVja0lmU2hvcHBpbmdDYXJ0TmVlZHNUb0Rpc3BsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlICBhc3luYyBfaGFuZGxlUGVuZGluZ0xpbmUobGluZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY3VycmVudFJlYXNvbiA9IG5ldyBSZXNvbHZlUGVuZGluZ0xpbmVSZWFzb25SZXF1ZXN0KHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy51dWlkLCB0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbiwgdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLnBlbmRpbmdSZWFzb25UeXBlKTtcbiAgICB0aGlzLmN1cnJlbnRQZW5kaW5nTGluZSA9IHRoaXMuc2VydmljZS5jdXJyZW50TGluZXMuZmluZChsID0+IGwudXVpZCA9PT0gbGluZVV1aWQpO1xuXG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUpIHtcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQUJPUlRFRDpcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuQ0FOQ0VMTEVEOlxuICAgICAgICB0aGlzLnNlcnZpY2UuY2FuY2VsQWRkVHJhbnNhY3Rpb25MaW5lKHRoaXMuY3VycmVudFBlbmRpbmdMaW5lLnV1aWQpLnRoZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLkNPTkZJUk1BVElPTl9ORUVERUQ6XG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmZpcm1BY3Rpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLklOVkFMSURfTE9HSVNUSUNTOlxuICAgICAgICBhd2FpdCB0aGlzLnNob3dTdG9ja01hbmFnZXIodGhpcy5jdXJyZW50UGVuZGluZ0xpbmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGVuZGluZ1JlYXNvblR5cGUuTk9OX0NSSVRJQ0FMX0RJU0NPTlRJTlVBVElPTjpcbiAgICAgICAgYXdhaXQgdGhpcy5fc2hvd0luZm9ybWF0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQZW5kaW5nUmVhc29uVHlwZS5DSEFSQUNURVJJU1RJQ1NfQU5TV0VSX05FRURFRDpcbiAgICAgICAgdGhpcy5DaGFyYWN0ZXJpc3RpY3NBbnN3ZXJOZWVkZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBlbmRpbmdSZWFzb25UeXBlLk5PTkU6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmN1cnJlbnRSZWFzb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY3VycmVudFBlbmRpbmdMaW5lID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVUcmFuc2FjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25Ocikge1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLnNlcnZpY2UuY3JlYXRlVHJhbnNhY3Rpb24oKSkge1xuICAgICAgICB0aHJvd0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSB0cmFuc2FjdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9sb2FkQXJ0aWNsZShnb29kSWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubmV3QXJ0aWNsZSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQpO1xuICAgIHRoaXMubmV3QXJ0aWNsZU5yID0gdGhpcy5uZXdBcnRpY2xlLmFydGljbGVOcjtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRW1haWxBZGRyZXNzVG9UcmFuc2FjdGlvbihlbWFpbEFkZHJlc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5lbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3M7XG4gIH1cblxuICBwcml2YXRlIENoYXJhY3RlcmlzdGljc0Fuc3dlck5lZWRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJhY3RlcmlzdGljQW5zd2VyLnF1ZXN0aW9uID0gdGhpcy5jdXJyZW50T3BlcmF0aW9uU3RhdHVzLmNoYXJhY3RlcmlzdGljLnF1ZXN0aW9uO1xuICAgIHRoaXMuY2hhcmFjdGVyaXN0aWNBbnN3ZXIudGl0bGUgPSB0aGlzLm5ld0FydGljbGUuZGVzY3JpcHRpb247XG4gICAgdGhpcy5jaGFyYWN0ZXJpc3RpY0Fuc3dlci52YWx1ZSA9IHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5jaGFyYWN0ZXJpc3RpYy52YWx1ZTtcbiAgICB0aGlzLmNoYXJhY3RlcmlzdGljQW5zd2VyLmNoYXJhY3RlcmlzdGljcyA9IHRoaXMuY3VycmVudE9wZXJhdGlvblN0YXR1cy5jaGFyYWN0ZXJpc3RpYy50cmFuc2FjdGlvbkxpbmVDaGFyYWN0ZXJpc3RpY0Nob2ljZXM7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyaXN0aWNBbnN3ZXIub3BlbigpO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICB9LCAxMDAwKTtcblxuICB9XG59XG4iXX0=